一个工程练习:
创建一个工程,工程中添加三个.c和三个.h文件,一个main.c和main.h,一个function.c和function.h实现三个数的加减乘除求余的函数,一个test.c和test.h用结构体{学生的学号,学生的姓名,学生的成绩},在test.c中实现按名字排序的函数,根据学号查找成绩的函数,以及求平均分的函数,在该工程中要求把打印信息按文件:行号:日期:时间,打印到一个log文件中,要求使用static extern
main.c
#include<stdio.h>
#include"test.h"
#include"main.h"
int index = 0;
extern STU stu[N];
int main()
{
insert(stu);
printf("排序前:\n");
print(stu);
sort(stu);
printf("排序后:\n");
print(stu);
find(stu);
printf("平均分\n");
ave(stu);
void lo();
return 0;
}
test.c
#include"main.h"
#include"test.h"
#include"function.h"
#include<stdio.h>
#include<string.h>
extern int index;
STU stu[N];
void insert(STU *stu)
{
while(1)
{
if(index < N)
{
printf("请输入第%d位同学的学号,名字,语文、数学、英语成绩(用空格隔开):\n", index + 1);
scanf("%d%s%f%f%f", &stu[index].id, stu[index].name, &stu[index].score.Chinese, &stu[index].score.Math, &stu[index].score.English);
index++;
printf("是否继续?(y/n)\n");
char ch = '0';
getchar();
ch = getchar();
if(ch == 'n')
{
break;
}
}
else
{
printf("信息已满\n");
break;
}
}
}
void sort(STU *stu)
{
STU temp;
for(int i = 0; i < index; i++)
{
for(int j = 0; j < index - i - 1; j++)
{
if(strcmp(stu[j].name, stu[j+1].name) > 0)
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
}
void print(STU *stu)
{
for(int i = 0; i < index; i++)
printf("%d, %s, %.1f, %.1f, %.1f\n", stu[i].id, stu[i].name, stu[i].score.Chinese, stu[i].score.Math, stu[i].score.English);
}
void find(STU *stu)
{
int num;
printf("请输入你要查找的学号:\n");
scanf("%d", &num);
int flag = 0;
for(int i = 0; i < index; i++)
{
if(num == stu[i].id)
{
printf("%d, %s, %.1f, %.1f, %.1f\n", stu[i].id, stu[i].name, stu[i].score.Chinese, stu[i].score.Math, stu[i].score.English);
flag = 1;
break;
}
}
if(flag == 0)
{
printf("没有找到该学号!\n");
}
}
void ave(STU *stu)
{
float chinese = 0;
float math = 0;
float english = 0;
for(int i = 0; i < index; i++)
{
chinese += stu[i].score.Chinese;
math += stu[i].score.Math;
english += stu[i].score.English;
}
printf("语文平均成绩:%.1f\n数学平均成绩:%.1f\n英语平均成绩:%.1f\n", chinese / index, math / index, english / index);
}
void lo()
{
FILE *pf=freopen("./log.txt","w+",stdout);
if(pf==NULL)
{
printf("error");
}
printf("文件名:%s 文件日期:%s 文件编译时间:%s 文件行号:%d",__FILE__,__DATE__,__TIME__,__LINE__);
fclose(pf);
}
static:
(1)先来介绍它的第一条也是最重要的一条:隐藏
当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性。
如果加了 static,就会对其它源文件隐藏。
(2)static 的第二个作用是保持变量内容的持久。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量比起来,static 可以控制变量的可见范围。
(3)static 的第三个作用是默认初始化为 0。
extern:
extern 用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。当有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。
register:
register 用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小。寄存器只用于需要快速访问的变量。定义register并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。
1587

被折叠的 条评论
为什么被折叠?



