weixin_45802952
newgooooal
采纳率100%
2021-03-08 20:29

C++ 基础简单的函数问题,逻辑问题没想明白

5
已采纳
#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删除时删除张三,为什么没有显示王五的信息

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • qq_45489807 琐琐闻 1月前

    第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);
    }

    目前你的系统还比较简单,可以考虑加一个循环来达到多次添加、删除学生的效果。

    点赞 1 评论 复制链接分享
  • wlj1234 wlj1234 1月前

    将count--;移动到循环外面,否则都删除了

    for(n;n<count;n++){
    	a[n]=a[n+1];
    }
    count--;
    点赞 评论 复制链接分享
  • SoftwareTeacher SoftwareTeacher 1月前

    写问题很清楚,赞一个! 另外删除的英语是 delete,  选择的英语是 select。 

    点赞 评论 复制链接分享