Оцените программу пожалуйста

Это так называемый Open sourse проект)

Неопределенно. В месте «Смотреть другие? (0 или 1)» нужно обозначить, что 0 это выход из программы.
И еще я бы ввел проверку на ввод других чисел.
Но идея есть :)

проверка недействительного диапазона присутствует!

Слава, ты сам попросил отзыв и какой-нибудь комментарий... так что без обид.

Первая реакция на твой код: «убейсебяапстену!».

Вторая реакция: классический пример того, как не надо писать программы на С/С++.

Потом пришла мысль, что человек видимо портировал программу с Basic розлива 1985 года или Fortran66: обилие if'ов и спагетти из goto.

Слава, я понимаю, что ты «новичок», но ТАК писать программы на С++ нельзя — камнями побьют.

Это была эмоциональная часть. Теперь попробую перейти к конструктивной.

(1) Я уже тебе отвечал, что цитаты лучше хранить отдельно от кода. В этом случае можно сделать программу полностью независимой от данных (цитат), а данные изменять/дополнять без перекомпиляции программы. Мы же не перекомпилируем Adobe Reader для просмотра очередного PDF.

(2) Для каждой цитаты заводить отдельную переменную — не самая здравая идея. Для этого существуют массивы. Выводить каждую цитату отдельным оператором — тоже не good, для этого существуют циклы.

(3) Одно из правил хорошего стиля программирования гласит: если фрагмент кода повторяется более одного раза — сделайте его подпрограммой. Здесь у тебя обширное поле для деятельности... целина, можно сказать.

(4) Ещё одно правило хорошего стиля программирования: оператор goto считать вредным. (кстати (с) Э. Дейкстра) В твоём коде goto используется и там, где можно, и там, где не нужно. Например:

if (vibor == 1  | vibor == 2 | vibor == 3){
    goto returning;}

else{
    system("cls");
    cout << "Неправильная комбинация!\n";
    goto back;}

 returning:

Зачем нужен goto returning;? Обходим ветку else, которая и так не будет выполняться?

В программе явно угадываются три цикла: основной, показывающий цитаты, и два цикла проверки правильности ввода пользователя (тема цитат и выбор автора цитат). Вот и надо их сделать циклами (do/while например), а не эмулировть циклы с помощью goto.

(5) Кроме оператора if в С/С++ ещё существует и оператор switch. Почему-то о нём частенько забывают. Это я про многочисленные if'ы при выборе цитат в зависимости от выбора пользователя.

(6) Операция логического ИЛИ обозначается ||, а символом | обозначается операция побитового ИЛИ. Это разные вещи. И то, что оператор if (vibor == 1 | vibor == 2 | vibor == 3) срабатывает правильно (кстати, можешь объяснить почему?), не означает, что эти операции взаимозаменяемы ))

(7) Оформление кода желает много лучшего.

И последнее, убери упоминание про яндекс-деньги. Во-первых, в сочетании с исходным кодом выглядит как «поможите, люди добре, копеечкой на пропитание». А во-вторых, до «начинающего разработчика» тебе ещё учиться и учиться.

Резюме. Желание программировать есть — и это хорошо. Знаний и опыта — нет.

Рекомендации. Читать, изучать книги по программированию на С++, учить язык, учить стандартные библиотеки — это в первую очередь. Читать книги по методологии программирования и по проектированию программ. И... писать программы.

Удачи!

Вот и надо их сделать циклами (do/while например), а не эмулировть циклы с помощью goto.

Хочу отметить, что именно циклы как раз и эмулируют goto — процессорный jmp на уровне ассемблера.

Но это так, просто дополнение. Метки использовать неудобно, поэтому их заменили человеческими конструкциями циклов и условных операторов в более высокоуровневых ЯП.

selevit, давай не будем мешать в одну кучу языки высокого (или хотя бы «среднего») уровня и ассемблер x86. Имеется масса языков программирования, в которых оператора goto или его аналога, нет вообще. Это не значит, что компиляторы таких языков принципиально нереализуемы для архитектуры x86 )))

Метки и goto не рекомендуется использовать не потому, что «неудобно», а потому, что их неконтролируемое использование приводит к:

  1. Написанию программ с запутанной логикой на уровне кода (так называемый «спагетти-код»), что в свою очередь ведёт к трудностям при отладке и сопровождении и, в итоге, к глючным программам.
  2. Осложнению работы оптимизирующих компиляторов.
  3. Ухудшению эффективности работы современных процессоров (непопадание в кэш процессора и пр.). Это, конечно, тонкости, но в редких случаях бывает критично.

В C++ оператор goto был оставлен для выхода из глубоко вложенных циклов, дабы не загромождать код лишними логическими переменными и проверками.

Про goto можно почитать у Дейкстры, Вирта, Страуструпа и других корифеев.

Метки и goto не рекомендуется использовать не потому, что «неудобно», а потому, что их неконтролируемое использование приводит к ...

В общем, приводят к усложнению дальнейшей поддержки кода. Работать над глючным неподдерживаемым кодом — это как раз то, что я имел ввиду под словом «неудобно».

selevit, давай не будем мешать в одну кучу языки высокого (или хотя бы «среднего») уровня и ассемблер x86.

А я и не мешаю. Ты сказал про эмуляцию циклов через goto, вот я и дополнил, что goto ничего не эмулирует на самом деле, но транслируется в jmp компилятором.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.