🌞欢迎来到机器学习的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于练气阶段,希望各位仙友顺利完成突破
📆首发时间:🌹2021年3月12日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目的:减少代码量,便于编程和调试。
比如:计算5!+8!+7!+10!的值,并输出结果。
#includeint fac(int n) { int i;int fac=1;for(i=1;i<=n;i++)fac=fac*i;return fac; } int main(void) {int n;int sum;sum=fac(1)+fac(2)+fac(3);printf("sum=%d",sum);return 0; } 调用函数的过程:
#includeint max(int x,int y) {return x>y?x:y; //条件表达式求出x和y的最大值,用return 返回。 } int main(void) {int a,b,c;a=max(10,20); //调用函数max,10、20为实参。b=max(15,19); //再次调用函数max,15、19为实参。c=max(a,b); //再次调用函数max,a、b为实参。printf("%d\n",c); return 0; } 令y=a*a+b*b,a和b是变量,定义一个函数,根据不同的a、b值计算y的值,并在main函数中输入两个值,调用该函数,输出计算的结果。
#includeint yum(int x,int y) {return x*x+y*y; //条件表达式求出x和y的最大值,用return 返回。 } int main(void) {int y;int a,b,c;printf("请输入a和b的值:\n");scanf("%d%d",&a,&b);c=yum(a,b); //再次调用函数max,a、b为实参。printf("y=%d\n",c); return 0; }
数组作为函数参数传参
1.计算字符数组中字符串的长度
#include/*注意形参的形式,加[],表明mystr是一个存放地址的变量,这个地址所在空间存放的是char型的数据*/ int MyStrlen(char mystr[]) {int len=0; //len存放字符串的长度。for(len=0; mystr[len]!='\0';len++); //用循环求串长,注意最后是空语句。return len; } int main(void) { char str[100]; gets(str); printf("%d\n",MyStrlen(str)); //实参str的值所在地址存放char型数据。 return 0; } 2.使得调用函数exchange后能把main函数中的两个数互换。
#include/*注意形参的形式,加[],表明mystr是一个存放地址的变量,这个地址所在空间存放的是char型的数据*/ int exchange(int a[],int b[]) {int temp;temp=a[0];a[0]=b[0];b[0]=temp; } int main(void) { int a=1; int b=2; printf("---调换前a,b的值:%d %d---\n",a,b); exchange(&a,&b); printf("---调换前a,b的值:%d %d---\n",a,b); return 0; } 3.写一个函数,用于对main函数中的元素类型为int型的一维数组进行排序,然后在main函数中进行调用,并输出排序后的数组各元素值。
#include/*注意形参的形式,加[],表明mystr是一个存放地址的变量,这个地址所在空间存放的是char型的数据*/ int sort(int a[],int len) {int i,j,temp;for(i=0;i a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}} } int main(void) {int arr[10]={45,65,34,35,25,39,54,59,16,48};int i;sort(arr,10);printf("---原来的数组---\n"); for(i=0;i<10;i++)printf("%d ",arr[i]);putchar('\n');printf("---排序后的数组---\n"); for(i=0;i<10;i++)printf("%d ",arr[i]);return 0; }
二维数组作为函数参数
1.定义一个函数,功能是计算一个4*3的二维矩阵中所有数据的和,并在main函数中调用,假设这个矩阵中的数据都是int型。
#includeint sum(int a[][3],int r,int l) {int i,j;int sum;for(i=0;i
2.主调函数中定义有二维数组char str[5][10]; 看一下左边的实参数据类型和右边的形参数据类型是否一致?可作练习题思考。
- str char ch[][10](元素类型是由10个char类型数据组成的一维数组类型)
- &str[0][0] char ch[](元素类型是char类型)
- str[1] char ch[](元素类型是char类型)
- str char ch(不是,ch的元素类型是char类型)
- str[0] char ch[](元素类型是char类型)
- str[0][0] char ch(元素类型是char类型)
- str char ch[][8](不是)
函数的嵌套调用
1.用函数的嵌套调用实现求四个值中的最大值。
#includeint max1(int a,int b) {return a>b?a:b; } int max2(int a,int b,int c,int d) {int m;m=max1(a,b);m=max1(m,c);m=max1(m,d);return m; } int main() {int ma;ma=max2(1,2,3,4);printf("四个数中最大的值:%d",ma); return 0; }
2.两个班的成绩数据以两个一维数组形式存放。编程计算两个班的平均成绩。
#includefloat avgScore(float a[],int b) { float sum=0,avg=0;int i;for(i=0;i 函数的递归调用
(1)划分子问题(解决的方法是一样的)
(2)解决子问题
(3)基础解
1.定义一个递归函数,返回n!的值。
#includeint fac(int n) { if(1==n)return 1;//基础解 fac1=fac(n-1);//划分子问题 if(n!=1)return fac1*n;//用子问题解决主问题 } int main() {int n=4;printf("n阶乘的值是:%d\n", fac(n)); return 0; }
2.一个递归函数,求一个int型一维数组中元素的最大值。
#includeint ArrayMax(int a[],int N)//求数组a中前N个元素的最大值 {int max;if (1==N) return a[0]; //基础解 max=ArrayMax(a,N-1);//划分子问题 if(max>a[N-1]) //在子问题解决的基础之上解决总问题。return max;else return a[N-1]; } int main() {int a[4]={1,2,3,4};printf("数组中的最大值是:%d\n", ArrayMax(a,4)); return 0; } 3.
#includeint add(int n) { int add1;if(1==n)return 1;//基础解 add1=add(n-1);//划分子问题 if(n!=1)return add1+n;//用子问题解决主问题 } int main() {int n=4;printf("前四项的和:%d\n", add(n)); return 0; } 3.Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A,B,C。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子借助B座从A座移都到C座,但规定每次只允许移动一个盘,且在移动过程中3个座上都始终保持大盘在下,小盘在上。要求编程输出移动盘子的过程。如图7-9所示为Hanoi塔示意图。
#include//外部变量 int a=0; //主函数 int main(){void hanoi(int i,char one,char two,char three);int n;printf("请输入盘子数:");scanf("%d",&n);hanoi(n,'A','B','C');printf("共需要%d步",a);return 0; }//递归加嵌套函数 void hanoi(int i,char one,char two,char three){void move(int x,int y);if(i==1)move(one,three);if(i!=1){hanoi(i-1,one,three,two);move(one,three);hanoi(i-1,two,one,three); } }//步骤和步数 void move(int x,int y){a++;printf("%c-->%c\n",x,y);}