一、实验作业
1.1递归实现顺序输出整数
1.1.1设计思路
int flag=0
void printdigits(int n)
{
如果n==0且flag==0
输出0后换行
return
如果n==0且flag==1
return
flag=1
递归调用printdigits(n/10)
输出每次的n%10的值
}
1.1.2代码截图
1.1.3调试问题
没有判断当数字只有零的情况,加入一个flag变量判断为零的情况即可
1.2学生成绩管理系统
1.2.1函数模块图及其功能
1.2.2工程文件截图展示
1.2.3函数代码部分截图
本系统代码总行数:275
头文件
插入学生信息及学生成绩信息
删除学生信息
总分排序代码
1.2.4调试结果展示
输入学生信息
修改学生信息
删除学生信息
查询学生信息
按总分和平均分排序
查询不到
1.2.5调试碰到问题及解决办法
二、截图本周题目集的PTA最后排名
三、阅读代码
题目:将一个整数转化成字符串
递归写法:
#include<stdio.h>
void convert(int n);
int main()
{
int num;
scanf("%d",&num);
if(num<0)
{
putchar('-');
num=-num;
}
convert(num);
}
void convert(int n)
{
int k;
if((k=n/10)!=0) //一位一位提取直到最后一位
convert(k); //递归调用,逐个输出字符串
putchar(n%10+'0');
}
非递归写法:
#include<stdio.h>
void convert(int n);
int main()
{
int num;
scanf("%d",&num);
if(num<0)
{
putchar('-');
num=-num;
}
convert(num);
}
void convert(int n)
{
int i,j,a[80];
i=0;
while(n!=0)
{
a[i++]=n%10; //逐个提取数字
n=n/10;
}
j=i-1; //跳过结束符,从数字开始输出
while(j>=0)
{
putchar(a[j]+'0');
j=j-1;
}
}
- 功能:将整数转换成字符串
- 优点:没学递归函数用的下面那种写法;学了递归用上面那种写法,可以将多个while循环里面的内容用一个递归函数替换,极大的精简了代码。
- 学到了什么:非递归函数需要用数组逐个封装输入的数字,并且最后输出的时候还需要跳过结束符才能输出,递归函数只需判断提取的数字位数是否为最后一位,是的话停止递归即可输出。求阶乘、函数和积分等数学公式等亦可用递归计算,用for和while循环会比较复杂,且需要考虑到数据类型的范围,否则容易输出超限
四、本周学习总结
1.总结本周学习内容
1.1宏定义
#define 宏名 宏定义字符串
1.2带参数的宏定义
例如
#include<stdio.h>
#define MAX(a,b) a>b? a:b
#define SQR(x) x*x
int main()
{
int x,y;
scanf("%d%d",&x,&y);
x=MAX(x,y);
y=SQR(x);
printf("%d %d\n",x,y);
return 0;
}
Tips:宏替换不做计算,直接替换进去
1.3文件之间的通信
外部变量
extern 变量名表
函数与程序文件模块
extern 函数类型 函数名(参数表说明)
或者
static 函数类型 函数名(参数表说明)
1.4程序文件模块
程序、程序文件模块与函数之间的关系:一个大程序可由几个程序文件模块组成,每一个程序文件模块又可能包含若干个函数。程序文件模块只是函数书写的载体
1.5指针数组
指针数组的概念
类型名 *数组名 [数组长度]
如
int a [10];
char *color [5];
Tips:对指针数组元素的操作与对同类型指针变量的操作相同
1.6二级指针
二级指针的概念
类型名 **变量名
二维数组的指针形式
二级指针 a+i &a[0] &&a[0][0]
一级指针 *(a+i) a[i] &a[i][0]
数组元素 **(a+i) a[1][i] *(a[i]+0)
1.7行指针
int *(变量名)[长度]
2.罗列本周一些错题
题目:合并有序数组
void merge(int* a, int m, int* b, int n)
{
int c[m+n];
int i,j,temp=0,k=m;
for(i=0;i<m;i++)
{
c[i]=a[i];
}
for(j=0;j<n;j++)
{
c[k++]=b[j];
}
for(i=0;i<m+n;i++)
{
for(j=i+1;j<m+n;j++)
{
if(c[i]>c[j])
{
temp=c[i];
c[i]=c[j];
c[j]=temp;
}
}
}
for(i=0;i<m+n;i++)
{
a[i]=c[i];
}
}
void printArray(int* arr, int arr_size)
{
int i;
for(i=0;i<arr_size;i++)
{
printf("%d ",arr[i]);
}
}
考试的时候没时间做,课后用了一种比较笨的方法,新建一个数组放入数组a和数组b的数字,进行有序排序完后,遍历c数组,将c数组的数据放入a数组中输出