一、PTA实验作业
7-1 查询水果价格
1. 本题PTA提交列表
2. 设计思路
#include<stdio.h>
int main()
{
int x,i=0;
printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
for(i=0;i<5;i++){
scanf("%d",&x);
switch (x){
case 1:printf("price = 3.00\n");break;
case 2:printf("price = 2.50\n");break;
case 3:printf("price = 4.10\n");break;
case 4:printf("price = 10.20\n");break;
case 0:goto out;
default:printf("price = 0.00\n");break;
}
}
out:
return 0;
}
- (1)首先先定义两个整形变量想x和i,x表示每次查询的单号,i表示循环的次数。
- (2)然后输出每个单号所代表的查询的水果。
- (3)然后进行一个循环操作。
- (4)让i=0,进入循环每次循环i的值都加1,直到i>=5时结束循环。
- (5)在这个循环中先输入x的值,再进行一个switch语句的选择,
- (6)当x=1时,就输出price = 3.00并且换行,然后用一个break结束这单层的循环。
- (7)当x=2时,就输出price = 2.50并且换行,同样用一个break结束循环。
- (8)x=3,和x=4时按同样的方试操作。
- (9)(如果x=0,题目要求输入0时直接退出,所以在这里我用了一个goto
因为break只能跳出一层,所以利用一个goto 直接跳出。 - (10)其他情况都输出price = 0.00
(11)最后是吧 out放在return 的上一层。然后结束。
3.本题调试过程碰到问题及解决办法
这道题啊,感觉就是当时对于那个选择0的时候,题目要求直接结束,所以我当时就想用break来结束,可是试验了很多次总是答案错误,后来我翻看了书本,书上说break只能够结束他所在的
这一层循环或判断,如果在在switch的外面再用一个break就会导致循环还没有到结束的条件就跳出循环,又导致答案错误,我就很烦,后来天助我也,我就看了那个翁恺的视屏
视屏中讲到了一个goto的用法,我发现好像我的同学这题都没有用到这个用法,哎呀,就有点沾沾自喜,所以选了这题,而且这题也是历经波折。7-7 歌唱比赛评分系统
1. 本题PTA提交列表
2. 设计思路
#include<stdio.h>//别看了不可能有注释的,因为下次我会注意的,现在没有时间注释了,抱歉。
int main()
{
int repeat,n,grade,min=100,max=0,i,j;
double score,sum=0;
scanf("%d",&repeat);
for(j=1;j<=repeat;j++){
scanf("%d",&n);
min=100;max=0;
for(i=1;i<=n;i++){
scanf("%d",&grade);
sum+=grade;
if(max<=grade){
max=grade;
}
if(min>=grade){
min=grade;
}
}
sum=sum-max-min;
score=sum/(n-2);
printf("score:%.2f\n",score);
sum=0;
}
return 0;
}
- (1)首先定义7个整形变量,其中repreat和n的意思都是题目给的grade就表示每次输入的成绩,而下面sum是表示去掉一个最高分和一个最低分后的成绩总和,score就是最终得分。
- (2)这题我的两点就在于定义了那个min=100和max=0,你知道为什么吗?这个min表示的就是所有成绩中的最低分,而那个max表示的是最高分,然后听我后面给你讲。
- (3)先输入repreat的值,来决定总循环要循环多少次
- (4)进行一个循环令i=1,每次循环i都加1直到i>repreat 结束循环,然后输入n的值
- (5)然后在循环内在进行一次循环令j=1,每次循环就让j加1直到j》n结束循环
- (6)在循环中输入grade的值,给sum定义一个初值0
- (7)进入判断语句如果max<grade则max就等于grade经过循环就能得出最大值,上面让max的0就是max的值对最大值得干扰使最大值是在grade中选出
同理如果min>grade则min=grade最终得出最小值。 - (8)sum=sum+grade,在判断出最大值和最小值后让sum=sum-max-min就实现扣去一个最高分和一个最低分的条件。
- (9)最后score=sum/(n-2),在输出score的值。
(10)其中一个细节的地方就是在第一层循环中都要在令max=0,min=100,因为每次循环后都会让max和min的值改变。
3.本题调试过程碰到问题及解决办法
(1)第一个问题就是没有理解repreat的含义,还以为他是让同一个n循环两遍。所以我就一开始没有利用嵌套循环这个形式,直接让repreatn
让循环结束的条件变为i>repreatn。
(2)第二个问题就是没有给max和min付初值,使得max的值会影响grade中的最大值,会导致答案部分错误
(3)第三个就是细节点,没有在二层循环结束后再重新给max和min定义初值,导致上一次的循环的值影响到下一次最大值和最小值的判断
7-8 餐饮服务质量调查打分
1. 本题PTA提交列表
2. 设计思路
#include<stdio.h>
int main()
{ int repeat,n,i,a,grade,one=0,two=0,three=0,four=0,five=0,d;
char op;
scanf("%d",&repeat);
for(i=0;i<repeat;i++)
{
one=0;
two=0;
three=0;
four=0;
five=0;
scanf("%d",&n);
for(a=0;a<n;a++)
{
scanf("%d",&grade);
switch(grade){
case 1:one++;continue;
case 2:two++;continue;
case 3:three++;continue;
case 4:four++;continue;;
default:five++;continue;
}
}
printf("1:");
for(d=0;d<one;d++)
printf("*");
printf("\n") ;
printf("2:");
for(d=0;d<two;d++)
printf("*");
printf("\n") ;
printf("3:");
for(d=0;d<three;d++)
printf("*");
printf("\n") ;
printf("4:");
for(d=0;d<four;d++)
printf("*");
printf("\n") ;
printf("5:");
for(d=0;d<five;d++)
printf("*");
printf("\n") ;
}
return 0;
}
- (1)首先定义好多个整形变量,和一个字符型变量ch。
- (2)然后输入repreat的值,在进入一个循环令i=0每次i的值都加1,直到i>=repreat的值结束循环。
- (3)然后给one two three four five 的初值都为0,在输入n的值,
- (4)在进入一个循环令j=0每次j都加1直到j>=n的值,在输入grade的值
- (5)再进入一个switch的语句如果grade=1,one++在跳出switch语句,同理其他也一样。
- (6)在输出1:在进行一个循环语句令d=0,d>=one就结束循环,在循环中每次都输入*
(7)在进行一个if语句的判断如果d=one(其他同理)就输出\n。
3.本题调试过程碰到问题及解决办法
(1)这题碰到的第一个问题就是没有思路,不懂怎么在例如1:后面重复输出,如果用嵌套语句那不是每次都会多输出1:,这样显然不行
然后我就在想利用那个goto用法,可是这个用法很奇怪时而可用时而不可用。我是打算在输出1:后用goto直接跳到一个循环语句来输出,后来想了很久
放弃了这个想法
(2)解决方法就是同学给了提示,当然还有我的聪明才智啦 哈哈哈
(3)其实在其中还遇到了一些细节问题,就是把如果把那个printf("\n") 放在if语句的判断中 如果之前的grade中没有这个数字,就加入没有1
那么one=0,那么就不会进入if语句中那么就不会换行,导致错误。
二、同学代码结对互评
黄炳炜代码7-1
#include<stdio.h>
int main()
{
int choice,i;
double price;
printf("[1] apple\n");
printf("[2] pear\n");
printf("[3] orange\n");
printf("[4] grape\n");
printf("[0] exit\n");
for(i=1;i<=5;i++)
{
scanf("%d",&choice);
if(choice==0)
break;
switch(choice)
{
case 1:price=3.00;break;
case 2:price=2.50;break;
case 3:price=4.10;break;
case 4:price=10.20;break;
default:price=0.00;break;
}
printf("price = %.2f\n",price);
}
return 0;
}
上面这个是我宿舍大佬黄炳炜的代码,他的思路很清晰啊直接将特殊的choice=0,单独拿到外面来判断
在用一个switch语句简单明了,哎,亏我还想那么久,真的烦。他这个就可以利用那个break,来跳出循环。
三、截图本周题目集的PTA最后排名。
四、本周学习总结
1.你学会了什么?
本周所学的内容
- (1)本周学了嵌套循环的形式,会解决了一些常见的嵌套循环的题目。
- (2)主要本周是学习了函数,知道了什么事函数声明,函数定义,还有实参形参的定义。
(3)再就是学习了全局变量和局部变量的定义,和特性,还有就是什么叫做静态储存和动态储存。
注意事项
- (1)在嵌套循环中我觉得要注意的事项就是你所定义的值在经过第一次循环后要考虑其会不会影响后面的循环。
- (2)函数中要注意在函数声明时有冒号,而在函数定义是没有冒号。
- (3)在函数首部函数名需要一个用一个合法的标识符表示。其函数的类型与return语句中表达式类型一致。
- (4)函数的形参可以是多个可以是一个也可以没有,实参到形参具有单向性。
- (5)void类型的函数不直接返回一个值,他的输出通常以屏幕输出等方式。
(6)再要注意的是函数的调用关系为先调用主函数,在依次调用其他函数。
2.本周的内容,你还不会什么?
本周内容,对函数的使用还是不怎么熟练,对于什么时候要用形参什么时候不要用形参都不懂
还有就是全局变量的使用和复合函数,经常会绕进去。没理解透彻。主要就是还没与函数近距离接触,还是要通过题目找到自己不足。