C语言第三次博客作业---单层循环结构
一、PTA实验作业#
题目1 最佳情侣身高##
1.实验代码###
int N,i; //N,i分别用来存放前来查询的用户数和循环次数
char sex; //sex用来存放性别
double height; //height用来存放身高
scanf("%d",&N);
for(i=1;i<=N;i++){
scanf("\n%c %lf",&sex,&height);
switch(sex){
case 'M':
printf("%.2f\n",height*1.0/1.09);
break;
case 'F':
printf("%.2f\n",height*1.0*1.09);
break;
default :
break;
}
}
2 设计思路###
- 1.定义整数型变量N,i分别用来存放前来查询的用户数和循环次数,定义字符型变量sex来存放性别,定义双精度浮点型变量height用来存放身高
- 2.输入N的值
- 3.赋初值:i=1
- 4.输入性别和身高
- 5.判断性别,若为'M',则输出height1.0/1.09
若为’F',则输出height1.0*1.09 否则,跳出switch语句
3.本题调试过程碰到问题及解决办法###
- 运行时发现输入一次值后就跳出结果
误以为错误,于是进行调试:
按照预想的出现了黑色框框,但是却无法输入值,也就无法进行下一步的调试 - 解决方案:截图询问老师后得知,不应该把断点设在scanf语句,随后便修改断点位置:
发现程序确实按照我们所理想的执行,并且得到正确的结果,反应过来确实只能一次次地进行输入输出,最后pta成功通过
4.本题PTA提交列表(要提交列表,不是结果)###
题目2 特殊a串数列求和##
1.实验代码
int i,sum,a,item,n; // i代表循环次数,sum代表总和,item代表每一次循环后该项对应的值,n代表最后一项有n个a
scanf("%d%d",&a,&n);
sum=0;
item=a;
for(i=0;i<n;i++)
{
sum=sum+item;
item=item*10+a;
}
printf("sum = %d\n",sum);
2 设计思路
- 1.定义五个整数型变量 i,s,a,item,n分别代表循环次数,总和,每一次循环后该项对应的值,最后一项有n个a
- 2.输入a,n的值
- 3.赋初值:sum=0; item=a; i=0;
- 4.sum=sum+item;item=item*10+a;
- 5.重复步骤4直到i=n
- 6.输出sum的值
3.本题调试过程碰到问题及解决办法
-
1.思路错误:把题目理解成最后一项是n个a相乘的数
-
解决方法:运行后发现数值相差较大后认真审题发现理解偏差后及时修改错误
-
2.忘记赋初值导致运行结果错误
-
解决方法:利用DevC++进行变量检测运行第一步就发现了问题所在,sum被系统自动赋值为1,故结果与正确答案相差1
4.本题PTA提交列表(要提交列表,不是结果)
题目3 找出最小值
1.实验代码
int n,i,min,number; //n代表进行比较的数字个数,i代表循环次数,min代表最小值,number代表每次输入的值
scanf("%d %d",&n,&number);
min=number;
for(i=1;i<n;i++){
scanf("%d",&number);
if(number<min){
min=number;
}
else{
min=min;
}
}
printf("min = %d",min);
2 设计思路
- 1.定义整数型变量n,i,min,number分别用来存放进行比较的数字个数,循环次数,最小值,每次输入的值
- 2.输入n和number的值
- 3.min=number;
- 4.输入number的值
- 5.判断number是否小于min,若是,则min=number,若否,则min=min
- 6.重复步骤4直到i==n
- 7.输出min的值
3.本题调试过程碰到问题及解决办法
-
其实一开始的代码并不是这么简洁而是多了对n的判断并且引入了更多的变量,但是一直提示部分正确,于是输入“ 3 3 4 0" 进行调试:
-
程序运行并没有差错,而且结果仍然可以得到min=0,无法理解pta的测试点,并且输入多组数据实验仍然没找出错误,然后多次考虑这道题目后重新整理思路后发现无需定义那么多变量,只要把输入的第一值定义成最小值,然后与往后的数进行比较,将最小值赋给min即可。遗憾的是:因为时间缘故仍然未找出一开始那个代码的错误点
4.本题PTA提交列表(要提交列表,不是结果)
题目4 猜数字游戏
1.实验代码
int key, n; //key代表随机数,n代表猜测的最大次数
int i; // i代表循环次数
int yours; // yours代表用户输入的数
int flag = 0; //flag==0代表猜测错误的情况,flag==1代表猜测正确的情况
scanf("%d %d",&key,&n);
for (i = 1;i<= n;i ++)
{
scanf("%d",&yours);
if (yours< 0) break;
if (yours > key)
printf("Too big\n");
if (yours< key)
printf("Too small\n");
if (yours == key) {
if (i == 1)
{
flag = 1;
printf("Bingo!\n");
break;
}
if (i == 2 || i == 3)
{
flag = 1;
printf("Lucky You!\n");
break;
}
if (i > 3)
{
flag = 1;
printf("Good Guess!\n");
break;
}
}
}
if (flag == 0)
printf("Game Over\n");
2 设计思路
- 1.定义整数型变量key,n,i,yours,flag分别用来存放随机数,猜测的最大次数,循环次数,用户输入的数,用户猜测的情况
- 2.赋初值:flag=0;
- 3.输入key,n的值
- 4.输入yours的值
- 5.判断m是否小于0,若是,则跳出循环结构,若不是,继续判断yours和key的大小关系后输出对应的语句
- 6.判断yours是否等于key,若是,则flag1,且继续判断i的值:若i=1,输出对应语句,若i2||i==3,输出对应语句,若i>3,输出对应语句
- 7.重复步骤4,直到i=n+1
- 8.若flag==0,则输出Game Over
3.本题调试过程碰到问题及解决办法
- (1)问题:结束语句的判断条件不合理导致结果错误
- 解决办法:修改结束语句的判断条件
- 改进:根据课本例题和老师上课的内容引入变量flag来存放事件发生的情况,而后根据flag的值便可输出不同结果,灵活应用flag会提供很多的便利
4.本题PTA提交列表(要提交列表,不是结果)
二、截图本周题目集的PTA最后排名。
三、本周学习总结
1.你学会了什么?
循环体结构的总结
1.while结构
while (条件)
{
循环体;
}
特点
如果一开始条件就不成立,永远不会执行循环体
注意点
- 1.死循环,在while(条件),条件位常量。因为数值都有真假性,因此会进入死循环。
- 2.在while(条件)后,如果没有大括号{},则只会执行第一条语句。
- 3.在while(条件)加 ; 会把下面语句分开,只会进入死循环。
- 4.最简单的死循环:
while(1); return 0;
2.do while结构
do{
循环体;
}while(条件)
do while 和 while的区别###
- 1.很多情况下 while&do while可互换。
- 2.while的特点:如果一开始条件不成立,永远不执行循环体。
- 3.do while的特点不管条件成不成立,先执行一次代码再判断条件。
3.for结构
for(语句1:条件:语句2)
{循环体;
}
注意
如果for后没有三条语句,也要for( ; ; ) ,因为空白语句也是语句
循环体的选择使用###
-
1.一般优先使用for循环,特别是有固定次数
-
2.然后考虑while(当条件要在下面也使用时,选while比较好)
-
3.最后考虑do while
continue&break的使用注意###
break:###
1.使用场合
-
1.switch语句:退出整个switch语句
-
2.循环结构:退出整个循环结构 *while *do while *for
2.注意点
break只对最近的循环结构有效,如果是多个嵌套循环中,只会在当前的循环中有效
continue:###
1.使用场合
-
1.循环结构:结束当前这次的循环体,进入下一次循环体 *while *do while *for
-
2.只对最近的循环有效
tip###
建议for,if后的语句即使只有一句,也最好有{}
补充说明:已经更加熟练地利用DevC++调试来寻找错误了~~~利用它找出了几个错误了~美滋滋......
2.本周的内容,你还不会什么?
- (1)对某些复杂循环结构的解读不够迅速:如利用嵌套循环求i!和的例题
- (2)对由for语句组成的嵌套循环结构的理解还不够清晰,使用也不够熟练
- (3)本次解答循环结构的pta题目时效率低,对循环结构的熟练程度有待提高
- (4)对DevC++的调试差强人意,但是还不够熟练,需要后续的大量练习更快地找到错误点
3.分支结构上机考试总结。
(1)哪些地方错了,为什么?
- 1.第一题运行结果一直等于0,
- 原因:整数型 / 整数型=整数型 (当数据具体化时会注意到这点,但当数据是用整数型变量来表示时往往会疏忽这个易错点)
- 2.第二题中定义了double型,但是后面用的是%f
- 原因:对这些不同数据对应的符号不清晰,以为double型和float都可以用%f,正确做法:double型-%lf float型-%f
- 3.来不及完成最后一题
- 原因:时间不够用,也是不熟练的后果,对一些基础性问题还有易错点没有真正掌握,对程序的调试不熟练
(2)后续要怎么找程序错误?
- 在本周的循环结构练习中利用DevC++对变量监视并且调试后成功找出了几题错误,并且立志要熟练get到调试这个技能从此再也不怕pta过不了
- 补充说明:对错误结果的分析也很重要,把错误结果和理想结果进行比较后先分析再比较针对性地调试,eg,答案总是输出0,那有可能是某个赋值变成了判断阿啥的...后续努力总结
(3)对自己成绩满意么?不满意的话要怎么改进?
- 不满意。
- 改进:渐渐从问学长代码为什么是错的变成完全是靠自己的努力去调试去发现错误,然后坚持自己认为的记笔记的重要性,从一次次失败中去总结去获得经验,还有熟练度的问题就得靠自己练习出来,还是那句practice makes perfect,每天坚持打两个小时的代码要落实到位。