Сортировать имена по алфавиту

Я пытаюсь сортировать имена по алфавиту
например, если пользователь вводит имена и GPA:

Names          GPA
Peter          2.8
Robert         5.6
David          7.8

Выход должен быть:

Names          GPA
David          7.8
Peter          2.8
Robert         5.6

Вот моя программа пока (НЕПОЛНАЯ): —

#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;
}

Помните, только имя должно быть отсортировано по алфавиту. Я взял значения ASCII первых символов введенных имен в середине for цикл но:
1- Код ASCII для ‘s’ не совпадает с ‘S’ (для меня это проблема)
2- Я не могу создать логику для сравнения значений ASCII первых букв имен, а затем сортировать их соответствующим образом. Затем, связав имя с отсортированным списком букв и отобразив результат. Также ГПД должен быть связан с именами.

Любая помощь будет оценена.

2

Решение

Если вы преобразуете символ имени в верхний регистр, используя std::toupper тогда вы должны просто иметь возможность сравнить строки, используя < оператор.

Редактировать: если вы не хотите использовать std::sort 🙂

3

Другие решения

Вот ответ, используя std :: sort. Я изменил некоторые из ваших C-подобных подходов и использование std :: sort фактически заставляет меня это делать. Функция сравнения (compareStudents) нуждается в объектах, поэтому мне пришлось создать структуру. Vector использовался по той же причине, хотя было бы возможно продолжать использовать массивы, но это, как правило, осуждается.

#include <iostream>
#include <algorithm>
#include <vector>

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;
}
3

    #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();
}
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector