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

Задача из книги Страуструпа - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.64
Bogdand
 Аватар для Bogdand
3 / 3 / 0
Регистрация: 04.12.2010
Сообщений: 93
05.07.2012, 13:46     Задача из книги Страуструпа #1
Меня настораживает несколько странная формулировка, я не понимаю зачем так предлагают решать задачу:
Напишите программу, содержащую цикл while, в котором считываются и выводятся на экран два целых числа . Для выхода из программы введите символ '|'. Я как вариант написал без проверки что вводится именно 2, но чую хотели от меня что то другое!
C++
1
2
3
4
5
6
7
8
9
#include "std_lib_facilities.h"
int main()
{
    int buf = 0;
    while (cin >> buf)
        cout << buf << "\n";
 
    return 0;
}
Разумеется можно поставить счётчик, который бы отследил чтоб я ввёл только 2 но это какой то мазахизм ей богу, видимо я что то упустил...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2012, 13:46     Задача из книги Страуструпа
Посмотрите здесь:

пример из книги страуструпа C++
C++ Чем отличаються между собой книги Страуструпа
C++ Задачка из книги Страуструпа...
Задачка из книги Страуструпа C++
C++ Задание из книги Страуструпа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
07.07.2012, 14:02     Задача из книги Страуструпа #21
Цитата Сообщение от rangerx Посмотреть сообщение
Переменная x у вас не инициализирована.
Тоесть не инициализирована? Или что в разных компиляторах может быть так что х при
C++
1
int x;
не будет равняться по умолчанию нулю ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
07.07.2012, 15:20     Задача из книги Страуструпа #22
Aesonet, это не зависит от компилятора. Локальные переменные не инициализируются автоматически. Т.е., если не задать значение явно, то переменная будет содержать "мусор".
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
07.07.2012, 15:29     Задача из книги Страуструпа #23
Хм, сейчас еще раз почитаю про переменные.
Спасибо за информацию.
ШКІПЕР
 Аватар для ШКІПЕР
93 / 93 / 7
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
Завершенные тесты: 1
07.07.2012, 16:10     Задача из книги Страуструпа #24
Цитата Сообщение от Aesonet Посмотреть сообщение
не будет равняться по умолчанию нулю ?
Только статические переменные по-умолчанию равны нулю.
C++
1
static int x;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 16:19     Задача из книги Страуструпа #25
Цитата Сообщение от Aesonet Посмотреть сообщение
не будет равняться по умолчанию нулю ?
По умолчанию - глобальные (статические с внешним связыванием), статические с внутренним связыванием и статические без связывания.
C++
1
2
3
4
5
6
7
int x;
static int y;
 
int main()
{...
static int z;
...}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.07.2012, 17:32     Задача из книги Страуструпа #26
Предлагаю свой вариант данной задачи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int first, second;
    cout<<"Введите два целых числа по очереди (для выхода введите |):"<<endl;
    while (cin>>first, cin>>second || cin.get() != '\n')
    {
        if (!cin)
        {
            cin.clear();
            if (cin.get() == '|')
                break;
            cin.sync();
            cout<<"Должно быть целое число. Попробуйте еще: \n";
            continue;
        }
    cout<<first<<", "<<second<<endl;
    }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.07.2012, 19:00     Задача из книги Страуструпа #27
Цитата Сообщение от yuron_477 Посмотреть сообщение
Предлагаю свой вариант данной задачи


Добавлено через 1 час 7 минут
yuron_477, если не трудно, прокоментируйте эту строчку поподробнее:
C++
1
while (cin>>first, cin>>second || cin.get() != '\n')
Rabbit13245
28 / 28 / 2
Регистрация: 21.04.2012
Сообщений: 282
07.07.2012, 19:08     Задача из книги Страуструпа #28
cin.get() != '|' проверяет, чтобы следующий вводимый символ был не |.

