学习函数
主要学习函数的用法。首先讨论为什么要使用函数,然后详细讨论内置函数和自定义函数以及函数的结构,最后讨论函数调用以及函数的返回值。
函数可以把相对独立的某个功能抽象出来,使之成为程序中的一个独立实体。可以在同一个程序或其他程序中多次重复使用
函数机制的优点
Ø 使程序变得更简短而清晰
Ø 有利于程序维护
Ø 可以提高程序开发的效率
Ø 提高了代码的重用性
函数的两种类型:内置函数和自定义函数
内置函数:
Ø 由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)
|
终止程序
|
内置函数sqrt 和pow 示例:
#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 %d的立方:%5.0f ",
x,squareroot,x,power);
x++;
}
}
#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 %d的立方:%5.0f ",
x,squareroot,x,power);
x++;
}
}
输出:
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
内置函数ceil和floor示例
#include
<
stdio.h
>
#include < math.h >
void main()
... {
printf("==============floor()=========");
printf(" floor(99.1) = %f ",floor(99.1));
printf(" floor(-99.1) = %f ",floor(-99.1));
printf(" floor(99.9) = %f ",floor(99.9));
printf(" floor(-99.9) = %f ",floor(-99.9));
printf(" ==============ceil()==========");
printf(" ceil(99.1) = %f ",ceil(99.1));
printf(" ceil(-99.1) = %f ",ceil(-99.1));
printf(" ceil(99.9) = %f ",ceil(99.9));
printf(" ceil(-99.9) = %f ",ceil(-99.9));
}
#include < math.h >
void main()
... {
printf("==============floor()=========");
printf(" floor(99.1) = %f ",floor(99.1));
printf(" floor(-99.1) = %f ",floor(-99.1));
printf(" floor(99.9) = %f ",floor(99.9));
printf(" floor(-99.9) = %f ",floor(-99.9));
printf(" ==============ceil()==========");
printf(" ceil(99.1) = %f ",ceil(99.1));
printf(" ceil(-99.1) = %f ",ceil(-99.1));
printf(" ceil(99.9) = %f ",ceil(99.9));
printf(" ceil(-99.9) = %f ",ceil(-99.9));
}
输出:
==============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 >
void main()
... {
char msg1,msg2,to_upper,to_lower;
printf("请输入一个小写字母:");
msg1=getchar();
to_upper=toupper(msg1);
printf("转换为大写:%c ",to_upper);
printf("请输入一个大写字母:");
fflush(stdin);
msg2=getchar();
to_lower=tolower(msg2);
printf("转换为小写:%c ",to_lower);
}
#include < ctype.h >
void main()
... {
char msg1,msg2,to_upper,to_lower;
printf("请输入一个小写字母:");
msg1=getchar();
to_upper=toupper(msg1);
printf("转换为大写:%c ",to_upper);
printf("请输入一个大写字母:");
fflush(stdin);
msg2=getchar();
to_lower=tolower(msg2);
printf("转换为小写:%c ",to_lower);
}
请输入一个小写字母:d
转换为大写:D
请输入一个大写字母:E
转换为小写:e
Press any key to continue
内置函数rand示例
#include
<
stdio.h
>
#include < stdlib.h >
// #include<time.h>
void main()
... {
int i;
printf("产生 10 个 0 到 99 之间的随机数序列: ");
//srand((unsigned)time(NULL));
for(i=0; i<10; i++)
printf("%d ", rand() % 100);
printf(" ");
}
#include < stdlib.h >
// #include<time.h>
void main()
... {
int i;
printf("产生 10 个 0 到 99 之间的随机数序列: ");
//srand((unsigned)time(NULL));
for(i=0; i<10; i++)
printf("%d ", rand() % 100);
printf(" ");
}
产生 10 个 0 到 99 之间的随机数序列:
44 73 26 58 37 94 27 42 28 90
Press any key to continue
自定义函数:
Ø 用户在程序中根据需要而编写的函数;
Ø 函数名的命名规则和变量命名一样。注意尽量能够表达出正确的意义,如果说一个变量命名重在说明它“是什么”的话,则一个函数重在说明它要“做什么”。比如一个函数要实现两数相加,则可以命名为AddTwoNum,这样有助于阅读。
Ø 函数参数。格式为:int AddTwoNum(int a,int b ) 注:两个或多个参数类型相同时,并不能同进声明。例如:AddTwoNum(int a, b )//是错误的。
Ø 在C语言中,不允许一个函数定义在另一个函数体内。如:
Void A()
{
Void B() //错误,函数B定义在函数A体内。
{…..
}
…..
}
函数原型
函数原型说明在形式上与函数头部类似,最后加一个分号。原型说明中参数表里的参数名可以不写(只写参数类型)
#include <stdio.h>
float count (int, int);
void main()
{
. . .
. . .
}
float co nt(int x,int y)
{
. . .
}
函数调用
Ø 通过在程序中使用函数名称,可以执行函数中包含的语句,这称为调用函数
Ø 函数之间允许相互调用,也允许嵌套调用
Ø 函数还可以自己调用自己,称为递归调用
示例:
#include
<
stdio.h
>
void AreaOfRect();
void AreaOfTriangle();
void AreaOfRound();
void main()
... {
int select;
do ...{
printf(" 0、退出 1、长方形 2、三角形 3、圆形 ");
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 之间选择。 ");
}
}while(1);
}
void AreaOfRect()
... {
int x,y;
printf("请输入长方形的长:");
scanf("%d",&x);
printf("请输入长方形的宽:");
scanf("%d",&y);
printf("面积为:%d ",(x * y));
}
void AreaOfRound()
... {
int r;
printf("请输入圆形的半径:");
scanf("%d",&r);
printf("面积为:%d ",3.14*r*r);
}
void AreaOfTriangle()
... {
int x,y;
printf("请输入三角形的底:");
scanf("%d",&x);
printf("请输入三角形的高:");
scanf("%d",&y);
printf("面积为:%d ",(x * y)/2);
}
void AreaOfRect();
void AreaOfTriangle();
void AreaOfRound();
void main()
... {
int select;
do ...{
printf(" 0、退出 1、长方形 2、三角形 3、圆形 ");
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 之间选择。 ");
}
}while(1);
}
void AreaOfRect()
... {
int x,y;
printf("请输入长方形的长:");
scanf("%d",&x);
printf("请输入长方形的宽:");
scanf("%d",&y);
printf("面积为:%d ",(x * y));
}
void AreaOfRound()
... {
int r;
printf("请输入圆形的半径:");
scanf("%d",&r);
printf("面积为:%d ",3.14*r*r);
}
void AreaOfTriangle()
... {
int x,y;
printf("请输入三角形的底:");
scanf("%d",&x);
printf("请输入三角形的高:");
scanf("%d",&y);
printf("面积为:%d ",(x * y)/2);
}
函数返回值
C 语言中的 return 语句用于向调用函数返回值,语法如下:
return (<表达式>);
Ø
C语言中的函数至多可以返回一个值,不能返回多个值;
Ø 返回值的数据类型必须与函数原型中返回值的数据类型匹配;
Ø 当遇到
return 语句时,函数执行将终止。程序控制流将立即返回调用函数;
示例:
#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(" 年龄为 %d 的人最大 ", age1);
else if( (age2 > age1) && (age2 > age3))
printf(" 年龄为 %d 的人最大 ", age2);
else if( (age3 > age1) && (age3 > age2))
printf(" 年龄为 %d 的人最大 ", age2);
}
int get_age()
... {
int age;
printf(" 请输入年龄: ");
scanf("%d",&age);
return age;
}
int get_age();
void main()
... {
int age1, age2, age3;
age1 = get_age();
age2 = get_age();
age3 = get_age();
if ( (age1 > age2) && (age1 > age3))
printf(" 年龄为 %d 的人最大 ", age1);
else if( (age2 > age1) && (age2 > age3))
printf(" 年龄为 %d 的人最大 ", age2);
else if( (age3 > age1) && (age3 > age2))
printf(" 年龄为 %d 的人最大 ", age2);
}
int get_age()
... {
int age;
printf(" 请输入年龄: ");
scanf("%d",&age);
return age;
}
函数的结构包括:返回值类型、函数名、参数列表、函数体