C语言博客作业--函数嵌套调用
一、实验作业
1.1 PTA题目:6-4 十进制转换二进制
设计思路
定义 i=n,sum=0;
if i/2不等于0
再次调用函数,参数为n/2
输出n%2
end if
else
输出n
return
end else
代码截图:
调试过程碰到的问题及解决办法
本题没有碰到问题
1.2 学生成绩管理系统
1.2.1 画函数模块图,简要介绍函数功能。
1.2.2 截图展示你的工程文件
1.2.3 函数代码部分截图
main函数:
插入排序:
输入信息:
本系统代码总行数:327行
1.2.4 调试结果展示
输入三个学生成绩:
输出成绩:
再次输入一个学号,输入学号已存在或输入了非数字字符:
输入的成绩不在[0,100]上:
对成绩进行总分排序输出:
再次全部输出扔按学号排序:
对成绩进行修改:
查询后,数学成绩改变:
对数学成绩进行删除:
1.2.5 调试碰到问题及解决办法
碰到的问题1:
插入排序时,没有将students[i].num储蓄起来
将数组后移时,k=Count-1,此时的k=i;循环中直接改变了students[i].num,循环结束时,students[k]=students[i]本来是数组后移后插入,但students[i]已经被改变,所以出错
解决办法:移动前先令temp=students[i],移动完后students[k]=temp。
碰到的问题2:
第一次输入完后,再次输入时,循环i的起始位置出错,导致遍历数组查看是否重复或出错时出现导致死循环
因为每次输入都从0开始,而查重的时候也是从0开始,所以无论第二次输入会将第一次的覆盖,而且输入什么都会死循环
解决办法:
定义mark=Count,每次循环从i=mark开始,到i=mark+n;这样不会把上次的输入覆盖,也能正常的查重查错。
碰到的问题3:
每次修改或删除成绩后没有重新计算平均分和总分
解决办法:
修改完后再次计算:
二、截图本周题目集的PTA最后排名
三、阅读代码
递归法求最大公约数:
四、本周学习总结
本周你学会了什么?
函数的递归:
- 一个递归算法必须包括的部分:终止条件和递归部分
宏定义:
宏定义格式:
#define 宏名 宏定义字符串
宏定义可以定义符号常量和简单的函数:
#define PI 3.1415926
#define s PI*r*r
带参数的宏定义:
#define product (x) x*x
若x=y+1,则product(x)=y+1*y+1 ,不用加括号,直接进行计算
指针数组
一位指针数组定义的一般格式为:
类型名 * 数组名 [数组长度]
指针数组color的每个元素指向color[i]分别指向一个字符串,color[i]中存放的是字符串的首地址
char * color[5] = {"red","blue","yellow","green","black"};
二级指针,指向指针的指针
一般定义:
类型名 * * 变量名
例如:
int a=10;
int *p=&a;
int **pp=&p;
此时 a=*p=**pp;
学习体会
经过快一个学期的C语言学习,从最开始最简单的"Hello World"到现在的二级指针、链表,难度不断加大,代码量也越来越多。通过C语言的学习,我觉得这个过程能很好的锻炼自己的逻辑思维能力,特别是这次的学生管理系统,有许多要考虑的地方,通过一些复杂的程序设计能更好的锻炼自己,让我们要考虑到程序的健壮性,不断的对程序进行修改。
此外,对于C语言的学习我认为一下几点比较重要:
- 基础。学号基础才能学习更深入的问题,这一点我对运算符的优先级深有感受,当时学数据类型,一碰到复杂的表达式就要翻书看表,很浪费时间。
- 算法。写程序前先要构思,不应该急着写程序,可以先写伪代码,把框架先写出来,再去填满。
- 调试。现在一个代码量越来越大,如果全部用眼睛看时不太可能,所以熟练的运用调试工具,可以找出问题所在。但也不是一碰到问题就用调试工具,也能用printf语句进行调试。