Массивы. Программа не работает - 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, а затем выводит его на экран. Вот список функций и их назначений:
ConstructAr()
- создает новый двумерный массив.DestructArray()
- освобождает память, занятую двумерным массивом.PrintArray()
- выводит двумерный массив на экран. Вот список переменных и их назначений:TERM
- это константа, используемая для обозначения конца массива. Ее значение по умолчанию равно -1.N
- количество строк в массиве.M
- количество столбцов в массиве.pA
- указатель на двумерный массив.t
- указатель на начало первой строки массива.i
иj
- индексы для доступа к элементам массива. Вот список действий, выполняемых в коде:- В функции
main()
создается новый двумерный массивpA
с помощью функцииConstructAr()
. - С помощью функции
PrintArray()
на экран выводится содержимое массиваpA
. - Функция
DestructArray()
освобождает память, занятую массивомpA
. - В цикле
for
в функцииmain()
пользователь вводит значения для каждой строки массива. - В цикле
for
в функцииPrintArray()
на экран выводятся значения всех элементов массива.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д