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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Я новичок и в С++ и на этом форуме, так что прошу сильно не пинать.
Начал заниматься по книге Стивена Праты "Язык программирования С++" (Лекции и упражнения, 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2014, 14:56
Ответы с готовыми решениями:

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

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

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

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

17
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:03 2
cin >>, перед getline(), вот так делайте:
C++
1
(cin >> forExample->diameter).get();
1
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
10.06.2014, 15:06 3
gru74ik, перед каждым вводом используйте
C++
1
cin.ignore(cin.rdbuf()->in_avail());
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
10.06.2014, 15:09  [ТС] 4
Цитата Сообщение от alsav22 Посмотреть сообщение
cin >>, перед getline(), вот так делайте:
C++
1
cin.ignore(cin.rdbuf()->in_avail());
Не работает. Компилятор ошибку выдаёт. Тем более, в седьмом упражнении точно такой же синтаксис работает же. А в восьмом стоило только строки местами поменять, как начались проблемы.
0
12 / 1 / 1
Регистрация: 09.06.2014
Сообщений: 35
10.06.2014, 15:15 5
cout << "Введите название компании-производителя: ";
getline (cin, forExample.name);

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

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

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

Решение

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

Добавлено через 5 минут
Тоже самое в две строки:
C++
1
2
cin >> forExample->diameter;
cin.get();
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
10.06.2014, 16:12  [ТС] 13
Цитата Сообщение от alsav22 Посмотреть сообщение
После ввода через cin >>, в потоке ввода остаётся '\n' (попадает в поток при нажатии Enter), который перед getline() нужно убрать, иначе getline() считает его первым (для неё это пустая строка) и код, не останавливаясь, пойдёт дальше.
get() извлекает символ из потока ввода (в данном случае - '\n').
Добавлено через 5 минут
Тоже самое в две строки:
C++
1
2
cin >> forExample->diameter;
cin.get();
Большое спасибо за подробный ответ. Всё по полочкам разложилось в голове.
0
0 / 0 / 0
Регистрация: 30.01.2022
Сообщений: 33
07.02.2022, 05:33 14
sourcerer,
Цитата Сообщение от sourcerer Посмотреть сообщение
Здравствуйте, уважаемые форумчане! Я новичок и в С++
Привет! Я такой же, каким ты был в 2014
Есть пару вопросов к тому, кто реально не забросил программирование.
1. Что ты дальше учил после Праты?
2. Когда и как ты попал на Trainee/Junior и каков был твой путь для этого?)
3. Что ты бы посоветовал сейчас себе в 2014?)
0
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
07.02.2022, 08:58 15
Цитата Сообщение от Arch0998 Посмотреть сообщение
Что ты бы посоветовал сейчас себе в 2014?)
Не сидеть на форуме, а пойти на hh
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
07.02.2022, 09:24 16
Цитата Сообщение от Arch0998 Посмотреть сообщение
2. Когда и как ты попал на Trainee/Junior и каков был твой путь для этого?)
Программирование в 39 лет
0
0 / 0 / 0
Регистрация: 30.01.2022
Сообщений: 33
07.02.2022, 13:58 17
Цитата Сообщение от Nishen Посмотреть сообщение
Не сидеть на форуме, а пойти на hh
Вот утром как раз пришел offer :Р
0
1352 / 851 / 365
Регистрация: 26.02.2015
Сообщений: 3,799
07.02.2022, 19:27 18
Цитата Сообщение от Arch0998 Посмотреть сообщение
Вот утром как раз пришел offer :Р
видишь, как мои советы быстро работают

Добавлено через 15 секунд
Поздравляю тебя и желаю успехов!
0
07.02.2022, 19:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2022, 19:27
Помогаю со студенческими работами здесь

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

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

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

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


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

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