10-C语言函数
目录:
一、函数
1 函数由函数名、返回值、形参、函数体组成。
函数的使用分三个步骤:声明、定义、调用
2 语法格式:
返回值类型 函数名(参数){
。。。函数体;
}
3 函数声明
正常来件,函数在使用前一定要声明,由编译器从上到下,所以下面的代码调用上面的函数,不需要声明,但上面的代码调用下面的函数,就必须声明。
函数的声明:去掉函数体部分,保留返回值类型 函数名(参数);
如果返回值类型不是int的话,都要使用函数声明。
函数声明,可以省略参数,省略参数代表可以接收任意参数,如果不需要参数,使用void关键字。
4 函数调用
在准备使用函数的时候,执行函数名(参数),就调用了函数体的语句。没有参数()也不能省略。
有参数的函数在定义时使用的参数叫形参,当调用此函数时传人的参数叫实参。
调用函数时,需要函数的执行结果,这时就需要返回值类型标识结果的类型,函数体内部需要使用return关键字,标识具体的函数结果(返回值)。
如果函数有返回值,当调用函数时,通常会使用变量接收返回值。
5 函数使用时注意的问题:
如果函数执行后,不需要结果,就定义函数的返回值类型void(空),也就不需要return关键字。
如果执行函数需要参照一些特定的条件,就可以使用参数,如果有多个参数,之间用逗号分隔符。
练习:
1)求两个数的和。(求和函数、有返回值、参数2)
2)求两个数的差、积、商。定义成函数。
3)输入五组数,求和差积商。
4)输入一个分数,输出相应的级别。
输入一个级别,输出相应的分数。
分别输入5个数,5个级别。
1 #include <stdio.h> 2 //声明函数 3 //void空 没有返回值 4 void sayHello(); 5 //定义函数 6 void sayHello() 7 { 8 printf("hello world!\n"); 9 } 10 //声明 11 void sayHello5(); 12 //int func(); 13 void sayHelloByCount(int count);//形参 14 void sayHelloByCount(int count) 15 { 16 for (int i = 0; i < count; i++) { 17 printf("hello world!\n"); 18 } 19 } 20 int getNumber() 21 { 22 return 0; 23 } 24 //练习:求两个数的和 25 int sum(int n1,int n2) 26 { 27 int sum2 = n1 + n2; 28 return sum2; 29 } 30 //2)求两个数的差、积、商。定义成函数。 31 int cha(int n1,int n2) 32 { 33 return n1 - n2; 34 } 35 int ji(int n1,int n2) 36 { 37 return n1 * n2; 38 } 39 int shang(int n1,int n2) 40 { 41 return n1 / n2; 42 } 43 //3)输入五组数,求和差积商。 44 int intputNum() 45 { 46 int num; 47 printf("输入一个数:"); 48 scanf("%d",&num); 49 scanf("%*c");//清除缓存 50 return num; 51 } 52 //输入一个分数,输出相应的级别。 53 int inputNum2() 54 { 55 int num; 56 printf("输入一个数:"); 57 scanf("%d",&num); 58 return num; 59 } 60 void printFenshuByLevel(int i){ 61 if (i >= 90) { 62 printf("a\n"); 63 }else if(i >= 60){ 64 printf("b\n"); 65 }else{ 66 printf("c\n"); 67 } 68 } 69 //输入一个级别,输出相应的分数。 70 char inputChar(){ 71 char ch; 72 printf("输入一个字母:\n"); 73 scanf("%c",&ch); 74 scanf("%*c");//清除缓存 75 return ch; 76 } 77 void printLevelByChar(char ch){ 78 switch (ch) { 79 case 'a': 80 printf("90~100\n"); 81 break; 82 case 'b': 83 printf("60~90\n"); 84 break; 85 case 'c': 86 printf("0~60\n"); 87 break; 88 89 default: 90 break; 91 } 92 } 93 int main(int argc, const char * argv[]) 94 { 95 //调用函数 96 // sayHello(); 97 // sayHello5(); 98 // func();//int返回值可以不用声明 99 // sayHelloByCount(3); 100 // int num = getNumber(); 101 // printf("num:%d\n",num); 102 // int i = 3; 103 // int j = 5; 104 // int s = sum(i,j); 105 // printf("sum:%d\n",s); 106 // int i = intputNum(); 107 // int i2 = intputNum(); 108 // int j = intputNum(); 109 // int j2 = intputNum(); 110 // printf("res:%d\n",cha(i, i2)); 111 // printf("res:%d\n",ji(j, j2)); 112 // for (int i = 0; i < 3; i++) { 113 // char c = inputChar(); 114 // printLevelByChar(c); 115 // } 116 for (int i = 0; i < 3; i++) { 117 char i = inputNum2(); 118 printFenshuByLevel(i); 119 } 120 //command +a 全选 ctrl + i 格式化 121 return 0; 122 }
作业:使用函数重构昨天的作业。
使用参数的时候,相当于实参传递值给形参。
练习:有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数中查看调换后的值。
形参是数组时,采用两个参数,第一个参数是数组的长度,第二个参数是不指定数组长度的数组名。
练习:求一组数的和,最小值,最大值。
#include <stdio.h> //有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数中查看调换后的值。 void swap(int m,int n){//实参传递给形参时是值传递 int temp = 0; temp = m; m = n; n = temp; printf("swap函数中m:%d,n:%d\n",m,n); } int main() { int i = 2; int j = 3; printf("main调换之前i:%d,j:%d\n",i,j); swap(i,j); printf("main调换之后i:%d,j:%d\n",i,j); return 0; }
二、return与exit关键字
1 exit(0)是一个函数,用于退出整个程序,需要包含stdlib.h
2 return可以作为返回值的关键字,终止当前函数的继续执行。
#include <stdio.h> #include <stdlib.h> int test(){ //exit(0);//终止整个程序 return 0;//终止函数的继续执行 printf("函数结束了!\n");//这里不会被执行 } int main() { printf("程序开始!\n"); test(); printf("程序结束了!\n");//如果test函数里加上exit(0),这里不会被执行 return 0; }
三、递归与递推
1 递归算法
递归的过程:一般通过函数或子函数实现。
递归的方法:在函数或子函数内部,直接或间接调用自己的算法。
递归有可能造成死循环或算法的复杂化,(运行次数过多),因此在使用递归时,必须注意:
1)必须有退出条件
2)必须保证递归后,算法简化
2 递归格式
int f1(int n){
if (n == 1) {//结束条件
return 1;
}
return n*f1(n - 1);
}
3 递推的概念与基本思想
给一个数的序列H0、H1、H2、....、Hn,若存在n0,当n > n0时,可以用等号(或大于号、小于号)将Hn与前面的某些Hi(0 < i < n)联系起来,这样的式子就叫递推关系。
int f2(int n){
int res = 1;
for (int i = 1; i <= n; i++) {
res = res * i;
}
return res;
}