C程序设计(谭浩强)随书代码验证-第七章 用函数实现模块化程序设计
源码
源码: github.
7-1输出字符串
#include <stdio.h>
int main()
{
void printstar();
void print_message();
printstar();
print_message();
printstar();
return 0;
}
void printstar()
{
printf("******************\n");
}
void print_message()
{
printf(" How do you do!\n");
}
7-2两个数最大值
#include <stdio.h>
int main()
{
int max(int x,int y);
int a,b,c;
printf("please enter two integer numbers:");
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("max is %d\n",c);
return 0;
}
int max(int x,int y) // 定义max函数
{
int z; // 定义临时变量
z=x>y?x:y; // 把x和y中大者赋给z
return(z); // 把z作为max函数的伦值带回main函数
}
7-3两个浮点数最大值
#include <stdio.h>
int main()
{
int max(float x,float y);
float a,b;
int c;
scanf("%f,%f,",&a,&b);
c=max(a,b);
printf("max is %d\n",c);
return 0;
}
int max(float x,float y)
{
float z;
z=x>y?x:y;
return(z);
}
7-4-1实数之和
#include <stdio.h>
int main()
{
float add(float x, float y);
float a,b,c;
printf("Please enter a and b:");
scanf("%f,%f",&a,&b);
c=add(a,b);
printf("sum is %f\n",c);
return 0;
}
float add(float x,float y)
{
float z;
z=x+y;
return(z);
}
7-4-2
#include <stdio.h>
float add(float x,float y)
{
float z;
z=x+y;
return(z);
}
int main()
{
float a,b,c;
printf("Please enter a and b:");
scanf("%f,%f",&a,&b);
c=add(a,b);
printf("sum is %f\n",c);
return 0;
}
7-5-1四个整数最大值
#include <stdio.h>
int main()
{ int max4(int a,int b,int c,int d); // 对max4的函数声明
int a,b,c,d,max;
printf("Please enter 4 interger numbers:"); // 提示输入4个数
scanf("%d %d %d %d",&a,&b,&c,&d); // 输入4个数
max=max4(a,b,c,d); // 调用max4函数,得到4个数中的最大者
printf("max=%d \n",max); // 输出4个数中的最大者
return 0;
}
int max4(int a,int b,int c,int d) // 定义max4函数
{int max2(int a,int b); // 对max2的函数声明
int m;
m=max2(a,b); // 调用max2函数,得到a和b两个数中的大者,放在m中
m=max2(m,c); // 调用max2函数,得到a,b,c三个数中的大者,放在m中
m=max2(m,d); // 调用max2函数,得到a,b,c,d四个数中的大者,放在m中
return(m); // 把m作为函数值带回main函数
}
int max2(int a,int b) // 定义max2函数
{if(a>=b)
return a; // 若a>=b,将a为函数返回值
else
return b; // 若a<b,将b为函数返回值
}
7-5-2
#include <stdio.h>
int main()
{ int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("Please enter 4 interger 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)
{
return(a>b?a:b);
}
7-5-3
#include <stdio.h>
void main()
{ int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("Please enter 4 interger numbers:");
scanf("%d %d %d %d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d \n",max);
}
int max4(int a,int b,int c,int d)
{ int max2(int a,int b);
int m;
m=max2(max2(max2(a,b),c),d); /* 仔细分析此行 */
return(m);
}
int max2(int a,int b)
{
return(a>b?a:b);
}
7-6函数的递归调用
#include <stdio.h>
int main()
{
int age(int n);
printf("NO.5,age:%d\n",age(5)); //输出第5人的年龄
return 0;
}
int age(int n) //定义递归函数
{
int c;
if(n==1) // 如果n等于1
c=10; // 年龄为10
else // 如果n不等于1
c=age(n-1)+2; // 年龄是前一人的年龄加2(如第4人年龄是第3人年龄加2)
return(c); // 返回年龄
}
7-7递归求n!
#include <stdio.h>
int main()
{
int fac(int n);
int n;
int y;
printf("input an integer number:");
scanf("%d",&n);
y=fac(n);
printf("%lld!=%d\n",n,y);
return 0;
}
int fac(int n)
{
int f;
if(n<0)
printf("n<0,data error!");
else if(n==0||n==1)
f=1;
else
f=fac(n-1)*n;
return(f);
}
7-8 汉诺塔
#include <stdio.h>
int main()
{
void hanoi(int n,char one,char two,char three); // 对hanoi函数的声明
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to move %d diskes:\n",m);
hanoi(m,'A','B','C');
return 0;
}
void hanoi(int n,char one,char two,char three) // 定义hanoi函数
{// 将n个盘从one座借助two座,移到three座
void move(char x,char y); // 对move函数的声明
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y) // 定义move函数
{
printf("%c-->%c\n",x,y);
}
7-9数组“元素”作为函数-实参
#include <stdio.h>
int main()
{
int max(int x,int y);
int a[10],m,n,i;
printf("enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=1,m=a[0],n=0;i<10;i++)
{
if (max(m,a[i])>m) // 若max函数返回的值大于m
{
m=max(m,a[i]); // max函数返回的值取代m原值
n=i; // 把此数组元素的序号记下来,放在n中
}
}
printf("The largest number is %d\nit is the %dth number.\n",m,n+1);
return 0;
}
int max(int x,int y)
{
return(x>y?x:y);
}
7-10数组“名”作为函数-实参
#include <stdio.h>
int main()
{
float average(float array[10]); // 函数声明
float score[10],aver;
int i;
printf("input 10 scores:\n");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
printf("\n");
aver=average(score); // 调用average函数
printf("average score is %5.2f\n",aver);
return 0;
}
float average(float array[10]) // 定义average函数
{ int i;
float aver,sum=array[0];
for(i=1;i<10;i++)
sum=sum+array[i]; // 累加学生成绩
aver=sum/10;
return(aver);
}
7-11数组“名”作为函数-实参
#include <stdio.h>
int main()
{
float average(float array[ ],int n);
float score1[5]={98.5,97,91.5,60,55};
float score2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};
printf("The average of class A is %6.2f\n",average(score1,5));
printf("The average of class B is %6.2f\n",average(score2,10));
return 0;
}
float average(float array[ ],int n)
{
int i;
float aver,sum=array[0];
for(i=1;i<n;i++)
sum=sum+array[i];
aver=sum/n;
return(aver);
}
7-12选择法
#include <stdio.h>
int main()
{
void sort(int array[],int n);
int a[10],i;
printf("enter array:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);
printf("The sorted array:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
void sort(int array[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k])
k=j;
if(k != i)
{
t=array[k];
array[k]=array[i];
array[i]=t;
}
}
}
7-13多维数组“名”作为函数-实参
#include <stdio.h>
int main()
{
int max_value(int array[][4]);
int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};
printf("Max value is %d\n",max_value(a));
return 0;
}
int max_value(int array[][4])
{
int i,j,max;
max=array[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]>max)
max=array[i][j];
return (max);
}
7-14
#include <stdio.h>
float Max=0,Min=0; // 定义全局变量Max,Min
int main()
{ float average(float array[ ],int n);
float ave,score[10];
int i;
printf("Please enter 10 scores:");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
ave=average(score,10);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
return 0;
}
float average(float array[ ],int n) // 定义函数,有一形参是数组
{ int i;
float aver,sum=array[0];
Max=Min=array[0];
for(i=1;i<n;i++)
{if(array[i]>Max)Max=array[i];
else if(array[i]<Min)Min=array[i];
sum=sum+array[i];
}
aver=sum/n;
return(aver);
}
外部变量 局部变量 比较
#include <stdio.h>
int a=3,b=5; // a,b是全局变量
int main()
{
int max(int a,int b); // 函数声明。a,b是形参
int a=8; // a是局局部变量
printf("max=%d\n",max(a,b)); // 变量a是函数中定义的局部变量a
return 0;
}
int max(int a,int b) // a,b是函数形参
{
int c;
c=a>b?a:b; // 把a和b中的大者存放在c中
return(c);
}
7-16
#include <stdio.h>
int main()
{
int f(int);
int a=2,i;
for(i=0;i<3;i++)
printf("%d\n",f(a));
return 0;
}
int f(int a)
{
auto int b=0;
static int c=3;
b=b+1;
c=c+1;
return(a+b+c);
}
7-17
#include <stdio.h>
int main()
{
int fac(int n);
int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fac(i));
return 0;
}
int fac(int n)
{
static int f=1;
f=f*n;
return(f);
}
7-18 扩展外部变量的作用域-相同文件
#include <stdio.h>
int main()
{
int max( );
extern A,B,C; // 把外部变量A,B,C的作用域扩展到从此处开始
printf("Please enter three integer numbers:");
scanf("%d %d %d",&A,&B,&C);
printf("max is %d\n",max());
return 0;
}
int A ,B ,C; // 定义外部变量A,B,C
int max( )
{
int m;
m=A>B?A:B;
if (C>m) m=C;
return(m);
}
7-19 扩展外部变量的作用域-不同文件
//file1.c
#include <stdio.h>
int A;
int main()
{
int power(int);
int b=3,c,d,m;
printf("enter the number a and its power m:\n");
scanf("%d,%d",&A,&m);
c=A*b;
printf("%d*%d=%d\n",A,b,c);
d=power(m);
printf("%d**%d=%d\n",A,m,d);
return 0;
}
//file2.c
extern A;
int power(int n)
{
int i,y=1;
for(i=1;i<=n;i++)
y*=A;
return(y);
}
7 限制外部变量的作用域
- 背景:限制外部变量只能在本文件中使用,不能被其他文件引用
- 关键字:Static 在定义变量时,在前面加上static
- 例子
.
7本章总结
存储类别总结
作用域:
如果一个变量在某个文件或某个函数范围内是有效的,就称该范围为该变量的作用域
该变量在此作用域为可见,称为变量的可见性
生存周期
如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期或称该变量在此刻存在
作用域图示
生存期图示
知识点:变量的声明和定义
定义性声明
需要建立存储空间,简称定义
引用型声明
不需要建立存储空间
内部函数 和 外部函数
内部函数
如果函数只能被本文件中其他函数调用,则成为内部函数,又称静态函数
形式
static 类型名 函数名 (形参表)
static int fun(int a,int b)
此fun函数为内部函数,不能被其他函数调用
外部函数
如果函数可以被其他文件调用,则称为外部函数
形式
extern int fun(int a, int b)
此fun可以被其他文件调用。
NoteC语言规定,如果在定义函数时省略extern,则默认是外部函数
7-20 外部函数
//file1.c
#include <stdio.h>
int main()
{
extern void enter_string(char str[]);
extern void delete_string(char str[],char ch);
extern void print_string(char str[]);
// 以上3行声明在本函数中将要调用的已在其他文件中定义的3个函数
char c,str[80];
enter_string(str); // 调用在其他文件中定义的enter_string函数
printf("please input a char will deleted \n");
scanf("%c",&c);
delete_string(str,c); // 调用在其他文件中定义的delete_string函数
print_string(str); // 调用在其他文件中定义的print_string函数
return 0;
}
//file2.c
#include<stdio.h>
void enter_string(char str[80])
{
printf("please input a str \n");
gets(str);
}
//file3.c
void delete_string(char str[],char ch)
{int i,j;
for(i=j=0;str[i]!='\0';i++)
if(str[i]!=ch)
str[j++]=str[i];
str[j]='\0';
}
//file4.c
void print_string(char str[])
{
printf("%s\n",str);
}