百度自动换行过,你自己注意着看,这是哥自己刚写的
#include
#include
#include
char top[50]; //成绩文件顶部的标题用top保存
typedef struct student //单个学生成绩的记录
{
char name[10]; //姓名
int number; //学号
int chinese; //语文
int math; //数学
int english; //英语
struct student *next;
}student,*gradelist;
gradelist fileread(char *adress) //读取成绩文件
{
FILE * fp;
if((fp=fopen(adress,"r"))==NULL) //打开文件
{
printf("文件打开出错");
exit(0);
}
gradelist file=(student *)malloc(sizeof(student)); //申请空间
file->next=NULL;
student * p=file; //操作指针
int n=0; //循环标记,具体作用是在第一次循环时方便处理标题
while(!feof(fp))
{
if(n==0)
{
fgets(top,50,fp); //处理标题,并且文件指针移到第二行
}
if(n==1) //申请空间
{
(p->next)=(student *)malloc(sizeof(student));
p=p->next;
p->next=NULL;
}
fscanf(fp,"%s%d%d%d%d",p->name,&p->number,&p->chinese,&p->math,&p->english); //将文件的数据输入到链表中
n=1;
}
if(fclose(fp)) //关闭文件
{
printf("文件关闭失败");
exit(0);
}
return file;
}
void FilePrint(gradelist file) //将成绩文件打印到屏幕上
{
student *p=file;
printf("%s\n",top); //打印标题
while(p->next!=NULL)
{
printf("%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english); //循环打印
p=p->next;
}
}
void merger() //合并文件
{
char * address1="1.txt",*address2="2.txt",*address3="3.txt";
gradelist file1=fileread(address1),file2=fileread(address2);
FILE *fp;
if((fp=fopen("3.txt","w+"))==NULL) //先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面
{
printf("合并成绩文档失败,原因:建立文档出错");
exit(0);
}
student *p1=file1,*p2=file2;
fprintf(fp,"%s",top); //先输入标题
while(p1->next!=NULL)
{
fprintf(fp,"%6s %2d %d %d %d\n",p1->name,p1->number,p1->chinese,p1->math,p1->english); //输入1.txt
p1=p1->next;
}
while(p2->next!=NULL)
{
fprintf(fp,"%6s %2d %d %d %d\n",p2->name,p2->number,p2->chinese,p2->math,p2->english); //输入2.txt
p2=p2->next;
}
if(fclose(fp))
{
printf("文件关闭失败");
exit(0);
}
}
void extract() //抽取补考的成绩记录
{
char * address4="4.txt",*address3="3.txt";
FILE *fp;
if((fp=fopen("4.txt","w+"))==NULL) //新建文件4.txt
{
printf("抽取补考学生成绩记录建立新文件失败");
exit(0);
}
gradelist file3=fileread(address3);
student *p=file3;
fprintf(fp,"%s",top); //先输入标题
while(p->next!=NULL)
{
if((p->chinese)<60||(p->math)<60||(p->english)<60) //补考条件
{
fprintf(fp,"%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english);
}
p=p->next;
}
if(fclose(fp))
{
printf("文件关闭失败");
exit(0);
}
}
void sort(int i)
{
char * address3="3.txt";
gradelist file3=fileread(address3); //先将3.txt读入链表
student *p=file3;
if(remove("3.txt")) //由于排序后的内容也要保存到3.txt,故删除3.txt
{
printf("删除文件出错");
exit(0);
}
int n=0; //学生个数
FILE *fp;
if((fp=fopen("3.txt","w+"))==NULL) //新建一个空的3.txt
{
printf("新建文件出错");
exit(0);
}
fprintf(fp,"%s",top); //标题先输入
while(p->next!=NULL)
{
n++;
p=p->next;
}
typedef struct //链表不容易操作,故而新建一个结构数组
{
int totalgrade;
char name[10];
int number;
int chinese;
int math;
int english;
}gradenote; //成绩记录
typedef struct
{
gradenote r[100]; //只初始化了100了空间,学生人数超过100就不能了,懒得动态分配了
}grade_list; //待排序成绩表
grade_list L;
p=file3;
for(int t=1;t<=n;t++,p=p->next) //将链表的内容复制到结构数组里
{
strcpy(L.r[t].name,p->name);
L.r[t].number=p->number;
L.r[t].chinese=p->chinese;
L.r[t].math=p->math;
L.r[t].english=p->english;
L.r[t].totalgrade=p->chinese+p->math+p->english;
}
if(i==1) //直接插入排序,具体思想参考《数据结构》,严蔚敏主编
{
for(int k=2;k<=n;++k)
{
if(L.r[k].totalgrade
L.r[0]=L.r[k];
L.r[k]=L.r[k-1];
for(int j=k-2;L.r[0].totalgrade
L.r[j+1]=L.r[j];
}
L.r[j+1]=L.r[0];
}
}
}
if(i==2) //折半插入排序,参考同上
{
int m;
for(int k=2;k<=n;++k)
{
L.r[0]=L.r[k];
int low=1,high=k-1;
while(low<=high)
{
m=(low+high)/2;
if(L.r[0].totalgrade
else
low=m+1;
}
for(int j=k-1;j>=high+1;--j)
L.r[j+1]=L.r[j];
L.r[high+1]=L.r[0];
}
}
for(int q=n;q>=1;q--) //将排序好的内容输入到3.txt
{
fprintf(fp,"%6s %2d %d %d %d\n",L.r[q].name,L.r[q].number,L.r[q].chinese,L.r[q].math,L.r[q].english);
}
if(fclose(fp))
{
printf("文件关闭失败");
exit(0);
}
}
void search(char *name) //按姓名查找,只采用一种方法,如果变成有序表倒可以再采用一种,但舍本逐末
{
gradelist file=fileread("3.txt");
student * p=file;
while(p->next!=NULL)
{
if(strcmp(name,p->name)==0)
{
printf("%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english);
return;
}
p=p->next;
}
printf("查无此人,请确定名字输入正确\n");
exit(0);
}
void main(void) //本代码由武汉工业学院计科09级,百度ID 轻盈流飞雪 所编,转载注明,完成作业请删除此句,不懂勿问,哥很忙
{
int chioce;
gradelist file1=fileread("1.txt"),file2=fileread("2.txt");
printf("现有成绩记录文件1\n");
printf("*********************************************************\n");
FilePrint(file1);
printf("*********************************************************\n");
printf("现有成绩记录文件2\n");
printf("*********************************************************\n");
FilePrint(file2);
printf("*********************************************************\n");
printf("第一步,合并成绩记录文件\n");
merger();
printf("合并成功\n");
system("PAUSE");
printf("现有合并后的成绩记录文件3\n");
printf("*********************************************************\n");
gradelist file3=fileread("3.txt");
FilePrint(file3);
printf("*********************************************************\n");
printf("第二步,抽取补考成绩记录\n");
extract();
system("PAUSE");
printf("现有补考成绩记录文件4\n");
printf("*********************************************************\n");
gradelist file4=fileread("4.txt");
FilePrint(file4);
printf("*********************************************************\n");
printf("第三步,对文件3进行排序\n");
printf("请输入排序方式(1/2)\n1:直接插入排序\n2:折半插入排序\n");
scanf("%d",&chioce);
if(chioce==1)
sort(1);
else if(chioce==2)
sort(2);
else
{
printf("输入不合理,程序默认采用1方式\n");
sort(1);
}
file3=fileread("3.txt");
printf("现有按总分降序的成绩记录3\n");
printf("*********************************************************\n");
FilePrint(file3);
printf("*********************************************************\n");
printf("第四步,查找学生信息\n");
char name[100];
printf("请输入学生姓名\n");
scanf("%s",name);
search(name);
printf("按任意键结束程序\n");
getchar();
}