//学生信息管理系统
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct score
{
int score_c; //C语言成绩
int score_math; //高等数学
int score_english;//英语成绩
}Score;
typedef struct Student
{
char name[100]; //姓名
char num[100]; //学号
char sex; //性别(m代表男,f代表女)
int age; //年龄
Score score; //成绩
}stu;
typedef struct node
{
stu data;
struct node *next;
}LinkList;
void menu();
void help();
void next();
LinkList *InitLink(LinkList *L);
void InitLink1(LinkList **L);
void InsertLink(LinkList *L, LinkList *p);
void InsertLink1(LinkList *L, LinkList *p);
void add_student(LinkList *L);
void display(LinkList *L);
void deleted(LinkList *L);
void find_student(LinkList *L);
void update_student(LinkList *L);
void save_student(LinkList *L);
void read_student(LinkList *L);
void sort(LinkList *L);
int main()
{
LinkList *head;
InitLink1(&head);
// head = InitLink(head);
read_student(head);
int choose;
while(1)
{
menu();
printf("\n请输入你的选择:");
scanf("%d", &choose);
switch(choose)
{
case 1: help(); break;
case 2: sort(head); break;
case 3: find_student(head); break;
case 4: update_student(head);break;
case 5: add_student(head); break;
case 6: deleted(head); break;
case 7: display(head); break;
case 8: save_student(head); break;
case 9: exit(0); break;
default: next; break;
}
}
}
void menu() //显示菜单
{
system("cls");
printf("\n");
printf("********************************************************************************************\n");
printf("* 学生信息管理系统 *\n");
printf("********************************************************************************************\n");
printf("****************************************系统功能菜单****************************************\n");
printf("--------------------------------------------------------------------------------------------\n");
printf("********************************************************************************************\n");
printf("**** 1、使用帮助 **** 2、刷新学生信息-学号排序 ****\n");
printf("********************************************************************************************\n");
printf("**** 3、查询学生信息 **** 4、修改学生信息 ****\n");
printf("********************************************************************************************\n");
printf("**** 5、增加学生信息 **** 6、删除(学号)学生信息 ****\n");
printf("********************************************************************************************\n");
printf("**** 7、显示所有学生信息 **** 8、保存当前学生信息 ****\n");
printf("********************************************************************************************\n");
printf("**** 9、退出系统 **** ====》待开发模块《==== ****\n");
printf("********************************************************************************************\n");
printf("--------------------------------------------------------------------------------------------\n");
}
//使用帮助
void help()
{
system("cls");
printf("\n 这是一个学生管理系统,为方便您更快了解它,请先阅读以下注意事项: \n");
printf("\n 注意事项: \n");
printf("\n 1、请根据提示进行操作! \n");
printf("\n 2、初次使用请先选择增加学生信息! \n");
printf("\n 3、修改或者增加学生信息后切记保存! \n");
printf("\n 4、如果数据有错误,请先修改再保存! \n");
printf("\n 5、若您之前使用过,下次进入系统请先刷新学生信息! \n");
printf("\n 6、在添加学生时,用两个字符代表不同的性别,比如男用‘M’代替,女用‘W’代替!\n");
printf("\n 7、保存或者刷新时,输入的文件名后缀请使用.txt,比如: stu.txt,系统会在源程序\n");
printf("\n “学生管理系统.exe”的相同目录建立一个.txt文件来保存学生信息,您可以查看\n");
printf("\n 该文件,但非专业人员不要轻易改动,否则会造成刷新数据异常或刷新失败! \n");
printf("\n 8、学生信息包括:姓名、学号、性别、年龄、C语言成绩、高数成绩、英语成绩等! \n");
printf("\n 9、使用遇到任何问题请与我们联系,电话:110、119、120\n");
printf("\n 10、最后感谢您的使用! \n");
system("pause"); //让系统暂停
}
//待开发模块
void next()
{
system("cls");
printf("\n");
printf("********************************************************************************************\n");
printf("**** ====》此模块待开发《==== ****\n");
printf("********************************************************************************************\n");
system("pause"); //让系统暂停
}
//申请空间 1、返回一个指针 2、二级指针 3、引用 给变量起别名 拿到原本的东西
LinkList *InitLink(LinkList *L)
{
LinkList *tmp = L;
tmp = (LinkList *)malloc(sizeof(LinkList));
tmp->next = NULL;
return tmp;
}
void InitLink1(LinkList **L)
{
// LinkList *tmp = L;
*L = (LinkList *)malloc(sizeof(LinkList));
(*L)->next = NULL;
}
//在头节点后插入一个节点
void InsertLink(LinkList *L, LinkList *p)
{
LinkList *tmp = L;
p->next = tmp->next;
tmp->next = p;
}
void InsertLink1(LinkList *L, LinkList *p)
{
p->next = L->next;
L->next = p;
}
//增加学生信息
void add_student(LinkList *L)
{
char Sno[20];
char s;
Score sc;
LinkList *tmp = L->next;
printf("请输入学生的信息:\n");
printf("\n学号:");
scanf("%s", Sno);
while(tmp != NULL)
{
if(strcmp(tmp->data.num, Sno) == 0)
{
printf("该学生已存在!!!");
break;
}
tmp = tmp->next;
}
if(tmp == NULL)
{
LinkList *mmp;
mmp = InitLink(mmp);
strcpy(mmp->data.num, Sno);
printf("\n姓名:");
scanf("%s", &mmp->data.name);
printf("\n性别(m为男,f为女):");
getchar();
scanf("%c", &s);
mmp->data.sex = s;
printf("\n年龄:");
fflush (stdin);
scanf("%d", &(mmp->data.age));
printf("\nC语言成绩:");
fflush (stdin);
scanf("%d", &sc.score_c);
while(sc.score_c < 0 || sc.score_c > 100)
{
printf("\n输入1有误,请重新输入:");
fflush (stdin);
scanf("%d", &sc.score_c);
}
mmp->data.score.score_c = sc.score_c;
printf("\n高数成绩:");
fflush (stdin);
scanf("%d", &sc.score_math);
while(sc.score_math < 0 || sc.score_math > 100)
{
printf("\n输入2有误,请重新输入:");
fflush (stdin);
scanf("%d", &sc.score_math);
}
mmp->data.score.score_math = sc.score_math;
printf("\n英语成绩:");
fflush (stdin);
scanf("%d", &sc.score_english);
while(sc.score_english < 0 || sc.score_english > 100)
{
printf("\n输入3有误,请重新输入:");
fflush (stdin);
scanf("%d", &sc.score_english);
}
mmp->data.score.score_english = sc.score_english;
InsertLink(L, mmp);
}
system("pause");
}
//显示所有学生
void display(LinkList *L)
{
LinkList *tmp = L->next;
if(tmp == NULL)
{
printf("目前还未添加学生信息!!!\n");
system("pause");
return ;
}
while(tmp != NULL)
{
printf("姓名:%s\t", tmp->data.name);
printf("学号:%s\t", tmp->data.num);
printf("性别:%c\t", tmp->data.sex);
printf("年龄:%d\t", tmp->data.age);
printf("c语言成绩:%d\t", tmp->data.score.score_c);
printf("高等数学成绩:%d\t", tmp->data.score.score_math);
printf("大学英语成绩:%d\n", tmp->data.score.score_english);
tmp = tmp->next;
}
system("pause");
}
//删除(学号)学生信息
void deleted(LinkList *L)
{
LinkList *tmp = L->next;
LinkList *mmp = L;
int flag = 0;
char Sno[20];
if(tmp == NULL)
{
printf("数据表为空,请添加学生!!\n");
system("pause");
return ;
}
printf("\n请输入您要删除的学生的学号:");
fflush(stdin);
gets(Sno);
while(tmp)
{
if(strcmp(tmp->data.num, Sno) == 0)
{
mmp->next = tmp->next;
free(tmp); //删除了以后 进行内存的释放
printf("删除学生成功!!!\n");
flag = 1;
break;
}
mmp = tmp;
tmp = tmp->next;
}
if(flag == 0)
printf("这个学生不存在!!!\n");
system("pause");
}
//查询学生信息
void find_student(LinkList *L)
{
int flag;
char Sno[20], named[20];
LinkList *tmp = L->next;
if(tmp == NULL)
{
printf("还没有学生,请添加!!!\n");
system("pause");
return ;
}
printf("********************************************************************************************\n");
printf("**** 1、按学号查找 **** 2、按姓名查找 ****\n");
printf("********************************************************************************************\n");
printf("\n请输入查找方式:");
scanf("%d", &flag);
if(flag == 1)
{
printf("\n请输入您要查询的学生的学号:");
fflush(stdin);
gets(Sno);
while(tmp)
{
if(strcmp(tmp->data.num, Sno) == 0)
{
printf("姓名:%s\n", tmp->data.name);
printf("学号:%s\n", tmp->data.num);
printf("性别:%c\n", tmp->data.sex);
printf("年龄:%d\n", tmp->data.age);
printf("c语言成绩:%d\n", tmp->data.score.score_c);
printf("高等数学成绩:%d\n", tmp->data.score.score_math);
printf("大学英语成绩:%d\n", tmp->data.score.score_english);
system("pause");
return ;
}
tmp = tmp->next;
}
if(tmp == NULL)
printf("查无此人!!!");
}
else
{
printf("\n请输入您要查询的学生的姓名:");
fflush(stdin);
gets(named);
while(tmp)
{
if(strcmp(tmp->data.name, named) == 0)
{
printf("姓名:%s\n", tmp->data.name);
printf("学号:%s\n", tmp->data.num);
printf("性别:%c\n", tmp->data.sex);
printf("年龄:%d\n", tmp->data.age);
printf("c语言成绩:%d\n", tmp->data.score.score_c);
printf("高等数学成绩:%d\n", tmp->data.score.score_math);
printf("大学英语成绩:%d\n", tmp->data.score.score_english);
system("pause");
return ;
}
tmp = tmp->next;
}
if(tmp == NULL)
printf("查无此人!!!");
}
}
//修改学生信息
void update_student(LinkList *L)
{
char Sno[20];
LinkList *tmp = L->next;
Score sc;
if(tmp == NULL)
{
printf("无学生,请先添加学生!!");
system("pause");
return ;
}
printf("\n请输入要更新学生的学号:");
scanf("%s", Sno);
while(tmp != NULL)
{
if(strcmp(tmp->data.num, Sno) == 0)
{
printf("请输入您要修改的信息选项:1.姓名 2. 成绩(c语言,高等数学,大学英语) 3.年龄 \n");
int label;
scanf("%d", &label);
switch(label)
{
case 1:
printf("\n请输入要修改的姓名:");
scanf("%s", &tmp->data.name);
break;
case 2:
printf("\n请输入要修改的成绩:");
scanf("%d %d %d", sc.score_c, sc.score_math, sc.score_english);
tmp->data.score = sc;
break;
case 3:
printf("\n请输入要修改的年龄:");
scanf("%d", &(tmp->data.age));
break;
}
}
tmp = tmp->next;
}
printf("修改成功!!!");
system("pause");
}
//保存学生信息
void save_student(LinkList *L)
{
FILE *fp;
LinkList *tmp = L->next;
if(tmp == NULL)
{
printf("无学生,请先添加学生!!");
system("pause");
return ;
}
if((fp = fopen("student.txt", "w")) == NULL)
{
printf("不能打开此文件,请按任意见退出\n");
exit(1);
}
// fprintf(fp,"学号\t姓名\t性别\t年龄\tC成绩\t数学成绩\t英语成绩\n");
while(tmp)
{
fprintf(fp,"%s\t%s\t%c\t%d\t%d\t%d\t%d \n", tmp->data.num, tmp->data.name, tmp->data.sex,
tmp->data.age, tmp->data.score.score_c, tmp->data.score.score_math, tmp->data.score.score_english);
tmp = tmp->next;
}
printf("保存成功\n");
fclose(fp);
system("pause");
}
//读取预置文件
void read_student(LinkList *L)
{
FILE *fp;
int i = 1;
fp = fopen("student.txt", "rb");
if(fp == NULL)
{
printf("没有需要加载的文件或文件不存在!!!");
return ;
}
while(!feof(fp))
{
LinkList *tmp = (LinkList *)malloc(sizeof(LinkList));
tmp->next = NULL;
fscanf(fp,"%s\t%s\t%c\t%d\t%d\t%d\t%d \n", &tmp->data.num, &tmp->data.name, &tmp->data.sex,
&tmp->data.age, &tmp->data.score.score_c, &tmp->data.score.score_math, &tmp->data.score.score_english);
InsertLink(L, tmp);
}
fclose(fp);
}
//选择排序
//================注意===================//
void sort(LinkList *L)//按学号排序排序 并输出排序后的结果
{
LinkList *q, *p, *r = L->next;
//判断
int i = 0;
if(r == NULL)
{
printf("还没有学生信息,请增加学生信息\n");
return;
}
while(r->next != NULL) //两层循环完成排序
{
p = r;
q = r->next;
LinkList *tmp; //用于排序时暂存节点
tmp = InitLink(tmp);
while(q)
{
if(atoi(q->data.num) < atoi(p->data.num)) //atoi将字符串转换成数字 学号由小到大
// if(q->data.age < p->data.age) //年龄由小到大
{
printf("%d\n", i);
/*先复制q结点信息到tmp*/
strcpy(tmp->data.num, q->data.num);
strcpy(tmp->data.name, q->data.name);
tmp->data.sex = q->data.sex;
tmp->data.age = q->data.age;
tmp->data.score = q->data.score;
/*再复制p结点信息到q*/
strcpy(q->data.num , p->data.num);
strcpy(q->data.name , p->data.name);
q->data.sex = p->data.sex;
q->data.age = p->data.age;
q->data.score = p->data.score;
/*最后复制exchange结点信息到p*/
strcpy(p->data.num, tmp->data.num);
strcpy(p->data.name, tmp->data.name);
p->data.sex = tmp->data.sex;
p->data.age = tmp->data.age;
p->data.score = tmp->data.score;
i++;
}
q = q->next;
}
r = r->next;
}
printf("刷新后的学生信息是:\n");
display(L);
}