Приемы чтения и записи динамических массивов

Для формирования динамического массива, то есть для выделения участка памяти заданного размера для хранения данных определенного типа, необходимо выполнить следующие действия:

1) Описать указатель (например, переменную p) определенного типа.

2) Начиная с адреса, определенного указателем, с помощью функций calloc, malloc или операции new выделить участок памяти определенного размера. После этого p будет адресом первого элемента выделенного участка оперативной памяти (0-й элемент массива), p+1 будет адресовать следующий элемент в выделенном участке памяти (1-й элемент динамического массива), … , p+i является адресом i-го элемента. Необходимо только следить, чтобы не выйти за границы выделенного участка памяти. К i-му элементу динамического массива p можно обратиться одним из двух способов *(p+i) или p[i].

3) Когда участок памяти будет не нужен, его необходимо освободить с помощью функции free() или операции delete.

Работа с двумерными динамическими массивами основана на двух следующих способах.

1) Используется двойного указателя – указателя на указатель.

float **a;

//это указатель на float *, или указатель на массив

2) Применяется одинарный указатель. В этом случае двумерный динамический массив рассматривается как аналог одномерного массива. При работе с динамическими матрицами следует помнить, что выделенный участок памяти под двумерный массив A(N,M) представляет собой участок памяти размером N*M элементов. Поэтому выделение памяти будет выглядеть следующим образом:

A = (тип *) calloc(N*M, sizeof(тип));

или

A = (тип *) malloc(N*M*sizeof(тип));

Для обращения к элементу Ai,j необходимо, но номеру строки i и номеру столбца j вычислить номер этого элемента k в одномерном динамическом массиве. Учитывая, что в массиве элементы нумеруются с нуля k=i*M+j. Статический элемент матрицы a[i][j]записывается как a[i*m+j] или *(a+i*m+j).

Чтение и запись данных при работе с динамическими массивами аналогична работе со статическими массивами. Продемонстрируем это в следующем примере.

Пример 1. Вычислить и запомнить средние арифметические значения положительных элементов каждой строки матрицы A(K,L). Имена входного и выходного файла задаются пользователем. Входной файл в первой строке содержит размерность матрицы, со второй строки задается сама матрица.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

void input (int n,int m, int *mas, FILE *t);

void out (int n,int m,int *mas);

void outmas (int n, float *ml, FILE *g);

void work(int n, int m, int *mas, float *ml);

 

void main (){

int *mass,k,l;

float *ml;

float sr;

char file1[10],file2[10];

FILE *t,*g;

printf("Введите имя входного файла: ");

scanf("%s",file1);

printf("Введите имя выходного файла: ");

scanf("%s",file2);

t=fopen(file1,"r");//открытие файла для чтения

g=fopen(file2,"w");//открытие файла для записи

fscanf(t,"%d",&k);

fscanf(t,"%d",&l);

mass=(int*)malloc(k*l*sizeof(int));

//выделение памяти для массива

ml=(float*)malloc(k*sizeof(float));

//выделение памяти для массива

printf("\nМассив:\n");

input(k,l,mass,t);

out(k,l,mass);

work(k,l,mass,ml);

printf("\nСредние арифметические значения положительных

элементов каждой строки матрицы\n");

outmas(k,ml,g);

fclose(t); //закрытие файла

fclose(g); //закрытие файла

free(ml); //освобождение памяти

free(mass); //освобождение памяти

}

 

void input(int n, int m,int *mas, FILE *t){

int i,j;

for (i=0;i<n;i++)

for (j=0;j<m;j++)

fscanf(t,"%d",mas+i*m+j);

}

 

void out (int n,int m, int *mas){

int i,j;

for (i=0;i<n;i++) {

for (j=0;j<m;j++)

printf("%4d",mas[i*m+j]);

printf("\n");

}

}

 

void outmas (int n, float *ml, FILE *g){

int i;

for (i=0;i<n;i++) {

printf("%6.2f\n",ml[i]);

fprintf(g,"%6.2f\n",ml[i]);

}

}

 

void work(int n, int m, int *mas, float *ml) {

int i,j,kol;

for (i=0;i<n;i++){

ml[i]=0;

kol=0;

for (j=0;j<m;j++)

if (mas[i*m+j]>0) {

ml[i]+=mas[i*m+j];

kol++;

}

if (kol>0) ml[i]/=kol;

}

}

 








Дата добавления: 2015-02-16; просмотров: 604;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.01 сек.