Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 12.01.2023
Сообщений: 41

Отразить элементы матрицы по горизонтали с помощью указателей

16.01.2025, 10:10. Показов 3919. Ответов 46

Студворк — интернет-сервис помощи студентам
Срочность высокая.

Задача: отразить элементы матрицы по горизонтали, использую указатели двух уровней: на строки матрицы и на элементы строк матрицы.

Проблема: оно не отражает код, хотя по идее я должен был поменять местами значения.

Входные данные:
4
1 2 3 4
1 2 3 4
4 5 6
4
4 5 6 4

Правильные выходные данные:
4 5 6 4
4 5 6 4
1 2 3 4
1 2 3 4

Мои выходные данные:
1 2 3 4
1 2 3 4
4 5 6 4
4 5 6 4

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
#include <stdio.h>
 
void scan_matrix(int* b, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            scanf("%d", b + i * n + j);
    }
};
 
 
void print_matrix(int* b, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%d ", *(b + i * n + j));
        printf("\n");
    }
};
 
int main()
{
    int n;
    scanf("%d", &n);
    int arr[n][n] = {0};
    scan_matrix(&arr[0][0], n);
    for (int i = 0; i < n; i++)
    {
        int (*b) [n] = &arr[i];
        int (*p) [n] = &arr[n - i - 1];
        for (int j = 0; j < n; j++)
        {
            int* d = b[0];
            int* q = p[0];
            *(d) += *(q);
            *(q) = *(d) - *(q);
            *(d) -= *(q);
        }
    }
    printf("\n");
    print_matrix(&arr[0][0], n);
    return 0;
}
Добавлено через 3 минуты
P. s.: У меня компилятор GCC (GNU Compiler Collection), так, что у меня код компилируется и работает, хоть и не должен, чем я без зазрения совести пользуюсь.

Добавлено через 3 минуты
P. p. s.: глас за мылился, ошибку не вижу.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.01.2025, 10:10
Ответы с готовыми решениями:

Отразить строки матрицы по горизонтали
Дан динамический массив, отразить в нем строки по горизонтали. Пример: 1 2 3 4 5 6 7 8 полученный массив: 5 6 7 8 ...

Зеркально отразить элементы матрицы элементы относительно горизонтальной оси
Дана квадратная матрица порядка 2n+1 . Зеркально отразить ее элементы относительно горизонтальной оси симметрии матрицы на языке С++ ...

Зеркально отразить элементы матрицы относительно вертикальной оси симметрии матрицы
Здравствуйте! Помогите написать программу на Java с двумерными массивами. Дана матрица размера M × N. Зеркально отразить ее элементы...

46
Злостный нарушитель
 Аватар для Verevkin
10886 / 5822 / 1288
Регистрация: 12.03.2015
Сообщений: 26,882
16.01.2025, 12:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Reshaju zadachi Посмотреть сообщение
Да, поменять строки местами, как указано в моём сообщении выше.
Вот так?



Ключевая функция:
C++
1
2
3
4
5
6
7
8
// отражение строк матрицы по вертикали
int** reflect_rows(int** matrix, size_t rows)
{
  assert(matrix && rows);
  int **up_ptr = matrix, **dn_ptr = up_ptr + rows - 1;
  while (up_ptr < dn_ptr) swap(*up_ptr++, *dn_ptr--);
  return matrix;
}
1
 Аватар для Annemesski
2691 / 1348 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
16.01.2025, 12:52
Reshaju zadachi, можно совсем в указатели переписать

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
#include <iostream>
 
int main()
{
    int n = 0;
    std::cin >> n;
 
    int **arr = new int*[n];
    for (int *row = arr; row < arr + n; ++row) {
        *row = new int[n];
        for (int *el = *row; el < *row + n; ++el) {
            std::cin >> *el;
        }
    }
 
    int *beg = arr;
    int *end = arr + n;
    while (beg < end) {
        int *tmp = beg;
        beg = --end;
        end = tmp;
        ++beg;
    }
 
    for (int *row = arr; row < arr + n; ++row) {
        for (int *el = *row; el < *row + n; ++el) {
            std::cout << *el << " ";
        }
        std::cout << std::endl;
        delete row;
    }
 
    delete arr;
 
    return 0;
}
1
1 / 1 / 0
Регистрация: 12.01.2023
Сообщений: 41
16.01.2025, 13:01  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Вот так?
Да, результат верный, на счёт кода, вроде тоже. А можете дать пример параметров функции, а то в "вашем c++" (это не мой любимый язык) сложный синтаксис и по разному записываются тип данных в параметрах функции в определении функции и при вызове функции.

Всм, например
C++
1
print_matrix(&arr[0][0], n);
C++
1
void print_matrix(int* b, int n)
0
Злостный нарушитель
 Аватар для Verevkin
