C语言--函数嵌套

一、实验作业

注意:
1.可以先初始化2个结构体数组数据以便测试。
2.要求用模块化方式组织程序结构,合理设计各自定义函数。同时,程序能够进行异常处理,检查用户输入数据的有效性,用户输入数据有错误,如类型错误或无效不会中断程序执行,具有一定的健壮性。

1.1 PTA题目 十进制转换二进制

设计思路

主函数:
   定义变量n存放十进制数
   输入n
   调用函数dectobin
被调函数:
	如果n<2输出n
	否则
		dectobin(n/2);
	输出n取2的余数

代码截图

调试问题

一开始使用的判断条件是n!=0,但是0这个测试点没有输出,添加0的输出后非0数值转换结果又错了,后来改用n<2为判断条件答案正确

1.2 学生成绩管理系统

代码总行数:340

1.2.1 画函数模块图,简要介绍函数功能。

1.2.2 截图展示你的工程文件

1.2.3 函数代码部分截图

头文件

插入学生信息及学生成绩信息代码

【只实现了基础功能,合法性没有判断】

删除学生成绩信息代码

【题目是删除成绩,觉得这样操作和修改成绩的代码其实没有区别了】

总分排序代码

(通过输出实现代码注释方便使用操作)

1.2.4 调试结果展示

录入数据

命令1:新增学生信息

新增学生是否已存在

命令3:删除学生信息

命令2:修改学生信息

命令4:输出所有信息

命令5:按总分,平均分排序输出

命令6:查询学生信息

找不到该学生

命令7:退出系统

1.2.5 调试碰到问题及解决办法。

(1)开始建的是c++项目,一加函数就提示结构体重定义,重建项目还是不行,后来重写了结构体,建立新项目,这个问题解决了,但是又出现全局变量函数中提示未定义,改用c项目后解决。

(2)

插入新学生时,循环中数组下标使用了i,而i初值设为0,导致第一组数值被覆盖,换用count后解决

(3)忘记定义的是字符数组,排序时用整型比较的方式寻找输入学号,导致排序一直错误,后改正

二、截图本周题目集的PTA最后排名

三、阅读代码

找一篇优秀代码贴图展示,先描述题目,再贴代码,可自己在里面加注释。
说明该代码功能是什么,优点是什么?
代码本次要求找递归相关代码。代码长度至少10行以上。
内容不能太泛,一定是有针对性讲出代码优势,自己可以从里面怎么学习。

功能:主函数控制输出格式,被调函数利用递归计算数列元素的值
优点:(1)主函数里动态申请变量空间,不浪费内存空间
          (2)斐波拉契数列是比较典型的使用递归的例子,如果使用循环,另外判断n=1和n=2时的情况是可以的,但是从第三项起,要计算第n-2项和第n-1项之和就有点不好操作了,是不是还得用数组存放数值?代价就有点大了。而递归将这种重复性的一样的操作直接丢给计算机去做,代码思路看上去也清晰很多

四、本周学习总结

1.介绍本周学习内容

1.1while(1)可以实现永久循环,通过循环体中的break语句结束循环

1.2#define宏定义将固定不变的系数定义成符号常量,保证符号常量不变性,也增加程序可读性

1.3宏定义格式:#define 宏名 宏定义字符串 【行尾无需加分号,常用大写字母串做宏名,中间可有空格,回车符结束】

1.4在程序编译时,所有出现宏名的地方,都会用宏定义字符串来替换,即宏替换,只替换不做运算

1.5宏要在一行内完成,可实现简单的函数功能,如 #define MAX(a,b) a>b?a:b

     另外如果#define最后跟的“”表示改行未结束,与下一行合起来成为完整一行

1.6宏嵌套定义:#define PI 301415926
#define S PIrr

1.7文件包含的指定的文件名如果使用尖括号<>将使用C语言的标准头文件,编译系统在系统设置好的文件夹中把指定文件包含进来。使用“”则从当前工作文件夹中寻找被包含文件,找不到再到系统中寻找。

1.8条件编译

1.9
01.外部变量格式:extern 变量名表

1)只起说明作用,不分配储存单元,对应的储存单元在定义时分配
2)全局变量只能在某个模块中定义一次,如果其他模块要使用该全局变量,需要外部变量的声明

02.函数的外部声明

1)格式:extern 函数类型 函数名
2)实现在一个模块中调用另一个模块中的函数

2.1一维数组

(1)一般格式:类型名 *数组名【数组长度】
(2)指针数组是由指针变量构成的数组,在操作中既可以对数组元素进行赋值和引用,也可以间接访问数组元素所指向的的单元内容,改变或引用该单元的内容

2.2二维数组

(1)二维数组相当于二级指针,即指向指针
(2)指向指针一般定义:类型名 * *变量名
(3)二级指针指向一级指针,代表同一个单元,值是相等的

2.3二维数组a中三个层次的指针等价关系

(1)a是行元素数组的首地址,又称为行地址,二级指针;a是首行第一个元素的地址,又称列地址,一级指针
(2)a[i][j]等价于
(a+i)+j)或(a[i]+j)

2.4定义二维字符数组必须指定列长度大于最长字符串的有效长度,由于各个字符串的长度一般不相同,会造成内存单元的浪费。而指针数组并不存放字符串,仅仅用数组元素指向各个字符串,没有类似问题

2.5所有的局部数据对象在函数返回就会消亡,其值不再有效,所以不能实现函数时返回在函数内部定义的局部数据对象的地址,一般都返回全局数据对象或主调函数中数据对象的地址

2.6 函数名可以做函数的实参,函数指针做函数的形参

2.学习体会

学的比较零散,所以做系统的时候有点乱了阵脚,知道整个框架要怎么做,但是具体到细节就不确定了,一直在改错误,改不完的感觉,叹气,做系统真的很考验学习的扎不扎实。这周学的东西更体会到知识点的联系的重要性。系统写不出来的时候有挫败感,有点担心期末的课程设计。

原文地址:https://www.cnblogs.com/tajiyu/p/8135259.html