Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_раб_С++ Builder_2часть.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
1 Мб
Скачать
☆

Лабораторная работа № 2

Данные типа “структура” и их применение в программах С++

Цель лабораторной работы состоит в изучении методики применения данных типа «структура» в программах. Одновременно изучается техника применения редактора кода для работы с текстами отдельных программных модулей и применение программного отладчика C++ Builder. Изучается техника применения команд отладчика для поиска ошибок в исходных текстах программных модулей создаваемого приложения.

Общие сведения о данных типа “структура”

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

struct <ярлык_структуры> {

тип_данных переменная1;

тип_данных переменная2;

…………………………….;

}<имя_переменной>;

Ярлык структуры позволяет объявлять новые переменные структурного типа с указанным ярлыком. В объявлении структуры обязательно должнен быть задан или «ярлык_структуры» или «имя_переменной». Например, можно объявить такую структуру

struct point {

float x;

float y;

float z;

};

или структуру в таком виде

struct {

float x;

float y;

float z;

}P1;

В языке програмирования С++ структуры наделены дополнительными возможностями:

первое- это можно в качестве элемента структуры указывать определение функции

struct point {

float x;

float y;

float z;

show()

{ printf(”/n %f”, x);

}

};

второе – можно указывать в структуре спецификаторы доступа к данным –элементам и функциям-элементам, как это делается в классах. Разрешается применять спецификаторы public(открытый) и private(закрытый). Закрытые элементы структуры могут быть доступны только для функций-элементов этой структуры. Ни через объект, ни через указатель на объект доступ к ним невозможен. Закрытыми объявляются какие-то вспомогательные данные-элементы не представляющие интереса для пользователя, а также вспомогательные функции(утилиты), требующиеся для работы некоторых других основных функций-элементов структуры.

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

struct MyStr{

int x,y;

int Get();

private:

int a,b;

void F();

};

данные х и у и функция Get() – открытые и могут использоваться при работе со структурой, а данные а и b и функция F() – закрытые и ими может пользоваться только функция Get().

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

struct pole_bit {

unsignit char x : 3;

unsignit char y : 5;

};

Постановка задачи лабораторной работы. Необходимо создать с мощью Consol Wizard исполняемый файл программы, в которой задаются координаты для трех точек на плоскости и затем строится поле и на этом поле в масштабе показываются введенные точки.

Порядок действий и команд при выполнении данной лабораторной работы:

  1. На диске D:\ создайте папку Lab_7.

  2. После запуска в работу С++ Builder в меню File выполните команду New. В результате откроется окно New Items, где выбирите Consol Wizard.

  3. В окне редактора кодов наберите следующий исходный текст программы и выполните компиляцию

/***************************************************/

// Вычислить площадь треугольника,заданного своими

// вершинами P1(x1,y1), P2(x2,y2), Р3(x3,y3)

/***************************************************/

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <alloc.h>

#define Xmax 52 /* 52 */

#define Xmin 5 /* 1 */

#define Ymax 21 /* 25 */

#define Ymin 3 /* 1 */

struct point {

float x,y;

} k[2] ;

/* функция задания координат вершин треугольника*/

point * scan_xy( void )

{

gotoxy(44,1);

printf("Введите координаты вершин треугольника:");

gotoxy(62,2);

printf(" вершина P1(x1,y1) ");

gotoxy(66,3);

printf(" x1="); scanf("%f",&k[0].x);

gotoxy(66,4);

printf(" y1="); scanf("%f",&k[0].y);

gotoxy(62,5);

printf(" вершина P2(x2,y2) ");

gotoxy(66,6);

printf(" x2="); scanf("%f",&k[1].x);

gotoxy(66,7);

printf(" y2="); scanf("%f",&k[1].y);

gotoxy(62,8);

printf(" вершина P3(x3,y3) ");

gotoxy(66,9);

printf(" x3="); scanf("%f",&k[2].x);

gotoxy(66,10);

printf(" y3="); scanf("%f",&k[2].y);

return k;

}

/* функция вычисления коэффициентов для */

/* масштабирования координат рисунка */

float * m_ko( struct point k[] )

{

float xma,xmi,ymi,yma;

static float * mk;

int i;

xma = k[0].x; xmi = k[0].x;

yma = k[0].y; ymi = k[0].y;

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

{

if( k[i].x > xma)

xma = k[i].x;

if( k[i].x < xmi)

xmi = k[i].x;

}

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

{

if( k[i].y > yma)

yma = k[i].y;

if( k[i].y < ymi)

ymi = k[i].y;

}

mk = ( float *) calloc( 2, sizeof( float ));

* mk= yma;

*( mk + 1 ) = xma;

return mk;

}

/* функция расчета масштабированных координат*/

/* вершин треугольника и их вывод на рисунок*/

void out_point( struct point k[], float mk[])

{ int i;

double x,y;

float s;

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

{

y = Ymax - ((k[i].y * (Ymax - Ymin))/mk[0]);

x = Xmin + ((k[i].x * (Xmax - Xmin))/mk[1]);

gotoxy( floor(x), floor(y)); textcolor(MAGENTA);

textbackground(WHITE); textcolor(BLACK );

cprintf("o"); gotoxy( floor(x) + 1, floor(y));

textmode(LASTMODE); textbackground(WHITE);

textcolor(BLACK);

cprintf("P%d\a",i + 1);

textmode(LASTMODE);

s = k[0].x *(k[1].y-k[2].y) + k[1].x *(k[2].y-k[0].y);

s = ( s + k[2].x *(k[0].y-k[1].y))/2;

gotoxy(40,23);

printf("Площдьа треугольника S=%f",fabs(s));

textbackground(WHITE);

gotoxy(1,23); textcolor(BLACK);

printf(" Лабораторная "); gotoxy(1,24);

printf(" работа N6 ");

textbackground(WHITE);

gotoxy(50,24); textcolor(BLACK);

printf(" Нажать любую клавишу ");

textmode(LASTMODE); gotoxy(3,22);

printf("0.00\t|\t|\t|\t|\t|\t%f ---> X ",mk[1]);

gotoxy(1,2);

printf("%f",mk[0]);

gotoxy(2,3); printf("Y ^");

gotoxy(4,4); printf("|");

gotoxy(4,5); printf("|");

gotoxy(4,6); printf("-");

gotoxy(4,10); printf("-");

gotoxy(4,15); printf("-");

gotoxy(4,20); printf("-");

gotoxy(78,24);

}

}

/*функция окрашивания поля под рисунок */

void pole( void)

{

int x,y;

for( y = Ymin; y <= Ymax; y++ )

{ for( x = Xmin; x <= Xmax; x++ )

{

gotoxy( x,y ); textbackground(GREEN );

cprintf(" ");

}

}

}

//------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

clrscr();

scan_xy();

pole();

out_point( k, m_ko(k));

getch();

return 0;

}

//---------------------------------------------------------------------------

Контрольные вопросы к лабораторной работе

      • Объясните, в каких задачах необходимо объявлять переменные типа “структура”.

      • Показать возможные варианты объявления структур.

      • Объясните правила записи данных и чтения данных в полях переменной структурного типа и указателя на структуру.

      • Показать формат объявления структур с битовыми полями.

      • Какие структуры используются в программах лабораторной работы.

Команды и техника применения программного отладчика С++ Builder

Дата _______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

Складови знань

Бали для

оцінювання знань

Уміння змінювати та

налагоджувати алгоритм

С++ програми

Знання програмного та

файлового забезпечення

лабораторної роботи

2,0

1,0

Набрані бали

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)