1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
还未接触函数时,觉得函数是很高大尚且复杂的东西,接触之后发现其确实很高大尚且可以根据自己需求来完成属于自己的函数,
实现了相似代码封装在同一函数,只要调用即可完成相似输入输出,在写很长的代码时大大简化了代码,可以说是未来写代码是比不可少的;
通过本章学习以及大作业的完成,对函数的使用已有了比较好的掌握,且在调试等方面的能力也相对的提高了;同时本章学习过程中,
每天敲代码的任务完成的比较好,接下来也可以适当的对自己进行增量;本章还学习了全局变量和静态变量,以及程序化程序设计思想这些比较
之前比较陌生的知识,了解到程序设计时先进行合理规划可以使写代码过程中思路更加清晰,且全局和静态变量的定义增加了程序的灵活性。
1.2.2 代码累计
2.PTA总分
2.1截图PTA中函数题目集的排名得分
2.2 我的总分:
- 2018-c-函数:145分
- 总分:145分
3.PTA实验作业
3.1 PTA题目1
本题要求实现两个函数:一个函数判断给定正整数的各位数字之和是否等于5;
另一个函数统计给定区间内有多少个满足上述要求的整数,并计算这些整数的和。
3.1.1 算法分析
int is(int number)
{
定义整型变量digit用于存放一个数的各个位数的数字;
定义整型变量sum1用于计算各位数字之和;
while number!=0 do
digit=number%10;
sum1=sum1+digit;
number=number/10; /*求给定正整数的各位数字之和*/
end while
if sum1==5 then
返回值1 //各位数字之和为5时返回值1
else do
返回值0
end if
}
void count_sum(int a,int b)
{
定义i用于循环的使用;
定义整型变量count用于计数满足个位数字之和的正整数的个数;
定义整型变量sum用于求和满足条件的正整数;
定义整型变量t用于中途存放某个数;
if a>b then
t=a;a=b;b=t;
end if
for i=a to b do
if is(i)==1 then
count++;
sum=sum+i; /*计数及求和在[a,b] 区间内满足条件的正整数*/
end if
输出count和sum的值
}
3.1.2 代码截图
3.1.3 测试数据
3.1.4 PTA提交列表及说明
Q1:刚开始错误问题较多,进行代码阅读和查错;
A1:发现我将is(i)赋值给sum,而is(i)返回值是0和1,明显错误,改成将i赋值给sum即可;
Q2:更改完后依旧错误;
A2:调试并没有发现问题所在,然后有进行题目细读,发现int is( int number )函数中没有考虑到题目中返回0的情况;
Q3:再次提交,发现如下图1所示错误;
A3:向同学请教了解到此错误是没有考虑到a和b相等时的情况,解决方法是在加一个if语句单独考虑a==b的情况;
图1
4.大作业
4.1.函数关系图
4.2.函数功能介绍
1.函数1:main()
- 功能:显示主菜单;进入相应等级的函数进行作答;提示是否继续做题;
- 思路:
- 1.显示主菜单
- 2.提示输入等级和题数,判断输入是否正确并进行规范;
- 3.运用switch判断grade,进入相应等级的函数进行测试,若grade不为1,2,3则回到开始重新进行输入;
- 4.提示是否进行在一轮的刷题,运用if语句进行判断是的话随机输入一个数,不进行下一轮的刷题则输入0;
函数代码图如下:
2.函数2:gradeOne(int n)
- 功能:实现1位数的一步加减乘除计算测试;
- 思路:
- 1.进入for循环(循环的范围为1到所要做的题数)
- 2.在循环中生成三个随机数x,y,op,以保证每道题的数值和符号随机;x,y是计算用的随机1位数,op产生的随机数用于实现符号的随机;
- 3.运用switch语句先判断符号类型,在进行相应的答题,运用if语句判断正误并进行相应提示;
- 4.如果正确则count数加1;
- 5.计算每道题计算所花的时间的进行相应的输出(代码中有注释);
- 6.for语句出来后,计算rate(正确率)=count*1.0/n;
代码截图如下
3.函数3:gradeTwo(int n)
- 功能:实现2位数的2步加减运算测试;
- 思路:答题思路与gradeOne(int n)相似;
- 有所不同的地方是,此等级进行两步加减运算,所以我让判断符号的随机数进行两次的依次运算,计算出程序所给式子的结果,在与刷题人的结果进行对比;
- 此计时操作和计算正确率的操作等上个函数已做说明,不在详细;
代码截图如下:
4.函数4:gradeThree(int n)
- 功能:实现3位数的2步加减运算测试;
- 思路:与函数3类似,不做说明直接上图;
函数截图如下:
函数5:correctMessage()
- 功能:当刷题者答对时,进行的4种中随机一种的提示说明,使程序更友好;
- 思路简单不做说明
代码截图如下:
5.函数5:errorMessage()
- 功能:当刷题者答错时,进行的4种中随机一种的提示说明,使程序更友好;
- 思路简单不做说明
代码截图如下:
6.函数6:press()
- 功能:实现按任意键继续的操作;
函数截图如下:
4.3 运行结果截图
4.4 调试碰到问题及解决办法
- Q1:输入非法字符,导致程序崩溃;
- A1:刚开始想着运用一个函数去解决,但函数返回值唯一且在另一个函数中再次输入的值会有所变化,导致程序进入死循环;
后询问同学及群上讨论的改正方法,后用while语句实现实现; - Q2:输入答案正误提示单调;
- A2:设置两个函数分别包含四种不同类型的提示;
- Q3:计算一题题目所花时间的问题;
- A3:通过网上查阅资料,运用time.h头文件中的一个代码进行实现;
- Q4:程序运行时只在一个页面进行导致的页面繁琐问题;
- A4:也是网上资料查询,运用清屏函数和按任意键继续的函数进行解决;
- Q5:一步计算的除法输出有误,无法与刷题者的答案匹配,即使提示答案正确也显示错误的问题;
- A5:将除法输入答案改为商(整数)+余数的输出,不用小数部分(考虑到一位数的刷题多为一到二年级,未接触小数);
4.5 大作业总结
先提出大作业的一些不足:函数之间的关系性不是很强,都是分开独立的,像函数3,函数4其实是类似的函数,应该想办法将其和为一个函数,而这也导致了代码量偏多;
再者,就是函数之间的无关联导致想写出有优先级函数显得非常困难,这也是未解决的问题。
这次大作业花了很长的时间,但是一分耕耘一分收获,收获还是很多的。首先在解决程序问题过程中学习到了一些未见过的函数,如清屏函数和按任意键继续的函数等;
其次,写大作业的过程也是bug不断出现的过程,而且代码关系相对密切,更改时会变动较多的代码,在这不断地调试更改的过程中,也使我对调试器更加熟练,且阅读代码能力
得到提升;然后就是下次对函数的封装要有很好的规划,否者就会导致代码量超多且复杂的问题。