C语言第三次博客作业---单层循环结构
一、PTA实验作业
题目1
(1).实验代码
int n;
double height1,height2;
char sex,c;
scanf("%d",&n);
while (n>0){ //当n大于0时循环
scanf("%c%c%lf",&c,&sex,&height1); //c用来获取输入n之后的回车键
switch (sex){ //判断输入的sex是f还是m
case 'F':height2=height1*1.09;n--; //若是f,执行计算,n-1,跳出判断
break;
default :height2=height1/1.09;n--; //若不是,执行另一计算,n-1,跳出判断
break;
}
printf("%.2f\n",height2);//输出计算结果
}
(2)设计思路
- 定义循环变量n;实数变量height1,height2,分别存放用户输入的身高,以及要输出的数值;字符型变量sex,c,sex存放输入的字母,c存放“\n”
- 输入n
- 当n大于0,执行循环
- 若sex==F,计算height2=height1*1.09,并n--,然后跳出
- 若sex!=F,计算height2=height1/1.09,并n--,然后跳出
- 输出height2,然后换行,循环体语句到此结束
(3)调试问题及解决方法
-
第一次写时没有考虑到回车符对程序中sex的影响,导致出现了从到再到的情况
-
第一个想出的解决方案是将
scanf("%c%lf",&sex,&height1);
一句放在while的前面和while中的最后(因为当时我的Devc++还不能调试),输出的结果是 -
所以后来去网上查找、和同学交流,又想了另一个方案,即把
getchar();
放在scanf("%d",&n);
和while(n>0){
之间,然后就得到了结果,发现得到了一样的结果,后来调试,是在第二次输入的时候sex的值为“\n”了 -
后来发现将
getchar();
放在while(n>0){
后边就可以使回车符不记入sex里 -
后来想到是不是能把“\n”用一个变量存放起来,以防止对sex产生影响,就有了上面这个代码的样子,最后用while语句替代了for语句
(4)本题PTA提交列表
题目2
(1).实验代码
int i; //循环变量
double a,b,n,sum; //a,输入的数字;b,存放输入的数字;n,存放输入的n;sum,所有数之和
sum=0; //对sum进行初始化
scanf("%lf%lf",&a,&n); //输入a,n
b=a; //赋值b,让b初始值为a
for (i=1;i<=n;i++){ //建立循环,当i<=n时
sum=sum+a; //先把a存到sum里
a=a+b*pow(10,i); //计算下一个要存放的数字
}
printf("s = %.0f",sum); //以无小数点的形式输出sum
(2)设计思路
- 定义循环变量i;实数变量a,b,n,sum,分别存放输入的数字及循环中单次计算的结果(a),输入的数字(b),循环次数(n),数值总和(sum)
- sum=0
- 输入a,n
- b=a
- 当i<=n时,进入循环
- sum=sum+a
- a=a+b*pow(10,i)
- 循环结束后输出sum
(3)调试问题及解决方法
- 这题遇到的问题是没有看懂题目要求,题目要求求的是a+aa+aaa+···的和,我看成求a+a2+a3+···的和,后来在重新审题后解决
(4)本题PTA提交列表
题目3
(1).实验代码
int i,n,min,num; //循环变量i,限制循环的次数的条件n,最小值min
scanf("%d",&n); //输入数据的个数
scanf("%d",&num); //先输入一个数作为min的值
min=num;
for (i=1;i<n;i++){ //当i<n时循环
scanf("%d",&num); //再读入一个数
if (min<=num){ //若先前的min小于等于之后读入的num,则不变
min=min;}
if (min>num){ //若先前的min大于之后读入的num,将num的值赋给min
min=num;}
}
printf("min = %d",min); //输出这些数中的最小值
(2)设计思路
- 定义循环变量i;整数变量n,min,num,n是数值的个数,min是数值中的最小值,num是单个数值
- 输入n
- 输入数据
- 将第一个数值赋给min
- 当i<n时循环,
- 读入第二个数值,记为num
- 若min<=num,则不用变换;若min>num,则把num的值赋给min
- 循环结束。
- 输出min
(3)调试问题及解决方法
- 第一次做的时候,给了min一个初值(如min=0),然后在Devc++上测试一些数值时是成功的,但是并没有考虑到若输入的数据没有0的情况,于是就不正确了
- 于是后来修改的时候尝试着把
scanf("%d",&num);
放在循环之前,并将这个数值赋给min,然后在循环里也加一条scanf("%d",&num);
,让num记入第二个数值,运行程序之后发现可行,在pta上通过
(4)本题PTA提交列表
题目4
(1).实验代码
int mynumber,yournumber,n,i=1; //定义并赋值循环变量i为1,被猜数mynumber,能够猜的次数n,接下来输入的数yournumber
scanf("%d%d",&mynumber,&n); //先输入被猜数以及能够猜的次数
while(i<=n){ //当i<=n时循环
scanf("%d",&yournumber); //输入yournumber
if(yournumber==mynumber&&i==1){ //若yournumber等于mynumber且i为1,则输出Bingo!(一次猜对),并跳出循环
printf("Bingo!\n");
break;
}
else if(yournumber<0){ //若yournumber<0,则输出Game Over,并跳出循环
printf("Game Over\n");
break;
}
else if(yournumber>mynumber){ //若yournumber大于mynumber,则输出Too big
printf("Too big\n");
}
else if(yournumber<mynumber){ //若yournumber小于mynumber,则输出Too small
printf("Too small\n");
}
else if(yournumber==mynumber&&i>1&&i<=3){ //若yournumber等于mynumber且i大于1小于等于3,则输出Lucky You!(三次内猜对),并跳出循环
printf("Lucky You!\n");
break;
}
else if(yournumber==mynumber&&i>3&&i<=n){ //若yournumber等于mynumber且i大于3小于等于n,则输出Good Guess!(n次内猜对),并跳出循环
printf("Good Guess!\n");
break;
}
i++; //除跳出循环的语句外,都执行i++
}
if(yournumber>=0&&yournumber!=mynumber) //当循环结束时,若yournumber大于等于0且yournumber不等于mynumber,则输出Game Over
printf("Game Over\n");
(2)设计思路
- 定义并赋值循环变量i为1;再定义整数变量被猜数mynumber,能够猜的次数n,接下来输入的数yournumber
- 输入mynumber以及n
- 当i<=n时循环
- 输入yournumber
- 若yournumber等于mynumber且i为1,则输出Bingo!(一次猜对),并跳出循环
- 若yournumber<0,则输出Game Over,并跳出循环
- 若yournumber大于mynumber,则输出Too big
- 若yournumber小于mynumber,则输出Too small
- 若yournumber等于mynumber且i大于1小于等于3,则输出Lucky You!(三次内猜对),并跳出循环
- 若yournumber等于mynumber且i大于3小于等于n,则输出Good Guess!(n次内猜对),并跳出循环
- i++
- 循环结束。
- 若yournumber大于等于0且yournumber不等于mynumber,则输出Game Over
(3)调试问题及解决方法
-
第一次写是根据书本上的猜数字程序自己写的,因此没有写具体的思路,出错在,发现是,导致和条件成立,同时输出了
-
第二次把算法写了,再重新写程序。把flag变量删了,用了for语句,把yournumber和mynumber的判断以及循环次数的判断合到一起。出错的地方在于对循环的次数判断出错,多循环了一次
-
最后一次出错是由于判断语句的先后问题,在写的时候把写在了前面,导致输入负数后会输出
Too small
而不是Game Over
,
如图。调试中也发现了,,在输入负数后程序接着往下走,i从2加到3;于是就改正通过了。
(4)本题PTA提交列表
二、截图本周题目集的PTA提交列表及最后排名。
PTA排名
三、本周学习总结
1.你学会了什么?
- 学到了一些将分支语句用在循环语句里的小技巧和小要点,如在判断数值时要优先判断某些数值是否成立,如可优先判断是否小于0等等题目特殊要求的边界等
- 还学了如何用更简单的判断在一组数值中选出最小值和最大值
- for语句的三个表达式的基本应用,深切体会了不同情况下三个循环语句的选择的重要性
- 相当简单的嵌套循环的应用
2.本周的内容,你还不会什么?
- 嵌套循环的循环条件的判断,如外循环变量和内循环变量的范围界定,以及内外循环所应该写的语句的选择,就是对嵌套循环不是很了解
- 变量数量的选择,有的时候多一个变量可以节省一些步骤,但有时多变量又会影响到程序的纠错,以及对程序的解读难度
- 如何简洁的用循环语句和分支语句去写程序,就是对问题的思路不是很清楚,以至于有时用较多的语句去解决一个别人用几个语句就解决的问题