一、PTA分支结构中题目7-7 计算火车运行时间
1.实验代码
1 #include<stdio.h>
2 int main()
3 {
4 int a,b,c,d;
5 scanf("%d %d",&a,&b);
6 c=a%100;
7 d=b%100;
8 if (c<=d)
9 {
10 printf("%02d:%02d",(b-b%100)/100-(a-a%100)/100,d-c);
11 }else
12 {
13 printf("%02d:%02d",(b-b%100)/100-(a-a%100)/100-1,60-c+d);
14 }
15 return 0;
16 }
2.设计思路
(1)文字描述:
第一步:定义4个正整数,a,b,c,d
第二步:分别输入2个四位正整数,一个是出发时间“a”,另一个是到达时间“b”
第三步:a,b除以100的余数c,d
第四步:比较c和d的大小
第五步:打印格式——2位小时数:2位分钟数
(2)流程图:
3.本题调试过程碰到问题及解决办法
做本道题时,多亏老师和助教老师没有直接告诉我问题的所在,否则也不会找到出错的关键,尽管过程花费的时间比较长。以下是我纠正这道题的过程:
第一次提交时出现的问题:①读和输出未补0,题中给出的输出格式是“2位小时数:2位分钟数”,即00-99两位数(例如03:15)
②分钟没有借位,误区在于分钟最大是60,而非100。最后的结果是由两个4位正整数相减得到,在某种情况下b的后两位小于a的后两位时,需要向小时位借位
③边界未进行测试,即未验证代码在处理极端情况时会发生什么
这次提交考虑到了之前出现的问题①和③,但是分钟的借位还是没有考虑周到
通过这次尝试我渐渐发现问题貌似出现在“c<d”和“c+d”上,在这两者上去弥补分钟借位问题和边界问题
做到这步 ,最终发现了分钟的借位需要用60 -(c-d)
而边界问题在于c=d时的分钟数,应该用d-c来计算
二、PTA循环1中题目7-1统计学生平均成绩与及格人数
1.实验代码
1 #include<stdio.h>
2 int main()
3 {
4 double sum = 0;
5 double average = 0;
6 int count = 0;
7 int n, sore,i;
8 scanf("%d", &n);
9 if (n > 0)
10 {
11 for (i = 0; i < n; i++)
12 {
13 scanf("%d", &sore);
14 sum += sore;
15 if (sore >= 60)
16 {
17 count++;
18 }
19 }
20 average = sum / n;
21 }
22 printf("average = %.1f\n", average);
23 printf("count = %d\n",count);
24 return 0;
25 }
2.设计思路
(1)文字描述
第一步:给average(平均分),sum(总分),count(及格人数)赋初始值0
第二步:输入学生人数n(n为正整数)
第三步:设置循环变量初始值,循环条件,循环增量
第四步:输入n个分数,加和并求取平均值
第五步:判断成绩是否及格,每判定一个成绩及格,count(及格人数)加1
第六步:打印格式
(2)流程图
3.本题调试过程碰到问题及解决办法
在做这道题时根据“提示”得出以下几点问题:
1.没有设置某些变量的初始值,导致循环出现问题
2.本题会出现几种特殊情况,例如提示中的,如果没有人,会怎样?有人但是没有人及格,会怎样?
以上两点问题可以用设置初始值来解决(average=0;count=0)
#include<stdio.h> int main() { int N, i; int score; int count = 0; float sum = 0; float average = 0; scanf("%d", &N); for( i = 0; i < N; i++) { scanf("%d",&score); if(score >= 60) { count ++; } sum = sum + score; } if(N != 0) { average = sum/N; } printf("average = %.1f\n",average ); printf("count = %d",count); return 0; }
这段代码是经老师讲解后改正的,优点就是一目了然的看到上述的两种特殊情况!
还有几点是以后在打代码时需要注意的:
1.if语句()后不要出现“;”,并且尽量打上{ }
2.sum+=count不用放在if语句中
3.当读入固定数量的数据时,采用先读入数量,再采用循环方式读入数据
三、PTA循环2中题目7-2水仙花数
1.实验代码
1 #include <stdio.h>
2 #include <math.h>
3 int main()
4 {
5 int N;
6 scanf("%d",&N);
7 int i,sum=0;
8 int x=1,y=1;
9 for(i=0;i<N-1;i++) x*=10;
10 for(i=0;i<N;i++) y*=10;
11 for(i=x;i<y;i++){
12 int m=i;
13 sum=0;
14 while(m>0)
15 {
16 int temp=1;
17 int count=N;
18 while(count--) temp*=(m%10);
19 sum+=temp;
20 m/=10;
21 }
22 if(sum==i) printf("%d\n",i);
23 }
24 return 0;
25 }
2.设计思路
(1)文字描述
第一步:输入一个数字的位数N
第二步:找到筛选条件的范围(N位数的最小值~N位数的最大值,即x~y)
第三步:循环最小值和最大值
第四步:令N位数i的初始值为N位数的最小值(i=x),循环条件为小于N+1位数的最小值(即N位数的最大值),i++
第五步:定义临时变量m,count;每位的N次幂之和sum;每位的N次幂值赋给temp,并设置初始值
第六步:当count累减时,将临时定义的N位整数m取余并将余数累乘
第七步:将每位的N次幂的值加在一起赋给sum
第八步:将m除以10的商载赋给m,重复第六步到第八步
第九步:筛选符合题意的数(当每位的N次幂值的和等于原N位正整数),并输出打印i
(2)流程图
3.本题调试过程碰到问题及解决办法
本题存在的问题有:
1.上图的代码在Dvc++中能编译也能运行,但是在PTA中被判为运行超时(解决方法:在PTA中使用数学公式——x的y次幂会被系统视为运行超时)
2.循环除时,设置了临时变量,来装载变量“i”的值
3.应先求和sum再循环m的值
下图为老师的参考代码
#include<stdio.h> int main() { int n; scanf("%d",&n); int i, low = 1, high; for(i = 1; i < n; i++) { low = low * 10; } high = low * 10; for(i = low ; i < high; i ++) { int sum = 0; int t; t = i; do{ int r; r = t%10; t = t / 10; int j, b = r; for(j = 1; j < n; j++) { r = r * b; } sum = sum + r; }while(t > 0); if(sum==i) { printf("%d\n",i); } } return 0; }
四、总结和学习进度条
1、总结这几周所学内容、遇到的问题以及解决方法
(1)总结所学内容:①scanf(“%d”,&num1)表明将输入数据以%d对应的类型(整数)存入num1中【要将输入数据存储在某变量中前面加上&】
②“=”是赋值运算符
③float表示单精度浮点数(有效数位6~7位);double表示双精度浮点数(有效数15~16位)
④“++i”表示先使i+1,再进行运算;而“i++”表示先运算再使i+1
⑤“&&”表示和;“||”表示或;“ !”表示非
⑥基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输 ;算法的控制结构:顺序结构、选择结构、循环结构
(2)遇到的问题: ①曾经有一道题中连续用了多个%
②不清楚break和continue语句的区别
(3)解决的方法: ①连续2个连续%在一起则不作为格式描述符号使用,而是作为一个“%”字符输出;连续3个%在使用时同样是将前面的两个连续的%作为一个字符“%”输出,第3个%与d作为格式描述字符处理
②break语句主要的作用是用来跳出该循环,提前结束循环 ;continue语句主要的作用是结束本次循环
2、点评同学作业
(1)[点评苏欣的本次作业]:苏欣同学的本次作业对于设计代码,文字描述设计思路以及本题调试过程碰到问题及解决办法完成的很认真,分析做题过程的同时总结出做题的技巧,对于近期学习的知识点能有一个系统的梳理,但是我觉得你的流程图可以运用得更加规范。
(2)[点评刘洋的本次作业]:刘洋同学本次作业在排版,实验代码以及文字叙述的设计思路都写得很认真,思路很清晰,对表格的统计也很真实有效。但是,在点评作业上可以更加了解超链接的使用,使页面更加简化。希望你能通过这段时间的学习能解决存在的问题和困惑。
(3)[点评王文琪的本次作业]:王文琪同学本次的作业页面排版简介美观,但是我觉得在完成调试过程碰到问题及解决办法时应该附加上编译错误时的代码,这样能够更加明显的比较出前后的思维差异。另外,对于近期的总结比较充分,详细,解决的方法也很现实。
3、请用表格和折线图呈现你这几周的代码行数和时间、博客字数和时间、涉及的知识点