Предмет: Информатика, автор: Loha64

ДАЮ 40 БАЛОВ.
Срочно нужна помощь. С++

Мне нужно превратить (int mat[n][m]) в указатель так чтобі это работало((


#include

#include

#include

#include

#include

using namespace std;

int main()


{


setlocale(LC_ALL, "Ukr");


const int n = 3, m = 3;


printf("Кiлькiсть рядкiв матрицi = ");


scanf_s("%d", &n);


printf("Кiлькiсть стовпцiв матрицi = ");


scanf_s("%d", &m);


int mat[n][m];


srand(time(NULL));


printf("Була:\n ");


for (int i = 0; i < n; i++)


for (int j = 0; j < m; j++)


mat[i][j] = rand() % 21 - 10;


for (int i = 0; i < n; i++)


{


for (int j = 0; j < m; j++)


printf("%d ", mat[i][j]);


printf("\n");


}


printf("Cтала:\n ");


for (int i = 0; i < n; i++)


{


int* temp = new int[n];


temp[i] = mat[n - 1][i];


mat[n - 1][i] = mat[i][0];


mat[i][0] = temp[i];


}


for (int i = 0; i < n; i++)


{


for (int j = 0; j < m; j++)


printf("%d ", mat[i][j]);


printf("\n");


}


return 0;


}

Ответы

Автор ответа: maxpavlutenkof
0

Так работать оно никак не будет по 2 причинам

for (int i = 0; i < n; i++)

{

....int* temp = new int[n];

....temp[i] = mat[n - 1][i];

....mat[n - 1][i] = mat[i][0];

....mat[i][0] = temp[i];

}

1. у тебя mat[n][m], а ты пытаешься че-то там обратиться к mat[n - 1][i], а i бегает по n. Ты не написал че должна делать прога, потому сам приведи индексы в чувство.

2. ты зачем то создаёшь новый масив temp, не очищаешь память, но ладно это, так ты создаёшь его для хранения 1 значения. mat[x][y] в данном случае вернёт просто int, потому и делай int temp = mat[x][y] или если так нужен указатель, то int* temp =&mat[x][y] , а ещё лучше почитай про std::swap (как я понял, это надо чтоб поменять местами значения 2 элементов)

Автор ответа: alexlar30
1

Ответ:

Объяснение:

С использованием арифметики указателей будет так на чистом С:

В программе, я так понимаю, требовалось поменять 1-ю и последнюю строку в матрице?

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

#include <locale>

#include <new> //для new

using namespace std;

int main()

{

setlocale(LC_ALL, "Ukr");

int n = 3, m = 3;

printf("Кiлькiсть рядкiв матрицi = ");

scanf_s("%d", &n);

printf("Кiлькiсть стовпцiв матрицi = ");

scanf_s("%d", &m);

 

int** mat;

// Динамічне виділення пам'яті в кучі для матриці

// за допомогою malloc() в стилі С або

// за допомогою new в С++

mat = (int**)malloc(sizeof(int*) * n);

for (int i = 0; i < n; ++i)

 *(mat + i) = (int*)malloc(sizeof(int) * m);

srand(time(NULL));

printf("Була:\n");

for (int i = 0; i < n; i++)

 for (int j = 0; j < m; j++)

  *(*(mat + i) + j) = (int) rand() % 21 - 10;

for (int i = 0; i < n; i++)

{

 for (int j = 0; j < m; j++)

  printf("%5d", *(*(mat + i) + j));

 printf("\n");

}

// Переставити 1-й та останній рядок

printf("Cтала:\n");

int* temp = *mat;

*mat = *(mat + n - 1);

*(mat + n - 1) = temp;  

 

for (int i = 0; i < n; i++)

{

 for (int j = 0; j < m; j++)

  printf("%5d", *(*(mat + i) + j));

 printf("\n");

}

// Звільнення пам'яті з кучі (якщо було new, то delete)

for (int i = 0; i < n; ++i)

 free(*(mat + i));

free(mat);

 

return 0;

}


Loha64: Реализовать программу, которая меняет местами последнюю строку и первый столбец квадратной матрицы.
maxpavlutenkof: Так значит матрица квадратная? В таком случае можешь запустить цикл с 2 счеткиками и просто так же свапать значения.
maxpavlutenkof: for (... ; i < n;...)std::swap(mat[i][0], mat[0][i])
maxpavlutenkof: Если матрица не квадратная, то i < n меняешь на что-то типа i < min(n, m)
maxpavlutenkof: *про 2 счётчика оговорился, не бери в голову
Loha64: Я что запутался можете навести в коде, плизз?)
alexlar30: Так в моем коде написано, как поменять местами строки через указатели. Просто нужно переставить указатели с первой строки на последнюю, и, наоборот, с помощью вспомогательного указателя temp.
alexlar30: Там, кстати, если препод не требует явную арифметику указателей, то вместо двойного разыменования типа *(*(mat +i)+j) можно написать двойные квадратные скобки mat[і][j]. Но, если хочет все через указатели, то разыменовывать надо через звезды.
maxpavlutenkof: если тебе нужно поменять строчки, тогда можно свапнуть указатель, но тут нужно строку и столбец, потому нужно циклом. И кста, двумерный доступ через квадратные скобки в стандарте прописан, потому не надо выпендриваться и писать 3-этажные неявные выражения
alexlar30: Та, да есть квадратные скобки и все ими пользуются, но эти двухэтажные разыменования любимый вопрос на экзаменах по указателям. О перестановке строк вроде шёл вопрос. О перестановке столбцов - да, нужен цикл. Но об этом вчера не спрашивали. Сегодня уже столбцы переставляете? Аккуратно пройдитесь в цикле по количеству строк и переставьте элементы.
Похожие вопросы
Предмет: Русский язык, автор: маргаритка200340
Предмет: Русский язык, автор: Аноним