Добавить динамическое выделение памяти в программе - C (СИ)

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

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

В этой программе нужно предусмотреть динамичное выделение памяти:
#include <stdio.h>
#include <stdlib.h>
 
#define M 6
#define N 5
 
int Matr[M][N];
 
/* Проверка, является ли n числом Фибоначчи */
 
int isFib(int n)
{
    int c=1, p=1,q;
    while (1)
    {
    if (c==n) return 1;
    if (c > n) return 0;
    q=c;
    c=c+p;
    p=q;
    }
}
 
int isMark(int k)
{
    int i, c=0;
    for (i=0; i<M; i++)
    if (isFib(Matr[i][k])) c++;
        return (c > (M/2));
}
 
int main (int argc, char *argv[])
{
    int i,j,p=0,max;
    
    /* ввод матрицы */
    
    for (i=0; i<M; i++)
    {
    for (j=0; j<N; j++)
    {
       printf ("M[%d,%d]=",i,j);
       scanf ("%d",&Matr[i] [j]);
       }
       printf("\n");
       }
       
       /* Поиск максимума в отмеченных */
       
       for (j=0; j<N; j++)
       if (isMark(j))
       {
       if (p==0) max=Matr[0][j];
       for (i=0; i<M; i++)
       if (Matr[i][j] > max) max=Matr[i][j];
       p=1;
       }
       
       /* Вывод результата */
       
       printf("max=%d\n",max);
       
       system("PAUSE");
       return 0;
       }

Решение задачи: «Добавить динамическое выделение памяти в программе»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
int M,N; 
int *Matr;
 
/* Проверка, является ли n числом Фибоначчи */
 
int isFib(int n)
{
  int c=1, p=1,q;
  while (1)
    {
      if (c==n) return 1;
      if (c > n) return 0;
      q=c;
      c=c+p;
      p=q;
    }
}
 
int isMark(int k)
{
    int i,q,c=0;
    for (i=0; i<M; i++)
    { 
      q=index(i,k); 
      if (isFib(Matr[q])) c++;
    }  
    return (c > (M/2));
}
 
int index(int i, int j)
{
    return i*M+j;
} 
 
int main (int argc, char *argv[])
{
    int Sz,q,f;
    int i,j,p=0,max;
    
    /* Создание матрицы */
  
    printf("M=");
    scanf("%d",&M);
      
    printf("N=");
    scanf("%d",&N);
    
    Sz=M*N;
    
    Matr=(int *) calloc(Sz,sizeof(int));
        
    /* ввод матрицы */
    
    for (i=0; i<M; i++)
    {
       for (j=0; j<N; j++)
       {
         printf ("M[%d,%d]=",i,j);
         scanf ("%d",&q);
         Matr[index(i,j)]=q;
       }
       printf("\n");
    }
       
    /* Поиск максимума в отмеченных */
       
    f=0;
       
    for (j=0; j<N; j++)
       if (isMark(j))
       {
          f=1;           
          if (p==0) max=Matr[index(0,j)];
          for (i=0; i<M; i++)
              if (Matr[index(i,j)] > max) max=Matr[index(i,j)];
          p=1;
       }
       
    /* Вывод результата */
       
    if (f==0)
       printf("No such columns\n");
    else   
       printf("max=%d\n",max);
       
    free(Matr);
       
    system("PAUSE");
    return 0;
    
}

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

  1. Объявление переменных:
    • M, N - переменные для ввода размеров матрицы
    • Sz - переменная для хранения размера матрицы (произведение M и N)
    • Matr - указатель на память, выделенную для матрицы
    • i, j, p, q, f, max - переменные для выполнения различных операций
  2. Функция isFib - проверяет, является ли число n числом Фибоначчи
  3. Функция isMark - проверяет, есть ли в колонке k число, являющееся числом Фибоначчи
  4. Функция index - возвращает индекс элемента матрицы
  5. В функции main происходит следующее:
    • Ввод размеров матрицы
    • Выделение памяти под матрицу с помощью calloc
    • Ввод матрицы
    • Поиск максимального числа в отмеченных колонках
    • Вывод результата
    • Освобождение памяти с помощью free
    • Ожидание нажатия клавиши с помощью system(PAUSE)
    • Возвращение 0, что означает успешное выполнение программы

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


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

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

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