C语言 第六章 补充:函数应用举例
例1.一个班级有N名学生,每个学生有两门课程,实行百分制考核,要求分别统计各个等级的人数,并将分等级统计的结果保存到一维数组中。将判断等级的过程改由用户函数实现。
#include<stdio.h>
#define N 6
int main()
{
int f(int,int);
int i,s1,s2;
static int r[5];
for(i=0;i<N;i++)
{
printf("输入两门成绩:");
scanf("%d,%d",&s1,&s2);
r[f(s1,s2)]++;
}
for(i=0;i<5;i++)
printf("%d",r[i]);
printf("\n");
return 0;
}
int f(int s1,int s2)
{
int ave;
ave=(s1+s2)/2;
if(ave>=90) return 0;
else if(ave>=80) return 1;
else if(ave>=70) return 2;
else if(ave>=60) return 3;
else return 4;
}
例2.利用判断素数的函数prime()求解哥德巴赫猜想式。(任一大于5的偶数都可写成两个素数之和)
#include<stdio.h>
#include<math.h>
int main()
{
int prime(int);
int i,n;
printf("输入一个不小于6的偶数:");
scanf("%d",&n);
for(i=3;i<=n/2;i+=2)//素数只能为奇数,i从3开始的原因:没必要验证1和2
{
if(prime(i)&&prime(n-i))
{
printf("%d=%d+%d\n",n,i,n-i);
break;
}
}
return 0;
}
int prime(int n)
{
int i;
for(i=2;i<=sqrt(n);i++)
if(n%i==0) return 0;//可有多个return命令,但只有一个会执行
return 1
}
例3.设计一个利用数组进行排序的函数sort(),并调用它对存储在一维数组中的一个整数数列进行排序。
#include<stdio.h>
#define N 10
void sort(int [],int);
void input(int [],int);
void output(int [],int);
int main()
{
int data[N];
input(data,N);
output(data,N);
sort(data,N);
output(data,N);
return 0;
}
void input(int a[],int n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
void output(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d",a[i]);
printf("\n");
}
void sort(int a[],int n)
{
int i,j,temp;
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
例4.生成数字字符串。输入一个字符串,将其中的数字字符按输入顺序存储到digital数组中,然后输出该数组中的数字字符串。要求:检测并存储数字字符串的过程通过用户函数实现。
#include<stdio.h>
#include<string.h>
#define N 100
int main()
{
char string[N],digital[N];
void find(char[],char[]);
printf("source string:");
gets(string);
find(string,digital);
printf("target string:");
puts(digital);
return 0;
}
void find(char str[],char dig[])
{
int i,j;
for(i=0,j=0;str[i]!='\0';i++)
if(str[i]>='0'&&str[i]<='9')
dig[j++]=str[i];
dig[j]='\0';
}
变量的作用域
局部变量
函数内部定义,局部变量也称内部变量,在一个程序的不同函数中可以定义同名的局部变量,他们彼此独立。
#include<stdio.h>
int main()
{
void p_star50(void);
int i;
for(i=1;i<=20;i++)
{
p_star50();
putchar('\n');
}
return 0;
}
void p_star50(void)
{
int i;
for(i=1;i<=50;i++)
putchar('*');
}
//两个i虽然变量名相同,但他们是不同函数的局部变量,仅在各自函数中有效,互相之间没有任何影响
全局变量
文件头定义,是在程序的函数之外定义的局部变量,在任意一个函数之外都可以定义。但是一个程序多个全局变量的作用范围是不同的:
另。c语言明确规定,凡是在局部变量的作用范围内,与其同名的全局变量不起作用。
外部变量
在一个文件中定义的全局变量,既可以由该文件的多个函数使用,也可以由其他文件的函数使用。
在当前文件中使用其他文件里定义的全局变量时,该全局变量须在当前的文件中声明为外部变量。关键字为extern
变量的存储类型
c语言中的变量的存储类型有3种,auto型,static型,register型
1.auto
通常称为自动变量,只有函数的局部变量才能定义为auto型,auto型变量在函数调用时,为其分配在内存的动态存储区,函数执行结束时自动释放。
在定义局部变量时,如果省略存储类型,则系统默认为auto。
2.static
通常称为静态变量,它存放在内存的静态存储区,在编译时即为其分配存储空间,并进行初始化。对没有赋值的static变量,如果为数值型则赋值0,字符型赋值null。
函数内定义的静态变量称为静态局部变量,在函数外定义称为静态全局变量。static的局部变量并不因函数的运行结束而消失,而是始终存在,当再次进入该函数时将保留上次结果。
3.register
与上两种不同,register变量不是内存变量,是寄存器变量,编译系统不为其分配内存空间,而是直接使用cpu中的寄存器存储变量值,寄存器的存储速度远远高于内存的存取速度,当一个变量定义为register型变量,变量访问将会极为高效。因为寄存器数量之有限,一般不使用此变量。