10886 / 5822 / 1288
Регистрация: 12.03.2015
Сообщений: 26,882
16.01.2025, 13:03
Цитата Сообщение от Reshaju zadachi Посмотреть сообщение
это не мой любимый язык
Я ваще в С++ не шарю. 25 лет на Delphi работаю.
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <ctime>
#include <cassert>
 
using namespace std;
 
/* Пример преобразования:
    Входные данные:
    1 2 3 4
    1 2 3 4
    4 5 6 4
    4 5 6 4
    
    Правильные выходные данные:
    4 5 6 4
    4 5 6 4
    1 2 3 4
    1 2 3 4 */
 
// магические вычисления :)))
inline size_t dec_width(size_t x)
{
  size_t w = 1;
  while (x /= 10) w++;
  return w;
}
 
// создание матрицы и заполнение её случайными числами
int** new_matrix(size_t rows, size_t cols)
{
  int** x = new int*[rows];
  for (int row = 0; row != rows; row++)
  {
    x[row] = new int[cols];
    for (auto col = 0; col != cols; col++)
      x[row][col] = rand() % 2000;
  }
  return x;
}
 
// удаление матрицы
void free_matrix(int** src, size_t rows)
{
  for (int row = 0; row != rows; row++) delete []src[row];
  delete []src;
}
 
// вывод матрицы в консоль
void print_matrix(int** src, size_t rows, size_t cols, const char* header)
{
  unsigned *widths = new unsigned[cols];
  for (int col = 0; col != cols; col++)
  {
    widths[col] = 1;
    for (int row = 0; row != rows; row++)
    {
      size_t cw = dec_width(src[row][col]);
      if (cw > widths[col]) widths[col] = cw;
    }
  }
 
  printf("\n%s [%lu x %lu]:\n", header, rows, cols);
  for (int row = 0; row != rows; row++)
  {
    for (int col = 0; col != cols; col++) printf(" %*d", widths[col], src[row][col]);
    printf("\n");
  }
 
  delete []widths;
}
 
// отражение строк матрицы по вертикали
int** reflect_rows(int** matrix, size_t rows)
{
  assert(matrix && rows);
  int **up_ptr = matrix, **dn_ptr = up_ptr + rows - 1;
  while (up_ptr < dn_ptr) swap(*up_ptr++, *dn_ptr--);
  return matrix;
}
 
#define DEFAULT_ROWS 4
#define DEFAULT_COLS 5
#define USER_INPUT
 
int main()
{
  srand(time(0));
  unsigned rows = DEFAULT_ROWS, cols = DEFAULT_COLS;
  
  // ввод размеров вручную
  #ifdef USER_INPUT
  cout << "? Rows and Cols: ";
  cin >> rows >> cols;
  
  if (!cin.good()) return -1; // обшыбка ввода 
  if (!rows || !cols) return -2; // недопустимые размеры
  #endif
 
  int **x = new_matrix(rows, cols);
  
  print_matrix(x, rows, cols, "# source matrix");
  print_matrix(reflect_rows(x, rows), rows, cols, "# dest matrix");
  
  free_matrix(x, rows);
  
  return 0;
}
1
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2025, 13:07
Цитата Сообщение от Reshaju zadachi Посмотреть сообщение
В моей версии, d и p -- массивы, а в вашей -- указатели
Ну и? как надо-то?
Я никак не могу понять
Напиши какие типы устроят - под ответ подгоним решение.
0
1 / 1 / 0
Регистрация: 12.01.2023
Сообщений: 41
16.01.2025, 13:14  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Ну и? как надо-то?
Пока, что я вставил в твою версию, работает нормально, выглядит убедительно. Всё остальное я уточню у препода, но напишу, скорее всего уже завтра, т. к. я пойду сдавать часам к шести по нашему.
0
1 / 1 / 0
Регистрация: 12.01.2023
Сообщений: 41
16.01.2025, 21:49  [ТС]
Карочь, вроде всё (все варианты) подходит. Большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.01.2025, 21:49

Зеркально отразить элементы матрицы относительно горизонтальной оси симметрии матрицы
Здравствуйте! Помогите написать 3 программмы на C++ на задачи с двумерными массивами 3. Дана матрица размера M x N. Зеркально...

Отразить элементы квадратной матрицы порядка М относительно горизонтальной оси симметрии матрицы
кто знает. как сделать!!! Отразить элементы квадратной матрицы порядка М относительно горизонтальной оси симметрии матрицы.

Отразить FontAwesome по горизонтали
1. Что есть 2. Что должно получиться Пробовал вращать через transform: rotate но не знаю какой градус задать, чтобы отразило по...

Bitmap отразить по горизонтали
Bitmap giv1=BitmapFactory.decodeResource(getContext().getResources(),R.drawable.sobaka); ???

Отразить картинку по горизонтали
Перерыл весь инет, но так и не нашел php-кода или js которые бы отражали картинку по горизонтали и записывали бы в файл. Может у кого...


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru