已经实现的功能
- seek()查找功能
- modify()修改信息
- insert()插入学生信息
- del()删除学生信息
- display()显示所有学生信息
- save()将学生信息保存到student.txt文件中
- refresh()刷新学生信息
具体实现:
这里建立Student类来存储学生所拥有的多个属性,并且定义成员方法insert(),当插入新的学生时,调用该方法来输入新增学生的各个属性。
查找功能:
seek() 查找功能分为学号和姓名查询,用户选择之后,根据用户输入遍历定义的学生对象数组,查找有无此学生,如果有,打印该学生所有属性信息:
void seek() /*查找*/
{
int i,item,flag;
string s1;
printf("------------------\n");
printf("-----1.按学号查询-----\n");
printf("-----2.按姓名查询-----\n");
printf("-----3.退出本菜单-----\n");
printf("------------------\n");
while(1)
{
printf("请选择子菜单编号:"); //选择功能
scanf("%d",&item);
flag=0;
switch(item)
{
case 1:
printf("请输入要查询的学生的学号:\n");
cin>>s1;
for(i=1;i<=n;i++) //遍历学生对象数据的学号属性
if(stu[i].num==s1) //如果存在
{
flag=1;
printf("学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n"); //打印属性信息
printf("--------------------------------------------------------------------\n");
cout<<stu[i].num<<" "<<stu[i].name<<"\t"<<stu[i].age<<"\t"<<stu[i].sex<<"\t"<<stu[i].score[0]<<"\t"<<stu[i].score[1]<<"\t "<<stu[i].score[2];
}
if(0==flag)
printf("该学号不存在!\n"); break;
case 2:
printf("请输入要查询的学生的姓名:\n");
scanf("%s",s1);
for(i=1;i<=n;i++) //遍历学生对象数据的学号属性
if(stu[i].name==s1) //如果存在
{
flag=1;
printf("学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n");
printf("--------------------------------------------------------------------\n");
cout<<stu[i].num<<" "<<stu[i].name<<"\t"<<stu[i].age<<"\t"<<stu[i].sex<<"\t"<<stu[i].score[0]<<"\t"<<stu[i].score[1]<<"\t "<<stu[i].score[2];
}
if(0==flag)
printf("该姓名不存在!\n"); break;
case 3:return;
default:printf("请在1-3之间选择\n");
}
}
}
修改信息功能:
修改信息功能是根据用户输入信息进行查找,如果查找存在该学生,便让用户选择修改该学生的哪一条信息。
void modify() //修改信息
{
int i,item,temp;
string sex1,s1,s2; // 以姓名和学号最长长度+1为准
float score1;
printf("请输入要要修改的学生的学号:\n");
scanf("%s",s1);
for(i=1;i<=n;i++)
if(stu[i].num==s1) //查找是否存在用户输入的学号
temp=i;
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改年龄\n");
printf("3.修改性别\n");
printf("4.修改C语言成绩\n");
printf("5.修改高等数学成绩\n");
printf("6.修改大学英语成绩\n");
printf("7.退出本菜单\n");
printf("------------------\n");
while(1)
{
printf("请选择子菜单编号:"); //选择要修改的属性信息
scanf("%d",&item);
switch(item)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s",s2);
stu[temp].name==s2; break;
case 2:
printf("请输入新的年龄:\n");
scanf("%d",stu[temp].age);break;
case 3:
printf("请输入新的性别:\n");
scanf("%s",&sex1);
stu[temp].sex==sex1; break;
case 4:
printf("请输入新的C语言成绩:\n");
scanf("%f",&score1);
stu[temp].score[0]=score1; break;
case 5:
printf("请输入新的高等数学成绩:\n");
scanf("%f",&score1);
stu[temp].score[1]=score1; break;
case 6:
printf("请输入新的大学英语成绩:\n");
scanf("%f",&score1);
stu[temp].score[2]=score1; break;
case 7: return;
default:printf("请在1-7之间选择\n");
}
}
}
插入学生信息功能:
insert()我选择定义在函数内部,当用户选择新增学生信息时,便创建一个学生类对象并且调用insert()方法,让用户输入新增学生的属性信息。新增学生的属性信息均由用户输入。
void insert() /* 插入函数*/
{
cout<<"请输入学生的学号: ";
cin>>num;
cout<<"请输入学生的姓名: ";
cin>>name;
cout<<"请输入学生的年龄: ";
cin>>age;
cout<<"请输入学生性别: ";
cin>>sex;
cout<<"请输入学生的C语言成绩:";
cin>>score[0];
cout<<"请输入学生高等数学成绩: ";
cin>>score[1];
cout<<"请输入学生的大学英语成绩: ";
cin>>score[2];
}
删除学生信息功能:
用户想要删除的学生,如果存在该学生,便将该学生后面的学生都前移一位,直接替换掉该学生的信息,即从学生对象数组中删除。
void del() //完成删除学生信息功能
{
int i,j,flag=0;
string s1;
printf("请输入要删除学生的学号:\n"); //输入学号搜索
scanf("%s",s1);
for(i=1;i<=n;i++) //遍历学生对象数组
if(stu[i].num==s1)
{
flag=1;
for(j=i;j<n-1;j++) //循环将后一个前移,将当前学生信息直接删除
stu[j].num=stu[j+1].num;
stu[j].name=stu[j+1].name;
stu[j].age=stu[j+1].age;
stu[j].sex=stu[j+1].sex;
stu[j].score[0]=stu[j+1].score[0];
stu[j].score[1]=stu[j+1].score[1];
stu[j].score[2]=stu[j+1].score[2];
}
if(flag==0)
printf("该学号不存在!\n");
if(flag==1)
{
printf("删除成功,显示结果请选择菜单\n");
n--;
}
}
显示学生信息功能:
直接将学生类对象数组里的多有信息按照固定格式循环打印即可:
void display() //将学生信息显示出来
{
int i;
printf("共有%d位学生的信息:\n",n);
if(0!=n)
{
printf("学生学号 学生姓名 年龄 性别 C语言成绩 高等数学 大学英语成绩\n");
printf("--------------------------------------------------------------------\n");
for(i=1;i<=n;i++)
{
cout<<stu[i].num<<" "<<stu[i].name<<" "<<stu[i].age<<"\t "<<stu[i].sex<<"\t"<<stu[i].score[0]<<"\t "<<stu[i].score[1]<<"\t "<<stu[i].score[2];
}
}
}
刷新学生信息功能:
void refresh()
{
ifstream infile("student.txt",ios::in);
int i =1;
string temp[4];
if(!infile.is_open())
{
cout<<"\n打开student.txt文件失败!\n";
}
while(!infile.eof()) //n为当前学生数,循环将所有学生信息写入文件
{
infile>>stu[i].num>>stu[i].name>>stu[i].age>>stu[i].sex>>stu[i].score[0]>>stu[i].score[1]>>stu[i].score[2]>>temp[1]>>temp[2]>>temp[3]>>temp[0];
i++;
n=i;
if(infile.fail())
{
break;
}
//fprintf(fp,"%f\n",stu[i].score[2]);
}
infile.close();
}
保存学生信息功能:
void save() //添加将学生信息保存至文件
{
//FILE *fp;
ofstream outfile("student.txt",ios::app);
int i;
// fp = fopen("student.txt","a"); //打开文件
if(!outfile.is_open()) //如果打开失败
{
printf("\n打开student.txt文件失败!\n");
}
for (i=1;i<=n;i++) //n为当前学生数,循环将所有学生信息写入文件
{
outfile<<"\n"<<stu[i].num<<" "<<stu[i].name<<" "<<stu[i].age<<" "<<stu[i].sex<<" "<<stu[i].score[0]<<" "<<stu[i].score[1]<<" "<<stu[i].score[2];
//fprintf(fp,"%f\n",stu[i].score[2]);
}
outfile.close();
}