Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_programmirovanie / Praktikum_programmirovanie.doc
Скачиваний:
65
Добавлен:
30.03.2015
Размер:
15.88 Mб
Скачать

Методические указания

1. Формирование, печать и обработку массивов и строк оформить в виде функции. Массивы передавать как параметры функций.

2. Реализовать массивы как псевдодинамические, их размерности передавать как параметры функций.

3. Формирование массивов выполнить с использованием ДСЧ. В массивы записывать и положительные, и отрицательные числа.

4. Сортировку массивов организовать с помощью одного из простых методов сортировки, рассмотренных в лабораторной работе №3.

5. Функция main() должна содержать только описание массивов/строк и вызовы функций для формирования, печати и обработки массивов/строк.

Пример заполнения двумерного массива случайными числами

#include <conio.h>

#include <iostream.h>

#include <iomanip.h>

int main()

{

int arr[2][4];

srand(time(NULL));

for (int i = 0; i < 2; i++){

for (int j = 0; j < 4;j++ ){

arr[i][j]=rand()%10;

cout<<setw(5)<<arr[i][j];

}

cout<<"\n";

}

getch();

return 0;

}

Пример обработки строк

Программа: удалить из строки введенное с клавиатуры слово

Схема алгоритма

#include <iostream.h>

#include <conio.h>

#include <string>

using namespace std;

void modstr(string &s)

{

int k;

string w;

cout<<"\nВведите слово, которое нужно удалить \n";

cin>>w;

k=s.find(w);

while (s.find(w)!=string::npos)

{

s.erase(k,w.length());

k=s.find(w);

}

}

int main()

{

string s;

int n,k;

cout<<"Введите строку\n";

getline(cin,s);

n=s.length();

cout<<"Длина строки "<<n;

modstr(s);

cout<<"\nСтрока с удаленными словами: "<<s;

getch();

}

Лабораторная работа №6 Динамические массивы

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

Указатель представляет собой адрес памяти, который указывает (или ссылается) на определенный участок. Для определения указателя используется символ * в определении или объявлении объекта. Синтаксис определения указателя имеет вид:

класс_хранения спецификация_типа *идентификатор;

Символ * в этом контексте означает "указатель на". Несколько примеров:

int *iptr; //Определяет указатель на целое значение

float *fvals; //Определяет указатель на значение с плавающей точкой

char *cp; //Описывает указатель на символ

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

указатель = new имя_типа[инициализатор];

где инициализатор – выражение в круглых скобках.

Операция new позволяет выделить и сделать доступным участок динамической памяти, который соответствует заданному типу данных. Если задан инициализатор, то в этот участок будет занесено значение, указанное в инициализаторе.

int* x=new int(5);

Для удаления динамических переменных используется операция delete, определенная в C++:

delete указатель;

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

delete x;

Операция new при использовании с массивами имеет следующий формат:

new тип_массива

Такая операция выделяет для размещения массива участок динамической памяти соответствующего размера, но не позволяет инициализировать элементы массива. Операция new возвращает указатель, значением которого служит адрес первого элемента массива. При выделении динамической памяти размеры массива должны быть полностью определены.

Для создания динамического многомерного массива необходимо указать в операции new все его размерности (самая левая размерность может быть переменной), например:

char *buffer = new char[50];

int nstr = 5;

int * * m = (int **) new int [nstr][10] ;

При формированиb матрицы сначала выделяется память для массива указателей на одномерные массивы, а затем в цикле с параметром выделяется память под n одномерных массивов.

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

#include<iostream.h>

#include<conio.h>

int i,j,m,n;

cout <<”Введите количество строк n= ";

cin >>n;

cout << " Введите количество столбцов m = ";

cin>>m;

srand(time(NULL));

int **a;

a = new int* [n]; //выделение памяти по массив указателей

srand(time(NULL));

for(int i=0;i<n;i++) a[i] = new int[m]; //выделение памяти для массива значений

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

{

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

{

a[i][j] = rand()%10;

cout<<a[i][j]<<"\t";

}

cout << "\n";

}

getch();

}

Рис. Выделение памяти под двумерный массив

Изменять значение указателя на динамический массив надо аккуратно, т. к. этот указатель затем используется при освобождении памяти с помощью операции delete.

delete[] a; /*освобождает память, выделенную под массив, если а адресует его начало*/

Это выражение освобождает динамически распределяемую память, занимаемую массивом, адрес которого содержит указатель a. Пара пустых квадратных скобок после ключевого слова delete необходима, она означает, что указатель содержит адрес массива, а не одного элемента в динамической памяти.

Если пропустить пару пустых квадратных скобок, произойдет серьезная ошибка, кото­рую компилятор, вероятнее всего, не заметит, а, следовательно, она проявится во вре­мя выполнения.

Наименее серьезным последствием пропуска пары квадратных скобок при осво­бождении массива, будет освобождение во время выполнения не всей занятой мас­сивом памяти, что приведет к ее утечке (memory leak). Однако на некоторых систе­мах или при использовании элементов некоторых типов возможны гораздо более серьезные проблемы. Поэтому при удалении указателей на массивы очень важно не забывать о квадратных скобках.

Удаление из динамической памяти двумерного массива осуществляется в порядке обратном его созданию, т. е. сначала освобождается память, выделенная под одномерные массивы с данными, а затем память, выделенная под одномерный массив указателей.

При удалении из динамической матрицы строк или столбцов создается новая матрица нужного размера, в которую переписываются данные из старой матрицы. Затем старая матрица удаляется.

a = new double; // Одна переменная

d = new double[4]; // Массив переменных

dd = new double*[3]; // Двухмерный массив

...

// Освобождение памяти

delete a; // Одна переменная

delete [] d; // Массив переменных

for(int i = 0; i < 3; i++) // Двухмерный массив

delete [] dd[i];

delete [] dd;