#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
struct student{
char name[20];
float math;
};
int count=3;
void show(struct student a[]){
for(int i=0;i<count;i++){
cout<<setw(6)<<a[i].name<<setw(6)<<a[i].math;
cout<<endl;
}
}
void add(struct student a[]){
cout<<"请输入添加的学生姓名和成绩:"<<endl;
student stu;
int n=count;
cin>>stu.name>>stu.math;
for(int i=0;i<count;i++){
if(stu.math>=a[i].math){
n=i;
break;
}
}
for(int j=count;j>n;j--)
a[j]=a[j-1];
a[n]=stu;
count++;
show(a);
}
void delect(struct student a[]){
show(a);
cout<<"请输入要删除的学生姓名:"<<endl;
char name[20];
cin>>name;
int n=count;
for(int i=0;i<count;i++){
if(strcmp(name,a[i].name)==0){
n=i;
break;
}
}
if(n==count)
cout<<"查无此人\n";
else if(n==0){
for(n;n<count;n++){
a[n]=a[n+1];
count--;
}
show(a);
}
else{
for(;n<count;n++){
a[n]=a[n+1];
count--;
}
show(a);
}
}
int main(){
int num;
cout<<"---------学生信息管理系统-----------"<<endl;
cout<<"1.添加学生信息"<<endl;
cout<<"2.删除学生信息"<<endl;
cout<<"3.退出系统"<<endl;
cout<<"请输入菜单编号:"<<endl;
struct student a[10]={{"张三",90},{"李四",85},{"王五",73}};
cin>>num;
switch(num){
case 1:add(a);break;
case 2:delect(a);break;
default:cout<<"输入错误!"<<endl;
break;
}
// student a[10]={{"张三",90},{"李四",85},{"王五",73}};
system("pause");
return 0;
}
在选择2删除时删除张三,为什么没有显示王五的信息
第46-61行
if(n==count)
cout<<"查无此人\n";
else if(n==0){
for(n;n<count;n++){
a[n]=a[n+1];
count--;
}
show(a);
}
else{
for(;n<count;n++){
a[n]=a[n+1];
count--;
}
show(a);
}
这一段可以发现两个问题:一是else if(n==0)后的代码块和else后的代码块是重复的,可以把他们放在一起,如下
if(n==count)
cout<<"查无此人\n";
else{
for(;n<count;n++){
a[n]=a[n+1];
count--;
}
show(a);
}
二是count--是在for循环里面的,count是学生系统里的学生人数,在删除一位学生之后应该自减1,但若放在for循环里则会发生多次自减导致count比预想的更少。用删除张三为例,张三是第一个学生,故下标为0,进入该代码块之前n==0,count==3;进入else语句块后a[1]移至a[0]的位置,count--,n++,此时count==2,n==1,n<count判定通过,进入下一次循环;a[2]移至a[1]的位置,count--,n++,此时count==1,n==2,n<count判定不通过,结束for循环。可以发现count进行了两次自减,导致学生系统中的人数只剩下了一位,故此发生了错误。可以把count--放置循环外来解决,如下
if(n==count)
cout<<"查无此人\n";
else{
for(;n<count;n++)
a[n]=a[n+1];
count--;
show(a);
}
目前你的系统还比较简单,可以考虑加一个循环来达到多次添加、删除学生的效果。
写问题很清楚,赞一个! 另外删除的英语是 delete, 选择的英语是 select。
将count--;移动到循环外面,否则都删除了
for(n;n<count;n++){
a[n]=a[n+1];
}
count--;