Индивидуальные варианты заданий



1. Выполнить задания лабораторной работы №4 (Работа с массивами) в соответствии со своим вариантом, оформив каждый пункт задания в виде функции. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.

2. Выполнить задания лабораторной работы №5 (Работа со строками) в соответствии со своим вариантом, оформив в виде функций законченные последовательности действий. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается. Функция должна быть описана в отдельном модуле и подключена к основной программе.

 

Контрольные вопросы

1. Как определить функцию?

2. Как обращаться к функции и как установить связи между функцией и программой, ее вызывающей?

3. В чем различие между формальными и фактическими аргументами функции?

4. Где необходимо описывать аргументы функции?

5. Где необходимо описывать другие локальные переменные?

6. Когда и как использовать оператор return()?

7. Когда и как использовать адреса и указатели для доступа к объектам?

8. Понятие рекурсии.

 

Содержание отчета

1. Титульный лист

2. Цели, задачи работы

3. Индивидуальное задание

4. Блок-схема алгоритма (для каждой задачи)

5. Листинг программы(для каждой задачи)

6. Результат выполнения программы – скриншот (для каждой задачи)

7. Ответы на контрольные вопросы

 

Практическая работа №7.Структуры в С++. Словари и списки

Цель работы: изучение создания структур, словарей и списков в С++.

 

Задачи:

1. Изучить теоретический материал

2. Написать программу согласно индивидуальному варианту задания.

3. Ответить на контрольные вопросы.

4. Оформить отчет.

 

Теоретический материал

 

Структуры

Структура — это , некое объединение различных переменных (даже с разными типами данных), которому можно присвоить имя. Например можно объединить данные об объекте Дом: город (в котором дом находится), улица, количество квартир, интернет(проведен или нет) и т.д. в одной структуре. В общем, можно собрать в одну совокупность данные обо всем, что угодно, точнее обо всем, что необходимо конкретному программисту. Всем сразу стало понятно :)

Если вы только приступаете к знакомству со структурами в С++, сначала, вам необходимо ознакомиться с синтаксисом структур в языке С++. Рассмотрим простой пример, который поможет познакомиться со структурами и покажет, как с ними работать. В этой программе мы создадим структуру, создадим объект структуры, заполним значениями элементы структуры (данные об объекте) и выведем эти значения на экран.

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <iostream> using namespace std;   struct building //Создаем структуру! { char *owner; //здесь будет храниться имя владельца char *city; //название города int amountRooms; //количество комнат float price; //цена };   int main() { setlocale (LC_ALL, "rus");   building apartment1; //это объект структуры с типом данных, именем структуры, building   apartment1.owner = "Денис"; //заполняем данные о владельце и т.д. apartment1.city = "Симферополь"; apartment1.amountRooms = 5; apartment1.price = 150000;   cout << "Владелец квартиры: " << apartment1.owner << endl; cout << "Квартира находится в городе: " << apartment1.city << endl; cout << "Количество комнат: " << apartment1.amountRooms << endl; cout << "Стоимость: " << apartment1.price << " $" << endl;   return 0; }

 

Комментарии по коду программы:

В строках 4 — 10 мы создаем структуру. Чтобы ее объявить используем зарезервированное слово struct и даем ей любое, желательно логичное, имя. В нашем случае — building. С правилами именования переменных, вы можете ознакомиться в этой статье. Далее открываем фигурную скобку { , перечисляем 4 элемента структуры через точку с запятой ; , закрываем фигурную скобку } и в завершении ставим точку с запятой ;. Это будет нашим шаблоном (формой) структуры.

В строке 16 объявляем объект структуры. Как и для обычных переменных, необходимо объявить тип данных. В этом качестве выступит имя нашей созданной структуры — building.

Как же заполнить данными (инициализировать) элементы структуры? Синтаксис таков: Имя объекта далее оператор точка . и имя элемента структуры. Например: apartment1.owner. Таким образом, в строках 18-21 присваиваем данные элементам структуры.

И так, данные мы внесли. Следующий вопрос: «Как к ним обратиться, как работать и использовать их в программе?» Ответ — «Очень просто — так же, как и при инициализации, используя точку . и имя элемента структуры». В строках 23 — 26 выводим заполненные элементы структуры на экран.

И вот что мы увидим в результате, когда скомпилируем нашу программу:

 

Что ещё важно знать:

  • Объект структуры можно объявить до функции main(). Это выглядело бы так:

 

1 2 3 4 5 6 7 struct building { char *owner char *city; int amountRooms; float price; }apartment1; //объявление объекта типа building

 

Инициализировать структуру можно и таким способом:

building apartment1 = {"Денис", "Симферополь", 5, 150000};

 

но так делают крайне редко;

· Структуру можно вкладывать в другие структуры (это мы рассмотрим в следующем примере).

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

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 #include <iostream> using namespace std;   struct date //создаем еще одну структуру, чтобы вложить ее в структуру building // дата постройки { char *month; // Месяц постройки дома int year; // Год };   struct building { char *owner; char *city; int amountRooms; float price;   date built; //вкладываем одну структуру в определение второй };   void show(building object) //создаем функцию, которая принимает структуру, как параметр { cout << "Владелец квартиры: " << object.owner << endl; cout << "Квартира находится в городе: " << object.city << endl; cout << "Количество комнат: " << object.amountRooms << endl; cout << "Стоимость: " << object.price << " $" << endl; cout << "Дата постройки: " << object.built.month << ' ' << object.built.year << endl; }   int main() { setlocale (LC_ALL, "rus");   building apartment1;   apartment1.owner = "Денис"; apartment1.city = "Симферополь"; apartment1.amountRooms = 5; apartment1.price = 150000; apartment1.built.month = "январь"; apartment1.built.year = 2013;   struct building *pApartment; //это указатель на структуру pApartment = &apartment1;   //Обратите внимание, как нужно обращаться к элементу структуры через указатель //используем оператор -> cout << "Владелец квартиры: " << pApartment->owner << endl; cout << "Квартира находится в городе: " << pApartment->city << endl; cout << "Количество комнат: " << pApartment->amountRooms << endl; cout << "Стоимость: " << pApartment->price << " $" << endl; cout << "Дата постройки: " << pApartment->built.month << ' ' << pApartment->built.year << "\n\n\n";   building apartment2; //создаем и заполняем второй объект структуры   apartment2.owner = "Игорь"; apartment2.city = "Киев"; apartment2.amountRooms = 4; apartment2.price = 300000; apartment2.built.month = "январь"; apartment2.built.year = 2012;   building apartment3 = apartment2; //создаем третий объект структуры и присваиваем ему данные объекта apartment2   show(apartment3);   cout << endl << endl; return 0; }

 

Коментарии по коду программы:

Строка 17 — создание объекта built типа date в определении структуры building. Строки 42 — 43: создаем указатель на структуру struct building *pApartment; и далее присваиваем ему адрес уже созданного и заполненного данными объекта pApartment = &apartment1;. Обращаясь к элементам структуры через указатель мы используем оператор -> (тире и знак >). Это видно в строках 47 — 51.

В строке 62 показано, как можно инициализировать структуру. А именно, можно создать новый объект структуры и присвоить ему одним целым, уже созданный и заполненный данными, объект. В функцию show() передаем объект структуры, как параметр — строка 64. Результат:

 

 

Разобрав этот пример, мы увидели на практике следующее:

  • структуру можно вкладывать в другую структуру;
  • увидели, как создаётся указатель на структуру;
  • как нужно обращаться к элементу структуры через указатель. А именно, используя оператор -> ; В примере это было так: apartment0->owner, но можно и так (*apartment0).owner. Круглые скобки, во втором случае, обязательны.
  • данные одной структуры можно присвоить другой структуре;
  • можно структуру передать в функцию, как параметр (кстати, элементы структуры так же можно передавать в функцию, как параметры).

В дополнение ко всему, следует отметить, что функции могут так же возвращать структуры в результате своей работы. Например:

 

1 2 3 4 5 6 7 8 building Set() { building object; // формирование объекта   //... код функции   return object; }

 

Списки

Линейный список — это динамическая структура данных, каждый элемент которой посредством указателя связывается со следующим элементом.

Из определения следует, что каждый элемент списка содержит поле данных (Data) (оно может иметь сложную структуру) и поле ссылки на следующий элемент (next). Поле ссылки последнего элемента должно содержать пустой указатель (NULL).

Так как ссылка всего одна (только на следующий элемент), то такой список является односвязным.

Когда говорят о линейном списке, то, как правило, подразумевают именно односвязный список.

Пример. Сформировать список, содержащий целые числа 3, 5, 1, 9.

Решение. При работе с динамическими структурами данных можно рекомендовать следующий порядок действий.

а) Прежде всего необходимо определить две структуры:

1. структура, содержащая характеристики данных, то есть все те поля с данными, которые необходимы для решения поставленной задачи (в нашем случае имеется всего одно поле целого типа). Назовём эту структуру Data;

2. структура, содержащая поле типа Data и поле — адрес последующего элемента next. Вторую структуру назовём List.

Тексты этих структур необходимо расположить в начале программы (до main() и других функций). Вот возможная реализация структур:

Struct Data

{

int a;

};

Struct List

{

Data d;

List *next;

};

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

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

 

б) В программе (обычно в функции main()) определяем указатель на начало будущего списка:

List *u = NULL;

Пока список пуст, и указатель явно задан равным константе NULL.

в) Выполняем первоначальное заполнение списка.

Создадим первый элемент:

u = new List; // Выделяем память под элемент списка

u->d.a = 3; // Заполняем поля с данными

Здесь это всего одно поле)

u->next = NULL;// Указатель на следующий элемент пуст

После включения первого элемента список можно изобразить так:


Продолжим формирование списка, добавляя новые элементы в его конец. Для удобства заведём вспомогательную переменную-указатель, которая будет хранить адрес последнего элемента списка:

List *x;

x = u; // Сейчас последний элемент списка совпадает с его началом


Таким образом, к области памяти можно обратиться через два указателя.

Выделяем место в памяти для следующего элемента списка и перенаправляем указатель x на выделенную область памяти:

x->next = new List;

x = x->next;

Затем определяем значение этого элемента списка:

x->d.a = 5;

x->next = NULL;

Получилась такая схема:


Этот процесс продолжаем до тех пор, пока не будет сформирован весь список.


Дата добавления: 2020-04-25; просмотров: 210; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!