Информатика, вопрос задал Aillianna , 7 лет назад

На языке программирования С !
Задача 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...nn");

   ShowMatrix(mx,col,row);

   DestroyMatrix(mx,col);

   delete row;

   delete col;

   system("pause");

}

Ответил Aillianna
0
#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
0
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
0
такой итоговый вариант вышел у меня. Но я посредник, так что все равно не знаю как было надо
Ответил Aillianna
0
в любом случае большое спасибо.
Ответил Aillianna
0
Если не против, могли бы еще задачки посмотреть. Я добавила
Новые вопросы