Заполнение квадратной матрицы по спирали по часовой стрелке от центра

Я знаю, что решения задачи есть, но хотелось написать свой код. Суть: есть файл с квадратной матрицей нечетной размерности, надо написать код, который ее считывает и заполняет своими же значениями по спирали, а потом находит наибольший элемент. Это все на СИ, то есть без применения векторов. Функцию с нахождением наибольшего элемента пока не трогал, так как основная часть не работает. Программа компилируется, выводит на экран матрицу, которую считал из файла, но функция заполнения по спирали не работает. Скажите, в чем проблема?

#include <stdlib.h>
#define N 7

float spiral(double matrix[N][N]) {
    FILE* file2 = fopen("output.txt", "w");
    if (!file2)
        exit(EXIT_FAILURE);
    double M[N][N];
    size_t i, j;
    for (int k = 0; k < N / 2; k++) {
    //while (k < N / 2) {
        for (j = N / 2 - k; i = N / 2 + k; j < N / 2 + k && j++) 
            M[i][j] = matrix[i][j];
        for (i = N / 2 + k; i > N / 2 - k; i--) 
            M[i][j] = matrix[i][j];
        for (j = N / 2 + k; j > N / 2 - k; j--) 
            M[i][j] = matrix[i][j];
        for (i = N / 2 - k; i < N / 2 + k; i++) 
            M[i][j] = matrix[i][j];
        printf("%lf ", M[i][j]);
        fprintf(file2, "%lf ", M[i][j]);
    }
    fclose(file2);

double main(int argc, char** argv) {
    double matrix1[N][N];
    size_t i, j;
    FILE* file = fopen("input.txt", "r");
    if (!file)
        exit(EXIT_FAILURE);
    for (i = 0; i < N && !feof(file); i++) {
        for (j = 0; j < N && !feof(file); j++) {
            fscanf(file, "%lf", &matrix1[i][j]);
            printf("%lf ", matrix1[i][j]);
        }
        putchar('\n');
    }
    fclose(file);
    return spiral(matrix1);
    return (EXIT_SUCCESS);
} 

Ответы (1 шт):

Автор решения: rotabor

Ну хочется поделиться своим решением, правда, на c#:

using System;
class Program{
    static void Main(){
        string of, bl;
        int N, root, rows, columns, zR, zC, dR = 0, dC = 1;
        Console.Write("Enter a natural number: ");
        while (!int.TryParse(Console.ReadLine(), out N) | N < 1) {
            Console.WriteLine("Not a natural number");
        }
        { int i = N.ToString().Length + 1;
            of = "{0," + i + "}";
            bl = new String(' ', i); }
        rows = columns = root = (int)Math.Sqrt(N);
        if (N > root * root) columns++; zC = (columns - 1) / 2;
        if (N > root * root + root) rows++; zR = (rows - 1) / 2;
        var sp = new int[rows, columns];
        for (int i = 1, k = 1, l = 0; i <= N; i++) {
            sp[zR, zC] = i; zR += dR; zC += dC; l++;
            if (l == k){
                if (dC == 0) {k++; dC = 0 - dR; dR = 0;}
                else {dR = dC; dC = 0;}
                l = 0;
            }
        }
        // вывод результата
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) 
                if (sp[i, j] == 0) Console.Write(bl); else Console.Write(of, sp[i, j]);
            Console.WriteLine();
        }
        Console.ReadLine();
    }
}

-->

Enter a natural number: 100
  73  74  75  76  77  78  79  80  81  82
  72  43  44  45  46  47  48  49  50  83
  71  42  21  22  23  24  25  26  51  84
  70  41  20   7   8   9  10  27  52  85
  69  40  19   6   1   2  11  28  53  86
  68  39  18   5   4   3  12  29  54  87
  67  38  17  16  15  14  13  30  55  88
  66  37  36  35  34  33  32  31  56  89
  65  64  63  62  61  60  59  58  57  90
 100  99  98  97  96  95  94  93  92  91

Однопроходный алгоритм с минимальным количеством условных операторов.

→ Ссылка