Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

алгоритмизация и программирование 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. Программа решения данной задачи может иметь следующий вид:

3. Результат работы программы: Введите натуральное число: Сумма цифр числа: 36
#include <conio.h>

#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 млн.км), период обращения планеты вокруг Солнца в световых годах, наличие у планеты собственных спутников и основной химический состав атмосферы планеты.

Предварительное составление подобной таблицы вручную называется построением информационной модели решаемой задачи. Именно с этого нужно начинать выполнение индивидуального задания.


 

Таким образом, таблица должна иметь следующий вид:

№пп. Название планеты Расст. от Солнца (в а.е.) Период обращения (в св.г.) Наличие спутника Основной состав атмосферы
  Меркурий 0.387 0.21 - Ar, Ne, He
  Венера 0.700 0.61 - СО2
  Земля 1.000 1.00 + N,O2
  Марс 1.520 1.88 - СО2
  Юпитер 5.200 11.90 + Н2, СН4, NH3
  Сатурн 9.500 29.46 + СН4, Н2, Не
  Уран 19.180 84.00 + Н2, Не, СН4
  Нептун 30.070 164.80 + СН4, Н2, Не
  Плутон 39.400 247.70 + CH4 – метан

При составлении программы ввода-вывода данных в виде приведенной таблицы будем использовать одномерный массив 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...