Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для genock94
21 / 21 / 8
Регистрация: 16.11.2012
Сообщений: 349

Лишний раз выводит сообщение

28.11.2013, 19:48. Показов 1349. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.
Уже час бьюсь над следующей проблемой.
Почему выводится сообщение:
"Oshibka! Poprobuyte snova: Oshibka! Poprobuyte snova: ",
вместо:
"Oshibka! Poprobuyte snova: "
???
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <conio.h>
////////////////////////////////////////
using namespace std;
int main() 
{
    enum etype {laborer, secretary, manager, accauntant, executive, researcher};
    char ch='0';
    etype dol;
    bool error;
    
    printf("Spisok doljnostey:\n");
    printf("laborer, secretary, manager, accauntant, executive, researcher\n");
    printf("Vvedite pervuyu bukvu doljnosti: ");
    do
    {
        error=0;
        scanf("%c",&ch);
        switch (ch)
        {
            case 'l': dol = laborer; break;
            case 's': dol = secretary; break;
            case 'm': dol = manager; break;
            case 'a': dol = accauntant; break;
            case 'e': dol = executive; break;
            case 'r': dol = researcher; break;
            default:
                error=1;
                printf("Oshibka! Poprobuyte snova: ");
        }
    } while (error);
 
    getch();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2013, 19:48
Ответы с готовыми решениями:

cout выводит сообщение один раз..больше не хочет....
13 и 14 строки выполняются только один раз при запуске программы. Почему? Все вроде правильно сделал :( #include &quot;stdafx.h&quot; ...

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

Список, выводит лишний нолик
Задание таково: Внести значения, выбрать количество элементов которые должны вывестись на экран с конца списка. Я почти решил но есть...

11
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
28.11.2013, 19:59
C
1
2
3
4
default:
                error=1;
                printf("Oshibka! Poprobuyte snova: ");
    break;
0
 Аватар для genock94
21 / 21 / 8
Регистрация: 16.11.2012
Сообщений: 349
28.11.2013, 20:03  [ТС]
fridi, ничего не изменилось.
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
28.11.2013, 20:06
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <conio.h>
////////////////////////////////////////
using namespace std;
int main() 
{
    enum etype {laborer, secretary, manager, accauntant, executive, researcher};
    char ch='0';
    etype dol;
    bool error;
    
    printf("Spisok doljnostey:\n");
    printf("laborer, secretary, manager, accauntant, executive, researcher\n");
    printf("Vvedite pervuyu bukvu doljnosti: ");
    do
    {
        error=0;
        cin >> ch;
        switch (ch)
        {
            case 'l': dol = laborer; break;
            case 's': dol = secretary; break;
            case 'm': dol = manager; break;
            case 'a': dol = accauntant; break;
            case 'e': dol = executive; break;
            case 'r': dol = researcher; break;
            default:
                error=1;
                printf("Oshibka! Poprobuyte snova: ");
                break;
        }
    } while (error);
 
    getch();
    return 0;
}
1
 Аватар для genock94
21 / 21 / 8
Регистрация: 16.11.2012
Сообщений: 349
28.11.2013, 20:09  [ТС]
fridi, спасибо! А почему cin вместо scanf? Ведь вся проблема именно с этим, а не с break..
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
28.11.2013, 20:15
genock94 scanf - проглатывает что выводится на консоль, поэтому и была проблема, после неверного ввода, писалось сообщение и scanf подхватывал эту строку, и управление передавалось на ветку default....
1
 Аватар для genock94
21 / 21 / 8
Регистрация: 16.11.2012
Сообщений: 349
28.11.2013, 20:18  [ТС]
Аркалык, дело в том, что цикл do введён в код для того, чтобы в случае возникновения ошибки (неправильно введённого символа, например) программа выдала бы сообщение:"Oshibka! Poprobuyte snova: " и заново попросила бы ввести пользователя символ (начался новый круг цикла do). Булева переменная error сигнализирует о наличии ошибки (неверно введённого символа, например), и т.к. в условии цикла do while (error == 1) у переменной error стоит значение 1, то цикл повторит круг. Поэтому нельзя изменить значение error на 0 в 29 строке.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.11.2013, 20:20
genock94, насколько я знаю, всё дело в переводе каретки, который остался в буфере ввода после scanf. Самое простое, как это можно увидет:
C++
1
2
3
4
char someChar;
int x;
scanf("%d", &x);
scanf("%c", &someChar);
После ввода числа и нажатия enter - у вас будет считано и число и \n - автоматом.
Тут произошло то же - второе сообщение вывелось потому, что программа посчитала, что вы ввели два символа - один, допустим, Z, а второй '\n'

Исправить можно несколькими способами. Раньше я делал так:
C++
1
2
3
char crap[10];
scanf("%d", &x);
gets(crap);//чистим весь мусор
Но теперь делаю так
C++
1
2
scanf("%d", &x);
scanf("%*c"); //очищает буфер и никуда (то что считал) не записывает
1
 Аватар для genock94
21 / 21 / 8
Регистрация: 16.11.2012
Сообщений: 349
28.11.2013, 20:22  [ТС]
fridi, ясно. Спасибо.
Не по теме: А где можно посмотреть подробные описания функций C++ (вплоть до алгоритма)? А то вот какая штука происходит с scanf, а я и не знал)

Добавлено через 1 минуту
nexen, класс) Спасибо!
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.11.2013, 20:23
genock94, а это и с cin происходит. Просто в меньшей мере, так сказать. В данном случае, как видите, всё впорядке. Но у cin тоже есть метод на всякий случай: cin.ignore() помоему - пропускает '\n' в буфере ввода.
1
 Аватар для genock94
