Основы работы со структурами в языке программирование С++

 

Введение


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

Глава 1. Работа со структурами в среде Borland C++ Builder


.1 Структуры в С++


Структурой называется совокупность логически связанных переменных различных типов, сгруппированных под одним именем для удобства дальнейшей обработки. Структура - это способ связать воедино данные разных типов и создать пользовательский тип данных. Структуры в С++ используются для логического и физического объединения данных произвольных типов, так же как массивы служат для группирования данных одного типа.

В общем случае при работе со структурами следует выделить четыре момента:

объявление и определение типа структуры,

объявление структурной переменной,

инициализация структурной переменной,

использование структурной переменной.

Структура в С++ задаётся следующим образом:


:

:

: structdirection {

члены (элементы) структуры

};()

{O; //Объявили переменную O типа TPoint

}


Так описывается структура в коде программы. Стоит обратить внимание, что при объявлении структуры нет круглых скобок

() //НЕВЕРНО


а после закрывающейся фигурной скобки стоит точка с запятой.

Объявление структуры всегда должно начинаться с ключевого слова struct. Необязательно, чтобы структура имела имя, но тогда такая структура обязательно должна иметь структурные переменные, объявленные между закрывающей фигурной скобкой и точкой с запятой. Обязательно в объявлении структуры должны присутствовать фигурные скобочки, они обрамляют тело структуры, в котором объявляются её атрибуты (элементы). Структурные переменные, при объявлении структуры, указывать необязательно.

Структурная переменная может быть задана уникальным образом://Определение анонимного типа структуры


{

char name[20];_name[40];_name[20];

} copymy; //Создание структурной переменной


.2 Обращение к структуре


#include <conio.h>

#include <iostream.h>

structTPoint //Объявили новую структуру TPoint.

{x; //Первый параметрy; //Второй параметр

}; //После описания структуры ставят точку с запятой()

{();O; //Объявили переменную O типа TPoint.x=30; //Присвоили первому параметру значение.y=100;//Присвоили второму параметру значение();

}


В этом коде была объявлена переменная Oтип данных которой соответствует структуре TPoint

У структуры TPoint было объявлено 2 параметра. (x,y). При обращении к O программист должен обратиться к определенному параметру из структуры к которой Оотносится.

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

,А; //Объявили переменные O и A типа TPoint,А; //Объявили переменные O и A типа TPoint

Код С++ структуры

#include <conio.h>

#include <iostream.h>//Объявили новую структуру TPoint.

{x; //Первый параметрy; //Второй параметр

}; //После описания структуры ставят точку с запятой()

{();O, A; //Объявили переменные типа TPoint.x=30; //Присвоили первому параметру значение.y=100;//Присвоили второму параметру значение.x=130; //Присвоили первому параметру значение.y=10;//Присвоили второму параметру значение();

}


Теперь в памяти хранятся 2 сгруппированные переменные типа TPoint. Каждой переменной соответствует по 2 параметра типа int

Теперь с элементами A.x,A.y,O.x,O.y можно работать как с обычными переменными int. Просто в примере был показан способ создания своего типа данных, в котором в одной переменной сгруппировано две. (В переменной O - две переменных типа int и в переменной Адве переменных типа int)

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

Можно сказать, что в предыдущей программе было объявлено две структуры Структура А и структура О.


Код С++ структуры

#include <conio.h>

#include <iostream.h>//Объявили новую структуру TPoint.

{x; //Первый параметрy; //Второй параметр

}; //После описания структуры ставят точку с запятой()

{();O, A; //Объявили переменные типа TPoint.x=30; //Присвоили первому параметру значение.y=100;//Присвоили второму параметру значение=O; //теперь A.x=O.x=30, A.y=O.y=100;

//Выводим на экран структуры О и А

cout<<A.x<<endl;<<A.y<<endl;<<O.x<<endl;<<O.y<<endl;

getch();

}


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

Работа со структурной переменной обычно сводится к работе с отдельными полями структуры. Доступ к членам структуры осуществляется посредством оператора . (точка):


:

:

: direction.x = 0;.y = 0;.z = 1;


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

Под структурную переменную выделяется область памяти не менее суммы длин всех полей структуры,например,


struct list

{name[20];_name[40];

int;

}L;


В данном примере объявляется тип структура с именем list, состоящая из трех полей, и переменная с именем L типа structlist,при этом для переменной L выделяется 64 байта памяти.


.3 Использование структур


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

Создаваемый тип данных не имеет собственного поведения. То есть объект такого типа рассматривается как пассивный набор данных.

Члены данных создаваемого типа данных не могут находиться во взаимно противоречивом состоянии. То есть любая комбинация значений членов структуры является допустимой.

Для более сложных пользовательских типов данных в языке С++ используются классы.

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

В качестве типов членов структуры могут использоваться ранее объявленные пользовательские типы.

Над структурами возможны следующие операции:

присваивание значений одной структурной переменной другой структурной переменной, при этом обе переменные должны иметь один и тот же тип;

получение адреса переменной с помощью операции &;

осуществление доступа к членам структуры.

Присваивание значения одной переменной другой выполняется путем копирования значений соответствующих полей, например:


struct point pt={105,15},pt1;=pt;


В результате выполнения этого присваивания в pt1.x будет записано значение 105, а в pt1.y - число 15.

Объекты структур можно присваивать, передавать в качестве аргументов и возвращать в качестве значений функций. Другие операторы (такие как == и != не определены).

Существует три способа передачи структур функциям:

передача компонентов структуры по частям;

передача целиком структуры;

передача указателя на структуру.


voidshowrect(struct point p1,struct point p2)

{("Левый верхний угол прямоугольника:%d %d\n",.x, p1.y);("Правый нижний угол прямоугольника:

%d %d\n", p2.x, p2.y);

}

При вызове такой функции ей надо передать две структуры:

struct point pt1={5,5},={50,50};(pt1,pt2);


Функция, возвращающая структуру:

(intx,inty) /*makepoint - формирует точку по компонентам x и y*/

{point temp;.x = x;.y = y;temp;

}


Результат работы этой функции может быть сохранен в специальной переменной и выведен на экран:


struct point buf;=makepoint(10,40);("%d %d\n",buf.x,buf.y);


После выполнения этого фрагмента на экран будут выведены два числа: 10 и 40.

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

Объекты структур могут являться элементами массивов.


.4 Указатели на структуру


Если функции передается большая структура, то эффективнее передать указатель на эту структуру, нежели копировать ее в стек целиком. Указатель на структуру по виду ничем не отличается от указателей на обычные переменные.


Формат: structpoint *pp;


Где pp - указатель на структуру типа structpoint, *pp - сама структура, (*pp).x и (*pp).y - члены структуры.

Скобки (*pp).x необходимы, так как приоритет операции (.) выше приоритета операции (*). В случае отсутствия скобок *pp.x понимается как *(pp.x).

Инициализация указателя на структуру выполняется так же, как и инициализация указателей других типов: structpointvar1, *S1;

здесьvar1 - структурная переменная, *S1 - указатель на структуру.

Для определения значения указателя ему нужно присвоить адрес уже сформированной структуры: S1 = &var1;

Теперь возможно еще одно обращение к элементам структуры: (*S1).name.

Указатели на структуры используются весьма часто, поэтому для доступа к ее полям была введена короткая форма записи. Если р - указатель на структуру, то p ? <поле структуры>зволяет обратиться к указанному полю структурной переменной.

Знак ? (стрелка) вводится с клавиатуры с помощью двух символов: '-' (минус) и '>' (больше). Например, pp ? x; pp ? y.

Операторы доступа к полям структуры (.) и (?) вместе с операторами вызова функции () и индексами массива [] занимают самое высокое положение в иерархии приоритетов операций в языке C.

Указатели на структуру используются в следующих случаях:

доступ к структурам, размещенным в динамической памяти;

создание сложных структур данных - списков, деревьев;

передача структур в качестве параметров в функции


.5 Вложенные структуры


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

Тип вложенной структуры должен быть объявлен раньше. Кроме того, структура не может быть вложена в структуру того же типа.

Объявление вложенной структуры:


{,y;

};

{point LUPoint, RDPoint;

charBorderColor[20];

};;

В переменной Rectдва поля LUPoint (точка, соответствующая левому верхнему углу прямоугольника) и RDPoint (точка, соответствующая правому нижнему углу) представляют собой вложенные структуры. Для доступа к полю вложенной структуры следует сначала обратится к внешней структуре, затем к вложенной: Rect.LUPoint.x.

Пример создания и использования вложенной структуры:

={10,5,50,25,"White"};("Параметры прямоугольника:\n");("Координаты левого верхнего угла %d %d\n", Rect.LUPoint.x, Rect.LUPoint.y);("Координаты левого верхнего угла %d %d\n", Rect.RDPoint.x, Rect.RDPoint.y);

printf("Цветграницы: %s\n", Rect.BorderColor);

В качестве поля структуры также можно использовать указатели на любые структуры, в том числе на структуры того же типа:

structPointList

{,y;* LastPoint;

};


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


.6 Использование синонима типа


Ключевое слово typedefпозволяет в программе создать синоним типа, который может использоваться для объявления переменных, параметров функций. Синоним можно создать для любого существующего типа (int, floatи т. д.), в том числе для пользовательского типа - структуры или массива.

Пример 1. Создание синонима структуры:


{,y;

} POINT;


Идентификатор POINT представляет собой синоним типа point. С помощью синонима POINT можно объявить переменную: POINTpt1;

или передать переменную в функцию:


voidShowRect(POINT pt1,POINT pt2);


Пример 2. Создание синонима массива:

[4][5];


Идентификатор mas обозначает тип - двумерный массив, состоящий из четырех строк и пяти столбцов. Этот идентификатор можно использовать для объявления переменной - массива A:

;

или для передачи массива в функцию:

voidFormMas(mas A,intm,int n);


1.7 Типичные ошибки при разработке структур


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

Например, неправильной структурой будет:


:

:

:

: structLine {,pt2;length;

};


В данном случае член length может быть вычислен на основании pt1 и pt2. Хранение значение length в структуре нарушает вторую рекомендацию по использованию структур. Кроме расхода памяти для хранения избыточной информации программист получает намного более сложную проблему: необходимость синхронизации данных. При каждом изменении любого из членов структуры придётся пересчитывать значение length.

Более утончённые примеры ошибок:


:

:

: // Прямоугольник на плоскости

struct Box2 {pt1, pt2, pt3, pt4;

};

:

:

:

:

: // Окружность в трехмерном пространствеCircleIn3D {plane; // Плоскость, в которой лежит окружностьcenter;;

};


