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

На языке программирования С !
Задача 1
Программа должна удовлетворять следующим требованиям:
1. массивы могут генерироваться автоматически, если в задаче не оговорено иное. Оставшиеся исходные данные должны вводиться с клавиатуры по запросу.
2. необходимо работать только через указатели и функции.
3. все значения функций должны быть перенаправлены в качестве параметров.
4. на экране должны храниться как исходные данные так и результат.

Само задание
Напишите функцию, которая в квадратной матрице сдвигает крайние элементы по кольцу, то есть первая строка заменяет последний столбец, последний столбец-последней строкой, последняя строка-первым столбцом, а первый столбец-первой строкой.

Есть еще задания, если хорошо разбираетесь
Качественный ответ обязательно отмечу лучшим. Могу дублировать задания если нужно больше баллов

Ответы

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

Не совсем понял всех условий, например "все значения функций должны быть перенаправлены в качестве параметров", по этому если это условие не выполнено - объясни мне что это такое и я переделаю.

Не делал итераторы цикла динамическими ибо это не имеет смысла, остальные переменные я использовал как указатели.

Тестировал на GNU GCC, всё работает, писал на чистой Си.

Мой вариант решения:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

//Создание нашей матрицы

int** NewMatrix(int *row, int* col)

{

   int** matrix = new int*[*col];

   for(int i = 0; i < *col; ++i)

   {

       matrix[i] = new int[*row];

   }

   return matrix;

}

//удаление матрицы

void DestroyMatrix(int **matrix, int *col)

{

   for(int i = 0; i < *col; ++i)

   {

       delete[]matrix[i];

   }

   delete[]matrix;

}

//заполнение матрицы случайными числами

int ** Random(int**matrix, int* col, int *row)

{

   srand(time(0));

   for(int i = 0; i < *col; ++i)

   {

       for(int j = 0; j < *row; ++j)

       {

           matrix[i][j] = rand()%10;

       }

   }

   return matrix;

}

//вывести матрицу на экран

void ShowMatrix(int**matrix, int* col, int *row)

{

   for(int i = 0; i < *col; ++i)

   {

       for(int j = 0; j < *row; ++j)

       {

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

       }

       printf("\n");

   }

}

//функция сдвигает крайние элементы по кольцу

int **Roll(int**matrix, int *col, int *row)

{

   int **mx = NewMatrix(row,col);

   //копирование элементов с верхней строки в последний столб

   for(int i = 0; i < *col; ++i)

   {

       mx[i][*col-1] = matrix[0][i];

   }

   //копирование последнего столба в последнюю строку

   for(int i = 0, j = *col-1; i < *col; ++i,j--)

   {

       mx[*col-1][i] = matrix[j][*col-1];

   }

   //копирование последней строки в первый столб

   for(int i = 0; i < *col; ++i)

   {

       mx[i][0] = matrix[*col-1][i];

   }

   //копирование первого столба в первую строку

   for(int i = 0, j = *col-1; i < *col; ++i,j--)

   {

       mx[0][i] = matrix[j][0];

   }

   //копирование остальных элементов в середине матрицы

   for(int i = 1; i < *col-1; ++i)

   {

       for(int j = 1; j < *row-1; ++j)

       {

           mx[i][j]=matrix[i][j];

       }

   }

   //удаление лишней матрицы

   DestroyMatrix(matrix,col);

   return mx;

}

int main()

{

   int *row = new int(5);

   int *col = new int(5);

   int **mx = NewMatrix(row,col);

   mx = Random(mx,col,row);

   ShowMatrix(mx,col,row);

   mx = Roll(mx,col,row);

   printf("\nRolling...\n\n");

   ShowMatrix(mx,col,row);

   DestroyMatrix(mx,col);

   delete row;

   delete col;

   system("pause");

}


Aillianna: спасибо. хотя я мало что поняла из написаного а много считаю или лишним или не понятным
Slavque: учитывая то, что в условиях стояло условие "работать только с функциями", то ничего лишнего тут нет, создание матрицы, её инициализация, вывод на экран и оборот. В комментариях я более подробно описал (которые в коде)
Slavque: не понятность я пытался компенсировать комментариями, видимо не получилось
Slavque: единственное что лишнее так это создание новой матрицы в функции Roll, там вместо новой матрицы можно использовать обычный массив, но для вас наверное было бы вообще не понятно, что происходит, пример с новой матрицей немного легче на мой взгляд.
Aillianna: мне сложнее всего было понять с указателями.
Aillianna: #include "stdlib.h"
#include "stdio.h"

void PrintMatrix(int** matrix, int rank) {
for (int i = 0; i < rank; i++) {
for (int j = 0; j < rank; j++)
printf(" %2d", matrix[i][j]);
printf("\n");
}
printf("\n");
}

void DoTurn(int** matrix, int rank) {
for (int i = 0; i < rank - 1; i++) {
int temp = matrix[0][i];
matrix[0][i] = matrix[rank - i - 1][0];
matrix[rank - i - 1][0] = matrix[rank - 1][rank - i - 1];
matrix[rank - 1][rank - i - 1] = matrix[i][rank - 1];
matrix[i][rank - 1] = temp;
}
}
Aillianna: int main() {
int rank;
int **m;
printf("rank = ");
scanf("%i", &rank);

m = (int**) malloc(rank * (sizeof *m));
for (int i = 0; i < rank; i++) {
m[i] = (int*) malloc(rank * sizeof *m[i]);

for (int j = 0; j < rank; j++)
m[i][j] = 10 * (i + 1) + j;
}

PrintMatrix(m, rank);
DoTurn(m, rank);
PrintMatrix(m, rank);

for (int i = 0; i < rank; i++) {
free(m[i]);
}
free(m);
return 0;
}
Aillianna: такой итоговый вариант вышел у меня. Но я посредник, так что все равно не знаю как было надо
Aillianna: в любом случае большое спасибо.
Aillianna: Если не против, могли бы еще задачки посмотреть. Я добавила
Похожие вопросы
Предмет: Алгебра, автор: niktohaph