Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример формирования одномерного динамического массива




#include <stdio.h>

#include <conio.h>

#include <alloc.h>

main()

{ float *p,d;

int i,n;

printf("\n input n:");

scanf("%d",&n);

p=(float *)malloc(n*sizeof(float));

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

{printf("x[%d]=",i);

scanf("%f",&d);

p[i]=d;

}

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

{ if (i%4==0) printf("\n");

printf("\t x[%d]=%6.2f",i,p[i]);

}

free(p);

getch();

}

Доступ к участкам выделенной памяти выполняется с помощью операции индексирования: p[i].

Каждый элемент массива может быть, в свою очередь, массивом. Именно так конструируются динамические многомерные массивы. Рассмотрим алгоритм создания и обработки двумерного массива.

1. Определяем указатель на массив указателей, задающий адреса начала строк матрицы: тип **uk.

2. Вводим размеры матрицы n,m.

3. Создаём динамический массив указателей на указатели начала строк: uk=(тип **)malloc(n*sizeof(тип *));

4. В цикле выделяем память под n массивов – строк по m элементов в каждом: for (i=0;i<n;i++) uk[i]=(тип *)malloc(m*sizeof(тип));

5. Обработка массива (работа с индексированными элементами uk[i][j]).

6. В цикле освобождаем память, занятую под n массивов – строк: for (i=0;i<n;i++) free(uk[i]);

7. Освобождаем память, занятую под массив указателей: free(uk).

Пример обработки двумерного динамического массива

Составить программу, создающую динамическую матрицу размером n*n, заполнить матрицу случайными числами. Вычислить сумму каждой строки и поместить суммы строк в одномерный динамический массив.

//lab11_2

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <alloc.h>

void main()

{ int n,j,i;

float ** matr; float * mass; // Объявляем matr - указатель на массив указателей и //mass – указатель на одномерный массив

clrscr();

printf("Введите размер квадратной матрицы n: "); scanf("%d",&n);

mass=(float *)malloc(n*sizeof(float)); // Выделяем память под одномерный массив

if (mass==NULL)

{ puts("не создан динамический массив!");

return;}

matr=(float **)malloc(sizeof(float *)*n); //Выделяем память под массив указателей

if (matr==NULL)

{ puts("не создан динамический массив!");

return;}

randomize();

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

{ matr[i]=(float *)malloc(sizeof(float)*n); // Выделяем память под i-ю строку

if (matr[i]==NULL)

{ puts("не создан динамический массив!");

return;}

for (j=0;j<n;j++) matr[i][j]=random(100);

}

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

{ mass[i]=0;

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

mass[i]+=matr[i][j];

}

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

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

printf("\t%6.2f",matr[i][j]);

printf("\n");

}

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

printf("\n сумма %d строки %8.2f",i,mass[i]);

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

free(matr[i]); //Освобождаем память i – й строки

free(matr); // Освобождаем память массива указателей

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

getch();

}

ВЫПОЛНЕНИЕ РАБОТЫ

3.1. Проанализировать приведенные программы.

3.2. Создать двумерный динамический массив и выполнить задание по своему варианту.

Варианты заданий

1. Даны матрица A размером m*n и вектор В размером m. Записать на главную диагональ элементы вектора, а в вектор - элементы главной диагонали.

2. Выбрать максимальный элемент матрицы С (размер m*n), элементы четных строк разделить на максимальный элемент, а к элементам нечетных прибавить максимальный элемент.

3. Найти минимальный элемент матрицы С (размер m*n), и поменять его местами с первым элементом.

4. Дана матрица Е размером m*n. Вычислить суммы элементов каждого столбца. Определить наибольшее значение этих сумм и номер соответствующего столбца.

5. В матрице К размером m*n найти в каждом столбце произведение отрицательных элементов и количество нулевых элементов в матрице.

6. Даны две матрицы А и В одинаковой размерности m*n. Получить матрицу

C = max (a i j, b i j), и матрицу D = min (a i j, b i j).

7. Дана матрица Р размером m*n. Найти сумму минимальных элементов каждого столбца матрицы.

8. Даны матрицы: А размером m*k и В размером k*n.Получить матрицуС=A*В.

9. Дана матрица К размером m*n. Вычислить сумму минимальных элементов каждого столбца.

10. Дана матрица С размером m*n. Упорядочить эту матрицу по возрастанию элементов в каждом столбце.

11. Дан одномерный массив A из m элементов. Вводится число k (k<m). Получить из А матрицу, по k элементов в строке. Недостающие элементы заменить 0.

12. В матрице Т размером m*k переставить элементы в строках так, чтобы по диагонали они были упорядочены по возрастанию.

КОНТРОЛЬНЫЕ ВОПРОСЫ

4.1. Отличия динамического массива от статического.

4.2. Как создать одномерный динамический массив?

4.3. Как создать динамическую матрицу?

4.4. Как освобождается память, занятая под динамические структуры?

 

Лабораторная работа № 10 (КР)

Обработка бинарных файлов

1. ЦЕЛЬ РАБОТЫ: приобретение практических навыков создания и обработки бинарных файлов.

ОСНОВНЫЕ ПОНЯТИЯ

Если файл открыт в бинарном режиме, его можно записывать или считывать побайтно. Функция fseek() позволяет обращаться с файлом как с массивом и переходить к любой позиции в файле, обеспечивая возможность произвольного доступа. Если текстовые файлы являются файлами с последовательным доступом, то произвольный доступ чаще всего применяется к бинарным файлам.

Бинарные файлы могут содержать любую информацию. Чаще всего используются файлы, содержащие структуры. Для чтения и записи в бинарные файлы можно использовать функции fread(), fwrite() или fscanf(),fprintf().

fread –функция для чтения из файла:

int fread(void *ptr, unsigned size, unsigned count, FILE *f);

Из файла f считываются и по адресу ptr записываются count элементов размером size каждый. Функция возвращает число фактически считанных элементов.

fwrite – функция для записи в файл:

int fwrite(void *ptr, unsigned size, unsigned count, FILE *f);

В файл записываются, начиная с адреса ptr, count элементов размером size каждый. Функция возвращает число фактически записанных элементов.

fseek – функция для произвольного доступа к байтам бинарных файлов:

int fseek(FILE *f, long offset, int w);

offset показывает, на сколько байт нужно сместиться относительно точки отсчёта – w.

w должно быть равно одной из трех констант:

SEEK_SET или 0 - начало файла;

SEEK_CUR или 1 – текущая позиция в файле;

SEEK_END или 2 – конец файла.

ftell - возвращает текущую позицию в файле как длинное целое:

long int ftell (FILE *f);

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...