c语言基础知识5

一、函数三要素

先定义后使用

三要素:函数名、参数列表、返回值

二、函数的封装和调用

1、定义一个无参数函数

#include
void printWelcome()
{printf("====================\n");printf("欢迎来到我的程序,baby\n");printf("====================\n");
}
int main()
{printfWelcome();return 0;
}

2、定义有参数有返回值的函数

#include
int getDataFromX(int x)
int main()
{int x,y;puts("请输入一个数:");scanf("%d",&x);y = getDataFromX(x);printf("x=%d,y=%d\n",x,y);return 0;
}
int getDataFromX(int x)//形式参数,需要包含变量类型,变量名
{return x-1;
}
#include
//三要素:返回值,列表参数,功能
int add(int data1,int data2)
int main()
{int x,y,z;puts("请输入一个数:");scanf("%d",&x);puts("请再输入一个数:");scanf("%d",&y);z = add(x,y);printf("%d+%d=%d",x,y,z);return 0;
}
int add(int data1,int data2)//函数原理
{int ret;ret = data1+data2;return ret;
}

3、函数的调用

常犯错误:int add(2,3)(带了返回值的类型) add(int a,int b)(形参带类型了)

见怪不怪:函数可以当作表达式(用的是它的返回值)

                 函数调用当做其他函数调用的参数(也是用它的返回值)

三、形参和实参的区别

#include
int test(int x)
int main()
{int x,y;puts("请输入一个数:");scanf("%d",&x);printf("main的x内存地址是%p,数值是%d\n",&x,x);y = test(x);//实际参数return 0;
}
int test(int x)
{printf("test的x内存地址是%p,数值是%d\n",&x,x);//形式参数,需要包含变量类型,变量名   生命周期:栈空间,被调用的时候才为形式参数申请内存,调用结束,内存被系统释放return 0;
}

编程案例

请输入两个整数,要求输出其较大值,用函数实现(三目运算符:x>y?x:y;)

#include
int getBigDataTwo(int x,int y)
int main()
{int data1,data2;int bigOne;puts("请输入两个数:");scanf("%d%d",&data1,&data2);bigOne = getBigDataTwo(data1,data2);printf("两个数据是%d,%d,大数是%d\n",data1,data2,bigOne);return 0;
}
int getBigDataTwo(int x,int y)
{int z;/* if(x>y){z =x;}else(z = y;}*/z =x>y?x:y;return z;
}

如果被调用函数在main函数后面,则需要在前面声明

四、函数的嵌套

编程案例:输入四个数,输出最大数

#include
int getTheBigFromTwo(int data1,int data2)
{int bigger;bigger = data1>data2?data1:data2;return bigger;
}
int getMaxDataFromFour(int a,int b,int c,int d)
{int max;max = getTheBigFromTwo(a,b);max = getTheBigFromTwo(max,c);max = getTheBigFromTwo(max,d);return max;
}
int main()
{int data1,data2,data3,data4;int theBigOne;puts("please Input Four nums:");scanf("%d%d%d%d",&data1,&data2,&data3,&data4);theBigOne = getMaxDataFromFour(data1,data2,data3,data4);printf("the biggest is %d\n",theBigOne);return 0;
}

五、函数的递归

1、(嵌套自己)(很少用)

#include
int getAge(int currPersonNum)
{int age;if(currPersonNum == 1){  age = 10;}else{age = getAge(currPersonNum - 1)+2;}return age;
}
int main()
{int age;int num;printf("你要知道第几个学生的年龄:\n");scanf("%d",&num);age = getAge(num);printf("第%d个学生的年龄是%d\n",num,age);return 0;
}

2、用递归法求n!

#include
#include
int getJieCheng(int num)
{int result;if(num>=17){printf("越界\n");exit(-1);}if(num == 1){result = 1;}else{ result = getJieCheng(num-1)*num;}return result;
}
int main()
{int num;int ret;puts("请输入要求的阶乘式:");scanf("%d",&num);ret = getJieCheng(num);printf("%d的阶乘是:%d\n",num,ret);return 0;
}

六、数组作为函数的参数

#include
int printArr(int a[10])//形参中不存在数组的概念,即使括号中约定了数组的大小,也无效。//传递的是一个地址,是数组的首地址
{int i;printf("printArr:arry的大小是:%d\n",sizeof(a));//在os中8个字节表示一个地址for(i=0;i<10;i++){printf("%d",a[i]);}putchar('\n');
} 
int main()  
{int a[10] = {1,2,3,4,5,6,7,8,9,10};printf("main: a的大小是:%d\n",sizeof(a));printArr(a);return 0;
}

数组名代表整个数组的首地址,第一个元素的地址也是数组的首地址。

 编程案例:有两个班的同学,分别是10个人和5个人,分别求这两个班的平均分

#include
void initArry(int arry[],int len)
{int i;for(i=0;i

二维数组作为函数的参数:

合法写法:int a[2][3]、int a[][3]   不合法写法:int a[][](必须指定列数)

七、全局变量

#include 
int p=100;
int q=90;//全局变量,写在所有函数之前的外部变量
//程序员编程便捷,但有隐藏风险!所有的函数都可以操作这个变量
void fun1()
{printf("fun1:%d\n",p);printf("fun1:%d\n",q);
}
void fun2()
{printf("fun2:%d\n",p);printf("fun2:%d\n",q);
}
int main()
{fun1();fun2();printf("main:%d\n",p);printf("main:%d\n",q);return 0;
}

编程案例:班上有10个学生,封装一个函数,调用该函数后获得班上的平均分,最高分,最低分

#include
int max;
int min;
float getResult(int arr[],int len)
{int i;int sum = 0;max = min = arr[0];for(i=0;iarr[i]){min = arr[i];}sum+=arr[i];}return (float)sum/len;
}//函数调用的目的:调用者通过调用函数获得某些结果
//函数强调的是功能性的封装,供调用者使用来改变调用者当中的一些数据
int main()
{int scores[]={74,86,77,64,57,89,75,83,62,71}float aver;aver = getResult(scores,sizeof(scores)/sizeof(scores[0]));printf("班级的最高分是:%d\n最低分是%d\n平均分是%f\n",max,min,aver);return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部