小杰R 2019-12-19 18:58 采纳率: 0%
浏览 802

实验是数据结构中做一个学生成绩管理系统,在网上找到了相应代码,但是不知道怎么插入学生信息,希望大佬帮助完成这个课题

#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(address,"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)math)english) {
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;
int t;
for(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) //直接插入排序
{
int k;
for(k=2;k<=n;++k)
{
if(L.r[k].totalgrade {
L.r[0]=L.r[k];
L.r[k]=L.r[k-1];
int j;
for(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;
int k;
for(k=2;k {
L.r[0]=L.r[k];
int low=1,high=k-1;
while(low {
m=(low+high)/2;
if(L.r[0].totalgrade high=m-1;
else
low=m+1;
}
int j;
for(j=k-1;j>=high+1;--j)
L.r[j+1]=L.r[j];
L.r[high+1]=L.r[0];
}
}
int q;
for(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) //
{
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();
}

姓名 学号 语文 数学 英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47

姓名 学号 语文 数学 英语
陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-12-20 09:12
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题