C语言 第六章 补充:函数应用举例&变量的作用域和存储类型

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型变量,变量访问将会极为高效。因为寄存器数量之有限,一般不使用此变量。

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值