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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Fareor
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 5
#1

Cin, чтение с конца полученного потока - C++

05.11.2013, 15:03. Просмотров 1386. Ответов 18
Метки нет (Все метки)

Происходит ввод с клавиатуры последовательности чисел разделенных пробелами, нужно извлечь из этого потока последнее значение. Как?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
reidaigo
6 / 6 / 0
Регистрация: 16.12.2012
Сообщений: 31
05.11.2013, 15:20     Cin, чтение с конца полученного потока #2
Последовательность чисел определить как динамический массив символов. Определить длину массива функцией strlen(). Последним значением будет элемент с индексом strlen()-1/
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.11.2013, 15:28     Cin, чтение с конца полученного потока #3
Самое простое, - считать числа в массив и вывести его наоборот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
 
int main()
{
   std::cout << "Enter numbers (any letters to stop):\n-> ";
   std::vector<int> numbers( (std::istream_iterator<int>(std::cin)), std::istream_iterator<int>() );
   std::reverse_copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " "));
 
   std::cout << "\nDone." << std::endl;
   return 0;
}
Fareor
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 5
05.11.2013, 16:17  [ТС]     Cin, чтение с конца полученного потока #4
reidaigo, не то, надо проще. Чтобы без массивов. Ведь все введенные с клавиатуры значения до их чтения из потока хранятся в нем. При обычно чтении, они извлекаются из потока в порядке ввода, а мне нужно извлекать их в обратном порядке(т.е. начиная с последнего и заканчивая первым). Как это реализовать?
DiffEreD Ввод должен производиться 1 раз! Числа разделенные пробелом. И да без массивов.

Добавлено через 43 минуты
C++
1
2
3
4
5
6
7
#include <iostream>
using namespace std;
int main(){
int a;
cin >> a;
return 0;
}
По примеру кода выше:
"cin >> a;" - происходит ввод последовательности чисел, допустим "4 15 67 10". Соответственно значение a это будет 4. А оставшиеся числа 15, 67, 10 останутся во входном потоке. Если, к примеру, мы сейчас снова пропишем "cin >> a;" то компьютер не предоставит пользователю возможность ввода(у него уже есть значения в потоке), то есть a станет равно 15. Вот здесь что мне нужно, если по моему примеру, нужно из тех чисел, что остались в потоке, переменной a присвоить последнее, то есть не 15(или даже 4), а 10. А все остальные значения кроме 10 должны так и остаться в потоке! Кто-нибудь подскажет??
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.11.2013, 16:43     Cin, чтение с конца полученного потока #5
Fareor,
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    int n;
    cin>>n;
    while (cin.peek() != '\n') {
        cin.get();
        cin>>n;
    }
    cout<<n;
    system("pause");
    return 0;
}
Пардон, не увидел, что вам нужно, чтобы всё остальное сохранялось в потоке)
Matan!
248 / 99 / 20
Регистрация: 31.05.2013
Сообщений: 880
Записей в блоге: 2
Завершенные тесты: 1
05.11.2013, 16:44     Cin, чтение с конца полученного потока #6
Так и напиши,обратить массив.Вот,пожалуйста
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
#include <iostream>
#include <stdio.h>
#include <string>
 
using namespace std;
 
int main()
{
    int N;
    double mass[10000], NumbWhile;
    setlocale(0,"");
 
    while (true)
    {
        cout << "Нажмите 1 для продолжения работы" << endl;
        cin >> NumbWhile;
        if (NumbWhile==1)
        {
            cout << "Введите размер массива" << endl;
            cin >> N;
            if (N<0)
            {
                cout << "Неправильно введённые данные" << endl;
                system("pause");
                return 1;
            }
 
            cout << "Введите массив" << endl;
            for(int i=0; i<N; i++)
                cin >> mass[i];
 
            cout << "Массив в обратном порядке: " << endl; 
            for(int i=N; i>0; i--)
            {
                swap(mass[i-1],mass[i]);
                cout << mass[i] << "  ";
            }
            cout << endl;
        }
        else break;
    }
    system("pause");
    return 0;
}
Fareor
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 5
05.11.2013, 17:02  [ТС]     Cin, чтение с конца полученного потока #7
Matan!, Я несколько раз писал, что нужна реализация без использования массивов..

