学生成绩信息包括:学号,姓名,课程名,平时成绩,实验成绩,考试成绩,总评成绩。
要求实现如下功能:
1)能够实现学生成绩信息的插入、删除和修改;
2)能够实现各种查询(分别根据学生学号、姓名、课程名称等);
3)能够实现按照考试成绩、总评成绩进行排序;
4)能够查询某门课程的最高分、最低分并输出相应学生信息;
能够查询某门课程的优秀率(90 分及以上)、不及格率;
构建结构体
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Students
{
int num;//学号
char name[100];//名字
char subject[100];//科目
float test;//平时成绩
float shiyan;//实验成绩
float exam;//考试成绩
float score;//总评成绩
struct Students* next;
};
创建单链表
struct Students *creat(int N)
{
struct Students* head, * p1;
int i;
head=p1 = (struct Students*)malloc(sizeof(struct Students));
printf("请输入学生的信息:\n");
for (i = 1; i <= N; i++)
{
printf("学号:");
scanf_s("%d",&p1->num);
printf("姓名:");
scanf_s("%s", p1->name, 100);
printf("科目:");
scanf_s("%s", p1->subject, 100);
printf("平时成绩:");
scanf_s("%f", &p1->test);
printf("实验成绩:");
scanf_s("%f", &p1->shiyan);
printf("考试成绩:");
scanf_s("%f", &p1->exam);
printf("总评成绩:");
scanf_s("%f", &p1->score);
if (i < N)
{
p1->next = (struct Students*)malloc(sizeof(struct Students));
}
else
{
p1->next = NULL;
}
p1 = p1->next;
printf("\n");
}
return head;
}
显示学生信息(参数中有学生的人数传递进来)
void print1(struct Students* head,int N)
{
printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
struct Students *p;
int i;
i = 1;
for (p=head;p!=NULL;p=p->next)
{
p->num = i;
if (i<=N)
{
printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
}
i++;
}
}
显示学生信息(这个不需要学生人数)
void print2(struct Students* head)
{
printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
struct Students* p;
for (p = head; p != NULL; p = p->next)
{
printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
}
}
插入学生信息,在输入位置的后面插入
void chooseA(struct Students* head,int N)//插入学生信息,在输入位置的后面插入
{
printf("请输入要插入的位置:\n");
int i;
scanf_s("%d", &i);
struct Students* p1, * p2,*p3;
p2=p3 = (struct Students*)malloc(sizeof(struct Students));
if (i>N)
{
printf("找不到该位置!\n");
exit(EXIT_FAILURE);
}
else
{
for (p1=head;p1!=NULL;p1=p1->next )
{
if (p1->num==i)
{
printf("名字:");
scanf_s("%s", p2->name, 100);
printf("课程名:");
scanf_s("%s", p2->subject, 100);
printf("平时成绩:");
scanf_s("%f", &p2->test);
printf("实验成绩:");
scanf_s("%f", &p2->shiyan);
printf("考试成绩:");
scanf_s("%f", &p2->exam);
printf("总评成绩:");
scanf_s("%f", &p2->score);
p3 = p1->next;
p1->next = (struct Students*)malloc(sizeof(struct Students));
p1->next->num = i+1;
strcpy_s(p1->next->name, strlen(p2->name) + 1, p2->name);
strcpy_s(p1->next->subject, strlen(p2->subject) + 1, p2->subject);
p1->next->test = p2->test;
p1->next->shiyan = p2->shiyan;
p1->next->exam = p2->exam;
p1->next->score = p2->score;
p1->next->next=p3;
p3->num = i + 2;
N++;
}
}
print1(head, N);
}
}
删除学生信息
void chooseB(struct Students* head,int N)//删除学生信息
{
printf("删除学生信息的学号:\n");
int i;
scanf_s("%d", &i);
struct Students* p1;
if (i>N||i<1)
{
printf("没有学号为%d的学生\n",i);
exit(EXIT_FAILURE);
}
else if (i==1)
{
head = head->next;
N--;
}
else
{
for (p1=head;p1!=NULL;p1=p1->next )
{
if (p1->num==i-1)//假设要删除学号为2的学生,那么就要在学号为1的链表指向学号为3
{
p1->next = p1->next->next;
N--;
}
}
print1(head, N);
}
}
修改学生信息
void chooseC(struct Students* head,int N)//修改学生信息
{
struct Students* p1;
printf("请入要修改学生信息的学号:\n");
int i;
scanf_s("%d", &i);
if (i>N)
{
printf("找不到学号为%d的学生!\n", i);
exit(EXIT_FAILURE);
}
else
{
for (p1=head;p1!=NULL;p1=p1->next)
{
if (p1->num==i)
{
b: {
printf("请输入要修改的信息:\n");
printf("1.姓名\t2.科目\t3.平时成绩\t4.实验成绩\t5.考试成绩\t6.总评成绩\n");
char ch;
scanf_s(" %c", &ch);
switch (ch)
{
case'1':
printf("姓名:\t");
scanf_s("%s", p1->name,100);
break;
case'2':
printf("科目:\t");
scanf_s("%s",p1->subject,100);
break;
case'3':
printf("平时成绩:\t");
scanf_s("%f", &p1->test);
break;
case'4':
printf("实验成绩\t");
scanf_s("%f", &p1->shiyan);
break;
case'5':
printf("考试成绩\t");
scanf_s("%f", &p1->exam);
break;
case'6':
printf("总评成绩\t");
scanf_s("%f", &p1->score);
break;
}
printf("是否继续修改其他信息(是请按Y,否请按N)\n");
char z;
scanf_s(" %c", &z);
if (z == 'Y')
{
goto b;
}
else
{
break;
}
}
}
}
}
}
根据学号查找信息
void chooseD(struct Students* head,int N)//根据学号查找信息
{
struct Students* p;
printf("请输入要查找学生的学号:\n");
int i;
scanf_s("%d",& i);
if (i>N)
{
printf("不存在学号为%d的学生!\n");
exit(EXIT_FAILURE);
}
else
{
for (p=head;p!=NULL;p=p->next)
{
if (i==p->num)
{
printf("这位学生的信息\n");
printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
}
}
}
}
根据学生姓名查找信息
void chooseE(struct Students* head)
{
printf("请输入要查找学生的姓名:\t");
char name[100];
scanf_s("%s", name,100);
struct Students* p;
for (p=head;p!=NULL;p=p->next)
{
if (strcmp(p->name,name)==0)//比较两个字符串是否一样
{
printf("该学生的信息:\n");
printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
}
}
}
根据课程名查找学生信息
void chooseF(struct Students* head)//根据课程名查找学生信息
{
char subject[100];
printf("请输入要查找的课程名:\n");
scanf_s("%s",subject, 100);
struct Students* p;
printf("该课程名下的学生有:\n");
printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
for (p=head;p!=NULL;p=p->next)
{
if (strcmp(p->subject,subject)==0)
{
printf("%d\t%s\t%s\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
}
}
}
按照考试成绩排序,从小到大排序
void chooseG(struct Students* head,int N)//按照考试成绩排序,从小到大排序
{
int i;
i = 1;
struct Students* p,*p1,*p2;
p1 = (struct Students*)malloc(sizeof(struct Students));
for(p=head;i<=N;i++,p=p->next)
{
for(p2=p->next;p2!=NULL;p2=p2->next)
{
if (p->exam > p2->exam)//从小到大排序,冒泡排序
{
p1->exam = p->exam;
p1->num = p->num;
strcpy_s(p1->name, strlen(p->name) + 1, p->name);
strcpy_s(p1->subject, strlen(p->subject)+1, p->subject);
p1->test = p->test;
p1->shiyan = p->shiyan;
p1->score = p->score;
p->exam = p2->exam;
p->num =p2->num;
strcpy_s(p->name, strlen(p2->name) + 1, p2->name);
strcpy_s(p->subject, strlen(p2->subject)+1, p2->subject);
p->test =p2->test;
p->shiyan = p2->shiyan;
p->score = p2->score;
p2->exam = p1->exam;
p2->num = p1->num;
strcpy_s(p2->name, strlen(p1->name) + 1, p1->name);
strcpy_s(p2->subject, strlen(p1->subject) + 1, p1->subject);
p2->test = p1->test;
p2->shiyan = p1->shiyan;
p2->score = p1->score;
}
}
}
}
根据总评成绩排序
void chooseH(struct Students* head,int N)//根据总评成绩排序
{
struct Students* p, * p1,*p2;
int i;
i = 1;
p1 =p2= (struct Students*)malloc(sizeof(struct Students));
for(p=head;i<=N;i++,p=p->next)
{
for(p2=p->next;p2!=NULL;p2=p2->next)
{
if (p->score > p->next->score)//从小到大排序,冒泡排序
{
p1->score = p->score;
p1->num = p->num;
strcpy_s(p1->name, strlen(p->name) + 1, p->name);
strcpy_s(p1->subject, strlen(p->subject) + 1, p->subject);
p1->test = p->test;
p1->shiyan = p->shiyan;
p1->exam = p->exam;
p->score =p2->score;
p->num =p2->num;
strcpy_s(p->name, strlen(p->next->name) + 1, p2->name);
strcpy_s(p->subject, strlen(p->next->subject) + 1,p2->subject);
p->test = p2->test;
p->shiyan = p2->shiyan;
p->exam = p2->exam;
p2->score = p1->score;
p2->num = p1->num;
strcpy_s(p2->name, strlen(p1->name) + 1, p1->name);
strcpy_s(p2->subject, strlen(p1->subject) + 1, p1->subject);
p2->test = p1->test;
p2->shiyan = p1->test;
p2->exam = p1->exam;
}
}
}
}
查找某一门课程的最高分与最低分
void chooseI(struct Students* head)//查找某一门课程的最高分与最低分
{
char subject1[100];
printf("请输入要查找的课程名:\n");
scanf_s("%s",subject1, 100);
struct Students* p;
int i;
i = 0;
int num[100];
char name[100];
char subject2[100];
float test[100], shiyan[100], exam[100], score[100];
printf("该课程名下的学生有:\n");
printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
for (p = head; p != NULL; p = p->next)
{
if (strcmp(p->subject, subject1) == 0)
{
printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->num, p->name, p->subject, p->test, p->shiyan, p->exam, p->score);
num[i] = p->num;
strcpy_s(name, strlen(p->name) + 1, p->name);
strcpy_s(subject2, strlen(p->subject) + 1, p->subject);
test[i] = p->test;
shiyan[i] = p->shiyan;
exam[i] = p->exam;
score[i] = p->score;
i++;//最后结束的时候,i会加一
}
}
if (i==1)
{
printf("该课程名下只录入了一位学生,无法判断该课程的最高分,最低分!\n");
exit(EXIT_FAILURE);
}
else if (i==0)
{
printf("没有录入与该课程相关的学生!\n");
exit(EXIT_FAILURE);
}
else
{
int x,y,z1;
float z2, z3, z4, z5;
for (x=0;x<=i;x++)
{
for (y=x+1;y<i;y++)
{
if (score[x]>score[y])//冒泡排序,从小到大排序
{
z5 = score[x];
z1 = num[x];
z2 = test[x];
z3 = shiyan[x];
z4 = exam[x];
score[x] = score[y];
num[x] = num[y];
test[x]= test[y];
shiyan[x] = shiyan[y];
exam[x] = exam[y];
score[y] = z5;
num[y] = z1;
test[y] = z2;
shiyan[y] = z3;
exam[y] = z4;
}
}
struct Students* p1;
if (x==0)
{
printf("该课程下总评成绩最低分的学生的信息如下:\n\n");//数组中最小的总评成绩是第一个元素
printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
for (p1=head;p1!=NULL;p1=p1->next)
{
if (p1->num==num[0])//数组中最小的元素是第一个元素,查找对应学号的学生信息
{
printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n\n", p1->num, p1->name, p1->subject, p1->test, p1->shiyan, p1->exam, p1->score);
}
}
}
if (x==i)
{
printf("该课程下总评成绩最高分的学生的信息如下:\n\n");//数组中最大的总评成绩是最后一个元素
printf("学号\t姓名\t科目\t平时成绩\t实验成绩\t考试成绩\t总评成绩\n");
for (p1=head;p1!=NULL;p1=p1->next )
{
if (p1->num==num[i-1])//数组中最后一个元素的总评成绩是最大值,最后一个元素是第i-1个;查找对应的学号的学生信息
{
//因为上面的循环中,最后i会加上一,我们需要的是第i-1个
printf("%d\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p1->num, p1->name, p1->subject, p1->test, p1->shiyan, p1->exam, p1->score);
}
}
}
}
}
}
查找某一课程的优秀率与不及格率
void chooseJ(struct Students* head)//查找某一课程的优秀率与不及格率
{
char subject[100];
printf("请输入要查找的课程名:\n");
scanf_s("%s",subject, 100);
struct Students* p1,*p2,*p3;
int i;
float j, k;
i =0;
j = k = 0.00;
for (p1 = head; p1 != NULL; p1 = p1->next)
{
if (strcmp(p1->subject, subject) == 0)
{
i++;
if (p1->score>=90)//优秀的人数
{
j++;
}
else if (p1->score<60)//不及格的人数
{
k++;
}
}
}
if (i==1)
{
printf("该课程只录入一位学生,无法得出该课程的优秀率以及不及格率!\n");
exit(EXIT_FAILURE);
}
else if (i==0)
{
printf("没有录入与该课程相关的学生!\n");
exit(EXIT_FAILURE);
}
else
{
if (j != 0)
{
printf("该科目的优秀率为:%.2f%\n", j / i * 100.00);
}
else
{
printf("该科目的优秀率为0\n");
}
if (k != 0)
{
printf("该科目的不及格率为:%.2f%\n", k / i * 100.00);
}
else
{
printf("该科目的不及格率为0\n");
}
}
}
主函数
int main()
{
struct Students* head;
int N;
printf("请输入要录入学生的人数:\t");
scanf_s("%d", &N);
head = creat(N);
print2(head);
a: {
printf("学生成绩管理系统\n\n");
printf("A.插入学生信息\nB.删除学生信息\nC.修改学生信息\nD.根据学号查找学生信息\n");
printf("E.根据学生姓名查找信息\nF.根据课程名查找信息\nG.按照考试成绩排序\n");
printf("H.根据总评成绩进行排序\nI.查询某门课程的最高分,最低分\n");
printf("J.查询某门课程的优秀率(90分以及90分以上)和不及格率\n");
char ch;
scanf_s(" %c", &ch);
switch (ch)
{
case'A':
chooseA(head, N);
break;
case'B':
chooseB(head, N);
break;
case'C':
chooseC(head, N);
print2(head);
break;
case'D':
chooseD(head, N);
break;
case'E':
chooseE(head);
break;
case'F':
chooseF(head);
break;
case'G':
chooseG(head,N);
print2(head);
break;
case'H':
chooseH(head,N);
print2(head);
break;
case'I':
chooseI(head);
break;
case'J':
chooseJ(head);
break;
default:
break;
}
c: {
printf("是否继续(是请按Y,否请按N)\n");
char choose;
scanf_s(" %c", &choose);
if (choose == 'Y')
{
goto a;
}
else if (choose == 'N')
{
return 0;
}
else
{
printf("请重新输入:\n");
goto c;
}
}
}
}