69,381
社区成员
发帖
与我相关
我的任务
分享
/************************************************
选题2:学员成绩管理系统
要求能够完成下列功能,并在主函数中给出主菜单,供用户调用和实现:
1、输入:函数input把N学生的学号、姓名、性别、年龄、3科成绩以及平均成绩和总成绩放在一个结构体数组中,学生的学号、姓名、3科成绩由键盘输入,然后计算出平均成绩和总成绩放在结构体对应的域中。
2、插入:insert函数输入一个学生的记录,按学号的先后顺序插入该学生的全部内容。
3、排序:sort函数对所有学生按要求排序(1.学号2.总成绩),并输出。
4、查找:find函数输入一个学生的学号或姓名,找到该学生并输出该学生的全部内容。要求能查询多次。
5、删除:delete函数输入一个学生的学号或姓名,找到该学生并删除该学生的全部内容。
6、输出:函数output输出全部学生的记录。
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct stuinfo student;
/****** 学生信息结构体 *******/
struct stuinfo
{
int id; /* 学号 */
int sex; /* 性别 */
int age; /* 年龄 */
char name[20]; /* 名称 */
int score[3]; /* 3科成绩 */
int total_score; /* 总成绩 */
double avg_score; /* 平均成绩 */
struct stuinfo *next; /* 下个学生的信息 */
};
/*****************************/
/* 功能:录入学生信息 */
void input(student **head)
{
int i, N;
student *s, *p;
if(*head == NULL)
{/* 如果表头为空,先为它分配内存 */
*head = (student *)malloc(sizeof(student));
p = *head;
}
else
{/* 否则,就说明有内容,直接切换到尾结点 */
p = *head;
while(p->next)
p = p->next;
}
printf("请输入要录入的学生信息个数:");
scanf("%d", &N);
for(i=0; i<N; i++, p->next = NULL)
{
/* 为这个结点分配内存 */
s = (student *)malloc(sizeof(student));
printf("[%d/%d]学号:", i+1, N);
scanf("%d", &s->id);
printf("学生姓名:");
scanf("%s", s->name);
printf("性别[1:男 2:女]:");
scanf("%d", &s->sex);
printf("年龄:");
scanf("%d", &s->age);
printf("三科成绩:");
scanf("%d%d%d", &s->score[0], &s->score[1], &s->score[2]);
/* 求总成绩 */
s->total_score = s->score[0];
s->total_score += s->score[1];
s->total_score += s->score[2];
/* 求平均成绩 */
s->avg_score = s->total_score / 3.0;
p->next = s; /* 保存这个结点 */
p = p->next; /* 切换至下个结点 */
}
printf("已经成功录入!\n");
}
/* 功能:删除指定学号的学生的信息 */
int delete(student *head)
{
char name[256];
int choice, id;
int found = 0;
student *p, *t;
if(head == NULL || head->next == NULL)
{/* 如果表头为空 */
printf("没有记录学生信息!\n");
return -1;
}
else
{/* 否则,就说明有内容 */
printf( "要删除学生的全部信息,请选择删除方式:\n"
"[1]通过学号来删除\n"
"[2]通过姓名来删除\n"
"选择:");
while(1)
{
scanf("%d", &choice);
if(choice > 0 && choice < 3)
break;
printf("选择错误,请重新选择:");
}
/* 接受用户输入的内容 */
if(choice == 1)
{
printf("请输入学生学号:");
scanf("%d", &id);
}
else if(choice == 2)
{
printf("请输入学生姓名:");
scanf("%s", name);
}
p = head;
while(p->next)
{
t = p;
p = p->next;
/* 根据用户输入的内容以及选择的方式,来查找匹配数据 */
if( choice == 1 && p->id == id
|| choice == 2 && strcmp(p->name, name) == 0)
{
found = 1;
break;
}
}
if(found == 1)
{/* 如果找到了 */
t->next = p->next;
free(p); /* 释放这个结点占用的内存 */
printf("已经删除!\n");
}
else
{/* 否则没有找到 */
printf("没有找到需删除信息的学生!\n");
return -1;
}
}
return 0;
}
/* 功能:查询学生信息 */
int find(student *head)
{
char name[256];
int choice, id;
int found = 0;
student *p, *t;
if(head == NULL || head->next == NULL)
{/* 如果表头为空 */
printf("没有记录学生信息!\n");
return -1;
}
else
{/* 否则,就说明有内容 */
printf( "要查询学生的全部信息,请选择查询方式:\n"
"[1]通过学号来查询\n"
"[2]通过姓名来查询\n"
"选择:");
while(1)
{
scanf("%d", &choice);
if(choice > 0 && choice < 3)
break;
printf("选择错误,请重新选择:");
}
/* 接受用户输入的内容 */
if(choice == 1)
{
printf("请输入学生学号:");
scanf("%d", &id);
}
else if(choice == 2)
{
printf("请输入学生姓名:");
scanf("%s", name);
}
p = head;
while(p->next)
{
t = p;
p = p->next;
/* 根据用户输入的内容以及选择的方式,来查找匹配数据 */
if( choice == 1 && p->id == id
|| choice == 2 && strcmp(p->name, name) == 0)
{
found = 1;
break;
}
}
printf("查询结果:\n");
if(found == 1)
{/* 如果找到了 */
/* 打印表头 */
printf(
"┌───┬────┬──┬──┬──────┬───┬────┐\n"
"│ %s │ %s │%s│%s│ %s │%s│%s│\n"
"├───┼────┼──┼──┼──────┼───┼────┤\n"
,"学号","姓名","性别","年龄","三科成绩","总成绩","平均成绩");
/* 打印表中间的内容 */
printf( "│%-6d│%-8s│%s│%4d│ %3d %3d %3d│%6d│%8.2lf│\n",
p->id, p->name, p->sex==1?" 男 ":" 女 ", p->age,
p->score[0], p->score[1], p->score[2],
p->total_score, p->avg_score );
/* 打印表尾 */
printf( "└───┴────┴──┴──┴──────┴───┴────┘\n");
}
else
{/* 否则没有找到 */
printf("没有找到符合要求的学生信息!\n");
return -1;
}
}
return 0;
}
/* 功能:用于输入学生性别 */
int input_sex()
{
int sex;
printf("性别[1:男 2:女]:");
scanf("%d", &sex);
while(sex != 1 && sex != 2)
{
printf("性别选择有误!请重新选择:");
scanf("%d", &sex);
}
return sex;
}
/* 功能:用于输入三科成绩 */
void input_score(int *score)
{
while(1)
{
printf("三科成绩:");
scanf("%d%d%d", &score[0], &score[1], &score[2]);
if( (score[0] >= 0 && score[0] <= 100)
&& (score[1] >= 0 && score[1] <= 100)
&& (score[2] >= 0 && score[2] <= 100))
break;
printf("成绩输入有误,请重新输入!\n");
}
}
/* 功能:对学生信息进行排序 */
int sort(student *head)
{
int choice, found = 0;
student *p, *s, *temp, *p_back, *s_back;
if(head == NULL || head->next == NULL)
{/* 如果表头为空 */
printf("没有记录学生信息!\n");
return -1;
}
else
{/* 否则,就说明有内容 */
p = head;
printf( "对学生信息进行排序,请选择排序方式:\n"
"[1]学号\n"
"[2]总成绩\n"
"选择:");
while(1)
{
scanf("%d", &choice);
if(choice > 0 && choice < 3)
break;
printf("选择错误,请重新选择:");
}
while(p->next)
{
p_back = p; /* 保存当前结点 */
p = p->next; /* 切换至下个结点 */
s = p; /* 保存这个结点 */
s_back = p_back;/* 保存上个结点 */
while(s)
{/* 将当前结点的学号/总成绩与后面结点的学号/总成绩对比 */
if( choice == 1 && s->id < p->id
|| choice == 2 && s->total_score > p->total_score)
{/* 如果当前结点的学号/总成绩比后面结点的学号/总成绩大 */
p_back->next = s; /* 将s结点与p结点的上个结点相连 */
s_back->next = p; /* 将p结点与s结点的上个结点相连 */
/* 备份p结点的下个结点 */
temp = p->next;
/* 交换p结点和s结点的下个结点 */
p->next = s->next;
s->next = temp;
p = p_back->next;/* p指针切换回当前结点 */
}
s_back = s;
s = s->next;
}
}
printf("已经排序!\n");
}
return 0;
}
/* 功能:插入学生信息 */
void insert(student *head)
{
student *p, *s, *p_back;
/* 为这个结点分配内存 */
s = (student *)malloc(sizeof(student));
printf("学号:");
scanf("%d", &s->id);
printf("学生姓名:");
scanf("%s", s->name);
/* 输入学生性别 */
s->sex = input_sex();
printf("年龄:");
scanf("%d", &s->age);
/* 输入三科成绩 */
input_score(s->score);
/* 求总成绩 */
s->total_score = s->score[0];
s->total_score += s->score[1];
s->total_score += s->score[2];
/* 求平均成绩 */
s->avg_score = s->total_score / 3.0;
p = head->next;
p_back = head; /* 保存当前结点 */
while(p)
{
if( p->id > s->id )
{/* 如果当前结点保存的学号比新增的小,就需要插入该结点前面 */
p_back->next = s; /* 将s结点与p结点的上个结点首尾相连 */
s->next = p; /* 将s结点尾首与p结点相连 */
break;
}
if(p->next == NULL)
{/* 如果到了链尾,直接插入至链尾 */
p->next = s;
p = p->next; /* 切换至下个结点 */
p->next = NULL; /* 表示这是链尾 */
break;
}
p_back = p;
p = p->next;/* 切换至下个结点 */
}
printf("已经成功插入新的学生信息!\n");
}
/* 功能:列表显示学生信息 */
int output(student *head)
{
student *p;
system("cls");/* 清屏 */
printf("\n\n\t\t欢迎进入浏览学生成绩界面!\n\n");
if(head == NULL || head->next == NULL)
{
printf("\t\t没有记录学生信息!");
return -1;
}
p = head->next;
/* 打印表头 */
printf(
"┌───┬────┬──┬──┬──────┬───┬────┐\n"
"│ %s │ %s │%s│%s│ %s │%s│%s│\n"
"├───┼────┼──┼──┼──────┼───┼────┤\n"
,"学号","姓名","性别","年龄","三科成绩","总成绩","平均成绩");
/* 打印表中间的内容 */
do
{
printf( "│%-6d│%-8s│%s│%4d│ %3d %3d %3d│%6d│%8.2lf│\n",
p->id, p->name, p->sex==1?" 男 ":" 女 ", p->age,
p->score[0], p->score[1], p->score[2],
p->total_score, p->avg_score
);
p = p->next;
}
while(p != NULL);
/* 打印表尾 */
printf( "└───┴────┴──┴──┴──────┴───┴────┘\n");
return 0;
}
int main()
{
int choice;
student *head = NULL;
while(1)
{
system("cls");/* 清空屏幕内容 */
printf(
"*********************************\n\n"
"*\t学员成绩管理系统\t*\n"
"*\t\t\t\t*\n"
"*\t1 --- 录入\t\t*\n"
"*\t2 --- 插入\t\t*\n"
"*\t3 --- 排序\t\t*\n"
"*\t4 --- 查找\t\t*\n"
"*\t5 --- 删除\t\t*\n"
"*\t6 --- 输出\t\t*\n"
"*\t0 --- 退出\t\t*\n"
"*********************************\n\n"
"请输入选项<0-6>:"
);
scanf("%d", &choice);
switch(choice)
{
case 0 : exit(0);
case 1 : input(&head); getch();break;
case 2 : insert(head); getch();break;
case 3 : sort(head); getch();break;
case 4 : find(head); getch();break;
case 5 : delete(head); getch();break;
case 6 : output(head); getch();break;
}
}
return 0;
}