#include<stdlib.h>
#include<string.h>
typedef struct
{
char id[15]
char name[10]
int score
} StudentInfo
typedef struct
{
StudentInfo arr[100]
int length
} SeqList
FILE *fp
char *filePath = "C:/StudentInfo.txt"
void initSeqList(SeqList *L)
{
L->length = 0
}
void insertSeqList(SeqList *L, int i, StudentInfo info)å
{
int j
for(j = L->lengthj >ij--)
L->arr[j] = L->arr[j-1]
L->arr[j] = info
L->length++
}
void printStudentInfo(StudentInfo info)
{
printf("%s\t%s\t%d\n", info.id, info.name, info.score)
}
void printSeqListWithSeqNo(SeqList L)
{
for(int i = 0i <L.lengthi++)
{
printf("%d\t", i+1)
printStudentInfo(L.arr[i])
}
}
void printSeqList(SeqList L)
{
for(int i = 0i <L.lengthi++)
printStudentInfo(L.arr[i])
}
int queryInfoById(SeqList L, char *id)
{
for(int i = 0i <L.lengthi++)
if(strcmp(id, L.arr[i].id)==0)
return i
return -1
}
int queryInfoByName(SeqList L, char *name)
{
for(int i = 0i <L.lengthi++)
if(strcmp(name, L.arr[i].name)==0)
return i
return -1
}
void save2File(SeqList L)
{
fp = fopen(filePath, "w")
for (int i = 0i <L.lengthi++)
fprintf(fp, "%s\t%s\t%d\n", L.arr[i].id, L.arr[i].name, L.arr[i].score)
}
void showMenu(SeqList L)
void addInfo(SeqList L)
{
StudentInfo info
int index
do {
scanf("%s", info.id)
index = queryInfoById(L, info.id)
if (index != -1)
{
printf("输入的学号已存在。\n")
printStudentInfo(L.arr[index])
}
} while(index != -1)
do {
printf("请输入姓名:")
scanf("%s", info.name)
index = queryInfoByName(L, info.name)
if(index != -1)
{
printf("输入的姓名已存在。\n")
printStudentInfo(L.arr[index])
}
} while(index != -1)
printf("请输入成绩:")
scanf("%d", &info.score)
L.arr[L.length] = info
L.length++
save2File(L)
}
void editInfo(SeqList L)
{
StudentInfo info
char choice
printf("1. 按学号修改\n2. 按姓名修改\n3. 返回上一层\n")
while((choice=getchar())=='\n')
int index
if(choice == '1' || choice == '2')
{
if(choice == '1')
{
printf("请输入学号:")
scanf("%s", info.id)
index = queryInfoById(L, info.id)
} else {
printf("请输入姓名:")
scanf("%s", info.name)
index = queryInfoByName(L, info.name)
}
if(index != -1)
printStudentInfo(L.arr[index])
else {
printf("%s 为 %s 的学生不存在\n", choice==1?"学号":"姓名", choice==1?info.id:info.name)
editInfo(L)
return
}
printf("成绩改为:")
scanf("%d", &L.arr[index].score)
save2File(L)
}else if(choice == '3')
showMenu(L)
else {
printf("选择有误,请重新选择\n")
editInfo(L)
return
}
}
void insertSort(SeqList *L)
{
for(int j = 1j <L->lengthj++)
{
StudentInfo key = L->arr[j]
int i = j - 1
while(i >= 0 &&L->arr[i].score <key.score)
{
L->arr[i+1] = L->arr[i]
i--
}
L->arr[i+1] = key
}
}
void statisticInfo(SeqList L)
{
// 显示 60 分以下、60~79、80~89、90 分以上各分数段的学生信息
SeqList sectionListArr[4]
for (int i = 0i <4i++)
initSeqList(&sectionListArr[i])
float sum = 0, average, passedRate
for (int i = 0i <L.lengthi++)
{
int score = L.arr[i].score
sum += score
if(score <60)
insertSeqList(&sectionListArr[0], sectionListArr[0].length, L.arr[i])
else if(score >= 60 &&score <80)
insertSeqList(&sectionListArr[1], sectionListArr[1].length, L.arr[i])
else if(score >= 80 &&score <90)
insertSeqList(&sectionListArr[2], sectionListArr[2].length, L.arr[i])
else insertSeqList(&sectionListArr[3], sectionListArr[3].length, L.arr[i])
}
average = sum/L.length
passedRate = (L.length-sectionListArr[0].length)*100.0/L.length
insertSort(&L)
printf("60 分以下的学生:\n")
printSeqList(sectionListArr[0])
printf("\n60 ~ 79 分的学生:\n")
printSeqList(sectionListArr[1])
printf("\n80 ~ 89 分的学生:\n")
printSeqList(sectionListArr[2])
printf("\n90 分以上的学生:\n")
printSeqList(sectionListArr[3])
printf("\n及格率:%.1f %%\n平均分:%.1f\n", passedRate, average)
printf("按顺序从高到低排序:\n")
insertSort(&L)
printSeqListWithSeqNo(L)
printf("\n最高分:\n")
printStudentInfo(L.arr[0])
printf("\n最低分:\n")
printStudentInfo(L.arr[L.length-1])
}
void queryInfo(SeqList L)
{
char choice
printf("1. 按学号查询\n2. 按姓名查询\n3. 返回上层\n")
while((choice=getchar())=='\n')
int index
if (choice == '1')
{
char id[15]
printf("请输入学号:")
scanf("%s", id)
index = queryInfoById(L, id)
} else if(choice == '2') {
char name[10]
printf("请输入姓名:")
scanf("%s", name)
index = queryInfoByName(L,name)
} else if(choice == '3') {
showMenu(L)
return
} else {
printf("选择有误,请重新选择\n")
queryInfo(L)
return
}
if(index == -1)
printf("没有查询到结果\n")
else
printStudentInfo(L.arr[index])
}
void showMenu(SeqList L)
{
char choice
printf("\n1. 查询\n2. 添加成绩\n3. 修改成绩\n4. 统计分析\n5. 退出\n")
while((choice = getchar()) == '\n')
switch(choice)
{
case '1': queryInfo(L)break
case '2': addInfo(L)break
case '3': editInfo(L)break
case '4': statisticInfo(L)break
case '5': exit(0)
}
}
int main(void)
{
StudentInfo temp
SeqList *L = (SeqList*)malloc(sizeof(SeqList))
do {
initSeqList(L)
fp = fopen(filePath, "r")
int i = 0
while(fscanf(fp, "%s%s%d", temp.id, temp.name, &temp.score) != EOF)
insertSeqList(L, i++, temp)
showMenu(*L)
fclose(fp)
}while(1)
return 0
}
//?某班级学生C语言第一次正考的成绩存于数据文件score.dat中,记录了学生学号、姓名和考试成绩,bk.dat文件中记录了补考学生的学号、姓名和补考成绩,编写程序以链式存储结构实现以下要求://?1、对该班级按成绩降序排序并统计成绩平均分及每个分数段的人数,结果写入到result.dat中。
//?2、再根据补考成绩修改原成绩,修改成绩后仍按成绩降序写在result.dat的后面。成绩修改原则:
//?1)补考成绩大于等于60,原成绩以60分记;2)补考成绩小于60,取两次成绩中最高值记。
#include
#include
#includedata.cjnext
}
print(lp)
}