C语言博客作业--函数嵌套调用
一、实验作业
1.1 PTA题目
设计思路
使用递归思想解题
考虑输入n的多种情况
n==1 输出1
n==0 输出0
否则
递归:n/2
取余输出
end for
代码截图
调试问题
- 部分正确,关于二进制转换不熟悉,根据提交提示【输出全是1】和【输出只有最高位是1】修改;
- 答案错误,递归使用出错,修改后输出进制不正确;
- 开始重新定义了一个变量,想法出错,递归思想解决就好;
1.2 学生成绩管理系统
1.2.1 画函数模块图,简要介绍函数功能
1.2.2 截图展示你的工程文件
1.2.3 函数代码部分截图
本系统代码总行数:286
1.2.4 调试结果展示
- 程序结果只能实现部分要求,还在继续修改成绩排序问题;
- 修改:
- 删除:
- 查找:
1.2.5 调试碰到问题及解决办法
- 调用函数时函数出错,各个函数间的联系不能使程序通过,改变形参及相应实参;
- 输入的数字指令与显示出来的不同,因为在指令后没有调用相应函数;
- 还有部分要求的结果不能符合要求,继续改进;
二、截图本周题目集的PTA最后排名
三、阅读代码
递归代码:
/* 递归输出循环数,比如输出一组数为:1234,2341,3412,4123*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define m 30//便于修改数据 ,自定义
char s[m];//定义字符数组存放输入字符串
void Input()//输入函数
{
puts("Please input one String!");
scanf("%s",s);
}
void XunHuan(char *s,int count)
{
if(count==strlen(s)-1) return;//递归出口
else
XunHuan(s,count+1);//再次调用
char ch=s[0];//将第一个字符用ch保存
for(int i=0;i<strlen(s)-1;i++)//按规律输出各数
s[i]=s[i+1];//将后一个覆盖第一个,即往前移
s[strlen(s)-1]=ch;//将最后一个字符与第一个交换,形成第一个不同的数
puts(s);//输出
}
int main()//主函数调用
{
Input();
XunHuan(s,0);
return 0;
}
输出示例:
小评:使用库函数求字符串长度,运用define宏定义,便于修改数据,提高代码的高效、多次使用的便利性;还有利用函数来实现,便于分层设计、降低耦合度以及使接口与实现分开,便于后期的修改,也能使思路较为清晰,读来比较有逻辑性,应该多学习和多用函数来解决问题;这道题是实现循环数输出,一开始自己想是没有思路的,但去阅读代码后发现就是利用了之前有使用的循环移动,不断把第一个数移到最后,每次都输出,即会出现一个数的多种排序方法,可以多学到一种利用递归来实现之前的循环移动思想,挺好的;
多找代码:
/*输出蛇形矩阵*/
/*memset() 函数常用于内存空间初始化,它是对较大的结构体或数组进行清零操作的一种最快方法*/
#include<stdio.h>
#include<string.h>
#define m 10//可以修改 ,调整蛇形大小,如改为 100,即可输入100内的数
int main()
{
int a[m][m];//定义矩阵大小
int n,x=0,y=0,num;//x、y分别指行、列必须初始化0,否则程序无法执行,因为可能数据过大,num用于测看矩阵
while(scanf("%d",&n)){//不等于-1,保证输入有效,即恒真
memset(a,0,sizeof(a));//对结构体数组a清零
num=a[0][0]=1;//保证初始值正确
while(num<n*n){//保证在要求内矩阵为真
while(x+1<n&&!a[x+1][y])//按规律进行编写
a[++x][y]=++num;
while(y-1>=0&&!a[x][y-1])
a[x][--y]=++num;
while(x-1>=0&&!a[x-1][y])
a[--x][y]=++num;
while(y+1<n&&!a[x][y+1])
a[x][++y]=++num;
}
for(x=0;x<n;x++){//输出蛇形矩阵
for(y=0;y<n;y++){
printf("%2d ",a[x][y]);
}
printf("\n");//用于在恰当的个数换行,实现矩阵的输出
}
}
return 0;
}
输出示例:
四、本周学习总结
1、介绍本周学习内容
- 学习结构化程序设计方法:“自顶向下,逐步求精,函数实现”。对于程序量大的代码,利用主函数进行分开,逐级分配,例如,调用某个函数,在输入不同命令数字时执行不同的功能,这样子不仅简化了主函数,而且相对来说,程序更有逻辑,很清晰,便于后期维护;
- 递归程序设计。抓住两个关键点:递归出口,即递归的结束条件,到何时不再递归调用下去;递归式子,即递归的表达式;递归函数给出的是执行规律,计算机课自行计算,不需纠结于如何得出;
- 宏基本定义,格式:#define 宏名 宏定义字符串。通过宏增加了程序的可读性、灵活性,【注意】宏里的内容是原样替换;
- 一些基本的标准头文件以及编译预处理:文件包括(#include)、宏定义(#define)、条件编译;
- 大程序构成,练习写系统。例如:学生管理系统;
2、学习体会
- 本周进行了指针的上机考试,但是结果一样不好,对指针这章的学习没有很好的掌握,利用指针返回时也不知道怎么返回,需要另花时间好好复习;
- 随着对C的往后学习,发现落下的东西越来越多,很多知识点没有理解透,学期接近尾声,慢慢的各科都要开始期末考试,所以发现课堂上的效率很重要,课前预习跟没预习差很多,平时还是要注意对细节的把握;