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

Python037

怎么用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

}

#include

<stdio.h>

void

main()

{

int

i,

n,

reno

float

score[30],

avr,

a,

b,

c

char

name[30][9]

for(i

=

0

i

<

30

i++)

{

printf("%d号的成绩:",

i+1)

scanf("%f",

&score[i])

if(score[i]

<

0)

break

printf("%d号的姓名:",

i+1)

scanf("%s",

name[i])

}

n

=

i

printf("统计不及格人数:\n")

reno

=

0

avr

=

0

for(i

=

0

i

<

n

i++)

{

if(

score[i]

<

60)

{

reno++

printf("%d,

%s\n",

i+1,

name[i])

}

avr

+=

score[i]

}

printf("不及格人数为%d\n\n",

reno)

printf("统计成绩在平均分及平均分之上的学生人数:\n")

avr

/=

nreno

=

0

for(i

=

0

i

<

n

i++)

{

if(score[i]

>=

avr)

{

reno++

printf("%d,

%s\n",

i+1,

name[i])

}

}

printf("成绩在平均分及平均分之上的学生人数为%d\n\n",

reno)

printf("统计各分数段的人数及所占百分比(分数段为<60,60~79,>=80):\n")

a

=

b

=

c

=0

for(i

=

0

i

<

n

i++)

{

if(score[i]

<

60)

a++

else

if(score[i]

>=

80)

c++

else

b++

}

printf("<60:\t%.1f%%\n60~79:\t%.1f%%\n>=80:\t%.1f%%\n",100*a/n,100*b/n,100*c/n)

}

#include<stdio.h>

#include<stdlib.h>

//定义一个学生结构体数组

struct Student{

int id

double score

}Student[100]

//记录实际导入学生个数

int len = 0

//求最高分

void getmax() {

int maxid = 0

double maxscore = -1

for (int i = 0i <leni++) {

if (Student[i].score >maxscore) {

maxscore = Student[i].score

maxid = Student[i].id

}

}

printf("班级最高分为:%.2lf学号是:%d\n", maxscore, maxid)

}

//求最低分

void getmin() {

int minid = 0

double minscore = 101

for (int i = 0i <leni++) {

if (Student[i].score <minscore) {

minscore = Student[i].score

minid = Student[i].id

}

}

printf("班级最低分为:%.2lf学号是:%d\n", minscore, minid)

}

//求总分

double getsum() {

double sum = 0

for (int i = 0i <leni++) {

sum += Student[i].score

}

return sum

}

//求平均分

double getave() {

double ave = 0

return getsum() / len

}

//导入学生信息

void input() {

int id = 0

double score = 0

while (1) {

printf("请输入学生学号:")

scanf_s("%d", &id)

if (id == -1) { break}

printf("请输入学生成绩:")

scanf_s("%lf", &score)

Student[len].id = id

Student[len].score = score

len++

}

printf("信息导入完毕!\n")

}

int main() {

input()

printf("全班总分为:%.2lf\n", getsum())

printf("全班平均分为:%.2lf\n", getave())

getmax()

getmin()

return 0

}

注:此代码运行于VS2017,如果在VC6.0中运行,可将scanf_s改成scanf

并且for(int i=0i<leni++){xxx}改成int i=0for(i=0i<leni++){xxx}即可正常运行

程序运行测试图如下: