Массивы. Программа не работает - C (СИ)

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

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

Есть код программы. Он не работает. Укажите, пожалуйста, на ошибке и помогите их исправить.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

//Prototype func
void PrintArray(double **p);
double** ConstructAr();
void DestructArray(double **p);
 
const int TERM = -1;
 
/////////////////////////////////
 
void main (void)
{
    double **pA;
    clrscr();
 
    pA = ConstructAr();
    PrintArray(pA);
    DestructArray(pA);
    getch();
}
 
double** ConstructAr()
{
    double** p = NULL;
    int N, M;
    //poluchaem lo-vo strok
    do
    {
        randomize();
        N = random(10);
    }while (N < 1 || N > 10);
    printf("N = %d\n", N);
    //videlyaem pamyat'
    p = (double **)malloc(sizeof(double *)*N + sizeof(int));
    //zapominaem v -1 kol-vo strok
    ((int *)p)[0] = N;
 
    //organizuem postrochnyi vvod
    for (int i=1; i<N+1; i++)
        {
            //opredelyaem kol-vo simvolov v stroke
            do
            {
                randomize();
                M = random(10);
            }while(M < 1 || M > 10);
            M=2;
            printf("M = %d", M);
            //videlyaem pamyat'
            p[i] = (double *) malloc(M*sizeof(double) + sizeof(int));
            ((int *)(p[i]))[M] = TERM;
            //vvodim elti s klavy
            for (int j=0; j<M; j++)
            {
                double m;
                do
                {
                    printf("\nEnter A[%d][%d](1<=A[%d][%d]<=10): ", i,j,i,j);
                    scanf("%lf", &m);
                }while(m<1 || m>10);
                p[i][j]=m;
            }
        }
        return p;
}
void DestructArray(double **p)
{
    if(!p) return;//proverka korrekt
 
    int N; // kol-vo strok
    N = ((int *)p)[-1];
    for(int i=0; i<N; i++)
    {
        ((int *)(p[i]))--;
        free(p[i]);
    }
    ((int *)p)--;
    free(p);
    printf("End free");
}
 
void PrintArray(double **p)
{
    int N,j;
    N = ((int*)p)[0];
    printf("Poluch N=%d\n", N);
    getch();
 
    for(int i=1; i<N+1; i++)
    {
getch();
        j = 0;
        while(((int *)(p[i]))[j] != TERM)
            printf("%f ", p[i][j++]);
            printf("\n");
    }
}

Решение задачи: «Массивы. Программа не работает»

textual
Листинг программы
//Prototype func
void PrintArray(double **p);
double** ConstructAr();
void DestructArray(double **p);
 
const int TERM = -1;
 
/////////////////////////////////
 
void main (void)
{
        double **pA;
        clrscr();
 
        pA = ConstructAr();
        PrintArray(pA);
        DestructArray(pA);
        getch();
}
 
double** ConstructAr()
{
        double** p = NULL;
        double**t;
        int N, M;
        //poluchaem lo-vo strok
        do
        {
                randomize();
                N = random(10);
        }while (N < 1 || N > 10);
        printf("N = %d\n", N);
        //videlyaem pamyat'
        p = (double **)malloc(sizeof(double *)*N + sizeof(int));
        //zapominaem v -1 kol-vo strok
        ((int *)p)[0] = N;
        t = (double **)(((int *)p)[1]); //указатель на начало собственно массива указателей строк
 
        //organizuem postrochnyi vvod
        for (int i=0; i<N; i++)
                {
                        //opredelyaem kol-vo simvolov v stroke
                        do
                        {
                                randomize();
                                M = random(10);
                        }while(M < 1 || M > 10);
                        M=2;
                        printf("M = %d", M);
                        //videlyaem pamyat'
                        t[i] = (double *) malloc(M*sizeof(double) + sizeof(int));
                        *(int *)(t[i]+M) = TERM;
                        //vvodim elti s klavy
                        for (int j=0; j<M; j++)
                        {
                                double m;
                                do
                                {
                                        printf("\nEnter A[%d][%d](1<=A[%d][%d]<=10): ", i,j,i,j);
                                        scanf("%lf", &m);
                                }while(m<1 || m>10);
                                t[i][j]=m;
                        }
                }
                return p;
}
void DestructArray(double **p)
{
        if(!p) return;//proverka korrekt
        double ** t;
        int N; // kol-vo strok
        N = ((int *)p)[0];
        t = (double **)(((int *)p)[1]); //указатель на начало собственно массива указателей строк
        for(int i=0; i<N; i++)
        {
                free(t[i]);
        }
        free(p);
        printf("End free");
}
 
void PrintArray(double **p)
{
        int N,j;
        double **t;
        N = ((int*)p)[0];
        t = (double**)(((int *)p)[1]);  //указатель на начало собственно массива указателей строк
        printf("Poluch N=%d\n", N);
        getch();
 
        for(int i=1; i<N+1; i++)
        {
getch();
                j = 0;
                while(((int *)(t[i]))[j] != TERM)
                        printf("%f ", t[i][j++]);
                        printf("\n");
        }
}

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

В этом коде реализована простая программа для работы с двумерными массивами. Она создает двумерный массив фиксированного размера, заполняет его случайными числами от 1 до 10, а затем выводит его на экран. Вот список функций и их назначений:

  1. ConstructAr() - создает новый двумерный массив.
  2. DestructArray() - освобождает память, занятую двумерным массивом.
  3. PrintArray() - выводит двумерный массив на экран. Вот список переменных и их назначений:
  4. TERM - это константа, используемая для обозначения конца массива. Ее значение по умолчанию равно -1.
  5. N - количество строк в массиве.
  6. M - количество столбцов в массиве.
  7. pA - указатель на двумерный массив.
  8. t - указатель на начало первой строки массива.
  9. i и j - индексы для доступа к элементам массива. Вот список действий, выполняемых в коде:
  10. В функции main() создается новый двумерный массив pA с помощью функции ConstructAr().
  11. С помощью функции PrintArray() на экран выводится содержимое массива pA.
  12. Функция DestructArray() освобождает память, занятую массивом pA.
  13. В цикле for в функции main() пользователь вводит значения для каждой строки массива.
  14. В цикле for в функции PrintArray() на экран выводятся значения всех элементов массива.

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


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

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

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