修改完善如下,供参考:
#include<stdio.h>
#include<stdlib.h>
#define MAX 9999
#define C_NUM 100
typedef struct
{
char Number[20]; //学号
char Class[20]; //班级
char Name[20]; //姓名
char Subject[20]; //科目
int term; //学期
int Score; //分数
}Node;//链表的定义
typedef struct
{
int count;
Node Student[MAX];
}List;//线性表的定义
typedef struct
{
char Class[20]; //班级名字
int Acount; //班级优秀的人数
int Dcount; //班级不及格的人数
int count; //班级总人数
}ClassInfor;
ClassInfor S[C_NUM] = {0};//修改
int Class_NUM = 0; //修改
void Insert(List *L, ClassInfor *S)//成绩录入
{
char Number[20];
char Class[20];
char Name[20];
char Subject[20];
int Term;
int Score;
int i, flag = 0;
printf("\n\t\t\t\t请输入学号: ");
scanf("%s", Number);
getchar();
if(L->count !=0 && strcmp(L->Student[L->count - 1].Number, Number) == 0) //修改
//if(strcmp(L->Student[L->count - 1].Number, Number) > 0) //录入学号与最后学号进行比较
{
printf("\n\n\t\t\t不合法学号,学号%s已注册.\n", L->Student[L->count - 1].Number);
return;
}
printf("\n\t\t\t\t请输入班级: ");
scanf("%s", Class);
getchar();
for(i = 0,flag = 0; i < Class_NUM; i++)
{
if(strcmp(S[i].Class, Class) == 0)
{
//S[i].count++;//该班级人数+1 修改
flag = 1;
break;
}
}
if(flag == 0)
{
strcpy(S[i].Class,Class);
Class_NUM++;
//printf("\n\n\t\t\t\t请输入正确的班级\n"); 修改
//return;
}
printf("\n\t\t\t\t请输入姓名: ");
scanf("%s", Name);
printf("\t\t\t");
getchar();
printf("\n\t\t\t\t请输入科目: ");
scanf("%s", Subject);
printf("\n\t\t\t\t请输入学期:2\n ");
Term = 2;
printf("\n\t\t\t\t请输入分数: ");
scanf("%d", &Score);
getchar();
if(Score >= 90)//优秀人数+1
S[i].Acount++;
if(Score < 60) //不及格人数+1
S[i].Dcount++;
S[i].count++; //该班级人数+1 修改
//寻找插入位置。与录入学生班级相同的排一块
for(i = L->count,flag = 0; i > 0; i--)
//for(i = L->count; i >= 0; i--) 修改
{
L->Student[i] = L->Student[i - 1]; //修改
if(strcmp(L->Student[i-1].Class, Class) == 0)
{
strcpy(L->Student[i - 1].Number, Number);
strcpy(L->Student[i - 1].Class, Class);
strcpy(L->Student[i - 1].Name, Name);
strcpy(L->Student[i - 1].Subject, Subject);
L->Student[i - 1].term = Term;
L->Student[i - 1].Score = Score;
L->count++;//所插入人数+1
flag = 1;
return;
}
//else
// L->Student[i + 1] = L->Student[i]; //修改
}
if(flag == 0) //修改
{
strcpy(L->Student[i].Number, Number);
strcpy(L->Student[i].Class, Class);
strcpy(L->Student[i].Name, Name);
strcpy(L->Student[i].Subject, Subject);
L->Student[i].term = Term;
L->Student[i].Score = Score;
L->count++;//所插入人数+1
}
}
void Change(List *L, ClassInfor *S)//成绩修改
{
char Number[20];//, Class[20];
int i, flag = 0;
printf("\n\n\t\t\t请输入要修改学生的学号: ");
scanf("%s", Number);
getchar();
for(i = 0; i < L->count; i++)//修改
//for(i = 0; i < MAX; i++)
{
if(strcmp(L->Student[i].Number, Number) == 0)
//通过比较输入的学号和文件当中存储的学号,然后通过链表访问到该学生。
{
flag = 1;
break;
}
}
if(flag == 0)
{
printf("\n\n\t\t\t没有该学号的学生!\n");
//printf("\n\n\t\t\t请输入正确的学号!\n");修改
return;
}
//输出此人信息
printf("\n\n\t\t\t班级: %s\n", L->Student[i].Class);
printf("\n\n\t\t\t学号: %s\n", L->Student[i].Number);
printf("\n\n\t\t\t姓名: %s\n", L->Student[i].Name);
printf("\n\n\t\t\t学期: %d\n", L->Student[i].term);
printf("\n\n\t\t\t课程: %d\n", L->Student[i].Subject);
printf("\n\n\t\t\t分数: %d\n", L->Student[i].Score);
printf("\n\n\t\t\t请输入修改数据结构后的分数: ");
scanf("%d", &L->Student[i].Score);
getchar();
}
void Delete(List *L, ClassInfor *S)//删除学生信息
{
char Number[20];
int i, j, flag = 0;
printf("\n\n\t");
printf("\t\t\t请输入要删除的学号: ");
scanf("%s", Number);
getchar();
for(i = 0; i < L->count; i++)
{
if(strcmp(L->Student[i].Number, Number) == 0)
{
flag = 1;
break;
}
}
if(flag)
{
for(j = 0; j < Class_NUM; j++)
{
if(strcmp(S[j].Class,L->Student[i].Class) == 0)
{
S[i].count--;//该班级人数-1
break;
}
}
for(j = i; j < L->count - 1; j++) //修改
//for(j = i; j < L->count - i; j++)
L->Student[j] = L->Student[j + 1];
L->count--;
return;
}
else //修改
printf("\t\t\t没有该学号的学生\n");
}
void Display(List *L)//显示输出所有学生信息
{
int k;
if(L->count == 0)
{
printf("无记录!\n");
return;
}
for(k = 0; k < L->count; k++)
{
printf("\n");
printf("班级: %s ", L->Student[k].Class);
printf("学号: %s ", L->Student[k].Number);
printf("姓名: %s ", L->Student[k].Name);
printf("学期: %d ", L->Student[k].term);
printf("课程: %s ", L->Student[k].Subject);
printf("分数: %d ", L->Student[k].Score);
printf("\n\n");
}
}
void DisplayClass(List *L,ClassInfor *S) //增加
{
char Class[20];
int i,flag;
if(L->count == 0)
{
printf("无记录!\n");
return;
}
printf("\n\n\t\t\t请输入班级名称: ");
scanf("%s", Class);
getchar();
for(i = 0,flag = 0; i < L->count; i++)
{
if(strcmp(L->Student[i].Class , Class) == 0){
printf("\n");
printf("班级: %s ", L->Student[i].Class);
printf("学号: %s ", L->Student[i].Number);
printf("姓名: %s ", L->Student[i].Name);
printf("学期: %d ", L->Student[i].term);
printf("课程: %s ", L->Student[i].Subject);
printf("分数: %d ", L->Student[i].Score);
printf("\n\n");
flag = 1;
}
}
if(flag == 0)
{
printf("未找到班级名称!\n");
return;
}
for(i = 0; i < Class_NUM; i++) {
if(strcmp(S[i].Class,Class) == 0){
printf("\n");
printf("%s: 总人数:%d 优秀的人数:%d 不及格人数:%d\n",
S[i].Class,S[i].count,S[i].Acount,S[i].Dcount);
}
}
}
void Search(List *L, ClassInfor *S)//统计函数块
{
int x;
printf("\n\n\t\t\t1.统计所有班级\n");
printf("\n\n\t\t\t2.统计某个班级\n");
printf("\n\n\t\t\t");
scanf("%d", &x);
getchar();
if(x == 1)
Display(L); //统计所有班级所有学生
if(x == 2)
DisplayClass(L, S);//统计某个班级所有学生
}
void PersonalFind(List *L) //个人成绩查询
{
char Number[20];
int i, flag = 0;
printf("\n\n\t\t\t请输入学生的学号: ");
scanf("%s", Number);
getchar();
for(i = 0; i < L->count; i++)
{
if(strcmp(L->Student[i].Number, Number) == 0)
{
flag = 1;
break;
}
}
if(flag == 0)
{
printf("\n\n\t\t\t没有该学号的学生!\n");
return;
}
//输出此人信息
printf("\n\n\t\t\t班级: %s\n", L->Student[i].Class);
printf("\n\n\t\t\t学号: %s\n", L->Student[i].Number);
printf("\n\n\t\t\t姓名: %s\n", L->Student[i].Name);
printf("\n\n\t\t\t学期: %d\n", L->Student[i].term);
printf("\n\n\t\t\t课程: %d\n", L->Student[i].Subject);
printf("\n\n\t\t\t分数: %d\n", L->Student[i].Score);
}
void Find(List *L, ClassInfor *S)//成绩查询函数块
{
int x;
printf("\n\n\t\t\t1.个人成绩查询\n");
printf("\n\n\t\t\t2.班级成绩查询\n");
printf("\n\n\t\t\t请输入操作: ");
scanf("%d", &x);
getchar();
switch(x)
{
case 1:
PersonalFind(L);//个人成绩查询
break;
case 2:
DisplayClass(L,S);//ClassFind(L, S);//班级成绩查询
break;
}
}
void main(){
int i, j=0;
List L; //修改
L.count = 0;//修改
while(j==0){
printf("请选择功能:\n");
printf("\t1.成绩录入\t2.成绩修改\t3.学生信息删除\t4.统计\t5.成绩查询\t6.学生成绩显示\n");
scanf("%d",&i);
getchar();
switch(i) {
case 1:
Insert(&L,S);break; //修改
case 2:
Change(&L,S);break;
case 3:
Delete(&L,S);break;
case 4:
Search(&L,S);break;
case 5:
Find(&L,S); break;
case 6:
Display(&L); break;
default: break;
}
printf("退出请按1,继续请按0。\n");
scanf("%d",&j);
getchar();
if(j==1){
break;
}
}
}