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

В каждой строке матрицы переставить в обратном порядке элементы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Алён4uk
 Аватар для Алён4uk
12 / 12 / 3
Регистрация: 03.04.2011
Сообщений: 75
26.09.2011, 15:07     В каждой строке матрицы переставить в обратном порядке элементы #1
Разработать программу обработки прямоугольной матрицы – двумерного динамического массива. В каждой строке матрицы переставить в обратном порядке элементы, расположенные между последним и максимальным элементами.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.09.2011, 16:15     В каждой строке матрицы переставить в обратном порядке элементы #2
Цитата Сообщение от Алён4uk Посмотреть сообщение
Разработать программу
Так почему же вы этого не делаете?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
26.09.2011, 16:47     В каждой строке матрицы переставить в обратном порядке элементы #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
#include <algorithm>
#include <random>
#include <ctime>
#include <functional>
#include <vector>
#include <iomanip>
 
void output_matr(const std::vector<std::vector<int>>  &m){
  for(auto &x : m){
    for(auto &y : x) std::cout << std::setw(4) << y << ' ';
    std::cout << '\n';
  }
}
 
int main(){
  const size_t ROWS = 5,
               COLS = 10;
  std::vector<std::vector<int>>  matr(ROWS, std::vector<int>(COLS));
  auto rnd = std::bind(std::uniform_int_distribution<int>(-100, 100),
                       std::mt19937(time(nullptr)));
  std::generate(&matr[0][0], &matr[ROWS - 1][COLS], rnd);
  output_matr(matr);
  for(auto &x : matr)
    std::reverse(std::max_element(x.begin(), x.end()) + 1, x.end());
  std::cout << "\n\n";
  output_matr(matr);
  return 0;
}
Алён4uk
 Аватар для Алён4uk
12 / 12 / 3
Регистрация: 03.04.2011
Сообщений: 75
26.09.2011, 17:11  [ТС]     В каждой строке матрицы переставить в обратном порядке элементы #4
asics, что-то сильно сложно..ничего не понимаю..
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.09.2011, 18:45     В каждой строке матрицы переставить в обратном порядке элементы #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Алён4uk Посмотреть сообщение
ничего не понимаю
А так?
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
// заполняет одномерный массив случайными значениями в диапазоне [lo; hi]
void random_fill_row(int * row, size_t size, int lo, int hi){
    while ( size-- )
        *row++ = rand() % ( hi - lo + 1 ) + lo;
}
 
// заполняет матрицу случайными значениями, работает только с дин. массивами
void random_fill_matrix(int ** matrix, size_t rows, size_t columns, int lo, int hi){
    while ( rows-- )
        random_fill_row(*matrix++, columns, lo, hi);
}
 
// выводит строку на экран
void dump_row(const int * arr, size_t size, size_t width){
    while ( size-- )
        printf("%0*d%c", width, *arr++, ( size ) ? ' ' : '\n');
}
 
// выводит матрицу
void dump_matrix(int ** matrix, size_t rows, size_t columns, size_t width){
    while ( rows-- )
        dump_row(*matrix++, columns, width);
}
 
// возвращает указатель на первый максимальный элемент в строке
int * max_element(const int * arr, size_t size){
    return ( size < 2 ) ? (int*)arr : ( *arr < *(arr + size - 1) ) ? max_element(arr + 1, size - 1) : max_element(arr, size - 1);
}
 
// переворачивает значения элементов между переданными указателями в строке
void swap_parth(int * after, int * before){
    if ( before - after > 1 ){
        int t = *(after + 1);
        *(after + 1) = *(before - 1);
        *(before - 1) = t;
        swap_parth(++after, --before);
    }
}
 
#define HI 99
#define LO 0
#define WIDTH 2
// точка входа в программу
int main(void){
    int ** matrix;
    size_t rows, columns, i;
    
    printf("Rows: ");
    if ( scanf("%u", &rows) != 1 )
        exit(1);
    printf("Columns: ");
    if ( scanf("%u", &columns) != 1 )
        exit(1);
    
    if ( ! ( matrix = malloc(sizeof(int*) * rows) ) ){
        fprintf(stderr, "Memory error!\n");
        exit(1);
    }
    for ( i = 0; i < rows; ++i ){
        if ( ! ( matrix[i] = malloc(sizeof(int) * columns) ) ){
            fprintf(stderr, "Memory error!\n");
            exit(1);
        }
    }
    
    srand(time(NULL));
    
    random_fill_matrix(matrix, rows, columns, LO, HI);
    printf("Before:\n");
    dump_matrix(matrix, rows, columns, WIDTH);
    for ( i = 0; i < rows; ++i )
        swap_parth(max_element(matrix[i], columns), matrix[i] + columns - 1);
    printf("After:\n");
    dump_matrix(matrix, rows, columns, WIDTH);
    
    for ( i = 0; i < rows; ++i )
        free(matrix[i]);
    free(matrix);
    
    system("pause");
    exit(0);
}

Не по теме:

