1 (12.01.2015 20:24:51 отредактировано Eeb>ei4m)

#include <iostream>
#include <cstdlib> // for clear
using namespace std;

int Menu (void) {

    char selection;

    cout << "\n\t Меню:\n\n";
    cout << " 1) Выбор первого пункта\n";
    cout << " 2) Выбор второго пункта\n";
    cout << " 3) Выбор третьего пункта\n";
    cout << " 4) Выбор четвёртого пункта\n";
    cout << " 5) Выход\n\n";
    cout << "\tВаш выбор: ";

    cin >> selection;

    switch (selection) {

        case '1': { system("clear"); cout << "Команды первого пункта\n"; }

                  break;

        case '2': {
                      system("clear"); cout << "Команды второго пункта\n";
                  }

                  break;

        case '3': {
                      system("clear"); cout << "Команды третьего пункта\n";
                  }

                  break;

        case '4': {
                      system("clear"); cout << "Команды четвёртого пункта\n";
                  }

                  break;

        case '5': { cout << " Выход\n"; }; return 0;

        default: { cout << "\n Не верный выбор\n"; }

    }

    cout << "\n";

}

int main () {

    system("clear");

    Menu ();

}
Ничто не меняется. (это не матиматическая функция)

2 (12.01.2015 15:15:11 отредактировано drBatty)

Eeb>ei4m пишет:

cin >> selection;

если вы хотите поймать один символ, то логичнее загрузить всю строку

std::string s;
cin>> s;

и потом брать первый символ

switch(s[0]){

PS:

       case '2': {
                      system("clear"); cout << "Команды второго пункта\n";
                  }

 

{скобки} тут не нужны.

PPS:
а за ЭТО:

system("clear");

надо УБИВАТЬ.

Если вы уж так хотите вывод в терминал типа как в MS-DOS, то используйте ncurses. Учтите, что clear всё равно зависит от libncursesw.so.5, и без неё работать не будет. Т.е. вы по любому к ncurses обращаетесь, но через задницу.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3 (12.01.2015 18:53:45 отредактировано Eeb>ei4m)

Спасибо за ответ, только жаль что я почти ничего не понял.

По пунктам:

1) Вы не могли бы повторить то же но развёрнуто или без слэнга?

2) Я так и не понял в какой части содержится ответ на мой вопрос ( в чём ошибка), почему несмотря на отсутствие break у default
происходит выход?

3)

если вы хотите поймать один символ

Я вообще никого ловить не собирался, в этой части совсем не понял ответа.

4)

{скобки} тут не нужны.

Как Вы их называете {скобки} нужны, потому что это анонимная функция (блок кода) и в рабочем варианте там много чего. А зесь они просто не мешают.

5)

Если вы уж так хотите вывод в терминал типа как в MS-DOS

Не понимаю где Вам приснился MS-DOS. Мне нужен аналог /usr/bin/clear который я использовал в bash. Если знаете как сделать лучше то подскажите как, и почему нельзя как у меня. В конечном варианте нужна раскраска, это делается с использлванием sys-libs/ncurses?

6) Слишком много развелось в интернете дистрофичных очкариков которые с лёгкостью оперируют словами типа: "убить" и "задница".
Меня лично это настораживает. (Среди моих знакомых очень много воевавших или сидевших людей но от них я такого никогда не слышал публично)

Повторю вопрос, где у меня ошибка? Почему происходит выход из меню?

Ничто не меняется. (это не матиматическая функция)

4

Eeb>ei4m пишет:

почему несмотря на отсутствие break у default происходит выход?

Встречный вопрос: почему с наличием или отсутствием break в switch default выход не должен происходить? Цитата из стандарта или учебника в качестве ответа вполне подойдёт.

5

Чесно? Понятия не имею. Давайте я лучше что-нибудь на баше сделаю... Не видел нужных примеров в учебнике. Не смог найти нужной документации.
Написал как пришло в голову и задал на форуме вопрос.
На баше я бы использовал цикл do while .
Это первая попытка. Я не могу понять логику. Где вход где выход. За последний месяц прочитал кучу всего по С++.
И начинаю думать что отсутствие типов переменных в баше не такое уж и зло.

Вы бы не боялись прослыть не остроумными а просто указали на ошибку.

Ничто не меняется. (это не матиматическая функция)

6 (12.01.2015 22:22:59 отредактировано Eeb>ei4m)

