学生信息管理系统
功能模块
1、界面
2、数据结构设计
3、交互
界面
----------------------------------------------
1、录入信息
2、删除信息
3、修改信息
4、查找信息
5、浏览信息
0、退出信息
----------------------------------------------
数据结构设计
自定义学生信息结构体,所有的操作用链表实现。
姓名,性别,年龄,科目:数据结构、操作系统、计算机组成原理、计算机网络,总分
用户交互
根据菜单选择相应的服务
用switch()实现,用keyDown()封装
system("pause") 等待用户输入
system("cls") 清屏
功能模块
void menu();
void inputJudgeYorN(char &key);//用于判断每次是否正确输入y/n ,这里用引用,保证输入有效
void headInsertList(Stu *node);//头插法将node添加到链表
void writeDate(Stu *node);//将当前结点信息写入磁盘
void loadeDatre();//将文件信息加载到内存
void keyDown(int n);//按下按键,提供对应的服务
void insertInfo();//添加某位学生的信息到系统
void deleteInfo();//删除某位学生的信息
void reverseInfo();//修改某位学生的信息
void findInfo();//查找某位学生的信息
void sortDate();//将所有学生按照总分排序,采用冒泡的思想
void browseInfo();//将所有学生按照总分排名后输出
void quitProcess();//每次退出程序时,将所有的信息写入到文件,替换原来的文件
注意事项
关于文件操作的格式化读入读出
fwrite(p,sizeof(Stu),1,fp);//二进制文件操作,适用于一次写入一组数据
fread(p,sizeof(Stu),1,fp);//二进制文件操作,适用于一次读出一组数据
fprintf(fp, "%d, %s, %c", num, name, gender); //将数据格式化输出到文件info.txt中
fscanf(fp, "%d, %s, %c", &num, name, &gender); //从文件info.txt中格式化读取数据
feof(fp);//文件结束返回确认,即:非0
remove(“路径”);//删除指定位置的文件
为了永久保存信息,每次程序运行开始,就将文件中的信息加载到Head所指的链表中,退出程序的同时,删除文件,并重新写文件,以此实现数据的更新保存。
Code
#include
#include
#include
#include
using namespace std;
typedef struct {
float ds, os, composition, net, sumScore;
}Score;
typedef struct Stu {
char name[10];
char sex[2];
int age;
Score score;
Stu* next;
}Stu;
Stu* Head= new Stu();
void menu();
void inputJudgeYorN(char& key);
void headInsertList(Stu*& node);
void loadeDate();
void writeDate(Stu* node);
void sortDate(bool flag);
void keyDown(int n);
void insertInfo();
void deleteInfo();
void reverseInfo();
void findInfo();
void browseInfo();
void quitProcess();
int main(int argc, char** argv) {
int key;
Head->next = nullptr;
loadeDate();
while (1)
{
menu();
if (scanf("%d", &key) == 1) keyDown(key);
else {
do {
printf("输入有误,请重新输入!\n");
menu();
system("pause");
} while (scanf("%d", &key) != 1);
keyDown(key);
}
}
return 0;
}
void menu()
{
printf("***************【学生信息管理系统】***************\n\n");
printf("\t\t1、录入信息\n");
printf("\t\t2、删除信息\n");
printf("\t\t3、修改信息\n");
printf("\t\t4、查找信息\n");
printf("\t\t5、浏览信息\n");
printf("\t\t0、退出系统\n");
printf("\n***************************************************\n\n");
printf("【提示】请输入您需要的服务对应的数字:\n");
}
void keyDown(int n)
{
getchar();
switch (n) {
case 0: quitProcess();
case 1: insertInfo(); break;
case 2: deleteInfo(); break;
case 3: reverseInfo(); break;
case 4: findInfo(); break;
case 5: browseInfo(); break;
default: printf("输入有误!按下回车,请重新输入\n"); getchar(); getchar(); system("cls");
}
}
void insertInfo()
{
printf("---------------【添加】---------------\n\n");
while (1)
{
Stu* node = (Stu*)malloc(sizeof(Stu));
printf("请输入姓名:\n");
scanf("%s",node->name);
getchar();
printf("请输入性别:\n");
scanf("%s", node->sex);
getchar();
printf("请输入年龄:\n");
scanf("%d", &node->age);
printf("请输入联系方式:\n");
printf("请输入数据结构、操作系统、组成原理、计算机网络对应得成绩(用空格隔开):\n");
scanf("%f %f %f %f", &node->score.ds, &node->score.os, &node->score.composition, &node->score.net);
getchar();
node->score.sumScore = node->score.ds + node->score.os + node->score.composition + node->score.net;
headInsertList(node);
printf("当前信息添加成功!\n");
printf("是否继续添加?【y/n】\n");
char keyTemp;
inputJudgeYorN(keyTemp);
if (keyTemp == 'n' || keyTemp == 'N') break;
}
printf("当前服务结束!\n");
system("pause");
system("cls");
}
void deleteInfo()
{
printf("---------------【删除】---------------\n\n");
printf("请输入要删除的学生的姓名\n");
char nameTemp[20];
scanf("%s", nameTemp); getchar();
Stu* p = Head;
while (p->next)
{
if (strcmp(p->next->name, nameTemp) == 0)
{
Stu* temp = p->next;
p->next = temp->next;
free(temp);
break;
}
p = p->next;
}
if (p->next == nullptr) printf("没有这位同学的信息\n");
printf("当前服务结束!\n");
system("pause");
system("cls");
}
void reverseInfo()
{
printf("---------------【修改】---------------\n\n");
printf("请输入要修改学生的姓名\n");
Stu* pTemp = (Stu*)malloc(sizeof(Stu));
pTemp->next = nullptr;
scanf("%s", pTemp->name); getchar();
Stu* p2 = Head->next, *p1 = Head;
while (p2)
{
if (strcmp(p2->name, pTemp->name) == 0)
{
pTemp->next = p2->next;
printf("请重新输入该学生的信息:\n年龄:");
scanf("%d", &pTemp->age); getchar();
printf("\n性别:");
scanf("%s", pTemp->sex); getchar();
printf("\n数据结构、操作系统、组成原理、网络各科的成绩【成绩之间用空格隔开】:\n");
scanf("%f %f %f %f", &pTemp->score.ds, &pTemp->score.os, &pTemp->score.composition, &pTemp->score.net); getchar();
pTemp->score.sumScore = pTemp->score.ds + pTemp->score.os + pTemp->score.composition + pTemp->score.net;
*p2 = *pTemp;
p1->next = p2;
break;
}
p1 = p2;
p2 = p2->next;
}
if (p2 == nullptr) printf("没有这位同学的信息\n");
else printf("修改成功!\n");
free(pTemp);
printf("当前服务结束!\n");
system("pause");
system("cls");
}
void findInfo()
{
printf("---------------【查找】---------------\n\n");
char nameTemp[20];
printf("请输入要查找学生的姓名:");
scanf("%s",nameTemp);
getchar();
Stu *p=Head->next;
while(p)
{
if(strcmp(p->name,nameTemp)==0)
{
printf("姓名\t性别\t年龄\t数据结构\t操作系统\t组成原理\t网络\t总分\n");
printf("%s\t%s\t%d\t%-8.2f\t%-8.2f\t%-8.2f\t%-6.2f\t%-6.2f\n",p->name,p->sex,p->age,p->score.ds,p->score.os,p->score.composition,p->score.net,p->score.sumScore);
break;
}
p=p->next;
}
if(p==NULL){
printf("对不起!没有这位同学!或者这位同学的信息还未被保存在系统!\n");
}
printf("当前服务结束!");
system("pause");
system("cls");
}
void browseInfo()
{
printf("---------------【浏览】---------------\n\n");
bool flag = true;
sortDate(flag);
Stu* p = Head->next;
printf("姓名\t性别\t年龄\t数据结构\t操作系统\t组成原理\t网络\t总分\n");
while (p)
{
printf("%s\t%s\t%d\t%-8.2f\t%-8.2f\t%-8.2f\t%-6.2f\t%-6.2f\n", p->name, p->sex, p->age, p->score.ds, p->score.os, p->score.composition, p->score.net, p->score.sumScore);
p = p -> next;
}
printf("全部信息已经列出完毕!\n");
system("pause");
system("cls");
}
void headInsertList(Stu*& node)
{
node->next = Head->next;
Head->next = node;
}
void inputJudgeYorN(char& key)
{
if (scanf("%c", &key) != 1) {
printf("输入有误!请重新输入!\n");
inputJudgeYorN(key);
}
if (key != 'Y' && key != 'N' && key != 'y' && key != 'n') {
printf("输入有误,请重新输入!\n");
inputJudgeYorN(key);
}
getchar();
}
void writeDate(Stu* node)
{
FILE* fp = fopen("C:\\Users\\zhang\\Documents\\workspace\\visual_stdio\\stuInfosystem\\stuInfosystem\\studentsDate.txt", "a+");
Stu* p = Head->next;
while (p)
{
if (fwrite(p, sizeof(Stu), 1, fp) == 1)
{
p = p->next;
}
else {
printf("保存出现了点小故障,正在重试!\n");
writeDate(p);
}
}
fclose(fp);
printf("保存成功!\n");
}
void quitProcess()
{
remove("C:\\Users\\zhang\\Documents\\workspace\\visual_stdio\\stuInfosystem\\stuInfosystem\\studentsDate.txt");
writeDate(Head->next);
printf("本次所有操作已经保存在系统中!\n欢迎下次使用!\n再见!\n");
system("pause");
exit(0);
}
void loadeDate()
{
FILE* fp = fopen("C:\\Users\\zhang\\Documents\\workspace\\visual_stdio\\stuInfosystem\\stuInfosystem\\studentsDate.txt", "a+");
while (!feof(fp))
{
Stu* nodeTemp = (Stu*)malloc(sizeof(Stu));
fread(nodeTemp, sizeof(Stu), 1, fp);
headInsertList(nodeTemp);
}
fclose(fp);
}
void sortDate(bool flag)
{
Stu* p = Head;
Stu* p1 = Head->next;
while (p1)
{
if (p1->next == nullptr) break;
else {
Stu* p2 = p1->next;
if (p1->score.sumScore < p2->score.sumScore)
{
p->next = p1->next;
p1->next = p2->next;
p2->next = p1;
flag = false;
}
}
p = p->next;
p1 = p->next;
}
if (!flag)
{
flag = true;
sortDate(flag);
}
}