C语言第十一次作业--函数嵌套调用
一、实验作业
1.1 PTA题目:递归法对任意10个数据按降序排序
设计思路
定义整型循环变量i,最小值下标min,中间变量t
若n==1,直接返回
否则
min=10-n 最小值下标赋初值
for i= 10-n to 10
若a[i]小于a[min]
交换下标min=i
利用中间变量
t=a[min]
a[min]=a[10-n]
a[10-n]=t
再次进入递归 sort(a,n-1)
代码截图

调试问题

刚开始我判断n时,直接if(n),提交后答案错误,才拿到dev里运行,发现他直接返回了。
这个错误是因为平时flag思维习惯了,认为if(n)等价于if(n==1)。但其实如果n为整型,if(n)判断n是否为0,如果是0执行else后语句,否则执行if后语句。也就是说只要n不为0,就执行if后的语句。所以会直接返回。

1.2 学生成绩管理系统
1.2.1 画函数模块图,简要介绍函数功能

1.2.2 截图展示你的工程文件

1.2.3 函数代码部分截图
本系统代码总行数:222
头文件

主函数

插入学生信息

学生成绩信息代码

删除学生成绩信息代码

总分排序代码

1.2.4 调试结果展示
未添加学生就进行操作的错误指令

主菜单及添加学生信息

输出信息表

修改某位同学某课程的成绩

删除某位同学某个课程的成绩

1.2.5 调试碰到问题及解决办法
- 1.建工程的过程中,错误太多了,但没有记录下来,其中印象最深的是头文件里加不加函数声明,我记得之前没加时它主函数哪里会提醒各种函数没声明的错误,但是刚刚又试了下去掉函数声明,竟然编译通过了,怀疑人生ing。

2.[Linker error] main.o:main.cpp:(.text+0x49): undefined reference to xxxx,我多次出现的这个编译错误特别没水平:是自己的工程没有把所有的相关文件放在一个工程里面,虽然都放在了一个文件夹下,但是是自己强行放在了一起,而不是建工程时一起建的文件夹,后来重新建工程就解决了。
3.还有一个困扰很久的的问题是:头文件里的变量被重复定义,后来问了同学,才搞清楚每个文件里都要加上头文件。还是对于建工程的细节不够明白。
总结:
- 头文件:头文件中不能有可执行代码,也不能有数据的定义,只能有宏、类型(typedef,struct,union,menu,class)数据和函数的声明。
- 头文件加#ifndef #endif可以防止它在同一编译单元被重复引用。
- 全局变量重复定义问题:写程序时,最好不要在头文件中定义全局变量。因为这时该头文件被多个源文件包含时,就会出现重复定义问题。全局变量的定义就应该放 某个源文件中,然后在别的源文件中使用前进行extern声明。
- 在用<>时,编译器查找顺序是:先在系统区域查找,再查找自定义区域。用”“时,编译器查找顺序相反。
二、截图本周题目集的PTA最后排名

