алгоритмизация и программирование 15 глава
4. Следующий способ предназначен для шифровки последовательностей нулей и единиц (или же, например, точек и тире). Пусть а 1, а 2,..., аn - такая последовательность. То, что предлагается в качестве ее шифра, - это последовательность b 1, b 2,..., bn, образованная по следующему правилу: b 1 = a 1; bi = l, если a i= ai - 1 и bi = 0 в противном случае (i = l, 2,..., n). Пользуясь изложенным способом, зашифровать и расшифровать данную последовательность нулей и единиц (или точек и тире). 5. Чтобы зашифровать текст, состоящий из 121 буквы, его можно записать в квадратную матрицу порядка 11 по строкам, а затем прочитать по спирали, начиная с центра (т.е. с элемента, имеющего индексы 6, 6). Зашифровать и расшифровать данный текст этим способом. Выбрав некоторую таблицу, разработать способ табличной замены каждого символа другим символом - его шифром. Зашифровать и расшифровать данный текст указанным способом. Контрольные вопросы 1. Как описывается переменная-строка, являющаяся экземплером класса string? 2. Как осуществляется доступ к элементам строки? 3. Перечислите типовые операции над строками. 4. Как выполняется инициализация строк? 5. Как выполняется ввод/вывод строк, являющихся объектом класса string? 6. Как выполняется сравнение строк? 7. Как выполняется конкатенация строк? 8. Может ли в процессе выполнения программы измениться фактическая длина строки? 9. Перечислите основные функции обработки строк. Пример выполнения лабораторной работы Задание. Найти сумму цифр введенного натурального числа. 1. Решение (математическая модель+словесный алгоритм). Натуральное число будем считывать в строковую переменную stroke. Обнулим сумматор s=0. Вычислим длину строки и, далее в цикле с параметром:
- каждый символ строки будем преобразовывать в число, получая тем саммым цифру введенного числа; - наращивать сумматор на величину полученной цифры числа. После окончания цикла выведем результат – сумму цифр числа s. Аргументы: stroka (string) – целое число, введенное с клавиатуры. Результаты: s (int) – Сумма цифр числа Промежуточные величины: счетчик i, количество элементов в строке n, численное представление символа введенной строки si – целого типа. 2. Программа решения данной задачи может иметь следующий вид:
#include <iostream> #include <string> using namespace std; int main() { string stroka; cout<<"Введите натуральное число:"<<endl; getline(cin,stroka); int si, s=0, n=stroka.length(); for (int i=0; i<=n-1;i++) { si=stroka[i]-'0'; s=s+si; } cout<<"Сумма цифр числа: "<<s<<endl; _getch(); return 0; } 14. Структуры 14.1. Порядок объявления и инициализации структур Структуры в Cи применяют для логического объединения связанных между собой данных. В структуру, в отличие от массива, можно объединять данные разных типов. В языке С++ структура является видом класса и обладает всеми его свойствами, но на данном этапе изучения языка С++ достаточно использовать структуры так, как они определены в языке Си: struct [ имя_типа ] { тип_1 элемент_1; тип_2 элемент_2; ... тип_n элемент_n; } [ список описателей ]; Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей: переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка: struct // Пример структуры, описывающей анкетные данные студентов { char fam[20]; char name[15]; int age; } stud[30], *ptr; В данном примере описывается структура, содержащая три поля: символьный массив на 20 элементов с именем fam, символьный массив на 15 элементов с именем name и целочисленная переменная с именемage, которые предназначены для хранения информации о фамилии, имени и возрасте студента соответственно. В списке описателей задан массив из 30 экземпляров этой структуры и указатель на структуру (который тоже задает экземпляр структуры, но идентифицируется не по имени экземпляра, а по имени указателя, хранищего адрес начала памяти, выделенной на экземпляр структуры, но без имени экземпляра). Если список описателей отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами, например:
struct student { char fam[20]; char name[15]; int age; }; int main() {... student stud[30], *ptr; ... return 0; } В данном примере описана глобальная структура данных типа структуры с заданием нового типа данных student. Задание же экземпляров этой структуры производится в рамках функции main(). Переменные структурного типа можно размещать и в динамической области памяти, для этого надо описать указатель на структуру и выделить под нее место: student *ptr=new student; // экземпляр структуры student *stud=new student[N];// массив экземпляров // структур Для инициализации структуры значениями используются те же методы, что и для обычных типов данных, но с небольшим дополнением: для доступа к полю структуры, экземпляр которой создан как обычная переменная или массив – через операцию «точка», а для обращения к полю структуры, экземпляр которой создан как указатель на структуру – через операцию «стрелка»: stud[1].fam=”Сидоров”; // Доступ по имени экземпляра stud[1].name=”Александр”; stud[1].age=23; prt->fam=”Петров”; // Доступ через указатель ptr->name=”Семен”; // на структуру ptr->age=21; На практике ввод значений полей структуры, описанной массивом экземпляров, осуществляется с использованием циклов с параметром: for (int i=0; i<N; i++) { cout<<”\nВведите фамилию студента: “; cin >>stud[i].fam; cout<<”\nВведите имя студента: ”; cin >>stud[i].name; cout<<”\nВведите возраст студента: ”; cin >>stud[i].age; } В данном примере количество студентов N должно быть определено (введено с клавиатуры) выше по тексту программы, до момента использования. 14.2. Программирование с использованием структур Для переменных одного и того же структурного типа определена операция присваевания, при этом происходит поэлементное копирование.
Сами по себе структуры являются лишь средством описания сложных типов данных, но основное их достоинство – удобство в поиске и анализе описанных в таком виде данных. Например, необходимо вывести на экран данные о всех студентах, чей возраст на данный момент не превышает 22 лет: k=0; for (j=0; j<N; j++) if (stud[j].age<=22) { cout<<”\nФамилия: ”<<stud[j].fam; cout<<”\tИмя: ”<<stud[j].name; cout<<”\tВозраст: ”<<stud[j].age; k++; } if (k==0) cout<<”\nТаких студентов нет!”; или о студентах, чья фамилия “ Петров ”: k=0; // f=true; for (j=0; j<N; j++) if (strcmp(stud[j].fam, “Петров”)==0) { cout<<”\nФамилия: ”<<stud[j].fam; cout<<”\tИмя: ”<<stud[j].name; cout<<”\tВозраст: ”<<stud[j].age; k++; // f=false; } if (k==0) cout<<”\nТаких студентов нет!”; // if (f) cout<<”\nТаких студентов нет!”; Предложенная в коментариях альтернатива bool f для рассмотренного в примере int k является более корректной реализацией требуемой операции. 14.3. Использование функций для работы с производными типами данных Структуру можно передавать в функцию и возвращать в качестве значения функции. В соответствии с модульным подходом к программированию целесообразно реализовывать вопросы поиска в отдельных функциях, например: void ZaprosFamily(student *k, char *f); int main() {... char *family; ... cout<<”\nВведите фамилию для поиска: ”; cin >>family; ZaprosFamily(kurs, family); ... return 0; } void ZaprosFamily(student *k, char *f) { k=0; for (j=0; j<N; j++) if (strcmp(k[j].fam, f)==0) { cout<<”\nФамилия: ”<<k[j].fam; cout<<”\tИмя: ”<<k[j].name; cout<<”\tВозраст: ”<<k[j].age; k++; } if (k==0) cout<<”\nТаких студентов нет!”; return; } В этом примере в функцию передаются два указателя: один типа student, другой типа char. Что же это за указатели, почему они передаются и что значат? Первый указатель есть указатель на тип данных student, то есть на структуру. Почему передается указатель? Потому, что экземпляры структуры описаны в виде массива экземпляров, а, известно, что имя массива есть указатель на нулевой элемент массива. Таким образом, мы передаем в функцию через указатель весь массив экземпляров структуры.
Второй указатель есть указатель на тип данных char, то есть на символьный тип данных. Через этот указатель в функцию передается строка для поиска интересующей нас фамилии студента. В результате работы функции ничего не возвращается (тип возвращаемого значения void), но нам ничего и не надо возвращать, так как функция и так выводит на экран список интересующих нас студентов.
Лабораторная работа № 14 ЦЕЛЬ РАБОТЫ: получение начальных навыков в объявлении, инициализации и использовании производных типов данных, совершенствование навыков описания и использования функций в программах. Выполнение работы: в соответствии с вариантом составить и реализовать программы. Задание I Используя структурированный тип – struct (структуру), составить программу ввода с клавиатуры списка объектов (не менее 10) на тему, заданную в соответствующем варианте задания, 4-6 характеристик этих объектов и вывода данных на экран в виде прямоугольной таблицы. Организовать поиск данных по одной из заданных характеристик. Информация должна быть достоверной. Ее можно почерпнуть из справочников, энциклопедий, реклам, книг и т.п. 1. Знаки зодиака 2. Промышленные товары 3. Продукты питания 4. Государства Европы 5. Русские писатели 6. Домашние и дикие животные 7. Цветы 8. Бытовая техника 9. Компьютеры и комплектующие 10. Драгоценные камни 11. Реки России 12. Виды спорта 13. Музыка 14. Материалы для ремонта квартиры 15. Вузы России 16. Сведения о студентах группы 17. Живопись эпохи Возрождения 18. Химические элементы таблицы Менделеева 19. Медицина 20. Туризм и отдых 21. Транспорт 22. Цитрусовые растения 23. Горы Северного Кавказа 24. Парфюмерия 25. Канцелярские товары
Задание II Вариант 1 1. Описать структуру STUDENT, содержащую следующие поля: фамилия и инициалы, номер группы, успеваемость (массив из пяти элементов). 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск записей, в которых средний бал студента больше 4,0; • поиск записей, в которых совпадают номера групп студентов. Вариант 2 1. Описать структуру AEROFLOT, содержащую следующие поля: название пункта назначения рейса, номер рейса, вместимость, тип самолета. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск записей, в которых пункт назначения совпадает с введенным с клавиатуры; • поиск записей, в которых вместимость самолета не менее введенной с клавиатуры.
Вариант 3 1. Описать структуру TRAIN, содержащую следующие поля: номер поезда, название пункта назначения рейса, время отправления, время в пути. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск поездов, отправляющихся после времени, введенного с клавиатуры в течении ближайших двух часов; • поиск поездов, отправляющихся в пункт назначения, введенный с клавиатуры. Вариант 4 1. Описать структуру TOURIST, содержащую следующие поля: номер маршрута, наименование начального пункта маршрута, наименование конечного пункта маршрута, время в пути. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск маршрутов, начинающихся в пункте, наименование которого введено с клавиатуры; • поиск маршрутов, общее время прохождения которых не превышает времени, введенного с клавиатуры. Вариант 5 1. Описать структуру NOTE, содержащую следующие поля: фамилия, имя, номер телефона. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск информации о человеке, чья фамилия введена с клавиатуры; • поиск информации о человеке, чей номер телефона введен с клавиатуры. Вариант 6 1. Описать структуру ZNAK, содержащую следующие поля: фамилия, имя, дата рождения, знак зодиака. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск информации о людях, родившихся сегодня; • поиск информации о людях, родившихся под веденным знаком зодиака. Вариант 7 1. Описать структуру PRICE, содержащую следующие поля: наименование товара, название магазина, в который товар отгружен, стоимость товара. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск информации о магазинах, в которые отгружен товар, название которого введено с клавиатуры; • поиск информации о товарах, стоимость которых не превышает стоимость, введенную с клавиатуры. Вариант 8 1. Описать структуру ORDER, содержащую следующие поля: фамилия налогоплательщика, инициалы налогоплательщика, ИНН налогоплательщика, сумма налогообложения. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск информации о налогоплательщике, фамилия которого введена с клавиатуры; • поиск информации о налогоплательщиках, чей суммарный налог превышает сумму, введенную с клавиатуры. Вариант 9 1. Описать структуру CAR, содержащую следующие поля: марка автомобиля, государственный регистрационный номер, фамилия владельца, инициалы владельца, пробег поквартально (массив из четырех элементов). 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск информации о владельцах автомобилей, марка которого введена с клавиатуры; • поиск информации об автомобилях, у которых суммарный пробег за 2 и 3 кварталы не превышает значение, введенное с клавиатуры. Вариант 10 1. Описать структуру STUDENT, содержащую следующие поля: фамилия, имя, отчество, серия паспорта, номер паспорта, дата выдачи. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск записей, в которых совпадает имя студента; • поиск записей, в которых совпадает месяц выдачи паспорта. Вариант 11 1. Описать структуру AEROFLOT, содержащую следующие поля: номер рейса, время отправления, время начала регистрации, тип самолета. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск рейсов, регистрация на которые уже началась по отношению ко времени, введенному с клавиатуры, но еще не закончилась (временем окончания регистрации считается время отправления минус 20 минут). Вариант 12 1. Описать структуру WORKER, содержащую следующие поля: фамилия и инициалы работника, дата рождения, год начала трудовой деятельности, год поступления на работу. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск сотрудников, чей трудовой стаж не менее введенного с клавиатуры; • поиск сотрудников, родившихся в течение месяца, введенного с клавиатуры. Вариант 13 1. Описать структуру TRAIN, содержащую следующие поля: номер поезда, название пункта назначения рейса, количество спальных, купейных и плацкартных мест (массив из трех элементов), количество свободных спальных, купейных и плацкартных мест (массив из трех элементов). 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск поездов, отправляющихся в пункт назначения, введенный с клавиатуры и имеющих количество свободных плацкартных мест, заданных пользователем. • вывод информации о поезде, номер которого введен с клавиатуры. Вариант 14 1. Описать структуру NOTE, содержащую следующие поля: фамилия, имя, дата встречи, место встречи. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск информации о встречах, назначенных на дату, введенную с клавиатуры; • поиск информации о встречах, назначенных в месте, введенном с клавиатуры. Вариант 15 1. Описать структуру PRICE, содержащую следующие поля: наименование магазина, наименование товара, количество товара на складе, стоимость товара. 2. Написать программу, выполняющую следующие действия: • ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей; • поиск информации о магазинах, в которых есть товар, название которого введено с клавиатуры; • поиск информации о магазинах, в которых есть товар, название которого ведено с клавиатуры, со стоимостью, не превышающей значение, введенное с клавиатуры. Контрольные вопросы 1. Какие типы данных относятся к простым, а какие к составным? 2. Что такое структура (struct)? 3. Как объявляются структуры? 4. Верно ли, что поля структуры должны иметь один и тот же тип? 5. Чем отличается структура от массива? 6. Какие операции допустимы над структурой в целом? 7. Как осуществляется ссылка на компоненты структуры? 8. Можно ли в качестве поля структуры описать структуру? Пример выполнения задания I лабораторной работы Задание. Используя структурированный тип struct (структуру), составить программу ввода с клавиатуры списка объектов (не менее 10) на тему, заданную в соответствующем варианте задания, 4-6 характеристик этих объектов и вывода данных на экран в виде прямоугольной таблицы. Организовать поиск данных по одной из заданных характеристик. Информация должна быть достоверной. Ее можно почерпнуть из справочников, энциклопедий, реклам, книг и т.п. Тема: Планеты Солнечной системы. 1. Решение (информационная модель+словесный алгоритм). Итак, в качестве примера примитивной реляционной базы данных приведем оформленные в виде таблицы некоторые сведения о планетах Солнечной системы. Таблица будет состоять из заголовка с именами полей, 9 записей (количество планет Солнечной системы) и 6 полей: номер по порядку, название планеты, ее расстояние от Солнца в астрономических единицах (астрономическая единица – это расстояние от Земли до Солнца, равное 149,6 млн.км), период обращения планеты вокруг Солнца в световых годах, наличие у планеты собственных спутников и основной химический состав атмосферы планеты. Предварительное составление подобной таблицы вручную называется построением информационной модели решаемой задачи. Именно с этого нужно начинать выполнение индивидуального задания.
Таким образом, таблица должна иметь следующий вид:
При составлении программы ввода-вывода данных в виде приведенной таблицы будем использовать одномерный массив mas размером 20, элементы которого имеют тип struct. Количество структур (записейóпланет) (фактическое количество элементов массива) – nбудем вводить с клавиатуры. Кроме описания переменных опишем еще три процедуры с именами list (формирование заголовка таблицы и вывод всех данных в виде таблицы на экран), vvod (ввод данных) и search (поиск информации по названию планеты). Ширина каждого столбца таблицы определяется значениями соответствующих полей записи, однако, при этом следует учитывать ширину имен полей в заголовке таблицы и ширину экрана. Поэтому при описании функции list стоит помнить о возможности форматированного вывода данных. Тогда программу можно представить в следующем виде: 2. Программа #include <conio.h> #include <iomanip> #include <iostream> #include <string>
using namespace std;
struct { string planeta; string sostav; float rasst,period; char sputnik; } mas[20]; int n; string buff;// переменная, использующаяся в программе для очистки буфера
void list(); void vvod(); void search();
int main() { cout<<"Введите количество планет: "; cin>>n; system("CLS"); vvod(); list(); search(); return 0; } void vvod() // Процедура ввода данных { system("color 17"); system("CLS"); for (int i=1; i<=n; i++) { system("CLS"); cout<<" Введите данные для "<<i<<" записи:"<<endl; getline(cin,buff); // очистка буфера cout<<" Название планеты - "; getline(cin,mas[i].planeta); cout<<" Расст.от Солнца - "; cin>>mas[i].rasst; cout<<" Период обращения - "; cin>>mas[i].period; do { cout<<"Наличие спутника (+,-) - "; char x = getch(); if ((x == '+') || (x == '-')) { cout<<x<<"\n"; mas[i].sputnik=x; } else cout<<"\r"; } while ((mas[i].sputnik!='+') && (mas[i].sputnik!='-')); cout<<" Основной состав атмосферы - "; cin>>mas[i].sostav; } } //Формирование заголовка таблицы и вывод данных в виде таблицы на экран void list() { system("CLS"); system("color 1f"); cout<<endl<<endl<<endl; cout<<" Таблица: 'ИССЛЕДОВАHИЕ КОСМОСА'"<<endl; system("color 17"); cout<<" ╓─────╥────────────╥─────────╥─────────╥────────╥───────────────╖"<<endl; cout<<" ║ N ║ Hазвание ║ Расcт. ║ Пеpиод ║Наличие ║Основной состав║"<<endl; cout<<" ║ N ║ Hазвание ║ Расcт. ║ Пеpиод ║Наличие ║Основной состав║"<<endl; cout<<" ║ №пп ║ планеты ║от Солнца║обpащения║спутника║ атмосферы ║"<<endl; cout<<" ╟─────╫────────────╫─────────╫─────────╫────────╫───────────────╢"<<endl; for (int i=1; i<=n; i++) { cout<<" ║ "<<i<<" ║"<<setw(10)<<mas[i].planeta<<" ║"<<setw(7)<<fixed<<setprecision(2)<< mas[i].rasst<<" ║"<<setw(7)<<mas[i].period; cout<<" ║"<<setw(5)<<mas[i].sputnik<<" ║"<<setw(15)<<mas[i].sostav<<"║"<<endl; } cout<<" ╙─────╨────────────╨─────────╨─────────╨────────╨───────────────╜"<<endl; system("pause"); }
void search() // Процедура поиска информации по названию планеты
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|