Начиная с первого элемента и перемещаясь против часовой стрелки, вывести все элементы матрицы по спирали - C (СИ)
Формулировка задачи:
Дана квадратная матрица A порядка M (M — нечетное число). Начиная с первого элемента и перемещаясь против часовой стрелки, вывести все ее элементы по спирали: первый столбец, последняя строка, последний столбец в обратном порядке, первая строка в обратном порядке, оставшиеся элементы второго столбца и т. д.; последним выводится центральный элемент матрицы.(ПОМОГИТЕ СДЕЛАТЬ ЧЕРЕЗ ФУНКЦИЮ)
Код:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
void spiral(int *);
int main()
{
srand(time(NULL));
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printf("Введите размер массива (N нечетное число) N=");
int z = 0, k = 0, N;
int i = 0 ;
scanf("%d", &N);
while (N % 2 == 0)
{
printf ("Введено недопустимое значение N\n");
printf ("Пожалуйста введите N(НЕЧЕТНОЕ)=");
scanf("%d", &N);
}
int arr[N][N];
printf("Ваш массив:\n");
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
arr[i][j] = rand()%10+1;
printf("%3d", arr[i][j]);
}
printf("\n\n");
}
j = (-1);
while (N != 0)
{
j++;
i++;
printf("\n");
for(; i < N; i++)
{
if(k == 0)
{
printf("%d ", arr[0][0]);
k = N;
}
printf("%d ",arr [i][j]);
}
i--;
printf("\n");
for(j++; j < N; j++)
{
printf("%d ", arr[i][j]);
}
j--;
printf("\n");
for(i--; i >= z; i--)
{
printf("%d ", arr[i][j]);
}
z++;
i++;
printf("\n");
for(j--;j >= z; j--)
{
printf("%d ", arr[i][j]);
}
N--;
}
return 0;
}Решение задачи: «Начиная с первого элемента и перемещаясь против часовой стрелки, вывести все элементы матрицы по спирали»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
void spiral(int **mass,int q,int e);
int main()
{
srand(time(NULL));
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i = 0 ,j=0,q,e;
int **arr=NULL;
// Динамическое выделение памяти
printf("Введите размер массива:");
scanf("%d",&q);
arr=(int**) malloc(q*sizeof(int*));
if(arr==NULL){
puts("Ошибка выделения памяти");
return 0;
}
for(i=0;i<q;i++){
arr[i]=(int*) malloc(q*sizeof(int));
if(arr[i]==NULL){
puts("Ошибка выделения памяти");
for(i=0;i<q;i++)
free(arr[i]);
free(arr);
return 0;
}
}
// Заполнение/вывод
for(i = 0; i < q; i++)
{
for(j = 0; j < q; j++)
{
arr[i][j] = rand()%10+1;
printf("%3d", arr[i][j]);
}
printf("\n\n");
}
// Вызов функции
e=q;
spiral(arr, q, e);
//Освобождение выделенной памяти
for (j=0;j<q;j++)
free (arr[j]);
free (arr);
return 0;
}
void spiral(int **mass,int q,int e){
int z = 0, k = 0;
int i = 0 ,j=0,n,l,w;
i=j=w=l=q-1;
for(n=0;n<q*q;n++){
printf("%3d", mass[i][j]);
if ((i==(w))&&(j==l-1)) {w--;l--;z++;k++;puts("");} //Условие перехода
if ((j==w)&&(i>z)) {i--;continue;} //Вверх
if ((j>=0)&&(i==w)) {j++;continue;} //Вправо
if ((j==k)&&(i>=0)) {i++;continue;} //Вниз
if ((j<=w)&&(i==z)) {j--;continue;} //Влево
}
}
Объяснение кода листинга программы
В этом коде реализован алгоритм вывода элементов матрицы по спирали, начиная с первого элемента и перемещаясь против часовой стрелки. Список действий:
- Ввод размера матрицы с помощью функции scanf.
- Динамическое выделение памяти для матрицы с помощью функции malloc.
- Заполнение матрицы случайными числами от 1 до 10 с помощью функции rand.
- Вывод заполненной матрицы на экран.
- Вызов функции spiral, которая выводит элементы матрицы по спирали.
- Освобождение выделенной памяти с помощью функции free.
- Возврат в основную программу и завершение работы. В функции spiral происходит вывод элементов матрицы по спирали. Список действий в функции spiral:
- Установка начальных значений переменных z, k, i, j, n, l и w.
- Начало цикла, который выполняется q*q раз.
- Вывод элемента матрицы с помощью функции printf.
- Проверка условия для перехода на следующий элемент в спирали.
- Если условие выполняется, то переход к следующему элементу в спирали.
- Если цикл завершается, то возврат в основную программу.