C语言第三次博客作业----单层循环结构
一、PTA实验作业
题目1
1.实验代码
int N,count;//N,查询总用户数;count,已经查询的用户数
char sex;//性别
double H1,H2;//H1,查询用户身高;H2,最佳情侣身高
scanf("%d",&N);
for(count=1;count<=N;count++){
scanf(" %c%lf",&sex,&H1);
switch(sex){
case 'M':
H2=H1/1.09;
break;
case 'F':
H2=H1*1.09;
break;
}
printf("%.2f",H2);//输出最佳情侣身高,控制输出为小数点后保留俩位
}
2.设计思路
- 第一步:定义俩个整型变量N,count,分别表示前来查询的总用户数和已经查询的用户数;
- 第二步:定义一个字符型变量sex,表示查询的用户性别;
- 第三步:定义俩个浮点型变量H1,H2,表示查询用户身高和情侣身高;
- 第四步:输入查询总用户数N;
- 第五步:设初值,count=1;
- 第六步:输入查询用户的性别和身高;
- 第七步:若输入的sex为M,计算H2=H1/1.09;
- 第八步:若输入的sex为F,计算H2=H1*1.09;
- 第九步:count的值加一;
- 第十步:若count小于N,重复第六步到第九步;
- 第十一步:输出H2,利用%.2f控制输出小数点位数;
3,本题调试过程碰到问题及解决办法
问题:
(1)只能输出一组数据
(2)中间输出一组0
(3)输出的结果不对
解决办法:
经过调试发现不是不能正确进入循环,就是不能按照正确输出,将while语句改为for语句,for语句适用于知道循环次数的循环,改正后代码也更清楚明白
举例:调试问题(2)中输出零
由图一可以看到进入循环后H2的值未知,所以输出0,一轮循环结束后,由H1算出H2,所以输出的是第一次输入的H1对应的H2,
通过调试我们可以找到错误的地方并且了解是语句顺序不对还是其他错误原因从而进行修改。
4.本题PTA提交列表
题目2
1.实验代码
int a,i,n,item,s;//a表示不超过9的正整数,i表示循环次数,n表示项数,item表示某一项的数值,s表示各项之和
scanf("%d%d",&a,&n);
item=0;//给item赋初值
s=0;//给s赋初值
for(i=1;i<=n;i++){
item=item*10+a;
s=s+item;//将各项值累加
}
printf("s = %d",s);
2.设计思路
- 第一步:定义变量a,i,n,item,s,a表示不超过9的正整数,i表示循环次数,n表示项数,item表示某一项的数值,s表示各项之和;
- 第二步:输入a和n的值;
- 第三步:赋初值,item=0,s=0;
- 第四步:计算下一项的值,item=item*10+a;
- 第五步:s=s+item;
- 第六步:当i<=n时,重复第四步,第五步;
- 第七步:输出s的值;
3,本题调试过程碰到问题及解决办法
问题:忘记赋初值,导致答案很奇怪,如图:
调试:
确定循环体没有错误后,认真排查,经调试发现一开始s就有值了,错误原因是忘了赋初值
4.本题PTA提交列表
题目3
1.实验代码
int n,i,number,min;//i代表次数,n表示输入数据的总个数,number表示输入的数值,min表示最小值
scanf("%d",&n);
scanf("%d",&number);
min=number;//将输入的number赋给min
for(i=2;i<=n;i++){
scanf("%d",&number);
if(number<min){
min=number;//比较number和min的值,将较小值赋给min
}
}
printf("min = %d",min);
2.设计思路
- 第一步:定义变量n,i,number,min,分别有i代表次数,n表示输入数据的总个数,number表示输入的数值,min表示最小值;
- 第二步:输入n;
- 第三步:输入number;
- 第四步:将number的值赋给min;
- 第五步:再输入一个number;
- 第六步:若number小于min,min=number;
- 第七步:当i小于等于n时,重复第三步到第六步;
- 第八步:输出min的值;
3,本题调试过程碰到问题及解决办法
本题没有遇到困难,就是有些细节需要注意,比如赋初值i=2,而不是i=1,因为进入循环之前已经输入了一个i,若为1,就多输入一组数据了
4.本题PTA提交列表
题目4
1.实验代码
int yournumber,mynumber,N,i;//mynumber表示我猜的数,yournumber随机产生的被猜数,N系统作判断的猜数次数界限,i我猜数的次数
scanf("%d%d",&yournumber,&N);
scanf("%d",&mynumber);
i=0;//给i赋初值
if(mynumber<0){
printf("Game Over");
return 0;//结束程序
}
if(mynumber>0){
while(mynumber!=yournumber){
if(mynumber>yournumber){
i++;
printf("Too big\n");
}
else {
i++;
printf("Too small\n");
}
scanf("%d",&mynumber);
}
if(mynumber==yournumber){
i++;
if(i==1){
printf("Bingo!");
}
else if(i<=3){
printf("Lucky You!\n");}
else if(i>=N){
printf("Game Over\n"); }
else {
printf("Good Guess!\n");}
}
}
2.设计思路
- 第一步:定义变量mynumber,yournumber,N,i,分别表示我猜的数,随机产生的被猜数,系统作判断的猜数次数界限,我猜数的次数
- 第二步:输入yournumber,N
- 第三步:输入mynumber
- 第四步:对i赋初值,i=0
- 第五步:mynumber小于0时,输出Game Over,并结束程序
- 第六步:mynumber大于0时,如果mynumber>yournumber,输出Too big,i加一
- 第七步:如果mynumber<yournumber,输出Too small,i加一
- 第八步:再次输入mynumber
- 第九步:当mynumber不等于yournumber时,重复第六步到第八步
- 第十步:当mynumber等于yournumber时,i加一
- 第十一步:若i=1,即一次猜中,输出Bingo!
- 第十二步:若i大于1且i小于等于3,输出Lucky You!
- 第十三步:若i大于3且小于等于N时,输出Good Guess!
- 第十四步:若i大于N,输出Game Over
3,本题调试过程碰到问题及解决办法
(1)当mynumberyournumber时,输出Game Over,而不能判断i,再输出相应语句
解决办法:使用if语句,当满足mynumberyournumber,再用嵌套的if-else语句输出对应语句
(2)当mynumber==yournumber时如何结束程序
解决办法:
错误:一开始想到用if后接break
提交结果:
看书发现break是结束循环,并不是结束整个程序,于是想到用return 0直接结束程序,提交后答案正确了
补充:经查阅if后接return 0和exit(0)俩种都是可以的
4.本题PTA提交列表
二、截图本周题目集的PTA最后排名
三、本周学习总结
1.你学会了什么?
(1)学会如何满足条件后结束整个程序,可使用if return0或者exit(0)
(2)学习while,do while语句,结合之前学习过的for语句,可以归纳:
- 1.for语句适用于已规定,已明确循环次数的循环
- 2.while和do while适用于不明确循环次数的循环
- 3.如必须先进循环,经循环体运算得到循环控制条件后,再判断是否进行下一次循环,推荐使用do while语句
- 4.【重点】do while和while的区别主要在第一次判断,当不满足循环条件时,while不会执行循环,但是do while会执行一次循环。如果第一次判断满足循环条件,那么俩者运行结果其实是一样的
(3)break和continue语句 - 1.break执行时循环提前结束,不再执行循环体中break后面的其他语句
- 2.continue执行时跳过循环体中continue后的语句,继续下一次循环
2.本周的内容,你还不会什么?
循环时输入语句放在循环内还是循环外(最后通过写算法和调试来确定)
3.分支结构上机考试总结。
(1)哪些地方错了,为什么?
- 1.对函数名不熟,导致调用错误,还有像log(16)/log(3)这种表示方式不会,所以提交时一直编译错误
- 2.不会使用Devc调试,只能通过输出变量来判断错误位置,很耽误时间,后面时间不够
(2)后续要怎么找程序错误?
方法一:通过输出某些变量值来检测运行是否正确
方法二:通过把一些语句用//注释掉,再检测运行是否正确
方法三:通过设置断点,调试,检测一些变量值的变化和执行的下一步语句位置来检测运行是否正确以及哪里错误
(3)对自己成绩满意么?不满意的话要怎么改进?
不满意。学会利用调试检测程序运行是否正确和找寻错误地方进行改正,提高修改效率。