怎么用C语言编一个学生成绩记录簿?

Python018

怎么用C语言编一个学生成绩记录簿?,第1张

#include<stdio.h>

#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 {

printf("请输入学号:")

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)

}