三、阅读代码
斐波那契数列
#include <stdio.h>
int fib1(int n)
int fib2(int n);
int main()
{
int n=0;
printf("fibonacci数列下标:\n");
scanf("%d",&n);
printf("第n=%d的数列值是:%d\n",n, fib1(n));
return 0;
}
//非递归
int fib2(int n)
{
int a = 1;
int b = 1;
int c = a = b;
int i = 0;
for (i = 3; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
//递归
int fib1(int n)
{
if (n <= 2)
return 1;
else
return fib1(n - 2) + fib1(n - 1);
}
这道题是之前刚学习函数知识时的一道题,学了递归后就把它用递归思路简化了下。虽然递归思路不太好想,但是它代码更简洁清晰,可读性更好。但是递归它也有缺点:空间消耗要比非递归代码要大很多。所以递归空间和时间消耗都大。
四、本周学习总结
1.介绍本周学习内容
链表相关内容总结:
动态内存的分配:
- malloc函数
void* malloc ( unsigned int size )
char * a;
a=( char *)malloc( 10*( sizeof( char ) );
//申请一块10*( sizeof( char )这么大的动态内存,并返回这块内存的地址。
函数理解:在内存的动态存储区中分配一个长度为size的连续空间,其参数应该是一个无符号整数,返回值是一个系统所分配的,连续内存空间的起始地址。 若分配内存失败,则返回NULL。
PS:该函数仅针对指针使用。
- free函数
void * free( void * p)
char *a,*b;
a=( char *)malloc( 10*( sizeof( char ) );
b=a;
...
free(a);//释放其指向的动态内存
链表:

概念理解:链表这种数据结构是为了实现动态保存一串数据,这里的动态是指不需要预先分配内存空间,而是在需要时动态申请内存。整个数据串保存所需的空间可以根据需要扩大或缩小。它由若干个同一结构类型的“结点”依次串接而成。而且这各个结点在内存中可以使不连续存放的。
PS:数组是线性结构,链表时链性结构。链表的节点结构:

1.数据域:用来存储数据。
2.指针域:存储下一个节点元素的地址 。用链表代替数组的优点:
1.不需要事先定义存储空间大小,可以实现动态分配内存,内存使用效率高。
2.插入删除新结点方便,操作效率高。
1.1易错点
编译预处理不是C语言的一部分,不占运行时间,不要加分号
函数的递归调用一定要记得有结束的条件
static int x;默认值为0。 int x;默认值为不定值
1.2宏定义
无参宏定义 #define 标识符 值 定义后,出现所定义的标识符的地方都 将以定义时指定的值来代替。
带参宏定义 #define 标识符(参数表) 值
#define S(x,y) x*y
int main( )
{
int a=3,b=4,c=5,d=6;
printf("a+b*c+d=%d\n" , S(a+b,c+d));
}
带参宏定义执行时是将a+b这样一个表达式代替x,c+d这样一个表达式代替y,所以S(a+b,c+d)进行的是a+bc+d的运算,而不是将a+b的值给x,c+d的值给y然后再做xy,这跟函数调用传递参数是不一样的。
- 常用预处理指令:
include 包含一个源代码文件
define 定义宏
undef 取消定义宏
if 如果条件为真,则编译下面的代码
endif 结束一个#if...#elif条件编译块
ifdef 如果已经定义了某个宏,则编译下面的代码
ifndef 如果没有定义某个宏,则编译下面的代码
1.3指针数组
- 定义指针数组:类型名 * 变量名[数组长度];
int * p[10];
- 指针数组的数组元素都是指针变量,是用来存放变量的地址的
1.4行指针
- 定义行指针变量: 类型名 (*变量名)[数组长度];
int (*p)[4],a[3][4];
p=a;
此时就可把p当成a来用。
1.5指向指针的指针:
- 定义: 类型名 ** 变量名;
int *p1;
int **p2;
int a=3;
- 指针变量也是一种变量,故在内存中也有对应的一个地址, 而要存放指针变量的地址,就要求助于用来存放指针变量的地址的指针变量
2.学习体会
本周两项内容:递归和大程序。个人觉得递归是比大程序难,递归很难想出来,可能因为刚刚开始接触,思路也很有局限性。而大程序相比来说难在怎样将项目建好以及项目中各个文件的关系处理,而函数内容难度不大。课上在项目文件关系这点上没听透彻,回来再做时出现了很多错误,建项目花费了很长的时间。而且很多次都是编译通不过,错误多道程序崩溃。只能将代码搬到新项目里再试。很费精力。
C语言第十一次作业--函数嵌套调用的更多相关文章
- C语言第十一次博客作业---函数嵌套调用
一.实验作业 1.1 PTA题目 题目:递归实现顺序输出整数 1. 本题PTA提交列表 2. 设计思路 printdigits函数 定义整型变量result存放结果 if n是10的倍数 result ...
- C语言博客作业--函数嵌套调用
一.实验作业(6分) 本周作业要求: 选一题PTA题目介绍. 学习工程文件应用,设计实现学生成绩管理系统. 学生成绩管理系统要求 设计一个菜单驱动的学生成绩管理程序,管理n个学生m门考试科目成绩,实现 ...
- C语言博客作业—函数嵌套调用
一.实验作业 1.1 PTA题目:递归法对任意10个数据按降序排序 1.1.1设计思路 void sort(int a[],int n) { 定义整型循环变量i,中间变量temp,最小值min: 令m ...
- Swift2.0语言教程之函数嵌套调用形式
Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还能够调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其它函数:还 ...
- 网络1911、1912 C语言第4次作业--函数批改总结
目录 网络1911.1912 C语言第4次作业--函数批改总结 一.评分规则 二.本次作业亮点 三.本次作业存在的问题 四.助教有话说 五.得分详情 网络1911.1912 C语言第4次作业--函数批 ...
- C语言第五次作业函数
一.PTA实验作业 题目1: 6-6 使用函数输出水仙花数 1.本题PTA提交列表 2.设计思路 1.narcissistic函数 1.由于number的值后面会变化,所以定义d,e用于储存numbe ...
- C语言第十一周作业
这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/ ...
- day11(函数参数,函数对象,打散机制,函数嵌套调用)
一,复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发 ...
- C语言学习<输入输出函数,函数的调用>
#include <stdio.h> /* 输入输出函数的学习 函数的调用 2017.05.25 soulsjie */ //输入连个数字求最大值 void main(){ int Max ...
随机推荐
- Java版2048
功能要求:2048的基本界面,能够实现2048的游戏功能. 总思路:两个类:Game和GameListener. Game负责界面的实现和paint方法的重写 GameListener负责实现键盘和鼠 ...
- C#的发展历程第五 - C# 7开始进入快速迭代道路
C# 7开始,C#加快了迭代速度,多方面的打磨让C#在易用性,效率等各方面都向完美靠近.另外得益于开源,社区对C#的进步也做了很大共享.下面带领大家看看C# 7的新特性.其中一部分是博主已经使用过,没 ...
- python环境jieba分词的安装
我的python环境是Anaconda3安装的,由于项目需要用到分词,使用jieba分词库,在此总结一下安装方法. 安装说明======= 代码对 Python 2/3 均兼容 * 全自动安装:`ea ...
- Google Interview University 一套完整的学习手册帮助自己准备 Google 的面试
https://github.com/jwasham/google-interview-university/blob/master/README-cn.md
- 问题解决了,可是为什么呢?could not find the main class.program will exitmain
今天重新学习socket编写简单的在线聊天,简单功能实现的情况下,一时心血来潮便想要把这程序打成可执行的jar包,以便于在桌面直接双击运行. 参照自己之前写的那篇<>打好两个jar包以后却 ...
- CAN总线基础知识(一)
1.CAN总线是什么? CAN(Controller Area Network)是ISO国际标准化的串行通信协议.广泛应用于汽车.船舶等.具有已经被大家认可的高性能和可靠性. CAN控制器通过组成总线 ...
- c# 处理空白字符,空白字符是指在屏幕不会显示出来的字符
空白字符是指在屏幕不会显示出来的字符(如空格,制表符tab,回车换行等).空格.制表符.换行符.回车.换页垂直制表符和换行符称为 "空白字符",因为它们为与间距单词和行在打印的页 ...
- 数据分析神器Colab的初探
为什么要使用Colab 使用过Jupyter(参看<「极客时间」带来的社区价值思考>章节:社区交流的基建设施)的朋友,一定会醉心于它干净简洁的设计,以及在"摆脱Python命令行 ...
- 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)
洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...
- 【BZOJ1030】文本生成器(AC自动机,动态规划)
[BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...