函数
目标 描述 C 语言中的函数 掌握 C 语言中常见的内置函数 理解函数原型和函数的返回值 熟练掌握自定义函数的定义和调用
为什么使用函数 ans 函数 主程序 void main() { :::::: x=x*x*x; y=y*y*y; z=z*z*z; ans1=x+y+z; a=a*a*a; b=b*b*b; c=c*c*c; ans2=a+b+c; ::::: } void main() { :::::: ans1=cube(x,y,z); ans2=cube(a,b,c); ::::: } int cube(int a,b,c) { int ans; ans=(a*a*a)+(b*b*b)+(c*c*c); return ans; } 重复多次的同一计算类型 ans 函数 主程序 函数可以把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体。可以在同一个程序或其他程序中多次重复使用
函数机制的优点 使程序变得更简短而清晰 有利于程序维护 可以提高程序开发的效率 提高了代码的重用性
函数类型 内置函数: 由C语言系统提供; 用户无须定义,也不必在程序中作类型说明; 只需在程序前包含有该函数定义的头文件; 自定义函数: 用户在程序中根据需要而编写的函数;
常用内置函数 内置函数 头文件 用途 double sqrt(double x) math.h 计算x的平方根 double pow(double x, double y) 计算x的y次幂 double ceil(double x) 求不小于x的最小整数,并以double形式显示 double floor(double x) 求不大于x的最大整数,并以double形式显示 int toupper(int x) ctype.h 如果x为小写字母,则返回对应的大写字母 int tolower(int x) 如果x为大写字母,则返回对应的小写字母 int rand(void) stdlib.h 产生一个随机数 void exit(int retval) 终止程序 计算x开N次方:求x的1/n次方。 Ceil:顶,比x大。所以是不小于x的最小整数。离它最近,而且是比它大的数。 Floor:底,比x小。所以是不大于x的最大整数。离它最近,而且是比它小的数。 调用函数的三个条件: 1、调用者必须能够看到被调用者。 2、调用者必须传递的给被调用者正确的参数。 3、如何得到函数的运行结果。
内置函数sqrt 和pow 示例 #include <stdio.h> #include <math.h> 1的平方根: 1.00 1的立方: 1 2的平方根: 1.41 2的立方: 8 3的平方根: 1.73 3的立方: 27 4的平方根: 2.00 4的立方: 64 5的平方根: 2.24 5的立方: 125 6的平方根: 2.45 6的立方: 216 7的平方根: 2.65 7的立方: 343 8的平方根: 2.83 8的立方: 512 9的平方根: 3.00 9的立方: 729 10的平方根: 3.16 10的立方: 1000 Press any key to continue #include <stdio.h> #include <math.h> void main() { int x=1; double squareroot,power; while(x <= 10) squareroot=sqrt(x); power=pow(x,3); printf(" %d的平方根:%3.2f\t%d的立方:%5.0f \n", x,squareroot,x,power); x++; } 问题描述: 求自然数1~10的平方根和立方。 2 6 64 补充开3次方的例子。
内置函数ceil和floor示例 #include <stdio.h> #include <math.h> void main() { printf("==============floor()========="); printf("\n floor(99.1) = %f \n",floor(99.1)); printf(" floor(-99.1) = %f\n",floor(-99.1)); printf(" floor(99.9) = %f\n",floor(99.9)); printf(" floor(-99.9) = %f\n",floor(-99.9)); printf("\n==============ceil()=========="); printf("\n ceil(99.1) = %f\n",ceil(99.1)); printf(" ceil(-99.1) = %f\n",ceil(-99.1)); printf(" ceil(99.9) = %f\n",ceil(99.9)); printf(" ceil(-99.9) = %f\n",ceil(-99.9)); } 2 6 64 ==============floor()========= floor(99.1) = 99.000000 floor(-99.1) = -100.000000 floor(99.9) = 99.000000 floor(-99.9) = -100.000000 ==============ceil()========== ceil(99.1) = 100.000000 ceil(-99.1) = -99.000000 ceil(99.9) = 100.000000 ceil(-99.9) = -99.000000 Press any key to continue
toupper和tolower示例 #include<stdio.h> #include<ctype.h> Press any key to continue #include<stdio.h> #include<ctype.h> void main() { char msg1,msg2,to_upper,to_lower; printf("请输入一个小写字母:"); msg1=getchar(); to_upper=toupper(msg1); printf("转换为大写:%c\n",to_upper); printf("请输入一个大写字母:"); fflush(stdin); msg2=getchar(); to_lower=tolower(msg2); printf("转换为小写:%c\n",to_lower); } 2 6 64 询问学员此时是否可以体会函数的作用。可以简化我们的操作。
内置函数rand示例 #include<stdio.h> #include<stdlib.h> //#include<time.h> void main() { int i; printf("产生 10 个 0 到 99 之间的随机数序列:\n\n"); //srand((unsigned)time(NULL)); for(i=0; i<10; i++) printf("%d ", rand() % 100); printf("\n"); } 产生 10 个 0 到 99 之间的随机数序列: 44 73 26 58 37 94 27 42 28 90 Press any key to continue 2 6 64 初始化,随机数发生器。
函数定义 double max(double x, double y) void displayDiscount() { { m=x>y?x:y; return m; } void displayDiscount() { float price, discount_amt; printf("请输入价格"); scanf("%f, &price); discount_amt = 0.75 * price; printf("折扣额为 %f", discount_amt); } 该函数名为max,它有两个double类型的参数,返回值为double类型。在函数体内有三条语句实现了求两个数中较大的数,并将它返回。 该函数名为displayDiscount,无参数,使用void说明无返回值,函数体内的语句用于根据产品的价格求折扣后的价格。
函数原型 函数原型说明在形式上与函数头部类似,最后加一个分号。原型说明中参数表里的参数名可以不写(只写参数类型)。 #include <stdio.h> float count (int, int); void main() { . . . } float count(int x,int y)
函数调用 float set_discount() 通过在程序中使用函数名称,可以执行函数中包含的语句,这称为调用函数 { :::::::::: } float displayDiscount() 通过在程序中使用函数名称,可以执行函数中包含的语句,这称为调用函数 函数之间允许相互调用,也允许嵌套调用 函数还可以自己调用自己,称为递归调用 #include<stdio.h> void main() { ::::::::: set_discount(); displayDiscount(); :::::::: }
函数嵌套调用 void palindrome() { #include<stdio.h> :::::::: reverse(); } #include<stdio.h> void main() { ::::::::: palindrome(); :::::::: } void reverse() { :::::::::: } 从一个函数调用另一个函数称为函数的嵌套调用
函数递归调用 /* 此函数用于计算 a 的阶乘 */ int factorial(int a) { if (a == 1) return 1; else a = a * factorial(a-1); return a; } 在一个函数体内调用自身称为函数的递归调用
函数调用示例 #include<stdio.h> void AreaOfRect(); void AreaOfRect() void AreaOfTriangle(); void AreaOfRound(); void main() { int select; do { printf(" 0、退出\n 1、长方形\n 2、三角形\n 3、圆形\n"); printf("请选择功能:"); scanf("%d",&select); if(select == 0) break; switch(select) { case 1 : AreaOfRect(); break; //长方形 case 2 : AreaOfTriangle(); break; //三角形 case 3 : AreaOfRound(); break; //圆形 default : printf("输入有误,请在 0~4 之间选择。\n"); } }while(1); 函数调用示例 void AreaOfRect() { int x,y; printf("请输入长方形的长:"); scanf("%d",&x); printf("请输入长方形的宽:"); scanf("%d",&y); printf("面积为:%d\n",(x * y)); } void AreaOfTriangle() { int x,y; printf("请输入三角形的底:"); scanf("%d",&x); printf("请输入三角形的高:"); scanf("%d",&y); printf("面积为:%d\n",(x * y)/2); } 函数原型 问题描述: 根据用户的选择求不同形状的面积。 void AreaOfRound() { int r; printf("请输入圆形的半径:"); scanf("%d",&r); printf("面积为:%d\n",3.14*r*r); }
函数返回值 C 语言中的 return 语句用于向调用函数返回值,语法如下: return (<表达式>); 返回值的数据类型必须与函数原型中返回值的数据类型匹配; 当遇到 return 语句时,函数执行将终止。程序控制流将立即返回调用函数; int divisibleCheck(int num) { if (num % 5 == 0) return 1; else return 0; }
函数返回值示例 age1 age2 age3 78 54 65 #include <stdio.h> int get_age(); void main() { int age1, age2, age3; age1 = get_age(); age2 = get_age(); age3 = get_age(); if ( (age1 > age2) && (age1 > age3)) printf("\n年龄为 %d 的人最大\n", age1); else if( (age2 > age1) && (age2 > age3)) printf("\n年龄为 %d 的人最大\n", age2); else if( (age3 > age1) && (age3 > age2)) } 内存 age1 age2 age3 78 54 65 int get_age() { int age; printf("\n请输入年龄: "); scanf("%d",&age); return age; } 请输入年龄:65 请输入年龄:78 请输入年龄:54 年龄为 78 岁的人最大
总结 2-1 函数是程序中的一个相对独立的单元或模块,程序在需要时可以任意多次地调用函数来完成特定功能 使用函数带来的好处: 程序更清晰、易维护、分模块方便设计与开发、提高代码的重用性 C语言提供了极为丰富的内置函数,这些内置函数分门别类地放在不同的头文件中,要使用这些内置函数,只要在程序前包含相应的头文件即可
总结 2-2 自定义函数是用户在程序中根据需要而编写的函数 函数的结构包括:返回值类型、函数名、参数列表、函数体 函数原型说明以便向编译器指出该函数使用什么样的格式和语法 函数调用时程序控制流将转向被调函数,被调函数执行结束时,控制流返回主调函数 return 语句用于向调用函数返回值