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

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


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

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

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

Асмик Александровна
Статус: Академик
Рейтинг: 7292
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2649
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2267
∙ повысить рейтинг »

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

Номер выпуска:1637
Дата выхода:23.02.2011, 18:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:317 / 187
Вопросов / ответов:1 / 3

Вопрос № 182246: Здравствуйте! У меня возникли сложности с таким вопросом:Помогите написать программу на языке С++. Под ОС Windows XP, среда Borland Builder C++ 6,2006. Программа должна быть написана с помощью структур и прокомментирована. Условие задачи: Из входн...



Вопрос № 182246:

Здравствуйте! У меня возникли сложности с таким вопросом:Помогите написать программу на языке С++. Под ОС Windows XP, среда Borland Builder C++ 6,2006. Программа должна быть написана с помощью структур и прокомментирована. Условие задачи:
Из входного потока вводится непрямоугольная матрица целых чисел [aij], i=1,....., m, j=1,....ni. Значения m и ni заранее не известны и вводятся из входного потока.
Сформировать новую матрицу, поменяв в исходной матрице местами первую строку со строкой, содержащей максимальное количество строго положительных значений, и последнюю строку со строкой, содержащей максимальное количество отрицательных значений.
Исходную и полученную матрицы вывести в поток.

Отправлен: 18.02.2011, 12:35
Вопрос задал: Magma (Посетитель)
Всего ответов: 3
Страница вопроса »


Отвечает Micren (Профессор) :
Здравствуйте, Magma!
Программа. С++.
Код:
#include <iostream>
#include <stdexcept>
#include <locale>

// Тип данных с которым будем работать. По условию int.
typedef int data_t;

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

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 in dex);
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;

// Ищем максимум пложительных/отрицательных
size_t maxPositive = 0, maxNegative = 0, maxPositiveRow = 0, maxNegativeRow = 0;
for (size_t row = 0, end = matr.size(); row < end; ++row)
{
size_ t positive = 0, negative = 0;
for (size_t col = 0, end = matr[row].size(); col < end; ++col)
{
positive += matr[row][col] > 0;
negative += matr[row][col] < 0;
}
if (positive > maxPositive)
{
maxPositive = positive;
maxPositiveRow = row;
}
if (negative > maxNegative)
{
maxNegative = negative;
maxNegativeRow = row;
}
}

std::cout << "Строка, содержащая максимальное к-во положительных - " << maxPositiveRow << ", отрицательных - " << maxNegativeRow << std::endl;

// Осуществляем обмен согласно условия
std::swap(matr[0], matr[maxPositiveRow]);
if (maxNegativeRow == 0)
{
maxNegativeRow = maxPositiveRow;
}
else if (maxNegativeRow == maxPositiveRow)
{
maxNegativeRow = 0;
}
std::swap(matr[maxNegativeRow], matr[matr.size() - 1]);

// Выводим результат
std::cout << "Результат: " << std::endl << matr;
}
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 = st d::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
1 2 4
1
-1
6
-1 -2 -3 4 4 5

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

Строка, содержащая максимальное к-во положительных - 2, отрицательных - 1
Результат:
1 2 4
-1 -2 -3 4 4 5
-5 1 4
-1
-10 11 -3 -5

Ответ отправил: Micren (Профессор)
Ответ отправлен: 18.02.2011, 16:37
Номер ответа: 265911
Украина, Краматорск

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


  • Отвечает Киселёва Алёна aka Verena (Профессор) :
    Здравствуйте, Magma!
    Вариант без классов, с использованием структуры для хранения ряда матрицы. Проверено на VS 2005, но должно работать и в Builder.
    Удачи!

    Приложение:

    -----
    Эта история - не для истории, понимаешь?

    Ответ отправил: Киселёва Алёна aka Verena (Профессор)
    Ответ отправлен: 19.02.2011, 21:46
    Номер ответа: 265926
    Россия, Москва
    Адрес: Москва, Солнцево
    Адрес сайта: Творчество, цитаты, события.
    ICQ # 230360822

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


  • Отвечает vladisslav (8-й класс) :
    Здравствуйте, Magma!
    Используется структура. Данные хранятся в массиве указателей. Количество элементов в массивах второго уровня хранится в первом элементе (с индексом 0).
    Память освобождается явным образом.
    Судя по тестам вроде работает
    проверка:
    Код:
    $ for ((k=1;k<=4;k++)); do echo test$k ; cat test$k ; echo ""; ./t<test$k ; done
    test1
    5
    6 1 -2 -3 -4 -5 -6
    5 2 -4 6 -3 2
    7 3 3 3 3 -4 0 11
    4 2 -2 -6 4
    5 2 3 4 5 9

    Source matrix
    1 -2 -3 -4 -5 -6
    2 -4 6 -3 2
    3 3 3 3 -4 0 11
    2 -2 -6 4
    2 3 4 5 9
    Result matrix
    3 3 3 3 -4 0 11
    2 -4 6 -3 2
    1 -2 -3 -4 -5 -6
    2 -2 -6 4
    1 -2 -3 -4 -5 -6
    test2
    4
    7 0 0 0 0 0 0 0
    4 -4 6 -3 2
    4 0 0 0 0
    3 0 0 0

    Failed.
    Max negative row == max positive row
    test3
    5
    4 -2 -3 -4 -5
    4 -4 6 -3 2
    4 2 3 4 5
    4 3 3 3 -4
    4 2 -2 -6 4

    Source matrix
    -2 -3 -4 -5
    -4 6 -3 2
    2 3 4 5
    3 3 3 -4
    2 -2 -6 4
    Result matrix
    2 3 4 5
    -4 6 -3 2
    -2 -3 -4 -5
    3 3 3 -4
    -2 -3 -4 -5
    test4
    5
    5 1 -4 6 -3 2
    6 2 -2 -3 -4 -5 -9
    7 3 2 3 4 5 6 7
    4 3 3 3 -4
    5 2 -2 -6 4 5

    Source matrix
    1 -4 6 -3 2
    2 -2 -3 -4 -5 -9
    3 2 3 4 5 6 7
    3 3 3 -4
    2 -2 -6 4 5
    Result matrix
    3 2 3 4 5 6 7
    2 -2 -6 4 5
    1 -4 6 -3 2
    3 3 3 -4
    2 -2 -3 -4 -5 -9

    Приложение:

    Ответ отправил: vladisslav (8-й класс)
    Ответ отправлен: 20.02.2011, 14:16
    Номер ответа: 265933

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


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

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

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

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

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

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

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



    В избранное