С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
#1

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

28.11.2013, 19:48. Просмотров 479. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2013, 19:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Лишний раз выводит сообщение (C++):

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

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

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

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

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

Немогу разобраться, почему выводит каждое число по 20 раз? - C++
Ну суть ясна в названии, программировал в Borland C++ for DOS Код: #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; ...

11
fridi
-8 / 40 / 1
Регистрация: 21.09.2009
Сообщений: 145
28.11.2013, 19:59 #2
C
1
2
3
4
default:
                error=1;
                printf("Oshibka! Poprobuyte snova: ");
    break;
0
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
28.11.2013, 20:03  [ТС] #3
fridi, ничего не изменилось.
0
fridi
-8 / 40 / 1
Регистрация: 21.09.2009
Сообщений: 145
28.11.2013, 20:06 #4
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
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
28.11.2013, 20:09  [ТС] #5
fridi, спасибо! А почему cin вместо scanf? Ведь вся проблема именно с этим, а не с break..
0
fridi
-8 / 40 / 1
Регистрация: 21.09.2009
Сообщений: 145
28.11.2013, 20:15 #6
genock94 scanf - проглатывает что выводится на консоль, поэтому и была проблема, после неверного ввода, писалось сообщение и scanf подхватывал эту строку, и управление передавалось на ветку default....
1
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
28.11.2013, 20:18  [ТС] #7
Аркалык, дело в том, что цикл do введён в код для того, чтобы в случае возникновения ошибки (неправильно введённого символа, например) программа выдала бы сообщение:"Oshibka! Poprobuyte snova: " и заново попросила бы ввести пользователя символ (начался новый круг цикла do). Булева переменная error сигнализирует о наличии ошибки (неверно введённого символа, например), и т.к. в условии цикла do while (error == 1) у переменной error стоит значение 1, то цикл повторит круг. Поэтому нельзя изменить значение error на 0 в 29 строке.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.11.2013, 20:20 #8
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
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
28.11.2013, 20:22  [ТС] #9
fridi, ясно. Спасибо.
Не по теме: А где можно посмотреть подробные описания функций C++ (вплоть до алгоритма)? А то вот какая штука происходит с scanf, а я и не знал)

Добавлено через 1 минуту
nexen, класс) Спасибо!
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.11.2013, 20:23 #10
genock94, а это и с cin происходит. Просто в меньшей мере, так сказать. В данном случае, как видите, всё впорядке. Но у cin тоже есть метод на всякий случай: cin.ignore() помоему - пропускает '\n' в буфере ввода.
1
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
28.11.2013, 20:29  [ТС] #11
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
ПерС
375 / 291 / 90
Регистрация: 05.11.2013
Сообщений: 821
Записей в блоге: 5
Завершенные тесты: 1
30.11.2013, 12:45 #12
genock94, просто делай всегда перед scanf
C++
1
fflush (stdin);
1
30.11.2013, 12:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2013, 12:45
Привет! Вот еще темы с ответами:

Написать программу, которая выводит вашу имя и фамилию N раз - C++
Напишите пожалуйста код пот такой небольшой задачи:... ..Написать программу, которая выводит вашу имя и фамилию N раз....

Запишите программу, которая выводит значение целой переменной 25 раз - C++
Запишите программу, которая выводит значение целой переменной 25 раз

Подскажите еще раз пожалуйста, почему во 2 столбце не выводит слова? - C++
#include &lt;stdio.h&gt; #include &quot;iostream&quot; int main(void) { setlocale(0,&quot;&quot;); unsigned short cs1, cs2, cs3; char name1, name2,...

Почему вместо нужных значений программа выводит несколько раз -6.227744e+66? - C++
считываю матрицу чисел из файла double bufDownloadVector; std::ifstream stream(&quot;C:\\Users\\...\\dollar.txt&quot;); if...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.