程序结构概念 :
1) 较大的程序应分为若干个程序模块 ;
2) 每个模块实现单一的特定功能;
3) 由主函数开始执行,主函数调用子函数;
4) 子函数之间可以互相调用。
说明 :
1. 一个源文件可由一个或多个函数组成;
2. 一个源文件是一个编译单位;
3. 一个 C 程序由一个或多个源文件组成。
4. 从 main() 开始,调用其它函数后,回到 main() 结束 ;
5. 不能嵌套定义,但可互相调用 。
6. 分类 :
1) 标准函数 和 用户自定义函数 ;
2) 无参函数 和 有参函数 。
形式参数 :
定义函数时,括号中说明的变量名 ;
实际参数 :
调用函数时,括号中给定的表达式 。
说明 :
1. 定义函数时,形参不占内存单元 ;调用函数时,形参才分配内存单元 ;调用结束后,形参所占内存单元被释放。
2. 实参可以是常量、变量或表达式,但必须有确切的值。
3. 定义函数,必须指明形参类型。
4. 实参与形参类型一致。
5. 实参变量对形参变量的数据传递是“值传递 ”,即 单向 传递。
6. 可在“形参表列”中说明形参类型。
int max( int x , int y )
{ }
说明 :
1. 通过 return 语句获得返回值 ;
2. 定义函数时指定函数返回值的类型;不加类型说明的,按整型处理。
3. 函数值的类型和 return 语句中表达式的值不一致时,以函数类型为准。
4. 被调用函数中没有 return 语句时,带回一个不确定的值。
5. 为了明确表示“不带回值”,可以用“ void ” 定义 “ 无类型 ”。
函数名(实参表列)
说明 :
1. 无参函数,括号不能省 ;
2. 实参表列中,各实参与形参在 个数、顺序、类型上一一对应,参数间用逗号分隔。
1. 被调函数必须存在 ;
2. 用 #include命令包含有关库函数 ;
3. 被调用函数一般应在主调函数前定义, 这样在主调函数中可以不对调用函数类型进行声明。 否则在主调函数中必须对调用函数类型进行声 明(整型 ,字符型除外);
4. 如果在文件开头,已声明了被调函数类型,则主调函数中不必再作类型声明。
例 2.求5!、16!和27!
float jiec(n)
int n;
{ float y=1;
int i;
for (i=1;i<=n;i++)
y=y*i;
return (y);
}
main( )
{ float a,b,c;
a=jiec(5);
b=jiec(16);
c=jiec(27);
printf ("%f,%f,%f\n",a,b,c);
}
例 3.编写函数,判定某数字是否在某正整数中,若在,打印 TRUE,否则打印 FALSE 。
main( )
{ int m,n;
int among(int m,int n);
scanf("%d %d",&m,&n);
if(among(m,n)) printf("TRUE");
else printf("FALSE");
}
int among(m,n)
int m,n;
{ int k,z=0;
do
{k=m%10;
if (n==k) {z=1; break;}
m=m/10;
}while(m!=0);
return(z);
}
例 4.统计 10~500 这些数中 4 这个数字出现的次数,判一个数有几位4数字用函数实现 。
num(x)
int x;
{ int y,k=0;
while (x!=0)
{y=x%10;
if(y==4) k++;
x=x/10;
}
return(k);
}
main()
{int i,k=0;
for(i=10;i<=500;i++)
k=k+num(i);
printf ("number=%d\n",k);
}
例 5. 找出1000之内的所有“完数”,判一个数是否为完数用函数实现 。
wan(x)
int x;
{ int i,k=0;
for (i=1;i<=x/2;i++)
if (x%i==0) k=k+i;
if (k==x) return (1);
else return (0);
}
main( )
{ int i;
for (i=1;i<1000;i++)
if (wan(i)) printf ("%5d",i);
printf ("\n");
}
例6
float fac(int n)
{int i;float t;
t=1;
for(i=1;i<=n;i++)
t*=i;
return t;
}
main()
{int i, n ;float s;
for(i=0;i<5;i++)
{scanf("%d",&n );
s+=fac(n );
}
printf("%.0f\n",s);}
例7
例8:
main( )
{
printf("-----\n");
print1( );
printf("-----\n");
}
void print1( )
{
printf("*****\n");
print2( );
printf("*****\n");
}
void print2( )
{printf("#####\n");}
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用 。
例 1.用递归法求 n!
例3 数组 score 存放 10 个学生成绩,求平均成绩 。
例4 用冒泡法对数组中10个整数按升序排序 。
void sort(int a [ ],int n)
{ int i, j, t;
for (j=0;ja[i+1])
{ t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
main( )
{ int array[10],i;
for (i=0;i<10;i++)
scanf ("%d",&array[i]);
sort(array,10);
for (i=0;i<10;i++)
printf ("%5d",array[i]);
printf ("\n");
}
例 5 调用递归函数求整型数组中 10 个元素之和 。
int sum(int a[10], int n)
{ int s;
if (n==1) s=a[0];
else s=sum(a,n-1)+a[n-1];
return(s);
}
main( )
{ int a[10],i;
for (i=0;i<10;i++)
scanf("%d",&a[i]);
printf("%d\n",sum(a,10));
}
例6 求一个3×4矩阵中的最大元素 。
int max_value(int array[12])
{ int i,max;
max=array[0];
for(i=1;i<12;i++)
if(array[i]>max) max=array[i];
return(max);
}
main( )
{int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};
printf ("max=%d\n",max_value(a));
}
例7 编写一个函数比较两个字符串s1,s2 , 如果s1=s2,则返回0,如果s1>s2, 则返回1,如果s1 6-4 6-5 6-8 6-10(一) 6-10(二) 在函数内定义的变量 。 在函数之外定义的变量,又称外部变量。 作用范围:从定义变量的位置开始到本源文件结束。 例1 例2 在一维数组中存放10个学生的成绩,编写一个函数,求出平均分、最高分和最低分。 例3 例4 例1 例2 int comp(char s1[ ],char s2[ ])
{int z,i;
for(i=0;s1[i]!='\0';i++)
if(s1[i]!=s2[i]) break;
if(s1[i]>s2[i]) z=1;
else if(s1[i]==s2[i]) z=0;
else z=-1;
return(z);
}
main()
{char c1[40],c2[40];
int x;
gets(c1);gets(c2);
x=comp(c1,c2);
printf("%d\n",x);
}
int prime(int a)
{int i;
if(a<2)return(0);
for(i=2;i<=a/2;i++)
if(a%i==0)return(0);
return(1);
}
main()
{int n;
for(n=1;n<=100;n++)
if(prime(n)) printf(“%5d“,n);
printf("\n");
}
float fac(int n)
{int i;
float t;
t=1;
for(i=1;i<=n;i++)
t*=i;
return t;
}
main()
{int n;
float s;
s=0;
for(n=1;n<=20;n++)
s+=fac(n);
printf("%e\n",s);}
float fac(int n)
{int i; float t;
t=1;
for(i=1;i<=n;i++)
t*=i;
return t;
}
main()
{int n=7,m,x; float s;
s=fac(n);
for(m=0;m<=n;m++)
{x=s/(fac(n-m)*fac(m));
printf("%5d",x);
}
printf("\n");}
int gcd(int m,int n)
{int r;
r=m%n;
while(r!=0)
{m=n;n=r;r=m%n;}
return(n);
}
main( )
{int x,y,k;
scanf("%d%d",&x,&y);
k=gcd(x,y);
printf("%d,%d\n",k,x*y/k);
}
int gcd(int x,int y)
{int r;
if(y==0) r=x;
else if(x>=y) r=gcd(x-y,y);
else r=gcd(y,x);
return(r);
}
main( )
{int x,y,k;
scanf("%d%d",&x,&y);
k=gcd(x,y);
printf("%d,%d\n",k,x*y/k);
}
8.6 局部变量和全局变量
一、局部变量
二、全局变量
int i=10;
main( )
{int j=1,func( );
j=func( );
printf("%d\n",j);
j=func( );
printf("%d\n",j);
}
int func( )
{int k=0;
k=k+i;
i=i+10;
return(k);
}
float max,min;
float ave(float array[ ],int n)
{ float av,sum;
int i;
sum=max=min=array[0];
for (i=1;i
8.7 变量的存储类别
一、变量的存储类别
二、局部变量的存储方式
int f( int a)
{ int b=0;
static int c=3;
b=b+1;
c=c+1;
return(a+b+c);
}
main( )
{ int a=2,i;
for (i=0;i<3;i++)
printf("%d\n",f(a));
}
float fac(int n)
{ static float f=1;
f=f*n;
return(f);
}
main( )
{ int i;
for(i=1;i<=5;i++)
printf("%.0f\n", fac(i));
}
小 结