2015-04-08 4 views
1

Я пытаюсь выполнить следующую задачу:Сортировка массива строк в C++

Список студентов в алфавитном порядке, отсортированные по фамилиям. Не изменяйте данный случай имен. Не изменяйте формат выходного файла. (Имя Фамилия) Просто распечатайте записи в порядке по фамилиям, то есть

Annie J

Martin K

Toby L

Такого рода должна быть истинной алфавитный (а не только " лексикографический "вид).

Данные были прочитаны из файла и прошли через виртуальную функцию в зависимости от того, в какой курс был зачислен этот ученик. Вот что у меня есть.

for (int i = 1; i < numStudents; i++) 
{ 
    if ((list[i] -> getLastname()) < (list[i - 1] -> getLastname())) 
    { 
     Student *temp = list[i - 1]; 
     ist[i - 1] = list[i]; 
     list[i] = temp; 
    } 
} 

Я работаю над этим какое-то время, и я волнуюсь, что все это не так. Любые советы/указатели оценили!

+1

Вы (в основном) реализован внутренний цикл пузырьковой сортировки. Этого недостаточно, чтобы разобрать что-нибудь. Почему бы не использовать 'std :: sort'? Также кажется, что ваша программа, скорее всего, получит доступ за пределы вашего массива 'list', что тоже довольно опасно. –

+0

Извините, я немного новичок в программировании и все еще пытаюсь получить зависание строковых функций. Я взгляну! Благодаря! – JMoore

+0

Мне не разрешено использовать библиотеку алгоритмов :( – JMoore

ответ

0

Используйте сравнение строк функции вместо меньше, чем знак вы использовали здесь:

if ((list[i] -> getLastname()) < (list[i - 1] -> getLastname())) 

Также здесь подобный StackOverflow вопрос (частично)

Is string::compare reliable to determine alphabetical order?

+0

сравнение строк, как в строке :: compare, т.е.: stringA .compare (stringB) – serdarsenay

1

Я предполагаю, что вы имеют следующую структуру:

struct Student 
{ 
    std::string m_LastName; 
    std::string m_FirstName; 
}; 

Теперь вам нужно убедиться, что вы можете справиться с тем случаем, когда два человека имеют одну и ту же фамилию. В этом случае вы хотите посмотреть на имя.

bool NameCompare(const Student &name1, const Student &name2) 
{ 
    if(name1.m_LastName == name2.m_LastName) { 
     return name1.m_FirstName < name2.m_FirstName; 
    } 

    return name1.m_LastName < name2.m_LastName; 

}

Тогда просто вызовите своего рода в списке Student

std::list<Student> student_list; 
// add some Student to the list 
student_list.sort(NameCompare); 
Смежные вопросы