Тема: Объявление и описание структуры
Определение и основные правила
Структуры — это составные типы данных, построенные с использованием других типов. Они представляет собой объединенный общим именем набор данных различных типов. Именно тем, что в них могут храниться данные разных типов, они и отличаются от массивов, хранящих данные одного типа.
Отдельные данные структуры называются элементами или полями. Все это напоминает запись в базе данных, только хранящуюся в оперативной памяти компьютера.
Простейший вариант объявления структуры может выглядеть следующим образом:
struct TPers
{
AnsiString Fam,Nam,Par;
unsigned Year;
bool Sex;
AnsiString Dep;
};
Ключевое слово struct начинает определение структуры. Идентификатор TPers — тег (обозначение, имя-этикетка) структуры. Тег структуры используется при объявлении переменных структур данного типа. В этом примере имя нового типа — TPers. Имена, объявленные в фигурных скобках описания структуры — это элементы структуры. Элементы одной и той же структуры должны иметь уникальные имена, но две разные структуры могут содержать не конфликтующие элементы с одинаковыми именами. Каждое определение структуры должно заканчиваться точкой с запятой.
Определение TPers содержит шесть элементов. Предполагается, что такая структура может хранить данные о сотруднике некоего учреждения. Типы данных разные: элементы Fam, Nam, Par и Dep — строки, хранящие соответственно фамилию, имя, отчество сотрудника и название отдела, в котором он работает. Элемент Year целого типа хранит год рождения, элемент Sex булева типа хранит сведения о поле. Элементы структуры могут быть любого типа, но структура не может содержать экземпляры самой себя. Например, элемент типа TPers не может быть объявлен в определении структуры TPers. Однако может быть включен указатель на другую структуру типа TPers. Структура, содержащая элемент, который является указателем на такой же структурный тип, называется структурой с самоадресацией. Такие структуры очень полезны для формирования различных списков.
Само по себе объявление структуры не резервирует никакого пространства в памяти; оно только создает новый тип данных, который может использоваться для объявления переменных. Переменные структуры объявляются так же, как переменные других типов. Объявление:
TPers Pers, PersArray[10], *Ppers;
объявляет переменную Pers типа TPers, массив PersArray — с 10 элементами типа TPers и указатель Ppers на объект типа TPers.
Переменные структуры могут объявляться и непосредственно в объявлении самой структуры после закрывающейся фигурной скобки. В этом случае указание тега не обязательно:
struct {
AnsiString Fam, Nam, Par;
unsigned Year;
bool Sex;
AnsiString Dep;
}Pers, PersArray[10}, *Ppers;
Для доступа к элементам структуры используются операции доступа к элементам: операция точка (.) и операция стрелка (->). Операция точка обращается к элементу структуры по имени объекта или по ссылке на объект. Например:
Pers.Fam = "Иванов";
Pers.Nam = "Иван";
Pers.Par = "Иванович";
Pers.Year = 1960;
Pers.Sex = true;
Pers.Dep = "Бухгалтерия";
Операция стрелка обеспечивает доступ к элементу структуры через указатель на объект. Допустим, что выполнен оператор:
Ppers = &Pers;
который присвоил указателю Ppers адрес объекта Pers. Тогда указанные выше присваивания элементам структуры можно выполнить так:
Ppers->Fam = "Иванов";
Ppers->Nam = "Иван";
Ppers->Par = "Иванович";
Ppers->Year = I960;
Ppers->Sex = true;
Ppers->Dep = "Бухгалтерия";
Самоадресуемые структуры
Нередко в памяти надо динамически размещать последовательность структур, как бы формируя некий фрагмент базы данных, предназначенный для оперативного анализа и обработки. Поскольку динамическое размещение проводится в непредсказуемых местах памяти, то такие структуры надо снабдить элементами, содержащими указатели на следующую аналогичную структуру. Такие структуры со ссылками на аналогичные структуры и называются самоадресуемыми. Ниже приведена схема связи таких структур в последовательность. Полю указателя в последней структуре обычно присваивается значение NULL, что является признаком последней структуры при организации поиска в списке.
Список структур | структура 1 … | структура 2 … | структура N … | NULL | ||
указатель | указатель | указатель |
Если мы хотим структуру сделать самоадресуемой, следует изменить ее объявление следующим образом:
struct TPers
{
AnsiString Fam, Nam, Par;
unsigned Year;
bool Sex;
AnsiString Dep;
TPers * pr;
};
Приведем пример формирования в памяти списка таких структур. Для этого надо определить три переменные, являющиеся указателями на структуры:
TPers *Р0 = NULL, *Pnew, *Pold;
Первая из этих переменных будет всегда указывать на первую структуру в списке. Две остальные переменные — вспомогательные. Если в некоторый момент возникла необходимость динамически разместить в памяти очередную структуру и вставить ее в конец списка, это можно сделать следующим кодом:
Pnew = new TPers; // выделение памяти под новую структуру
// заполнение элементов структуры
Pnew->Fam = "Иванов";
Pnew->Nam = "Иван";
Pnew->Par = "Иванович";
Pnew->Year = 1960;
Pnew->Sex - true;
Pnew->Dep = "Бухгалтерия";
Pnew->pr = NULL;
if(P0 ==* NULL) P0 = Pnew; // P0 - указатель на первую структуру
else Pold->pr = Pnew; // указатель на очередную структуру
Pold = Pnew;
Если список еще не начат (Р0 = NULL), то указателю Р0 присваивается ссылка на вновь размещенную структуру (Pnew). В противном случае ссылка на новую структуру присваивается полю рг предыдущей структуры в списке (Pold). Таким образом, новая структура включается в общий список. Полю рг этой структуры присваивается значение NULL. Это является признаком того, что данная структура является последней в списке.
Сформировав список в памяти далее легко его просматривать, проходя в цикле по указателям. Например:
Pnew = Р0;
while (Pnew != NULL)
{
ShowMessage(Pnew->Fam + " " + Pnew->Nam + " " + Pnew->Par);
Pnew = Pnew->pr; // переход к новой структуре
}
Легко также делать в списке перестановки структур, их удаление и т.п. Для всех этих операций не надо ничего перемещать в памяти. Достаточно только изменять соответствующие ссылки в полях рг.
Раньше подобные списки широко использовались для создания в памяти стеков, очередей и других упорядоченных списков. Однако в C++Builder введены специальные типы данных TList и TStringList, которые ведут подобные Списки и имеют множество удобных методов для управления ими.
Задания для лабораторной работы №4
Вариант 1. Разработать алгоритм, интерфейс пользователя и программу, позволяющую в матрице размером 10х10 действительных чисел заменить нулями все элементы, превышающие среднее значение элемента.
Вариант 2. Разработать алгоритм, интерфейс пользователя и программу, позволяющую упорядочить строки матрицы размером 6х6 по возрастанию значений минимальных элементов этих строк.
Вариант 3. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить и записать в массив значения функции y = Ax2, при известных значениях x1, x2, x3, x4 и A.
Вариант 4. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать одномерный массив из 10 целых чисел и дополнить ее пятью числами и вычислить разность между суммой членов исходным и конечным массивами.
Вариант 5. Разработать алгоритм, интерфейс пользователя и программу, позволяющую в матрице размером 10х10 целых чисел вычислить сумму элементов верхней треугольной матрицы.
Вариант 6. Разработать алгоритм, интерфейс пользователя и программу, позволяющую в матрице размером 10х10 найти минимальный элемент в каждой строке.
Вариант 7. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить и вывести в форму первые 10 значений функции
Вариант 8. Разработать алгоритм, интерфейс пользователя и программу, позволяющую в массиве B(100) найти сумму 10 наибольших чисел.
Вариант 9. Разработать алгоритм, интерфейс пользователя и программу, позволяющую в одномерном массиве типа int менять местами соседние элементы с четными и нечетными числами.
Вариант 10. Разработать алгоритм, интерфейс пользователя и программу, позволяющую в одномерном массиве типа int . менять местами равноудаленные от концов массива элементы.
Вариант 11. Разработать алгоритм, интерфейс пользователя и программу, позволяющую почленно суммировать первые четыре элемента двух заданных двух массивов типа double, помещает результаты в третий массив.
Вариант 12.Разработать алгоритм, интерфейс пользователя и программу, позволяющую определить порядковый номер максимального и минимального по абсолютной величине элемента массива типа double
Вариант 13. Разработать алгоритм, интерфейс пользователя и программу, позволяющую определить и вывести в отдельный массив элементы заданного исходного одномерного массива целого типа, превышающих среднее арифметическое значение его элементов.
Вариант 14. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить в массиве целого типа квадратный корень из суммы квадратов значений элементов с нечетными номерами и среднее арифметическое значение элементов с четными номерами и возвращает наименьшее из этих двух данных.
Вариант 15. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить в массиве целого типа квадратный корень из суммы квадратов значений элементов с четными номерами и среднее арифметическое значение элементов с нечетными номерами и возвращает наименьшее из этих двух данных.
Вариант 16. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать массив из n элементов найти максимальный и минимальный элементы и поменять их местами
Вариант 17. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать двумерный массив 6х6 и найти минимальный элемент в каждом ряду и поместить их в первую строку.
Вариант 18. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значения функции на интервале – [-0,3; 0,5] с интервалом 0,001, и определить максимальный.
Вариант 19. Разработать алгоритм, интерфейс пользователя и программу, позволяющую задать матрицу 8х8 и вывести в текстовое окно элементы главной диагонали.
Вариант 20. Разработать алгоритм, интерфейс пользователя и программу, позволяющую
Вариант 21. Разработать алгоритм, интерфейс пользователя и программу, позволяющую задать матрицу NxM заполнить ее случайными числами, увеличить число столбцов на 5 и заполнить целыми числами.
Вариант 22. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать матрицу NxM найти максимальный и минимальный элементы и поменять их местами.
Вариант 23. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать два одномерных массива N и M элементов N>M . Заполнить первый массив целыми числами и переписать во второй массив M элементов из первого в обратном порядке.
Вариант 24. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать одномерный массив N целых чисел, значения которых распределены по нормальному закону и определить математическое ожидание и дисперсию.
Вариант 25. Разработать алгоритм, интерфейс пользователя и программу, позволяющую одномерный массив N целых чисел распределенных по Пуассоновскому закону и определить математическое ожидание и дисперсию
Вариант 26. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать две матрицы NxM, сложить эти матрицы и вычислить минимальный элемент в полученной матрице.
Вариант 27. Разработать алгоритм, интерфейс пользователя и программу, позволяющую. Вычислить значения функции
y = (x2 – a)*b2 на интервале от 2a до 2b при условии b> 2a с шагом
(b – a) /10
Вариант 28. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значения функции
Y = 2*x8 - 4,3*x6 + x5 – 1,78*x3+x - 1 при -1,5<=x<=1,5, ∆= 0,05
Вариант 29. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать матрицу NxM целых чисел и вычислить сумму членов каждого ряда.
Вариант 30. Разработать алгоритм, интерфейс пользователя и программу, позволяющую создать матрицу NxM целых чисел и вычислить сумму членов выше главной диагонали.
Лабораторная работа №5
Тема: создание структур в стиле С++
Все относится как к языку С, так и к С++. Но в С++ понятие структуры существенно расширено и приближено к понятию класса.
В частности, в структурах кроме рассмотренных ранее данных-элементов разрешается описывать функции-элементы. Рассмотрим это на примере использованной в предыдущих разделах структуры TPers. Давайте введем в эту структуру функцию-элемент Show, отображающую информацию, хранящуюся в структуре:
struct TPers
{
AnsiString Fam, Nam, Par;
unsigned Year;
bool Sex;
AnsiString Dep;
TPers * pr;
void Show() {
SfrowMessage ("Сотрудник отдела \""+Dep+"\" ""+Fam+" "+Nam+" " + Par+", "+IntToStr(Year)+" г.р., пол (Sex ? "мужской" : "женский"));
}
};
Функция Show отображает информацию вида: «Сотрудник отдела "Бухгалтерия" Иванов Иван Иванович, 1960 г.р., пол мужской».
Обращение к этой функции-элементу производится через переменную структуры операцией точка или через указатель на переменную операцией стрелка. Например:
Pers.Show();
Pnew->Show() ;
С использованием введенной функции Show пример просмотра списка можно упростить:
Pnew = Р0;
while{Pnew != NULL)
{
Pnew->Show();
Pnew = Pnew->pr;
}
В С++ можно вводить спецификаторы доступа к данным-элементам и функциям-элементам так же, как это делается в классе. Разрешаются спецификаторы public (открытый) и private (закрытый). Закрытые элементы структуры могут быть доступны только для функций-элементов этой структуры. Ни через объект, ни через указатель на объект доступ к ним невозможен. Закрытыми объявляются какие-то вспомогательные данные-элементы, не представляющие интереса для пользователя, а также вспомогательные функции (утилиты), требующиеся для работы основных функций-элементов структуры.
Открытые элементы структуры могут быть доступны для любых функций в программе. Основная задача открытых элементов состоит в том, чтобы дать клиентам структуры представление о возможностях, которые она имеет. Это открытый интерфейс структуры.
По умолчанию доступ к элементам структуры public — открытый. Если вам надо спрятать от пользователя какие-то элементы, укажите спецификатор private, завершающийся двоеточием, и помещайте после него объявления закрытых элементов. Все, что помещено после спецификатор private до конца структуры или до спецификатора public, будет скрыто от пользователя. Например, в следующем объявлении структуры:
struct MyStr {
int х, у;
int Get();
private: int a, b;
void F();
};
данные x и у и функция Get — открытые и могут использоваться при работе со структурой, а данные а и b и функция F — закрытые и ими может пользоваться только функция Get.
Задания для лабораторной работы №5
Вариант 1. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить число слов в предложении.
Вариант 2. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить число букв в предложении.
Вариант 3. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить число гласных букв в предложении.
Вариант 4. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить частоту одинаковых слов в предложении.
Вариант 5. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую составить список телефонов сотрудников и осуществлять поиск номера телефона по фамилии.
Вариант 6. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить частоту гласных букв в слове.
Вариант 7. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую преобразовать в прописные буквы весь введенный текст.
Вариант 8. Задача "Города". Широко известна игра "Города". Называется какой-нибудь город, допустим, "Саратов". Кончается на "в", значит требуется назвать другой город, у которого в названии первая буква "в". Это может быть "Воронеж". Следующий город должен начинаться на "ж" и т.д. Запрещено повторять название городов. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую из набора названий городов (все названия разные) строить цепочку максимальной длины.
Вариант 9. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить число согласных букв в предложении.
Вариант 10. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить число слов в двух предложениях.
Вариант 11. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую произвести инвертировать слово.
Вариант 12. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую упорядочить по первой букве список сочетаний из 4 случайных букв, задаваемых датчиком случайных чисел.
Вариант 13. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую упорядочить по двум начальным буквам фамилии список сотрудников, содержащий фамилию и инициалы.
Вариант 14. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую упорядочить по начальной букве фамилии список сотрудников, содержащий фамилию и инициалы.
Вариант 15. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую упорядочить по начальной букве фамилии и инициалам список сотрудников, содержащий фамилию и инициалы.
Вариант 16. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую упорядочить по начальной букве фамилии записи в ведомости успеваемости студентов.
Вариант 17. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую составить из нескольких слов (подлежащего, сказуемого и дополнения) предложение.
Вариант 18. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую распознать слово, содержащее прописные и строчные буквы.
Вариант 19. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую предупредить пользователя о том, что он вводит данные английским шрифтом.
Вариант 20. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую предупредить пользователя, что он забыл ввести в окно Edit данные.
Вариант 21. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую предупредить пользователя о том, что он вместо текста ввел в окно Edit цифры.
Вариант 22. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить какое четырехзначное число пользователь ввел в окно Edit.
Вариант 23. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить, какое двузначное число пользователь ввел в окно Edit и вывести это число словами.
Вариант 24. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить сколько слов содержится в тексте введенном в компонент RichEdit.
Вариант 25. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить частотность слов в тексте отображенном в компоненте RichEdit.
Вариант 26. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить какую запись из букв и цифр ввел пользователь в окно Edit.
Вариант 27. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую определить частотность букв в предложении.
Вариант 28. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую заменить в слове из прописных букв, все буквы кроме первой, на строчные.
Вариант 29. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую поменять в предложении первое и последнее слово местами.
Вариант 30. Разработайте алгоритм, интерфейс пользователя и программу, позволяющую разбить сложно-сочиненное предложение на два предложения.
Лабораторная работа №6