Проверить, является ли матрица "магическим квадратом" - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток Не могу доработать программу с использованием динамических переменных Программа проверяет является ли матрица "магическим квадратом", то есть сумма чисел во всех её строках, столбцах и диагоналях одинакова. Вот сам листинг программы:
#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();
 
}
Программа "ругается" на A=(int**)malloc(sizeof (int)** N); и ничего не могу понять, или надо просто создать массив динамический и затем освободить ненужную память???

Решение задачи: «Проверить, является ли матрица "магическим квадратом"»

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();
 
}

Объяснение кода листинга программы

  1. Объявление переменных:
    • i, j, n - для обхода матрицы и ввода/вывода;
    • Etalon, sum - для вычисления эталонной суммы;
    • Flag - для контроля правильности матрицы;
    • OutputFile - для записи результата в файл;
    • path_out - для хранения пути к выходному файлу.
  2. Ввод размерности матрицы и создание динамического двумерного массива.
  3. Ввод значений матрицы.
  4. Запрос имени выходного файла.
  5. Открытие файла для записи результата.
  6. Вывод исходной матрицы на экран и в файл.
  7. Вычисление эталонной суммы и сравнение с ней.
  8. Проверка правильности матрицы по строкам и столбцам.
  9. Проверка правильности матрицы по диагоналям.
  10. Запись результата в файл.
  11. Закрытие файла.
  12. Освобождение памяти.
  13. Получение сигнала окончания работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы