Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
gru74ik
Модератор
Эксперт CЭксперт С++
3895 / 1653 / 188
Регистрация: 20.02.2013
Сообщений: 4,708
Записей в блоге: 21
#1

Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? - C++

10.06.2014, 14:56. Просмотров 1917. Ответов 12
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане! Я новичок и в С++ и на этом форуме, так что прошу сильно не пинать.
Начал заниматься по книге Стивена Праты "Язык программирования С++" (Лекции и упражнения, 2011).
Операционная система на компе у меня Windows XP SP3 (+все обновления), среда разработки Code::Blocks (версия 13.12).
Делаю практические задания (упражнения по программированию) из 4 главы. Сделал задание №7:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/// sp_Ch4P203_Exercise07
 
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 203, упражнение 7.
/*
Вильям Вингейт (William Wingate) заведует службой анализа рынка пиццы.
О каждой пицце он записывает следующую информацию:
1.   наименование компании-производителя пиццы, которое может состоять из
    более чем одного слова;
2.   диаметр пиццы;
3.   вес пиццы.
Разработайте структуру, которая может содержать всю эту информацию, и
напишите программу, использующую структурную переменную этого типа.
Программа должна запрашивать у пользователя каждый из перечисленных
показателей и затем отображать введённую информацию. Применяйте cin
(или его методы) и cout.
*/
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
    struct pizza
    {
        string name;
        double diameter;
        double weight;
    };
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    pizza forExample;
 
    cout << "Введите название компании-производителя: ";
    getline (cin, forExample.name);
    cout << "Введите диаметр пиццы: ";
    cin >> forExample.diameter;
    cout << "Введите вес пиццы: ";
    cin >> forExample.weight;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
 
    cout << "Название компании-производителя: " << forExample.name;
    cout << endl;
    cout << "Диаметр пиццы: " << forExample.diameter;
    cout << endl;
    cout << "Вес пиццы: " << forExample.weight;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
 
    return 0;
}
Залип на задании №8 (стр.203):
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
43
44
45
46
47
48
49
50
51
52
53
/// sp_Ch4P203_Exercise08
 
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 203, упражнение 8.
/*
Выполните упражнение 7, но с применением операции new для размещения
структуры в свободном хранилище вместо объявления структурной переменной.
Кроме того,  сделайте так, чтобы программа сначала запрашивала диаметр
пиццы, а потом - наименование компании.
*/
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
    struct pizza
    {
        double diameter;
        string name;
        double weight;
    };
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    pizza *forExample = new pizza;
 
    cout << "Введите диаметр пиццы: ";
    cin >> forExample->diameter;
    cout << "Введите название компании-производителя: ";
    getline (cin, forExample->name);
    //cin >> forExample->name;
    cout << "Введите вес пиццы: ";
    cin >> forExample->weight;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
 
    cout << "Название компании-производителя: " << forExample->name;
    cout << endl;
    cout << "Диаметр пиццы: " << forExample->diameter;
    cout << endl;
    cout << "Вес пиццы: " << forExample->weight;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
    delete forExample;
    return 0;
}
Программа в ходе выполнения даёт ввести диаметр, а второй шаг пропускает, сразу переходя к третьему (вводд веса пиццы).

ЧЯДНТ?
Миниатюры
Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2014, 14:56     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему?
Посмотрите здесь:

Ввод длинных строк с пробелами C++
C++ Почему программа сразу закрывается ?
C++ Почему не работает программа? Структуры
C++ Программа пропускает ввод первой строки
Пропускает ввод символа C++
Программа пропускает второй и третий вводы данных C++
C++ Не могу понять, почему ввод строк начинается со 2-ой строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:03     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #2
cin >>, перед getline(), вот так делайте:
C++
1
(cin >> forExample->diameter).get();
FraidZZ
Модератор
3896 / 1522 / 229
Регистрация: 06.01.2013
Сообщений: 4,049
Завершенные тесты: 1
10.06.2014, 15:06     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #3
gru74ik, перед каждым вводом используйте
C++
1
cin.ignore(cin.rdbuf()->in_avail());
gru74ik
Модератор
Эксперт CЭксперт С++
3895 / 1653 / 188
Регистрация: 20.02.2013
Сообщений: 4,708
Записей в блоге: 21
10.06.2014, 15:09  [ТС]     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #4
Цитата Сообщение от alsav22 Посмотреть сообщение
cin >>, перед getline(), вот так делайте:
C++
1
cin.ignore(cin.rdbuf()->in_avail());
Не работает. Компилятор ошибку выдаёт. Тем более, в седьмом упражнении точно такой же синтаксис работает же. А в восьмом стоило только строки местами поменять, как начались проблемы.
megamuz
12 / 1 / 0
Регистрация: 09.06.2014
Сообщений: 35
10.06.2014, 15:15     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #5
cout << "Введите название компании-производителя: ";
getline (cin, forExample.name);

