Тема: Объявление и описание структуры

Определение и основные правила

Структуры — это составные типы данных, построенные с использованием дру­гих типов. Они представляет собой объединенный общим именем набор данных различных типов. Именно тем, что в них могут храниться данные разных типов, они и отличаются от массивов, хранящих данные одного типа.

Отдельные данные структуры называются элементами или полями. Все это на­поминает запись в базе данных, только хранящуюся в оперативной памяти компь­ютера.

Простейший вариант объявления структуры может выглядеть следующим об­разом:

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 … Тема: Объявление и описание структуры - student2.ru структура 2 … Тема: Объявление и описание структуры - student2.ru структура N …   Тема: Объявление и описание структуры - student2.ru 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 значений функции

Тема: Объявление и описание структуры - student2.ru

Вариант 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

Наши рекомендации