Приемы чтения и записи динамических массивов
Для формирования динамического массива, то есть для выделения участка памяти заданного размера для хранения данных определенного типа, необходимо выполнить следующие действия:
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; просмотров: 657;