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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

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

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 1386
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1130
∙ повысить рейтинг »
Micren
Статус: Бакалавр
Рейтинг: 972
∙ повысить рейтинг »

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

Номер выпуска:1415
Дата выхода:31.10.2009, 01:30
Администратор рассылки:Dr_Andrew, Старший модератор
Подписчиков / экспертов:644 / 169
Вопросов / ответов:1 / 3
IRC-канал по теме:#C

Вопрос № 173690: Здравствуйте эксперты! Дана матрица n x m если в матрице есть строки,в которых элементы упорядочены по возрастанию,переставить эти строки в начало матрицы. Заранее большое спасибо!...



Вопрос № 173690:

Здравствуйте эксперты!
Дана матрица n x m если в матрице есть строки,в которых элементы упорядочены по возрастанию,переставить эти строки в начало матрицы.
Заранее большое спасибо!

Отправлен: 26.10.2009, 01:00
Вопрос задал: Akum2008, Посетитель
Всего ответов: 3
Страница вопроса »


Отвечает Micren, Бакалавр :
Здравствуйте, Akum2008.
Программа. С++. MS VS 2008.

В программе используются стандартные массивы С++. Перестановка строк в таких массивах весьма трудоемка. Легче было бы сделать это на контейнерных типах данных, но т.к. Вы не указали, что конкретно требуется то и сделал на стандартных массивах.

Код:
#include <iostream>
#include <iomanip>
#include <locale>
#include <cmath>
#include <cstdlib>

using namespace std;

// Заполняет матрицу случайными числами
template<size_t _dim1,size_t _dim2>
void generateMatrix(int (&matrix)[_dim1][_dim2])
{
for(size_t i=0;i<_dim1;++i)
{
for(size_t j=0;j<_dim2;++j)
{
matrix[i][j]=rand()%50;
}
}
}

// Оператор вывода для матрицы
template<class _Elem,class _Traits,size_t _dim1,size_t _dim2>
basic_ostream<_Elem,_Traits>& operator<<(basic_ostream<_Elem,_Traits>& stream,int (&matrix)[_dim1][_dim2])
{
streamsize width=stream.width();
for(size_t i=0;i<_dim1;++i)
{
for(size_t j=0;j<_dim2;++j)
{
stream<<setw(width)<<matrix[i][j]<<' ';
}
stream<<endl;
}
return stream;
}

// Решение задачи здесь
template<size_t _dim1,size_t _dim2>
void solve(int (&matrix)[_dim1][_dim2])
{
// Строка в которую будем переносить упорядоченную строку
size_t to=0;
for(size_t i=0;i<_dim1;++i)
{
// Флаг. Если упорядочена по возрастанию.
bool ascending=true;
// Проверяем на упорядоченность
for(size_t j=1;j<_dim2 && ascending;++j)
{
// Строго по возрастанию. Если надо по не убыванию сделайте <=
ascendi ng=matrix[i][j-1]<matrix[i][j];
}
// Если упорядочена
if(ascending)
{
// Индекс строки которую переносим
size_t from=i;
// Перенос осуществляется постепенным сдвигом строки вверх,
// не нарушая порядок остальных строк
// Пока не переместили куда надо
while(from!=to)
{
// Сдвигаем вверх
for(size_t j=0;j<_dim2;++j)
{
swap(matrix[from][j],matrix[from-1][j]);
}
--from;
}
// Строка перемещена, значит в следующий раз перемещать будем на строку ниже
++to;
}
}
}

int main()
{
srand(static_cast<unsigned int>(time(0)));
setlocale(LC_ALL,"russian");
// Матрица
int matrix[5][3];
// Заполняем
generateMatrix(matrix);
// Выводим
cout<<"Исходная матрица:"<<endl<<setw(4)<<matrix<<endl;
// Решаем задачу
solve(matrix);
// Выводим результат
cou t<<"Результат:"<<endl<<setw(4)<<matrix<<endl;
system("PAUSE");
return 0;
}


Пример работы:
Код:
Исходная матрица:
46 27 47
35 14 33
40 42 35
2 27 30
2 20 45

Результат:
2 27 30
2 20 45
46 27 47
35 14 33
40 42 35

Ответ отправил: Micren, Бакалавр
Ответ отправлен: 26.10.2009, 02:04

Оценка ответа: 5
Комментарий к оценке:
Спасибо большое!

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

    Приложение:

    Ответ отправил: vladisslav, 5-й класс
    Ответ отправлен: 26.10.2009, 10:30

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 255857 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Ashotn, 1-й класс :
    Здравствуйте, Akum2008.
    Я напишу завтра программу. Согласны заплатить?

    Первоначальный ответ. Был удален. По настойчивой просьбе автора восстановлен и скорректирован.

    Статус : непрочитанное
    Дата : 26.10.2009, 16:15
    От кого : Ashotn, 1-й класс
    Тема : Без темы
    Сообщение :
    // matrica.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"
    #include <list>
    #include <vector>
    #include <fstream>
    #include <iostream>

    using namespace std;
    typedef vector<int> row;

    int _tmain(int argc, _TCHAR* argv[])
    {
    int n,m,i;
    row r,r1;
    list<row> a;
    list<row> b;
    list<row>::iterator c1_Iter;

    a.clear();
    cin >> n >>m;
    for(i=0;i<n;i++)
    {

    r.resize(m);
    for(int j=0;j<m;j++)
    {
    cin >> r[j];
    }
    a.push_back(r);
    }
    cout << a.size();

    for( c1_Iter = a.begin( ); c1_Iter!=a.end(); ++c1_Iter)
    {
    r=*c1_Iter;
    bool vozrast=true;

    for(int j=0;j<m-1;j++)
    {
    if(r[j]>r[j+1])
    {
    vozrast=false;
    break;
    }
    }
    if(vozrast)
    {
    b.push_front(r);
    }
    else b.push_back(r);
    }

    return 0;
    }

    Редактирование ответа после исправления и общения в личной почте.


    -----
    ∙ Отредактировал: Цикалов Игорь Константинович, Модератор
    ∙ Дата редактирования: 26.10.2009, 18:44 (время московское)

    Ответ отправил: Ashotn, 1-й класс
    Ответ отправлен: 26.10.2009, 01:20

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


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

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

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

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

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

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

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


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.10 от 26.10.2009

    В избранное