C++作业,急啊,帮帮忙
以前上课没用心,现在要交才急了,求帮忙
1.用C语言编写一个程序实现学员成绩管理,每个学员包括3门课的成绩。从键盘输入学员信息,包括学号.姓名.三门课成绩,按照学员平均成绩由大到小排序。
2.插入功能:在排序后的学员成绩表中插入一个学员的信息,要求插入后仍然保持成绩表原有排序。
3.删除功能:要求输入指定的学号,从学员信息表中删除该学员,删除后的成绩表保持原有的排序。
[解决办法]
- _ -!!本来以为很快就能写完,结果写了3个小时,~~代码发下面了。
- C/C++ code
#include<stdio.h>#include <stdlib.h>#include<string.h>typedef struct inform{ long int snum; char name[20]; int ascore; int bscore; int cscore;}inform;typedef struct student{ inform data; struct student *next;}stu,*PStu;void IniList(PStu *St) /*初始化*/{ *St=(PStu)malloc(sizeof(student)); (*St)->next=*St;}void Create_List(PStu St) /*尾插法建立学生链表*/{ student *s; int n=0; long int snum; char name[20]; int ascore; int bscore; int cscore; int flag=1; printf("请输入学生信息(按ctrl+z结束输入):\n"); while(flag) { printf("请输入第%d个同学的学号:",n+1); if(scanf("%ld",&snum)==EOF){break;} printf("请输入第%d个同学的姓名:",n+1); if(scanf("%s",&name)==EOF){break;} printf("请输入第%d个同学的第一门成绩:",n+1); if(scanf("%d",&ascore)==EOF){break;} printf("请输入第%d个同学的第二门成绩:",n+1); if(scanf("%d",&bscore)==EOF){break;} printf("请输入第%d个同学的第三门成绩:",n+1); if(scanf("%d",&cscore)==EOF){break;} s=(student *)malloc(sizeof(stu)); s->data.snum=snum; strcpy(s->data.name,name); s->data.ascore=ascore; s->data.bscore=bscore; s->data.cscore=cscore; s->next=St->next; St->next=s; n=n+1; } St->data.snum=n;}void printfStu(PStu St){ student *p,*q; long int snum; char name[20]; int ascore; int bscore; int cscore; p=q=St; for(p=St->next;p->next!=St;p=p->next) { for(q=p->next;q!=St;q=q->next) { if((p->data.ascore+p->data.bscore+p->data.cscore)<(q->data.ascore+q->data.bscore+q->data.cscore)) { snum=q->data.snum; q->data.snum=p->data.snum; p->data.snum=snum; strcpy(name,q->data.name); strcpy(q->data.name,p->data.name); strcpy(p->data.name,name); ascore=q->data.ascore; q->data.ascore=p->data.ascore; p->data.ascore=ascore; bscore=q->data.bscore; q->data.bscore=p->data.bscore; p->data.bscore=bscore; cscore=q->data.cscore; q->data.cscore=p->data.cscore; p->data.cscore=cscore; } } } p=St; printf("学员平均成绩由大到小排序\n"); printf("--------------------------------------------------\n"); for(int k=0;k<St->data.snum;k++) { p=p->next; printf("%ld %s %d %d %d\n",p->data.snum,p->data.name,p->data.ascore,p->data.bscore,p->data.cscore); } printf("--------------------------------------------------\n");}void deleteStu(PStu St){ student *s,*p; long int snum; int n; printf("请输入想要删除学生的学号:"); scanf("%ld",&snum); getchar(); p=s=St; n=St->data.snum; while(s->next!=St) { if(s->next->data.snum==snum) { printf("找到学号为%s的学生\n",s->next->data.name); s->next=s->next->next; St->data.snum--; } else{s=s->next;} } if(n==St->data.snum) { printf("对不起,未找到您所要删除的学生学号!\n"); } else printf("删除成功!\n"); printf("此时学员平均成绩由大到小排序为\n"); printf("--------------------------------------------------\n"); for(int k=0;k<St->data.snum;k++) { p=p->next; printf("%ld %s %d %d %d\n",p->data.snum,p->data.name,p->data.ascore,p->data.bscore,p->data.cscore); } printf("--------------------------------------------------\n");}void insertStu(PStu St){ long int snum; char name[20]; int ascore; int bscore; int cscore; student *s; printf("请输入该同学的学号:"); scanf("%ld",&snum); printf("请输入该同学的姓名:"); scanf("%s",&name); printf("请输入该同学的第一门成绩:"); scanf("%d",&ascore); printf("请输入该同学的第二门成绩:"); scanf("%d",&bscore); printf("请输入该同学的第三门成绩:"); scanf("%d",&cscore); getchar(); s=(student *)malloc(sizeof(stu)); s->data.snum=snum; strcpy(s->data.name,name); s->data.ascore=ascore; s->data.bscore=bscore; s->data.cscore=cscore; s->next=St->next; St->next=s; St->data.snum++; printf("插入成功!\n");}main(){ PStu St; char c; IniList(&St); Create_List(St); printfStu(St); while(1){ printf("请输入您现在想要的操作:d代表删除指定学号的学生,i代表插入学生成绩,p代表按平均成绩打印学生成绩,q退出\n\n"); scanf("%c",&c); while(getchar() != '\n'); switch(c){ case 'd' : deleteStu(St); break; case 'i' : insertStu(St); break; case 'p' : printfStu(St); break; case 'q' : return 0; default : printf("非法指令,您输入的是%c\n",c); } }}