cout << "Введите название компании-производителя: ";
getline (cin, forExample->name);

Попробуй как в 7 делал
gru74ik
Модератор
Эксперт CЭксперт С++
3895 / 1653 / 188
Регистрация: 20.02.2013
Сообщений: 4,708
Записей в блоге: 21
10.06.2014, 15:32  [ТС]     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #6
Цитата Сообщение от FraidZZ Посмотреть сообщение
gru74ik, перед каждым вводом используйте
C++
1
cin.ignore(cin.rdbuf()->in_avail());
Вставил эту строчку перед строкой №32. Не помогло.

Добавил и перед каждой строкой, где есть инструкция cin:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    cout << "Введите диаметр пиццы: ";
    cin.ignore(cin.rdbuf()->in_avail());
    cin >> forExample->diameter;
    cout << "Введите название компании-производителя: ";
    cin.ignore(cin.rdbuf()->in_avail());
    getline (cin, forExample->name);
    //cin >> forExample->name;
    cout << "Введите вес пиццы: ";
    cin.ignore(cin.rdbuf()->in_avail());
    cin >> forExample->weight;
    cout << endl;
    cout << endl;
Картина прежняя.

Как-то не так, видимо, я эту конструкцию использую ((

Добавлено через 4 минуты
Цитата Сообщение от megamuz Посмотреть сообщение
C++
1
2
3
4
cout << "Введите название компании-производителя: ";
getline (cin, forExample.name);
cout << "Введите название компании-производителя: ";
getline (cin, forExample->name);
Попробуй как в 7 делал
Не помогает. Да и не должно - в восьмом же указатель у нас, а в случае использования указателей доступ к членам структуры, по идее, осуществляется либо так:
C++
1
forExample->name
либо так:
C++
1
(*forExample).name
Добавлено через 10 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
cin >>, перед getline(), вот так делайте:
C++
1
(cin >> forExample->diameter).get();
Попробовал вот так:
C++
1
2
3
4
5
6
7
8
9
    cout << "Введите диаметр пиццы: ";
    cin >> forExample->diameter;
    cout << "Введите название компании-производителя: ";
    (cin >> forExample->diameter).get();
    getline (cin, forExample->name);
    cout << "Введите вес пиццы: ";
    cin >> forExample->weight;
    cout << endl;
    cout << endl;
и вот так:
C++
1
2
3
4
5
6
7
8
    cout << "Введите диаметр пиццы: ";
    cin >> forExample->diameter;
    cout << "Введите название компании-производителя: ";
    (cin >> forExample->diameter).get();
    cout << "Введите вес пиццы: ";
    cin >> forExample->weight;
    cout << endl;
    cout << endl;
Не помогло. Прога стала третий шаг пропускать.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:33     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #7
Цитата Сообщение от gru74ik Посмотреть сообщение
Не работает. Компилятор ошибку выдаёт.
Какую?
Цитата Сообщение от gru74ik Посмотреть сообщение
Тем более, в седьмом упражнении точно такой же синтаксис работает же.
Где там cin >> перед getline()?
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:36     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот код и работа. Вопросы?
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
43
44
45
46
47
48
49
50
51
52
53
/// sp_Ch4P203_Exercise08
 
/// Занятия по книге Стивена Праты "Язык программирования С++" (2001, 6-е издание).
/// Упражнения по программированию. Глава 4, страница 203, упражнение 8.
/*
Выполните упражнение 7, но с применением операции new для размещения
структуры в свободном хранилище вместо объявления структурной переменной.
Кроме того,  сделайте так, чтобы программа сначала запрашивала диаметр
пиццы, а потом - наименование компании.
*/
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
    struct pizza
    {
        double diameter;
        string name;
        double weight;
    };
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    pizza *forExample = new pizza;
 
    cout << "Введите диаметр пиццы: ";
    (cin >> forExample->diameter).get();
    cout << "Введите название компании-производителя: ";
    getline (cin, forExample->name);
    //cin >> forExample->name;
    cout << "Введите вес пиццы: ";
    cin >> forExample->weight;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
 
    cout << "Название компании-производителя: " << forExample->name;
    cout << endl;
    cout << "Диаметр пиццы: " << forExample->diameter;
    cout << endl;
    cout << "Вес пиццы: " << forExample->weight;
    cout << endl;
    cout << endl;
 
    cout << "******************************************************" << endl;
    delete forExample;
    return 0;
}
Миниатюры
Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему?  
gru74ik
Модератор
Эксперт CЭксперт С++
3895 / 1653 / 188
Регистрация: 20.02.2013
Сообщений: 4,708
Записей в блоге: 21
10.06.2014, 15:42  [ТС]     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот код и работа. Вопросы?
Спасибо огромное, заработало.
Вот только как оно работает? И почему не работал мой вариант? Что там случалось?
Ежели не в тягость, объясните, пожалуйста. Или ткните линком где и что почитать.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:46     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #10
Цитата Сообщение от gru74ik Посмотреть сообщение
Спасибо огромное, заработало.
2-й пост читали? Делали? На вопрос не ответили:
Цитата Сообщение от alsav22 Посмотреть сообщение
Какую?
gru74ik
Модератор
Эксперт CЭксперт С++
3895 / 1653 / 188
Регистрация: 20.02.2013
Сообщений: 4,708
Записей в блоге: 21
10.06.2014, 16:02  [ТС]     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #11
Цитата Сообщение от alsav22 Посмотреть сообщение
2-й пост читали?
Читал. Я понял, что если идёт вызов инструкции cin >> и какой-то ввод с клавиатуры, а потом вызов функции getline(cin, x), то получается какая-то ерунда, в программе какой-то сбой, что-то идёт не так, как задумывалось.
Вопрос: что?

Добавлено через 9 минут
Насчёт
Цитата Сообщение от gru74ik Посмотреть сообщение
Компилятор ошибку выдаёт.
это я сам, видать, чё-то напутал и там какая-то ошибка вылетала, извиняюсь.
Сейчас всё работает, как задумывалось, большое Вам спасибо.
Вот только я механику процесса не понимаю. А хотелось бы.
Что там в первоначальном варианте шло не так?
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 16:09     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
После ввода через cin >>, в потоке ввода остаётся '\n' (попадает в поток при нажатии Enter), который перед getline() нужно убрать, иначе getline() считает его первым (для неё это пустая строка) и код, не останавливаясь, пойдёт дальше.
get() извлекает символ из потока ввода (в данном случае - '\n').

Добавлено через 5 минут
Тоже самое в две строки:
C++
1
2
cin >> forExample->diameter;
cin.get();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2014, 16:12     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему?
Еще ссылки по теме:

C++ Структуры. Файловый ввод вывод. Почему не работает программа ?
Копирование строки. При вводе пробела программа пропускает последующий ввод данных C++
C++ С помощью функции обмена строк отсортировать матрицу по третьему столбцу
C++ Останавливается цикл и иногда пропускает второй cin
C++ Программа пропускает ввод данных несмотря на fflush

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
Эксперт CЭксперт С++
3895 / 1653 / 188
Регистрация: 20.02.2013
Сообщений: 4,708
Записей в блоге: 21
10.06.2014, 16:12  [ТС]     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему? #13
Цитата Сообщение от alsav22 Посмотреть сообщение
После ввода через cin >>, в потоке ввода остаётся '\n' (попадает в поток при нажатии Enter), который перед getline() нужно убрать, иначе getline() считает его первым (для неё это пустая строка) и код, не останавливаясь, пойдёт дальше.
get() извлекает символ из потока ввода (в данном случае - '\n').
Добавлено через 5 минут
Тоже самое в две строки:
C++
1
2
cin >> forExample->diameter;
cin.get();
Большое спасибо за подробный ответ. Всё по полочкам разложилось в голове.
Yandex
Объявления
10.06.2014, 16:12     Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему?
Ответ Создать тему
Опции темы

Текущее время: 21:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru