Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 248
1

программа пропускает строку

08.06.2020, 22:39. Показов 3213. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Бодрого времени суток!

Имеем: я(самоучка) - уровень "днище" + много желания развиваться, учебник по с++, задача(условие ниже), мое описание и мысли через призму моих знаний, которые где-то в 0, сам код внизу, результат в виде картинки.

Задача: написать простую прогу в которой пользователь вводит поочередно слова в виде строковых переменных и эти строковые переменные вставляются в объект списка.

Вопрос:
1. В чем причина пропуска(или странной работы) строки 26 и не отсутствие возможности пользователя ввести очередное слово.
Понятное дело что из-за нехвата знаний.
При переходе с помощью оператора goto на повторный ввод слова, строка 26 не дает возможности ввести слово, к тому же вывод вопроса о повторе ввода идет следом, а не на след. строке.

Мои размышления:
Должны создаваться новые строковые переменные? вроде бы нет, ведь мы вызываем функцию вставления строковой переменной в объект списка(я не залезал в файл stl библиотеки т.к. моих знаний еще не достаточно для полного понимания тчо там происходит), в этой функции вызывается метод вставки\создания атрибута объекта, если создание значит копирование из строковой переменной в атрибут объекта? если так то тогда, мне кажется, можно иметь одну строковую переменную которую мы перезаписываем новыми словами и отправляем в функцию вставки в список.

Кликните здесь для просмотра всего текста

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
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <string>
#include <list>
using namespace std;
 
template <typename T>
void insertStringList(T & inputObjList, string & inputString)
{
    // Вставим входящуюю строку в конец списка.
    inputObjList.push_back (inputString);
}
 
int main()
{
    // Создадим объект списока.
    list <string> objList;
    // Строка ниже для того что бы эта переменная была объявленной
    // и могла использоваться в "while".
    char userAnswerCin = NULL;
    // Логично - цикл.
    do
    {
        replayCinString: // Телепорт в это мето для повторного ввода слова.
        cout << "Slovo > ";
        string userString;  // Создали строковую переменную для хранения символов в виде строки.
        getline (cin, userString); // Вызываем функцию ввода строки и сохранения ее в переменной "userString".
        insertStringList (objList, userString); // Отправляем объект класса списка и строку в функцию вставления строки в список.
        cout << "Povtorit? 'y' - da, 'n' - net > ";
        cin >> userAnswerCin;
        if(userAnswerCin == 'n')
        {
            break;
        }
        else if(userAnswerCin != 'y')
        {
            goto replayCinString;
        }
    } while(userAnswerCin == 'y');
    // Выведем индексы и значения ранее созданного списка.
    cout << endl;
    cout << "index -> value" << endl;
    for(auto value = objList.cbegin(); value != objList.cend(); ++value)
    {
        size_t index = distance(objList.cbegin(), value);
        cout << index << " -> " << *value << endl;
    }
 
    return 0;
}
Миниатюры
программа пропускает строку  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2020, 22:39
Ответы с готовыми решениями:

Пропускает строку ввода
Здравствуйте, когда ввожу среднюю оценку, то строку ввода &quot;специальность&quot; (71 строка) пропускает,...

Пропускает строку ввода
Пропускает cin.getline(str,99); сразу на _getch(); Подскажите, что делать? #include &lt;iostream&gt;...

Пропускает одну строку ввода!
При вводе данных строка автора просто пропускается в чем проблема? #include &lt;iostream&gt; #include...