Глава 2. Разработка приложений с использованием структур в С++


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



Вычисляется это следующим образом:


dt1.day = StrToInt(LabeledEdit1->Text);

dt1.month = StrToInt(LabeledEdit2->Text);.year = StrToInt(LabeledEdit3->Text);.century = dt1.year/100+1;.decade = 10*(dt1.year/10-10*(dt1.century-1));((dt1.month < 3)||(dt1.month == 12)) {.season = "зима";

}if (dt1.month < 6) {.season = "весна";

}if (dt1.month < 6) {.season = "лето";

}dt1.season = "осень";->Lines->Add("Этотчеловекродилсяв "+IntToStr(dt1.decade)+

"- годах "+IntToStr(dt1.century)+"-века. Время года - "+dt1.season);


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

(вычисления площади, типа и угла треугольника).


tr.a = StrToFloat(LabeledEdit4->Text);.b = StrToFloat(LabeledEdit5->Text);.c = StrToFloat(LabeledEdit6->Text);

float p = (tr.a+tr.b+tr.c)/2;

float area = sqrt(p*(p-tr.a)*(p-tr.b)*(p-tr.c));->Lines->Add("площадь = "+FloatToStr(area));



tr.a = StrToFloat(LabeledEdit4->Text);.b = StrToFloat(LabeledEdit5->Text);.c = StrToFloat(LabeledEdit6->Text);max = tr.a;= tr.b*tr.b+tr.c*tr.c;(tr.b>max) {= tr.b;= tr.a*tr.a+tr.c*tr.c;

}(tr.c>max) {= tr.c;= tr.b*tr.b+tr.a*tr.a;

}(max*max-smt> 0) {->Lines->Add("тупоугольный");

}if (max*max-smt == 0) {->Lines->Add("прямоугольный");

}Memo2->Lines->Add("остроугольный");



tr.a = StrToFloat(LabeledEdit4->Text);.b = StrToFloat(LabeledEdit5->Text);.c = StrToFloat(LabeledEdit6->Text);max = tr.a;= tr.b*tr.b+tr.c*tr.c;= 2*tr.b*tr.c;(tr.b>max) {= tr.b;= tr.a*tr.a+tr.c*tr.c;= 2*tr.a*tr.c;

}(tr.c>max) {= tr.c;= tr.b*tr.b+tr.a*tr.a;= 2*tr.b*tr.a;

}

float angle = acos((smt - max*max)/smot);

Memo2->Lines->Add("Наибольшийугол"+FloatToStr(angle));


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



ln.x1 = StrToFloat(LabeledEdit7->Text);.y1 = StrToFloat(LabeledEdit8->Text);.x2 = StrToFloat(LabeledEdit9->Text);.y2 = StrToFloat(LabeledEdit13->Text);k = (ln.y2-ln.y1)/(ln.x2-ln.x1);b = ln.y1-k*ln.x1;->Lines->Add("y = "+FloatToStr(k)+"x + "+FloatToStr(b));



