- 函数嵌套:
#include <stdio.h> //函数嵌套:例:输入四数,函数方式输出最大值 int GetMaxFromFour(int a,int b,int c,int d); //Four函数在main函数里调用且放置在main后面,因此要原型声明 int main() { int data1; int data2; int data3; int data4; int max; puts("请输入四个数:"); scanf("%d%d%d%d",&data1,&data2,&data3,&data4); max = GetMaxFromFour(data1,data2,data3,data4); // max = GetMaxFromFour(a,b,c,d); //不可以用abcd调用,因为在主函数中定义的为data,只识别data printf("最大值为:%d\n",max); return 0; } int GetMaxFromTwo(int a,int b); //同样,Two在Four里调用,因此放在Four后面时要在Four前面进行原型声明 //但只在调用它的函数前声明,因此main函数前不用声明,因为不调用它 int GetMaxFromFour(int a,int b,int c,int d) { int max; max = GetMaxFromTwo(a,b); //需要使用哪些值比较就在变量里写哪些 max = GetMaxFromTwo(max,c); //这里调用时是将ab比较后取的较大值即max与c调用 max = GetMaxFromTwo(max,d); return max; } int GetMaxFromTwo(int a,int b) //都是通过调用GetMaxFromTwo来比较,括号里为变量部分, //是否为同一函数与变量无关,因此该调用函数只写一次 { int max; max = a>b?a:b; return max; }
D:\C语言\第五章>gcc test_qiantao.c D:\C语言\第五章>a.exe 请输入四个数: 99 198 6 -5 最大值为:198
- 递归函数:
#include <stdio.h> //递归:例:第1个学生10岁,第2个比第1个大两岁,第3个比第2个大两岁, // 第4个比第3个大两岁,以此类推,求任意一个学生多少岁? int GetAge(int num) //age1不可以定义在这里,main函数与这里的参数名可不同,但个数要相同 { int age1; if(num==1) { age1=10; } else { age1 = GetAge(num-1)+2; //这里利用GetAge函数完成循环 } return age1; } int main() { int num; int age; puts("请问你要知道第几个学生的年龄:"); scanf("%d",&num); age = GetAge(num); //将num值传到GetAge的num里,再将计算出的age1的值传到这里的age里 printf("第%d个学生的年龄为:%d\n",num,age); return 0; }
D:\C语言\第五章>gcc test_digui.c D:\C语言\第五章>a.exe 请问你要知道第几个学生的年龄: 1 第1个学生的年龄为:10 D:\C语言\第五章>a.exe 请问你要知道第几个学生的年龄: 6 第6个学生的年龄为:20
- 阶乘案例:
#include <stdio.h> //例:求阶乘 int GetNum(int num) { int number; number = num; //将number初值设置为输入的数字,采用递减法相乘 /*方法一: while(num>1) { number = number*(num-1); //不可以用num*(num-1),因为是用乘积乘以逐渐减小的值 num--; } */ //方法二:递归 if(num>1) { number = number*GetNum(num-1); //上面给number赋值不影响第2次及以后循环里的number值 } //因为if外的程序只走一遍,循环GetNum(num-1)时就等于54321这几个数字 return number; } int main() { int num; int number; puts("请输入你要求阶乘的数字:"); scanf("%d",&num); number = GetNum(num); printf("%d的阶乘为:%d\n",num,number); return 0; }
D:\C语言\第五章>gcc test_jiecheng.c D:\C语言\第五章>a.exe 请输入你要求阶乘的数字: 4 4的阶乘为:24 D:\C语言\第五章>a.exe 请输入你要求阶乘的数字: 2 2的阶乘为:2 D:\C语言\第五章>a.exe 请输入你要求阶乘的数字: 1 1的阶乘为:1
- 数组和函数:
#include <stdio.h> /* 知识点:1.利用函数调用数组 2.形参无数组概念,仅传递数组首地址 */ void printData(int data) //该函数输出的为数组的某一个值 { printf("array[4]的值为:%d\n",data); //printf("array[4]的值为:%d\n\n",data); //\n可在同一语句中连续或分开部分使用,例:\n\n } void printArray(int array[4],int len) //该函数输出的为数组的所有值 { //形参中不存在数组的概念,即使[]中约定了数组大小也无效,传递的仅为一个地址,为数组的首地址, //在操作系统中用32位即8字节表示一个地址,因此被调函数中array大小与数组大小无关,只会输出8(第16行) int i; // printf("Array函数中:array的大小为 %d\n\n",sizeof(array)); //这里输出不论数组为多少,只会输出数组首地址长度:8 printf("array的所有值为:"); for(i=0;i<len;i++) { printf("%d ",array[i]); } putchar('\n'); //用于将数组数字输出后换行用 } int main() { int len; //使用len在于当数组发生改变时,不用修改printArray函数,for里已经用len表示,而len是根据计算自动改变的 int array[5]={1,2,3,4,5}; //若被调函数无返回值(void),则main函数里不用定义变量来用于返回输出,被调函数前也不用写等号和变量 printData(array[4]); //数组后[]内有数字代表传递的为某项的一个数值 len = sizeof(array)/sizeof(array[0]); printf("main函数中:array的大小为 %d\n",sizeof(array)); //sizeof表示长度,一个整型数4字节 printArray(array,len); //数组后面不写任何内容,代表传递的为整个数组,也是整个数组的首地址 //printArray(&array[0],len); //第一个元素的地址业代表数组的首地址,两种书写方式均可 return 0; }
D:\C语言\第五章>gcc test_array_void.c D:\C语言\第五章>a.exe array[4]的值为:5 main函数中:array的大小为 20 array的所有值为:1 2 3 4 5
- 函数调用值和调用地址:
#include <stdio.h> /* 知识点:函数调用时传递数值与传递数组的区别,即传递数值和传递地址 */ void changeData1(int data1) { data1 = data1+100; printf("changedata1 = %d, address: %p\n",data1,&data1); }//Data1函数传递的仅为值,Data1函数和main函数地址空间不同,因此改变Data1函数中的值时main函数不会改变 //和Data2函数区别在于Data2是传递地址,所以Data2和main函数里同一项的地址是相同的,因此main函数值也会变 void changeData2(int data[]) //调用数组时被调函数数组名后必须有[],[]内数字可写可不写 { data[1] = data[1]+100; printf("changedata2 = %d, address: %p\n",data[1],&data[1]); } //形参无数组概念,在Data2函数中调用的是main函数的地址,因此改变Data2函数中的值时main函数值也会改变 //相当于改变Data2函数中值时直接访问到main函数中操作,因为Data2函数地址与main函数中对应地址相同 int main() { int data1=10; int data[2]={11,22}; //第一个void: changeData1(data1); printf("data1 = %d, address: %p\n\n",data1,&data1); //第二个void: changeData2(data); //传递整个数组时main函数里只写数组名,[]和数字都不可以写 printf("data[1] = %d, address: %p\n",data[1],&data[1]); return 0; }
D:\C语言\第五章>gcc test_array_address.c D:\C语言\第五章>a.exe changedata1 = 110, address: 000000000061FDF0 data1 = 10, address: 000000000061FE1C changedata2 = 122, address: 000000000061FE18 data[1] = 122, address: 000000000061FE18
- 练习:利用数组计算不同班级学生平均分
#include <stdio.h> //例:有两个班的同学,分别为4人和5人,分别求这两个班平均分 void GetArray(int array[],int len) //用于录入成绩 { int i; for(i=0;i<len;i++) { printf("请输入第%d个学生的成绩:",i+1); scanf("%d",&array[i]); } puts("成绩输入结束\n"); } void printArray(int array[],int len) //用于输出总人数并打印各个成绩 { int i; printf("输入总人数为:%d\n",len); for(i=0;i<len;i++) { printf("%d ",array[i]); } puts("\n 成绩录入完成 \n"); } float GetAverage(int array[],int len) //用于计算平均分并传回main函数 { int i; int sum=0; float average=0.0; for(i=0;i<len;i++) { sum+=array[i]; //等同于sum=sum+array[i]; } average = (float)sum/len; //将sum转换为浮点型 return average; } int main() { int array1[4]; int array2[5]; float average1; float average2; int len1 = sizeof(array1)/sizeof(array1[0]); int len2 = sizeof(array2)/sizeof(array2[0]); //在不同项里,针对同一计算方法的函数,可只写一次,只需将参数变量变换即可,如下 GetArray(array1,len1); GetArray(array2,len2); //array1和array2都使用GetArray函数录入成绩,因此只需将()内变量变换即可 printArray(array1,len1);//但是变量不同,要将所有变量都定义出来(例:len1、len2),后面函数也一样 printArray(array2,len2); average1 = GetAverage(array1,len1); average2 = GetAverage(array2,len2); printf("一班的平均分为:%f\n",average1); printf("二班的平均分为:%f\n",average2); return 0; }
D:\C语言\第五章>gcc ex5_array.c D:\C语言\第五章>a.exe 请输入第1个学生的成绩:89 请输入第2个学生的成绩:88 请输入第3个学生的成绩:87 请输入第4个学生的成绩:86 成绩输入结束 请输入第1个学生的成绩:81 请输入第2个学生的成绩:82 请输入第3个学生的成绩:83 请输入第4个学生的成绩:84 请输入第5个学生的成绩:85 成绩输入结束 输入总人数为:4 89 88 87 86 成绩录入完成 输入总人数为:5 81 82 83 84 85 成绩录入完成 一班的平均分为:87.500000 二班的平均分为:83.000000
C:5.8-5.14 函数嵌套、递归、阶乘、调用数组、地址传递、计算平均分
于 2022-08-28 23:42:12 首次发布