Отпечатано в Издательстве ТПУ в полном соответствии

НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ

ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

 

УТВЕРЖДАЮ

Директор ИК

_____________ М.К. Сонькин

 

«____»_____________2011 г.

 

 

Т.Е. Мамонова

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

Тип «структура» в C++

Методические указания по выполнению лабораторных работ

по курсу «Информатика»

для студентов направлений 220000 – «Мехатроника и робототехника»,

220700 – «Автоматизация технологических процессов и производств».

 

 

Издательство

Томского политехнического университета

УДК 519.6

ББК 00000

А00

 

Мамонова Т.Е.

А00 Тип «структура» в C++. Методические указания по выполнению лабораторных работ по курсу «Информатика» для студентов I курса, обучающихся по направлениям 220000 – «Мехатроника и робототехника», 220700 – «Автоматизация технологических процессов и производств» / Т.Е. Мамонова. – Томск: Изд-во Томского политехнического университета, 2011. – 11 с.

УДК 519.6

ББК 00000

 

 

Методические указания рассмотрены и рекомендованы к изданию методическим семинаром кафедры интегрированных

компьютерных систем управления ИК

«1» сентября 2011 г.

 

Зав. кафедрой ИКСУ

доктор технических наук ______________ А.М. Малышенко

 

Председатель учебно-методической

комиссии ______________ В.Н. Шкляр

 

Рецензент

Доцент ИКСУ ИК НИ ТПУ кандидат технических наук

В.Н. Шкляр

 

© ГОУ ВПО «Томский политехнический

университет», 2011

© Мамонова Т.Е., 2011

© Оформление. Издательство Томского

политехнического университета, 2011

ЛАБОРАТОРНАЯ РАБОТА № 9

Тип «структура» в C++

Цель работы. Изучить тип структура на языке С++, уметь использовать его при программировании в программе Borland C++.

Теоретическая часть

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

Объявление типа структура

Struct имя_типа

{

тип_1 поле_1;

тип_2 поле_2;

тип_k поле_k;

} ;

Пример 1. Объявления типа структура.

struct Worker { // структура объединяет 4 переменных:

char fio[30]; // fio есть поле типа массив символов

int date, code; // date и code два поля типа int

float salary; // salary есть поле типа float

};

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

имя_типа_структура имя_переменной ë, имя_переменной …û;

После объявления переменной типа структура доступ к её полям осуществляется посредством операцииточка (.).

Например, после объявления Worker number1; получаем четыре переменные:

number1.fio, number1.date, number1.code, number1.salary,с которыми можно выполнять всё, что допустимо в C++ для переменных соответствующих типов, например, допустимы операторы:

 

cin >> number1.fio; number1.date = 1985;

if(number1.code == 11) number1.salary += 5000.33;

Правилами языка C++ разрешается полям типа структура самим иметь тип структура, например:

struct A {int aA; float bA;}; // структура A

//имеет два поля: aA и bA,

struct B{A fB; char chB[20];}; // поле fB имеет

// тип структура,

B x[10]; // объявлен массив x

//из 10 элементов типа B.

x[0].fB.aA = 2; // обращение к полю

// fB нулевого элемента массива.

x[1].chB[1] = ‘q’; // обращение к полю

//chB второго элемента массива.

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

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

Использование структур при написании собственных типов данных рекомендуется в том случае, если выполняется ряд условий:

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

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

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

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

Пример 1.

struct Point { int x,y;};

Point GetCursorPosition()

{

Point cursor;

return cursor;

}

В этом случае вызывающая функция будет получать результат типа Point, содержащий два значения – координаты x и y курсора.

Пример 2.

void DisplayCursorInfo()

{

Point cursor;

cursor = GetCursorPosition();

cout << cursor.x;

cout << cursor.y;

}

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

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

Пример 3.

struct Box3

{

bool visible;

double x_center, y_center, z_center;

double x_size, y_size, z_size;

};

Можно воспользоваться объявлением структуры vec3 и написать:

Пример 4.

struct box {

bool visible;

vec3 center;

vec3 size;

};

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

Пример 5.

void Display(const Box3& box) {

if ( box.visible) {

cout << “Center: (“ << box.center.x << “,” <<

box.center.y << “,” <<

box.center.z << “)” << endl;

}

}

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

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

Пример 6. Используя тип структура для передачи массивов, подсчитать в каждой строке m´n – матрицы суммы абсолютных величин элементов.

Для решения этой задачи создана функция sum_abs_in_rows, аргументом которой является структура Massiv_2, а тип результата – структура Massiv_1.

#include <iostream.h>

#include <iomanip.h>

#include <stdlib.h>

#include <conio.h>

const int nElem = 20;

struct Massiv_2{int Rows, Cols; float ar2[nElem][nElem];};

struct Massiv_1{int Cols; float ar1[nElem];};

// Прототипы функций:

Massiv_2 init (int m, int n); // инициализация двухмерного массива;

void out2 (Massiv_2 mas2); // вывод элементов двухмерного массива;

float absF (float x) { return x < 0 ? -x : x;} /* модуль вещественного числа; */

Massiv_1 sum_abs_in_rows (Massiv_2 mas2); /* суммы модулей в строках; */

void out1(Massiv_1 mas1); // вывод элементов одномерного массива.

void main(void)

{ clrscr();

randomize();

int M, N;

cout<<"Rows "<<"(<="<<nElem<<"): ";cin>>M;

cout<<"Cols "<<"(<="<<nElem<<"): ";cin>>N;

// Инициализируем двумерный массив псевдослучайными числами:

Massiv_2 m2= init(M,N);

// Выводим на экран элементы двумерного массива:

out2(m2);

// Формируем одномерный массив из сумм модулей элементов в строках

// двухмерного массива:

Massiv_1 m1 =sum_abs_in_rows(m2);

// Выводим полученный массив на экран:

out1(m1);

getch();

}

// Объявление функций.

Massiv_2 init(int m, int n)

{Massiv_2 mas2; mas2.Rows = m; mas2.Cols = n;

for(int i = 0; i < m; i++)

for(int j = 0; j < n; j++)

mas2.ar2[i] [j] = (float)(random(30) - 15) / 10;

return mas2;

}

void out2(Massiv_2 mas2)

{for(int i = 0; i < mas2.Rows; i++)

{for(int j = 0; j < mas2.Cols; j++)

cout << setprecision(2) << setw(5) << mas2.ar2[i] [j];

cout<<"\n";

}

}

Massiv_1 sum_abs_in_rows(Massiv_2 mas2)

{ Massiv_1 mas1;

float S;

mas1.Cols = mas2.Rows;

for(int i = 0; i<mas1.Cols; i++) mas1.ar1[i] = 0;

int k = -1;

for(int i = 0; i<mas2.Rows; i++)

{ S=0; ++k;

for(int j=0; j < mas2.Cols; j++) mas1.ar1[k] += absF(mas2.ar2[i] [j]);

}

return mas1;

}

void out1(Massiv_1 mas1)

{cout<<"\n";

for(int i = 0; i < mas1.Cols; i++)

cout << setprecision(2) << setw(5) << mas1.ar1[i]; }

Результат работы программы:

 

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

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

Пример 7. Неправильная структура

struct Line {

vec3 pt1, pt2;

double length;

};

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

Варианты заданий к лабораторной работе № 9

Решение каждого варианта должно использовать структуры для передачи массивов в качестве параметров и объявления типа результата функции.

Вариант 1.Вычислить суммы отрицательных элементов в каждом столбце двумерного массива.

Вариант 2. Вычислить суммы положительных элементов в каждой строке двумерного массива.

Вариант 3. В каждом столбце двумерного массива вычислить произведения элементов массива с чётной суммой индексов.

Вариант 4. В каждой строке двумерного массива вычислить произведения элементов массива с нечётной суммой индексов.

Вариант 5. Найти максимальные элементы в каждой строке двумерного массива.

Вариант 6. Найти минимальные элементы в каждом столбце двумерного массива.

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

Вариант 8. Вычислить сумму элементов, принадлежащих отрезку [Min; Max],в каждом столбце двумерного массива; Min означает наименьший, а Max – наибольший элемент двумерного массива.

Вариант 9. Найти максимальные по модулю элементы в каждой строке двумерного массива.

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

Вариант 11. Удалить из каждой строки двумерного массива все элементы, величина которых находится в отрезке [a, b], а освободившиеся в концах строк элементы заполнить нулями.

Вариант 12. Расположить в начале каждого столбца двумерного массива все элементы, целая часть которых лежит в отрезке[a, b], а потом – все остальные.

Вариант 13. В каждой строке двумерного массива вычислить количество элементов, лежащих в отрезке [a, b].

Вариант 14. В каждом столбце двумерного массива вычислить количество нулевых элементов.

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

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

· цель работы;

· задание;

· код программы;

· блок-схема;

· результаты работы программы;

· выводы по работе.

Список литературы

1. Ален И. Голуб. Правила программирования на С и С++. Пер. с англ.: – М.: Вильямс, 2001. – 241 с.

2. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2010.

3. Прата С. Язык программирования С++. Лекции и упражнения. СПб.: Питер, 2003. – 645 с.

 

Учебное издание

 

МАМОНОВА Татьяна Егоровна

ТИП «СТРУКТУРА» В С++

Методические указания по выполнению лабораторных работ

по курсу «Информатика» для студентов I курса, обучающихся по направлениям 220000 – «Мехатроника и робототехника»,

220700 – «Автоматизация технологических процессов и производств».

 

 

Отпечатано в Издательстве ТПУ в полном соответствии