/*10.学生信息管理
[问题描述]
编写一个程序实现学生基本信息的管理功能。
[基本要求]
(1)每个学生的基本信息包括:学号,姓名,性别,出生日期,所属学院,专业,年级等,其中学号不允许重复。。
(2)采用交互工作方式,输入N个学生的基本信息,N的值大于10。
(3)建立数据文件,存入所输入的N个学生的信息,数据文件按关键字(学号)进行排序,排序方法可以自己选择。
(4)可以对学生的基本信息进行更新操作(添加、删除),更新之后的数据文件保持原有的有序性。
(5)查询操作: (用二分查找实现以下操作)
A.按姓名查询
B.按学号查询
C.提供模糊查找的功能,如输入“刘”,可以查找到所有姓“刘”的学生的基本信息。
*/
#include<iostream>
#define N 100
using namespace std;
class sim
{
public:
void init(sim s[],int n);
void show(sim s[],int n);
void insert(sim s[],int n,int n1);
void del(sim s[],int n,int n2);
void find1(sim s[],int n,char f[]);
void find2(sim s[],int n,char f[]);
void find3(sim s[],int n,char c[]);
char sname[20];//sname 本来应该代表sn(student number) ,但是我马虎写成了 sname,所以.....
char name[20];
char sex[4];
char bd[20];//birthday
char c[20];//college
char m[20];//major
char g[20];//grade
};
void sim::init(sim s[],int n)//initialization.
{
for(int i=0;i<n;i++)
{
cout<<"请输入学号"<<endl;
cin>>s[i].sname;
cout<<"请输入姓名"<<endl;
cin>>s[i].name;
cout<<"请输入性别"<<endl;
cin>>s[i].sex;
cout<<"请输入出生日期"<<endl;
cin>>s[i].bd;
cout<<"请输入所属学院"<<endl;
cin>>s[i].c;
cout<<"请输入所属专业"<<endl;
cin>>s[i].m;
cout<<"请输入年级"<<endl;
cin>>s[i].g;
}
}
void sim::show(sim s[],int n)//输出已输入的数据
{
int j=0;
for(int i=0;i<n;i++)
{
cout<<endl;
cout<<"学号: "<<s[i].sname<<endl;
cout<<"姓名: "<<s[i].name<<endl;
cout<<"性别(1 for male, 0 for female): "<<s[i].sex<<endl;
cout<<"出生日期: "<<s[i].bd<<endl;
cout<<"所属学院: "<<s[i].c<<endl;
cout<<"专业: "<<s[i].m<<endl;
cout<<"年级: "<<s[i].g<<endl;
cout<<endl;
j=1;
}
if(j==0)
{
cout<<endl;
cout<<"无学生信息!"<<endl;
cout<<endl;
}
cout<<"学生总数:"<<n<<endl;
}
void sim::insert(sim s[],int n,int n1)//插入学生信息
{ // 0 1 2 0 1 2 3
for(int i=n-2;i>=n1-1;i--)//ex: 有3个学生信息:a,b,c要将d学生的信息插入到1号位置,则为a d b c .(用户输入的1代表0,2代表1,即用户输入i,这里对应的下标应为i-1)
{
strcpy(s[i+1].sname,s[i].sname);
strcpy(s[i+1].name,s[i].name);
strcpy(s[i+1].sex,s[i].sex);
strcpy(s[i+1].bd,s[i].bd);
strcpy(s[i+1].c,s[i].c);
strcpy(s[i+1].m,s[i].m);
strcpy(s[i+1].g,s[i].g);
}
i+=1;//总长+1
cout<<"请输入学号"<<endl;
cin>>s[i].sname;
cout<<"请输入姓名"<<endl;
cin>>s[i].name;
cout<<"请输入性别"<<endl;
cin>>s[i].sex;
cout<<"请输入出生日期"<<endl;
cin>>s[i].bd;
cout<<"请输入所属学院"<<endl;
cin>>s[i].c;
cout<<"请输入所属专业"<<endl;
cin>>s[i].m;
cout<<"请输入年级"<<endl;
cin>>s[i].g;
}
void sim::del(sim s[],int n,int n2)
{
for(int i=n2-1;i<n;i++){
{
strcpy(s[i].sname,s[i+1].sname);
strcpy(s[i].name,s[i+1].name);
strcpy(s[i].sex,s[i+1].sex);
strcpy(s[i].bd,s[i+1].bd);
strcpy(s[i].c,s[i+1].c);
strcpy(s[i].m,s[i+1].m);
strcpy(s[i].g,s[i+1].g);
}
}
}
void sim::find1(sim s[],int n,char f[])//查询方法1
{
int j=0;
for(int i=0;i<n;i++)
{
if(!strcmp(s[i].sname,f))
{
cout<<"学号: "<<s[i].sname<<endl;
cout<<"姓名: "<<s[i].name<<endl;
cout<<"性别: "<<s[i].sex<<endl;
cout<<"出生日期: "<<s[i].bd<<endl;
cout<<"所属学院: "<<s[i].c<<endl;
cout<<"专业: "<<s[i].m<<endl;
cout<<"年级: "<<s[i].g<<endl;
cout<<endl;
j=1;
}
}
if(j==0)
{
cout<<endl;
cout<<"无该学生信息!"<<endl;
cout<<endl;
}
}
void sim::find2(sim s[],int n,char f[])//查询方法2
{
int j=0;
for(int i=0;i<n;i++)
{
if(!strcmp(s[i].name,f))
{
cout<<"学号: "<<s[i].sname<<endl;
cout<<"姓名: "<<s[i].name<<endl;
cout<<"性别: "<<s[i].sex<<endl;
cout<<"出生日期: "<<s[i].bd<<endl;
cout<<"所属学院: "<<s[i].c<<endl;
cout<<"专业: "<<s[i].m<<endl;
cout<<"年级: "<<s[i].g<<endl;
cout<<endl;
j=1;
}
}
if(j==0)
{
cout<<endl;
cout<<"无该学生信息!"<<endl;
cout<<endl;
}
}
void sim::find3(sim s[],int n,char c[])//查询方法3
{
int k=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<strlen(s[i].name);j++)
{
if(c[0]==s[i].name[j])//ex: 模糊查找输入了一个字:森;s[i].name="黄逸森",则会用森字分别和黄,逸,森,三个字进行比较,符合则输出
{
cout<<"学号: "<<s[i].sname<<endl;
cout<<"姓名: "<<s[i].name<<endl;
cout<<"性别: "<<s[i].sex<<endl;
cout<<"出生日期: "<<s[i].bd<<endl;
cout<<"所属学院: "<<s[i].c<<endl;
cout<<"专业: "<<s[i].m<<endl;
cout<<"年级: "<<s[i].g<<endl;
cout<<endl;
k=1;
}
}
}
if(k==0)
{
cout<<endl;
cout<<"无该学生信息!"<<endl;
cout<<endl;
}
}
void write(sim s[],int n)//将数据写入文件
{
FILE *fp;
fp=fopen("F:\\Students_Information.txt","w");
for(int i=0;i<n;i++)
{
fputs("学号: ",fp);
fputs(s[i].sname,fp);
fputs("\n",fp);
fputs("姓名: ",fp);
fputs(s[i].name,fp);
fputs("\n",fp);
fputs("性别: ",fp);
fputs(s[i].sex,fp);
fputs("\n",fp);
fputs("出生日期: ",fp);
fputs(s[i].bd,fp);
fputs("\n",fp);
fputs("所属学院: ",fp);
fputs(s[i].c,fp);
fputs("\n",fp);
fputs("专业: ",fp);
fputs(s[i].m,fp);
fputs("\n",fp);
fputs("年级: ",fp);
fputs(s[i].g,fp);
fputs("\n",fp);
fputs("\n",fp);
}
}
void maopao(sim s1[],int n)
{
sim s2[5];
for(int i=0;i<n-1;i++)
for(int j=0;j<n-1-i;j++)
{
if(strcmp(s1[j].sname,s1[j+1].sname)>0)
{
s2[0]=s1[j];
s1[j]=s1[j+1];
s1[j+1]=s2[0];
}
}
}
int erfen(sim s1[],char f[],int n)//二分查找
{
int l=0,r=n-1,m;
while(l<=r)
{
m=(l+r)/2;
if(strcmp(f,s1[m].sname)>0)
l=m+1;
else if(strcmp(f,s1[m].sname)<0)
r=m-1;
else
return m;
}
return -1;
}
void main()
{
sim s,s1[N];
int n,m,n1,n2;
cout<<"请输入你要输入的学生总数"<<endl;
cin>>n;
while(1)
{
cout<<"功能如下:"<<endl;
cout<<" 1.输入学生数据(重复运行这步会把数据覆盖。)"<<endl;
cout<<" 2.添加学生"<<endl;
cout<<" 3.删除指定学生数据"<<endl;
cout<<" 4.查询指定学生数据"<<endl;
cout<<" 5.显示所有学生数据"<<endl;
cout<<" 6.结束输入,并将数据写入到文件 (Path:F:\\Students_Information.txt) "<<endl;
cout<<" 7.按学号进行升序排序"<<endl;
cin>>m;
if(m==1)
{
cout<<"!!!!!Attentions:学号不能重复!!!!"<<endl;
s.init(s1,n);
}
else if(m==2)
{ n+=1;
cout<<"插入到第几个学生?"<<endl;
cin>>n1;
s.insert(s1,n,n1);
}
else if(m==3)
{
cout<<"你想删除哪一个学生的信息?"<<endl;
cin>>n2;
s.del(s1,n,n2);
n-=1;
}
else if(m==4)
{
int i,j=0;
char f[30],c[1];
cout<<"查询方式:"<<endl;
cout<<" 1.输入学号查找."<<endl;
cout<<" 2.输入姓名查找."<<endl;
cout<<" 3.模糊查找,如输入“刘”,可以查找到所有姓名中有“刘”字的学生的基本信息."<<endl;
cin>>i;
if(i==1)
{
cout<<"请输入要查询的学号"<<endl;
cin>>f;
/* j=erfen(s1,f,n);//若要用二分查找,则将注释去掉即可
if(j==-1)
cout<<"无该学生信息!"<<endl;
else
{
cout<<"学号: "<<s[j].sname<<endl;
cout<<"姓名: "<<s[j].name<<endl;
cout<<"性别: "<<s[j].sex<<endl;
cout<<"出生日期: "<<s[j].bd<<endl;
cout<<"所属学院: "<<s[j].c<<endl;
cout<<"专业: "<<s[j].m<<endl;
cout<<"年级: "<<s[j].g<<endl;
cout<<endl;
}*/
s.find1(s1,n,f);
}
else if(i==2)
{
cout<<"请输入要查询的姓名"<<endl;
cin>>f;
s.find2(s1,n,f);
}
else if(i==3)
{
cout<<"请输入要查询学生姓名中含有的一个字"<<endl;
cin>>c;
s.find3(s1,n,c);
}
}
else if(m==5)
{
s.show(s1,n);
}
else if(m==6)
{
write(s1,n);
break;
}
else if(m==7)
{
maopao(s1,n);
}
}
}
软件实习-学生管理系统
最新推荐文章于 2024-08-12 11:59:06 发布