#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
int main_menu();
int fun_choose();
int fun1();
int fun2(struct student *head);
int fun3(struct student *Head);
int fun4(struct student * Head);
int fun5(struct student * Head);
int fun6(struct student *p);
int fun7(struct student *p);
int fun8(struct student *p);
int num = 0; //用来存放节点数量的全局变量
struct student
{
unsigned int number; //无符号整型学号
float score; //浮点型分数
struct student *next;
}*create(int n), *start=NULL, *end=NULL;
int main() //主函数
{
main_menu();
return 0;
}
struct student *create(int n) //创建动态链表的函数
{
struct student *head, *p1, *p2;
head = p1 = p2 = (struct student*)malloc(LEN);
printf("\n [用TAB键分隔学号与成绩,ENTER键以输入下个学生的信息]\n\n| 学号 | 成绩 |\n");
scanf("%d%f", &p1->number, &p1->score);
while (n - 1 > 0)
{
p1 = (struct student*)malloc(LEN);
p2->next = p1;
scanf("%d%f", &p1->number, &p1->score);
p2 = p1;
n--;
}
end = p2;
p2->next = NULL;
return head;
}
int main_menu() //<学生成绩管理系统>主菜单
{
int i;
printf("\n 学生成绩管理系统\n\n+****************************************+\n|1、录入成绩 |\n|2、输出成绩 |\n|3、修改成绩 |\n|4、删除记录 |\n|5、统计成绩 |\n|6、成绩排序 |\n|7、追加记录 |\n|8、清空记录 |\n|0、退出 |\n+****************************************+\n\n请选择:");
scanf("%d", &i);
switch (i)
{
case 0:exit(0); break;
case 1:fun1(); break;
case 2:fun2(start); break;
case 3:fun3(start); break;
case 4:fun4(start); break;
case 5:fun5(start); break;
case 6:fun6(start); break;
case 7:fun7(end); break;
case 8:fun8(start); break;
default:printf("\n\n 错误!无法实现该功能!请重新选择!\n\n\n\n\n\n\n\n"); main_menu();
}
return 0;
}
int fun_choose() //回到主菜单或退出程序的函数
{
int z;
printf("\n\n[输入1返回主菜单,输入0关闭程序]\n\n请选择:");
scanf("%d", &z);
if (z == 0)
exit(0);
else
if (z == 1)
{
printf("\n\n\n\n\n\n\n\n");
main_menu();
}
else
{
printf("\n [错误的指令]");
fun_choose();
}
return 0;
}
int fun1() //从无开始录入记录的函数
{
if (start != NULL)
{
printf("\n [已有记录,无需重新录入]");
fun_choose();
}
printf("\n\n\n需要录入信息的学生个数为:");
scanf("%d", &num);
while (num <= 0)
{
printf("\n [错误!人数必须是正整数,请重新输入人数!]\n\n需要录入信息的学生个数为:");
scanf("%d", &num);
}
start = create(num);
printf("\n [录入完成]");
fun_choose();
return 0;
}
int fun2(struct student *head) //输出所有记录的函数
{
if (head == NULL)
{
printf("\n [未录入记录]");
fun_choose();
}
else
{
printf("\n\n\n\n\n\n| 学号 | 成绩 |\n");
while (head != NULL)
{
if (head->number != 0)
printf("|%d |%3.2f |\n", head->number, head->score);
head = head->next;
}
printf("\n [输出完成]");
fun_choose();
}
return 0;
}
int fun3(struct student *Head) //修改指定目标成绩的函数
{
struct student *p;
unsigned int i;
printf("\n\n\n输入要修改成绩的学生的学号:");
scanf("%d", &i);
if (Head == NULL)
{
printf("\n [未录入记录]");
fun_choose();
}
if (Head != i && Head->next == NULL)
{
printf("\n [未找到该学生的记录]");
fun_choose();
}
if (Head->number == i)
{
printf("\n请输入要修改的成绩:");
scanf("%f", &Head->score);
printf("\n [修改完成]");
fun_choose();
}
for (p = NULL; Head != NULL; Head = Head->next)
{
p = Head->next;
if (p->number == i)
{
printf("\n请输入要修改的成绩:");
scanf("%f", &p->score);
printf("\n [修改完成]");
fun_choose();
}
if (p->number != i && p->next == NULL)
{
printf("\n [未找到该学生的记录]");
fun_choose();
}
}
return 0;
}
int fun4(struct student *Head) //删除指定目标记录的函数
{
struct student *p;
unsigned int i;
printf("\n\n\n输入要删除记录的学生的学号:");
scanf("%d", &i);
if (Head == NULL)
{
printf("\n [未录入记录]");
fun_choose();
}
else
if (Head->next == NULL && Head->number != i)
{
printf("\n [未找到该学生的记录]");
fun_choose();
}
if (Head->number == i )
{
start = Head->next;
free(Head);
num--;
if (Head->next == NULL)
end = start = NULL;
printf("\n [已删除该学生的记录]");
fun_choose();
}
else
for (p = NULL; Head != NULL; Head = Head->next)
{
p = Head->next;
if (p->number == i && p->next != NULL)
{
Head->next = p->next;
free(p);
num--;
printf("\n [已删除该学生的记录]");
fun_choose();
}
else
if (p->number == i && p->next == NULL)
{
end = Head;
Head->next = NULL;
free(p);
num--;
printf("\n [已删除该学生的记录]");
fun_choose();
}
if (p->number != i && p->next == NULL)
{
printf("\n [未找到该学生的记录]");
fun_choose();
}
}
return 0;
}
int fun5(struct student * Head) //统计所有成绩的函数
{
int a = 0, b = 0, c = 0, e = 0, n = 0;
float x, y, z = 0.0, f;
if (Head == NULL)
{
printf("\n [未录入记录]");
fun_choose();
}
else
{
printf("\n\n");
printf("请输入及格线:");
scanf("%f", &x);
printf("\n请输入优秀线:");
scanf("%f", &y);
for (; Head != NULL; Head = Head->next)
{
a++;
z = z + Head->score;
f = z / a;
if (Head->score >= y) e++;
if (Head->score >= x) c++;
else n++;
}
printf("\n\n\n\n\n");
printf("平均分为: %.2f\n及格人数为: %d\n及格率为: %.1f%c\n优秀人数为: %d\n不及格人数为: %d\n", f, c, 100.0*c / a, 37, e, n);
fun_choose();
}
return 0;
}
int fun6(struct student *p) //对所有成绩进行排序的函数
{
unsigned int i, j, a;
float t;
struct student *q, *d = p;
if (num == 0 || num == 1)
{
printf("\n [目前录入的学生数无法排序]");
fun_choose();
}
else
{
for (i = 0; i < num; i++)
{
p = d;
q = p->next;
for (j = 0; j < num - i - 1; j++)
{
if (p->score < q->score)
{
a = p->number;
p->number = q->number;
q->number = a;
t = p->score;
p->score = q->score;
q->score = t;
}
p = q;
q = q->next;
}
}
printf("\n [已完成排序]");
fun_choose();
}
return 0;
}
int fun7(struct student *p) //在末尾追加单个记录的函数
{
struct student *p1;
if(p == NULL)
{
printf("\n [目前还未录入记录,无法进行追加]");
fun_choose();
}
else
{
p1 = p->next = (struct student*)malloc(LEN);
printf("\n [用TAB键分隔学号与成绩,ENTER键以输入下个学生的信息]\n\n| 学号 | 成绩 |\n");
scanf("%d%f", &p1->number, &p1->score);
p1->next = NULL;
end = p1;
num++;
printf("\n [录入完成]");
fun_choose();
}
return 0;
}
int fun8(struct student *p) //清空所有记录的函数
{
struct student *p1;
int i;
printf("\n [确定要清空记录吗?按1确定,按0否定]\n\n请选择:");
scanf("%d", &i);
if (i == 0)
fun_choose();
else
if (i == 1)
{
while (p != NULL)
{
p1 = p->next;
free(p);
num--;
p = p1;
}
start = end = NULL;
printf("\n [已清空记录]");
fun_choose();
}
else
printf("\n [无对应的选项!请重新选择!]\n");
fun8(start);
return 0;
}
C语言|控制台|学生成绩管理系统|动态链表|无文件读写
最新推荐文章于 2022-05-05 22:13:39 发布