Cтруктура на С++
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Здравствуйте, помогите решить проблему. После запуска и ввода данных, программа перестаёт работать, то есть не выводит результат на экран. Что здесь сделано не так? Заранее спасибо за ответ.
Само задание:
В программе целый букет ляпов. Настоятельно советую разобраться с темой «Массивы и указатели».
(1) В структуре есть поле
char *name
. Это указатель на данные типаchar
. Сам указатель никаким значением не инициализирован. Это раз. Место под данные не отведено. Это два. Т.е. в оператореcin>>student[i].name;
вводится строка по случайному (или нулевому, если добрый компилятор инициализировал поле структуры нулём) адресу — раз, и строка размещается в неотведённой для неё памяти — два. Крэш практически неизбежен.(2) Оператор
students *student = new students();
выделяет память под одну структуру, а не под массив структур. Множественное число в названии структуры ни к чему не обязывает. Поэтому операторcin>>student[i].name;
(и далее аналогичные) сработает только для первого студента. Приi
отличном от 0 будет обращение к «чужой» памяти, что опять-таки будет приводить к падению программы.Вышесказанное относится и к
students *excellentStudent = new students();
.Совет. Объявление структуры вынести из
main
в глобальную область. Структуру переименовать в единственное число:student
, поскольку она содержит данные об одном студенте. А массивы лучше именовать идентификаторами во множественном числе. На работоспособность программы это не влияет, но читать/отлаживать программу будет проще.(3) Конструкция
не будет работать так, как ты предполагаешь. Соответственно не будет правильно работать и сортировка, и вывод отличников на консоль. Надо исправить на
excellentStudent[n] = student[i];
.Кроме того использование операции присваивания по умолчанию здесь рискованно. Работа этого фрагмента будет зависеть от внутренней реализации структуры. (Это же относится и к фрагменту сортировки.)
(4) Сортировка по именам не будет работать правильно, если среди отличников будут студенты с фамилией, начинающейся на одну и ту же букву. Надо использовать сравнение строк.
(5) Неправильно написано условие продолжения цикла в последнем цикле (do). Должно быть
(6) Отсутствует освобождение памяти для переменных
student
иexcellentStudent
.Немножко «размял мозги»:
Неплохо получилось. Порадовал массив ссылок на структуры и финт с определением отличников.
Не понравился проскок без
break
изcase 0
вcase 1
в оператореswitch
. Такая конструкция работает правильно, но потенциально чревата ошибками. Здесь лучше просто спросить «Отсортировать отличников по алфавиту? [1/0]»; ввод проверитьif
'ом на равенство 1 (если равно, то сортируем), а дальше в любом случае вывод отличников на консоль. При этом избавляемся отswitch
и последнего цикла.Мой моск был отравлен вливаниями C++ 11-го стандарта ))
А если серьезно, то если по нормальному переделывать эту программу, то от исходного варианта только ключевые слова останутся. Кроме того, судя по заданию, уровень решения ожидается где-то на уровне конца 1-го семестра. Тут даже массив ссылок выглядит чужеродным ))
Мартын, конечно, ведь массив ссылок нельзя создать в C++. )))
Это моя очепятка. Конечно, массив не ссылок, а указателей.
Да лан, все всё поняли. )))