ln.x1 = StrToFloat(LabeledEdit7->Text);.y1 = StrToFloat(LabeledEdit8->Text);.x2 = StrToFloat(LabeledEdit9->Text);.y2 = StrToFloat(LabeledEdit13->Text);k = (ln.y2-ln.y1)/(ln.x2-ln.x1);->Lines->Add("уголнаклона- "+FloatToStr(atan(k))+" градусов");


ln.x1 = StrToFloat(LabeledEdit7->Text);.y1 = StrToFloat(LabeledEdit8->Text);.x2 = StrToFloat(LabeledEdit9->Text);.y2 = StrToFloat(LabeledEdit13->Text);k = (ln.y2-ln.y1)/(ln.x2-ln.x1);b = ln.y1-k*ln.x1;c = -b/k;->Lines->Add("пересечениесосью x: "+FloatToStr(c));->Lines->Add("пересечениесосью y: "+FloatToStr(b));


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



a.x = StrToFloat(LabeledEdit10->Text);.y = StrToFloat(LabeledEdit11->Text);.x = StrToFloat(LabeledEdit12->Text);.y = StrToFloat(LabeledEdit14->Text);(b,b,e);(a,b,d);(e,d,b);(a,b,e);->Lines->Add("a+b^2+(a+b) = "+FloatToStr(e.x)+" + "

+FloatToStr(e.y)+"i");



a.x = StrToFloat(LabeledEdit10->Text);.y = StrToFloat(LabeledEdit11->Text);.x = StrToFloat(LabeledEdit12->Text);.y = StrToFloat(LabeledEdit14->Text);ma = sqrt(a.x*a.x + a.y*a.y);= sqrt(b.x*b.x + b.y*b.y);->Lines->Add("|a| = "+FloatToStr(ma));->Lines->Add("|b| = "+FloatToStr(mb));



a.x = StrToFloat(LabeledEdit10->Text);.y = StrToFloat(LabeledEdit11->Text);.x = StrToFloat(LabeledEdit12->Text);.y = StrToFloat(LabeledEdit14->Text);.x = a.x; e.y = -a.y;.x = b.x; d.y = - b.y;->Lines->Add("число, сопряженноеa: "+FloatToStr(e.x)+

"+"+FloatToStr(e.y)+"i");->Lines->Add("число, сопряженное b: "+

FloatToStr(d.x)+"+"+FloatToStr(d.y)+"i");

Для того, чтобы программа понимала откуда такие объекты, ранее были объявлены соответствующие структуры следующего вида:

struct Date {// структурадатаday;month;year;decade; season;

int century;

} dt1; // объявление переменной этой структуры

structTriangle { // структура Треугольник

float a;b; c;

} tr; // объявление переменной этой структуры

structLine { // структура для прямой линии

float x1;

float y1;x2;y2;

} ln; // объявление переменной этой структуры

structComplex { // структура для комплексных чисел

float x;

float y;

} a,b,e,d; // объявление переменных этой структуры


Заключение

программирование структура приложение

В целях подробного просмотра возможностей работы со структурами в С++ было разработано приложение содержащее различные структуры и выполняющее самого различного вида операции над ними. В ходе разработки программы, было создано четыре вида структур, которые характеризуют дату (время), свойства треугольника, свойства прямой и свойства комплексных чисел. С помощью различных задач, были приведены различные способы работы со структурами. Так как, структуры это «мини» классы, они очень схожи в объявлении и имеют схожие свойства. Структура тоже, отчасти, новый тип данных, но в узком смысле этого слова. У нас структуры содержат различного рода информацию и свойства одного определенного понятия. Структуру можно один раз описать и с помощью разных объявленных переменных использовать как несколько структур с одинаковыми свойствами. Мы воспользовались этим свойством структур и выполнили несколько операций над такими структурами, отличающимися друг от друга лишь названием (две прямых xи у, два комплексных числа а и b).

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


Использованная литература


·Громов Ю. «Программирование на языке C»

·Вальпа О. «Borland C++ Builder»

·Златопольский Д.М. «Сборник задач по программированию»

·Прата С. «Язык программирования С++»

·Культин Н. Б. «Основы программирования в Delphi 7»

·«Borland C++ Builder. Освой самостоятельно за 21 день»

·Дейтел Х., Дейтел П «Как программировать на C++»

·Крупник А.Б. «Изучаем C++»

·Архангельский, «С++ Справочное пособие»

·«Объектно-ориентированное программирование в C++»

·Липпман С., Лажойе Ж. «Язык программирования C++»

·Страуструп Б. «Язык программирования C++»

·Павловская Т.А., Щупак Ю.А. «С и С++ Структурное программирование»


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

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