局部变量和全局变量
局部变量:1、在主函数main()中定义都变量x、y、z也只有在主函数中有效,而不是因为在主函数中定义而在整个文件或程序中都有效。主函数也不能使用其他函数中定义的变量(2)在不同函数中的变量可以起相同的名字,它们代表不同的对象,互不干扰3、形参也属于局部变量4、在一个函数内部,可以在复合语句中定义变量,这些变量也只在本复合语句中有效,这种复合语句称之为分程序或程序块
全局变量:1、全局变量的使用增加了函数间数据联系的通道1、如果全局变量在文件的开头定义,则在整个文件范围内都可以使用它们,如果不是在文件开头的部分定义,则按上面的规定作用范围只限于定义点到文件终了3、如果在同一个源文件中,全局变量和局部变量同名,则在局部变量到作用范围内外部变量、全局变量不起作用4、建议不要随便使用全局变量,因为全局变量到使用极易出错
变量到存储类别
静态存储变量:在编译时分配存储空间的变量称为静态存储变量,其定义形式在变量定义的前面加上关键字static 例如:static int a=8;定义静态存储变量无论是作全局变量还是局部变量,定义和初始化在程序编译时进行。作为局部变量,调用函数结束时,静态存储变量不会消失并且保留原值。
动态存储变量:动态存储方式是指在程序运行期间分配固定的存储空间的方式。动态存储变量可以是函数以形参、局部变量、函数调用时的现场保护和返回值。这些动态存储变量在函数调用时分配存储空间,函数结束时释放存储空间,动态存储变量的定义形式为在变量定义的前面加上关键字auto 例如:auto int a,b,cl; auto也可以省略不写,事实上已经使用的变量均为省略了关键字auto的动态存储变量。
内部和外部函数
函数本质上是全局第,因为一个函数要被另外第函数调用,但是根据函数是否能被其他的源文件调用可以将函数分为内部函数和外部函数
内部函数:如果一个函数只能被本文件中的其他函数调用,则称它为内部函数。在定义内部函数时,在函数名和函数类型的前面加static 形式:static int function(int x,int y);。内部函数又称为静态函数,使用内部函数可以使函数只局限于所在文件。如果在不同的文件中有同名的内部函数,它们互不干扰。在一个大的工程项目中分工合作时,不必担心自己所用的函数是否会和其他文件中的函数同名,通常把只由同一文件使用的函数和外部变量放在同一文件中,冠以static使之局部化,其他文件不能使用。
外部函数:在定义函数时,如果冠以关键词extern,则表示此函数是外部函数。如:extern int function(int x,int y);函数function可以为其他的文件调用,如果在定义函数时省略extern,则隐含为外部函数,在需要调用此函数的文件中,一般需要用extern说明所用函数是外部函数。
外部变量初始化:同函数一样外部变量的定义和外部变量的说明并不是同一回事。外部变量的定义只有一次,他的位置必须在所有函数之外,而同一文件中的外部变量的说明可以有许多次。位置是在函数之内(哪个函数调用就在哪个函数中声明)。对外部变量的初始化只能在“定义”中进行,而不能在“说明”中完成。此外c语言中规定,外部数组可以赋初值,而局部数组则不能。
#include <stdio.h>
//给出年月日计算该日时该年的第几天
//static int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//int sum_day(int month,int day)
//{
// int i;
// for(i=0;i<month;i++)
// {
// day+=day_tab[i];
// }
// return day;
//}
//int leap(int year)
//{
// int leap;
// leap=(year%4==0&&year%100!=0)||(year%400==0);
// return leap;
//}
//int main()
//{
// int year,month,day;
// int days;
// printf("请输入日期(年 月 日):\n");
// scanf("%d %d %d",&year,&month,&day);
// printf("%d年%d月%d日",year,month,day);
// days=sum_day(month, day);
// if(leap(year)&&month>3)
// {
// days+=1;
// }
// printf("是该年的第%d天。\n",days);
// return 0;
//}
//全局变量和局部变量
//int count;
//int counter;
//void head1()
//{
// int index;
// index=23;
// printf("the header1 value is %d\n",index);
//}
//void head2()
//{
// int count;
// count =53;
// printf("the heaser2 value is %d\n",count);
// counter=77;
//}
//void head3()
//{
// printf("the header3 value is %d\n",counter);
//}
//int main()
//{
// register int index;
// head1();
// head2();
// head3();
// for(index=8;index>0;index--)
// {
// int stuff;
// for(stuff=0;stuff<=6;stuff++)
// {
// printf("%d ",stuff);
// }
// printf("index id now %d\n",index);
// }
// return 0;
//}
//统计学生成绩:要求输入10个学生5门功课的成绩分别用子程序求出:
//每个学生的平均分;每门功课的平均分;找出最高分所对应的学生和功课;求出平均分方差
/*
#define M 5
#define N 10
float avg_st[10]={0};
float avg_sc[5]={0};
float score[10][5];
void avg_stu()
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
avg_st[i]+=score[i][j];
}
avg_st[i]=avg_st[i]/5;
}
}
void avg_score()
{
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<10;j++)
{
avg_sc[i]+=score[j][i];
}
}
for(i=0;i<5;i++)
{
avg_sc[i]=avg_sc[i]/10;
}
}
void max_score()
{
int i=0,j=0 ,max_score=j,max_stu=i;
float max=score[0][0];
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
if(max<score[i][j])
{
max=score[i][j];
max_score=j;
max_stu=i;
}
}
}
printf("%5.2f是最高分,它是第%d个学生的第%d门课程的成绩!\n",max,max_stu+1,max_score+1);
}
float s_diff()//求方差
{
int i;
float sumx,sumxn;
sumx=0.0;
sumxn=0.0;
for(i=0;i<10;i++)
{
sumx+=avg_st[i]*avg_st[i];
sumxn+=avg_st[i];
}
return (sumx/10-(sumxn/10)*(sumxn/10));
}
int main()
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
printf("请输入第%d个学生的第%d门成绩:\n",i+1,j+1);
scanf("%f",&score[i][j]);
}
}
avg_stu();
for(i=0;i<10;i++)
{
printf("第%d个学生的平均成绩是%5.2f\n",i+1,avg_st[i]);
}
avg_score();
for(i=0;i<5;i++)
{
printf("第%d门课程的平均成绩是%5.2f\n",i+1,avg_sc[i]);
}
max_score();
return 0;
}
*/