Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторный практикум

.pdf
Скачиваний:
48
Добавлен:
15.06.2021
Размер:
3 Mб
Скачать

 

Окончание

Задание

п/п

 

18

Задать значения вещественным элементам матриц B и D 6 8 и

 

сформировать массивы Y и Z, состоящие соответственно из эле-

 

ментов матриц B и D, меньших заданного числа R

19

Задать значения целочисленным элементам матриц A и B 4 7 и

 

сформировать массивы Y и Z соответственно, каждый элемент

 

которых является суммой отрицательных элементов строк

20

Задать значения вещественным элементам матриц Р и Q 3 6 и

 

сформировать массивы R и T, состоящие из минимальных эле-

 

ментов столбцов матриц P и Q соответственно

21

Задать значения вещественным элементам матриц А и Q 5 5 и

 

сформировать массивы B и R, состоящие из элементов, больших

 

среднеарифметического значения элементов главной диагонали

22

Задать значения вещественным элементам матриц B и D 5 3 и

 

сформировать массивы Y и Z, состоящие соответственно из

 

элементов матриц B и D, попадающих в заданный интервал

 

[d; k]

23

Задать значения целочисленным элементам матриц M и N 6 6

 

и сформировать массивы С и D, состоящие из количества

 

элементов строк, значения которых больше значения элемента,

 

стоящего на главной диагонали, матриц M и N соответственно

24

Задать значения вещественным элементам матриц Р и Q 4 7 и

 

сформировать массивы R и T, состоящие из средних арифмети-

 

ческих значений столбцов матриц P и Q соответственно

25

Задать значения вещественным элементам матриц А и Q 3 5 и

 

сформировать массивы B и R, состоящие из количества положи-

 

тельных элементов столбцов матриц A и Q соответственно

123

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

Программирование задач с использованием структур

Цель работы: изучение возможности использования типа данных «структура» при программировании; получение навыков программирования задач с использованием комбинировавнного типа данных struct.

Теоретические сведения

Структура - группа логически связанных переменных, объединенных одним именем, которая обеспечивает удобное хранение родственных данных. Переменная, входящая в состав структуры, является ее элементом или членом структуры. Имя структуры - спецификатор типа.

Общий вид записи структуры:

struct имя типа

{

тип_поля 1 идентификатор_элемента1;

…………………………………

тип_поля n идентификатор_элементаn;

};

В качестве примера рассмотрим структуру «Преподаватель», которая имеет следующие характеристики.

Наименование элемента

Идентификатор

Тип данных

Фамилия преподавателя

name

char[]

Возраст

years

int

Ученая степень

step

char[]

Стаж работы

stag

int

124

Данная структура на языке С++:

struct Tutors

{

char name[25]; int years; char step[10]; int stag;

};

Примеры объявления переменных типа struct:

Tutors a,b[6];

или

struct Tutors

{

char name[25]; int years; char step[10]; int stag;

} a,b,c;

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

влюбом месте программы, но до их использования.

Доступ к элементам структуры:

переменная_типа_struct.идентификатор_элемента

Примеры доступа:

Tutors a,b[6]; a.years=12; b[0]. stag =20;

strcpy(a.name,"Ivanov");

В первом операторе присваивания была объявлена переменная а и элементу структуры years присвоено значение 12. Во втором операторе члену структуры stag нулевого компонента массива структуры b присвоено значение 20. Поскольку поле name является символьным массивом - строкой символов, то присвоить значение с помощью оператора присваивания a.name=”Ivanov” нельзя. Необходимо воспользоваться функцией копирования strcpy из одной строки в другую.

125

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

Например:

Tutors b[6]={

"Иванов",25,"ktn",3, "Петров",45,"no",20, "Сидоров",35,"ktn",6,

"Куликов",58,"dtn",30, "Мировой",45,"ktn",22,

"Васюков",43,"no",10, };

Примеры программирования

Пример 1. Сформировать массив, содержащий сведения о преподавателях:

фамилия;

возраст;

ученая степень;

стаж работы.

Вывести на экран сведения о преподавателях в алфавитном порядке, а также список преподавателей от с до d лет и список преподавателей, чей стаж работы больше k лет.

Решение. Начальные значения для элементов массива структуры «Преподаватель» зададим в программе. Оформим с использованием функций:

1)вывод содержимого массива;

2)сортировку массива в алфавитном порядке фамилий преподава-

телей;

3)формирование массива, содержащего информацию о преподавателях, чей возраст попадает в заданный интервал (введенный с клавиатуры);

4)формирование массива, содержащего информацию о препода-

вателях, чей стаж больше заданного значения (введенного с клавиатуры).

126

Структура «Преподаватель» для данного примера:

struct Tutors

 

{

 

char name[25];

// фамилия преподавателя

int years;

// возраст

char step[10];

// ученая степень

int stag;

// стаж работы

};

 

Функция вывода содержимого массива структур выводит значения в табличном виде:

void output(Tutors a[], int n)

{

cout << setw(26) << "Name|" << setw(9) << "Vozrast|" << setw(9) << "Stepen|" << setw(7) << "Stag|" << endl;

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

{

cout << setw(51) << "___________________________________" << endl;

cout << setw(25) << a[i].name << "|" << setw(8) << a[i].years << "|" << setw(8) << a[i].step << "|" << setw(6) << a[i].stag << "|";

cout << endl;

}

}

