[基本要求]
学生基本信息包括:学号,姓名,所在院系等。
主要功能:
⑴ 添加和删除学生的基本信息;
⑵ 浏览所有学生信息;
⑶ 根据多种信息进行查询(根据姓名,所在院系等);
⑷ 统计特定院系的所有学生人数并排序;
⑸ 结果格式化显示。
要求:使用文件方式存储数据,系统以菜单方式工作,模块化设计。
代码如下:
#include <iostream>
#include <string>
#include <algorithm>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <windows.h>
using namespace std;
/*学生数据元素*/
typedef struct {
int num; //学号
string name; //姓名
string academy; //院系
}ElemType;
/*链表*/
typedef struct Node {
ElemType data;
struct Node* next;
}Node, * LinkList;
/*函数声明列表*/
void Read_LinkList(LinkList& L); //读取信息
void Save_LinkList(const LinkList& L); //保存信息
void Init_LinkList(LinkList& L); //初始化链表
void Create_LinkList(LinkList& L); //添加学生信息
void Delete_LinkList(LinkList& L); //删除学生信息
void Query_LinkList(const LinkList& L); //查询
void Print_LinkList(const LinkList& L); //显示
bool compare(const ElemType& t1, const ElemType& t2); //定义sort函数的关系
void count_LinkList(LinkList& L); //统计
void Sort_LinkList(LinkList& L); //排序
void menu(LinkList& L); //主控菜单
/*程序入口---主函数*/
int main()
{
LinkList L;
Init_LinkList(L);
Read_LinkList(L);
menu(L);
return 0;
}
/*读取信息函数*/
void Read_LinkList(LinkList& L)
{
Node* p = L;
ifstream infile("iox.txt", ios::in);
int len = 0;
infile >> len;
ElemType tem;
while (len--)
{
infile >> tem.num >> tem.name >> tem.academy ;
Node* t = new Node;
t->data = tem;
t->next = NULL;
p->next = t;
p = p->next;
}
infile.close();
}
/*保存信息函数*/
void Save_LinkList(LinkList& L)
{
Node* t = L, * cnt = L;
ofstream outfile("iox.txt", ios::out);
int len = 0;
while (cnt->next)
{
len++;
cnt = cnt->next;
}
outfile << len << endl;
while (t)
{
if (t != L)
outfile << t->data.num << "\t" << t->data.name << "\t" << t->data.academy << endl;
t = t->next;
}
outfile.close();
}
/*初始化链表函数*/
void Init_LinkList(LinkList& L)
{
L = new Node;
L->next = NULL;
}
/*添加信息函数*/
void Create_LinkList(LinkList& L)
{
system("cls");
cout << "\t\t\t**************添加信息***************" << endl;
Node* t = L;
int i = 1, flag = 1;
while (t->next)
{
i++;
t = t->next;
}
while (flag)
{
Node* p = new Node;
cout<<"\t\t\t输入学号:";
cin>>p-> data.num;
cout << "\t\t\t输入姓名:";
cin >> p->data.name;
cout << "\t\t\t输入院系:";
cin >> p->data.academy;
p->next = NULL;
t->next = p;
t = t->next;
Save_LinkList(L);
cout << "\t\t\t添加成功!是否继续添加?(1 是 0 否)" << endl;
cout << "\t\t\t请选择【0-1】:";
cin >> flag;
}
}
/*删除学生信息函数*/
void Delete_LinkList(LinkList& L)
{
system("cls");
cout << "\t\t\t**************删除信息***************" << endl;
int sel = 0;
Node* p = L, * t = NULL;
ElemType tem;
cout << "\t\t\t-----------------" << endl;
cout << "\t\t\t1 按学号删除" << endl;
cout << "\t\t\t2 按姓名删除" << endl;
cout << "\t\t\t3 返回主菜单" << endl;
cout << "\t\t\t-----------------" << endl;
cout << "\t\t\t请选择【1-3】:";
cin >> sel;
while (sel < 1 || sel>3)
{
cout << "\t\t\t输入错误,请重新输入【1-3】:";
cin >> sel;
}
if (sel == 1)
{
int flag = 0;
cout << "\t\t\t请输入待删除学生的学号:";
cin >> tem.num;
while (p->next)
{
t = p->next;
if (t->data.num == tem.num)
{
cout << "\t\t\t待删除学生的信息如下:" << endl;
cout<<"\t\t\t**************************************"<<endl;
cout << "\t\t\t学号\t" << "姓名\t" << "院系" << endl;
cout << "\t\t\t" << t->data.num << "\t" << t->data.name << "\t" << t->data.academy << endl;
cout<<"\t\t\t**************************************"<<endl;
flag = 1;
break;
}
p = p->next;
}
if (flag == 0) cout << "\t\t\t查无此人,无法删除!" << endl;
else
{
cout << "\t\t\t确认删除?(1 是 0 否)" << endl;
cout << "\t\t\t请选择【0-1】:";
cin >> sel;
while (sel < 0 || sel>1)
{
cout << "\t\t\t输入错误,请重新输入【0-1】:";
cin >> sel;
}
if (sel == 0);
else if (sel == 1)
{
p->next = t->next;
delete t;
cout << "\t\t\t删除成功!" << endl;
Save_LinkList(L); //改动保存至文件中
}
}
cout << "\n\t\t\t";
system("pause");
Delete_LinkList(L);
}
else if (sel == 2)
{
int flag = 0;
cout << "\t\t\t请输入待删学生的姓名:";
cin >> tem.name;
while (p->next)
{
t = p->next;
if (t->data.name == tem.name)
{
cout << "\t\t\t待删除的信息如下:" << endl;
cout<<"\t\t\t**************************************"<<endl;
cout << "\t\t\t学号\t" << "姓名\t" << "院系" << endl;
cout << "\t\t\t" << t->data.num << "\t" << t->data.name << "\t" << t->data.academy << endl;
cout<<"\t\t\t**************************************"<<endl;
flag = 1;
break;
}
p = p->next;
}
if (flag == 0) cout << "\t\t\t查无此人,无法删除!" << endl;
else
{
cout << "\t\t\t确认删除?(1 是 0 否)" << endl;
cout << "\t\t\t请选择【0-1】:";
cin >> sel;
while (sel < 0 || sel>1)
{
cout << "\t\t\t输入错误,请重新输入【0-1】:";
cin >> sel;
}
if (sel == 0);
else if (sel == 1)
{
p->next = t->next;
delete t;
cout << "\t\t\t删除成功!" << endl;
Save_LinkList(L);
}
}
cout << "\n\t\t\t";
system("pause");
Delete_LinkList(L);
}
else if (sel == 3) return;
}
/*查询函数*/
void Query_LinkList(const LinkList& L)
{
system("cls");
cout << "\t\t\t**************查询功能***************" << endl;
int sel = 0;
Node* t = L;
ElemType tem;
cout << "\t\t\t-----------------" << endl;
cout << "\t\t\t1 按姓名查询" << endl;
cout << "\t\t\t2 按院系查询" << endl;
cout << "\t\t\t3 返回主菜单" << endl;
cout << "\t\t\t-----------------" << endl;
cout << "\t\t\t请选择【1-3】:";
cin >> sel;
while (sel < 1 || sel>3)
{
cout << "\t\t\t输入错误,请重新输入【1-3】:";
cin >> sel;
}
if (sel == 1)
{
int flag = 0;
cout << "\t\t\t请输入待查询的姓名:";
cin >> tem.name;
while (t->next)
{
t = t->next;
if (t->data.name == tem.name)
{
cout << "\t\t\t待查询信息如下:" << endl;
cout<<"\t\t\t**************************************"<<endl;
cout << "\t\t\t学号\t" << "院系\t" << endl;
cout << "\t\t\t" << t->data.num << "\t" << t->data.academy << endl;
cout<<"\t\t\t**************************************"<<endl;
flag = 1;
break;
}
}
if (flag == 0) cout << "\t\t\t查无此人!" << endl;
cout << "\n\t\t\t";
system("pause");
Query_LinkList(L);
}
else if (sel == 2)
{
int flag = 0;
cout << "\t\t\t请输入待查询学生的院系:";
cin >> tem.academy;
while (t->next)
{
t = t->next;
if (t->data.academy == tem.academy)
{
cout << "\t\t\t待查询信息如下:" << endl;
cout<<"\t\t\t**************************************"<<endl;
cout << "\t\t\t学号" << "姓名\t" << endl;
cout << "\t\t\t"<< t->data.num<< "\t" << t->data.name<< endl;
cout<<"\t\t\t**************************************"<<endl;
flag = 1;
break;
}
}
if (flag == 0) cout << "\t\t\t查无此人!" << endl;
cout << "\n\t\t\t";
system("pause");
Query_LinkList(L);
}
else if (sel == 3)
{
return;
}
}
/*学生信息显示函数*/
void Print_LinkList(const LinkList& L)
{
system("cls");
cout << "\t\t\t***************学生信息***************" << endl;
Node* t = L->next;
cout << "\t\t\t-----------------------------------------------------" << endl;
cout << "\t\t\t学号\t" << "姓名\t" << "院系" << endl;
cout << "\t\t\t-----------------------------------------------------" << endl;
while (t)
{
cout << "\t\t\t" << t->data.num << "\t" << t->data.name << "\t" << t->data.academy<< endl;
t = t->next;
}
cout << "\t\t\t-----------------------------------------------------" << endl;
cout << "\t\t\t";
system("pause");
}
/*排序函数中sort函数的第三个参数*/
bool compare(const ElemType& t1, const ElemType& t2)
{
return t1.num < t2.num;
}
/*统计*/
void count_LinkList(LinkList& L)
{
system("cls");
cout << "\t\t\t***************统计功能***************" << endl;
int sel = 0;
int k=0;
Node* t = L;
ElemType tem;
cout << "\t\t\t-----------------" << endl;
cout << "\t\t\t1 按学院统计" << endl;
cout << "\t\t\t-----------------" << endl;
cout << "\t\t\t请选择【1】:";
cin >> sel;
if (sel == 1)
{
int flag = 0;
cout << "\t\t\t请输入待查询学生的院系:";
cin >> tem.academy;
while (t->next)
{
t = t->next;
if (t->data.academy == tem.academy)
{
cout << "\t\t\t待统计信息如下:" << endl;
cout<<"\t\t\t**************************************"<<endl;
cout << "\t\t\t学院人数为:" << endl;
cout << "\t\t\t"<< t->data.academy<< endl;
cout<<"\t\t\t**************************************"<<endl;
flag = 1;
k++;
break;
}
}
if (flag == 0) cout << "\t\t\t无此专业!" << endl;
cout << "\n\t\t\t";
system("pause");
count_LinkList(L);
}
{if(t->next==NULL)
cout<<"该专业不存在!";
return;
}
cout<<"该学院的学生共有"<<k<<"名!";
cout << "\t\t\t";
system("pause");
}
/*排序函数*/
void Sort_LinkList(LinkList& L)
{
system("cls");
cout << "\t\t\t***************排序功能***************" << endl;
Node* p = L;
int cnt = 0, i = 0;
while (p->next)
{
p = p->next;
cnt++;
}
ElemType* arr = new ElemType[cnt];
p = L;
while (p->next)
{
p = p->next;
arr[i++] = p->data;
}
sort(arr, arr + cnt, compare);
p = L, i = 0;
while (p->next)
{
p = p->next;
p->data = arr[i++];
p->data.num = i;
}
cout << "\t\t\t对信息进行排序并整理如下:" << endl;
Node* t = L->next;
cout << "\t\t\t-----------------------------------------------------" << endl;
cout << "\t\t\t学号\t" << "姓名\t" << "院系" << endl;
cout << "\t\t\t-----------------------------------------------------" << endl;
while (t)
{
cout << "\t\t\t" << t->data.num << "\t" << t->data.name << "\t" << t->data.academy << endl;
t = t->next;
}
cout << "\t\t\t-----------------------------------------------------" << endl;
Save_LinkList(L);
cout << "\t\t\t";
system("pause");
}
/*主控菜单函数*/
void menu(LinkList& L)
{
char sel;
system("cls");
cout << "\t\t\t********************************************" << endl;
cout << "\t\t\t你可以进行以下操作:" << endl;
cout << "\t\t\t|------------------------------------------|" << endl;
cout << "\t\t\t| 1 添加学生信息 |" << endl;
cout << "\t\t\t|------------------------------------------|" << endl;
cout << "\t\t\t| 2 删除学生信息 |" << endl;
cout << "\t\t\t|------------------------------------------|" << endl;
cout << "\t\t\t| 3 查询学生信息 |" << endl;
cout << "\t\t\t|------------------------------------------|" << endl;
cout << "\t\t\t| 4 浏览学生信息 |" << endl;
cout << "\t\t\t|------------------------------------------|" << endl;
cout << "\t\t\t| 5 统计 |" << endl;
cout << "\t\t\t|------------------------------------------|" << endl;
cout << "\t\t\t| 6 排序 |" << endl;
cout << "\t\t\t|------------------------------------------|" << endl;
cout << "\t\t\t| 0 退出 |" << endl;
cout << "\t\t\t|------------------------------------------|" << endl;
cout << "\t\t\t请选择【0-6】:";
cin >> sel;
while (sel < '0' || sel>'6')
{
cout << "\t\t\t输入非法,请重新选择【0-6】:";
cin >> sel;
}
switch (sel)
{
case '1':
Create_LinkList(L);
menu(L);
break;
case '2':
Delete_LinkList(L);
menu(L);
break;
case '3':
Query_LinkList(L);
menu(L);
break;
case '4':
Print_LinkList(L);
menu(L);
break;
case '5':
count_LinkList(L);
menu(L);
break;
case '6':
Sort_LinkList(L);
menu(L);
break;
case '0':
exit(0);
default:
menu(L);
}
}