吴玉然
学生信息管理系统
main.cpp
#include "list.h"
#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include<fstream>
using namespace std;
void xinjian(Listtype &L,Data data)
{
cout<<"新建学生信息输入"<<endl;
do
{ //循环添加结点数据
cout<<"Please enter the student id:";
cin>>data.num;
cout<<"Please enter the student name:";
cin>>data.name;
cout<<"Please enter the student age ( if the age entry is 0, you can end the entry ):";
cin>>data.age;
cout<<endl;
if(data.age)
{ //若年龄不为0
if(!Adddata(&L,data))
{
cout<<"Failure!"<<endl;
break;
}
}
else
break;
}while(1);
cout<<"长度为:"<<GetLength(&L);
cout<<"添加成功!"<<endl;
system("pause");
return;
}
void Add(Listtype &L,int i,Data data)
{
cout<<"插入学生信息输入"<<endl;
cout<<"请输入要插入位置:"<<endl;
cin>>i;
cout<<"请输入学生学号:";
cin>>data.num;
cout<<"请输入学生姓名:";
cin>>data.name;
cout<<"请输入学生年龄:";
cin>>data.age;
cout<<"插入前长度为:"<<GetLength(&L);
Insertdata(&L,i,data);
cout<<"插入后长度为:"<<GetLength(&L);
cout<<"插入成功!"<<endl;
system("pause");
return;
}
void Delete(Listtype &L,int i,int j,Data data)
{
cout<<"删除从第i位置起的j个学生数据:"<<endl;
cout<<"请输入i的值:";
cin>>i;
cout<<endl;
cout<<"请输入j的值:";
cin>>j;
cout<<endl;
IjDelete(&L,i,j);
cout<<"删除成功!"<<endl;
system("pause");
return;
}
void Show(Listtype &L)
{
cout<<"以下为所有学生的信息:"<<endl;
Show(&L);
cout<<endl;
system("pause");
return;
}
void Save(Listtype &L,Data data) //保存文件函数
{
cout<<"保存已输入数据中......"<<endl;
Savefile(&L,data);
system("pause");
return;
}
void xiugai(Listtype &L,int i,int j,Data data) //学生信息修改函数
{
system("cls"); //清屏
int choice2;
do
{
cout<<"\n********************************************************************************\n"<<endl;
cout<<" 学生信息修改"<<endl;
cout<<"\n"<<endl;
cout<<" 1.新建 2.增添"<<endl;
cout<<" 3.删除 4.显示"<<endl;
cout<<" 5.保存 0.返回"<<endl;
cout<<"\n"<<endl;
cout<<"\n"<<endl;
cout<<"\n********************************************************************************\n"<<endl;
cout<<"\n"<<endl;
cout<<"\n 请输入您的选择(1 or 2 or 3 or 4 or 0):";
cin>>choice2;
switch(choice2)
{
case 1:xinjian(L,data);break; //进入新建学生信息操作的函数
case 2:Add(L,i,data);break; //进入增添学生信息操作的函数
case 3:Delete(L,i,j,data);break; //进入删除学生信息操作的函数
case 4:Show(L);break; //进入显示学生信息操作的函数
case 5:Save(L,data);break; //进入保存文件的函数
case 0:cout<<endl<<"返回上一菜单!"<<endl;break; //返回上一菜单,即初始菜单界面
default:cout<<"无此选项!请重试!"<<endl;break; //若输入异常,显示异常操作,提示错误!
}
}while(choice2!=0);
}
void Icha(Listtype &L,int i,Data *&xian) //按位置查找函数
{
cout<<"长度为:"<<GetLength(&L);
cout<<"请输入要查找的学生的位置:";
cin>>i;
xian=DataGet(&L,i);
cout<<"姓名:"<<xian->name<<endl;
cout<<"学号:"<<xian->num<<endl;
cout<<"年龄:"<<xian->age<<endl;
system("pause");
return;
}
void chaxun(Listtype &L,int i,Data data,Data *&xian) //学生信息查询函数
{
system("cls");
cout<<"\n********************************************************************************\n"<<endl;
cout<<" 学生信息查询"<<endl;
cout<<endl;
cout<<" 1、按位置查询 0、返回"<<endl;
cout<<endl;
cout<<"\n********************************************************************************\n"<<endl;
int choice3=0;
cout<<" 请输入您的选择(1 or 2 or 3 or 0):";
cin>>choice3;
switch(choice3)
{
case 1:Icha(L,i,xian);break; //进入按位置查询的函数
case 0:cout<<endl<<"返回上一菜单!"<<endl;break; //返回上一菜单,即初始菜单界面
default:cout<<"无此选项!请重试!"<<endl;break; //若输入异常,显示异常操作,提示错误!
}
}
int main() //主函数
{
int i=0;
int j=0;
Listtype L;
Data data;
Data *xian;
ChuShiHua(&L);
system("cls"); //清屏
int choice1;
do //进入初始菜单界面
{
cout<<"\n*********************************************************************************"<<endl;
cout<<"\n**************************** *************************************"<<endl;
cout<<" *学生信息查询系统 \n"<<endl;
cout<<"\n"<<endl;
cout<<"\n"<<endl;
cout<<"\n************************** 1、学生信息管理 ***********************************"<<endl;
cout<<"\n************************** 2、学生信息查询 ***********************************"<<endl;
cout<<"\n*************************** 0、退出系统 ***********************************"<<endl;
cout<<"\n"<<endl;
cout<<"\n*********************************************************************************"<<endl;
cout<<"\n 请输入您的选择(1 or 2 or 0):";
cin>>choice1;
switch(choice1)
{
case 1:xiugai(L,i,j,data);break; //进入学生信息修改菜单界面
case 2:chaxun(L,i,data,xian);break; //进入学生信息查询菜单界面
case 0:cout<<"\n您已安全退出系统."<<endl;break; //退出系统,即结束此函数
default:cout<<"\n没有此选项.请重选."<<endl;break; //若输入异常,显示异常操作,提示错误!
}
}while(choice1!=0);
cout<<"\n------------------------------欢迎您下次再使用!---------------------------------"<<endl; return 0;
return 0;
}
List.cpp
#include "List.h"
#include <iostream>
#include <cstdlib>
#include <string>
#include<fstream>
using namespace std;
/**************************************************************************
功能描述:本函数是给顺序表进行初始化赋值,主要是给顺序表的长度
Length赋初值为0
输入参数:Listtype类型的指针变量L
输出参数:无
返回值:无
其他说明:无
***************************************************************************/
void ChuShiHua(Listtype*L) //顺序表的初始化函数
{
L->Length=0;
}
/**************************************************************************
功能描述:本函数可以的到顺序表的长度,即返回Length的值
输入参数:Listtype类型的指针变量L
输出参数:无
返回值:Length值
其他说明:无
***************************************************************************/
int GetLength(Listtype*L) //计算顺序表的长度
{
return(L->Length);
}
/**************************************************************************
功能描述:本函数是按照位置查找已经录入的学生信息,若输入的i值不
在有效内,输出错误信息;输入正确则返回要查询的地址
输入参数:Listtype类型的指针变量L,int类型的变量i
输出参数:错误信息
返回值:0或者查询的地址
其他说明:无
***************************************************************************/
Data *DataGet(Listtype*L,int i) //按照位置查找学生位置
{
if(i<1||i>MAXLEN)
{
cout<<"位置输入错误!"<<endl;
return 0;
}
else
{
return &(L->listData[i]);
}
}
/**************************************************************************
功能描述:本函数是按照名字查询录入的学生信息,输入要查找的姓名,
若找到与之匹配的,便返回其地址
输入参数:Listtype类型的指针变量L,string类型的变量name
输出参数:无
返回值:0或者要查找的地址
其他说明:无
***************************************************************************/
Data *NameGet(Listtype *L,string name) //按照姓名查找学生位置
{
int n;
for(n=1;n<=L->Length;n++)
{
cout<<n;
if(L->listData[n].name==name)
{
return &(L->listData[n]);
break;
}
else
return 0;
}
}
/**************************************************************************
功能描述:本函数是按照学号查询录入的学生信息,输入要查找的学号,
若找到与之匹配的,便返回其地址
输入参数:Listtype类型的指针变量L,string类型的变量num
输出参数:无
返回值:0或者要查找的地址
其他说明:无
***************************************************************************/
Data *NumGet(Listtype *L,string num) //按照学号查找学生位置
{
int n;
for(n=1;n<=L->Length;n++)
{
cout<<n;
if(L->listData[n].num==num)
{
return &(L->listData[n]);
break;
}
else
return 0;
}
}
/**************************************************************************
功能描述:本函数是在已经录入的学生信息里插入一条新的学生信息,判断
若顺序表满则不能继续存储,输入的i不在有效范围输出错误信息,
输入正确则插入成功
输入参数:Listtype类型的指针变量L,int类型的变量i,Data类型的变量data
输出参数:错误信息
返回值:0或者1
其他说明:无
***************************************************************************/
int Insertdata(Listtype*L,int i,Data data) //插入学生信息
{
int j;
if(L->Length>=MAXLEN)
{
cout<<"储存已满,不能添加!"<<endl;
return 1;
}
if(i<1||i>MAXLEN)
{
cout<<"插入序号错误!"<<endl;
return 1;
}
else
{
for(j=L->Length;j>=i;j--)
L->listData[j+1]=L->listData[j];
L->listData[i]=data;
L->Length++;
return 0;
}
}
/**************************************************************************
功能描述:本函数是删除指定位置的学生的信息,输入的i不在有效范围输出
错误信息,输入正确则删除成功。
输入参数:Listtype类型的指针变量L,int类型的变量i
输出参数:错误信息
返回值:0或者1
其他说明:无
***************************************************************************/
int Deletedata(Listtype*L,int i) //删除学生信息
{
int j;
if(i<1||i>MAXLEN)
{
cout<<"输入删除节点错误!"<<endl;
return 1;
}
else
{
for(j=i;j<L->Length;j++)
L->listData[j]=L->listData[j+1];
L->Length--;
return 0;
}
}
/**************************************************************************
功能描述:本函数是删除指定位置的学生的信息,输入的i,k不在有效范围输出
错误信息,输入正确则删除成功。
输入参数:Listtype类型的指针变量L,int类型的变量i,int类型的变量k
输出参数:无
返回值:0或者1
其他说明:无
***************************************************************************/
int IjDelete(Listtype*L,int i,int k) //删除顺序表中从第i个学生起的j个学生
{
if(i<1||k<0||i+k>L->Length+1)
return 1;
else
{
int j;
int count;
for(count=1;count<=k;count++)
{
for(j=i;j<i+k;j++)
{
L->listData[j]=L->listData[j+1];
}
L->Length--;
}
return 0;
}
}
/**************************************************************************
功能描述:本函数显示出所有的录入的学生的信息,按照制定格式输出到
电脑屏幕上
输入参数:Listtype类型的指针变量L
输出参数:无
返回值:无
其他说明:无
***************************************************************************/
void Show(Listtype*L) //显示所有的学生信息
{
int i;
for(i=1;i<=L->Length;i++)
{
cout<<"学号:"<<L->listData[i].num; cout<<"姓名:"<<L->listData[i].name; cout<<"年龄:"<<L->listData[i].age;
cout<<endl;
}
}
/**************************************************************************
功能描述:本函数能够连续添加学生信息,判断若线性表到达最大值,
输出提示信息
输入参数:Listtype类型的指针变量L,Data类型的变量data
输出参数:提示信息
返回值:0或者1
其他说明:无
***************************************************************************/
int Adddata(Listtype*L,Data data) //新建学生信息
{
if(L->Length>MAXLEN)
{
cout<<"存储已满,不能再添加学生!"<<endl;
return 0;
}
else
{
L->listData[++L->Length]=data;
return 1;
}
}
/**************************************************************************
功能描述:本函数能把所有的录入信息保存进入文件中,如果打开失败输出
错误信息,打开成功按照指定格式保存入文件
输入参数:Listtype类型的指针变量L
输出参数:无
返回值:无
其他说明:无
***************************************************************************/
void Savefile(Listtype *L,Data data) //保存文件
{
ofstream out("学生.txt",ios::out);
if(!out)
{
cout<<"打开失败!"<<endl;
return;
}
cout<<"打开成功!"<<endl;
for(int i=1;i<=L->Length;i++)
{
out<<"以下为所有学生信息:"<<endl;
out<<"学生姓名:"<<L->listData[i].name<<" "<<"学生学号:"<<L->listData[i].num<<" "<<"学生年龄:"<<L->listData[i].age<<" "
<<endl;
}
cout<<"写入成功!"<<endl;
out.close();
}
List.h
#ifndef LIST_H
#define LIST_H
#include <string>
using namespace std;
#define MAXLEN 100 //定义顺序表的最大长度
struct Data
{ //定义顺序表结点类型
string num; //节点关键字
string name;
int age;
};
struct Listtype
{ //定义顺序表结构
Data listData[MAXLEN+1]; //结构体中嵌套结构体
int Length;
};
void ChuShiHua(Listtype*L); //顺序表的初始化函数
int GetLength(Listtype*L); //计算顺序表的长度
Data *DataGet(Listtype*L,int i); //按照位置查找节点
Data *NameGet(Listtype*L,string name); //按照姓名查找节点
Data *NumGet(Listtype*L,string num); //按照学号查找节点
int Insertdata(Listtype*L,int i,Data data); //插入节点
int Deletedata(Listtype*L,int i); //删除节点
int IjDelete(Listtype*L,int i,int k); //删除顺序表中从第i个学生起的k个学生
void Show(Listtype*L); //显示所有的节点
int Adddata(Listtype*L,Data data); //追加节点
void Savefile(Listtype *L,Data data); //保存文件
#endif // LIST_H