При вводе пропускает первую строку
cout&lt;&lt;&quot;\nVvedite text: &quot;; for (int i=0; i &lt; n; i++) { ...

10
319 / 216 / 114
Регистрация: 14.05.2020
Сообщений: 890
08.06.2020, 22:44 2
Перед 26 поставить
C++
1
cin.ignore();
1
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 248
08.06.2020, 22:55  [ТС] 3
спасибо!
если не забуду пока другие задачи делаю, изучу что делает этот код.
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
08.06.2020, 23:02 4
Никогда не используйте goto, разве что хотите специально запутать код
тут всё будет работать и БЕЗ него
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
40
41
42
#include <iostream>
#include <string>
#include <list>
using namespace std;
 
template <typename T>
void insertStringList(T& inputObjList, string& inputString)
{
    // Вставим входящуюю строку в конец списка.
    inputObjList.push_back(inputString);
}
 
int main()
{
    // Создадим объект списока.
    list <string> objList;
    // Строка ниже для того что бы эта переменная была объявленной
    // и могла использоваться в "while".
    char userAnswerCin = NULL;
    // Логично - цикл.
    do
    {
        cout << "Slovo > ";
        string userString;  // Создали строковую переменную для хранения символов в виде строки.
        getline(cin, userString); // Вызываем функцию ввода строки и сохранения ее в переменной "userString".
        insertStringList(objList, userString); // Отправляем объект класса списка и строку в функцию вставления строки в список.
        cout << "Povtorit? 'y' - da, 'n' - net > ";
        cin >> userAnswerCin;
        cin.ignore();
 
    } while (userAnswerCin == 'y');
    // Выведем индексы и значения ранее созданного списка.
    cout << endl;
    cout << "index -> value" << endl;
    for (auto value = objList.cbegin(); value != objList.cend(); ++value)
    {
        size_t index = distance(objList.cbegin(), value);
        cout << index << " -> " << *value << endl;
    }
 
    return 0;
}
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 248
08.06.2020, 23:18  [ТС] 5
Цитата Сообщение от AndryS1 Посмотреть сообщение
Никогда не используйте goto
Да, читал про это, но я не смог догадаться как поставить программу в тупик и не дать ей закончится если при запросе ввести букву ответа("y" или "n") вводишь любую другую.

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

К тому же goto указывает на такое место после которого находится переменная которая будет перезаписана пользователем и, мне кажется, не приведет к ошибке.
Правда все что я написал похоже на отмазу что бы использовать опасный оператор goto...
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
08.06.2020, 23:28 6
Цитата Сообщение от Palich Посмотреть сообщение
else if(userAnswerCin != 'y')
        {
            goto replayCinString;
        }
для этого существует слово continue
https://ravesli.com/urok-70-op... -continue/

Добавлено через 7 минут
Цитата Сообщение от Palich Посмотреть сообщение
if(userAnswerCin == 'n')
        {
            break;
        }
        else if(userAnswerCin != 'y')
        {
            goto replayCinString;
        }
    } while(userAnswerCin == 'y');
хотя в этой конструкции много странного
если userAnswerCin не равна 'y' идем в начала цикла, если равна идем туда же
значит проверку можно выбросить и написать бесконечный цикл с выходом по break
C++
1
2
3
4
5
6
if(userAnswerCin == 'n')
        {
            break;
        }
 
    } while(1);
идем дальше, выбрасываем break
C++
1
    } while(userAnswerCin != 'n');
цикл будет крутится пока не нажата n
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 248
09.06.2020, 00:16  [ТС] 7
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
...какой-то код до...
    if(userAnswerCin == 'n')
    {
        break;
    }
    else if(userAnswerCin != 'y')
    {
        goto replayCinString;
    }
} while(userAnswerCin == 'y');
Как я вижу то что я написал:
строка работает при условии что условие есть истина.
1. нажали n - проверка строки 2 - n есть n? - да - значит, истина - цикл окончен.
2. нажали y - проверка строки 2 - y не y? - еще как 'y' но строка будет работать если будет буква не похожая 'y', а у нас как раз таки 'y' - значит, ложь - поверка условия while - истина - повтор цикла.
3. нажали q - проверка строки 2 - q есть n? - нет - значит, ложь - проверка строки 6 - q не y - да - значит, истина - переход по goto.
4. нажал любую другую букву - работаем по пункту 3.

ваш вариант:

if(userAnswerCin == 'n')
{
break;
}

} while(1);

Не ясно условие у while.
Что если я нажму 'q'?

ваш второй вариант:
} while(userAnswerCin != 'n');

