Лабораторный практикум
.pdf
|
Окончание |
№ |
Задание |
п/п |
|
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