Добавлено через 4 минуты
scenotaph, Да, сейчас подскажите?

Вообще, если "cin >> a;" берет первое значение из потока, должна же быть функция, которая берет последнее. или нет?
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.11.2013, 17:14     Cin, чтение с конца полученного потока #8
Fareor, Ни разу с подобным не сталкивался. Не используя массивы, ничего на ум не приходит
Matan!
248 / 99 / 20
Регистрация: 31.05.2013
Сообщений: 880
Записей в блоге: 2
Завершенные тесты: 1
06.11.2013, 08:46     Cin, чтение с конца полученного потока #9
Цитата Сообщение от Fareor Посмотреть сообщение
Вообще, если "cin >> a;" берет первое значение из потока, должна же быть функция, которая берет последнее. или нет?
Тебе товарищ scenotaph ответил,как вывести последнее значение без массива.
Но опять-таки.Ты просишь:"Приготовьте мне бутерброд с маслом без масла".
Если просишь,чтобы программа выводила последовательность,то массив обязательно должен быть, поскольку все введённые значения надо где-то хранить.Можно,конечно,извратиться до перечисления(enum) или структуры.Но тут такой гибкости,как с массивами,не будет.

Добавлено через 15 минут
Цитата Сообщение от Fareor Посмотреть сообщение
"cin >> a;" берет первое значение из потока
Кто тебе сказал эту глупость?Это просто ввод значения а и не более того.В каком смысле"берёт"?
CIN=C(из С)+IN(ввод).
Fareor
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 5
06.11.2013, 09:12  [ТС]     Cin, чтение с конца полученного потока #10
Matan!, Зачем значения записывать в массив если они и так хранятся во входном потоке?(массив это как-бы лишнее..)? Ранее я это описал.. Просто вывести последнее значение это не то, что мне нужно!
Цитата Сообщение от Fareor Посмотреть сообщение
нужно извлечь из этого потока последнее значение
- то есть значение должно быть получено именно именно из потока, при этом все остальные значения должны так и остаться в потоке(кажется я много раз уже пытался это описать!)

Добавлено через 3 минуты
Цитата Сообщение от Matan! Посмотреть сообщение
Кто тебе сказал эту глупость?Это просто ввод значения а и не более того.В каком смысле"берёт"?
CIN=C(из С)+IN(ввод).
Проверь сам Так и происходит, остальные символы остаются в потоке. Это не просто ввод, если в потоке уже что-то есть, никакого ввода не будет(пользователю не предоставится возможность ввода), компьютер возьмет значение из имеющихся в потоке!

Добавлено через 3 минуты
Я ведь уже описывал как все происходит:
Цитата Сообщение от Fareor Посмотреть сообщение
По примеру кода выше:
"cin >> a;" - происходит ввод последовательности чисел, допустим "4 15 67 10". Соответственно значение a это будет 4. А оставшиеся числа 15, 67, 10 останутся во входном потоке. Если, к примеру, мы сейчас снова пропишем "cin >> a;" то компьютер не предоставит пользователю возможность ввода(у него уже есть значения в потоке), то есть a станет равно 15. Вот здесь что мне нужно, если по моему примеру, нужно из тех чисел, что остались в потоке, переменной a присвоить последнее, то есть не 15(или даже 4), а 10. А все остальные значения кроме 10 должны так и остаться в потоке!
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.11.2013, 10:18     Cin, чтение с конца полученного потока #11
Fareor, Довольно странное задание, так просто это не сделать. Поток нельзя читать с конца, только с начала, что логично как бэ. Только если играться с буфером потока непосредственно.
SatanaXIII
Супер-модератор
Эксперт С++
5593 / 2627 / 240
Регистрация: 01.11.2011
Сообщений: 6,461
Завершенные тесты: 1
06.11.2013, 10:42     Cin, чтение с конца полученного потока #12
Цитата Сообщение от ForEveR Посмотреть сообщение
что логично как бэ
Потому что он FIFO?
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 250
06.11.2013, 10:53     Cin, чтение с конца полученного потока #13
Рекурсия должна спасти отца русской демократии. Рекурсия, рекурсия и ещё раз рекурсия ... В.И. Ленин
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.11.2013, 11:34     Cin, чтение с конца полученного потока #14
Рекурсия должна по идее. Криво, но как-то так

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
#include <iostream>
#include <limits>
 
