Проверить, является ли матрица "магическим квадратом" - C (СИ)
Формулировка задачи:
Доброго времени суток Не могу доработать программу с использованием динамических переменных Программа проверяет является ли матрица "магическим квадратом", то есть сумма чисел во всех её строках, столбцах и диагоналях одинакова.
Вот сам листинг программы:
Программа "ругается" на A=(int**)malloc(sizeof (int)** N); и ничего не могу понять, или надо просто создать массив динамический и затем освободить ненужную память???
#include <conio.h> #include <iostream> int A[20][20]; int i, j, N; int Standard, S; int Flag; void InputOutput() { printf("Enter dimension of a square matrix: "); scanf("%i",&N); for (i=0;i<N;i++) for (j=0;j<N;j++) { printf("A[%i][%i]=",i+1,j+1); scanf("%i",&A[i][j]); } printf("Initial matrix: \n"); for (i=0;i<N;i++) { for (j=0;j<N;j++) printf("%5i",A[i][j]); printf("\n"); } } void MagicOrNot(int*Flag) { Standard=0; for (i=0;i<N;i++) Standard+=A[i][i]; *Flag=1; i = 0; while ((i<N)&&*Flag) { S=0; for (j=0;j<N;j++) S+=A[i][j]; if (S!=Standard) *Flag=0; else i++; } j = 0; while ((j<N)&&*Flag) { S=0; for (i=0; i<N; i++) S += A[i][j]; if (S!=Standard) *Flag = 0; else j++; } if (*Flag) { S=0; for (i=0; i<N; i++) S+=A[i][N-i-1]; if (S!=Standard) *Flag=0; } } void main() { InputOutput(); MagicOrNot(&Flag); if (Flag) printf("This matrix is a magic square\n"); else printf("This matrix is not a magic square\n"); getch(); }
Решение задачи: «Проверить, является ли матрица "магическим квадратом"»
textual
Листинг программы
#include <conio.h> #include <stdio.h> #include <malloc.h> #include <stdlib.h> void main() { int i,j,n; int Etalon,sum; int Flag; FILE *OutputFile; char path_out[25]; printf("Enter dimension of a square matrix: "); //ввод размерности scanf("%i",&n); //динамически создаем двумерный массив int **mas=new int*[n]; for (i=0;i<n;i++) mas[i]=new int[n]; for (i=0;i<n;i++) //вводим его for (j=0;j<n;j++) { printf("mas[%i][%i]=",i+1,j+1); scanf("%i",&mas[i][j]); } printf("Enter output file for result: "); //запрос имени выходного файла scanf("%s",path_out); OutputFile=fopen(path_out,"w+"); //созжание и открытия файла для записи результата printf("Initial matrix: \n"); //вывод исходной матрицы на экран и в файл for (i=0;i<n;i++) { for (j=0;j<n;j++) { printf("%5i",mas[i][j]); fprintf(OutputFile,"%4d",mas[i][j],"\n"); } printf("\n"); } //нахождение эталонной суммы и сравнение с ней Etalon=0; for (i=0;i<n;i++) Etalon+=mas[i][i]; Flag=1; i = 0; while ((i<n)&&Flag) { sum=0; for (j=0;j<n;j++) sum+=mas[i][j]; if (sum!=Etalon) Flag=0; else i++; } j = 0; while ((j<n)&&Flag) { sum=0; for (i=0; i<n; i++) sum += mas[i][j]; if (sum!=Etalon) Flag = 0; else j++; } if (Flag) { sum=0; for (i=0; i<n; i++) sum+=mas[i][n-i-1]; if (sum!=Etalon) Flag=0; } if (Flag) //если да { printf("This matrix is a magic square\n"); fprintf(OutputFile,"\nThis matrix is a magic square"); } else //если нет { printf("This matrix is not a magic square\n"); fprintf(OutputFile,"\nThis matrix is not a magic square"); } fclose(OutputFile); for(i = 0;i<n;i++) delete[] mas[i]; delete[] mas; getch(); }
Объяснение кода листинга программы
- Объявление переменных:
- i, j, n - для обхода матрицы и ввода/вывода;
- Etalon, sum - для вычисления эталонной суммы;
- Flag - для контроля правильности матрицы;
- OutputFile - для записи результата в файл;
- path_out - для хранения пути к выходному файлу.
- Ввод размерности матрицы и создание динамического двумерного массива.
- Ввод значений матрицы.
- Запрос имени выходного файла.
- Открытие файла для записи результата.
- Вывод исходной матрицы на экран и в файл.
- Вычисление эталонной суммы и сравнение с ней.
- Проверка правильности матрицы по строкам и столбцам.
- Проверка правильности матрицы по диагоналям.
- Запись результата в файл.
- Закрытие файла.
- Освобождение памяти.
- Получение сигнала окончания работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д