c语言的第三次---单程循环结构
一、PTA实验作业
题目1
1.代码
int N,i;
double height; //height代表身高
char sex; //代表男女性别
scanf("%d",&N);
for(i=1;i<N;i++){
scanf("%c%f",&sex,&height);
getchar();
if(sex=='M'){
printf("%.2lf",hight/1.09);
}
else{
printf("%.2lf",hight*1.09);
}
getchar();
2.实验思路
- (1)定义两个整形变量N、i,N代表输入的个数,定义一个浮点型变量height代表身高。定义一个字符类型sex代表性别。
- (2)在第一行输入N,height。
- (3)当sex'M'时,输出height/1.09的结果,并保留两位小数 。当sex'F'时,输出height*1.09的结果,并保留两位小数 。
3.调试问题
该题需要输入多个数据,但当我调试时总时不能输入第二行输据,按回车键时直接输出结果为0,改了很多处都无法解决这个问题,后来经过询问同学和百度后才知道系统把回车键当作一个字符吸收了,从而无法识别后面的字符。后来我在输入%c的前面加了一个空格,才解决了这个问题。
4.PTA提交列表
题目2.特殊a串数列求和
1.代码
int a,n,i;
double sum,item; //sum用来存放各项之和 //item用来存放每一项
scanf("%d%d",&a,&n);
sum=0;
item=0;
for(i=1;i<=n;i++){
item=a*pow(10,i-1)+item;
sum=sum+item;
}
printf("s = %.0lf",sum);
2.实验思路
- (1)定义三个整形变量a,n.i,两个浮点型变量sum,item,sum用来存放各项之和,item用来存放每一项。
- (3)输入两个整数a,n。
- (4)令i=1,i<=n,每执行一次循环i++,循环体为: item=a*pow(10,i-1)+item;sum=sum+item。
- (5)循环结束时输出sum,同时保留两个有效数字。
3.调试问题
这题比较简单,就是一开始看错题目了,把题目中的aa看成了a*a,导致写出了错误的代码。还写代码时引用了数学函数,但没有在代码前声明。最后通过调试发现了错误。公式没写正确,公式中应为i-1,而我写成了i,后来通过断点调试改正了错误。
4.PTA提交列表
题目3.找出最小值
本题要求编写程序,找出给定一系列整数中的最小值。
1.代码
int n,result,i,min; //result代表用户输入的数据 //min用来存放最小值
scanf("%d",&n);
scanf("%d",&result);
min=result;
for(i=1;i<n;i++){
scanf("%d",&result);
if(min>result){
min=result;
}
}
printf("min = %d",min);
2.实验思路
- (1)定义四个整形变量 n,result,i,min,result代表用户输入的数据,min用来存放最小值。
- (2)在一行中输入一个正整数n,之后是n个整数。
- (3)令i=1,i<=n,每执行一次循环i++。循环体为; scanf("%d",&result); if(min>result),令 min=result。
- (4)循环结束时,输出min的值。
3.调试问题及解决方法
第一次写的时候没设中间变量min,直接把最小值赋给了n,最后输出最小值n时答案总是不正确。通过设段点调试时才发现n发生变化时循环的条件也发生了改变,所以不能直接改变n的值,要通过一个中间变量来储存要最小值。
4.PTA提交列表
题目4. 猜数字游戏
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
1.代码
int mynumber,younumber,n,i; //mynumber、younumber分别代表用户输入的数字与系统产生的被猜数
scanf("%d%d",&younumber,&n);
scanf("%d",&mynumber);
if(mynumber>=0&&i<=n){
for(i=1;i<=n;i++){
if(younumber<mynumber){
printf("Too big\n");
}
else if(younumber>mynumber){
printf("Too small\n");
}
else{
if(i==1){
printf("Bingo!");
break;
}
else if(i<=3){
printf("Lucky You!");
break;
}
else if(i<=n){
printf("Good Guess");
break;
}
else{
printf("Game Over");
break;
}
}
scanf("%d",&mynumber);
}
}
else{
printf("Game Over");
2.实验思路
- (1)定义三个整形变量 mynumber,younumber,n,i,
- (2)第一行输出mynumber与n,之后每行输入一个mynumber。
- (3)令i=1,i<=n,每执行一次循环i++。在循环中当younumber<mynumber时,输出"Too big\n";当younumber>mynumber时,输出"Too small\n";否则,不满足上述时:i=1时,输出"Bingo!";i>1&&i<=3时,输出"Lucky You!";i<=n时,输出"Good Guess"。循环输入mynumber。
- (4)当不满足上述循环时,直接输出"Game Over"。
3.调试问题及解决方法
这题是写得最久的一题,因为该循环太长了,导致犯了很多错误,例如把 else{ printf("Game Over");这句放到了循环内,导致调试时系统多输出了一句Game Over,一些语句中的break忘了加。
4.PTA提交列表
二、截图本周题目集的PTA最后排名。
三、本周学习总结
1.你学会了什么?
- 在这次作业中我试着不翻课本,独自地完成每一道编程,发现了自己的好多毛病。虽然效率真的慢了好多,但通过拿自己的代码跟课本上的作对比,及时发现了自己的不足。之前太依赖课本,我觉得这不利于自己的思维,因为每道题目的做法有很多种,有些课本上的题不一定是最简便的。
- 弄懂了for循环语句和while循环语句的不同点和相同点,如果给定循环次数时,首选for语句。当要先进入循环条件,再判断循环是否结束时,用do-while,但在大多数情况下,两者可以通用。
2.本周的内容,你还不会什么?
- 这次PTA题目有些我觉得有点难,例如龟兔赛跑那题,写了好久都没思路。我觉得可能是练得不够多吧,遇到陌生的题就感觉无从下手。
- 不太会用devc设段点这个方法来找自己代码的错误。
3.分支结构上机总结。
- 哪些地方错了,为什么?
调用那几种数学函数的单词记混了,导致用devc调试好久都得不到正确答案。还有那天那个swich语句格式忘了,调了几次改用if语句才写得出来。
我觉得是因为我之前打代码都太依赖课本了,导致一些语句的格式都没记住。 - 后续要怎么找程序错误?
以后学着用devc设段点来观察变量。 - 对自己的成绩满意吗?不满意的话要怎么改进?
不满意,以后要多练,争取熟能生巧。