提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
C语言高级部分学习总结
之前总结记录了我学习C语言基础部分的内容,后面开始记录c高级部分的学习内容
提示:以下是本篇文章正文内容,下面案例可供参考
一、模块化程序设计
一个C语言程序可以由一个主函数和若干其他函数构成,每个函数实现一个特定的功能。主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被多个函数调用多次。
函数的声明
把有关函数的信息(函数名、函数类型、函数参数的个数和类型)告诉编译器。
函数的定义
C语言要求,在程序中用到的所有函数,必须先定义,后使用,如果想要实现某个函数的功能,必须先规范对他的定义,指定它的名字、函数返回类型、函数实现的功能以及参数的个数和类型,将这些信息通知给编译系统。这样程序执行函数时,编译系统就会按照定义所指定的功能去执行,如果事先不定义,编译系统是无从知晓函数是什么,实现是呢嘛功能的,
对于C编译系统提供的库函数,是由编译系统事先定义好的,库函数中包含了各函数的定义。程序设计者不必自己定义,只需要把对应的头文件包含到文本中即可。
库函数只提供看最基础、最通用的一些函数,而不可能包括人们在实际应用中所学到的所有函数。往往需要自己定义想要用的函数。
定义无参函数
类型名 函数名(){
函数体
}
void printstar(){
return;
}
类型名表示的是返回值类型,函数没有返回值所以定义为void.
定义有参函数
类型名 函数名 (形式参数列表){
函数体
}
实参:实际参数,指的是在调用函数时传入的值。
形参:不是实际存在的参数,虚拟变量;就是一个名字,不占用内存空间。
在调用函数的时候传递的实参个数一定要和形参个数保持一致。
例题:求出两个数的最大值。
函数的调用
当调用一个函数时,程序将暂时停止执行当前函数,转而执行被调用的函数。被调用的函数执行完毕后,程序返回到调用函数的位置,继续执行。
函数可以在其他函数内部调用,也可以在同一个函数内部调用自己。这被称为递归调用。递归调用可以用于解决一些问题,如计算阶乘、计算斐波那契数列等。
在函数调用时,可以传递参数给函数。函数内部可以使用传递进来的参数进行计算或操作,并可以返回一个值。函数的返回值类型在函数声明时通过返回类型指定。如果函数不需要返回值,可以使用void作为返回类型。
函数的调用可以通过函数指针实现。函数指针是指向函数的指针变量,可以像调用函数一样通过函数指针来调用函数。函数指针的声明和使用类似于指向其他类型的指针。
函数的调用可以根据不同的需求进行不同的调用方式,如调用内置函数、调用库函数、调用自定义函数等。调用函数有助于提高代码的模块化和可重用性。
函数的参数:
如果函数要使用参数,则必须声明接受参数的变量。这些变量称为函数的形式参数。形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。当调用函数时,有两种像函数传递参数的方式:
传值调用:把参数的实际值复制给函数的形式参数,这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用:通过指针传递的方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行操作。
二、函数的嵌套使用
c语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能定义另一个函数,也就是不能嵌套定义,但是可以嵌套调用函数,也就是说,在调用一个函数的过程中,又可以调用另一个函数。
函数的嵌套使用是指在一个函数内部定义和调用其他函数。通过函数的嵌套使用,我们可以将一个复杂的问题拆分成多个小的子问题,并用不同的函数来解决这些子问题。这有助于提高代码的可读性和可维护性。
函数的嵌套使用可以更深入地嵌套,形成多层的嵌套结构,以解决更复杂的问题。在实际应用中,我们应该根据具体的需求和代码逻辑来合理地设计和使用函数的嵌套。
例题:输入四个整数,找出其中最大的整数
二、函数的递归调用
递归调用
在调用一个函数的过程中又出现直接或者间接的调用该函数本身,称为函数的递归调用。
上面这种情况是不被允许的,而是应该出现有限次的、有终止的递归调用。
即:递归函数的两个要素
1、递归表达式
2、递归出口
题目:递归输出一个整数的逆序
3 void fun(int a);
4 int main()
5 {
6 int a;
7 scanf("%d",&a);
8 fun(a);
9 return 0;
10 }
11 void fun(int x)
12 {
13 int y;
14
15 printf("%d",x%10);
16 x=x/10;
17 if(x>0){
18 fun(x);
19 }
20 return;
21 }
例题:斐波那契数列
F (0)=0,F (1)=1, F (n)=F (n - 1)+F (n - 2)(n ≥ 2,n ∈ N*)
0、1、1、2、3、5、8、13、21、34、、、、、、、、、、
题目:5、8、13、21、34、、、、、、、、、,求F(3)
1 #include <stdio.h>
2
3 int fun(int x);
4 int main()
5 {
6
7 int a=3,f;
8 // scanf("%d",&a);
9 f=fun(a);
10 printf("%d\n",f);
11 return 0;
12 }
13 int fun(int x)
14 {
15 int f;
16 if(x==0){
17 return 5;
18 }
19 if(x==1){
20 return 8;
21 }
22 f=fun(x-1)+fun(x-2);
23 return f;
24 }
什么时候用递归:
1、一个问题可以分解成相同解决思路的子问题,即调用同一个函数
2、终止条件
怎么用递归:
1、定义一个明确功能的函数,问题和子问题之间的规律
2、递推公式
3、递推公式用代码表达出来
三、数组与函数
数组元素可以作为函数实参,不能作为函数形参。因为形参是在函数被调用时临时分配的存储单元,不可能作为一个数组元素单独分配存储单元。
在用数组元素作为函数实参时,把实参的值传给形参,是值传递的方式。
例题:输入10个数,要求输出其中值最大的元素和该数是第几个数;
1 #include <stdio.h>
2
3
4 int fun(int x,int y);
5 int main()
6 {
7 int a[100],k,max,i;
8 for(i=0;i<10;i++){
9 scanf("%d",&a[i]);
10 }
11 for(i=0,max=a[0];i<10;i++){
12 if(fun(max,a[i])>max){
13 max=a[i];
14 k=i;
15 }
16 }
17 printf("%d %d",max,k);
18 return 0;
19 }
20 int fun(int x,int y)
21 {
22 return x>y?x:y;
23 }
数组名作为函数参数
除了可以用数组元素作为函数的参数外,还可以用数组名做函数参数(包括实参和形参)。
用数组元素作为实参时,向形参变量传递的是数组所对应数组元素的值,而用数组名作为函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
例题:
有一个一维数组 score,内放10个学生的成绩,求平均成绩
1 #include <stdio.h>
2
3
4 int fun(int a[],int x);
5 int main()
6 {
7
8 int score[10]={80,80,80,80,80,90,90,90,90,90};
9 int ave;
10 ave=fun(score,10);
11 printf("%d ",ave);
12 return 0;
13 }
14 int fun(int a[],int x)
15 {
16 int sum=0;
17 for(int i=0;i<x;i++){
18 sum=sum+a[i];
19 }
20 return sum/x;
21 }
总结
c语言模块化程序设计的方法,可以通过将程序划分为多个独立的模块或函数,每个模块负责完成特定的功能。这种方法有助于提高代码的重用性、可维护性和可测试性。