Функция динамического выделения памяти - 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; }
Объяснение кода листинга программы
- В функции
read
открывается файл с помощьюfopen
и проверяется его открытие с помощьюfopen
в условииif (fopen(s1,
r) == NULL)
. - В функции
read
используетсяfscanf
для чтения двух целочисленных значений в переменныеn
иm
. - В функции
read
динамически выделяется память для двумерного массива с помощьюmalloc
иfree
. - В функции
fun
используется циклfor
для прохода по всем элементам массива. - В функции
fun
используется условное выражениеif (abs(mas[i][j]) < abs(mas[i][j+1]))
для сортировки массива. - В функции
output
открывается файл с помощьюfopen
и записывается содержимое массива в файл с помощьюfprintf
. - В функции
mas_out
используется циклfor
для прохода по всем элементам массива и вывода их на экран с помощьюprintf
. - В функции
main
задаются значения переменныхn
,m
,i
иj
и инициализируются строкиs1
иs2
. - В функции
main
вызывается функцияread
для чтения данных из файла. - В функции
main
вызывается функцияfun
для сортировки массива. - В функции
main
вызывается функцияoutput
для записи массива в файл. - В функции
main
вызывается функцияmas_out
для вывода массива на экран. - В функции
main
вызывается функцияfree
для освобождения памяти. - В функции
main
возвращается значение0
, что означает успешное выполнение программы. - В конце кода подводится точка с помощью
return 0;
.