Тогда не пойму как мне написать вопрос о повторном вводе... Жмите любую клавишу для повторного ввода, если не хотите вводить жмите 'n'? Ну такой себе вопрос....
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
09.06.2020, 08:11 8
Цитата Сообщение от Palich Посмотреть сообщение
ваш вариант:
Цитата Сообщение от Palich Посмотреть сообщение
ваш второй вариант:
оба варианта заканчивают цикл,заканчивают цикл при нажатии на n как собственно и первоначальный вариант
Цитата Сообщение от Palich Посмотреть сообщение
проверка строки 6 - q не y - да - значит, истина - переход по goto.
переход то куда? на начало цикла
что y, что не y действие то одно и тоже
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 248
12.06.2020, 13:44  [ТС] 9
мне есть что ответить, напишу ответ когда появится время.
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 248
16.06.2020, 12:35  [ТС] 10
итак, переписал код в простой, правда это сообщение уже не относится к первоначальному вопросу:

Вариант 1:
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
#include <iostream>
 
using namespace std;
 
void func_1(const int iValue){
    int insideA = iValue;
    cout << insideA << endl;
}
 
int main(){
    char userAnswerCin = '0';
    do{
        cout << "Number > ";
        int userNumber = 0;
        cin >> userNumber;
        func_1(userNumber);
        cout << "Repeat input? 'y' - da, 'n' - net > ";
        cin >> userAnswerCin;
 
    } while (userAnswerCin == 'y');
 
    return 0;
}
С таким кодом при нажатии на любую клавишу кроме "y" програма завершается.
Мне такой расклад не нравится, программа должна запускаться по моей команде и завершаться так же по моей команде.

Вариант 2:
С использование опасного "goto".
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
#include <iostream>
 
using namespace std;
 
void func_1(const int iValue){
    int insideA = iValue;
    cout << insideA << endl;
}
 
int main(){
    char userAnswerCin = '0';
    do{
        cout << "Number > ";
        int userNumber = 0;
        cin >> userNumber;
        func_1(userNumber);
        replayCinString:
        cout << "Repeat input? 'y' - da, 'n' - net > ";
        cin >> userAnswerCin;
        if(userAnswerCin == 'n')
        {
            break;
        }
        else if(userAnswerCin != 'y')
        {
            goto replayCinString;
        }
 
    } while (userAnswerCin == 'y');
 
    return 0;
}
В таком коде программа заставит вводить пользователя только те буквы ответа которые указаны и завершится только по команде пользователя. Что мне и нужно. Как реализовать данный способ без goto я не догадался.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
16.06.2020, 13:38 11
Лучший ответ Сообщение было отмечено Palich как решение

Решение

Цитата Сообщение от Palich Посмотреть сообщение
Как реализовать данный способ без goto я не догадался.
сделать еще один цикл,внутри основного, который будет проверят корректность ввода
C
1
2
3
4
do{
  cout << "Repeat input? 'y' - da, 'n' - net > ";
        cin >> userAnswerCin;
    } while (userAnswerCin != 'y' && userAnswerCin != 'n' && userAnswerCin != 'Y' && userAnswerCin != 'N');
0
16.06.2020, 13:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2020, 13:38
Помогаю со студенческими работами здесь

Программа пропускает cin >>
Программа состоит из 2 частей. В 1 ввод имени и числа, например &quot;anna 6&quot;, выйти из цикла можно...

Программа пропускает cin
Уже несколько раз сталкивался с проблемами функции &quot;cin&quot; по задумке, в моей программе, он должен...

Программа пропускает кусок кода
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstring&gt; using namespace std; char *str;...

Программа пропускает ввод первой строки
здраствуйте. в коде програмы, приведенном ниже, в структуру Track записываются данные, считанные с...

Шифрование: программа пропускает первую букву 'а'
При выполнения алгоритма пропускает первую букву 'а', как можно исправить это? программирую на...

Программа пропускает оператор при выполнении
Всем привет . Вот делал простое задание для функции strncmp() , написал программу которая при...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru