Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20

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

10.06.2014, 14:56. Показов 4478. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Я новичок и в С++ и на этом форуме, так что прошу сильно не пинать.
Начал заниматься по книге Стивена Праты "Язык программирования С++" (Лекции и упражнения, 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;
}
Программа в ходе выполнения даёт ввести диаметр, а второй шаг пропускает, сразу переходя к третьему (вводд веса пиццы).

ЧЯДНТ?
Миниатюры
Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему?  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.06.2014, 14:56
Ответы с готовыми решениями:

Программа пропускает ввод массива и выдает сразу ответ
Пишу программу , которая будет считать кол-во цифр после буквы А.Но после того как ввожу размер массива(n),дальше пропускается ввод самого...

Структуры. Файловый ввод вывод. Почему не работает программа ?
Задача: В зараннее написанном текстовом документе имеются фамилии учеников и их оценки. Нужно прочитать этот текстовый файл, вывести его и...

Программа пропускает второй и третий вводы данных
Добрый день. При выполнении программки после ввода первых данных пропускает ввод остальных и сразу выдает результат. Подскажите...

17
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:03
cin >>, перед getline(), вот так делайте:
C++
1
(cin >> forExample->diameter).get();
1
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
10.06.2014, 15:06
gru74ik, перед каждым вводом используйте
C++
1
cin.ignore(cin.rdbuf()->in_avail());
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.06.2014, 15:09  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
cin >>, перед getline(), вот так делайте:
C++
1
cin.ignore(cin.rdbuf()->in_avail());
Не работает. Компилятор ошибку выдаёт. Тем более, в седьмом упражнении точно такой же синтаксис работает же. А в восьмом стоило только строки местами поменять, как начались проблемы.
0
12 / 1 / 1
Регистрация: 09.06.2014
Сообщений: 35
10.06.2014, 15:15
cout << "Введите название компании-производителя: ";
getline (cin, forExample.name);

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

Попробуй как в 7 делал
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.06.2014, 15:32  [ТС]
Цитата Сообщение от 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;
Не помогло. Прога стала третий шаг пропускать.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:33
Цитата Сообщение от gru74ik Посмотреть сообщение
Не работает. Компилятор ошибку выдаёт.
Какую?
Цитата Сообщение от gru74ik Посмотреть сообщение
Тем более, в седьмом упражнении точно такой же синтаксис работает же.
Где там cin >> перед getline()?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:36
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Вот код и работа. Вопросы?
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;
}
Миниатюры
Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему?  
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.06.2014, 15:42  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот код и работа. Вопросы?
Спасибо огромное, заработало.
Вот только как оно работает? И почему не работал мой вариант? Что там случалось?
Ежели не в тягость, объясните, пожалуйста. Или ткните линком где и что почитать.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:46
Цитата Сообщение от gru74ik Посмотреть сообщение
Спасибо огромное, заработало.
2-й пост читали? Делали? На вопрос не ответили:
Цитата Сообщение от alsav22 Посмотреть сообщение
Какую?
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.06.2014, 16:02  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
2-й пост читали?
Читал. Я понял, что если идёт вызов инструкции cin >> и какой-то ввод с клавиатуры, а потом вызов функции getline(cin, x), то получается какая-то ерунда, в программе какой-то сбой, что-то идёт не так, как задумывалось.
Вопрос: что?

Добавлено через 9 минут
Насчёт
Цитата Сообщение от gru74ik Посмотреть сообщение
Компилятор ошибку выдаёт.
это я сам, видать, чё-то напутал и там какая-то ошибка вылетала, извиняюсь.
Сейчас всё работает, как задумывалось, большое Вам спасибо.
Вот только я механику процесса не понимаю. А хотелось бы.
Что там в первоначальном варианте шло не так?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 16:09
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

После ввода через cin >>, в потоке ввода остаётся '\n' (попадает в поток при нажатии Enter), который перед getline() нужно убрать, иначе getline() считает его первым (для неё это пустая строка) и код, не останавливаясь, пойдёт дальше.
get() извлекает символ из потока ввода (в данном случае - '\n').

Добавлено через 5 минут
Тоже самое в две строки:
C++
1
2
cin >> forExample->diameter;
cin.get();
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
10.06.2014, 16:12  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
После ввода через cin >>, в потоке ввода остаётся '\n' (попадает в поток при нажатии Enter), который перед getline() нужно убрать, иначе getline() считает его первым (для неё это пустая строка) и код, не останавливаясь, пойдёт дальше.
get() извлекает символ из потока ввода (в данном случае - '\n').
Добавлено через 5 минут
Тоже самое в две строки:
C++
1
2
cin >> forExample->diameter;
cin.get();
Большое спасибо за подробный ответ. Всё по полочкам разложилось в голове.
0
 Аватар для Arch0998
0 / 0 / 0
Регистрация: 30.01.2022
Сообщений: 33
07.02.2022, 05:33
sourcerer,
Цитата Сообщение от sourcerer Посмотреть сообщение
Здравствуйте, уважаемые форумчане! Я новичок и в С++
Привет! Я такой же, каким ты был в 2014
Есть пару вопросов к тому, кто реально не забросил программирование.
1. Что ты дальше учил после Праты?
2. Когда и как ты попал на Trainee/Junior и каков был твой путь для этого?)
3. Что ты бы посоветовал сейчас себе в 2014?)
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
07.02.2022, 08:58
Цитата Сообщение от Arch0998 Посмотреть сообщение
Что ты бы посоветовал сейчас себе в 2014?)
Не сидеть на форуме, а пойти на hh
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
07.02.2022, 09:24
Цитата Сообщение от Arch0998 Посмотреть сообщение
2. Когда и как ты попал на Trainee/Junior и каков был твой путь для этого?)
Программирование в 39 лет
0
 Аватар для Arch0998
0 / 0 / 0
Регистрация: 30.01.2022
Сообщений: 33
07.02.2022, 13:58
Цитата Сообщение от Nishen Посмотреть сообщение
Не сидеть на форуме, а пойти на hh
Вот утром как раз пришел offer :Р
0
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
07.02.2022, 19:27
Цитата Сообщение от Arch0998 Посмотреть сообщение
Вот утром как раз пришел offer :Р
видишь, как мои советы быстро работают

Добавлено через 15 секунд
Поздравляю тебя и желаю успехов!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2022, 19:27
Помогаю со студенческими работами здесь

Xml сериализация: программа пропускает блок try и сразу выдает то, что файл не выбран
никак немогу найти ошибку, почему то программа пропускает блок try и сразу выдает мне то что файл не выбран хотя файл я выбрал и указал...

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

Программа пропускает ввод символа в цикле
Доброго дня. Задание: Произвольная последовательность переменных типа char, int и long. Перед каждой переменной размещается байт,...

Программа пропускает ввод данных несмотря на fflush
Доброго времени суток. Возникла проблема - когда я в первый раз в цикле ввожу текст посимвольно с помощью getchar, то все нормально. Однако...

почему программа пропускает часть кода
не могу разобраться прогоняю программу по строкам а она пропускает часть кода а именно со строки помечиной &quot;777777&quot; ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru