Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 8229
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2673
∙ повысить рейтинг »
Жерар
Статус: Профессор
Рейтинг: 2423
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1674
Дата выхода:06.06.2011, 16:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:307 / 180
Вопросов / ответов:1 / 1

Вопрос № 183470: Здравствуйте, уважаемые эксперты! Прошу вас помочь в решении задачи: Из входного потока вводится непрямоугольная матрица целых чисел [Aij], i = 1..m, j = 1..n. Значения m и n заранее неизвестны и вводятся из входного потока. Сформировать век...



Вопрос № 183470:

Здравствуйте, уважаемые эксперты! Прошу вас помочь в решении задачи:
Из входного потока вводится непрямоугольная матрица целых чисел [Aij], i = 1..m, j = 1..n. Значения m и n заранее неизвестны и вводятся из входного потока.
Сформировать вектор, упорядочив по возрастанию значения той строки матрицы, в которой сумма элементов максимальна. Если таких строк несколько, упорядосить одну (любую) строку.
Исходную и полученную матрицы вывести в выходной поток с необходимыми комментариями.

Не знаю как сделать обработку. Все делается под UNIX в Eclipse.
Прикрепляю шаблон, по которому предполагалось выполнение, если есть предложения по коду (более оптимизированный), то с удовольствием приму к сведению. И очень важно, закомментировать, чтобы я мог понимать, что происходит)

Отправлен: 01.06.2011, 15:55
Вопрос задал: Валитов Ринат Харисович (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Micren (Профессор) :
Здравствуйте, Валитов Ринат Харисович!
Программа С++:
Код :
#include <iostream>
#include <stdexcept>
#include <locale>
#include <vector>
#include <algorithm>
#include <iterator>
#include <limits>

// Тип данных с которым будем работать. По условию int.
typedef int data_t;
// Тип для формируемого вектора
typedef std::vector<data_t> data_vector;

// Класс - массив

template<class T>
class array
{
public:
    // Конструкторы/деструктор
    array(size_t count = 0);
    array(const array<T>& r);
    virtual ~array();
    // Оператор присваивания
    const array<T> & operator=(const array<T>& r);
    // Изменение размера
    void resize(size_t count);
    // Размер
    size_t size() const;
    // Индексация массива
    T & operator[](size_t index);
    const T & operator[](size_t index) const;
private:
    void copy(const array<T>& r);
    void destroy();
    size_t _size;
    T* _data;
};

// Оператор вывода

template<class char_t, class traits_t, class T>
std::basic_ostream<char_t, traits_t> & operator<<(std::basic_ostream<char_t, traits_t>& stream, const array<T>& right)
{
    const std::ctype<char_t>& facet = std::use_facet< std::ctype<char_t> >(stream.getloc());
    for (size_t i = 0, end = right.size(); i < end; ++i)
    {
        stream << facet.widen(' ') << right[i];
    }
    return stream << std::endl;
}

// Используем для ввода данных

template<class T> T input()
{
    T result = T();
    std::cin >> result;
    if (std::cin.fail())
    {
        throw std::runtime_error("Ошибка ввода");
    }
    return result;
}

/*
 *
 */
int main(int argc, char** argv)
{
    try
    {
        std::locale::global(std::locale(""));

        // Ввод данных
        array< array<data_t> > matr(input<size_t > ());

        for (size_t row = 0, end = matr.size(); row < end; ++row)
        {
            matr[row].resize(input<size_t > ());
            for (size_t col = 0, end = matr[row].size(); col < end; ++col)
            {
                matr[row][col] = input<data_t > ();
            }
        }

        // Выведем для проверки
        std::cout << "Исходная матрица: " << std::endl << matr;

        // Ищем максимум суммы элементов
        data_t maxSum = std::numeric_limits<data_t>::min();
        size_t maxSumRow = 0;
        for (size_t row = 0, end = matr.size(); row < end; ++row)
        {
            data_t sum = 0;
            for (size_t col = 0, end = matr[row].size(); col < end; ++col)
            {
                sum += matr[row][col];
            }
            if (sum > maxSum)
            {
                maxSum = sum;
                maxSumRow = row;
            }
        }

        std::cout << "Строка, содержащая максимальную сумму элементов - " << maxSumRow << std::endl;

        // Формируем вектор
        data_vector vec;
        for (size_t col = 0, end = matr[maxSumRow].size(); col < end; ++col)
        {
            vec.push_back(matr[maxSumRow][col]);
        }
        // Сортировка вектора
        std::sort(vec.begin(), vec.end());

        // Выводим результат
        std::ostream_iterator<data_t> outIter(std::cout, "  ");
        std::cout << "Вектор: " << std::endl;
        std::copy(vec.begin(), vec.end(), outIter);
        std::cout << std::endl;
    }
    catch (std::exception& ex)
    {
        std::cerr << ex.what() << std::endl;
    }

#ifdef _WIN32
    std::system("pause");
#endif

    return 0;
}

template<class T>
array<T>::array(size_t count)
: _data(0)
, _size(0)
{
    try
    {
        _data = new T[count];
        _size = count;
    }
    catch (std::bad_alloc&)
    {
        throw std::runtime_error("Не могу выделить память");
    }
}

template<class T>
array<T>::~array()
{
    destroy();
}

template<class T>
array<T>::array(const array<T>& r)
: _data(0)
, _size(0)
{
    copy(r);
}

template<class T>
const array<T>& array<T>::operator =(const array<T>& r)
{
    copy(r);
    return *this;
}

template<class T>
void array<T>::copy(const array<T>& r)
{
    if (this == &r)
    {
        return;
    }

    try
    {
        destroy();
        _data = new T[r._size];
        _size = r._size;
        for (size_t i = 0; i < _size; ++i)
        {
            _data[i] = r._data[i];
        }
    }
    catch (std::bad_alloc&)
    {
        throw std::runtime_error("Не могу выделить память");
    }
}

template<class T>
void array<T>::destroy()
{
    if (_data)
    {
        delete[] _data;
        _size = 0;
        _data = 0;
    }
}

template<class T>
void array<T>::resize(size_t count)
{
    try
    {
        T* newData = new T[count];
        for (size_t i = 0, end = std::min(_size, count); i < end; ++i)
        {
            newData[i] = _data[i];
        }
        delete[] _data;
        _size = count;
        _data = newData;
    }
    catch (std::bad_alloc&)
    {
        throw std::runtime_error("Не могу выделить память");
    }
}

template<class T>
size_t array<T>::size() const
{
    return _size;
};

template<class T>
T& array<T>::operator [](size_t index)
{
    if (index < _size)
    {
        return _data[index];
    }
    throw std::runtime_error("Выход за пределы диапазона");
}

template<class T>
const T& array<T>::operator [](size_t index) const
{
    if (index < _size)
    {
        return _data[index];
    }
    throw std::runtime_error("Выход за пределы диапазона");
}

Исходный файл данных(test.txt):
Код :
5
3
-5 1 4
4
-10 11 -3 -5
3
4 1 2
1
-1
6
-1 -2 -3 4 4 5 

Формат исходных данных:
Количество строк. Далее перед каждой строкой количество элементов в этой строке, далее сами элементы и т.д.
Результат работы:
Код :
> ./183470 < test.txt
Исходная матрица: 
  -5 1 4
  -10 11 -3 -5
  4 1 2
  -1
  -1 -2 -3 4 4 5

Строка, содержащая максимальную сумму элементов - 2
Вектор: 
1  2  4  

Ответ отправил: Micren (Профессор)
Ответ отправлен: 01.06.2011, 17:02
Номер ответа: 267523
Украина, Краматорск

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267523 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное