一、实验作业
1.1 十进制转换二进制
设计思路
如果n==1 输出1 即递归出口
否则如果n>1
dectobin(n/2) 即递归函数
输出n%2的结果
否则输出0 即为输入n时直接为0的情况
代码截图
调试问题
一开始将递归出口写错错将n==0当作递归出口但是还需要判断n直接为0的情况,所以递归出口应该是n==1的时候。
1.2 学生成绩管理系统
1.2.1 画函数模块图,简要介绍函数功能
1.2.2 截图展示你的工程文件
1.2.3 函数代码部分截图
- 本系统代码总行数:278
1.2.4 调试结果展示
输入学生信息与成绩信息:
修改学生成绩信息:
删除学生成绩信息:
按照总分排行:
修改分数后再按照总分排行:
退出:
输入非法指令:
输入学号非整数和输入学号不足12位:
输入学号重复:
输入电话号码错误:
输入电话号码第一位可以是+号:
修改学生成绩输入学号错误和该学号没有被输入过:
删除学生成绩输入学号错误和该学号没有被输入过:
1.2.5 调试碰到问题及解决办法
在新建文件的时候编译不被通过,显示新建文件中的函数不被识别,只能重新建立一个工程把东西都复制过去。
二、截图本周题目集的PTA最后排名
三、阅读代码
1.
用递归实现二分查找
#include <stdio.h>
int r_search(int arr[], int low, int high, int k);
int main( )
{
int key,index,n,i;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
printf("输入要查找的关键字:\n");
scanf("%d", &key);
index = r_search(a, 0, n-1, key);
if(index >= 0)
printf("关键字所在位置是:%d \n", index);
else
printf("没有找到关键字\n");
return 0;
}
int r_search(int arr[], int low, int high, int k)
{
int i,mid;
if (low>high) i=-1;
else
{
mid=(low+high)/2;
if(arr[mid]==k)
i=mid;
else if(arr[mid]>k)
i=r_search(arr, low,mid-1,k);
else
i=r_search(arr, mid+1,high,k);
}
return i;
}
用递归实现二分查找在形式上更为简洁,将二分查找封装成函数,不同情况下进入不同的递归式子,可读性高。
四、本周学习总结
1.介绍本周学习内容
- 函数的嵌套调用:
函数里面还嵌套着函数称为函数的嵌套调用,比如:
- 宏定义:
它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。简单的宏定义格式为#define <宏名> <字符串>
比如#define pi 3.14159265
,带参数的宏定义格式为#define <宏名>(<参数表>) <宏体>
比如#define A(x) x
,宏定义只用来做替换。比如
该题答案为A,宏定义不会帮助我们添加括号,只是单纯的替换,这一点容易错。同时宏定义也能实现简单的函数功能,十分简洁。 - 工程文件间的联系
工程文件间的联系用到全局变量的话就需要外部声明,变量声明格式为extern 变量名表
,外部函数调用格式为extern 函数类型 函数名
- 动态内存的申请与释放:
malloc函数为动态内存的申请,它需要头文件#include<stdlib.h>
,原型为void *malloc(size_t size)
,参数size代表需要动态申请的内存的字节数,若内存申请成功,函数返回申请到的内存的起始地址,若申请失败,返回NULL。
free函数为动态内存的释放,它也需要头文件#include<stdlib.h>
,原型为void free(void *ptr)
,必须提供内存的起始地址,无返回值。
注意点:malloc与free是配对使用的,编译器不会帮助我们释放内存,所以要记住申请了动态内存后一定要释放。
2.学习体会
本周写了一个学生信息管理系统的工程,做了非常多天,代码量也达到了278行,感觉写的难度还是有点大的,特别是在于工程的健壮性,让我必须将很多输入都改成字符型,才能保证在输入不同类型数据时,程序不至于崩溃。现在学习的难度也越多越高,动态内存的申请与释放,以及要学习的链表,更是让人头痛。打代码还是要脚踏实地,一个一个打,实践出真知,一直看书是看不明白的,只有打代码时遇到问题去解决了以后,之后再遇到这种问题才会解决。千里之行,始于足下,只有认真对待每一次作业,才能越来越进步,越来越成长。