求高手帮助完成我的c语言程序设计。课程管理

学生成绩管理
编写一个程序来管理学生成绩,本系统能实现以下功能:
输入信息:学生学号、姓名、以及各门课程成绩的输入,要求至少三门课程成绩;计算学生的总成绩和平均分;
修改信息:对学生学号、姓名以及各门课程成绩进行修改;
增加信息:添加新学生信息
插入信息:在指定位置插入学生信息
删除信息:删除指定学生的信息
查询:根据姓名查询某个学生的成绩:根据学号区间查询某些学生的成绩;根据课程编号或名称查询某门课程的成绩
排序:根据要求,能按学生的学号、姓名、总分或者平均分分别进行升序和降序排序,并显示排序后的结果。
统计:根据课程编号或名称、学生总成绩总分或者平均分统计出不同分数段的学生人数和百分比;
输出:输出所有学生的信息或是查询信息的结果。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
#define COURSE 5
char filename[81] = {0};
int updated;
typedef struct Student {
char Sex[10];
char Name[20];
unsigned Num;
double Grades[COURSE + 2];//语文、数学、英语、C语言、体育、总成绩、平均成绩
struct Student *next;
}*LinkList,*NODE;
LinkList head = NULL;
char subjects[COURSE + 2][8] = {"语文","数学","英语","C语言","体育","总分","平均分"};
void Menu(void);
void CreateList(void);
void Sort(void);
void Search(void);
void Tongji(void);
void Insert(void);
void Modify(void);
void Delete(void);
void ShowAll(void);
void SaveData(void);
char *CppPath(char s[]);
char *FmtName(char *name);
void ShowTitle(void);
void ShowLine(void);
void ShowNode(NODE p);
void FreeList(void);
void Menu(void) {
int choose;
do {
system("cls"); //DOS命令,清屏
printf("\n");
printf("***********************************************************\n");
printf(" XXXXXXX大学欢迎你\n\n");
printf(" 学生成绩信息管理系统\n");
printf("***********************************************************\n");
printf("\n\n");
printf("\t\t 1.读数据文件\n");
printf("\t\t 2.排序\n");
printf("\t\t 3.统计\n");
printf("\t\t 4.查找\n");
printf("\t\t 5.插入\n");
printf("\t\t 6.修改\n");
printf("\t\t 7.删除\n");
printf("\t\t 8.显示\n");
printf("\t\t 9.数据存盘\n");
printf("\t\t 10.退出\n");
printf("\n\n");
printf("请选择您需要的操作,输入相关数字 : ");
scanf("%d",&choose);
switch(choose) {
case 1 : CreateList();break;
case 2 : Sort();break;
case 3 : Tongji();break;
case 4 : Search();break;
case 5 : Insert();break;
case 6 : Modify();break;
case 7 : Delete();break;
case 8 : ShowAll();system("pause");break;
case 9 : SaveData();break;
default: break;
}
}while(choose != 10);
}
void ReadData(NODE p) {
int i;
double sum = 0.0;
printf("请输入姓名:");
scanf("%s",p->Name);
strcpy(p->Name,FmtName(p->Name));
printf("请输入学号:");
scanf("%d",&p->Num);
printf("请输入性别:");
scanf("%s",p->Sex);
p->Grades[COURSE] = 0.0;
for(i = 0;i < COURSE; ++i) {
printf("%s成绩(0 ~ 100) = ",subjects[i]);
scanf("%lf",&p->Grades[i]);
p->Grades[COURSE] += p->Grades[i];
}
p->Grades[COURSE + 1] = p->Grades[COURSE]/COURSE;
}
void CreateList(void) { // 创建链表
FILE *fp;
double sum = 0.0;
NODE p;
int i;
updated = 1;
printf("请输入文件名 : ");
scanf("%s",filename);
fp = fopen(CppPath(filename),"rb");
if(fp == NULL) {
printf("打开文件%s出错。\n",filename);
exit(1);
}
if(head) for(p = head; p->next; p = p->next);
else head = p = (LinkList)malloc(sizeof(Student));
printf("请输入学生信息:\n");
for(i = 0;i < N;i++) {
p->next = (LinkList)malloc(sizeof(Student));
fread(p->next,sizeof(Student),1,fp);
p = p->next;
}
p->next = NULL;
fclose(fp);
}
void SaveData(void) {
FILE *fp;
NODE p;
if(head == NULL) {
printf("信息尚未建立,存盘操作失败。\n");
return;
}
if(filename[0] = '\0') {
printf("请输入文件名 : ");
scanf("%s",filename);
strcpy(filename,CppPath(filename));
}
fp = fopen(CppPath(filename),"wb");
if(fp == NULL) {
printf("打开文件%s出错。\n",filename);
exit(1);
}
for(p = head->next; p; p = p->next)
fwrite(p,sizeof(Student),1,fp);
fclose(fp);
updated = 0;
}
void ShowLine(void) {
int i;
for(i = 0; i < 67; ++i) printf("*");
printf("\n");
}
char *CppPath(char s[]) {
char *q,*p = s;
int len = strlen(s);
while(*p) {
if(*p == '\\' && *(p + 1) != '\\') {
for(q = s + len; q > p; --q)
*(q + 1) = *q;
*(q + 1) = '\\';
++len;
p += 2;
}
else ++p;
}
return s;
}
char *FmtName(char *name) {
int len = strlen(name);
char *p = name;
if(len > 6) name[6] = '\0';
else if(len == 4) {
name[6] = name[4];
name[5] = name[3];
name[4] = name[2];
name[2] = name[3] = ' ';
}
return name;
}
void ShowTitle(void) {
printf("姓 名 学 号 性别 语 文 数 学 英 语 体 育 C语 言 总 分 平均分\n");
}
void ShowNode(NODE p) {
int i;
printf("%6s %6d %4s ",p->Name,p->Num,p->Sex);
for(i = 0; i < COURSE + 2; ++i) printf("%6.2lf ",p->Grades[i]);
printf("\n");
}
void ShowAll(void) {
NODE p;
if(head == NULL) {
printf("信息尚未建立,请先《录入》。\n");
return;
}
ShowTitle();
ShowLine();
for(p = head->next; p; p = p->next)
ShowNode(p);
ShowLine();
}
void Search(void) { /* 查询学生 */
unsigned num,choose,flag;
char name[20];
NODE p;
if(head == NULL) {
printf("信息尚未建立,请先《录入》。\n");
return;
}
do {
system("cls");
printf("输入查询方式:\n1.按姓名查询\n2.按学号查询\n3.返回\n");
printf("请选择 : ");
scanf("%d",&choose);
if(choose == 1) { /* 按姓名查询 */
flag = 1; // 没找到
printf("请你输入要查找的姓名:");
scanf("%s",name);
strcpy(name,FmtName(name));
for(p = head->next; p; p = p->next) {
if(strcmp(p->Name,name) == 0) {
ShowTitle();
ShowLine();
ShowNode(p);
ShowLine();
flag = 0; // 已找到
break;
}
}
if(flag) printf("(没找到姓名为\"%s\"的学生。)\n",name);
}
else if(choose == 2) { // 按学号查询
flag = 1; // 没找到
printf("请你输入要查找的学号:");
scanf("%d",&num);
for(p = head->next; p; p = p->next) {
if(p->Num == num) {
ShowTitle();
ShowLine();
ShowNode(p);
ShowLine();
flag = 0; // 已找到
break;
}
}
if(flag) printf("(没找到学号为\"%d\"的学生。)\n",num);
}
}while(choose != 3);
}
void Delete(void) { /* 删除学生 */
unsigned an,num,choose,flag;
char name[20];
NODE p,q;
if(head == NULL) {
printf("信息尚未建立,请先《录入》。\n");
return;
}
updated = 1;
do {
system("cls");
printf("输入方式:\n1.指定姓名\n2.指定学号\n3.返回\n");
printf("请选择 : ");
scanf("%d",&choose);
if(choose == 1) { /* 指定姓名 */
flag = 1; // 没找到
printf("请你输入要删除学生的姓名:");
scanf("%s",name);
strcpy(name,FmtName(name));
for(p = head; p->next; p = p->next) {
if(strcmp(p->next->Name,name) == 0) {
ShowTitle();
ShowLine();
ShowNode(p->next);
ShowLine();
printf("确认要删除吗: 1.删除,2.不删除");
scanf("%d",&an);
if(an == 1) {
q = p->next;
p->next = q->next;
free(q);
}
flag = 0; // 已找到
break;
}
}
if(flag) printf("(没找到姓名为\"%s\"的学生。)\n",name);
}
else if(choose == 2) { // 指定学号
flag = 1; // 没找到
printf("请你输入要删除学生的学号:");
scanf("%d",&num);
for(p = head; p->next; p = p->next) {
if(p->next->Num == num) {
ShowTitle();
ShowLine();
ShowNode(p);
ShowLine();
printf("确认要删除吗: 1.删除,2.不删除");
scanf("%d",&an);
if(an == 1) {
q = p->next;
p->next = q->next;
free(q);
}
flag = 0; // 已找到
break;
}
}
if(flag) printf("(没找到学号为\"%d\"的学生。)\n",num);
}
}while(choose != 3);
}
void Modify(void) {
int flag,choose;
char name[20];
NODE p;
if(head == NULL) {
printf("信息尚未建立,请先《录入》。\n");
return;
}
updated = 1;
do {
system("cls");
ShowAll();
flag = 1; // 没找到
printf("请你输入要修改的姓名:");
scanf("%s",name);
strcpy(name,FmtName(name));
for(p = head->next; p; p = p->next) {
if(strcmp(p->Name,name) == 0) {
ShowTitle();
ShowLine();
ShowNode(p);
ShowLine();
flag = 0; // 已找到
ReadData(p);
break;
}
}
if(flag) printf("(没找到姓名为\"%s\"的学生。)\n",name);
printf("1.继续修改 0.返回\n");
scanf("%d",&choose);
}while(choose != 1);
}
void Sort(void) {
int i,choose;
NODE q,p,pt;
if(head == NULL) {
printf("信息尚未建立,请先《录入》。\n");
return;
}
updated = 1;
do {
system("cls");
printf("排序分类:\n");
printf("1.姓名升排序\n2.学号升排序\n3.语文降排序\n4.数学降排序\n5.英语降排序\n");
printf("6.C语言降排序\n7.体育降排序\n8.总成绩降排序\n9.平均成绩降排序\n10.返回\n");
scanf("%d",&choose);
switch(choose) {
case 1 : p = head;
while(p->next) {
q = p->next;
while(q->next) {
if(strcmp(p->next->Name,q->next->Name) > 0) {
pt = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = pt;
}
else q = q->next;
}
p = p->next;
}
break;
case 2 : p = head;
while(p->next) {
q = p->next;
while(q->next) {
if(p->next->Num > q->next->Num) {
pt = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = pt;
}
else q = q->next;
}
p = p->next;
}
break;
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 : i = choose - 3;
p = head;
while(p->next) {
q = p->next;
while(q->next) {
if(p->next->Grades[i] < q->next->Grades[i]) {
pt = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = pt;
}
else q = q->next;
}
p = p->next;
}
break;
}
}while(choose != 10);
}
void Insert(void) { // 可以用来创建链表
int choose;
NODE q;
if(head != NULL) ShowAll();
else {
system("cls");
head = (LinkList)malloc(sizeof(Student));
q = (LinkList)malloc(sizeof(Student));
ReadData(q);
head->next = q;
q->next = NULL;
}
updated = 1;
do {
system("cls");
ShowAll();
q = (LinkList)malloc(sizeof(Student));
ReadData(q);
q->next = head->next;
head->next = q;
printf("1.继续 0.返回 : ");
scanf("%d",&choose);
}while(choose == 1);
}
void Tongji(void) {
int i,n,choose,nopass;
double sum;
NODE p;
if(head != NULL) ShowAll();
if(head == NULL) {
printf("信息尚未建立,请先《录入》。\n");
return;
}
do {
printf("分类如下:\n");
printf("1.语文\t2.数学\t3.英语\t4.C语言\t5体育\t6.总成绩\t7.平均成绩\t8.返回\n");
printf("请请选择 : ");
scanf("%d",&choose);
switch (choose) {
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
i = choose - 1;
sum = 0.0;
nopass = 0;
for(n = 1,p = head->next;p; ++n,p = p->next) {
sum += p->Grades[i];
if(p->Grades[i] < 60.0) nopass++;
}
printf("%s总成绩 : %.2lf\n",subjects[i],sum);
printf("%s平均成绩 : %.2lf\n",subjects[i],sum/n);
if(nopass) printf("%s不及格的有%d个人\n",subjects[i],nopass);
}
}while(choose != 8);
}
void FreeList(void) {
NODE q,p = head;
while(p) {
q = p;
p = p->next;
free(q);
}
}
int main() {
int choose;
updated = 0;
Menu();
if(updated == 1) {
printf("数据已经更新,需要保存到文件。\n");
printf("1. 保存,0. 放弃 : ");
scanf("%d",&choose);
if(choose == 1) SaveData();
}
FreeList();
return 0;
}追问

好的。还行。少了个增加信息、能不能 补个全。

追答

5 、插入 功能可以增加信息。

温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