第八章 函数 (上)
函数的类型(跟变量的类型很像):int ,float,char,void
函数都有返回值,特别的void类型是“空类型”,所以他没有返回值,或者说,void类型返回空。
如:主函数
void main()
{
...
}
void main()
{
...
return;
}
当然也有把主函数设成int类型的,然后相应的加一句"return 0;"
int main()
{
...
return 0;
}
那么这个“return 0;”在主函数中是不是什么意思都没有呢?当然不是了。程序在运行的时候在
等待main函数运行完,当main函数运行完之后将返回值返回给系统,系统识别后自动结束。
函数的使用主要包括三个部分:函数的定义,函数的声明,函数的调用。
例8.1 函数调用的简单例子。
#include
void main()
{
void printstar(); /* 对printstar函数进行声明 */
void print_message(); /* 对print_message函数进行声明 */
printstar(); /* 调用printstar函数 */
print_message(); /* 调用print_message函数 */
printstar(); /* 调用printstar函数 */
}
void printstar() /* 定义printstar函数 */
{
printf("* * * * * * * * * * * * * * * *\n");
}
void print_message() /* 定义print_message函数 */
{
printf(" How do you do!\n");
}
★从用户使用的角度看,函数有两种。
(1)标准函数。标准函数即库函数,他是由系统提供的,用户不必自己定义而使用他
们。如:printf,scanf,sqrt,strlen这些函数。
(2)用户自己定义的函数。他是用以解决用户专门需要的函数。
★从函数的形式看,函数分两类:
(1)无参函数。如例8.1中的printstar和print_message就是无参函数。
(2)有参函数。如f(x)
--参数就是指参变量,函数的小括号里面的东西。
【函数定义的一般形式】
无参函数定义的一般形式为:
类型标识符 函数名()
{
声明部分
语句部分
}
例如:
int print()
{
int i;
for(i=0;i<10;i++) printf("%d\n",i);
}
例8.1中的print_star函数和print_message函数都是无参函数。
有参函数定义的一般形式为:
类型标识符 函数名(形式参数列表)
{
声明部分
语句部分
}
例如:
int Max(int x,int y)
{
int a;
a = x > y ? x : y;
return a;
}
在程序设计中有时会用到空函数,它的形式为:
类型说明符 函数名()
{ }
例如:
void dummy()
{ }
调用此函数时,什么工作也不做,没有任何实际作用。在主函数中写上“dummy();”表明“这里要
调用一个函数”,而现在这个函数没有起作用,等以后扩充函数功能时再补充上。
注:在自己定义函数的时候,函数名要取得好理解一些,如:prnitstar()函数,一看就知道是要
打印星星图案~
【形式参数和实际参数】
例8.2 调用函数时的数据传递。
#include
void main()
{
int Max(int x,int y); /* 对Max函数的声明 */
int a , b , c;
scanf("%d%d" , &a,&b);
c = Max(a,b);
printf("Max is %d\n" , c);
}
int Max(int x,int y) /* 定义有参函数Max */
{
int z;
z = x > y ? x : y;
return z;
}
*******************************************************
补充知识点:变量和数组的定义可以放在main函数之外,如:
#include
int x;
void main()
{
scanf("%d" , &x);
printf("%d\n" , 2*x);
}
*******************************************************
【函数的调用】
函数调用的一般形式为
函数名(实参列表);
函数调用的方式:
1.函数语句
把函数作为一个语句。如例8.1中的“printstar();”,这是不要求函数带返回值,只要求完成一
定的操作。
2.函数表达式
函数出现在一个表达式中,这种表达式成为函数表达式。这是要求函数带回一个确定的值以参加表
达式的运算。例如:
c = 2 * Max(a,b)
函数Max是表达式的一部分,它的值乘2再赋给c。
3.函数参数
函数调用作为一个函数的实参。例如:
m = Max(a , Max(b,c));
其中Max(b,c)是一次函数调用,它的值作为Max另一次调用的实参。m的值是a、b、c三者中的最大
值。又如:
printf("%d\n" , Max(a,b));
也是把Max(a,b)作为printf函数的一个参数。
函数原型的一般形式有两种:
(1)函数类型 函数名(参数类型1,参数类型2,...,参数类型n);
(2)函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,...,参数类型n 参数名n);
演示:求n个数最大值的函数。
补充5.8题(2),现在可以用函数做了。演示
课堂练习:
1.写一个函数int max3(int a,int b,int c)函数,返回a,b,c的最大值,并在主函数中运行。
2.写一个函数double f(int n),当我输入n个数后,返回这n个数的平均值。
复习(编程题):
1.输入两个数,输出它们的和;
2.输入两个数,如果他们差的绝对值小于等于10,输出“yes”,不然就输出“no”;
3.循环输出5的平方到16的平方;
4.输入一个数n,判断n是不是素数。
5.求出200到300间的所有素数。
6.page.130 6.13
7.page.153 7.6
8.2.写一个函数double f(int n),当我输入n个数后,返回这n个数中最大值与最小值之差。
第八章 函数(下) 【函数的递归调用】 函数的递归调用:简单地说,函数的递归调用就是当我定义了函数f(x)之后,我在定义另一个函数g(x)的时候用到了f(x)。 举例: int f(int x) { return x*x*x*x; } void g(int x) { int i; for(i=0;i<5;i++) { printf("%d\n" , f(i)); } } 【函数的递归调用】 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 例:page.172 例8.7 , 例8.8 扩展:page.174 例8.9