C++ 列表中的一个元素已排序,其他元素为';T
好的,我正在写一个程序,我必须输入n个学生的名字、名字和成绩。完成后,我必须按字母顺序排列,如果名字匹配,就在名字后面。然后我有另一个选项,可以按成绩排序。这是我目前的代码: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
#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);
}