Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение массива чисел с клавиатуры 
V
    Опции темы
JAYBE
Дата 24.12.2012, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Добрый день.
Необходимо получить массив положительных чисел с клавиатуры.
Я сделал пока так:
Код

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <ctime>
#include <time.h>
using namespace std;

int main(int argc, char* argv[])
{
    int i=0;
    int flag=0;
    char str[256];
    while ((str[i]=getchar())!='\n') {
        i++;
    }
    str[i]='\0';
    for(i=0; i<255; i++){
        if(str[i]=='-') {
            cout<<"Есть отрицательное число: ";
        } else {
//тут необходимо реализовать добавление в массив
        }
    }
}

Подскажите, как доделать данную реализацию и если есть более профессиональный подход, то покажите мне его.  smile 
PM   Вверх
shuttle
Дата 24.12.2012, 12:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.4.2008

Репутация: нет
Всего: нет



Код

std::list<int> coll(std::istream_iterator<int>(std::cin), std::istream_iterator<int>());
coll.remove_if(coll.begin(), coll.end(), [](int elem){return elem < 0;});

--------------------
PM MAIL   Вверх
NoviceF
Дата 25.12.2012, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(shuttle @  24.12.2012,  13:01 Найти цитируемый пост)
Код

coll.remove_if(coll.begin(), coll.end(), [](int elem){return elem < 0;});


наверно, вернее будет так (во всяком случае так компилируется  smile )

Код

coll.remove_if([](int elem)
    {
        return elem < 0;
    }
    );


Вот у меня вопрос, как задать условия выхода из чтения из cin?

Это сообщение отредактировал(а) NoviceF - 25.12.2012, 23:23
PM MAIL   Вверх
shuttle
Дата 26.12.2012, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.4.2008

Репутация: нет
Всего: нет



да действительно удалять из std::list надо так
Код

remove_if(op)


я еще ошибку допустил - забыл скобки вокруг первого аргумента конструктора 
Код

std::list<int> coll((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());

вот так правильно.

Это сообщение отредактировал(а) shuttle - 26.12.2012, 14:56
--------------------
PM MAIL   Вверх
shuttle
Дата 26.12.2012, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.4.2008

Репутация: нет
Всего: нет



Цитата(NoviceF @ 25.12.2012,  23:22)
Вот у меня вопрос, как задать условия выхода из чтения из cin?

В данном случае нажимаешь ctrl+z чтобы пректратить ввод.

--------------------
PM MAIL   Вверх
JAYBE
Дата 9.1.2013, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



А можно разъяснить принцип работы?
Для старта немного непонятно почему именно таким образом...
PM   Вверх
NoviceF
Дата 9.1.2013, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(JAYBE @  9.1.2013,  12:21 Найти цитируемый пост)
А можно разъяснить принцип работы?
Для старта немного непонятно почему именно таким образом... 


пример выше предоставлю прокомментировать автору, а вот рабочий код, правда на профессионализм не претендую smile

В массив размером collsize принимаем цифры из консоли, удаляем отрицательные значения, выводим в консоль, что осталось.

Код

#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>

int main()
{
    int collsize = 5;

    std::list<int> coll(collsize);

    std::for_each(coll.begin(), coll.end(), [](int& x){std::cin >> x;});
    coll.remove_if([](int elem){return elem < 0;});
    std::copy(coll.begin(), coll.end(), std::ostream_iterator<int>(std::cout, " "));

    return 0;
}


тут используется STL контейнеры, алгоритмы, итераторы и лямбда функции:

http://cplusplus.com/reference/list/list/
http://cplusplus.com/reference/algorithm/for_each/
http://cplusplus.com/reference/algorithm/copy/
http://cplusplus.com/reference/iterator/ostream_iterator/
http://ru.wikipedia.org/wiki/C%2B%2B11#.D0....BD.D0.B8.D1.8F

но, если не всё понятно с лямбдами, перед ними лучше ознакомиться с указателями на функцию и функциональными объектами (функторами).


PM MAIL   Вверх
bsa
Дата 9.1.2013, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(JAYBE @  9.1.2013,  12:21 Найти цитируемый пост)
А можно разъяснить принцип работы?
Сначала производится копирование чисел из стандартного потока ввода в список. Затем производится удаление "лишнего".
Цитата(JAYBE @  9.1.2013,  12:21 Найти цитируемый пост)
Для старта немного непонятно почему именно таким образом... 
Ты просил профессиональный подход, ты его получил.
Если бы данных было очень много, то возможно имелся бы смысл проверять еще при вводе. Но у тебя их мало, поэтому можно делать как проще. Если тебе хочется, чтобы ввод завершался клавишей Enter, то можно поступить так:
Код
std::string line;
if (!std::getline(std::cin, line)) {
  //ввод почему-то не удался
  return 1;
}
std::istringstream stream(line);
std::list<int> coll;
std::copy(std::istream_iterator<int>(stream), std::istream_iterator<int>(), std::back_inserter(coll));
coll.remove_if(std::bind2st(&std::less_equal<int>, 0));
Этот код соответствует стандарту C++03, так как не использует лямбда-выражений.
PM   Вверх
volatile
Дата 10.1.2013, 00:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Ввод и последующее удаление можно объединить в одну операцию.
Тогда список сразу примет нужный вид, без лишних выделений памяти и пробегов.

Код

remove_copy_if (std::istream_iterator<int>(stream), std::istream_iterator<int>(), std::back_inserter(coll), std::bind2nd (std::less<int>(), 0));

PM MAIL   Вверх
JAYBE
Дата 10.1.2013, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.3.2008

Репутация: нет
Всего: 0



Спасибо. Сделал так:
Код

#include <iostream>
using namespace std;

int main()
{
    int i;
    int max = 0;
    while (cin >> i) {
        if (i>max) {
            max = i;
            cout << max << endl;
        }
    }
    cout << "Max:" << max << endl;
    return 0;
}

PM   Вверх
volatile
Дата 10.1.2013, 16:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(JAYBE @  10.1.2013,  10:42 Найти цитируемый пост)
Сделал так:

JAYBE, замечательно конечно что вы это сами сделали.
Только это не имеет ничего общего с вашей первоначальной темой
Цитата(JAYBE @  24.12.2012,  09:31 Найти цитируемый пост)
Необходимо получить массив положительных чисел с клавиатуры.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.