最近学习了循环语句,通多学习自己也有些感悟。循环语句适用于解决带有重复计算的问题,有for、while、do-while三种,一般不用do-while,因为for与while型更易解决绝大部分问题,用for好像更直观,但有时用while更简单,比如要写的循环语句的条件是输入某值a,直接写while(cin>>a)即可。如果自己实在想不出解决循环语句问题的巧妙算法可使用'暴力法'(枚举法、试算法),简单直观,一般不会出现超时问题(做数组问题时要注意选择合适算法以防超时),要紧记'能优化则优化'原则。还有在写出程序后要用不同类型的数据去试一试程序是否正确,也可以尝试用不同的方法写程序,要勇于尝试才能进步。
这次的作业题中遇到了一下几个问题:
1、没有审清题目要求。04画矩形问题中要求第三个参数为一个字符,而自己输入的是样例中所给字符'@'。
2、没有注意()与强制类型转换的使用。
用for语句提取数m中的每一位
for(i=1;
pow(10.0,(double)(i-1))<=m;
i++)
{
a=(m%(int)pow(10.0(double)i))/
(int)pow(10.0,double(i-1));
if((double)a/3==1)
{
s=s+1;
}
3、数字反转题目中最后几位是零时不知如何从不为零的一位开始输出,该题目中如果当某位不为零时才输出则该数字中间为零的位数上的0无法输出,该题可以用
y=1;
while(b(int)pow(10.0(double)y)/
(int)pow(10.0,(double)(y-1))==0)
y=y+1;
直到某位不为0时在开始循环计算输出某位数。
4、津津的储蓄问题中遇到的问题是当输入到钱不够用的月份预算后会直接输出该月份,12个月份的预算还没有输入完就已经出一个结果了所以错误,解决方法是用if语句,当某月预算不够时将该月i赋值给一个新数a在循环语句完成后输出a。
5、余数相同问题中没有考虑要能输入多组数据并要用到EOF(强制退出)或break。EOF为End Of File的缩写,通常在文本的最后存在此字符表示资料结束,如
while(scanf("%d",&n)!=EOF)
break也表结束如
if(a%i==b%i&&b%i==c%i)
{
x=i;
cout<<x<<endl;
break;
}
此处无break则显示错误。
关于定义变量问题,有以下几点要注意的:1、在循环语句内定义的变量为局部变量,只能用再循环语句中,离开循环语句则无效。2、和变量sum赋初值时要在for之前紧靠for赋初值。赋初值的位置具体问题具体分析,有的要在for语句内,其位置不同意义也不同,要弄清楚。
嵌套循环:1、复合语句 2、不要同名(内外层 循环控制变量),以免混乱 3、右缩进格式,以保层次清晰
for循环里面的for(;;)';'有时会用成',',要多注意,还要注意循环语句中的条件,不要弄成死循环,还有一个休眠状态主要用于延时,百度上有个例子是:
for(int i=1;i<=长度;i++){ if(i%500==0){ Thread.sleep(100);// 睡眠100毫秒 } }
有个实例是:
比如你玩一个贪吃蛇的游戏,你总不希望啥都没看见你就挂了吧
让蛇能一步一步地走,就是Thread.sleep(1000)的作用,时间的单位是毫秒
等级越高,sleep的时间越短,蛇走的就越快。
这次还从同学那里学了一个听到过但是没掌握的方法
#define max(n,m) ((n)>(m)?(n):(m))
意思是如果n>m,那么 把max=n,否则max=m
自己之前的做法是用if(n>=m)一个情况else()又一个情况,麻烦,编码长,所以用前一个方法更高效。