21 / 21 / 8
Регистрация: 16.11.2012
Сообщений: 349
28.11.2013, 20:29  [ТС]
nexen, нашел еще 1 способ (использовать функцию geth(), только нельзя забыть подключить библиотеку conio.h):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//
#include <iostream>
#include <conio.h>
////////////////////////////////////////
using namespace std;
int main() 
{
    enum etype {laborer, secretary, manager, accauntant, executive, researcher};
    char ch='0';
    etype dol;
    bool error;
    
    printf("Spisok doljnostey:\n");
    printf("laborer, secretary, manager, accauntant, executive, researcher\n");
    printf("Vvedite pervuyu bukvu doljnosti: ");
    do
    {
        error=0;
        ch=getch();
        printf("%c",ch);
        switch (ch)
        {
            case 'l': dol = laborer; break;
            case 's': dol = secretary; break;
            case 'm': dol = manager; break;
            case 'a': dol = accauntant; break;
            case 'e': dol = executive; break;
            case 'r': dol = researcher; break;
            default:
                error=1;
                printf("\nOshibka! Poprobuyte snova: ");
        }
    } while (error);
    
 
    
    getch();
    return 0;
}
0
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,271
Записей в блоге: 6
30.11.2013, 12:45
genock94, просто делай всегда перед scanf
C++
1
fflush (stdin);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2013, 12:45
Помогаю со студенческими работами здесь

Контейнер map. Выводит лишний символ
Вот код. Шифр простой замены. В конце выводит последний символ 2 раза подряд. #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Почему лишний раз выводится строка?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; using namespace std; int main() { ...

_getch() считывает номер и прогоняет цикл лишний раз
for (int i = 0;i&lt;6; i++) { sim = _getch(); printf(&quot;%c &quot;,sim); sim = 0; } Гетч считает три элемента и после каждого...

Написать программу, которая выводит пример на вычитание, запрашивает ответ пользователя, проверяет его и выводит сообщение о правильности
Написать программу, которая выводит пример на вычитание (в пределах 100), запрашивает ответ пользователя, проверяет его и выводит сообщение...

printf в цикле выводит сообщение несколько раз
Есть код: for (i=0; i&lt;n; i++) for (j=0; j&lt;n; j++) { if (a!=0) printf (&quot;Парам-пам-пам-пам&quot;); else printf...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru