newgooooal 2021-03-08 20:29 采纳率: 83.3%
浏览 54
已采纳

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

#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条回答 默认 最新

  • 琐琐闻 2021-03-09 22:00
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL