C语言函数嵌套调用作业
一、实验作业
1.1 PTA题目:6-4 十进制转换二进制
设计思路
如果n大于1 对n/2继续进行该函数运算
输出n%2的值
代码截图
调试问题
- 我第一次做的时候判断的边界条件是大于0继续进行运算,但这样是错的,因为当n等于1时,n%2等于0,由于二进制是逆序输出,又因为这个0是放在开头的,可省略
1.2 学生成绩管理系统
1.2.1 画函数模块图,简要介绍函数功能。
1.2.2 截图展示你的工程文件
1.2.3 函数代码部分截图
-
本系统代码总行数:210
-
主函数
-
新建
-
修改
-
输出全部
1.2.4 调试结果展示
- 新建与输出
- 修改及修改后
- 删除
这个步骤我采用的是将要删除的学生后面的所有学生向前移一位,这样做的缺点就是最后的一个学生将会登记两次,目前我还没想到什么刚好的方法
- 其他步骤因为有一些较大的错误,还未改正,在此无法贴出图片
1.2.5 调试碰到问题及解决办法。
- 1、修改学生成绩的函数中,我忘了修改完后要重新计算平均分和总分了,后来运行结果不对,我才发现这个问题,然后再代码后加了计算
- 2、我一开始把计算平均分和总分的函数写在addition里面,但是这样结果却是没有进行计算,所以我只好在输入完后直接计算平均分和总分
- 3、查找学生信息的结果中联系方式会出错,目前还没找出它的错误= =
二、截图本周题目集的PTA最后排名。
三、阅读代码
角谷定理:
- 输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16; - 程序实现:
#include<stdio.h>
int Fun(int m) //定义m为自然数
{
printf("%4d",m);
if(m==1)
return 1; //当m=1的时候返回1
if(m%2==1)
return Fun(m*3+1)+1;//m为奇数,返回它的三倍加1,后面的加一是步数加一
if(m%2==0)
return Fun(m/2)+1; //m为偶数,返回它的一半,同理后面的加一是步数加1
}
void main()
{
int m,n=0;
printf("请输入一个自然数:");
scanf("%d",&m);
n=Fun(m); //定义步数为n,并将m的值传递给形参
printf("\nSTEP=%d\n ",n);
}
- 该题通过递归,省去繁琐的过程,较容易地得到结果
- 其思路大致为:首先输入一个自然数m,调用函数Fun(int m),将m的值传给形参。每次进行判断如果是偶数返回Fun(m/2),是奇数返回Fun(m*3+1),递归调用Fun()函数,直到m=1的时候,返回1,调用结束。另外为了方便计算步数,可在判断是奇数时,直接返回Fun(m/2)+1,偶数同理。然后利用n=Fun(m),输出n的值即为运算的步数。
四、本周学习总结
1.介绍本周学习内容
一、指针进阶
- 1、指针数组
格式:类型名 *数组名[数组长度]
优点:使用指针数组不会造成内存单元的浪费 - 2、二阶指针
一般格式:类型名 * *变量名 - 3、命令行参数
一般形式:命令行 参数一,参数二,参数三,······参数n
命令名和各个参数用空格隔开,可以无参数
注意:使用命令行的程序不能在编译器中执行 - 4、指针作为函数返回值
注意:不能返回在函数内部定义的局部数据对象的地址
2.学习体会。
- 这周学习的知识都比较难,例如二阶指针,它的运算很复杂,容易出错,又比如链表,它的概念我现在也不是很了解(所以没在总结里写上他= =)
- 指针数组是比较好用的,但使用起来也是比较复杂的,需要仔细思考好