Аватарка понравилась... Луч света в царстве анимешных персонажей, черепков и прочей нежити...

Алён4uk
 Аватар для Алён4uk
12 / 12 / 3
Регистрация: 03.04.2011
Сообщений: 75
27.09.2011, 19:38  [ТС]     В каждой строке матрицы переставить в обратном порядке элементы #6
easybudda, к моему стыду...все равно ничего не понятно..даже догадываюсь почему...это ж C...а я ж балда..только C++ начала учить))
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
27.09.2011, 19:42     В каждой строке матрицы переставить в обратном порядке элементы #7
Цитата Сообщение от Алён4uk Посмотреть сообщение
easybudda, к моему стыду...все равно ничего не понятно..даже догадываюсь почему...это ж C...а я ж балда..только C++ начала учить))
да там не настолько большая разница
Алён4uk
 Аватар для Алён4uk
12 / 12 / 3
Регистрация: 03.04.2011
Сообщений: 75
27.09.2011, 20:01  [ТС]     В каждой строке матрицы переставить в обратном порядке элементы #8
Van111, я С вообще не знаю, соответственно не знаю, какая и разница... да и С++ учу только с начала сентября..как универ сказал учить, так вот и учу..на форуме)))
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.09.2011, 20:07     В каждой строке матрицы переставить в обратном порядке элементы #9
Цитата Сообщение от Алён4uk Посмотреть сообщение
это ж C...а я ж балда..только C++ начала учить
В принципе, да, С. Но этот код, перепиши его на С++, не особо изменится - malloc()/free() на new[]/delete[] ну и вывод на cin/cout... Но это не интересно, на С++ лучше так, как у asics, учиться писать. Пока научитесь, пара человек останется, и то где-нибудь в Индии, которые вспомнят, что когда-то небыло стандарта C++0x. А уж про то, что можно без STL обходиться, разве-что С-программисты знать будут...
Если же оно Вам только для зачёта, ну приведите понятный вам код, может кто и напишет в том же духе...
Алён4uk
 Аватар для Алён4uk
12 / 12 / 3
Регистрация: 03.04.2011
Сообщений: 75
27.09.2011, 20:18  [ТС]     В каждой строке матрицы переставить в обратном порядке элементы #10
Цитата Сообщение от easybudda Посмотреть сообщение
на С++ лучше так, как у asics, учиться писать
, я б с радостью, но преподы своё толкают...и они смотрят, как программы написаны..хоть это и не на зачет, а на домашнюю работу.

Цитата Сообщение от easybudda Посмотреть сообщение
ну приведите понятный вам код
я вот недавно вояла:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Вычислить сумму элементов массива, расположенных между максимальным элементом
// и минимальным элементом (первыми по порядку, если их несколько). Если по какой-либо
// причине вычислить сумму не удается, выдать об этом сообщение с указанием причины
 
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
int main()
{
    setlocale (LC_ALL,"");
    int N, nomax=0, nomin=0;
    float sum=0, max=0, min=0, b=0;
    cout<<"Введите количество элементов массива:";
    cin>>N;
    float * A = new float [N];
    for (int i=0;i<N; i++)
    {
        cin>>A[i];
    }
    for (int i=0;i<N;i++)
    {
        max=abs(A[0]);
        min=abs(A[0]);
        for (int i=1; i<N;i++)
        {
            if (abs(A[i])>max)
            {
                max=abs(A[i]);
                nomax=i;
            }
            if (abs(A[i])<min)
            {
                min=abs(A[i]);
                nomin=i;
            }
        }
    }
        if(nomin<nomax&&nomin!=nomax&&nomax!=nomin-1&&nomax!=nomin+1)
        {
            for (int i=nomin+1; i<nomax; i++)
            {
                sum+=A[i];
            }
            cout<<endl;
            cout<<"Сумма равна:"<<sum<<endl;
        }
        if (nomin>nomax&&nomin!=nomax&&nomax!=nomin-1&&nomax!=nomin+1)
        {
            for (int i=nomax+1;i<nomin;i++)
            {
                sum+=A[i];
            }
            cout<<"Сумма равна:"<<sum<<endl;
        }
        if (nomax==nomin-1||nomax==nomin+1)
        {
            cout<<"Вычислить сумму невозможно! Максимальный и минимальный элементы стоят рядом!"<<endl;
        }
        if (nomin==nomax)
        {
            cout<<"Вычислить сумму невозможно! Максимальный и минимальный элементы совпадают!"<<endl;
        }
    system ("PAUSE");
    return 0;
}
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
27.09.2011, 21:20     В каждой строке матрицы переставить в обратном порядке элементы #11
Алён4uk, я думаю как-то так:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
int main( )
{
    srand( time(0) );
 
    int rows, columns;
 
    cout << "rows: ";
    cin >> rows;
    cout << "columns: ";
    cin >> columns;
 
    int * matrix = new int[ rows * columns ];
 
    // заполнение матрицы случайными числами
    for( int i = 0; i < rows * columns; i++ )
       matrix[i] = rand() % 200 - 100;
 
    // вывод матрицы
    for( int r = 0; r < rows; r++ )
    {
        for( int c = 0; c < columns; c++ )
            cout << setw(5) << matrix[ r * columns + c ];
 
        cout << '\n';
    }
 
    // --------------------- ИНТЕРЕСНАЯ ЧАСТЬ ------------------------
 
    // временный буфер
    int * temp = new int[ columns ];
 
    for( int r = 0; r < rows; r++ )
    {
        int i = 0;
        int max = 0;
        temp[0] = matrix[ r * columns ];
 
        // копирование последовательности от минимального элемента до последнего
        // во временный буфер
        for( int c = 0; c < columns; c++ )
        {
            if( matrix[ r * columns + c ] > temp[ 0 ] )
            {
                i = 0;
                max = c;
            }
 
            temp[ i ] = matrix[ r * columns + c ];
            i++;
        }
 
        // переписывание строки матрицы из временного буфера в обратном порядке
        // начиная с позиции минимального элемента
        for( int c = max; c < columns; c++, i-- )
            matrix[ r * columns + c ] = temp[ i - 1 ];
    }
 
    // --------------------- END ИНТЕРЕСНАЯ ЧАСТЬ --------------------
 
 
    // вывод матрицы
    cout << '\n';
 
    for( int r = 0; r < rows; r++ )
    {
        for( int c = 0; c < columns; c++ )
            cout << setw(5) << matrix[ r * columns + c ];
 
        cout << '\n';
    }
 
    delete [] temp;
    delete [] matrix;
 
    return 0;
}
Алён4uk
 Аватар для Алён4uk