bormant пишет:
Eeb>ei4m пишет:

почему несмотря на отсутствие break у default происходит выход?

Встречный вопрос: почему с наличием или отсутствием break в switch default выход не должен происходить? Цитата из стандарта или учебника в качестве ответа вполне подойдёт.

возвращаться к меню надо в цикле? Блин! Эту бы подсказку 6 часов назад.  Типа дойди сам? Я задал вопрос с целью экономии времени.
Спасибо.

Ничто не меняется. (это не матиматическая функция)

7 (12.01.2015 21:59:30 отредактировано Eeb>ei4m)

Чем можно заменить команды bashbuiltins?

Ничто не меняется. (это не матиматическая функция)

8

[OFFTOP]
Классный вопрос.....
Ошибки то нет. Программа работает так как и должна работать (насколько можно судить по коду). Или задача была ОС написать?
"Прочитал много учебников", "непонял почему выходит, хотя break не стоит"... Хм, а я вообще не помню букваря в котором у default оно есть.
"На баше бы использова do while", "Прочитал много учебников"....... Блин, я уж думал, что затяжной проект на php мне окончательно мозг поел. Спросил у гугла - не не поел..... Точно в этих двух цитатах, что то не правильное.
[/OFFTOP]

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

9

Упс.. автор заблокированю

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

10

voral пишет:

Хм, а я вообще не помню букваря в котором у default оно есть.

хороший тон предполагает ставить break после default'а.
Если не ошибаюсь, в K&R есть.
Но это не важно.

Самое смешное в другом: Я собрал программу ТСа, и ВНЕЗАПНО:

Она РАБОТАЕТ.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

11

drBatty пишет:

Если не ошибаюсь, в K&R есть.

Да, действительно. Хм.... В памяти дырка.....

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

12

voral пишет:

автор заблокирован

Да, до 14.01.2015.

13

drBatty пишет:
voral пишет:

Хм, а я вообще не помню букваря в котором у default оно есть.

хороший тон предполагает ставить break после default'а.

Единственное, что требует ставить там break - так это только хороший тон. А так - это совершенно лишнее в конструкции case слово. Что есть там бреак, что нет его - по любому управление будет передано следующему после case {} оператору. И никуда иначе.

14

Cruiser78 пишет:

Единственное, что требует ставить там break - так это только хороший тон.

этого мало?

Cruiser78 пишет:

А так - это совершенно лишнее в конструкции case слово.

да, лишнее. Без него тоже работает. Вот только сишка — это вам не пхп и не сишарп. Тут нужно писать код аккуратно и правильно.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15 (14.01.2015 00:50:24 отредактировано voral)

А я вот, честно, даже "понять" не могу "хорошести" тона. Уже просто даже это железобетонно сидит, что default в конце и после него завершается case.... Вот только по вашей наводки глянул в К&Р и вновь "узнал" и что break "хороший тон" и что после default можно писать еще case ab.....

Не, я конечно понимаю, работа в команде чужой код.... Но мне бы точно по глазам резанул case после default ab

Ну вот, теперь, когда нибудь, в момент зашкаливания лени вколбашу case после default ab.

В прочем, писать еще один break не в лом. пусть будет. Пусть я буду чуть более воспитанным ab

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

16

Cruiser78 пишет:

Что есть там бреак, что нет его - по любому управление будет передано следующему после case {} оператору. И никуда иначе.

Не, ну если предположить совсем быдлокод, то после default можно вставить еще case..... И тогда break нужен.... Ну если это не "мега-ход" с "обдуманным" отсутствием break....

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

17

voral пишет:

и что после default можно писать еще case

default/case это просто метка для goto, которое тут называется switch.

voral пишет:

Но мне бы точно по глазам резанул case после default

иногда это удобно, когда есть некий case 'X', который нужно выполнить не только в случае X, но и в случае default тоже. Причём в случае default надо ещё что-то выполнить.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

18

voral пишет:

Не, ну если предположить совсем быдлокод

на самом деле, надо понимать, зачем вообще появилось switch/case.

Эта конструкция избыточна, и может быть отменена. Т.е. она необязательна, без неё можно обойтись, заменив её хотя-бы if/else.

Однако, почти в любом процессоре есть косвенный jump, т.е. не просто

jump куда_то

а

jump [таблица+индекс]

т.е. мы подготавливаем таблицу переходов, и потом одной командой прыгаем на нужный вариант. Это естественно на порядок быстрее, чем перебирать разные альтернативы.

