Проверить, является ли матрица "магическим квадратом" - 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 - для хранения пути к выходному файлу.
- Ввод размерности матрицы и создание динамического двумерного массива.
- Ввод значений матрицы.
- Запрос имени выходного файла.
- Открытие файла для записи результата.
- Вывод исходной матрицы на экран и в файл.
- Вычисление эталонной суммы и сравнение с ней.
- Проверка правильности матрицы по строкам и столбцам.
- Проверка правильности матрицы по диагоналям.
- Запись результата в файл.
- Закрытие файла.
- Освобождение памяти.
- Получение сигнала окончания работы программы.