一、实验作业

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数组中输出

 posted on 2017-12-31 21:25  Ljy1999  阅读(281)  评论(1编辑  收藏  举报