Goto умеет прыгать только на фиксированную метку, и что-бы в C сделать такой косвенный переход по таблице, K&R придумали switch/case. Т.к. управляющая переменная является индексом, она может быть только целой.

В C++ тоже есть свой косвенный переход, в виртуальных функциях, причём он дважды косвенный: у каждого объекта в C++ имеется (в общем случае) указатель на Virtual Table, а эта VT представляет собой таблицу переходов виртуальных методов. Т.е. что-бы выполнить виртуальный метод для объекта, нам нужно:

1. разименовать указатель на VT объекта

2. перейти по адресу указанному в VT+смещение конкретного метода.

В C++ предпочтительнее использовать виртуальные методы, нежели switch/case. Но в простых случаях это слишком накладно.

PS: естественно оптимизирующий компилятор вовсе не обязательно будет обрабатывать switch/case описанным образом, он сделает так, как быстрее в данном конкретном случае.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

19

drBatty пишет:

иногда это удобно, когда есть некий case 'X', который нужно выполнить не только в случае X, но и в случае default тоже. Причём в случае default надо ещё что-то выполнить.

Я об этом тоже подумал... И, даже, случалось применять (правда не с default, а с другим case). Но, в этих случаях всегда не дает покоя "а вдруг, кто-то из команды, или сам с будуна, через пару лет воткнем между ними еще один case. Понятно, что такие моменты надо коментить, но тем не менее. Да и вообще, может таки лучше четко разделять, а нужный код объединять темиже функциями...... Тут может, конечно, без конкретного проекта решать не имеет смысла для "вообще". но.....

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

20

voral, ну надо просто помнить, что switch это замаскированное goto, и быть готовым к НЕОЖИДАННЫМ эффектам.

ИМХО основная ошибка ТСа в том, что он очень сложную логику запихал в switch. Я-бы сделал так:

switch(c)
{
  case 1:
    do_menu1();
    break;
  case 2:
    do_menu2();
    break;
  …
  default:
    // неверный ввод
    …
    break/return/_exit(1);
}
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

21

drBatty пишет:
Cruiser78 пишет:

Единственное, что требует ставить там break - так это только хороший тон.

этого мало?

Cruiser78 пишет:

А так - это совершенно лишнее в конструкции case слово.

да, лишнее. Без него тоже работает. Вот только сишка — это вам не пхп и не сишарп. Тут нужно писать код аккуратно и правильно.

Вот туплю я неимоверно. Объясните мне - в чем именно правильность сишного кода:

switch(){
 case 1: ....
          break;
 case 2: .....
         break;
 case 3:
 case 4: ....
         break;
 default: .....
         break; 
}

перед кодом

switch(...){
 case 1: ....
          break;
 case 2: .....
         break;
 case 3:
 case 4: ....
         break;
 default: .....
}

компилятор что, иную последовательность команд генерит? Или по завершению команд в "секции" default начнет исполнять невесть что, а не следующие после этого switch команды? покажите мне Сишный стандарт языка явно предписывающий секцию default завершать словом break.

И последнее - на любом языке надо писать правильно и аккуратно. И, при этом, понимать что именно пишешь. И как оно будет работать.

22

voral пишет:

Не, ну если предположить совсем быдлокод, то после default можно вставить еще case..... И тогда break нужен.... Ну если это не "мега-ход" с "обдуманным" отсутствием break....

Вы извращенец?

23 (14.01.2015 13:31:10 отредактировано voral)

Cruiser78 пишет:

Вы извращенец?

В сочетании со смыслом процитированной вами фразы этот вопрос звучит как предложение поступать так всегда ag. Кстати канву предложения я взял из K&R:

Добрый вам совет: даже в конце последней ветви (после default в нашем примере) помещайте инструкцию
break, хотя с точки зрения логики в ней нет никакой необходимости. Но эта маленькая предосторожность
спасет вас, когда однажды вам потребуется добавить в конец еще одну ветвь case.

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

24

Вообще для копиляторов (по крайней мере C/C++) не имеют значения отступы. Их можно пропустить. Да и еще 100500 правил "хорошего тона". Как я сказал выше необходимости ставить break в default лично я не осязаю. Но, раз есть люди, которые это осознанно считают хорошим тоном. Почему нет? Мне не сложно, от этого меня не коробит. Да и мешать оно не будет...

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

25

