一、PTA实验作业
题目1:7-4 换硬币
1.本题PTA提交列表
2. 设计思路
- 1.定义整数型变量money,count,total分别用来存放要换的零钱,换法个数和硬币数量和,定义整数型变量fen1.fen2.fen5分别代表一分两分五分的数量
- 2.赋初值,count=0,total=0
- 3.输入money
- 4.枚举法,讨论所有可能的五分钱的个数情况
- 5.枚举法,讨论所有可能的两分钱的个数情况
- 6.枚举法,讨论所有可能的一分钱的个数情况
- 7.判断是否符合1fen1+2fen2+5*fen5==money,若是,则total=fen1+fen2+fen5,count++,并输出各种换法情况
- 8.输出count的值
3.本题调试过程碰到问题及解决办法
- 1.本题思路清晰也很相似与课本例题,但是却有个大坑,导致无论DevC++运行再怎么正确,输入再多数据测试和调试都无济于事....这种情况下请回到 最初开始的地方:认真审题!!一步一步对照要求!!!
这是一句看似容易理解但是会忽略其重点的:按5.2.1分循环+从大到小 输出==先尽可能多地输出5fen的数量然后2fen,1fen。如果意识到这个问题后就会发现一开始的代码确实不符合题意,下面是正确(上)错误(下)进行对比,一目了然
题目2:7-7 歌唱比赛评分系统
1.本题PTA提交列表
2. 设计思路
1.定义整数型变量n,repeat分别代表评委的数量和选手的数量,i,k分别代表循环次数,point代表各个评委给出的分数,point1和point2分别代表第一个评委和第二个评委给出的分数
2.输入repeat的值
3.赋初值,i=1,k=1
4.分别输入n,point1,point2的值
5.sum=point1+point2,先把point1和point2的值保留到sum里去
6.利用if语句进行比较,使max等于point1,point2中较大的值,min等于较小的值
7.输入后面评委给出的分数point
8.sum=sum+point, 每输出一个point值就加到sum里
9.利用if语句语句把每个point值与max和min进行比较,使最大值在max,最小值在min
10.k=k++;
11.重复步骤7,直到k>n-2
12.sum=sum-min-max
13.sore=sum/(n-2)
14.输出score的值
15.sum=0; 清空sum的值进入下一轮的循环
16.i=i++
17.重复步骤4,直到i<=repeat
3.本题调试过程碰到问题及解决办法
-
1.运行后答案错误
-
2.进行调试监视变量
从左边的变量可以看出point的赋值出现了错误,于是查看point输入语句,发现point的定义是double型,但是输入时误用%d-整数型 -
3.把point的输入语句修改成%lf后输出正确答案
-
4.但是事情远没有想象中那么简单,PTA依然显示答案错误,于是进行调试和多组数组测试
遗憾的是依然输出正确答案,调试已经起不了太大作用了,在一番纠结和耗掉大量精力以后选择向学长请教,在和学长一同探讨下发现了问题所在:n应该按题意放在repeat的循环下输入
-
5.在改正了n的输入位置后提交显示格式错误,终于不是答案错误已经使成功了一大步了,在分析后得知应该是最后的输出score需要换行,于是终于得到了来之不易的答案正确
题目3:7-8 餐饮服务质量调查打分
1.本题PTA提交列表
2. 设计思路
- 1.定义整数型变量n,repeat,grade,i,k,a分别代表学生数,重复统计,学生所给的分数和循环次数,定义整数型变量count1.2.3.4.5分别代表相应分数对应的人数
- 2.输入repeat的值
- 3.赋初值:i=1,k=1,a=1
- 4.输入n的值
- 5.赋值:count1.2.3.4.5=0 (确保每次循环count被清空)
- 6.输入grade的值
- 7.利用 switch(grade) 来对应累加count1.2.3.4.5
- 8.k++; 重复步骤6直到k>n
- 9.输出 1:
- 10,输出*
- 11.a++; 重复步骤10直到a>count1
- 12.换行
- 13.count2.3.4.5类似于9的操作
- 14.i++,重复步骤4,直到i>repeat
3.本题调试过程碰到问题及解决办法
- 1.思路不清晰:纠结于如何让*紧随于1:后面而且还能多次循环输出
- 解决方法:在一番尝试后找到思路,发现把1:放在需要累加*的循环外不要换行即可紧随
- 2.答案错误,进行调试
解决思路:从检测变量的值可以看出:count1累加后,count2.3.4.5无法累加,直接进入下一个循环,分析发现是错误多用了break语句,导致跳出for循环使其他count无法累加
- 3.修改好2的错误后终于输出了正确答案,但是遇到做PTA有史以来第一次运行超时
解决思路:想办法使代码更加简短且运行效率提高,长时间思考代码后发现可以把 if的判断语句改成switch(grade)语句来提高运行效率
- 4.当仍然处在改代码提高效率的骄傲中PTA却是答案错误.....没事,终于不是运行超时也是一种进步,大不了继续调试多数据测试
解决思路:在耗费了非常长的一段时间但是为找出任何错误后,求助于老师后得知,原来是冒号错误.....应该严格按照题目所用的冒号
跪着反思: 一定一定一定输出格式严格复制PTA的输出格式,连空格都不放过!!!
二、同学代码结对互评(2分)
刘艳钦同学
int i,k,n,repeat; //n代表评委的数量,repeat代表选手的数量
double point1,point2,point,score,sum; //point代表各个评委给出的分数,score代表最终所得分,sum代表
double max,min; //max代表最大值,min代表最小值
scanf("%d",&repeat); //输入repeat的值
for(i=1;i<=repeat;i++){
scanf("%d",&n);
scanf("%lf",&point1);
scanf("%lf",&point2);
sum=point1+point2;
if(point1>point2){ //判断point1和point2的大小关系
max=point1; //把较大的值赋给max
min=point2; //较小的值赋给min
}
else{
max=point2;
min=point1;
}
for(k=1;k<=n-2;k++){
scanf("%lf",&point);
sum=sum+point; //每输出一个point值就加到sum里去
if(point>min){ //把每个point值进行比较,使最大值在max,最小值在min
min=min;
if(point>max){
max=point;
}
else{
max=max;
}
}
else{
min=point;
}
}
sum=sum-min-max; //总分减去一个最高分和一个最低分
score=sum/(n-2); //最后成绩等于平均分
printf("score:%.2f
",score); //输出答案
sum=0; //清空sum的值进入下一轮循环
}
林晓露同学
double repeat,n,a,min,max,i,j,k;//repeat循环运算,n评委,a为输入的分数//
double score,sum;//最终得分与求和//
scanf("%lf
",&repeat);
for(k=1;k<=repeat;k++){//repeat次循环运算//
scanf("%lf
",&n); //确定n的值,数值的赋值//
sum=0;
min=100;
max=0;
for(i=1;i<=n;i++){//循环得出最大最小值,和总和sum//
scanf("%lfd",&a);
if(a>=max)
max=a;
if(min>=a)
min=a;
sum=sum+a;
}
score=(sum-min-max)*1.0/(n-2);//计算最终得分//
printf("score:%.2f
",score);
}
- 代码的不同点:对于从point中找出max和min的办法不同,我是利用上次输入一段数字按从大到小输出的思想,想先输入两个值来给max和min赋值,然后再一一比较,而她是利用题目所提及的边界值,直接使min=0,max=100,然后再一一比较
- 我更喜欢她的代码风格,因为她的代码比我更简洁明了些,相对我的代码来说,她的代码的执行效率会更高,但是她的这种做法也有局限性,就是需要已知point的边界值,当然我的做法也有局限,就是必须得已知评委数大于等于3
- 劣势:代码的整齐度有待提高,也是我需要进步的地方
三、截图本周题目集的PTA最后排名。(2分)
PTA排名
四、本周学习总结(1分)
1.你学会了什么?
- for循环的嵌套
即在for循环里面再加入一个或多个for循环(注:其它循环或if条件结构也可以加入)
for(表达式1;表达式2;表达式3){
for(表达式1;表达式2;表达式3){
}
}
这里有内外两个循环,步骤为先执行外循环的表达式1和2然后再内循环的表达式1,2,3然后再执行外循环的表达式3.即当内循环全部执行完一次之后,再执行外循环。
- 这周的pta作业中仍然出现了break和continue语句的用法模糊导致错误:重温——注: break跳出循环 continue:跳过这个循环,执行下一步
while(n) 的含义
当n=0时,退出这个循环,当n不等于0时,执行这个循环
事实上,C语言提供了一个条件 非零就可以为真的标准,而不是真就是1,假就是0。所以while(可以满足非零的表达式),例如while(n),程序就可以进入循环体里面。
循环结构中变量的作用域问题,全局变量,局部变量和变量的生命周期
- 局部变量
在函数内定义的变量(包括形参)
作用范围: 本函数内部 - 定义在复合语句内的变量
作用范围: 复合语句内部 - 全局变量
在函数以外定义的变量,不从属于任一函数。
作用范围: 从定义处到源文件结束(包括各函数)
PTA作业的总结:
- 1.从本次耗时很长的错误都出现在没有完全符合题意中,反思一定一定要非常认真去理解清楚题目的要求,同时也总结出两小点关于如果DevC++运行正确而且调试实在找不出答案的话:
<1> 回到最初的起点:eg:7-4,7-7 重新认真审题然后与自己的代码顺序思路一一对比
<2> 是否是输出问题:eg:7-8的冒号问题还有之前各种输出空格问题 ,请以后一定要严格复制题目的输出范例,拒绝没效率地打代码 - 2. switch语句比if语句的代码执行效率高 :eg:7-8
2.本周的内容,你还不会什么?
- 进入嵌套循环结构后,代码的思路更加的复杂,而我的代码总是没办法那么简洁,相对同学的来说会更加复杂一些,需要学会有更好的思路来解题
- 嵌套循环的算法描述不够清晰,想尝试流程图却无从下手,需要继续学习
- 对打印菱形心形等题目还没完全掌握,处于一知半解的状态,要去查找更多相似的题型去实践去熟练
- 对全局变量的运用类型,调用函数等还不够熟练,仍然需要继续努力学习
eg.局部变量的易错题