我正在尝试按字母顺序对名称进行排序 例如,如果用户输入名称和GPA:
Names GPA
Peter 2.8
Robert 5.6
David 7.8
输出应为: -
Names GPA
David 7.8
Peter 2.8
Robert 5.6
到目前为止,这是我的程序( INCOMPLETE ): -
#include <iostream>
using namespace std;
int main()
{
char name [5][25];
float gpa [5];
int i;
for (i=0 ; i<5 ; i++)
{
cout << "Enter name " << i+1 << " : ";
cin >> name [i];
cout << "Enter GPA : ";
cin >> gpa [i];
cout << endl;
}
cout << "\n********** Your entered data **********\n\n";
cout << "\tName" << "\t\t" << "GPA\n\n";
for (i=0 ; i<5 ; i++)
{
cout << "\t" << name [i] << "\t\t" << gpa [i];
cout << endl;
}
for (i=0 ; i<5 ; i++)
{
for (int j=0 ; j<1 ; j++)
{
cout << (int) name [i][j] << endl;
}
}
cout << "\n\n******* Sorted data (w.r.t name) *******\n\n";
cout << "\tName" << "\t\t" << "GPA\n\n";
for (i=0 ; i<5 ; i++)
{
cout << "\t" << name [i] << "\t\t" << gpa [i];
cout << endl;
}
cout << endl;
return 0;
}
请记住,只应按字母顺序对名称进行排序。我在中间for
循环中取了输入名称的第一个字符的ASCII值,但是: -
1-'s'的ASCII码与'S'不同(这对我来说是个问题)
2-我似乎无法创建一个逻辑来比较名字的第一个字母的ASCII值,然后相应地对它们进行排序。然后将名称与已排序的字母列表相关联并显示结果。此外,GPA应与名称相关联。
任何帮助都将不胜感激。
答案 0 :(得分:3)
如果使用std::toupper
将名称的字符转换为大写,那么您应该能够使用&lt;来比较字符串。操作
编辑:如果您不想使用std::sort
: - )
答案 1 :(得分:3)
这是使用std :: sort的答案。我改变了一些类似C的方法,使用std :: sort实际上迫使我去做。比较函数(compareStudents)需要对象,所以我必须创建结构。 Vector虽然可以继续使用数组,但使用的数据也是如此,但这通常是不受欢迎的。
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
struct Student {
string name;
float gpa;
Student(string name, float gpa) {
this->name = name;
this->gpa = gpa;
}
};
bool compareStudents(Student a, Student b) {
return a.name.compare(b.name) < 0;
}
int main() {
const int studentCount = 2;
vector<Student> studentVector;
int i;
for (i = 0 ; i < studentCount ; i++) {
cout << "Enter name " << i + 1 << " : ";
string name;
cin >> name;
cout << "Enter GPA : ";
float gpa;
cin >> gpa;
cout << endl;
studentVector.push_back(Student(name, gpa));
}
cout << "\n********** Your entered data **********\n\n";
cout << "\tName" << "\t\t" << "GPA\n\n";
vector<Student>::iterator it = studentVector.begin();
for (; it != studentVector.end(); ++it) {
Student student = *it;
cout << "\t" << student.name << "\t\t" << student.gpa;
cout << endl;
}
sort(studentVector.begin(), studentVector.end(), compareStudents);
cout << "\n\n******* Sorted data (w.r.t name) *******\n\n";
cout << "\tName" << "\t\t" << "GPA\n\n";
it = studentVector.begin();
for (; it != studentVector.end(); ++it) {
Student student = *it;
cout << "\t" << student.name << "\t\t" << student.gpa;
cout << endl;
}
cout << endl;
return 0;
}
答案 2 :(得分:0)
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
class stu
{
char name[40];
int cgpa;
public:
void assign()
{cin>>name;
cin>>cgpa;
}
void display()
{cout<<name<<endl<<cgpa<<endl;
}
friend void align(stu *s,int v);
};
void align(stu *s,int v)
{for(int j=0;j<v-1;j++)
{for(int i=0;i<v-j-1;i++)
{//buble sort
if(strcmp((s+i)->name,(s+i+1)->name)>0)
{char l[40];
strcpy(l,(s+i)->name);
strcpy((s+i)->name,(s+i+1)->name);
strcpy((s+i+1)->name,l);
//swapping cgpa
int t=(s+i)->cgpa;
(s+i)->cgpa=(s+i+1)->cgpa;
(s+i+1)->cgpa=t;
}
}}}
int main()
{stu s[10];int i;
for(i=0;i<5;i++)
s[i].assign();
align(s,5);
cout<<endl<<endl;
for(i=0;i<5;i++)
s[i].display();
}