Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/65: Рейтинг темы: голосов - 65, средняя оценка - 4.52
4 / 4 / 0
Регистрация: 04.12.2010
Сообщений: 93
1

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

05.07.2012, 13:46. Показов 13531. Ответов 51
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Меня настораживает несколько странная формулировка, я не понимаю зачем так предлагают решать задачу:
Напишите программу, содержащую цикл 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 но это какой то мазахизм ей богу, видимо я что то упустил...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2012, 13:46
Ответы с готовыми решениями:

Задача из книги Страуструпа (4.6.3)
Читаю книгу Страуструпа не могу понять как сортировать функцией sort. пример взят и переписан их...

Задача из книги Страуструпа
В общем, не могу понять логику, по которой необходимо выполнить небольшое задание. Само задание:...

Задача из книги Страуструпа
Нужна ваша помощь или хотя бы подсказка, в одном из упражнений в книге Страуструпа &quot;...

Задача из книги Страуструпа 4 глава векторы
Задача: Напишите программу, заглушающую нежелательные слова; иначе говоря, считайте слова из потока...

51
24 / 24 / 10
Регистрация: 04.04.2012
Сообщений: 119
07.07.2012, 14:02 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от rangerx Посмотреть сообщение
Переменная x у вас не инициализирована.
Тоесть не инициализирована? Или что в разных компиляторах может быть так что х при
C++
1
int x;
не будет равняться по умолчанию нулю ?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
07.07.2012, 15:20 22
Aesonet, это не зависит от компилятора. Локальные переменные не инициализируются автоматически. Т.е., если не задать значение явно, то переменная будет содержать "мусор".
1
24 / 24 / 10
Регистрация: 04.04.2012
Сообщений: 119
07.07.2012, 15:29 23
Хм, сейчас еще раз почитаю про переменные.
Спасибо за информацию.
0
99 / 99 / 22
Регистрация: 14.04.2010
Сообщений: 280
Записей в блоге: 9
07.07.2012, 16:10 24
Цитата Сообщение от Aesonet Посмотреть сообщение
не будет равняться по умолчанию нулю ?
Только статические переменные по-умолчанию равны нулю.
C++
1
static int x;
0
5498 / 4893 / 831
Регистрация: 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;
...}
0
1458 / 795 / 257
Регистрация: 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;
    }
1
5498 / 4893 / 831
Регистрация: 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')
0
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
07.07.2012, 19:08 28
cin.get() != '|' проверяет, чтобы следующий вводимый символ был не |.

вообще cin.get() извлекает следующий символ ввода. Поправьте если не так
0
1458 / 795 / 257
Регистрация: 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')
0
1 / 1 / 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х там думаю чуть подправить
0
5498 / 4893 / 831
Регистрация: 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;
    }
Ведь то же самое?
0
1 / 1 / 0
Регистрация: 03.11.2011
Сообщений: 71
08.07.2012, 13:51 32
А если у нас будет при вводе введена строка скажем "jhgjhg| 4587597mhghg" - '|' символ есть а break не сработает.
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.07.2012, 13:54 33
Цитата Сообщение от alsav22 Посмотреть сообщение
Ведь то же самое?
cin.get() != '\n' здесь в цикле всегда возвращает true. Я этот код где то из своей домашней заготовки скопировал, - ваш вариант с while (true) еще лучше.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
08.07.2012, 16:06 34
C++
1
2
cin>>first, cin>>second;
if (!cin)
C++
1
if(!(cin >> first) || !(cin >> second))
C++
1
cin.sync();
sync не лучшее средство для очистки буфера ввода. Даже, если это и сработает для того или иного компилятора, в стандарте такое поведение sync не описано. Для того же gcc это не работает. Очищать буфер лучше с помощью ignore.
0
5498 / 4893 / 831
Регистрация: 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;
}
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
08.07.2012, 18:55 36
Цитата Сообщение от alsav22 Посмотреть сообщение
Читал, не советуют. Как насчёт такой конструкции:
Такая конструкция - это не что иное, как попытка заново изобрести istream::ignore
0
0 / 0 / 0
Регистрация: 16.03.2016
Сообщений: 2
24.03.2016, 17:00 37
В книге Б.Страуструпа, перед тем как перейти к этой задаче, объясняется тема "Вектор". Т.е. он хочет чтобы задача была решена с применением вектора. Иначе, выглядит как то странно, что цикл while содержит операторы cout,cin и одну переменную и больше ничего. Хотя в предыдущей главе программы были больше.
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
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);
}
0
0 / 0 / 0
Регистрация: 05.11.2016
Сообщений: 34
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;
}
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1
06.12.2016, 23:04 40
Помогите, после ввода имени окно закрывается и все.
В чем причина?
C++
1
2
3
4
5
6
7
8
#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";
}
0
06.12.2016, 23:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2016, 23:04
Помогаю со студенческими работами здесь

Достаточно ли книги Страуструпа?
В общем, учу с++ по страуструпу и думаю: &quot; а хватит ли этого???&quot; . Подскажите книгу, по которой...

Задание из книги Страуструпа
Здравствуйте! Я решил начать изучать программирование, конкретнее - язык C++. Самым логичным...

пример из книги страуструпа
struct pair { char* name; // ñòðîêà int val; // öåëîå }; ...

Задачка из книги Страуструпа...
Доброго времени суток всем! Заранее благодарен за ответы и, возможные, пути исправления... Итак:...

Библиотеки для книги Страуструпа
Доброго времени суток! Дядя Бьярне использует библиотеки в своей книге &quot;Принципы и практика...

Объяснить код из книги Страуструпа
Здравствуйте форумчане, помогите пожалуйста со строуструповским калькулятором. В книге он...


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

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