Cruiser78 пишет:

Объясните мне - в чем именно правильность сишного кода

после default можно ещё case воткнуть, но тогда ваш default будет работать неправильно.

Проблема в том, что обычно default — редкая ситуация, потому ошибку вы заметите не сразу, а вас потом в вашу ошибку ткнут мордой лица.

Cruiser78 пишет:

покажите мне Сишный стандарт языка явно предписывающий секцию default завершать словом break.

по стандарту вы никакие секции не обязаны завершать break'ом. Вполне корректен сл. код:

// перевод 1го символа в число. Что-то типа atoi, но в 16ирчной СС.
switch(c)
{
default:
  // обработка ошибки
  break;
case 'a': 
case 'b': 
case 'c': 
case 'd': 
case 'e': 
case 'f': 
  c -= 'a'-'0';
case '0': 
case '1': 
case '2': 
case '3': 
case '4': 
case '5': 
case '6': 
case '7': 
case '8': 
case '9': 
  c -= '0';
  x *= 16;
  x += c;
}
voral пишет:

Как я сказал выше необходимости ставить break в default лично я не осязаю. Но, раз есть люди, которые это осознанно считают хорошим тоном.

потому-что код написанный "по правилам" легче изменять.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

26 (19.01.2015 14:26:53 отредактировано Eeb>ei4m)

voral пишет:

Вообще для копиляторов (по крайней мере C/C++) не имеют значения отступы. Их можно пропустить. Да и еще 100500 правил "хорошего тона". Как я сказал выше необходимости ставить break в default лично я не осязаю. Но, раз есть люди, которые это осознанно считают хорошим тоном. Почему нет? Мне не сложно, от этого меня не коробит. Да и мешать оно не будет...

Я согласен с тем что надо писать понятно. Но как было сказано выше не имею опыта с С++ а писал в обычном редакторе без подсказок.
Буду стараться. И если уж зашла об этом речь, надо всем брать пример с питона в плане написания удобночитаемого кода.

drBatty,
Теперь понял, спасибо.

Ничто не меняется. (это не матиматическая функция)

27

drBatty пишет:
Cruiser78 пишет:

Объясните мне - в чем именно правильность сишного кода

после default можно ещё case воткнуть, но тогда ваш default будет работать неправильно.

Проблема в том, что обычно default — редкая ситуация, потому ошибку вы заметите не сразу, а вас потом в вашу ошибку ткнут мордой лица.

Знаете, Ваше замечание по сути сводится к тезису "а если бы он вез патроны?". Это первое. Второе - Вы даже не удосужились внимательно посмотреть на шаблон кода, который я привел. И начали рассказывать, что в ряде случаев можно работать и без break. Посмотрите на мой шаблон и Вы это сразу увидите.
И наконец - я действительно считаю, что писать надо руководствуясь "правилами хорошего тона", писать так, чтобы любой читатель твоего кода понял, что ты хотел сказать. Так вот, мои правила хорошего тона не допускают каких-либо конструкций после секции default. То есть - вначале обрабатываем явно заданные условия и в конце - дефолтное поведение. Писать код иначе - для меня однозначно быдлокодирование.

28

Извините что влез в сообщение которое не предназначалось мне. Оптимизация кода во время написания и после. Вы очень правы. И не спорьте пожалуйста с дактором бутти. Он даже не знает что использование избыточных функций и переменных увеличивает использование оперативной памяти.
Нам новичкам всё с ним ясно.

Ничто не меняется. (это не матиматическая функция)

29 (19.01.2015 18:27:37 отредактировано )

Cruiser78 пишет:

Знаете, Ваше замечание по сути сводится к тезису "а если бы он вез патроны?".

тогда бы он отстрелил-бы себе в лучшем случае ногу. Ну на практики бывает что и яйца, а шибко одарённые — голову.

Cruiser78 пишет:

Так вот, мои правила хорошего тона не допускают каких-либо конструкций после секции default.

если вы пишете код в одиночку, вы _всегда_ можете придерживаться своих правил. Всегда ваш, К.О.

Eeb>ei4m пишет:

Он даже не знает что использование избыточных функций и переменных увеличивает использование оперативной памяти.

на сколько спорим?

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

30 (19.01.2015 18:35:58 отредактировано )

ведь это беспонтовая трепня?

Если я выиграю ты меняешь аватар на месяц

Ничто не меняется. (это не матиматическая функция)