Функция output имеет два параметра, первый - указатель на первый элемент массива структуры «Преподаватель», а второй - количество элементов массива. До цикла с помощью cout выводится на экран шапка таблицы, а затем в цикле печатается подчеркивающая линия таблицы и значения текущего элемента массива структуры.

Функция сортировки массива с данными преподавателей, представленными в алфавитном порядке (или по возрастанию). Поскольку фамилия преподавателя определена как массив символов, воспользуем-

127

ся функцией лексикографического сравнения строк strcmp и алгоритмом сортировки одномерного массива:

void sort(Tutors a[],int n)

{

Tutors min; int n_min;

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

{

min=a[i];n_min=i; for(int j=i;j<n;j++)

if(strcmp(a[j].name,

min.name)<0)

{

min=a[j]; n_min=j;

}

a[n_min]=a[i]; a[i]=min;

}

}

По я сн е н ия к пр о гр ам м е . Функция strcmp сравнивает две строки лексикографически, и если они равны, то возвращает значение 0; если первая строка меньше второй, то выдает значение 1, а если больше, то 1.

Функция формирования массива, содержащего информацию о преподавателях, чей возраст попадает в заданный интервал (введенный с клавиатуры):

int IsYears(Tutors a[],Tutors b[],int n,int c, int d)

{

int k=0;

for(int i=0;i<n;i++) if(a[i].years>=c && a[i].years<=d)

b[k++]=a[i]; return k;

}

В данной функции в качестве параметров используется два массива структуры: первый - исходный массив, второй – результирующий; количество элементов исходного массива, возрастной интервал с и d. Ко-

128

личество элементов результирующего массива функция возвращает с помощью оператора return.

Функция формирования массива, содержащего информацию о преподавателях, чей стаж больше заданного значения (введенного с клавиатуры):

int IsStag(Tutors a[],Tutors b[],int n,int c)

{

int k=0;

for(int i=0;i<n;i++) if(a[i].stag>=c ) b[k++]=a[i];

return k;

}

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

ра return.

Функция main:

int main()

{

setlocale(LC_CTYPE,"Russian"); Tutors t[10]={

"Иванов",25,"ktn",3, "Петров",45,"no",20, "Сидоров",35,"ktn",6,

"Куликов",58,"dtn",30, "Егорова",45,"ktn",22, "Добрый",43,"no",10, "Янова",50,"ktn",28, "Борисова",60,"ktn",35, "Миронов",39,"no",17, "Ягодкин",45,"ktn",18

};

cout<<"Исходные данные"<<endl; output(t,10);

sort(t,10);

cout<<"Выходные данные"<<endl; output(t,10);

int c,d; cout<<"Введите min"; cin>>c;

129

cout<<"Введите max"; cin>>d;

Tutors b[10];

int k=IsYears(t,b,10,c,d); if(k!=0)

{

cout<<"c "<<c<<" do "<<d<<"let"<<endl; output(b,k);

}

cout<<"Введите стаж"; cin>>c; k=IsStag(t,b,10,c); if(k!=0)

{

cout<<"стаж >"<<c<<" лет"<<endl; output(b,k);

}

}

В основной функции задаются начальные значения для массива структуры «Преподаватель» и эти значения функцией вывода output в табличном виде выводятся на экран. Затем, используя функцию сортировки, выполняется сортировка данных о преподавателях в алфавитном порядке их фамилий, и результат данной сортировки также выводится на экран. Для формирования нового массива преподавателей Tutors с клавиатуры вводятся возрастные границы преподавателей, и если новый массив не пуст, то его содержимое отображается на экране. В конце программы формируется массив структур с данными о преподавателях, чей стаж больше значения, введенного с клавиатуры, и если этот массив сформирован, т.е. не пуст, то он выводится на экран. Результат выполнения программы приведен на рис.1.

Пример 2. Сформировать массив, содержащий сведения о количестве изделий, собранных сборщиками цеха за неделю.

Элементы структуры:

фамилия сборщика;

количество изделий, собранных им ежедневно в течение шестидневной недели, т.е. раздельно в понедельник, вторник и т.д.

Написать программу, выдающую на печать:

фамилию сборщика и общее количество деталей, собранных им за неделю;

130

Рис. 1. Результат выполнения программы к примеру 1

131

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

Решение. Определим структуру для хранения данных о рабочем:

struct Wokers

{

char name[25]; // фамилия сборщика

int kol[6]; // количество изделий по дням недели

};

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

Функция вывода информации о сборщиках и общим количестве, собранных каждым сборщиком деталей:

void output ( Wokers a[], int n)

{

cout<<setw(26)<<"Имя |"<<setw(5)<<"ПН |"<<setw(5)<<"ВТ|";

cout<<setw(5)<<"СР |"<<setw(5)<<"ЧТ |"<<setw(5);

cout<<"ПТН|"<<setw(5)<<"СУб|"<<setw(5)<< "Сумма"<<endl;

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

{

cout<<setw(61)<<"_______________"<<endl; cout<<setw(25)<<a[i].name<<"|";

int sum=0;

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

{

cout<<setw(4)<<a[i].kol[j]<<"|";

sum+=a[i].kol[j];

}

cout<<setw(4)<<sum<<endl;

}

}

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

132