- •Содержание
- •Предисловие
- •1. Основные понятия алгоритмизации и программирования
- •1.1. Этапы решения задач на эвм
- •1. Постановка задачи:
- •2. Формализация (анализ и исследование задачи, модели, представление ее в виде уравнений, соотношений, ограничений и т.П.):
- •Понятие моделирования
- •Отладка программы
- •Тест и тестирование программы
- •1.2. Основы алгоритмизации
- •Свойства алгоритма
- •Критерии качества алгоритма
- •Порядок выполнения алгоритма
- •Способы описания алгоритмов
- •Структурограмма
- •Синтаксическая диаграмма (формулы Бэкуса-Наура)
- •Правила построения блок-схем
- •Общие правила построения схемы алгоритма задачи
- •Типы алгоритмов
- •Виды алгоритмов
- •Базовые алгоритмические конструкции
- •Примеры команды если
- •1.3. Теоретические основы программирования
- •Арифметические выражения
- •Арифметические выражения записываются по следующим правилам:
- •Лабораторная работа № 1 Запись арифметических выражений
- •Задание I
- •Задание II
- •Контрольные вопросы
- •2. Программирование алгоритмов линейной структуры
- •2.2. Основные понятия языка
- •2.3. Данные и способы их организации
- •Порядок объявления и инициализации переменных
- •2.4. Стандартные простые типы данных
- •2.5. Структура программы
- •2.6. Операторы
- •Оператор «выражение»
- •2.7. Организация ввода/вывода данных
- •Организация ввода/вывода в стиле с
- •Лабораторная работа № 2 Программирование алгоритмов линейной структуры
- •Задание I
- •Задание II
- •Задание III
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •Математическая модель
- •Алгоритм (блок - схема)
- •3. Программа
- •4. Результат работы программы
- •Решение
- •Математическая модель
- •4. Результат работы программы:
- •3. Операторы ветвления
- •3.1. Простые и составные условия
- •Операция &&
- •Операция ||
- •Операция !
- •3.2. Составной оператор
- •3.3. Условная операция (?:)
- •3.4. Условный оператор if
- •If (условие) оператор 1; else оператор 2;
- •If (условие) оператор;
- •3.5. Оператор switch
- •3.6. Оператор перехода goto
- •Лабораторная работа № 3 Программирование алгоритмов разветвляющейся структуры
- •Задание I
- •Задание II
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •1. Математическая модель
- •4. Результат работы программы
- •Решение
- •1. Математическая модель
- •4. Результат работы программы
- •4. Циклы
- •4.1. Оператор цикла с параметром (for)
- •4.2. Оператор цикла с предусловием (while)
- •4.3. Оператор цикла с постусловием (do while)
- •Отличие оператора цикла while от оператора цикла do..While
- •4.4. Вложенные циклы
- •Математическая модель
- •Лабораторная работа № 4 Программирование алгоритмов циклической структуры
- •Задание I
- •Задание II
- •Задание III
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •1. Математическая модель
- •4. Результат работы программы
- •Решение
- •4. Результат работы программы
- •5. Подпрограммы
- •5.1. Понятие подпрограммы
- •5.2. Формальные и фактические параметры
- •5.3. Локальные и глобальные переменные
- •5.4. Функции
- •Лабораторная работа №5 Использование функций для решения прикладных задач
- •Задание I
- •Задание II
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •1. Математическая модель
- •3. Программа 4. Результат работы программы:
- •6. Итерация и рекурсия
- •6.1. Понятие итеративного процесса
- •6.2. Понятие рекурсии
- •Лабораторная работа №6 Программирование рекурсивных алгоритмов
- •Задание
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •1. Математическая модель
- •2 . Алгоритм
- •3. Программа
- •4. Результат работы программы
- •7. Одномерные массивы
- •7.1. Понятие структурированного типа данных
- •7.2. Понятие и описание типа массив
- •7.3. Одномерные массивы
- •7.4. Основные действия над элементами массивов
- •1. Инициализация массива: присвоение каждому элементу начального значения:
- •2. Вывод массива на экран:
- •3. Обработка массива
- •Лабораторная работа №7 Использование числовых одномерных массивов
- •Задание I
- •Задание II
- •Контрольные вопросы
- •Пример выполнения задания II лабораторной работы
- •Решение
- •Математическая модель
- •4. Результат работы программы:
- •8. Двумерные массивы
- •Лабораторная работа №8 Двумерные массивы
- •Задание I
- •Задание II
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Решение
- •Математическая модель
- •9. Алгоритмы решения задач внутренней сортировки и алгоритмы поиска информации
- •9.1. Сложность алгоритмов
- •9.2. Постановка задачи поиска
- •9.3. Последовательный (линейный) поиск
- •9.4. Бинарный поиск
- •9.5. Постановка задачи сортировки данных
- •9.6. Прямые и быстрые методы внутренней сортировки
- •9.7. Сортировка вставками
- •9.8. Сортировка с помощью прямого выбора
- •9.9. Сортировка с помощью прямого обмена
- •Лабораторная работа № 9 Задачи сортировки и поиска
- •Задание
- •Контрольные вопросы
- •10. Указатели и массивы
- •10.1. Понятие статической и динамической переменной
- •10.2. Указатели
- •10.3. Взаимосвязь между массивами и указателями
- •10.4. Порядок объявления динамических массивов
- •10.5. Передача массивов в качестве параметров функции
- •Лабораторная работа №10 Применение массивов и указателей для решения прикладных задач
- •Задание I
- •Задание II
- •Задание III
- •Контрольные вопросы
- •Пример выполнения задания III лабораторной работы
- •Решение
- •Математическая модель
- •11. Особенности работы с функциями
- •11.1. Способы передачи параметров в функцию
- •11.2. Передача имен функций в качестве параметров
- •11.3. Перегрузка функций
- •Лабораторная работа № 11 Исследование способов работы с функциями
- •Задание I
- •Задание II
- •Контрольные вопросы
- •12. Строки как массив элементов типа char
- •12.1. Способы представления строк в си; реализация некоторых типовых операций над строками
- •12.1. Основные функции Си для работы со строками
- •Лабораторная работа № 12 Обработка символьных массивов
- •Задание I
- •Изучение способов формирования строк в языке Си
- •Задание II
- •Контрольные вопросы
- •Пример выполнения задания II лабораторной работы
- •3. Результат работы программы:
- •13. Строки как объект специального класса string
- •13.2. Основные функции класса string для работы со строками
- •Задание
- •Задания для самостоятельной работы
- •Контрольные вопросы
- •Пример выполнения лабораторной работы
- •Результат работы программы:
- •14. Структуры
- •14.1. Порядок объявления и инициализации структур
- •14.2. Программирование с использованием структур
- •14.3. Использование функций для работы с производными типами данных
- •Лабораторная работа № 14 Применение структур для решения прикладных задач
- •Задание I
- •Задание II Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Контрольные вопросы
- •Пример выполнения задания I лабораторной работы
- •2. Программа
- •15. Файлы
- •15.1. Подход с использованием возможностей языка Си
- •Ifstream идентификатор_потока(имя_файла,ключи_потока);
- •Ofstream идентификатор_потока(имя_файла,ключи_потока);
- •Лабораторная работа № 15 Исследование методов доступа к файлам данных
- •Задание I
- •1. Работа с неструктурированными данными
- •2. Работа со структурированными данными
- •Задание II
- •Контрольные вопросы
- •Лабораторная работа № 16 Исследование связанных списков данных
- •Методические рекомендации
- •Исследование формирования элементов связанного списка
- •Int age; // возраст
- •2. Исследование операций с элементами связанных списков
- •If(!start) // если список пуст
- •Void Del(List *cur) // cur - указатель удаляемый элемент
- •If(!p) // дошли до конца не найдя предшествующего
- •Задание на исследование
- •Литература
- •Приложение 1 Порядок выполнения лабораторных работ
- •Приложение 2 Базовые функции
Применение функций работы со строками для обработки символьных массивов
Набрать и отладить программу заполнения числового массива из символьной строки:
int main(int argc, char* argv[]) {
char str[]="2, 75.3, 24.45, 55, 0, 0.37";
char *ptr=str; //Оператор 1
float Arr[10];
int i=0;
printf("\nИсходная строка:\n%s\n",str);
do {
Arr[i] = atof(ptr); //Оператор 2
i++;
if (i>9) break;
}
while(ptr==strchr(ptr,','),ptr++); //Оператор 3
printf(“\nМассив чисел: \n“)
for (int s=0;s<i;s++)
printf("%5.2f\n", Arr[s]);
return 0;
}
Проанализировать результат работы программы и ответить на вопрос: что происходит при выполнении Операторов 1-3.
Задание II
В заданном тексте вставить между словами вместо пробелов запятую и пробел.
Задан текст. Вставить заданную последовательность символов после i-гo символа каждого слова.
Вывести на экран в один столбец слова из заданного текста оканчивающиеся на согласную букву, в другой столбец – слова, оканчивающиеся на гласную букву, в третий - все остальные слова.
Из заданного текста удалить его часть, заключенную в круглые скобки вместе со скобками.
Каждое слово текста преобразовать так, чтобы оно читалось наоборот.
Из заданной последовательности слов, разделенных запятыми, удалить слова, содержащие введенный с клавиатуры символ.
Составить программу подсчета числа слов в телеграмме и выдачи на печать квитанции об ее уплате.
Дан текст из n символов. Вывести на экран только строчные русские буквы, входящие в этот текст.
Дан текст из строчных латинских букв, за которым следует точка. Вывести на экран дисплея этот текст заглавными латинскими буквами.
После каждой гласной буквы х в последовательности слов, разделенных пробелами, вставить буквосочетание рхсх (например, слово порядок преобразуется в поросорярясядоросок).
Задан текст. Найти сколько удвоенных букв содержится в данном тексте. Заменить каждую пару символом *.
Определить, не используя стандартную процедуру, является ли введенная строка правильной записью целого десятичного числа без знака.
В тексте слова разделены пробелами. Определить, кaкой процент слов в тексте заканчивается на русскую букву а.
Задан текст на русском языке. Удалить из него пробелы, ь, ъ.
В тексте слова разделены пробелами. Определить, кaкой процент слов в тексте заканчивается на русскую букву а.
Даны две символьные строки, состоящие только из цифр (длина каждой более 10 символов). Считая, что в этих строках находятся очень длинные целые числа, сформировать третью строку – сумму этих чисел.
В заданном тексте найти и вывести на экран удвоенные буквы. Посчитать количество удвоенных гласных букв и количество удвоенных согласных.
Дана квадратная матрица, элементами которой являются целые положительные числа. Найти корень квадратный из числа, образованного цифрами чисел, стоящих на главной диагонали.
Дан произвольный текст. Отредактировать текст так, чтобы между словами был ровно один пробел, а между предложениям ровно два пробела.
Исключить из введенной строки символ, введенный с клавиатуры. Вывести на экран количество удаленных символов и полученную строку.
В тексте слова разделены пробелами. Определить, кaкой процент слов в тексте начинается на русскую букву м.
Вывести на экран самое длинное слово из заданного текста.
Текст задан следующим образом: первый символ – цифра указывающая длину первого слова, за первым словом - вновь цифра указывающая длину второго слова (длина каждого слова не более 9 символов) и т.д. Выписать k-ое слово из текста (число k вводится с клавиатуры).
Назовем сложностью предложения сумму количества слов и знаков препинания. Определить сложность заданного предложения.
В заданной строке заменить все вхождения одной подстроки на другую. Об е подстроки вводятся с клавиатуры.
Выбрать из текста все слова, которые имеют в своем составе по два и более одинаковых символа.
Дана квадратная целочисленная матрица, элементами которой являются положительные числа. Найти корень квадратный из числа, образованного цифрами чисел, стоящих на побочной диагонали.
Контрольные вопросы
Что представляет из себя строка в программе, написанной на ЯП Си?
Что представляет собой строка:
а) последовательность английских букв;
б) последовательность русских букв;
в) последовательность символов ПЭВМ?
Как может быть описана строка в Си?
Приведите пример объявления строки как массива символов.
Приведите пример объявления строки как переменной-указателя на строку.
Что является признаком окончания строки?
Как осуществляется доступ к элементам строки?
Какое максимальное количество символов может содержать строка?
Как при описании строки может быть задана ее длина?
Может ли в процессе выполнения программы фактическая длина строки стать больше, чем объявлено в разделе описания? Что произойдет в этом случае?
Перечислите типовые операции над строками.
Перечислите основные функции обработки строк.
Пример выполнения задания II лабораторной работы
Задание. Дано предложение, между словами которого стоит один пробел, в конце предложения – точка. Подсчитать количество слов в этом предложении и вывести на экран в столбец те из них, которые начинаются с введенной с клавиатуры буквы или символа, и их количество. Если таких слов во введенном предложении нет, вывести сообщение об этом.
1. Решение (математическая модель). Предложение будем вводить в символьный массив text[100]. Разобьем это предложение на отдельные слова и будем хранить их в виде элементов двумерного символьного массива mas. Вводимый с клавиатуры символ обозначим через х, количество слов в данном предложении – через m (int), количество слов, начинающихся с введенного символа (результат работы программы) – через kol_x (int). Формирование массива mas выполним с помощью цикла с постусловием до появления точки. Каждое слово будет получаться в цикле при посимвольной обработке одномерного массива text, пока не встретится пробел, увеличивая после каждого пробела счетчик слов на единицу.
2. Программа решения данной задачи может иметь следующий вид:
#include <conio.h> // для корректной работы с кириллицей необходимо
#include <iostream>// сохранить файл проекта в кодировке DOS 866 файл
#include <cstdio> // дополнительные параметры сохранениякириллица (DOS)
using namespace std;
int main() {
char ch, x, mas[25][100], text[100];// mas - двумерный массив слов
cout<<"Введите предложение, оканчивающиеся точкой "<<endl;
gets(text); // организуем ввод всех символов текста
int i=0; // № символа слова
int j=0, m=0; // рассматриваем первое слово
do {
ch=text[j];
if ((ch!=' ') && (ch!=',') && (ch!='.'))
{
mas[m][i]=ch; //формируем текущее слово
i++;
}
else
if(i!=0)
{
mas[m][i]='\0';
m++; //увеличиваем счетчик слов
i=0;
}
j++;
}
while (ch!='.');
cout<<"Количество слов в данном предложении: "<<m<<endl;
cout<<"Введите символ, с которого должны начинаться выводимые на экран слова: ";
cin>>x;
int kol_x=0; // обнуление счетчика искомых слов
cout<<"Слова, начинающиеся c символа '"<<x<<"':"<<endl;
for (i=0; i<m; i++)
if (mas[i][0]==x)
{// если введенный символ в текущем слове на первой позиции, то
cout<<mas[i]<<endl;;
kol_x++;
}
if (kol_x==0) cout<<"отсутствуют";
else {
cout<<"Всего в предложении "<<kol_x;
switch (kol_x)
{//организация вывода верного окончания
case 1: case 21:cout<<" слово, ";break;
case 2: case 3: case 4: case 22: case 23: case 24: cout<<" слова, ";break;
default:cout<<" слов, ";
}
cout<<"начинающихся на '"<<x<<"'.";
}
_getch();
return 0;
}
3. Результат работы программы:
1)
Введите предложение
Некоторые люди видят в луже лишь лужу, а некоторые видят в луже звезды.
Количество слов в данном предложении: 13
Введите символ, с которого должны начинаться выводимые на экран слова:
л
Слова, начинающиеся на символ "л"
люди
луже
лишь
лужу
луже
Всего в предложении 5 слов, начинающихся на ‘л’.
2)
Введите предложение
А солнце светило ярче.
Количество слов в данном предложении: 4
Введите символ, с которого должны начинаться выводимые на экран слова:
л
Слова, начинающиеся на символ ‘л’
отсутствуют
13. Строки как объект специального класса string
13.1. Описание строк в С++ и типовые операции над ними
Для использования в программе возможностей класса string необходимо в начале программы подключить заголовочный файл string:
#include <string>
В отличие от типа char, string является классом. Классы, грубо говоря, содержат в себе переменные, константы и функции (методы) для работы с переменными. string использует единственный объект string для организации работы со строками. Будучи частью стандартной библиотеки C++, этот объект также является частью стандартного пространства имён – std. Таким образом, для использования возможностей заголовочного файла string необходимо в зоне описания глобальных объектов программы описать пространство стандартных имен std.
Теперь для создания строки достаточно написать:
string s;
Для записи в строку можно использовать оператор присваивания (=):
s = "Hello";
Пример работы (ввод/вывод) с объектом класса string:
string name;
cout<<"Enter your name"<<endl;
cin>>name; // строка считается до первого пробела
//поэтому при работе со string лучше использовать getline(cin, name);
//или cin.getline(name[, 50]); в [] указан необязательный параметр
cout<<"Hi "<< name <<"!"<<endl;
Рассмотрим некоторые основные операции, реализованные для объекта класса string:
инициализация массивом символов (строкой встроенного типа) или другим объектом типа string;
string st( "Для работы с кириллицей Dos 866\n" );// или
string s0=st; // или
string s1 = "файлдополнительные параметры сохранениякириллица (DOS)";
копирование одной строки в другую;
st2 = st3;//С помощью операции присваивания копируем st3 в st2
доступ к отдельным символам строки для чтения и записи;
сравнение двух строк на равенство;
if ( st == st3 )
// инициализация сработала
конкатенация двух строк, получая результат либо как третью строку, либо вместо одной из исходных;
string s1( "hello, " );
string s2( "world\n" );
string s3 = s1 + s2;//3-я строка – резкльтат конкатенации двух первых
s1 += s2;// или же возможно добавление s2 в конец s1
Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом, а значимые слова – объектами класса string:
const char *pc = ", ";// Операция сложения может конкатенировать
string s1( "hello" );// объекты класса string
string s2( "world" );// и со строками встроенного типа
string s3 = s1 + pc + s2 + "\n";
Подобные выражения работают потому, что компилятор знает, как автоматически преобразовывать объекты встроенного типа в объекты класса string. Возможно и простое присваивание встроенной строки объекту string: string s1;
const char *pc = "a character array";
s1 = pc; // правильно
13.2. Основные функции класса string для работы со строками
Рассмотрим некоторые основные методы (функции), предусмотренные для работы со строками, являющимися экземплярами класса string:
s.append(str) – добавляет в конец строки строку str. Можно писать как s.append(переменная), так и s.append("строка");
s.assign(str) – присваивает строке s значение строки str. Аналогично записи s=str;
int i=s.begin() – записывает в i индекс первого элемента строки;
int i=s.end() – аналогично, но последнего;
s.clear() – как следует из названия, очищает строку, т.е. удаляет все элементы в ней;
s.compare(str) – сравнивает строку s со строкой str и возвращает 0 в случае совпадения (на самом деле сравнивает коды символов и возвращает их разность);
s.copy(str, len (сколько), start (начиная с какого)) – копирует из строки s в строку str (str может быть как типа string, так и строка типа char). Последние два параметра не обязательные (можно использовать функцию с 1, 2 или 3 параметрами);
bool b=s.empty() – если строка пуста, возвращает true, иначе false;
s.erase(start, len) удаляет len элементов с заданной позиции start;
s.find(str, start) – ищет строку str начиная с заданной позиции start;
s.insert(start, str, beg, count) – вставляет в строку s, начиная с позиции start часть строки str, начиная с позиции beg count символов;
s.replace(start, n, str) – берет n первых символов из str и заменяет символы строки s на них, начиная с позиции start;
replace(str.begin(), str.end(), '.', '_');//пробегает диапазон от // begin() до end() и заменяет элементы, равные третьему параметру, // на четвертый
int len=s.length() – записывает в len длинну строки;
s.push_back(symbol) – добавляет в конец строки символ;
str=s.substr(n, m) – возвращает m символов начиная с позиции n;
s.swap(str) – меняет содержимое s и str местами;
s.size() – возвращает число элементов в строке.
Пример исследования особенностей ввода/вывода строковых данных.
…
string s, s1, ss;
cout<<"\nEnter string: \"1 string\": "<<endl;
cin>>s;
getline(cin,s1);
cout<<"\nEnter string: \"2 string\": "<<endl;
getline(cin,ss);
cout<<"\nString 1: "<<s;
cout<<"\nпродолжение String 1: "<<s1;
cout<<"\nString 2: "<<ss<<endl;
string str = "Hello, world!";
cout << str <<endl;
string name,surname,text,fullname,s2,s3,user;
user = "Petya Petrov";
cout << user <<endl;
cout<<"Enter your name"<<endl;
getline(cin,name);
cout<<"Enter your surname"<<endl;
getline(cin,surname);
fullname=name;
fullname+=" "; // добавляем пробел
fullname.append(surname);
cout <<"fullname = "<<fullname <<endl;
if (fullname.compare(user)==0) // <=> if (!(fullname.compare(user)))
cout<<"Your are good user"<<endl;
else cout<<"Bad user"<<endl;
cout<<"enter s1"<<endl;
getline(cin,s1);
cout<<"enter s2"<<endl;
getline(cin,s2);
s1.swap(s2);
cout<<"new s1: "<<s1<<endl<<"new s2: "<<s2<<endl;
cout<<"Enter big text with your name"<<endl;
getline(cin,text);
cout <<"old text = "<<text <<endl;
int i=text.find(name);
while (i)// <=> while (i!=0) {
text.replace(0,name.length(),name);//замена первых сим_в text на name
s3=text.substr(i,name.length());// помещаем подстроку из text в s3
cout<<"Replaced: "<<s3<<endl;
i=text.find(name);//ищем подстроку name в строке text
}
cout<<"New text:"<<endl<<text<<endl;
text.clear();//очищаем строку
cout<<"text: "<<text<<endl;
…
Лабораторная работа № 13 Программирование задач на обработку данных строкового типа
ЦЕЛЬ РАБОТЫ: получение навыков объявления, инициализации и использования объектов класса string С++.
Выполнение работы: освоить теоретический материал, в соответствии с вариантом решить задачу, составить и реализовать программу с использованием функций класса string.
Задание
Ввести предложение, слова в котором разделены пробелам и запятыми. Распечатать это предложение, удалив из него те, которые встретились там более одного раза.
Найти множество всех слов, которые встречаются в каждом из двух заданных предложений.
Удалить из данной строки те слова, которые уже встречались в ней раньше.
Ввести строку, состоящую только из цифр и букв. Распечатать те группы цифр, в которых цифра 7 встречается не более двух раз (группа цифр - это последовательность цифр, обрамленная буквами).
Ввести предложение, слова в котором разделены пробелам и запятыми. Распечатать те слова, которые являются обращениями других слов в этом предложении. Если нужных слов нет, сообщить об этом.
Распечатать введенное предложение, удалив из него слова, которые состоят менее чем из трех букв.
Распечатать введенные слова, отличные от последнего перестроив их следующим образом: перенести последнюю букву каждого слова в его начало и в каждом слове оставить только первые вхождения каждой буквы.
Распечатать строку, которая получается из введенной строки следующим образом: каждая цифра заменяется заключенной в круглые скобки последовательностью литер «+», если цифра четная, или «-», если цифра нечетная. Длина последовательности равна числу, изображаемому цифрой.
Ученики зашифровывают свои записки, записывая все слова наоборот. Составить программу, расшифровывающую сообщения учеников.
Распечатать введенную строку, удалив из нее слова с нечетными номерами и перевернув слова с четными номерами. Например, из строки 'холодный ручей обжигал лицо и руки' должно получиться 'йечур оцил икур'.
Ввести строку, в которую могут входить только цифры и буквы. Распечатать те группы букв, в которых буква А встречается не менее двух раз (группа букв - это последовательность букв, обрамленная цифрами).
Ввести произвольный текст из нескольких предложений. Вычислить среднее число слов в предложении и среднюю длину предложения.
Дан текст, в котором слова разделены пробелами. Создать список слов текста с указанием количества букв в них.
Распечатать, начиная с последнего слова, перевернутые слова введенного предложения.
Выделить из первой строки все слова, начинающиеся с гласной буквы, а из второй строки - слова, начинающиеся с согласной. Образовать третью строку, состоящую из выделенных слов обеих строк. В новой строке слова должны разделяться двумя пробелами.
Из введенного текста распечатать только те слова, которые симметричны (например, радар, анна, шалаш) либо в которых буквы расположены в порядке, обратном алфавитному (например, ток, три, срок).
Ученики зашифровывают свои записки, записывая каждое слово текста наоборот. Составить программу, позволяющую шифровать сообщения описанным способом.
Для каждого из слов заданного предложения указать, сколько раз оно встречается в предложении.
Заменить окончание ing каждого слова, встречающегося в заданном предложении на английском языке, на ed.
Дана последовательность слов, разделенных пробелами. Напечатать все слова, предварительно удалив из каждого слова все предыдущие вхождения последней буквы.
Из заданной последовательности слов, разделенных запятыми, удалить слова, содержащие введенную с клавиатуры последовательность символов.
Дана последовательность слов, разделенных пробелами. Напечатать все слова, предварительно удалив из каждого слова все вхождения последней буквы предыдущего слова.
Вывести на экран те слова из введенного текста, в которых нет повторяющихся букв.
Задан текст, состоящий из нескольких предложений. Для каждого предложения вывести на экран все слова, отличные от последнего слова текущего предложения.
Дана последовательность слов, каждое из которых содержит от 2 до 10 латинских букв. Между соседними словами - пробел, за последним словом - точка. Если слово имеет нечетную длину, то удалить среднюю букву, если четную - перенести первую букву в конец слова. Вывести на экран все преобразованные слова.
В заданном тексте слова разделены пробелами или запятыми. Вывести на экран список слов, имеющих в своем составе хотя бы один символ, введенный с клавиатуры.
Вывести на экран дисплея список слов, имеющих приставку.
Задания для самостоятельной работы
Следующая группа задач является не обязательной для решения и относится к области криптографии, т.е. к шифровке и расшифровке текстов. Решение задач из этой группы улучшит навыки обработки строковых величин и расширит знания по их применению на практике.
1. Зашифровать текст методом Гронсфельда. Ключом является конечная последовательность цифр, которую записывают подряд над символами шифруемого текста. Цифра, стоящая над литерой, является величиной смещения (т.е. говорит о том, на сколько позиций надо продвинуться вперед по таблице кодировки от текущего символа, чтобы получить для него замену). Протестировать написанную программу.
2. Чтобы зашифровать текст, записанный с помощью русских букв и знаков препинания, его можно переписать, заменив каждую букву непосредственно следующей за ней по алфавиту (буква я заменяется буквой а). Можно обобщить этот способ шифровки - сдвиг производится не на одну букву, а на n букв, где n - данное натуральное число (можно представить себе, что буквы выписаны по кругу, как цифры на циферблате часов). Написать и протестировать программу, которая зашифровывает и расшифровывает данный текст.
3. Пусть
по некоторому каналу связи передается
сообщение, имеющее вид последовательности
нулей и единиц (или аналогично точек и
тире). Из-за помех возможен ошибочный
прием некоторых сигналов: нуль может
быть воспринят как единица и наоборот.
Можно передавать каждый сигнал трижды,
заменяя, например, последовательность
1, 0, 1 последовательностью 1, 1, 1, 0, 0, 0, 1,
1, 1. Три последовательные цифры при
расшифровке заменяются той цифрой,
которая встречается среди них по крайней
мере дважды. Такое у
таивание
сигналов повышает вероятность правильного
приема сообщения. Написать программу
расшифровки некоторого сообщения.
4. Следующий способ предназначен для шифровки последовательностей нулей и единиц (или же, например, точек и тире). Пусть а1, а2, ..., аn - такая последовательность. То, что предлагается в качестве ее шифра, - это последовательность b1, b2, ..., bn, образованная по следующему правилу: b1 = a1; bi = l, если ai = ai - 1 и bi = 0 в противном случае (i = l, 2,..., n).
Пользуясь изложенным способом, зашифровать и расшифровать данную последовательность нулей и единиц (или точек и тире).
5. Чтобы зашифровать текст, состоящий из 121 буквы, его можно записать в квадратную матрицу порядка 11 по строкам, а затем прочитать по спирали, начиная с центра (т.е. с элемента, имеющего индексы 6, 6). Зашифровать и расшифровать данный текст этим способом. Выбрав некоторую таблицу, разработать способ табличной замены каждого символа другим символом - его шифром. Зашифровать и расшифровать данный текст указанным способом.
Контрольные вопросы
Как описывается переменная-строка, являющаяся экземплером класса string?
Как осуществляется доступ к элементам строки?
Перечислите типовые операции над строками.
Как выполняется инициализация строк?
Как выполняется ввод/вывод строк, являющихся объектом класса string?
Как выполняется сравнение строк?
Как выполняется конкатенация строк?
Может ли в процессе выполнения программы измениться фактическая длина строки?
Перечислите основные функции обработки строк.
Пример выполнения лабораторной работы
Задание. Найти сумму цифр введенного натурального числа.
1. Решение (математическая модель+словесный алгоритм). Натуральное число будем считывать в строковую переменную stroke. Обнулим сумматор s=0. Вычислим длину строки и, далее в цикле с параметром:
каждый символ строки будем преобразовывать в число, получая тем саммым цифру введенного числа;
наращивать сумматор на величину полученной цифры числа.
После окончания цикла выведем результат – сумму цифр числа s.
Аргументы: stroka (string) – целое число, введенное с клавиатуры.
Результаты: s (int) – Сумма цифр числа
Промежуточные величины: счетчик i, количество элементов в строке n, численное представление символа введенной строки si – целого типа.
2. Программа решения данной задачи может иметь следующий вид:
#
Результат работы программы:
Введите натуральное число:
12345678
Сумма цифр числа: 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 характеристик этих объектов и вывода данных на экран в виде прямоугольной таблицы. Организовать поиск данных по одной из заданных характеристик.
Информация должна быть достоверной. Ее можно почерпнуть из справочников, энциклопедий, реклам, книг и т.п.
Знаки зодиака
Промышленные товары
Продукты питания
Государства Европы
Русские писатели
Домашние и дикие животные
Цветы
Бытовая техника
Компьютеры и комплектующие
Драгоценные камни
Реки России
Виды спорта
Музыка
Материалы для ремонта квартиры
Вузы России
Сведения о студентах группы
Живопись эпохи Возрождения
Химические элементы таблицы Менделеева
Медицина
Туризм и отдых
Транспорт
Цитрусовые растения
Горы Северного Кавказа
Парфюмерия
Канцелярские товары
Задание II Вариант 1
Описать структуру STUDENT, содержащую следующие поля: фамилия и инициалы, номер группы, успеваемость (массив из пяти элементов).
Написать программу, выполняющую следующие действия:
ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей;
поиск записей, в которых средний бал студента больше 4,0;
поиск записей, в которых совпадают номера групп студентов.
Вариант 2
Описать структуру AEROFLOT, содержащую следующие поля: название пункта назначения рейса, номер рейса, вместимость, тип самолета.
Написать программу, выполняющую следующие действия:
ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей;
поиск записей, в которых пункт назначения совпадает с введенным с клавиатуры;
поиск записей, в которых вместимость самолета не менее введенной с клавиатуры.
Вариант 3
Описать структуру TRAIN, содержащую следующие поля: номер поезда, название пункта назначения рейса, время отправления, время в пути.
Написать программу, выполняющую следующие действия:
ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей;
поиск поездов, отправляющихся после времени, введенного с клавиатуры в течении ближайших двух часов;
поиск поездов, отправляющихся в пункт назначения, введенный с клавиатуры.
Вариант 4
Описать структуру TOURIST, содержащую следующие поля: номер маршрута, наименование начального пункта маршрута, наименование конечного пункта маршрута, время в пути.
Написать программу, выполняющую следующие действия:
ввод с клавиатуры данных в массив экземпляров структур, состоящий из пяти записей;
поиск маршрутов, начинающихся в пункте, наименование которого введено с клавиатуры;
поиск маршрутов, общее время прохождения которых не превышает времени, введенного с клавиатуры.
