2013-12-08 17 views
2

Я пытаюсь отсортировать имена в алфавитном порядке например, если пользователь вводит имена и ГПД:Сортировать имена по алфавиту

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 первых букв имен, а затем отсортировать их соответственно. Затем, связывая имя с отсортированным списком букв и отображая результат. Также GPA должен быть связан с именами.

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

+0

http://en.cppreference.com/w/cpp/algorithm/sort – Caesar

ответ

3

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

Edit: если вы не хотите использовать std::sort :-)

+1

Да 'вроде' является сложным для меня. Но можете ли вы предоставить какие-либо рекомендации о том, как я могу это использовать? –

+0

Для toupper: http://www.cplusplus.com/reference/locale/toupper/ – splrs

+0

И для сравнения строк вы можете просто использовать «string1 splrs

3

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

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

Извините, но вы можете отредактировать и заменить часть 'vector' и' sorting' логическими алгоритмами с использованием петель и т. Д.? Я еще не изучил их, и мне было трудно понять. –

+0

@ denarced. Хорошая работа. вы написали ........ Студент-студент = * он; ...... Вы имели в виду ... const Student & student = * it; ...? –

+0

Нет, но это, вероятно, правильно :) Я написал код с минимальным вниманием к деталям, потому что важна только основная идея. В последнее время я не занимаюсь C++. – denarced

1
#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(); 
} 
+0

это простая логика с использованием указателей, попробуйте это ????????? – siddharth

Смежные вопросы