void putback_number(int value)
{
   while (value)
   {
      std::cin.putback(static_cast<int>(value % 10) + '0');
      value /= 10;
   }
}
 
void read_last_impl(int& value)
{
   static bool initialized = false;
   int a = std::numeric_limits<int>::max();
   std::cin >> a;
   if (!std::cin.fail())
   {
      read_last_impl(value);
   }
   if (!initialized && a != std::numeric_limits<int>::max())
   {
      value = a;
      initialized = true;
      return;
   }
   if (a != std::numeric_limits<int>::max())
   {
      std::cin.putback(' ');
      putback_number(a);
   }
   else
   {
      std::cin.clear();
   }
}
 
int read_last()
{
   int value = 0;
   read_last_impl(value);
   return value;
}
 
int main()
{
   std::cout << read_last() << std::endl;
   // only check that values are in stream
   /*std::string v;
   std::getline(std::cin, v);
   std::cout << v << std::endl;*/
}
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 250
06.11.2013, 12:06     Cin, чтение с конца полученного потока #15
Известно, что рекурсию можно заменить итерацией. Ну, ладно, а это подойдет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main()
{
    int a;
    char c;
 
    do
    {
        cin >> a;
        c= cin.get() ;
    }
    while( c!=10);
    
    cout << a;
    return 0;
}
Добавлено через 17 минут
можно действительно обнаружить конец потока (нажатие Ctrl+D или Ctrl+Z - от ОС зависит) если заменить 10 на -1
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.11.2013, 12:21     Cin, чтение с конца полученного потока #16
chedman, Условия-то не выполнены. В потоке после прочтения последнего не будет предыдущих чисел.
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 250
06.11.2013, 12:55     Cin, чтение с конца полученного потока #17
Ну или так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
int read()
{
    int a;
    char c;
 
    cin >> a;
    c= cin.get();
 
    if(c!=10) read();
 
    cout << a << endl;
    return a;
}
 
int main()
{
    read();
    return 0;
}
Без массива в стек кидать.
Matan!
248 / 99 / 20
Регистрация: 31.05.2013
Сообщений: 880
Записей в блоге: 2
Завершенные тесты: 1
07.11.2013, 07:13     Cin, чтение с конца полученного потока #18
Цитата Сообщение от chedman Посмотреть сообщение
if(c!=10) read();
Что это значит?
Если количество введённых цифр не равно 10,то выполняется ... ?

Добавлено через 1 минуту
То есть количество получаемых цифр из потока.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2013, 07:50     Cin, чтение с конца полученного потока
Еще ссылки по теме:
Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync C++
C++ Ошибка при повторном получении данных из потока cin
C++ Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
C++ Считывание до конца входного потока
cin чтение из файла C++ C++

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

Или воспользуйтесь поиском по форуму:
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 250
07.11.2013, 07:50     Cin, чтение с конца полученного потока #19
10 - код символа конца строки, можно конечно -1 поставить, т.е. код конца потока (Ctrl+D или Ctrl+Z), но там ещё надо прогу немного подшаманить, но идея та же самая - РЕКУРСИЯ и использование стековой памяти.

Добавлено через 21 минуту
C++
1
if(c!=10) read();
Эта строка обеспечивает выход из рекурсии.
Yandex
Объявления
07.11.2013, 07:50     Cin, чтение с конца полученного потока
Ответ Создать тему
Опции темы

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