Как найти петлевой инвариант спирального обхода квадратной матрицы, начиная с центра - PullRequest
1 голос
/ 03 ноября 2019

Мы знаем, что инвариант - это выражение, истинное до, на каждой итерации и после цикла. Таким образом, мы должны выяснить все инварианты следующего кода спирального обхода квадратной матрицы, начиная с ее центра.

Цикл для исследования:

int iInd = N / 2;
int jInd = N / 2;
int iStep = 1;
int jStep = 1;

printf("%d ", A[iInd][jInd]);
for (int i = 0; i < N; i++) {
    for (int h = 0; h < i; h++)
        printf("%d ", A[iInd][jInd += jStep]);
        for (int v = 0; v < i; v++)
            printf("%d ", A[iInd += iStep][jInd]);
        jStep = -jStep;
        iStep = -iStep;
}
for (int h = 0; h < N - 1; h++)
    printf("%d ", A[iInd][jInd += jStep]);

Вся программа C++:

#include <stdio.h>
#define N 13

void main() {
    int A[N][N];

    for (int i = 0; i<N; i++)
        for (int j = 0; j<N; j++)
            A[i][j] = i * 13 + j; //simple filling of matrix

    int iInd = N / 2;
    int jInd = N / 2;

    int iStep = 1;
    int jStep = 1;


    printf("%d ", A[iInd][jInd]); //the starting of spiral printing
    for (int i = 0; i < N; i++) {
        for (int h = 0; h < i; h++)
            printf("%d ", A[iInd][jInd += jStep]);
        for (int v = 0; v < i; v++)
            printf("%d ", A[iInd += iStep][jInd]);
        jStep = -jStep;
        iStep = -iStep;
    }
    for (int h = 0; h < N - 1; h++)
        printf("%d ", A[iInd][jInd += jStep]);
    //the ending of spiral printing
}

Вывод программы и внутренней структуры: изображение здесь

Я показал учителям свои идеи - инварианты:

  1. я
  2. h
  3. v

Учитель сказал мне, что это не инварианты. Это должно быть выражение, содержащее iInd и jInd.

...