12 / 12 / 3
Регистрация: 03.04.2011
Сообщений: 75
27.09.2011, 21:29  [ТС]     В каждой строке матрицы переставить в обратном порядке элементы #12
talis, Ух ты ж!)))) То что надо!)))) Спасибо, огроменное!))
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
27.09.2011, 21:31     В каждой строке матрицы переставить в обратном порядке элементы #13
Алён4uk, пожалуйста. Одна маленькая правка касательно красоты кода:

C++
1
2
3
4
5
6
 
        // переписывание строки матрицы из временного буфера в обратном порядке
        // начиная с позиции минимального элемента
        i--;
        for( int c = max; c < columns; c++, i-- )
            matrix[ r * columns + c ] = temp[ i ];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2011, 23:26     В каждой строке матрицы переставить в обратном порядке элементы
Еще ссылки по теме:

Переставить в обратном порядке элементы массива C++
Переставить элементы массива в обратном порядке C++
Переставить элементы массива в обратном порядке C++

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

Или воспользуйтесь поиском по форуму:
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
27.09.2011, 23:26     В каждой строке матрицы переставить в обратном порядке элементы #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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
#include <cstdlib>
#include <ctime>
 
int** input(int **mat, int size);
void output(int **mat, int size);
int pos_max_in_row(int **mat, int size, int num_row);
int ** rev_max_end(int **mat, int size);
int main()
{
    srand(time(NULL));
    int **matrix;
    int mat_size;
    std::cout<<"Enter size of matrix -> ";
    std::cin>>mat_size;
    matrix = new int*[mat_size];
    input(matrix,mat_size);
    std::cout<<"Matrix: \n";
    output(matrix,mat_size);
    std::cout<<"Result -> \n";
    rev_max_end(matrix,mat_size);
    output(matrix,mat_size);
    system("pause");
    return 0;
}
// input matrix
 
int** input(int **mat, int size)
{
     for(int i=0; i<size; i++)
     {
         mat[i] = new int[size];
          for(int j=0; j<size; j++)
          {
              mat[i][j]=rand()%90;
          }
     }
    return mat;
}
 
// output matrix
void output(int **mat, int size)
{
    for(int i=0; i<size; i++)
    {
        for(int j=0; j<size; j++)
        {
            std::cout<<mat[i][j]<<"  ";
        }
       std::cout<<"\n";
    }
}
// find max in row
 
int pos_max_in_row(int **mat, int size, int num_row)
{
    int max = mat[num_row][0];
    int pos_max = 0;
    for(int j=0; j<size; j++)
    {
        if(mat[num_row][j] > max)
        {
            max = mat[num_row][j];
            pos_max = j;
        }
    }
   return pos_max;
}
 
// rev_max_end
 
int** rev_max_end(int **mat, int size)
{
   int temp;
   for(int i=0; i<size; i++)
   {
         for(int j=pos_max_in_row(mat,size,i)+1,k=1; k<=(size-j)/2; j++,k++)
             {
                 temp = mat[i][j];
                 mat[i][j] = mat[i][size-k-1];
                 mat[i][size-k-1]=temp;
             }
  }
  return mat;
}
Yandex
Объявления
27.09.2011, 23:26     В каждой строке матрицы переставить в обратном порядке элементы
Ответ Создать тему
Опции темы

Текущее время: 13:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru