C++ 列表中的一个元素已排序,其他元素为';T

C++ 列表中的一个元素已排序,其他元素为';T,c++,C++,好的,我正在写一个程序,我必须输入n个学生的名字、名字和成绩。完成后,我必须按字母顺序排列,如果名字匹配,就在名字后面。然后我有另一个选项,可以按成绩排序。这是我目前的代码: #include<iostream> #include<string.h> #include<conio.h> #include<stdio.h> using namespace std; struct student { char name[30]; char fi

好的,我正在写一个程序,我必须输入n个学生的名字、名字和成绩。完成后,我必须按字母顺序排列,如果名字匹配,就在名字后面。然后我有另一个选项,可以按成绩排序。这是我目前的代码:

#include<iostream>
#include<string.h>
#include<conio.h>
#include<stdio.h>

using namespace std;

struct student
{
 char name[30];
 char firstname [50];
 int grade;
}s[50]; 

int i,n,o,done=0;


void add_student()
{
  cout<<"Number of students:"<<" ";
  cin>>n;
  cout<<endl;


   for(i=1; i<=n; i++)
    {

    fflush(stdin);
    cout<<"Student"<<" "<<i<<":"<<endl;

    cout<<"name of student:"<<" ";
    gets(s[i].name);

    cout<<"first name of student:"<<" ";
    gets(s[i].firstname);

    cout<<"grade of student:"<<" ";
    cin>>s[i].grade;
    cout<<endl;
   }
}


void sort_name()
{
 char temp[30];
  while(!done)
  {
    done=1;
    for(i=1; i<n; i++)
     {
    if(strcmp(s[i].name,s[i+1].name)>0)
        {
    strcpy(temp,s[i].name);
    strcpy(s[i].name,s[i+1].name);
    strcpy(s[i+1].name,temp);

        }
     }
  }

for(i=1; i<=n; i++)
  {
    cout<<"Student"<<" "<<i<<":"<<endl;
    cout<<"Name"<<":"<<s[i].name<<endl;
    cout<<"Firstname"<<":"<<s[i].firstname<<endl;
    cout<<endl;
  }
}


void sort_grade()
 {
 int temp;
  while(!done)
  {
    done=1;
    for(i=1;i<n;i++)
    {
        if(s[i].grade>s[i+1].grade)
        {
            temp=s[i].grade;
            s[i].grade=s[i+1].grade;
            s[i+1].grade=temp;
            done=0;
        }
    }
}

for(i=1; i<=n; i++)
{
    cout<<"Student"<<" "<<i<<":"<<endl;
    cout<<"Name"<<":"<<s[i].name<<endl;
    cout<<"Firstname"<<":"<<s[i].firstname<<endl;
    cout<<"Grade"<<":"<<s[i].grade<<endl;
    cout<<endl;
}


}

void list_students()
{
 int i;
 for(i=1; i<=n; i++)
{
    cout<<"Student"<<" "<<i<<":"<<endl;
    cout<<"Name"<<":"<<s[i].name<<endl;
    cout<<"Firstname"<<":"<<s[i].firstname<<endl;
    cout<<"Grade"<<":"<<s[i].grade<<endl;
    cout<<endl;
}
}



int main()
{
 do
 {

    cout<<"Menu:"<<endl;
    cout<<"1.Add students"<<endl;
    cout<<"2.Sort by name"<<endl;
    cout<<"3.Sort by grade"<<endl;
    cout<<"4.List  students"<<endl;
    cout<<"5.Exit"<<endl<<endl;
    cout<<"Pick option : ";
    cin>>o;
    cout<<endl;

        switch (o)
            {   
                case 1:add_student();
                break;
                case 2:sort_name();
                break;
                case 3:sort_grade();
                break;
                case 4:list_students();
                break;
            }
  }while (o!=5);
}
#包括
#包括
#包括
#包括
使用名称空间std;
结构学生
{
字符名[30];
charfirstname[50];
国际等级;
}s[50];
int i,n,o,done=0;
void add_student()
{

您的气泡排序是否存在一般问题

  • 使用条件进行排序,但仅交换条件而不交换其他特征!
    temp
    在这两种情况下都应为
    struct student
  • 索引移位1。在这两种排序情况下,都是从
    1
    开始到
    n-1
    ,但索引
    i
    i+1
    :缺少第一个元素,数组溢出1
  • “气泡排序”的名称是错误的(缺少要完成的矫揉造作):

    我会这么做的

    while(!done)
      {
        done = 1;
        for(i=0; i < n-1; i++)
          {
            if(strcmp(s[i].name, s[i+1].name) > 0)
              {
                done = 0; // still work to do
                temp = s[i];
                s[i] = s[i+1];
                s[i+1] = temp;
              }
          }
      }
    
    while(!done)
    {
    完成=1;
    对于(i=0;i0)
    {
    已完成=0;//仍有工作要做
    温度=s[i];
    s[i]=s[i+1];
    s[i+1]=温度;
    }
    }
    }
    
    排序等级也错误:固定版本:

    void sort_grade()
      {
        struct student temp;
        while(!done)
          {
            done = 1;
            for(i=0; i < n-1; i++)    // loop boundaries were not OK
              {
                if(s[i].grade > s[i+1].grade)
                  {
                    temp = s[i];
                    s[i] = s[i+1];
                    s[i+1] = temp;
                    done = 0;
                  }
              }
          }
      }
    
    void sort\u grade()
    {
    结构学生临时工;
    而(!完成)
    {
    完成=1;
    对于(i=0;is[i+1].grade)
    {
    温度=s[i];
    s[i]=s[i+1];
    s[i+1]=温度;
    完成=0;
    }
    }
    }
    }
    

    更不用说C++有一个有效的排序函数,它使用了一个标准,比这个(比你必须要做的)更好,

    ,而不是只交换你的部分结构(<代码> S[i],等级< /COD>内代码> SotGyGrame()/<代码>和<代码> S[i]。您应该交换整个结构。它应该如下所示:

    void swap(int n, int m)
    {
        char temp_string[50];
        int  temp_int;
    
        strcpy(temp,s[n].name);
        strcpy(s[n].name,s[m].name);
        strcpy(s[m].name,temp);
    
        strcpy(temp,s[n].firstname );
        strcpy(s[n].firstname ,s[m].firstname );
        strcpy(s[m].firstname ,temp);
    
        temp_int = s[n].grade;
        s[n].grade = s[m].grade;
        s[n].grade = temp_int;
    }
    
    void sort_name()
    {
        char temp[30];
        while(!done)
        {
            done=1;
            for(i=1; i<n; i++)
            {
                if(strcmp(s[i].name,s[i+1].name)>0)
                {
                    swap(i, i+1);
                }
           }
       }
    }
    
    无效交换(整数n,整数m)
    {
    字符临时字符串[50];
    内部温度;
    strcpy(temp,s[n].名称);
    strcpy(s[n].名称,s[m].名称);
    strcpy(s[m].名称、温度);
    strcpy(temp,s[n].firstname);
    strcpy(s[n].firstname,s[m].firstname);
    strcpy(s[m].名字,临时);
    温度int=s[n]。等级;
    s[n]。坡度=s[m]。坡度;
    s[n]。等级=温度;
    }
    void sort_name()
    {
    煤焦温度[30];
    而(!完成)
    {
    完成=1;
    对于(i=1;i0)
    {
    互换(i,i+1);
    }
    }
    }
    }
    
    代码中有很多错误的东西

    在这里,我只是为您修复了所有这些问题,但它可能受到了我的编码风格的影响:

    标题:

     #include <iostream>
     #include <cstring> //not <string.h>
     #include <cstdio> //not <stdio.h>
     //#include <conio.h> //you don't use any functionality from this header
     #include <limits>
     #include <cinttypes>
    
    Struct就像ok?我认为:

    struct student
    {
        char name[30];
        char firstname [50];
        int grade;
    }s[50];
    
    不要依赖全局变量(此程序模型需要
    n
    但是:

    int /*i,*/n=0/*,o,done=0*/; //don't declare global variables if you don't need them to be global
    
    修复了添加学生()
    (许多错误):

    main()

    intmain()
    {
    INTO;
    做
    {
    //求你了,别那样,很疼
    
    std::cout在交换时使用类似memcpy()的函数并交换整个结构,而不是name/gRade

    时间来熟悉调试器。这不是“c”,请不要执行
    fflush(stdin)在C++中,你知道在数组中的第一个元素是由<代码> 0代码>代码>吗?我只从1开始,因为学生的列表将从0像学生0,学生1等等那样来,我也这样做。如果它坏了,我不会再做它和FFLUH的相同的情况。我把C标签,因为我的许多书,甚至一些。我的老师没有解释C和C++之间的差异,他们只是让它们看起来是一样的,我知道不是这样。无论如何,谢谢大家的帮助。这是我第一次来这里,你们让我想改进。保持好的工作。结构是可分配的,所以<代码>交换< /代码>只需要<代码>学生。temp=s[n];s[n]=s[m];s[m]=temp;
    (但标准库中已经有一个
    交换
    。)非常感谢您的帮助。我只是开始编写代码,而且我读的大多数书都很模糊。我希望我也能学习并帮助他人。非常感谢您的洞察力。我才刚刚开始编写程序,我读的很多书都只涉及了一些非常基本的东西,但我正在努力,我想改进这没关系:)我会发布一些链接,对我评论/使用的东西进行很好的解释。再次感谢。我会研究你给我的代码和链接,我会尝试找到一些更好的书,并问我的老师更多的问题。谢谢:我知道还有其他更好的排序功能,但问题指定必须使用这个功能。还有感谢你指出我的错误。我是新手,虽然我基本上知道我的代码出了什么问题,但我仍然不知道如何修复或改进它。仍然缺乏经验永远不要在结构上使用memcpy。它只在包含POD对象/pure C的结构上工作。尝试复制包含
    向量
    字符串,此时它将严重崩溃。
    
    int /*i,*/n=0/*,o,done=0*/; //don't declare global variables if you don't need them to be global
    
    void add_student()
    {
        std::cout<<"Number of students:"<<" ";
        std::cin>>n;
        std::cout<<std::endl;
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //this is how you flush in c++
    
        for(int i=0/*1*/; i</*=*/n; i++) //declare iterator in loop
        {                       //also, first element index is 0, not 1!
    
            //fflush(stdin); //NEVER do that in C++, std::std::endl flushes output anyways
            std::cout<<"Student"<<" "<<i+1<<":"<<std::endl/*;*/ //dont spam std::cout too much
                  /*std::cout*/<<"name of student:"<<" ";      //just go to next line and start with "<<"
            std::gets(s[i].name);
    
            std::cout<<"first name of student:"<<" ";
            std::gets(s[i].firstname);
    
            std::cout<<"grade of student:"<<" ";
            std::cin>>s[i].grade;
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout<<std::endl; //this std::std::endl call flushes output, so that "C flushin" didn't do anything
        }
    }
    
    void sort_name()
    {
        bool done = false; //prefer bool over int for logical expressions
        /*char temp[30];*/ //not gonna use this, you need whole student, not only name
        student temp;
        while(!done)
        {
            // this whole section is wrong, you just go around swapping
            // students names, not students themselfs
            //        done=1;
            //        for(i=0/*1*/; i<n-1; i++)
            //        {
            //            if(strcmp(s[i].name,s[i+1].name)>0)
            //            {
            //                strcpy(temp,s[i].name);
            //                strcpy(s[i].name,s[i+1].name);
            //                strcpy(s[i+1].name,temp);
    
            //            }
            //        }
            done = true;
            for(int i=0; i<n-1; ++i)
            {
                if(strcmp(s[i].name, s[i+1].name)>0)
                {
                    std::cout << "swapping" << std::endl;
                    temp = s[i];
                    s[i] = s[i+1];
                    s[i+1] = temp;
                    done = false;
                }
            }
        }
    
        for(int i=0/*1*/; i</*=*/n; i++)
        {
            std::cout<<"Student"<<" "<<i+1<<":"<<std::endl
                <<"Name"<<":"<<s[i].name<<std::endl
                <<"Firstname"<<":"<<s[i].firstname<<std::endl
                <<std::endl;
        }
    }
    
    
    void sort_grade()
    {
        bool done = false;
        student temp;
    
        //exact same mistakes like in sort_name()
        while(!done)
        {
            done = true;
            for(int i=0; i<n-1; ++i)
            {
                if(s[i].grade > s[i+1].grade)
                {
                    temp = s[i];
                    s[i] = s[i+1];
                    s[i+1] = temp;
                    done = false;
                }
            }
        }
    
        for(int i=0/*1*/; i</*=*/n; i++)
        {
            std::cout<<"Student"<<" "<<i+1<<":"<<std::endl
                <<"Name"<<":"<<s[i].name<<std::endl
                <<"Firstname"<<":"<<s[i].firstname<<std::endl
                <<"Grade"<<":"<<s[i].grade<<std::endl
                <<std::endl;
        } 
    }
    
    void list_students()
    {
        for(int i=0/*1*/; i</*=*/n; i++)
        {
            std::cout<<"Student"<<" "<<i+1<<":"<<std::endl
                <<"Name"<<":"<<s[i].name<<std::endl
                <<"Firstname"<<":"<<s[i].firstname<<std::endl
                <<"Grade"<<":"<<s[i].grade<<std::endl
                <<std::endl;
        }
    }
    
    int main()
    {
        int o;
        do
        {
            //please, don't spam std::cout like that, it hurts
            std::cout<<"Menu:"<<std::endl
                <<"1.Add students"<<std::endl
                <<"2.Sort by name"<<std::endl
                <<"3.Sort by grade"<<std::endl
                <<"4.List  students"<<std::endl
                <<"5.Exit"<<std::endl<<std::endl
                <<"Pick option : ";
            std::cin>>o;
            std::cout<<std::endl;
    
            switch (o)
            {
            case 1:add_student();
                break;
            case 2:sort_name();
                break;
            case 3:sort_grade();
                break;
            case 4:list_students();
                break;
            }
        }while (o!=5);
    }