вообще cin.get() извлекает следующий символ ввода. Поправьте если не так
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.07.2012, 20:16     Задача из книги Страуструпа #29
Цитата Сообщение от alsav22 Посмотреть сообщение
прокоментируйте эту строчку поподробнее:
Ну, cin.get() != '\n' здесь для того чтоб одно из условий цыкла оставалось истинным - тогда нас не выбросит из цыкла при вводе буквы, а начнет обрабатываться следующий оператор - if (!cin). А cin>>first, cin>>second это просто выражения через оператор "запятая". Можно было бы написать
C++
1
while ((cin>>first && cin>>second) || cin.get() != '\n')
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
07.07.2012, 20:55     Задача из книги Страуструпа #30
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
// enter int or smth to quit.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "iostream"
#include <string>
#include <conio.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int i=0, total=0;
    string str="";
    bool z=false;
    while (!z)
        {
            if (false==cin>>i)
        {
            cin.clear();
            getline(cin,str);
            for (int j=0; j<str.size(); j++)
            {
                if ('|'==str[j])
                {
                    z=true;
                    break;
                }
            }
            str="";
            total+=i;
            i=0;
        }
        if (true==z)
            break;
    }
    cout<<total;
    getch();
    return 0;
}
это просто для ввода 1го числа - для 2х там думаю чуть подправить
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2012, 04:41     Задача из книги Страуструпа #31
Цитата Сообщение от yuron_477 Посмотреть сообщение
Ну, cin.get() != '\n' здесь для того чтоб одно из условий цыкла оставалось истинным - тогда нас не выбросит из цыкла при вводе буквы, а начнет обрабатываться следующий оператор - if (!cin). А cin>>first, cin>>second это просто выражения через оператор "запятая". Можно было бы написать
Меня тут (while (cin>>first, cin>>second || cin.get() != '\n') интересует очерёдность работы cin и cin.get(). Что и когда cin.get() здесь извлекает? Если написать так:
C++
1
while (cin>>first, cin>>second || true)
, то ваш код так же хорошо работает.
А понятней так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while (true)
    {
        cin>>first, cin>>second;
        if (!cin)
        {
            cin.clear();
            if (cin.get() == '|')
                break;
            cin.sync();
            cout<<"Должно быть целое число. Попробуйте еще: \n";
            continue;
        }
    cout<<first<<", "<<second<<endl;
    }
Ведь то же самое?
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
08.07.2012, 13:51     Задача из книги Страуструпа #32
А если у нас будет при вводе введена строка скажем "jhgjhg| 4587597mhghg" - '|' символ есть а break не сработает.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.07.2012, 13:54     Задача из книги Страуструпа #33
Цитата Сообщение от alsav22 Посмотреть сообщение
Ведь то же самое?
cin.get() != '\n' здесь в цикле всегда возвращает true. Я этот код где то из своей домашней заготовки скопировал, - ваш вариант с while (true) еще лучше.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
08.07.2012, 16:06     Задача из книги Страуструпа #34
cin>>first, cin>>second;
if (!cin)
C++
1
if(!(cin >> first) || !(cin >> second))
cin.sync();
sync не лучшее средство для очистки буфера ввода. Даже, если это и сработает для того или иного компилятора, в стандарте такое поведение sync не описано. Для того же gcc это не работает. Очищать буфер лучше с помощью ignore.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.07.2012, 18:00     Задача из книги Страуструпа #35
Цитата Сообщение от Aliru777 Посмотреть сообщение
А если у нас будет при вводе введена строка скажем "jhgjhg| 4587597mhghg" - '|' символ есть а break не сработает.
В данном примере так и должно быть. Если я хочу выйти из цикла, то в конце ввода жму '|', а не в середине.
Другое дело, что вот так не будет: "asd|".

Добавлено через 3 минуты
Цитата Сообщение от rangerx Посмотреть сообщение
sync не лучшее средство для очистки буфера ввода
Читал, не советуют. Как насчёт такой конструкции:
C++
1
while (cin.get() != '\n');
?

Добавлено через 43 минуты
Выход будет, если только в конце строки введено '|':
код
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
#include <iostream>
using namespace std;
 
int main()
{
 setlocale(0,"");
 
 int first, second;
    cout<<"Введите два целых числа по очереди (для выхода введите |):"<<endl;
    while (true)
    {
        cin >> first >> second;
        if (!cin)
        {
            cin.clear();
            char a;
            while (a = cin.get())
            {
                if (a == '\n') break;
                if (a == '|' && cin.get() == '\n') break;
            }
            if (a == '|') break;   
            
            cout<<"Должно быть целое число. Попробуйте еще: \n";
            continue;
        }
    cout << first << ", " << second << endl;
    }
   
   cout << endl << endl;
   system("pause");
   return 0;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
08.07.2012, 18:55     Задача из книги Страуструпа #36
Цитата Сообщение от alsav22 Посмотреть сообщение
Читал, не советуют. Как насчёт такой конструкции:
Такая конструкция - это не что иное, как попытка заново изобрести istream::ignore
barman_97
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 2
24.03.2016, 17:00     Задача из книги Страуструпа #37
В книге Б.Страуструпа, перед тем как перейти к этой задаче, объясняется тема "Вектор". Т.е. он хочет чтобы задача была решена с применением вектора. Иначе, выглядит как то странно, что цикл while содержит операторы cout,cin и одну переменную и больше ничего. Хотя в предыдущей главе программы были больше.
Zirak
3 / 3 / 0
Регистрация: 11.07.2016
Сообщений: 13
13.07.2016, 21:06     Задача из книги Страуструпа #38
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
#include "../../std_lib_facilities.h"
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL, "rus"); 
 
    vector<string> vec_str(2);
    vector<int> vec_int(2);
    int i = 0;
 
    while (i < 2)
    {
        cout << "введите целое число(для выхода нажмите |):";
        cin >> vec_str[i];
        if (vec_str[i] == "|")
            break;
        else
        {
            vec_int[i] = stoi(vec_str[i]);
            i++;
        }
    }
    if (vec_str[i] == "|") {}
    else cout << "первое число: " << vec_int[0] << " второе число: " << vec_int[1] << '\n';
    return(0);
}
ultexplorer
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 1
05.11.2016, 20:33     Задача из книги Страуструпа #39
Цитата Сообщение от Bogdand Посмотреть сообщение
Меня настораживает несколько странная формулировка, я не понимаю зачем так предлагают решать задачу:
Напишите программу, содержащую цикл while, в котором считываются и выводятся на экран два целых числа . Для выхода из программы введите символ '|'. Я как вариант написал без проверки что вводится именно 2, но чую хотели от меня что то другое!
C++
1
2
3
4
5
6
7
8
9
#include "std_lib_facilities.h"
int main()
{
    int buf = 0;
    while (cin >> buf)
        cout << buf << "\n";
 
    return 0;
}
Разумеется можно поставить счётчик, который бы отследил чтоб я ввёл только 2 но это какой то мазахизм ей богу, видимо я что то упустил...
Я так решил, используя только цикл while
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
int main()
{
    cout << "Задай два числа: \n";
    int a = 0;
    int b = 0;
    int buf = 0;
 
 
    while(cin>>buf)
    {
        if(a==0)
        {
           a = buf;
           cout << "a = " << buf << "\n";
           b = a;
        }
        else
        {
            a = buf;
            cout << "a = " << buf << " и " << "b = " << b << "\n";
            b = a;
        }
    }
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2016, 23:04     Задача из книги Страуструпа
Еще ссылки по теме:

Библиотеки для книги Страуструпа C++
C++ Достаточно ли книги Страуструпа?
C++ Задача из книги Страуструпа 4 глава векторы

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

Или воспользуйтесь поиском по форуму:
Novichkoff
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1
06.12.2016, 23:04     Задача из книги Страуструпа #40
Помогите, после ввода имени окно закрывается и все.
В чем причина?

#include "../../std_lib_facilities.h"
int main()
{
cout << "Enter your name (and press 'enter'):\n";
string first_name;
cin >> first_name;
cout << "Hi," << first_name << "!\n";
}
Yandex
Объявления
06.12.2016, 23:04     Задача из книги Страуструпа
Ответ Создать тему
Опции темы

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