Мы знаем, что инвариант - это выражение, истинное до, на каждой итерации и после цикла. Таким образом, мы должны выяснить все инварианты следующего кода спирального обхода квадратной матрицы, начиная с ее центра.
Цикл для исследования:
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
}
Вывод программы и внутренней структуры: изображение здесь
Я показал учителям свои идеи - инварианты:
- я
- h
- v
Учитель сказал мне, что это не инварианты. Это должно быть выражение, содержащее iInd
и jInd
.