6_1 函数的概述数组
函数是具备必定功能的一段程序,一个函数用来实现一个功能。函数
函数是程序的基本组成单元。code
【例6-1】 函数调用的简单例子递归
#include<stdio.h> int main() { void printf_star(); void printf_message (); printf_star(); printf_message (); printf_star(); return 0; } void printf_star() { printf("**************************\n\n"); } void printf_message () { printf(" Hello world!\n\n"); }
(1)主函数main作用域
(2)库函数input
(3)用户自定义函数原型
①从用户使用角度看,函数可分为库函数(又称标准函数)和用户自定义函数两种。
②函数又分为有返回值和无反回值函数两种。
③从主调函数和被调函数之间数据传送的角度来看,又可分为有参函数和无参函数io
6_2 函数定义的通常形式class
_2.1 无参函数的定义变量
形式:类型名 函数名
{
函数体
} 如:
void hello() { printf (“Hello world!\n”) }
_2.2 有参函数的定义
形式:类型名 函数名(形式参数表列)
{
函数体
}
int max (int a,int b) { if (a>b) return a; else return b; }
_2.3 空函数
形式:类型名 函数名()
6_3 函数的参数与函数的值
_3.1 形式参数和实际参数
【例6-2】从键盘输入两个整数,要求用函数求出较大者,而后输出。
#include<stdio.h> int main() { int max(int a,int b); int x,y,z; printf("Please input two numbers:"); scanf("%d,%d",&x,&y); z=max(x,y); printf("maxnum=%d\n",z); return 0; } int max(int a,int b) { int c; c=a>b?a:b; return (c); }
_3.2 函数的返回值
说明:(1)在函数中容许有多个return语句,但每次调用只能有一个return语句被执行,所以只能返回一个函数值
(2)函数值的类型和函数定义中函数的类型应保持一致。若是二者不一致,则以函数定义中函数的类型为,自动进行类型转换。
(3)对于不带返回值的函数,应当定义函数为void类型(或称"空类型");若是retun语句中没有指定的表达式(即return;),则此时返回一个不肯定的值。
6_4 函数的调用
_4.1 函数调用的通常形式:
函数名 (实参表列)
_4.2 函数调用的方式:
(1)做为函数表达式的一部分
(2)做为一个函数语句
(3)做为函数的实参
_4.3 被调用函数的声明和函数原型
例:对max函数的声明:int max(int a,int b)
_4.4 函数的嵌套调用
【例6-4】输入4个数,找出其中最大值。
#include<stdio.h> int main() { int max4(int a,int b,int c,int d); int a,b,c,d,max; printf("Please input 4 numbers(用逗号分隔):"); scanf("%d,%d,%d,%d",&a,&b,&c,&d); max=max4(a,b,c,d); printf("max=%d\n",max); return (0); } int max4(int a,int b,int c,int d) { int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return (m); } int max2(int a,int b) { if (a>=b) return a; else return b; }
_4.5 函数的递归调用
【例6-5】递归计算n!
#include<stdio.h> long fac(int n) { long f; if(n<0) printf("n<0,input error!"); else if (n==0||n==1) f=1; else f=fac(n-1)*n; return (f); } int main() { int n; long y; printf("\nPlease input a inteager number:"); scanf("%d",&n); y=fac(n); printf("%d!=%ld\n",n,y); return 0; }
【例6-6】汉诺塔问题。
#include<stdio.h> void move (int n,int x,int y,int z) { if (n==1) printf("%c-->%c\n",x,z); else { move (n-1,x,z,y); printf("%c-->%c\n",x,z); move (n-1,y,x,z); } } int main() { int h; printf("\ninput number:\n"); scanf("%d",&h); printf("the step to moving %2d diskes:\n",h); move(h,'a','b','c'); return 0; }
6_5 函数与数组
_5.1 数组函数做函数实参
【例6-7】判断一整型数组各元素的值,若大于0则输出该值,若小于等于0则输出0值。
#include<stdio.h> void pd (int v) { if (v>0) printf("%5d",v); else printf("%5d",0); } int main() { int a[5],i; printf("Please input 5 numbers:"); for (i=0;i<5;i++) { scanf("%d",&a[i]); pd (a[i]); } printf("\n"); return 0; }
_5.2 数组名做函数实参
6_6 变量的做用域与生存期
_6.1 局部变量与全局变量
定义在花括号里的局部变量的做用域仅限于花括号内
而花括号外的变量为全局变量,做用域为总体
_6.2 变量的存储方式和生存期
(1)动态存储方式和静态存储方式
变量:①动态的(auto);②静态的(static);③寄存器的(register);④外部的(extern)。
(2)auto变量
(3)用static声明局部变量
(4)register变量
(5)用extern声明全局变量