#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
}
#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}即可正常运行
程序运行测试图如下: