很简单的大一学生的作业,有问题问我,我不懂C,求助万能的WEB,哪位热心朋友帮忙修改修改:
(题目 学生成绩管理 实现功能:输入、输出、插入、删除、查找、追加、读入、显示、保存、拷贝、排序、索引、分类合计、退出。)
代码:
#include <stdio.h> /*I/O函数*/ #include <stdlib.h> /*其它说明*/ #include <string.h>/*字符串函数*/ #include <conio.h> /*屏幕操作函数*/ #include <mem.h> /*内存操作函数*/ #include<iostream> #include <ctype.h> /*字符操作函数*/ #define N 3 /*定义常数*/ typedef struct z1 /*定义数据结构*/ { char name[15]; char num[15]; int score[3]; float sum; float average; int order; struct z1 *next; } STUDENT; /*以下是函数原型*/ STUDENT *init(); /*初始化函数*/ void creat(int n,STUDENT *h); /*创建链表*/ void Delete(STUDENT *h); /*删除记录*/ void print(STUDENT *h); /* 显示所有记录*/ void search(STUDENT *h); /*查找*/ void save(char fileName[]); /*保存*/ void open();/*打开文件*/ STUDENT *load(); /*读入记录*/ void computer(STUDENT *h); /*计算总分和均分*/ void insert(STUDENT *h); /*插入记录*/ void append(); /*追加记录*/ void copy(); /*复制文件*/ STUDENT *sort(STUDENT *h); /*排序*/ STUDENT *index(STUDENT *h); /*索引*/ void total(STUDENT *h); /*分类合计*/ /******主函数开始*******/ int main() { int n; char path[30]; STUDENT *head,*p,*z,*q1; //用于保存头结点的地址 printf("请输入文件的存储路径:\n"); scanf("%s",path); printf("请输入学生的个数:\n"); scanf("%d",&n);//输入学生的个数 save(path,n);//将键盘输入的学生信息存入在文本文件 z=open();//从文件中得到相关的学生信息,并返回存放信息的数组的首地址 p=creat(n,z); q1=copy(p); head=init(); /*初始化链表*/ { do { printf(" ***********************************************************\n"); printf(" ~~~~~~~~~~~~~~~~~~欢迎光临学生成绩管理系统~~~~~~~~~~~~~~~~~\n"); printf(" ***************************^_^*****************************\n"); printf(" * 0.退出该操作系统 1.删除记录 *\n"); printf(" * 2.显示全部记录 3.查找记录 *\n"); printf(" * 4.保存文件 5.读取文件内容 *\n"); printf(" * 6.计算总分和均分 7.插入记录 *\n"); printf(" * 8.复制文件 9.以学生总分进行降序排序 *\n"); printf(" * 10.追加记录 11.以学生姓名进行索引 *\n"); printf(" * 12.分类合计 *\n"); printf(" ***********************************************************\n"); printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf(" ***********************************************************\n"); printf(" **请输入您需要进行的操作**:"); scanf("%d",&n); system("cls"); switch(n) { case 0: printf(" ************************************************************\n"); printf(" ~~~~~~~~~~~~~~退出学生成绩管理系统,感谢使用!~~~~~~~~~~~~~~\n"); printf(" ************************************************************\n"); exit(0); case 1: printf("您选择的操作是:删除记录"); Delete(head); system("cls"); break; case 2: printf("您选择的操作是:显示全部记录"); print(head); break; case 3: printf("您选择的操作是:查找记录"); search(head); break; case 4: printf("您选择的操作是:保存文件"); save(); system("pause"); system("cls"); break; case 5: printf("您选择的操作是:读取文件内容"); head=load(); break; case 6: printf("您选择的操作是:计算总分和均分"); computer(head); break; case 7: printf("您选择的操作是:插入记录"); insert(head); system("cls"); break; case 8: printf("您选择的操作是:复制文件"); copy(); break; case 9: printf("您选择的操作是:以学生总分进行降序排序"); head=sort(head); break; case 10: printf("您选择的操作是:追加记录"); append(); break; case 11: printf("您选择的操作是:以学生姓名进行索引"); head=index(head); break; case 12: printf("您选择的操作是:分类合计"); total(head); break; } } while(1); } return 0; } STUDENT *init() { return NULL; } void inputs(char *prompt, char *s, int count)/*输入字符串,并进行长度验证*/ { char p[255]; do { //printf(prompt); /*允鞠提示信息*/ scanf("%s",p); /*输入字符串*/ if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/ } while(strlen(p)>count); strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/ } void creat(int n,STUDENT *h) { h=(STUDENT*)malloc(sizeof(STUDENT)); STUDENT *p,*q; char m=' '; h->next=NULL; q=h; while(m==' ') { p=(STUDENT*)malloc(sizeof(STUDENT)); scanf("%s%s%d%d%d%c",p->name,p->num,&p->score[0],&p->score[1],&p->score[2],&m); p->average=(p->score[0]+p->score[1]+p->score[2])/3; q->next=p; q=p; } q->next=NULL; } void print(char fileName[])/*输出链表中结点信息*/ { FILE *pFile; int i=0; /* 统计记录条数*/ STUDENT *p; /*移动指针*/ system("cls"); /*清屏*/ //p=h; /*初值为头指针*/ printf("\n\n\n****************************STUDENT********************************\n"); printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理"); printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n"); if((pFile=fopen(fileName,"rb"))==NULL) { printf("打开文件%s失败!""\n敲击任意键退出!\n",fileName); system("PAUSE"); exit(1); } //printf("\n\n%8s显示学生信息\n",""); //printf("\n","编号","学号","数学","英语","物理"); for(i=0;i<N;i++) { fscanf(pFile,"%-10s%-10d%-10d%-10d%-10d%",p->name,p->num,&p->score[0],&p->score[1],&p->score[2]); if(ferror(pFile)!=0) { clearerr(pFile); printf("文件写操作出错!""\n敲击任意键退出!\n"); system("PAUSE"); exit(1); } printf("%-10s%-10s%-10d%-10d%-10d%",p->name,p->num,&p->score[0],&p->score[1],&p->score[2]); } fclose(pFile); printf("**********************************end*********************************\n"); } void Delete(STUDENT *h)/*删除记录*/ { STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/ char s[11]; /*存放学号*/ printf("请输入要删除学生的学号\n"); /*显示提示信息*/ scanf("%s",s); /*输入要删除记录的学号*/ q=p=h; /*给q和p赋初值头指针*/ while(strcmp(p->num,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/ { q=p; /*将p指针值赋给q作为p的前驱指针*/ p=p->next; /*将p指针指向下一条记录*/ } if(p==NULL) /*如果p为空,说明链表中没有该结点*/ printf("\nlist no %s student\n",s); else /*p不为空,显示找到的记录信息*/ { printf("*****************************have found***************************\n"); printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理"); printf("|----------|---------------|----|----|----|--------|-------|-----|\n"); printf("%-10s%-10d%-10.1d%-10.1d%-10.1d\n",p->name,p->num,p->score[0],p->score[1],p->score[2]); printf("********************************end*******************************\n"); getch(); /*压任一键后,开始删除*/ if(p==h) /*如果p==h,说明被删结点是头结点*/ h=p->next; /*修改头指针指向下一条记录*/ else q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/ free(p); /*释放p所指结点空间*/ printf("\n 已经删除学号为%s的学生\n",s); printf("不要忘记保存文件\n");/*提示删除后不要忘记保存文件*/ } //return(h); /*返回头指针*/ } void search(STUDENT*h)/*查找记录*/ /*当记录的姓名不是要找的,或指针不为空时*/ { STUDENT *p; char s[15]; /*存放姓名的字符数组*/ p=p->next; /*移动指针,指向下一结点*/ if(p==NULL) /*如果指针为空*/ printf("\n没有叫%s的学生\n",s); /*显示没有该学生*/ else /*显示找到的记录信息*/ { //printf (*h) { STUDENT *p; /* 移动指针*/ system("cls"); /*清屏幕*/ printf("请输入要查找学生的姓名\n"); scanf("%s",s); /*输入姓名*/ p=h; /*将头指针赋给p*/ while(strcmp(p->name,s)&&p!=NULL) printf("\n\n*****************************havefound***************************\n"); printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理"); printf("|----------|---------------|----|----|----|--------|-------|-----|\n"); printf("%-10s%-10d%-10d%-10d%-10d\n", p->name,p->num,p->score[0],p->score[1],p->score[2]); printf("********************************end*******************************\n"); } } } void insert(STUDENT *h) { STUDENT *p1,*p2,*p3,*student; char Name[20]; int order; student=(STUDENT*)malloc(sizeof(STUDENT)); p1=h; p2=h->next; printf("请输入插入的学生与哪个学生相邻\n"); scanf("%s",Name); while(p2) { if(!strcmp(p2->name,Name)) { break; } else { p1=p1->next; p2=p2->next; } } p3=p2->next; printf("请输入插在该学生的1:前面 2:后面\n"); scanf("%d",&order); if(order==1) { printf("请输入带插入的学生的信息\n"); printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理"); scanf("%-10s%-10d%-10d%-10d%-10d\n",student->name,student->num,student->score[0],student->score[1],student->score[2]); p1->next=student; student->next=p2; } else { printf("请输入带插入的学生的信息\n"); printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理"); scanf("%-10s%-10d%-10d%-10d%-10d\n",student->name,student->num,student->score[0],student->score[1],student->score[2]); p2->next=student; student=p3; } } void save(char fileName[]) { FILE *pFile; /*源和目标文件指针*/ STUDENT *p=NULL; /*移动指针*/ system("cls");/*清屏*/ int i; if((pFile=fopen(fileName,"wb"))==NULL) /*二进制读方式打开源文件*/ { printf("打不开文件\n"); system("PAUSE"); exit(1); } printf("%8s输入学生信息\n",""); printf("%-10s%-10s%-10.1f%-10.1f%-10.1f%\n","姓名","学号","数学","英语","物理"); for(i=0;i<N;i++) { scanf("%-10s%-10d%-10d%-10d%-10d\n",p->name,p->num,p->score[0],p->score[1],p->score[2]); fprintf(pFile,"%-10s%-10d%-10d%-10d%-10d\n",p->name,p->num,p->score[0],p->score[1],p->score[2]); if(ferror(pFile)) { clearerr(pFile); printf("文件写操作错误\n""敲击任意键退出\n"); system("PAUSE"); exit(1); } } fclose(pFile); } void append()/*追加记录到文件*/ { FILE *fp; /*定义指向文件的指针*/ STUDENT *info; /*新记录指针*/ int s1,i; char infile[10]; /*保存文件名*/ printf("\nplease new record\n"); info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!info) { printf("\n没有申请到内存"); /*没有申请到,内存溢出本函数结束*/ return ; } inputs("输入学号:",info->num,11); /*调用inputs输入学号*/ inputs("输入姓名:",info->name,15); /*调用inputs输入姓名*/ printf("输入成绩:%d\n",3); /*提示输入成绩*/ s1=0; printf("%-10s%-10s%-10.1f%-10.1f%-10.1f%\n","姓名","学号","数学","英语","物理"); for(i=0; i<3; i++) { do { scanf("%-10s%-10d%-10.1d%-10.1d%-10.1d%",info->name,&info->num,&info->score[0],&info->score[1],&info->score[2]); if(info->score[i]>100||info->score[i]<0)printf("bad data,repeat input\n"); } while(info->score[i]<100||info->score[i]<0); /*成绩数据验证*/ s1=s1+info->score[i]; /*求总分*/ } info->sum=s1; /*保存总分*/ info->average=(float)s1/N; /*求均分*/ info->order=0; /*名次初始值为0*/ info->next=NULL; /*将新记录后继指针赋值为空*/ printf("请输入文件名\n"); scanf("%s",infile); /*输入文件名*/ if((fp=fopen(infile,"ab"))==NULL) /*向二进制文件尾增加数据方式打开文件*/ { printf("不能打开文件\n"); /*显示不能打开*/ exit(1); /*退出程序*/ } printf("\n -----Appending record!-----\n"); if(1!=fwrite(info,sizeof(STUDENT),1,fp)) /*写文件操作*/ { printf("-----file write error!-----\n"); return; /*返回*/ } printf("-----append sucess!!----\n"); fclose(fp); /*关闭文件*/ } void open(char fileName[])/*打开文件*/ { FILE *pFile; /*源和目标文件指针*/ STUDENT *p=NULL; /*移动指针*/ system("cls");/*清屏*/ int i; if((pFile=fopen(fileName,"wb"))==NULL) /*二进制读方式打开源文件*/ { printf("can not open open file\n"); system("PAUSE"); exit(1); } } void copy()/*文件拷贝*/ { char outfile[10],infile[10]; FILE *sfp,*tfp; /*源和目标文件指针*/ STUDENT *p=NULL; /*移动指针*/ system("cls"); /*清屏*/ printf("Enter infile name"); scanf("%s",infile); if((sfp=fopen(infile,"rb"))==NULL) /*二进制读方式打开源文件*/ { printf("can not open input file\n"); exit(0); } printf("Enter outfile name"); scanf("%s",outfile); if((tfp=fopen(outfile,"wb"))==NULL) /*二进制写方式打开目标文件*/ { printf("can not open output file \n"); exit(0); } while(!feof(sfp)) /*读文件直到文件尾*/ { if(1!=fscanf(p,sizeof(STUDENT),1,sfp)) break; /*块读*/ fwrite(p,sizeof(STUDENT),1,tfp); /*块写*/ } fclose(sfp); /*关闭源文件*/ fclose(tfp); /*关闭目标文件*/ printf("you have success copy file!!!\n"); /*显示成功拷贝*/ } STUDENT *sort(STUDENT *h)/*排序*/ { int i=0; /*保存名次*/ STUDENT *p,*q,*t,*h1; /*定义临时指针*/ h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/ h->next=NULL; /*第一个结点为新表的头结点*/ while(h1!=NULL) /*当原表不为空时,进行排序*/ { t=h1; /*取原表的头结点*/ h1=h1->next; /*原表头结点指针后移*/ p=h; /*设定移动指针p,从头指针开始*/ q=h; /*设定移动指针q做为p的前驱,初值为头指针*/ while(t->sum<p->sum&&p!=NULL) /*作总分比较*/ { q=p; /*待排序点值小,则新表指针后移*/ p=p->next; } if(p==q) /*p==q,说明待排序点值大,应排在首位*/ { t->next=p; /*待排序点的后继为p*/ h=t; /*新头结点为待排序点*/ } else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/ { t->next=p; /*t的后继是p*/ q->next=t; /*q的后继是t*/ } } p=h; /*已排好序的头指针赋给p,准备填写名次*/ while(p!=NULL) /*当p不为空时,进行下列操作*/ { i++; /*结点序号*/ p->order=i; /*将名次赋值*/ p=p->next; /*指针后移*/ } printf("sort sucess!!!\n"); /*排序成功*/ return h; /*返回头指针*/ } void computer(STUDENT *h)/*计算总分和均值*/ { STUDENT *p; /*定义移动指针*/ int i=0; /*保存记录条数初值为0*/ long s=0; /*总分初值为0*/ float average=0; /*均分初值为0*/ p=h; /*从头指针开始*/ while(p!=NULL) /*当p不为空时处理*/ { s+=p->sum; /*累加总分*/ i++; /*统计记录条数*/ p=p->next; /*指针后移*/ } average=(float)s/i;/* 求均分,均分为浮点数,总分为整数,所以做类型转换*/ printf("\n--All students sum score is:%ld average is %5.2f\n",s,average); } STUDENT *index(STUDENT *h)/*索引*/ { STUDENT *p,*q,*t,*h1; /*定义临时指针*/ h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/ h->next=NULL; /*第一个结点为新表的头结点*/ while(h1!=NULL) /*当原表不为空时,进行排序*/ { t=h1; /*取原表的头结点*/ h1=h1->next; /*原表头结点指针后移*/ p=h; /*设定移动指针p,从头指针开始*/ q=h; /*设定移动指针q做为p的前驱,初值为头指针*/ while(strcmp(t->num,p->num)>0&&p!=NULL) /*作学号比较*/ { q=p; /*待排序点值大,应往后插,所以新表指针后移*/ p=p->next; } if(p==q) /*p==q,说明待排序点值小,应排在首位*/ { t->next=p; /*待排序点的后继为p*/ h=t; /*新头结点为待排序点*/ } else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/ { t->next=p; /*t的后继是p*/ q->next=t; /*q的后继是t*/ } } printf("index sucess!!!\n"); /*索引排序成功*/ return h; /*返回头指针*/ } void total(STUDENT *h)/*分类合计:及格的人数*/ { float x; int i;//符合条件的人数 STUDENT *p; printf("请输入指定平均分:"); scanf("%f",&x); printf("**运行结果如下**:\n"); p=h->next; printf("%-10s%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理","平均分"); while(p!=NULL) { if(p->average>=x) { printf("%-10s%-10d%-10.1f%-10.1f%-10.1f-10.1f\n",p->name,p->num,p->score[0],p->score[1],p->score[2],p->average); i++; } p=p->next; } printf("及格人数为:%d",i); printf("---------------------------------------------\n"); }
如果你要的话 我可以给你一个 功能基本上一样的 因为曾经我们那会也做过