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的往后学习,发现落下的东西越来越多,很多知识点没有理解透,学期接近尾声,慢慢的各科都要开始期末考试,所以发现课堂上的效率很重要,课前预习跟没预习差很多,平时还是要注意对细节的把握;
posted @ 2018-01-01 21:49  榕破  阅读(639)  评论(1编辑  收藏  举报