C语言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)

代码截图

C语言 1

调节问题

C语言 2

恰恰开头自我断定n时,直接if(n),提交后答案错误,才将到dev里运行,发现他直接返回了。
其一错误是坐平时flag思维习惯了,认为if(n)齐名于if(n==1)。但实则只要n为整型,if(n)判断n是否为0,如果是0执行else后报句,否则执行if后言语。也就是说要n不为0,就实施if后底话语。所以会见直接回。

C语言 3

1.2 学生成绩管理网

1.2.1 画函数模块图,简要介绍函数功能

C语言 4

1.2.2 截图显示你的工程文件

C语言 5

1.2.3 函数代码有截图

据系统代码总行多次:222

  • 头文件
    C语言 6

  • 主函数
    C语言 7

  • 栽学生信息
    C语言 8

  • 学生成信息代码
    C语言 9

  • 剔除学生成绩信息代码
    C语言 10

  • 总分排序代码
    C语言 11

1.2.4 调试结果显示

莫补加学生就开展操作的谬误指令

C语言 12

主菜单与添加学生信息

C语言 13

输出信息表

C语言 14

改某位同学有课程的成就

C语言 15

去除某位同学有学科的成

C语言 16

1.2.5 调试碰到问题及解决办法

  • 1.建工的过程中,错误太多了,但从没记录下来,其中印象太要命的凡头文件里加不加函数扬言,我记忆之前从没加时它主函数哪里会唤醒各种函数没声明的错,但是刚刚又尝试了下掉函数扬言,竟然编译通过了,怀疑人生ing。

C语言 17

  • 2.[Linker error] main.o:main.cpp:(.text+0x49): undefined reference
    to
    xxxx,我数油然而生的此编译错误特别没品位:是好之工没有管所有的连锁文件在一个工中,虽然都居了一个文件夹下,但是是祥和强行在了合伙,而休是盖工程时一致打建之文件夹,后来再度建工程就迎刃而解了。

  • 3.还有一个麻烦很悠久的底问题是:头文件里之变量被另行定义,后来提问了同桌,才为懂每个文件里还如增长头文件。还是对构筑工程的底细无足够清楚。

总结:

  • 头文件:头文件被无可知生出可尽代码,也无能够生数量的概念,只能有庞、类型(typedef,struct,union,menu,class)数据和函数的宣示。
  • 头文件加#ifndef #endif可以防它们以同一编译单元被另行引用。
  • 全局变量重复定义问题:写序时,最好不用当头文件被定义全局变量。因为这时候该头文件为多独自文件包含时,就会见起还定义问题。全局变量的定义就是当放
    某个源文件中,然后在别的源文件中行使前进行extern声明。
  • 当就此<>时,编译器查找顺序是:先以系区域搜索,再找打定义区域。用”“时,编译器查找顺序相反。

其次、截图本周题目集的PTA最后排名

C语言 18

其三、阅读代码

斐波那么契数列

#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);//释放其指向的动态内存

链表:

C语言 19

  • 概念理解:链表这种数量结构是为实现动态保存一失误数据,这里的动态是依靠未待事先分配内存空间,而是在待时动态申请内存。整个数据出错保存所急需的半空中可以根据需要扩大或缩小。它由几个一律结构类型的“结点”依次串接而变成。而且这各个结点在内存中可要不总是存放的。
    PS:数组是线性结构,链表时链性结构。

  • 链表的节点结构:
    C语言 20
    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.读书体会

本周简单宗内容:递归和大程序。个人认为递归是较死程序难,递归很为难想出来,可能以刚刚开始接触,思路为颇有局限性。而雅程序相比来说难在怎样将品种建筑好和项目面临相继文件的干处理,而函数内容难度不充分。课上当类型文件涉及这点达到从未有过听透彻,回来再做时出现了许多错误,建类费了老丰富的辰。而且充分频繁且是编译通不了,错误多志程序崩溃。只能用代码搬至新路里更尝试。很费精力。