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

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

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

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

10.06.2014, 14:56. Просмотров 2124. Ответов 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;
}
Программа в ходе выполнения даёт ввести диаметр, а второй шаг пропускает, сразу переходя к третьему (вводд веса пиццы).

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

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

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

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

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

Ввод длинных строк с пробелами - C++
Доброго времени суток!!! Собственно как организовать ввод строки вида &quot;один два три 4 5 6 7...&quot; - где вперемешку будут и символы, и...

Копирование строки. При вводе пробела программа пропускает последующий ввод данных - C++
char st, st1; int k, m, i, j; system(&quot;cls&quot;); cout &lt;&lt;&quot;Введите строку&quot;&lt;&lt;endl; cin &gt;&gt;st; cout &lt;&lt;&quot;Введите номер символа,...

12
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:03 #2
cin >>, перед getline(), вот так делайте:
C++
1
(cin >> forExample->diameter).get();
1
FraidZZ
Ex-Member
3898 / 1524 / 229
Регистрация: 06.01.2013
Сообщений: 4,050
Завершенные тесты: 1
10.06.2014, 15:06 #3
gru74ik, перед каждым вводом используйте
C++
1
cin.ignore(cin.rdbuf()->in_avail());
1
gru74ik
Модератор
Эксперт CЭксперт С++
4169 / 1817 / 198
Регистрация: 20.02.2013
Сообщений: 4,958
Записей в блоге: 21
10.06.2014, 15:09  [ТС] #4
Цитата Сообщение от alsav22 Посмотреть сообщение
cin >>, перед getline(), вот так делайте:
C++
1
cin.ignore(cin.rdbuf()->in_avail());
Не работает. Компилятор ошибку выдаёт. Тем более, в седьмом упражнении точно такой же синтаксис работает же. А в восьмом стоило только строки местами поменять, как начались проблемы.
0
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 делал
1
gru74ik
Модератор
Эксперт CЭксперт С++
4169 / 1817 / 198
Регистрация: 20.02.2013
Сообщений: 4,958
Записей в блоге: 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;
Не помогло. Прога стала третий шаг пропускать.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:33 #7
Цитата Сообщение от gru74ik Посмотреть сообщение
Не работает. Компилятор ошибку выдаёт.
Какую?
Цитата Сообщение от gru74ik Посмотреть сообщение
Тем более, в седьмом упражнении точно такой же синтаксис работает же.
Где там cin >> перед getline()?
0
alsav22
5421 / 4816 / 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;
}
1
Миниатюры
Структуры и ввод строк с пробелами: программа пропускает второй шаг, сразу переходя к третьему - почему?  
gru74ik
Модератор
Эксперт CЭксперт С++
4169 / 1817 / 198
Регистрация: 20.02.2013
Сообщений: 4,958
Записей в блоге: 21
10.06.2014, 15:42  [ТС] #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот код и работа. Вопросы?
Спасибо огромное, заработало.
Вот только как оно работает? И почему не работал мой вариант? Что там случалось?
Ежели не в тягость, объясните, пожалуйста. Или ткните линком где и что почитать.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.06.2014, 15:46 #10
Цитата Сообщение от gru74ik Посмотреть сообщение
Спасибо огромное, заработало.
2-й пост читали? Делали? На вопрос не ответили:
Цитата Сообщение от alsav22 Посмотреть сообщение
Какую?
1
gru74ik
Модератор
Эксперт CЭксперт С++
4169 / 1817 / 198
Регистрация: 20.02.2013
Сообщений: 4,958
Записей в блоге: 21
10.06.2014, 16:02  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
2-й пост читали?
Читал. Я понял, что если идёт вызов инструкции cin >> и какой-то ввод с клавиатуры, а потом вызов функции getline(cin, x), то получается какая-то ерунда, в программе какой-то сбой, что-то идёт не так, как задумывалось.
Вопрос: что?

Добавлено через 9 минут
Насчёт
Цитата Сообщение от gru74ik Посмотреть сообщение
Компилятор ошибку выдаёт.
это я сам, видать, чё-то напутал и там какая-то ошибка вылетала, извиняюсь.
Сейчас всё работает, как задумывалось, большое Вам спасибо.
Вот только я механику процесса не понимаю. А хотелось бы.
Что там в первоначальном варианте шло не так?
0
alsav22
5421 / 4816 / 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();
1
gru74ik
Модератор
Эксперт CЭксперт С++
4169 / 1817 / 198
Регистрация: 20.02.2013
Сообщений: 4,958
Записей в блоге: 21
10.06.2014, 16:12  [ТС] #13
Цитата Сообщение от alsav22 Посмотреть сообщение
После ввода через cin >>, в потоке ввода остаётся '\n' (попадает в поток при нажатии Enter), который перед getline() нужно убрать, иначе getline() считает его первым (для неё это пустая строка) и код, не останавливаясь, пойдёт дальше.
get() извлекает символ из потока ввода (в данном случае - '\n').
Добавлено через 5 минут
Тоже самое в две строки:
C++
1
2
cin >> forExample->diameter;
cin.get();
Большое спасибо за подробный ответ. Всё по полочкам разложилось в голове.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2014, 16:12
Привет! Вот еще темы с ответами:

Почему программа сразу закрывается ? - C++
#include &lt;iostream&gt; using namespace std; int main (void) { int age; cout &lt;&lt; &quot;Enter you age: &quot;; cin &gt;&gt; age; if...

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
10.06.2014, 16:12
Ответ Создать тему
Опции темы

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