Функция динамического выделения памяти - C (СИ)

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

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

Здравствуйте! Никак не получается реализовать функцию динамического выделения памяти и это ставит меня в тупик!
#include <stdio.h>
#include <locale.h>
#include <malloc.h>
#include <math.h>
 
int dmc(int *n, int *m);
 
int read(int **mas, char s1, int *n, int *m)
{
    int i, j;
 
    FILE *fp;
    fp = fopen(s1,"r");
 
    if (fopen(s1,"r") == NULL)
        {
            puts("не удается открыть файл");
            exit (1);
        }
 
    fscanf(fp,"%d%*c%d", &n, &m);
    mas = dmc(&n, &m);
 
    while(!feof(fp))
    {
        for(i=0; i<*n; i++)
            {
                for(j=0; j<*m; j++)
                fscanf(fp, "%d", &mas[i][j]);
            }
    }
    fclose(fp);
}
 
int** dmc(int *n, int *m)
{
 
    int **mas, i, j;
 
    mas = (int **) malloc (sizeof(int) * (*n));
        for (i=0; i<n; i++)
            mas[i] = (int*) malloc (sizeof(int) * (*m));
 
    if (!mas)
    {
        puts("ошибка при выделении памяти");
        exit (1);
    }
 
    return mas;
}
 
int fun(int **mas, int n, int m)
{
    int i, j, a, b;
    for (i=0; i<n; i++)
        {
            for (j=0; j<m-1; j++)
                if (abs(mas[i][j]) < abs(mas[i][j+1]))
                {
                    a = 1;
                    break;
                }
            if (a == 0) b++; printf("b= %d\n", b);
            a = 0;
        }
    return b;
}
 
void output(int **mas, char s2, int n, int m)
{
    int i, j;
    FILE *out;
    out = fopen(s2,"a");
 
    for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                fprintf(out, "%d", &mas[i][j]);
            }
    fclose(out);
}
 
void mas_out(int n, int m, int **mas)
{
    int i, j;
    for (i=0; i<n; i++)
        {
            for ( j=0; j<m; j++)
                printf(" %3.d", mas[i][j]);
            printf("\n");
        }
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int  **mas, n, m, i, j;
    char s1[15] = "C:\\input.txt";
    char s2[15] = "C:\\output.txt";
 
    read(mas, s1, &n, &m);
 
    fun(mas, n, m);
 
    output(mas, s2, n, m);
 
    free(mas);
    return 0;
}

Решение задачи: «Функция динамического выделения памяти»

textual
Листинг программы
#include <stdio.h>
#include <locale.h>
#include <malloc.h>
#include <stdlib.h>
#include <math.h>
 
 
 
int read(int **mas, char *s1, int *n, int *m)
{
    int i, j;
 
    FILE *fp;
    fp = fopen(s1,"r");
 
    if (fopen(s1,"r") == NULL)
        {
            puts("не удается открыть файл");
            exit (1);
        }
 
    fscanf(fp,"%d%*c%d", &n, &m);
    mas = (int **) malloc (sizeof(int) * (*n));
    for (i=0; i< *n; i++)
        mas[i] = (int*) malloc (sizeof(int) * (*m));
 
    if (!mas)
    {
        puts("ошибка при выделении памяти");
        exit (1);
    }
 
    while(!feof(fp))
    {
        for(i=0; i<*n; i++)
            {
                for(j=0; j<*m; j++)
                fscanf(fp, "%d", &mas[i][j]);
            }
    }
    fclose(fp);
}
 
int fun(int **mas, int n, int m)
{
    int i, j, a, b;
    for (i=0; i<n; i++)
        {
            for (j=0; j<m-1; j++)
                if (abs(mas[i][j]) < abs(mas[i][j+1]))
                {
                    a = 1;
                    break;
                }
            if (a == 0) b++; printf("b= %d\n", b);
            a = 0;
        }
    return b;
}
 
void output(int **mas, char *s2, int n, int m)
{
    int i, j;
    FILE *out;
    out = fopen(s2,"a");
 
    for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                fprintf(out, "%d", &mas[i][j]);
            }
    fclose(out);
}
 
void mas_out(int n, int m, int **mas)
{
    int i, j;
    for (i=0; i<n; i++)
        {
            for ( j=0; j<m; j++)
                printf(" %3.d", mas[i][j]);
            printf("\n");
        }
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int  **mas, n, m, i, j;
    char s1[15] = "C:\\input.txt";
    char s2[15] = "C:\\output.txt";
 
    read(mas, s1, &n, &m);
 
    fun(mas, n, m);
 
    output(mas, s2, n, m);
 
    free(mas);
    return 0;
}

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

  1. В функции read открывается файл с помощью fopen и проверяется его открытие с помощью fopen в условии if (fopen(s1,r) == NULL).
  2. В функции read используется fscanf для чтения двух целочисленных значений в переменные n и m.
  3. В функции read динамически выделяется память для двумерного массива с помощью malloc и free.
  4. В функции fun используется цикл for для прохода по всем элементам массива.
  5. В функции fun используется условное выражение if (abs(mas[i][j]) < abs(mas[i][j+1])) для сортировки массива.
  6. В функции output открывается файл с помощью fopen и записывается содержимое массива в файл с помощью fprintf.
  7. В функции mas_out используется цикл for для прохода по всем элементам массива и вывода их на экран с помощью printf.
  8. В функции main задаются значения переменных n, m, i и j и инициализируются строки s1 и s2.
  9. В функции main вызывается функция read для чтения данных из файла.
  10. В функции main вызывается функция fun для сортировки массива.
  11. В функции main вызывается функция output для записи массива в файл.
  12. В функции main вызывается функция mas_out для вывода массива на экран.
  13. В функции main вызывается функция free для освобождения памяти.
  14. В функции main возвращается значение 0, что означает успешное выполнение программы.
  15. В конце кода подводится точка с помощью return 0;.

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

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