C语言第三次作业
一·PTA实验作业
题目一:最佳情侣身高
1.实验代码
int N,i;//N为输入次数,i用于调整循环次数//
double high,result;//high为用户身高,result为最佳情侣身高//
char op;
scanf("%d",&N);
getchar();
for(i=1;i<=N;i++){
scanf("%c %lf",&op,&high);
getchar();
if(op=='M'){
result=high/1.09;
printf("%.2f\n",result);
}
else if(op=='F'){
result=high*1.09;
printf("%.2f\n",result);
}
}
2.设计思路
- 第一步,定义N,i,high,result等变量,其中N为输入次数,i用于调整循环次数,high为用户身高,result为最佳情侣身高。
- 第二步,输入N,使用for循环语句,输入用户身高。
- 第三步,如果用户为M,result=high/1.09。否则result=high*1.09。
- 第四步,输出答案。
3.本题调试过程碰到问题及解决办法
scanf语句放错位置,输不出答案,调试的时候连M都打不进去,改正后,出现一个新问题,只能输入一次语句,于是又添了一个getchar()
4.本题PTA提交列表
题目二:特殊a串数列求和
1.实验代码
int a,n,sum,i,j;//a,n为所输入的数据,sum是求的和,i用于调整循环次数,j用于赋值为a //
scanf("%d %d",&a,&n);
sum=0;
j=a;
for(i=0;i<n;i++){
sum=sum+a;
a=j+a*10;
}
printf("s = %d",sum);
return 0;
}
2.设计思路
- 第一步,定义a,n,sum,i,j等变量,其中a,n为所输入的数据,sum是求的和,i用于调整循环次数,j用于赋值为a。
- 第二步,输入a,n,同时将sum的初值赋值为0,将j赋为a的值,用于后续的计算
- 第三步,使用for循环语句,公式为sum=sum+a,a=j+a*10。
- 第四步,输出sum.
3.本题调试过程碰到问题及解决办法
刚开始直接写a=a*10+a,使得a的值一直在变化,故而答案不对
后来我就定义了一个j来存放a的值,累加和记为sum,答案正确了。
4.本题PTA提交列表
题目三:找出最小值
1.实验代码
int n,number,min,i;//n为输入的次数,number为输入的数据,min为最小值,i用于调整循环次数 //
scanf("%d",&n);
min=n;
for(i=1;i<=n;i++){
scanf("%d",&number);
if(min<=number){
min=min;
}
else if(min>number){
min=number;
}
}
if(n==1){
min=number;
}
printf("min = %d",min);
return 0;
}
2.设计思路
- 第一步,定义n,number,min,i等的变量,其中n为输入的次数,number为输入的数据,min为最小值,i用于调整循环次数。
- 第二步,输入n,且将min的值先赋值为n。
- 第三步,使用for循环语句,输入number,将min与number相比较,每次都将min赋值为更小的那一个,直至退出循环。
- 第四步,当n等于1时,将min赋值为number
- 第五步,输出min。
3.本题调试过程碰到问题及解决办法
一开始,我的scanf语句放在了for语句前,所以循环一开始就从第二个值开始输入,跳过了第一个数据,后来又忘了当n等于1的情况,PTA提交的时候发现并改正。
4.本题PTA提交列表
题目四:猜数字游戏
1.实验代码
int yournumber,mynumber,N,i;//yournumber为用户输入数据,mynumber为被猜数,N为猜的最多次数,i用于调整循环次数//
scanf("%d%d",&mynumber,&N);
for(i=1;i<=N;i++){
scanf("%d",&yournumber);
if(yournumber<0){
printf("Game Over");
break;
}
else if(yournumber>mynumber){
printf("Too big\n");
}
else if(yournumber<mynumber){
printf("Too small\n");
}
else if(i==1&&yournumber==mynumber){
printf("Bingo!");
break;
}
else if(i>1&&i<=3&&yournumber==mynumber){
printf("Lucky You!");
break;
}
else if(i>3&&yournumber==mynumber){
printf("Good Guess!");
break;
}
}
if(i>N){
printf("Game Over");
}
2.设计思路
- 第一步,定义yournumber,mynumber,N,i,其中yournumber为用户输入数据,mynumber为被猜数,N为猜的最多次数,i用于调整循环次数。
- 第二步,输入number和n.
- 第三步,使用for循环语句,按题目要求输出答案。
3.本题调试过程碰到问题及解决办法
一是有两个too big 和too small语句都没写,二是scanf语句写在在for语句最后一行而且忘了加&,三是有些语句没有写break,所以调试的时候总出现已停止工作。如图是我第一次调试的截图,后来忘了截。
4.本题PTA提交列表
二、本周PTA排名
三、本周学习总结
1.我学会了什么?
- 学会了怎么使用调试工具一步步追踪变量的值,由此推算或找出错误。
- 我发现在使用循环结构时,一进入语句就已经输入了number,所以我的scanf语句要放在循环语句的最后面。然后这就得特别注意循环次数的控制,否则最后一次可能number输入导致出错。
- 学会了一些新的语句,while,do-while的使用。
2.我还不会什么?
不大熟练使用while语句,一遇到循环问题使用for语句,因为用while语句的时候总出错。而且不管使用哪个语句,表达式中是该i<n还是i<=n经常搞混,所以要花挺多的时间调试找问题。
3.分支结构上机考试总结。
(1)哪些地方错了,为什么?
当所要数据为double型时,公式写成整形除以整形,没有乘以1.0;二十四小时制的那道题,没有理解题目意思,写出了错误的表达式;计算所得税的那道题,有些值要乘以百分之十,写成了乘以0.1,正确应写为0.10。
(2)后续要怎么找程序错误?
通过调试找程序错误,或者在程序中使用printf语句输出一些值,查看它能否输出,输出的值又为多少。
(3)对自己成绩满意么?不满意的话要怎么改进?
不满意,多做一些题目,练习题感,加快速度。