Федеральное агентство по образованию Российской Федерации
МОСКОВСКИЙ ИНЖЕНЕРНО-ФИЗИЧЕСКИЙ ИНСТИТУТ (ГОСУДАРСТВЕННЫЙ УНИ...
8 downloads
221 Views
922KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Федеральное агентство по образованию Российской Федерации
МОСКОВСКИЙ ИНЖЕНЕРНО-ФИЗИЧЕСКИЙ ИНСТИТУТ (ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ)
А.И. Шереметьев
Информатика Сборник домашних заданий
Москва 2009
ББК 32.81я7 УДК 004 (076) Ш49 Шереметьев А.И. Информатика. Сборник домашних заданий. – М.: МИФИ, 2009. – 56 с. Представлены задачи по программированию на языке Си. Сборник предназначен для студентов, выполняющих домашние задания по курсу “Информатика” групп А1-04, 05; А2-04, 05 (специальность – 200600 «Электроника и автоматика физических установок»).
Рецензент проф. Ю.Г. Древс Рекомендовано к изданию редсоветом МИФИ ISBN 978-5-7262-1144-2
© Московский инженерно-физический институт (государственный университет), 2009
Задачи для групп А1-04, 05 Задача 1.1. "ТОРГОВЫЙ АВТОМАТ". Торговый автомат имеет бесконечный набор товаров стоимостью от 1 копейки до 99 копеек. Покупатель опускает в автомат монету (банкноту) достоинством 1 рубль и выбирает товар вводом значения его уникальной цены. После этого автомат выдает товар и сдачу минимальным количеством монет из набора монет достоинством 1, 2, 3, 5, 10, 15, 20 и 50 копеек (запасы монет для сдачи считать бесконечными). Написать программу, моделирующую работу такого автомата УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую смену минимальной и максимальной цены товара, а также достоинств монет (банкнот) в тексте программы. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть два режима работы: ЗАРЯДКА и ПРОДАЖА. В режиме ЗАРЯДКА устанавливаются цены и количество единиц товара каждого типа (до 5 типов), а также достоинства и количество монет (банкнот) каждого достоинства (до 8 достоинств, до 50 монет одинакового достоинства). В режиме ПРОДАЖА моделируется эта процедура с разумной реакцией на любую ситуацию. Задача 1.2. "РАЗМЕННЫЙ АВТОМАТ". Автомат имеет набор монет (банкнот) достоинством 1, 2, 3, 5, 10, 15, 20 и 50 копеек (запасы монет считать бесконечными) и разменивает их на более мелкие. Пользователь может указать свое предпочтение вводом достоинства монет, которых он жаждет получить больше всего; при вводе несуществующего достоинства монеты размен производится минимальным количеством монет. За свою сообразительность автомат взимает небольшую плату: монеты в 2, 3 и 5 копеек меняет бесплатно; за размен 10 и 15 копеек берет 1 копейку; за 20 копеек - 2 копейки; за 50 копеек - 3 копейки. Разумеется, взятая за размен плата показывается пользователю вместе с выдаваемыми монетами размена. Написать программу, моделирующую работу такого автомата. 3
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую смену достоинств монет (банкнот) и платы за размен в тексте программы. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть два режима работы: ЗАРЯДКА и РАЗМЕН. В режиме ЗАРЯДКА устанавливаются достоинства и количество монет (банкнот) каждого достоинства (до 7 достоинств, до 100 монет одинакового достоинства), а также платы за размен. В режиме РАЗМЕН моделируется эта процедура с разумной реакцией на любую ситуацию. Задача 1.3. "ОТГАДАЙ СЛОВО". В программе задается текстовая строка - слово, которое нужно отгадать пользователю. На экране печатается столько прочерков (знаков "-") сколько букв в этом слове. В каждый ход пользователь вводит одну букву. Если эта буква есть в слове, то она подставляется вместо соответствующих прочерков в слове. Иначе пользователь теряет одно очко. В начале сеанса игры у пользователя 15 очков. Написать программу, моделирующую эту игру. УКАЗАНИЯ: Предусмотреть легкость смены слова и констант в тексте программы, обработку ошибочных ситуаций и наглядную форму вывода. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть два режима работы: ЗАРЯДКА и ИГРА. В режиме ЗАРЯДКА пользователь вводит слово, стартовое количество очков и цену промаха в очках, а также предельное время для сеанса игры. В режиме ИГРА осуществляется эта процедура с выдачей остающегося времени в секундах, оставшихся очков и состояния с отгадыванием слова. Весь диалог протоколируется в текстовом файле. 4
Задача 1.4. "КРЕСТИКИ-НОЛИКИ". Написать программу, моделирующую эту известную игру. В начале выводится игровое поле с координатами клеток: 1 2 3 +---+---+---+ A ¦ ¦ ¦ ¦ A +---+---+---+ B ¦ ¦ ¦ ¦ B +---+---+---+ C ¦ ¦ ¦ ¦ C +---+---+---+ 1 2 3
и предлагается сделать ход партнеру 0: он делает этот ход вводом координаты клетки, например, в виде "B2", что и отображается на экране в игровом поле. Затем предлагается сделать ход партнеру Х: он делает этот ход вводом координаты клетки, например, в виде "B3", что также отображается на экране. Игра продолжается до получения одинаковых символов на любой горизонтали, вертикали или диагонали (партнер-владелец этих символов выиграл) или до исчерпания свободных клеток игрового поля (ничья). Протокол сеанса игры ведется на экране. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму вывода и диалога, например, использование цвета для разных символов, мигания для выигравших символов и др. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Расширить задачу так, чтобы одним из партнеров мог быть компьютер. Главное здесь - найти или изобрести алгоритм выигрыша. Право начального хода должно выбираться. Весь диалог протоколируется также в текстовом файле. Задача 1.5. "ХОД КОНЕМ". Написать программу, показывающую все поля шахматной доски, которые бьет конь, стоящий на заданной клетке доски. В начале выводится пустая доска с координатами клеток: 5
a b c d e f g h
1 2 3 4 5 6 7 8 +---------------+ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +---------------+
и пользователю предлагается поставить на нее коня: он делает это вводом координаты клетки, например, в виде "С2", что и отображается на экране - в указанной клетке доски появляется символ "К". Затем после необходимых вычислений символом "*" помечаются все клетки доски, находящиеся под боем этого коня. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму вывода и диалога. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод символов коня и клетки под боем, использование цвета для разных символов (разметки доски, координат, клеток, символа коня), мигания для полей под боем и др. Задача 1.6. "УГРОЗА ФЕРЗЕМ". Написать программу, показывающую все поля шахматной доски, которые бьет ферзь, стоящий на заданной клетке доски. В начале выводится пустая доска с координатами клеток: a b c d e f g h
1 2 3 4 5 6 7 8 +---------------+ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +-+-+-+-+-+-+-+-¦ +---------------+
6
и пользователю предлагается поставить на нее ферзя: он делает это вводом координаты клетки, например, в виде "А3", что и отображается на экране - в указанной клетке доски появляется символ "F". Затем после необходимых вычислений символом "!" помечаются все клетки доски, находящиеся под боем этого ферзя. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму вывода и диалога. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод символов ферзя и клетки под боем, использование цвета для разных символов (разметки доски, координат, клеток, символа ферзя), мигания для полей под боем и др. Задача 1.7. "ПРОСТЫЕ ЧИСЛА". Простым называется целое положительное число, которое делится нацело только на 1 и на само себя. Например, числа 1, 2, 3, 5 - простые. Написать программу, которая после ввода числа N (0 < N < NMAX = 65535) находит и выводит все простые числа, меньшие или равные числу N. УКАЗАНИЯ: На этапе проектирования потратить некоторые усилия на поиск в литературе эффективного по времени алгоритма поиска простых чисел (при неудаче проконсультироваться у преподавателя). Предусмотреть обработку ошибочных ситуаций и наглядную форму вывода с использованием всей площади экрана. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть два этапа работы: ДИАПАЗОН и ПОИСК. На этапе ДИАПАЗОН пользователь выбирает формат представления целого числа: unsigned char или unsigned int. На этапе ПОИСК после ввода числа N осуществляется эта процедура с выдачей затраченного времени в секундах, а затем постраничный вывод найденных чисел. 7
Задача 1.8. ”СЧАСТЛИВЫЙ БИЛЕТ”. Счастливым называют шестизначное число, у которого сумма трех первых цифр равна сумме трех последних цифр. Написать программу, которая, запросив у пользователя максимально 7 строк, в каждой из которых содержится число T (0 < T < 999999), анализирует их и выводит на экран сообщение счастливо ли каждое число. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и продумать наглядный диалог с пользователем. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Расширить эту задачу раскраской счастливых и несчастливых чисел разными цветами. 2. Расширить задачу п.1, добавив ввод изменяемой длины числа (2...10 цифр). Задача 1.9. ”НОД И НОК”. Алгоритм Евклида нахождения наибольшего общего делителя (НОД) неотрицательных целых чисел основан на следующих свойствах этой величины. Пусть M и N - одновременно не равные нулю целые неотрицательные числа и M >= N. Тогда, если N = 0, то НОД(N, M) = M, а если N != 0, то для чисел M, N, R, где R - остаток от деления M на N, выполняется равенство НОД(M, N) = НОД(N, R). Например, НОД(15, 6) = НОД(6, 3) = НОД(3, 0) = 3. Написать программу, которая, запросив у пользователя числа M и N, вычисляет и выводит на экран значение НОД(M, N), используя алгоритм Евклида. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую смену числовых констант в тексте программы и продумать наглядный диалог с пользователем. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Расширить задачу п.1, добавив вычисление наименьшего общего кратного (НОК) чисел M и N. Задача 1.10. "ЗАПИСЬ ЧИСЛА В СИСТЕМЕ". Написать программу, осуществляющую перевод записи целого неотрицательного числа в системе с одним основанием в запись того же числа в системе с другим основанием. Ограничиться основаниями 8
2...16. Последовательно вводятся: основание исходной системы счисления, запись числа цифрами исходной системы счисления (для оснований более 10 принять обозначения цифр: 10 = A, 11 = B, 12 = C, 13 = D, 14 = E, 15 = F, все - латинские буквы); основание результата цифрами исходной системы счисления. Производятся преобразования и выводится запись числа в новой системе счисления, если это возможно. УКАЗАНИЯ: Обратите внимание на тот факт, что требуются два типа преобразования: символьное (внешнее, текстовое) представление числа ==> внутреннее (двоичное) представление числа" при вводе и "внутреннее (двоичное) представление числа ==> символьное (внешнее, текстовое) представление числа" при выводе. Предусмотреть обработку ошибочных ситуаций и наглядную форму вывода. Использование системных функций, прямо предназначенных для таких преобразований, в программе ЗАПРЕЩЕНО, но их применение для тестирования настоятельно рекомендуется. Обратите внимание на функции из <STRING.H>, <STDLIB.H>. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Осуществить расширение оснований до 2...36. (для оснований более 10 принять обозначения цифр: 10 = A, 11 = B, ..., 35 = Z, все - латинские буквы). Задача 1.11. "ТЕКСТ В КОД МОРЗЕ". Написать программу, преобразующую обычный текст в код азбуки Морзе. Вводится строка текста. Затем выводится ее представление в коде Морзе, то есть в виде точек "." и тире "-". При этом каждый символ кода Морзе отделяется один от другого пробелом. УКАЗАНИЯ: Найти в литературе кодовые таблицы Морзе (при неудаче проконсультироваться у преподавателя). Ограничиться цифрами, русскими буквами и обычными знаками препинания. Обратите внимание на функции из <STRING.H>. Предусмотреть обработку ошибочных ситуаций и наглядную форму вывода.
9
РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть два режима работы: РУССКИЙ и АНГЛИЙСКИЙ. В начале пользователь выбирает язык сообщения. В режиме РУССКИЙ работа описана выше. В режиме АНГЛИЙСКИЙ используются цифры, латинские буквы и те же знаки препинания. Задача 1.12. "КОД МОРЗЕ В ТЕКСТ". Написать программу, преобразующую код азбуки Морзе в обычный текст. Вводится строка в коде Морзе, то есть в виде точек "." и тире "-". При этом каждый символ кода Морзе отделяется один от другого пробелом. Затем выводится ее представление в виде обычного текста. УКАЗАНИЯ: Найти в литературе кодовые таблицы Морзе (при неудаче проконсультироваться у преподавателя). Ограничиться цифрами, русскими буквами и обычными знаками препинания. Обратите внимание на функции из <STRING.H>. Предусмотреть обработку ошибочных ситуаций и наглядную форму вывода. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть два режима работы: РУССКИЙ и АНГЛИЙСКИЙ. В начале пользователь выбирает язык сообщения. В режиме РУССКИЙ работа описана выше. В режиме АНГЛИЙСКИЙ используются цифры, латинские буквы и те же знаки препинания. Задача 1.13. "УСТНЫЙ СЧЕТ". Написать программу, осуществляющую четыре арифметических действия с небольшими целыми числами. Вводятся цифрами два числа, N1 и N2 (N1, N2 < 1000), а также одна из операций (сложение, вычитание, умножение, деление). Программа выполняет это действие с введенными числами и выводит результат русскими буквами. Например, при вводе N1 = 128, N2 = 11, действие - сложение, на экран выводится сообщение вида: 10
Сто двадцать восемь прибавить одиннадцать будет сто тридцать девять
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Осуществить расширение этой задачи для чисел не более 10000. Задача 1.14. "ИЗ АРАБОВ В РИМЛЯНЕ". Написать программу, осуществляющую преобразование числа в его запись римскими цифрами. Вводится арабскими цифрами число N (N < 2000). Программа выполняет преобразование этого числа в запись римскими цифрами и выводит результат на экран. При этом используются следующие обозначения: 1 = I, 5 = V, 10 = X, 50 = L, 100 = C, 500 = D, 1000 = M. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога. Сначала попытайтесь найти алгоритм решения этой задачи для чисел не более 10, а затем расширьте его. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Осуществить расширение этой задачи для чисел не более 10000. Задача 1.15. "ИЗ РИМЛЯН В АРАБЫ". Написать программу, осуществляющую преобразование числа, записанного римскими цифрами, в его запись арабскими цифрами. Вводится римскими цифрами число N (N < МММ). Программа выполняет преобразование этого числа в запись арабскими цифрами и выводит результат на экран. При этом используются следующие обозначения: 1 = I, 5 = V, 10 = X, 50 = L, 100 = C, 500 = D, 1000 = M. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога. Сначала попытайтесь найти 11
алгоритм решения этой задачи для чисел не более 10, а затем расширьте его. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Осуществить расширение этой задачи для чисел не более 10000. Задача 1.16. "ШИФРОВАНИЕ ПО АЛФАВИТУКЛЮЧУ". Вводится строка символов не длиннее 64 символов алфавит допустимых символов. Затем вводится другая строка символов - алфавит-ключ, состоящий из допустимых символов, переставленных в произвольном порядке. Каждый символ в любом из алфавитов должен встречаться не более одного раза. Потом вводится текст для шифрования - последовательность строк символов не длиннее 72 символов. Окончание входного потока - ввод строки, начинающейся с символа ".". Максимальное количество строк равно 10. Шифрование состоит в том, что каждый символ каждой входной строки заменяется символом алфавита-ключа, стоящим в той же позиции, что и в алфавите допустимых символов. Формируется также статистическая информация. Примерный вид выходной информации: Исходный алфавит: (строка) Алфавит-ключ: (строка) Входной текст: (последовательность входных строк) Введено К строк, N символов, макс. длина строки М символов. Получен шифрованный текст: (последовательность обработанных строк)
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант.
12
РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод исходного алфавита, алфавита-ключа, числовых и символьных констант из текстовых файлов. Задача 1.17. "ШИФРОВАНИЕ СИММЕТРИЧНОЙ ПЕРЕСТАНОВКОЙ СИМВОЛОВ". Вводится последовательность строк символов не длиннее 50 символов. Допустимые символы в строке - русские буквы, цифры и пробел. Окончание входного потока - ввод строки, начинающейся с символа "/". Максимальное количество строк равно 12. Шифрование состоит в том, что в каждой входной строке символ обменивается местом с символом, симметричным ему относительно середины строки. При нечетном количестве символов в строке центральный символ не изменяется. Формируется также статистическая информация. Примерный вид выходной информации: Входной текст: (последовательность входных строк) Введено К строк, всего N символов, макс. четная длина строки М1 символов, макс. НЕчетная длина строки М2 символов. Получен шифрованный текст: (последовательность обработанных строк)
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. Обратите внимание, что алгоритм шифрования симметричен - для дешифрования нужно применить его же. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод допустимых символов, символа-признака окончания входного потока, числовых констант из текстового файла.
13
Задача 1.18. "ШИФРОВАНИЕ ОБРАТНОЙ ПЕРЕСТАНОВКОЙ БИТОВ". Вводится последовательность строк символов не длиннее 46 символов. Допустимые символы в строке - латинские буквы, цифры, знаки препинания и пробел. Окончание входного потока - ввод строки, начинающейся с символа "?". Максимальное количество строк равно 7. Шифрование состоит в том, что в двоичном коде каждого символа (байте) биты переставляются в обратном порядке, а затем бит 7 устанавливается в 0/1 при не/четном количестве 1-битов в байте, формируя код зашифрованного символа. Формируется также статистическая информация. Примерный вид выходной информации: Входной текст: (последовательность входных строк) Введено К строк, всего N символов, минимальная длина строки М1 символов. максимальная длина строки М2 символов. Получен шифрованный текст: (последовательность обработанных строк)
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод допустимых символов и символа-признака окончания входного потока, числовых констант из текстового файла. 3. Разработать обобщенные алгоритмы шифрования/дешифрования перестановкой битов и реализовать их в программе. Произвольная перестановка битов в байте может задаваться ключевой строкой. Например, для частного случая алгоритма этой задачи такая строка выглядит как "01234567". Задача 1.19. "ШИФРОВАНИЕ ПЕРЕСТАНОВКОЙ ПОЛУБАЙТОВ". Вводится последовательность не более 11 строк длиной не более 26 символов. Допустимые символы в строке - русские буквы и пробел. Окончание входного потока - ввод строки, начинающейся символом ";". Шифрование состоит в том, что в 14
двоичном коде каждого символа (байте) переставляются местами его старшая и младшая тетрады, то есть бит 0 меняется с битом 4, бит 1 с битом 5 и т.д. Формируется также статистическая информация. Примерный вид выходной информации: Входной текст : (последовательность входных строк) Введено N1 строк , N2 символов. Минимальная длина строки N3 символов, Максимальная длина строки N4 символов. Шифрованный текст : (последовательность обработанных строк)
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. Обратите внимание, что алгоритм шифрования симметричен - для дешифрования нужно применить его же. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод допустимых символов и символа-признака окончания входного потока, числовых констант из текстового файла. 3. Разработать обобщенные алгоритмы шифрования/дешифрования перестановкой битов и реализовать их в программе. Произвольная перестановка битов в байте может задаваться ключевой строкой. Например, для частного случая алгоритма этой задачи такая строка выглядит как "32107654". Задача 1.20. "ШИФРОВАНИЕ СУММИРОВАНИЕМ СОСЕДНИХ БАЙТОВ". Вводится последовательность не более 6 строк длиной не более 53 символов. Допустимые символы в строке - латинские буквы, цифры, пробел и знаки препинания. Окончание входного потока - ввод строки, начинающейся символом ":". Алгоритм шифрования (формирования очередного байта выходной строки): b[i] = a[i] + a[i+1], b[k] = a[0] + a[k], i = 0, 1, 2, ..., где a[0] - значение начального байта входной строки, а[k] - значение ее последнего байта, аналогично b[0], b[k] - для выходной 15
строки. Формируется также статистическая информация. Примерный вид выходной информации: Входной текст: (последовательность входных строк) Введено N1 строк, всего N2 символов, Минимальная длина строки N3 символов, Максимальная длина строки N4 символов. Получен шифрованный текст: (последовательность обработанных строк)
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод допустимых символов и символа-признака окончания входного потока, числовых констант из текстового файла. 3. Разработать алгоритм дешифрования и реализовать его в программе. Задача 1.21. "ШИФРОВАНИЕ ПО ПРЕДЫДУЩЕМУ БИТУ ". Вводится последовательность не более 7 строк длиной не более 45 символов. Допустимые символы в строке - „0‟ и „1‟. Окончание входного потока - ввод строки, начинающейся символом "/". Алгоритм шифрования (формирования очередного байта выходной строки): b[0] = a[0], b[k] = „1‟, если a[k] = a[k-1], иначе „0‟; k = 0, 1, 2, ..., где a[0] - значение начального байта входной строки, а[k] - значение ее очередного байта, аналогично b[0], b[k] - для выходной строки. Формируется также статистическая информация. Примерный вид выходной информации: (c) <имя автора, версия и название задачи> Входной текст: (последовательность входных строк) Введено N1 строк, всего N2 символов,
16
Минимальная длина строки N3 символов, Максимальная длина строки N4 символов. Получен шифрованный текст: (последовательность обработанных строк)
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Разработать алгоритм дешифрования и реализовать его в программе. 3. Расширить задачу п. 2 для шифрования/дешифрования обычного текста, используя битовое представление символов и реализовать в программе. Задача 1.22. "ШИФРОВАНИЕ ПОВТОРЕНИЕМ БИТОВ". При передаче цифровых сообщений через каналы связи с помехами для повышения надежности можно повторять каждый бит, например 3 раза. При этом при передаче последовательность 1, 0, 1 заменяется на 1, 1, 1, 0, 0, 0, 1, 1, 1. При приеме и дешифровке такой последовательности три последовательные цифры (бита) заменяются значением той цифры (бита), которая встретилась в этой тройке по крайней мере дважды. Написать программу шифрования и дешифрования. Вводится последовательность не более 5 строк длиной не более 23 символов. Допустимые символы в строке - „0‟ и „1‟. Окончание входного потока - ввод строки, начинающейся символом "*". Формируется также статистическая информация. Примерный вид выходной информации: (c) <имя автора, версия и название задачи> Входной текст: (последовательность входных строк) Введено N1 строк, всего N2 символов, Минимальная длина строки N3 символов, Максимальная длина строки N4 символов. Получен шифрованный текст: (последовательность обработанных строк для передачи) Принятое сообщение: (последовательность дешифрованных строк после приема)
17
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Расширить задачу п.1 для шифрования/дешифрования обычного текста, используя битовое представление символов и реализовать в программе. Задача 1.23. "ОПРЕДЕЛЕНИЕ БИТОВЫХ ПЕРЕХОДОВ". Вводится последовательность не более 10 строк символов не длиннее 37 символов. Допустимые символы в строке: "0", "1" и "." - разделитель битовой группы. Окончание входного потока ввод строки, начинающейся с символа "!". Максимальное количество строк равно 8. Для каждой входной строки нужно выделить битовую группу, а для каждой битовой группы определить ее длину и количество переходов "0" -> "1" и "1" -> "0". Cформировать также статистическую информацию. Примерный вид выходной информации: Входной текст: (входные строки без лишних разделителей) Введено К строк, всего N символов, минимальная длина строки М1 символов, максимальная длина строки М2 символов. Для строки номер 1: Битовая группа Номер 1: (последовательность "0" и "1") длина = С1 переходов "0" -> "1" = N1 переходов "1" -> "0" = N2 ... Битовая группа Номер 10: (последовательность "0" и "1") длина = С10 переходов "0" -> "1" = N10 переходов "1" -> "0" = N20 Всего 10 групп, минимальная длина группы М11 символов. максимальная длина группы М12 символов. Для строки номер К: (вывод аналогичен приведенному выше)
18
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод допустимых символов и символа-признака окончания входного потока, числовых констант из текстового файла. Задача 1.24. "ПОИСК БИТОВОГО ОБРАЗА". Вводится последовательность строк символов не длиннее 16 символов. Каждая строка считается числом (кодом) в двоичной системе и после ввода преобразуется в unsigned int. Допустимые символы в строке: "0", "1". Первая строка длиной не более 5 символов (битов) задает битовый образ для поиска в последующих строках. Окончание входного потока - ввод строки, начинающейся с символа "+". Максимальное количество строк равно 8. Для каждой входной строки, начиная со 2-й, попытаться найти битовый образ, задаваемый 1-й строкой (а не подстроку в строке символов), и подсчитать количество вхождений образа в 16-битовое слово (unsigned int). Cформировать также статистическую информацию. Примерный вид выходной информации: Поиск битового образа: 01100 (1-я строка) в битовых строках: (последовательность остальных входных Всего введено К строк, N символов, минимальная длина строки М1 символов, максимальная длина строки М2 символов. Двоичный код строки 2: (последовательность из "1") Обнаружено С2 вхождений образа, начало 1-го ... Двоичный код строки 8: (последовательность из "1") НЕТ ВХОЖДЕНИЙ ОБРАЗА Максимальное количество вхождений К1 в строке
19
строк)
16-ти "0" и в бите N1 16-ти "0" и К2.
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод допустимых символов и символа-признака окончания входного потока, числовых констант из текстового файла. Задача 1.25. "ОПРЕДЕЛЕНИЕ БИТОВЫХ ИМПУЛЬСОВ". Вводится последовательность не более 3 строк символов не длиннее 75 символов. Допустимые символы в строке: "0" , "1". Окончание входного потока - ввод строки, начинающейся с символа "+". Для каждой входной строки нужно определить минимальную и максимальную длительности битовых импульсов - длину последовательности идущих подряд “0” (0-импульс) и “1” (1импульс). Cформировать также статистическую информацию. Примерный вид выходной информации: (c) <имя автора, версия и название задачи> Входной текст: (входные строки без лишних разделителей) Введено К строк, всего N символов, минимальная длина строки М1 символов, максимальная длина строки М2 символов. Для строки номер 1: мин. длительность 0-импульса = 99, начало в бите макс. длительность 0-импульса= 99, начало в бите мин. длительность 1-импульса = 99, начало в бите макс. длительность 1-импульса= 99, начало в бите (аналогично для остальных строк)
номер номер номер номер
= = = =
99 99 99 99
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 20
2. Предусмотреть ввод допустимых символов и символа-признака окончания входного потока, числовых констант из текстового файла. Задача 1.26. "ЧАСТОТНЫЙ АНАЛИЗ ТЕКСТА". Вводятся имя текстового файла произвольного содержания не длиннее 32 Кбайт и число k (k = 1...9) - см. ниже. Затем проводится подсчет сколько раз в этом файле встретилась каждая русская буква и ее относительных доля в процентах от общего числа таких букв в файле. Принять формат каждого счетчика unsigned int. Определить также k наиболее частых и k наименее частых русских букв. В качестве выходных данных сформировать текстовый файл TEXTPROB.OUT со следующим содержимым (шаблон): (c) <имя автора, версия и название задачи> Обработано XXXXX байтов из файла Русская буква Повторилась, раз Что составляет, % "А" YYY KK.LLL ... "Я" XX QQ.PPP k наиболее частых кода (в порядке снижения повторяемости) Русская буква Повторилась, раз Что составляет, % "П" YYY KK.LLL ... "Л" XX QQ.PPP k наименее частых кода (в порядке снижения повторяемости) Русская буква Повторилась, раз Что составляет, % "Ю" YYY KK.LLL
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, особенно при файловых операциях, а также вывод на экран процента выполнения во время подсчета в качестве индикатора процесса. Хорошим тестом является сам текстовый файл этого задания. РАЗВИТИЕ: 1. Расширить эту задачу на файлы длиной до 2...4 Гбайт и реализовать в программе. 2. Предусмотреть при обработке каждых 64 Кбайт вывод промежуточных выходных файлов с именами TPxxxxxx.OUT, где xxxxxx - порядковый номер. После записи очередного такого файла, его предыдущая версия должна уничтожаться. 21
Задача 1.27. "ПОДСЧЕТ ЭЛЕМЕНТОВ ТЕКСТА". Вводятся имя текстового файла произвольного содержания не длиннее 32 Кбайт. Затем проводится подсчет сколько в нем символов, пробелов, табуляторов, русских и латинских букв, слов, предложений, минимальное и максимальное количество слов в предложении. Принять формат каждого счетчика unsigned int. В качестве выходных данных сформировать текстовый файл LEXPROB.OUT со следующим содержимым (шаблон): (c) < имя автора, версия и название задачи> Обработано XXXXX байтов из файла Встретилось, раз Что составляет, % Всего символов: 9999 100.000 из них пробелов 99 99.999 из них табуляторов 9 99.999 из них латинских букв 888 99.999 из них русских букв 777 99.999 из них иных 666 99.999 В тексте обнаружено: слов = 4444 предложений = 333 мин. количество слов в предложении = 1 макс. количество слов в предложении = 22
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, особенно при файловых операциях, а также вывод на экран процента выполнения во время подсчета в качестве индикатора процесса. Хорошим тестом является сам текстовый файл этого задания. РАЗВИТИЕ: 1. Расширить эту задачу на категории символов "знаки препинания", "цифры", "гласные", "согласные" и реализовать в программе. Задача 1.28. "ЧАСТОТНЫЙ АНАЛИЗ БАЙТОВ ФАЙЛА". Вводятся имя файла произвольного содержания не длиннее 32 Кбайт и число k (k = 1...9) - см. ниже. Затем проводится подсчет количества байтов с одинаковым кодом и их относительных долей в процентах. Всего может быть 256 различных кодов. Принять формат каждого счетчика unsigned int. Определить также k наиболее частых и k наименее частых байтовых кодов. В качестве выходных данных сформировать текстовый файл CHARPROB.OUT со следующим содержимым (шаблон): 22
(c) <имя автора, версия и название задачи> Обработано XXXXX байтов из файла Значение байта Повторилось, раз Что составляет, % 0x0000 000 YYY KK.LLL ... 0x00FF 255 XX QQ.PPP k наиболее частых кода (в порядке снижения повторяемости) Значение байта Повторилось, раз Что составляет, % 0x0090 999 MMM AA.BBB 0x00A1 999 LL CC.EEE ... 0x0056 999 RRRR DD.FFF k наименее частых кода (в порядке снижения повторяемости) Значение байта Повторилось, раз Что составляет, % 0x001B 999 GGG AA.BBB 0x0039 999 NN CC.EEE ... 0x00F1 999 PPPP DD.FFF
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, особенно при файловых операциях, а также вывод на экран процента выполнения во время подсчета в качестве индикатора процесса. РАЗВИТИЕ: 1. Расширить эту задачу на файлы длиной до 2...4 Гбайт и реализовать в программе. 2. Предусмотреть при обработке каждых 64 Кбайт вывод промежуточных выходных файлов с именами CPxxxxxx.OUT, где xxxxxx - порядковый номер. После записи очередного такого файла, его предыдущая версия должна уничтожаться. Задача 1.29. "СОКРАЩЕНИЯ СЛОВ". Вводится последовательность строк символов не длиннее 40 символов. Допустимые символы в строке - русские буквы и пробел. Окончание входного потока - ввод строки, начинающейся с символа "*". Максимальное количество строк равно 5. Затем выделяются отдельные слова последовательности букв, разделенных пробелами. Из исходных слов формируются их сокращения путем удаления гласных букв, например: "ПРОЦЕНТ" -> "ПРЦНТ". Формируется также статистическая информация. Примерный вид выходной информации: Входной текст: (последовательность входных строк, в каждой строке удалены все лишние пробелы)
23
Введено К строк, максимальная длина слова М символов. Получены сокращения: (последовательность строк с сокращениями, в каждой строке удалены все лишние пробелы). Максимальная длина сокращения С символов. Встретилось "а" N1 раз. ... Встретилось "я" N9 раз.
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. Вывод входных и выходных строк проводить ЗАГЛАВНЫМИ буквами. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть два режима работы: РУССКИЙ и АНГЛИЙСКИЙ. В начале пользователь выбирает язык входных и выходных строк. В режиме РУССКИЙ работа описана выше. В режиме АНГЛИЙСКИЙ используются латинские буквы и соответствующие гласные. Задача 1.30. "КОНТЕКСТНЫЙ ПОИСК". Написать программу, осуществляющую поиск образца в текстовых строках. Вводится последовательность не более 5 строк длиной не более 67 символов. Окончание входного текста - ввод строки, начинающейся символом ";". После этого вводится строка-образец для поиска в тексте. Затем осуществляется обработка - поиск образца в строках текста. При этом на экран выводится очередная строка текста для поиска, в случае неудачи поиска - на следующей строке сообщение об этом, начинающееся с символов "*****". В случае успеха найденный в строке текста образец закрашивается другим цветом и пользователь запрашивается о продолжении поиска в той же строке или переходе к поиску в следующей строке текста. Указанная процедура повторяется для всех строк текста. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога с пользователем. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл (най24
денный в строке текста образец подчеркивается в следующей строке файла символом "^") с отображением диалога на экране. 2. Расширить эту задачу применением алгоритма поиска образца и заменой его вхождения в текст другим образцом с предварительным запросом у пользователя разрешения на замену, пропуск или прекращение процедуры поиска и замены образца. Задача 1.31. "РАЗБИЕНИЕ ТЕКСТА". Написать программу, осуществляющую разбиение текста на отдельные строки. Вводится последовательность не более 6 строк длиной не более 52 символов. Окончание входного текста - ввод строки, начинающейся символом "!". После этого вводится символ-разделитель текста на отдельные строки. Затем осуществляется обработка: при обнаружении в очередной строке символа-разделителя последовательность символов строки от начала строки (от предыдущего символаразделителя) до обнаруженного символа разделителя (до конца строки текста) выводится как отдельная строка экрана. Указанная процедура повторяется для всех строк текста. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую замену в тексте программы числовых и символьных констант и наглядную форму диалога с пользователем. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. Задача 1.32. “ПЕРСОНЫ”. Написать программу, которая, запросив у пользователя максимально 7 строк, в каждой из которых содержится информация вида: Фамилия Имя Отчество
и режим преобразования строки (выбор из меню): 1. Имя Отчество Фамилия 2. И. О. Фамилия 3. Фамилия И. О.
осуществляет указанное преобразование и выводит на экран соответствующие выходные строки. 25
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую смену числовых констант в тексте программы и продумать наглядный диалог с пользователем. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Расширить задачу п. 1, добавив режим сортировки выходных строк по “Фамилия”. Задача 1.33. “БЕЗ ЛИШНИХ ПРОБЕЛОВ”. Написать программу, которая, запросив у пользователя максимально 9 строк длиной до 72 символов каждая, анализирует их и выводит на экран выходные строки с удаленными лишними пробелами: 2 и более пробелов заменяются одним. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую смену числовых констант в тексте программы и продумать наглядный диалог с пользователем. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Расширить задачу п.1, добавив режим вызова программы из командной строки с указанием имен входного и выходного файлов. Задача 1.34. “ПРОБЕЛЫ И ТАБУЛЯТОРЫ”. Структурированные отступами тексты программ содержат много символов “пробел”. Написать программу, которая, запросив у пользователя имя входного текстового файла и цену символа “HT- горизонтальный табулятор” (2...8 символьных позиций) формирует выходной текстовый файл HTFILE.OUT, в котором все допустимые последовательности пробелов заменены символом табулятора. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую смену числовых констант в тексте программы и продумать наглядный диалог с пользователем. Сначала найдите алго26
ритм замены для одной строки. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Расширить эту задачу добавлением режима обратной замены табуляторов на пробелы. 2. Расширить задачу п. 1, добавив режим вызова программы из командной строки с указанием необходимых параметров. Задача 1.35. ”НАЙТИ ВСЕ СИМВОЛЫ”. Написать программу, которая, запросив у пользователя строку длиной до 64 символов, символ для поиска и символ-указатель, анализирует строку на вхождение в нее символа и в случае успеха выводит на экран сообщение следующего вида с указанием вхождений: Входная строка: qwerty1230asdf345 Символ для поиска = 3, символ-указатель = ^ Обнаружено вхождений: 2 qwerty1230asdf345 ^ ^
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую смену числовых констант в тексте программы и продумать наглядный диалог с пользователем. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Расширить задачу п. 1, заменив указание вхождений символа в строку раскраской этого символа в строке другим цветом. Задача 1.36. “ПАЛИНДРОМЫ”. Палиндромом называют слово, которое читается одинаково как слева направо, так и справа налево, например, “ABBA” и “1991” - палиндромы. Написать программу, которая, запросив у пользователя максимально 5 строк, в каждой из которых содержится до 3 слов длиной до 13 символов каждое, анализирует их и выводит на экран сообщение палиндром ли каждое слово. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, легкую смену числовых констант в тексте программы и про27
думать наглядный диалог с пользователем. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Расширить задачу п.1, добавив раскраску палиндромов и других слов разными цветами на экране, а также ввод максимальной длины палиндрома для поиска. Задача 1.37. "КРУПНЫМИ БУКВАМИ". Написать программу, осуществляющую вывод в центре экрана короткой текстовой строки большими буквами. Каждая буква должна занимать 7 горизонтальных и 9 вертикальных символьных позиций на экране. Текст строки и символ рисования букв задается пользователем. Например, если введена строка "СИТО" и символ рисования "*", то в центре экрана должно появиться следующее изображение: *****
* * ******* ***** * * ** * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * ***** * * * *****
* * * * * * *
УКАЗАНИЯ: Ограничиться русскими буквами. Предусмотреть обработку ошибочных ситуаций и продумать удобный диалог с пользователем. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть режим рисования каждой буквы строки символом самой этой буквы. Задача 1.38. "БЕГУЩИЙ СИМВОЛ". Написать программу, которая запросив у пользователя один символ, номер строки 28
экрана для показа и константу скорости движения, выводит этот символ пересекающим экран справа налево с заданной скоростью. УКАЗАНИЯ: Диапазон констант скорости движения символа подобрать экспериментально. Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога с пользователем. РАЗВИТИЕ: 1. Предусмотреть режимы ввода: с клавиатуры и из текстового файла. 2. Осуществить расширение задачи: задание цветов экрана и символа, направления движения (слева направо, сверху вниз, по диагонали и др.) и реализовать это в программе. Задача 1.39. "ВЫВОД СТРОКИ ПО ВЫБОРУ". Написать программу, которая, запросив у пользователя строку символов и вариант ее вывода на экран (1. вертикально; 2. по диагонали с правого угла; 3. по диагонали с левого угла), выводит строку на экран указанным образом. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога с пользователем. РАЗВИТИЕ: 1. Предусмотреть режимы ввода: с клавиатуры и из текстового файла. 2. Осуществить расширение задачи: задание цветов экрана и строки, ее движение по экрану (скорость движения подобрать экспериментально) и реализовать это в программе. Задача 1.40. ”ЦИФРЫ НА КОНВЕРТЕ”. Написать программу, которая, запросив у пользователя число N (0 < N < 999999), символ для рисования и координаты строки и колонки для показа, выводит полученное число (почтовый индекс) в виде стилизованных цифр как на почтовом конверте, используя для изображения каждой цифры матрицу 4 х 8 символьных позиций и межцифровое расстояние в 2 символа. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и продумать наглядный диалог с пользователем. РАЗВИТИЕ: 1. Расширить эту задачу режимом вывода каждой стилизованной цифры символом самой этой цифры. 29
2. Расширить задачу п. 1, добавив задание цветов экрана и символа рисования. Задача 1.41. ”ШЕСТНАДЦАТЕРИЧНЫЕ ЦИФРЫ”. Написать программу, которая, запросив у пользователя число X (0x00000000 < X < 0xFFFFFFFF), символ для рисования и координаты строки и колонки для показа, выводит полученное число в виде стилизованных шестнадцатеричных цифр 7-сегментного электронного индикатора, используя для каждой цифры матрицу 8 х 16 символьных позиций и межцифровое расстояние в 1 символ. При вводе допустимы символы 0...9, a...f, A...F. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и продумать наглядный диалог с пользователем. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Расширить эту задачу, добавив задание цветов экрана и символа рисования и режимом вывода каждой стилизованной цифры символом самой этой цифры. 2. Расширить задачу п. 1, добавив ввод изменяемой длины числа (2, 4, 8 цифр). Задача 1.42. "СИМВОЛ ПО СПИРАЛИ". Написать программу, которая запросив у пользователя один символ и константу скорости движения, выводит этот символ по раскручивающейся из центра экрана спирали с заданной скоростью. УКАЗАНИЯ: Диапазон констант скорости движения символа подобрать экспериментально. Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога с пользователем. РАЗВИТИЕ: 1. Предусмотреть режимы ввода: с клавиатуры и из текстового файла. 2. Осуществить расширение задачи: задание цветов экрана и символа, направления движения (расручивающаяся и скручивающаяся спираль) и реализовать это в программе. Задача 1.43. "КЛЮЧЕВЫЕ СЛОВА СИ". Написать программу, осуществляющую подсчет ключевых слов языка Си во входном тексте. Вводится последовательность не более 5 строк длиной не более 75 символов. Окончание входного текста - ввод 30
строки, начинающейся символом "@". На выходе формируется следующая информация: (c) <имя автора, версия и название задачи> Входной текст: (последовательность входных строк) Введено N1 строк, всего N2 символов, Минимальная длина строки N3 символов, Максимальная длина строки N4 символов. Обнаружено N5 ключевых слов языка Си: "for" встретилось N5 раз "if" встретилось N6 раз ... (ключевые слова в алфавитном порядке) Чаще всех встретилось ключевое слово "while": N16 раз
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. Обратите внимание на функции из <STRING.H>. Хорошим тестом является исходный текст самой этой программы. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Предусмотреть ввод символа-признака окончания входного текста и числовых констант из текстового файла. Задача 1.44. "ЧИСЛА В СИ". Написать программу, осуществляющую отбор из входного текста последовательностей символов, удовлетворяющих правилам задания числовой константы типа int в языке Си (отбор лексем-чисел типа int). Вводится последовательность не более 7 строк длиной не более 57 символов. Окончание входного текста - ввод строки, начинающейся символом "/". На выходе формируется следующая информация: (c) <имя автора, версия и название задачи> Входной текст: (последовательность входных строк) Введено N1 строк, всего N2 символов, Минимальная длина строки N3 символов, Максимальная длина строки N4 символов. Выходной текст (с выделенными другим цветом лексемамичислами):
31
Строка 1: физика 123 матан 0x1FDA информатика -------<-- выделено цветом Строка К: фикус 0794 while -945 end of text ---<-- выделено цветом Чаще всех встретилась лексема-число "123": N6 раз
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и легкую замену в тексте программы числовых и символьных констант. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовые файлы (входной текст с удаленными лексемами-числами и файл с лексемами-числами с указанием номера строки, где они были обнаружены) с отображением диалога на экране. 2. Предусмотреть ввод символа-признака окончания входного текста и числовых констант из текстового файла. Задача 1.45. "СКОБКИ В СИ". Написать программу, осуществляющую подсчет количества пар круглых и фигурных скобок, а также минимальной и максимальной вложенности скобок каждого типа в текстовом файле, содержащем синтаксически правильную программу на Си. Вводится имя входного файла, затем после обработки на экране и в выходном файле OUTFILE.DAT формируется следующая информация: (c) <имя автора, версия и название задачи> Входной файл: INFILEN.AME содержит К1 строк, К2 символов. Пар круглых скобок = N1, минимальная вложенность = N2, максимальная вложенность = N3 Пар фигурных скобок = N4, минимальная вложенность = N5, максимальная вложенность = N6
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций. Обратите внимание на функции из <STRING.H>. Хорошим тестом является исходный текст самой этой программы. РАЗВИТИЕ: 1. Расширить эту задачу формированием дополнительного выходного файла SMART.FIL, содержащего текст исходной программы, НО с удаленной избыточностью фигурных скобок. 32
Задача 1.46. "КОММЕНТАРИИ В СИ". Написать программу, осуществляющую подсчет количества комментариев и строк с комментариями, а также минимальной и максимальной длины комментария (в строках) в текстовом файле, содержащем синтаксически правильную программу на Си. Вводится имя входного файла, затем после обработки на экране и в выходном файле OUTFILE.DAT формируется следующая информация: (c) <имя автора, версия и название задачи> Входной файл: INFILEN.AME содержит К1 строк, К2 символов. Комментариев = N1, мин. длина, строк = N2, макс. длина, строк = N3 Строк с комментариями = N4, мин. длина, символов = N5, макс. длина, символов = N6
УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций. Обратите внимание на функции из <STRING.H>. Хорошим тестом является исходный текст самой этой программы. РАЗВИТИЕ: 1. Расширить эту задачу подсчетом общего количества строк, содержащих только комментарии, а также их минимальной и максимальной длины в строках и символах. Задача 1.47. "ВЕДОМОСТЬ УСПЕВАЕМОСТИ". Написать программу, обрабатывающую успеваемость студентов академической группы. Вводятся одна за другой пары значений - Фамилия И.О. студента и индекс его оценки на экзамене (0 - академический отпуск, 1 - неявка по неизвестной причине, 2 - неудовлетворительно, 3 - удовлетворительно, 4 - хорошо, 5 - отлично, 6 - не допущен, 7 - нет в группе, 8 - сессия продлена, 9 - неявка по уважительной причине). Процедура ввода завершается при вводе индекса оценки меньше 0 или больше 9. Затем после обработки выводятся средний балл по группе (учитываются только индексы 2, 3, 4, 5), для каждого индекса оценки с его названием общее количество студентов, их относительная доля в процентах и их Фамилии И.О., а в конце общее количество студентов. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога. 33
РАЗВИТИЕ: 1. Предусмотреть режимы ввода/вывода: только экран и клавиатура, ввод из текстового файла и вывод в текстовый файл с отображением диалога на экране. 2. Расширить эту задачу для составления отчетов успеваемости с указанием академической группы и названия сдаваемого предмета. Задача 1.48. “ТЕЛЕФОННЫЙ СПРАВОЧНИК". Написать программу электронного телефонного справочника. Вводятся одна за другой пары значений - Фамилия И.О. знакомого и номер его телефона. Процедура ввода завершается при вводе пустой строки. Затем после обработки выводится бщее количество записей, предлагается ввести имя файла, после чего все записи переписываются в текстовый файл. Предусмотреть также режимы загрузки файласправочника, его просмотра, добавления записи в конец, поиска телефона по Фамилия И.О. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций, особенно при файловых операциях и наглядную форму диалога с пользователем. РАЗВИТИЕ: 1. Расширить возможности записи, добавив в нее поля "домашний телефон", "рабочий телефон", "адрес" и реализовать это в программе. 2. Расширить эту задачу введением режимов удаления указанной записи и сортировки справочника по Фамилия И.О. и реализовать это в программе. Задача 1.49. "ЗАПИСНАЯ КНИЖКА". Написать программу, в основу которой положен список дней рождений (число, месяц, год) своих родных и друзей. Программа должна работать в следующих режимах: 1) пополнение списка; 2) поиск дня рождения по имени; 3) определение всех именинников, родившихся в заданном месяце (поиск по месяцу).
34
Выводимая информация кроме имени и даты должна содержать количество лет, исполняющихся имениннику в данном году. Записная книжка хранится в текстовом файле. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Расширить возможности записи, добавив в нее поля "любимые подарки", "телефон", "адрес" и реализовать это в программе. 2. Расширить эту задачу введением режимов удаления указанной записи и сортировки списка по имени и реализовать это в программе. Задача 1.50. "СЛОВАРЬ СОКРАЩЕНИЙ". Написать программу, в основу которой положен текстовый файл со следующим форматом: /* 1-я строка - сокращение */ МАТАН /* 2-я строка - полное название */ МАТЕМАТИЧЕСКИЙ АНАЛИЗ
Программа должна работать в следующих режимах: 1) загрузка файла-словаря; 2) пополнение словаря; 3) поиск названия по его сокращению; 4) сохранение файла-словаря. Если точное сокращение не найдено, то должно выводится ближайшее к нему с предупреждением об этом. УКАЗАНИЯ: Предусмотреть обработку ошибочных ситуаций и наглядную форму диалога. Обратите внимание на функции из <STRING.H>. РАЗВИТИЕ: 1. Расширить эту задачу введением режимов удаления указанной записи и сортировки словаря по сокращению и реализовать это в программе.
35
Задачи для групп А2-04, 05 Задача 2.1. Написать тестирующую main() и следующую функцию int TStrRunXR( int char int int );
y, /* номер строки показа на экране */ *text, /* текст строки сообщения */ sa, /* атрибут строки сообщения */ ba /* атрибут чистого экрана */
/* В текстовом режиме показывает строку, бегущую справа налево, до нажатия любой клавиши, после чего возвращает код нажатой клавиши. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.2. Написать тестирующую main() и следующую функцию int TStrRunXL( int y, char *text, int sa, int ba );
/* номер строки показа на экране */ /* текст строки сообщения */ /* атрибут строки сообщения */ /* атрибут чистого экрана */
/* В текстовом режиме показывает строку, бегущую слева направо, до нажатия любой клавиши, после чего возвращает код нажатой клавиши. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.3. Написать тестирующую main() и следующую функцию int TStrRunYD( int char int int );
x, *text, sa, ba
/* номер столбца показа на экране /* текст строки сообщения /* атрибут строки сообщения /* атрибут чистого экрана
*/ */ */ */
/* В текстовом режиме показывает строку, бегущую снизу вверх, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.4. Написать тестирующую main() и следующую функцию 36
int TStrRunYU( int char int int );
x, *text, sa, ba
/* номер столбца показа на экране /* текст строки сообщения /* атрибут строки сообщения /* атрибут чистого экрана
*/ */ */ */
/* В текстовом режиме показывает строку, бегущую сверху вниз, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.5. Написать тестирующую main() и следующую функцию int TStrRunAR( int char int int );
y, *text, sa, ba
/* номер строки показа на экране /* текст строки сообщения /* атрибут строки сообщения /* атрибут выделения символа строки
*/ */ */ */
/* В текстовом режиме показывает строку, по которой справа налево пробегает атрибут ba, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1,-2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.6. Написать тестирующую main() и следующую функцию int TStrRunAL( int char int int );
y, *text, sa ba
/* номер строки показа на экране /* текст строки сообщения /* атрибут строки сообщения /* атрибут выделения символа строки
*/ */ */ */
/* В текстовом режиме показывает строку, по которой слева направо пробегает атрибут ba, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.7. Написать тестирующую main() и следующую функцию int TStrRunAD( int char int int );
x, *text, sa, ba
/* номер столбца показа на экране /* текст строки сообщения /* атрибут строки сообщения /* атрибут выделения символа строки
37
*/ */ */ */
/* В текстовом режиме показывает строку, по которой сверху вниз пробегает атрибут ba, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.8. Написать тестирующую main() и следующую функцию int TStrRunAU( int char int int );
x, *text, sa, ba
/* номер столбца показа на экране /* текст строки сообщения /* атрибут строки сообщения /* атрибут выделения символа строки
*/ */ */ */
/* В текстовом режиме показывает строку, по которой снизу вверх пробегает атрибут ba, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает 1,-2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.9. Написать тестирующую main() и следующую функцию BOOL BitStrFind( char int BOOL int int );
*str, eol, bitval, *nbyte, *nbit
/* текст строки - области поиска /* код концевого маркера строки /* значение искомого бита /* номер байта с найденным битом /* номер найденного бита в байте
*/ */ */ */ */
/* В строке str, рассматриваемой как строка битов, ищет бит со значением bitval и возвращает при успехе TRUE и координаты найденного бита в *nbyte, *nbit, иначе FALSE. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.10. Написать тестирующую main() и следующую функцию int BitChFind( char int BOOL int int );
arr[], len, bitval, *nbyte, *nbit
/* массив байтов - область поиска /* длина массива байтов /* значение искомого бита /* номер байта с найденным битом /* номер найденного бита в байте
*/ */ */ */ */
/* В массиве arr[], рассматриваемом как последовательность битов длиной 8*len, ищет бит со значением bitval и возвращает при успехе 1 и координаты найденного бита в *nbyte, *nbit, иначе 0. При ошибке во входных параметрах возвращает -1, -2,... по типу ошиб38
ки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.11. Написать тестирующую main() и следующую функцию int BitIntFind( int int BOOL int int );
arr[], len, bitval, *nbyte, *nbit
/* массив целых - область поиска /* длина массива целых /* значение искомого бита /* номер байта с найденным битом /* номер найденного бита в байте
*/ */ */ */ */
/* В массиве arr[], рассматриваемом как последовательность битов длиной 16*len, ищет бит со значением bitval и возвращает при успехе 1 и координаты найденного бита в *nbyte, *nbit, иначе 0. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.12. Написать тестирующую main() и следующую функцию int BitLongFind( long arr[], int len, BOOL bitval, long *nbyte, long *nbit );
/* массив длинных целых - область поиска /* длина этого массива /* значение искомого бита /* номер байта с найденным битом /* номер найденного бита в байте
*/ */ */ */ */
/* В массиве arr[], рассматриваемом как последовательность битов длиной 32*len, ищет бит со значением bitval и возвращает при успехе 1 и координаты найденного бита в *nbyte, *nbit, иначе 0. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.13. Написать тестирующую main() и следующую функцию int BitFileFind( char BOOL long char );
*fn, bitval, *nbyte, *nbit
/* имя файла - области поиска /* значение искомого бита /* номер байта с найденным битом /* номер найденного бита в байте
*/ */ */ */
/* В файле fn, рассматриваемом как строка битов, ищет бит со значением bitval и возвращает при успехе 1 и координаты найденного 39
бита в *nbyte, *nbit, иначе 0. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.14. Написать тестирующую main() и следующую функцию int BitStrCnt( char *str, /* текст строки - области подсчета */ int *ones, /* количество 1-битов в строке */ int *zeros /* количество 0-битов в строке */ );
/* В строке str, рассматриваемой как строка битов, подсчитывает количество 0/1-битов, сообщая их в *zeros, *ones и возвращает длину строки в байтах. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.15. Написать тестирующую main() и следующую функцию int BitChCnt( char int int int );
arr[], len, *ones, *zeros
/* массив байтов - области подсчета /* длина массива байтов /* число 1-битов в массиве /* число 0-битов в массиве
*/ */ */ */
/* В массиве arr[], рассматриваемом как последовательность битов длиной 8*len, подсчитывает количество 0/1 битов, сообщая их в *zeros, *ones и возвращает 0. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.16. Написать тестирующую main() и следующую функцию int BitIntCnt( int int int int );
arr[], /* массив целых - области подсчета len, /* длина массива целых *ones, /* количество 1-битов в массиве *zeros /* количество 0-битов в массиве
*/ */ */ */
/* В массиве arr[], рассматриваемом как последовательность битов длиной 16*len, подсчитывает количество 0/1 битов, сообщая их в *zeros, *ones и возвращает 0. При ошибке во входных параметрах возвращает -1,-2,... по типу ошибки (доопределить самостоя40
тельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.17. Написать тестирующую main() и следующую функцию int BitIntCnt( long arr[], int len, long *ones, long *zeros );
/* массив длинных целых - области подсчета /* длина этого массива /* количество 1-битов в массиве /* количество 0-битов в массиве
*/ */ */ */
/* В массиве arr[], рассматриваемом как последовательность битов длиной 32*len, подсчитывает количество 0/1-битов, сообщая их в *zeros, *ones и возвращает 0. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.18. Написать тестирующую main() и следующую функцию long BitFileCnt( char *fn, /* имя файла - области подсчета */ long *ones, /* число 1-битов в файле */ long *zeros /* число 0-битов в файле */ );
/* В файле fn, рассматриваемом как строка битов, подсчитывает количество 0/1-битов, сообщая их в *zeros, *ones и возвращает длину файла в байтах. При ошибке во входных параметрах возвращает -1, -2, ... по типу ошибки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.19. Написать тестирующую main() и следующую функцию int BitStrHist( char *str, /* текст строки - область подсчета */ int hist[8] /* счетчики 1-битов в каждом байте */ );
/* Подсчитывает количество единиц в каждом бите для всех байтов строки str, накапливая их в массиве hist[], где индексом массива служит номер бита в байте. Возвращает длину строки. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.20. Написать тестирующую main() и следующую функцию 41
int BitChHist( char arr[[], /* массив байтов - область подсчета */ int len, /* длина массива байтов */ int hist[8] /* счетчики 1-битов в каждом байте */ );
/* Подсчитывает количество единиц в каждом бите для всех байтов массива arr[], накапливая их в массиве hist[], где индексом массива служит номер бита в байте. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно), иначе 0. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.21. Написать тестирующую main() и следующую функцию int BitIntHist( int arr[], /* массив целых - область подсчета */ int len, /* длина массива целых */ int hist[16] /* счетчики 1-битов в каждом слове */ );
/* Подсчитывает количество единиц в каждом бите для всех слов массива arr[], накапливая их в массиве hist[], где индексом массива служит номер бита в слове. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно), иначе 0. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.22. Написать тестирующую main() и следующую функцию int BitLongHist( long arr[], /* массив длинных целых - область подсчета */ int len, /* длина этого массива */ long hist[32] /* счетчики 1-битов в каждом двойном слове */ );
/* Подсчитывает количество единиц в каждом бите для всех двойных слов массива arr[], накапливая их в массиве hist[], где индексом массива служит номер бита в двойном слове. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно), иначе 0. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.23. Написать тестирующую main() и следующую функцию long BitFileHist( char *fn, /* имя файла - области подсчета */ long hist[8] /* счетчики 1-битов в каждом байте */ );
42
/* Подсчитывает количество единиц в каждом бите для всех байтов файла fn, накапливая их в массиве hist[], где индексом массива служит номер бита в байте и возвращает длину файла в байтах. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.24. Написать тестирующую main() и следующую функцию int ChStrHist( char *str, /* текст строки - области подсчета */ int hist[256] /* счетчики одинаковых байтов */ );
/* Подсчитывает количество байтов с одинаковым значением для всех байтов строки str, накапливая их в массиве hist[], где индексом массива служит значение байта. Возвращает длину строки. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.25. Написать тестирующую main() и следующую функцию int ChArrHist( char arr[], /* массив байтов - области подсчета */ int len, /* длина массива байтов */ int hist[256] /* счетчики одинаковых байтов */ );
/* Подсчитывает количество байтов с одинаковым значением для всех байтов массива arr[], накапливая их в массиве hist[], где индексом массива служит значение байта. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно), иначе 0. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.26. Написать тестирующую main() и следующую функцию int IntArrHist( int arr[], /* массив слов - области подсчета int len, /* длина массива слов int hist0[256], /* счетчики одинаковых младших байтов int hist1[256] /* счетчики одинаковых старших байтов );
*/ */ */ */
/* Подсчитывает количество байтов с одинаковым значением для всех байтов массива arr[], накапливая их в массивах hist0[] и hist1[], где индексом массива служит значение байта. При ошибке 43
во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно), иначе 0. В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.27. Написать тестирующую main() и следующую функцию long ChFileHist( char *fn, /* имя файла - области подсчета */ long hist[256] /* счетчики одинаковых байтов */ );
/* Подсчитывает количество байтов с одинаковым значением для всех байтов файла fn, накапливая их в массиве hist[], где индексом массива служит значение байта и возвращает длину файла. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). В main() предусмотреть вывод времени исполнения функции в тиках. */ Задача 2.28. Написать тестирующую main() и следующую функцию int TPutBitLong( int long int int int );
x, int y, /* координаты вывода num, /* число для вывода term, /* код символа-разделителя тетрад na, /* атрибут цифр ta /* атрибут символа-разделителя
*/ */ */ */ */
/* В текстовом режиме выводит число num в 2-системе счисления группами по 4 цифры (тетрадами), отделяя их друг от друга символом term с указанными атрибутами na и ta и возвращая 0. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.29. Написать тестирующую main() и следующую функцию int TPutOctLong( int x, int y, /* координаты вывода long num, /* число для вывода int term, /* код символа-разделителя триад int na, /* атрибут цифр int ta /* атрибут символа-разделителя );
*/ */ */ */ */
/* В текстовом режиме выводит число num в 8-системе счисления группами по 3 цифры (триадами), отделяя их друг от друга символом term с указанными атрибутами na и ta и возвращая 0. Разбиение на триады производится справа налево. В неполной триаде 44
всегда выводятся левые нули. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно).*/ Задача 2.30. Написать тестирующую main() и следующую функцию int TPutDecLong( int long int int int );
x, int y, /* координаты вывода num, /* число для вывода term, /* код символа-разделителя триад na, /* атрибут цифр ta /* атрибут символа-разделителя
*/ */ */ */ */
/* В текстовом режиме выводит число num в 10-системе счисления группами по 3 цифры (триадами), отделяя их друг от друга символом term с указанными атрибутами na и ta и возвращая 0. Разбиение на триады производится справа налево. Перед выводом цифр выводит знак числа: "+" или "-". При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно).*/ Задача 2.31. Написать тестирующую main() и следующую функцию int TPutHexLong( int long int int int );
x, int y, /* координаты вывода num, /* число для вывода term, /* код символа-разделителя тетрад na, /* атрибут цифр ta /* атрибут символа-разделителя
*/ */ */ */ */
/* В текстовом режиме выводит число num в 16-системе счисления группами по 4 цифры (тетрадами), отделяя их друг от друга символом term с указанными атрибутами na и ta и возвращая 0. Разбиение на триады производится справа налево. В левой тетраде всегда выводятся левые нули. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.32. Написать тестирующую main() и следующую функцию int TPutHist8( int long int int int
y, hist[8], sym, ca, ha,
/* номер строки вывода на экране /* счетчики 8 каналов /* символ гистограммы /* атрибут имени канала /* атрибут гистограммы
45
*/ */ */ */ */
int int );
da, pa
/* атрибут значения счетчика */ /* атрибут доли счетчика в процентах */
/* В текстовом режиме начиная со строки y выводит 8 строк гистограммы по следующему шаблону (sym = '*', i - номер канала с 0): hist[i]!************* 13 35.6 %. имя гистограмма значение счетчика канала канала доля счетчика
При необходимости проводит масштабирование и в этом случае выводит дополнительную 9-ю строку по следующему шаблону: Каждый символ "*" = 3 (коэффициент масштаба)
При нормальном входе возвращает 0, при ошибке во входных параметрах сразу возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.33. Написать тестирующую main() и следующую функцию int TPutHist( int int int int int int int int );
hist[], hmax, lines, sym, ca, ha, da, pa
/* счетчики каналов /* количество каналов /* количество строк показа /* символ гистограммы /* атрибут имени канала /* атрибут гистограммы /* атрибут значения счетчика /* атрибут доли счетчика в процентах
*/ */ */ */ */ */ */ */
/* В текстовом режиме начиная со строки 0 экрана выводит lines строк гистограммы по следующему шаблону (sym = '*', i - номер канала с 0): hist[i]!************ 12 17.1 %. имя гистограмма значение счетчика канала канала доля счетчика
Реакция на управляющие клавиши: kbESC kbPGUP
- выход из функции; - на (lines-1) строк вверх по массиву hist[];
46
kbPGDN kbHOME kbEND
- на (lines-1) строк вниз по массиву hist[]; - показ первых lines строк; - показ последних lines строк;
При нормальном входе возвращает 0, при ошибке во входных параметрах сразу возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.34. Написать тестирующую main() и следующую функцию int TFrameDraw( int x, int y, int xend, int yend, int fsym, int tsym, int sa, int fa, int ta );
/* координаты рамки
*/
/* начальный символ рамки /* символ-заполнитель ее внутренности /* атрибут "чистого" экрана /* атрибут символа рамки /* атрибут символа-заполнителя
*/ */ */ */ */
/* В текстовом режиме очищает экран и рисует прямоугольную рамку символом fsym с заполнением ее внутренности символом tsym с указанными атрибутами. После этого ожидает нажатия любой клавиши: при нажатии kbESC очищает весь экран и выходит, при любой другой - код этой клавиши становится символом fsym и рисуется новая рамка. При нормальном входе возвращает 0, при ошибке во входных параметрах сразу возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.35. Написать тестирующую main() и следующую функцию int TFrameSize( int x, int y, /* координаты рамки */ int xend, int yend, int fsym, /* начальный символ рамки */ int tsym, /* символ-заполнитель ее внутренности */ int fa, /* атрибут символа рамки */ int ta /* атрибут символа-заполнителя */ );
/* В текстовом режиме рисует прямоугольную рамку символом fsym с заполнением ее внутренности символом tsym с указанными атрибутами. После этого ожидает нажатия любой клавиши и выполняет: kbESC
- выходит из функции;
47
kbF1...kbF10 kbUP kbDN kbRT kbLT kbHOME
-
установить step = 1...10; увеличить на step высоту рамки; уменьшить на step высоту рамки; увеличить на step ширину рамки; уменьшить на step ширину рамки; восстановить исходные размеры рамки.
При нормальном входе возвращает 0, при ошибке во входных параметрах сразу возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.36. Написать тестирующую main() и следующую функцию int TFrameMove( int x, int y, /* координаты рамки int xend, int yend, int fsym, /* начальный символ рамки int tsym, /* символ-заполнитель ее внутренности int fa, /* атрибут символа рамки int ta /* атрибут символа-заполнителя );
*/ */ */ */ */
/* В текстовом режиме рисует прямоугольную рамку символом fsym с заполнением ее внутренности символом tsym с указанными атрибутами. После этого ожидает нажатия любой клавиши и выполняет: kbESC kb0...kb9 kbUP kbDN kbRT kbLT kbHOME
-
выходит из функции; установить step = 1...10; сдвинуть рамку на step позиций вверх; сдвинуть рамку на step позиций вниз; сдвинуть рамку на step позиций вправо; сдвинуть рамку на step позиций влево; восстановить исходное положение рамки.
При ошибке во входных параметрах сразу возвращает -1,-2,... по типу ошибки (доопределить самостоятельно), иначе 0. */ Задача 2.37. Написать тестирующую main() и следующую функцию int far GStrRunXR( int left, int top, /* координаты рамки со строкой int right, int bottom, /* показа на экране char far *text, /* текст строки сообщения
48
*/ */ */
int fcolor, int tcolor, int bcolor );
/* цвет рамки, */ /* цвет текста, */ /* цвет фона, все на время функции */
/* В графическом режиме показывает строку, бегущую справа налево в неподвижной одинарной рамке, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.38. Написать тестирующую main() и следующую функцию int far GStrRunXL( int left, int top, int right, int bottom, char far *text, int fcolor, int tcolor, int bcolor );
/* координаты рамки со строкой */ /* показа на экране */ /* текст строки сообщения */ /* цвет рамки, */ /* цвет текста, */ /* цвет фона, все на время функции */
/* В графическом режиме показывает строку, бегущую слева направо в неподвижной двойной рамке, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.39. Написать тестирующую main() и следующую функцию int far GStrRunYD( int left, int top, int right, int bottom, char far *text, int fcolor, int tcolor, int bcolor );
/* координаты рамки со строкой */ /* показа на экране */ /* текст строки сообщения */ /* цвет рамки, */ /* цвет текста, */ /* цвет фона, все на время функции */
/* В графическом режиме показывает строку, бегущую снизу вверх в неподвижной одинарной рамке, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ 49
Задача 2.40. Написать тестирующую main() и следующую функцию int far GStrRunYU( int left, int top, int right, int bottom, char far *text, int fcolor, int tcolor, int bcolor );
/* координаты рамки со строкой */ /* показа на экране */ /* текст строки сообщения */ /* цвет рамки, */ /* цвет текста, */ /* цвет фона, все на время функции */
/* В графическом режиме показывает строку, бегущую сверху вниз в неподвижной двойной рамке, до нажатия любой клавиши, после чего возвращает ее код. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.41. Написать тестирующую main() и следующую функцию int far GPutBitLong( int x, int y, long num, int term, int dcolor, int tcolor );
/* координаты вывода */ /* число для вывода */ /* символ-разделитель тетрад */ /* цвет цифр */ /* цвет символа-разделителя */
/* В графическом режиме выводит число num в 2-системе счисления группами по 4 цифры (тетрадами), отделяя их друг от друга символом term с указанными цветами и возвращая 0. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.42. Написать тестирующую main() и следующую функцию int far GPutOctLong( int long int int int );
x, int y, num, term, dcolor, tcolor
/* координаты вывода /* число для вывода /* символ-разделитель триад /* цвет цифр /* цвет символа-разделителя
*/ */ */ */ */
/* В графическом режиме выводит число num в 8-системе счисления группами по 3 цифры (триадами), отделяя их друг от друга символом term с указанными цветами и возвращая 0. Разбиение на триады производится справа налево. В неполной триаде всегда 50
выводятся левые нули. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.43. Написать тестирующую main() и следующую функцию int far GPutDecLong( int long int int int );
x, int y, num, term, dcolor, tcolor
/* координаты вывода /* число для вывода /* символ-разделитель триад /* цвет цифр /* цвет символа-разделителя
*/ */ */ */ */
/* В графическом режиме выводит число num в 10-системе счисления группами по 3 цифры (триадами), отделяя их друг от друга символом term с указанными цветами и возвращая 0. Разбиение на триады производится справа налево. Перед выводом цифр выводит знак числа: "+" или "-". При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.44. Написать тестирующую main() и следующую функцию int far GPutHexLong( int long int int int );
x, int y, num, term, dcolor, tcolor
/* координаты вывода /* число для вывода /* символ-разделитель тетрад /* цвет цифр /* цвет символа-разделителя
*/ */ */ */ */
/* В графическом режиме выводит число num в 16-системе счисления группами по 4 цифры (тетрадами), отделяя их друг от друга символом term с указанными цветами и возвращая 0. Разбиение на тетрады производится справа налево. В левой тетраде всегда выводятся левые нули. При ошибке во входных параметрах возвращает -1, -2,... по типу ошибки (доопределить самостоятельно).*/ Задача 2.45. Написать тестирующую main() и следующую функцию int far GFrameSize( int far *left, int far *top, /* входные и выходные int far *right, int far *bottom, /* координаты рамки int pattern, /* код штриховки внутри рамки, int fcolor, /* цвет рамки, int pcolor, /* цвет штриховки,
51
*/ */ */ */ */
int bcolor
/* цвет фона, все на время функции
*/
);
/* В графическом режиме рисует прямоугольную рамку с указанными штриховкой и цветами. После этого ожидает нажатия любой клавиши и выполняет: kbESC kb0...kb9 kbUP kbDN kbRT kbLT kbHOME
-
выходит из функции; установить step = 1...10; увеличить на step высоту рамки; уменьшить на step высоту рамки; увеличить на step ширину рамки; уменьшить на step ширину рамки; восстановить исходные размеры рамки.
При нормальном входе возвращает 0 и текущие координаты рамки, при ошибке во входных параметрах сразу возвращает -1, -2,... по типу ошибки (доопределить самостоятельно). */ Задача 2.46. Написать тестирующую main() и следующую функцию int far GFrameMove( int far *left, int far *top, /* входные и выходные int far *right, int far *bottom, /* координаты рамки int pattern, /* код штриховки внутри рамки, int fcolor, /* цвет рамки, int pcolor, /* цвет штриховки, int bcolor /* цвет фона, все на время функции );
*/ */ */ */ */ */
/* В графическом режиме рисует прямоугольную рамку с указанными штриховкой и цветами. После этого ожидает нажатия любой клавиши и выполняет: kbESC kbF1...kbF10 kbUP kbDN kbRT kbLT kbHOME
-
выходит из функции; установить step = 1...10; сдвинуть рамку на step позиций вверх; сдвинуть рамку на step позиций вниз; сдвинуть рамку на step позиций вправо; сдвинуть рамку на step позиций влево; восстановить исходное положение рамки.
При нормальном входе возвращает 0, при ошибке во входных параметрах сразу возвращает -1, -2,... по типу ошибки. */ 52
Задача 2.47. Написать тестирующую main() и следующую функцию int TBitDiagram( char int int int );
arr[], len, na, da
/* массив байтов - символов текста /* его длина /* атрибут имени "бит Х" /* атрибут линии диаграммы
*/ */ */ */
/* В текстовом режиме начиная со строки 0 экрана выводит массив байтов и его битовую диаграмму по следующему шаблону: Массив байтов - символов: 1 2 3 4 5 6 7 8 9 0 Битовая диаграмма байтов: +-+ +---------+ бит 0 -+ +---+ +-+-+ +---+ +--+ бит 1 ---+ +--+ +-+ +-... ++ +----+ ++ +-бит 7 -++--+ +---++-+
в норме возвращая 0, а при ошибке -1, -2.,... по типу ошибки. */ Задача 2.48. Написать тестирующую main() и следующую функцию int far GBitDiagram( int int int int );
arr[], len, ncolor, dcolor
/* массив слов /* его длина /* цвет имени "бит Х" /* цвет линии диаграммы
*/ */ */ */
/* В графическом режиме начиная со строки 0 экрана выводит массив слов и его битовую диаграмму по следующему шаблону: Массив слов (16-система): 8AF1 D3C2 47A5 5C43 A8F6 Битовая диаграмма слов: +---+ +---------+ бит 0 -+ +----+ +-+----+ +-----бит 1 -----+ +-----+ ... +-------+ +-бит F -+ +---------+
в норме возвращая 0, а при ошибке -1, -2,... по типу ошибки. */ 53
Задача 2.49. Написать тестирующую main() и следующую функцию int far GCircHist( int int int int int int );
x, int y, radius hist[], len, bcolor, fcolor
/* координаты центра */ /* радиус окружности */ /* счетчики гистограммы */ /* количество счетчиков: 2...14 */ /* цвет фона */ /* цвет обводки круговых секторов */
/* В графическом режиме выводит круговую гистограмму, предварительно отсортировав значения счетчиков в невозрастающем порядке и раскрашивая каждый круговой сектор, соответствующий счетчику, очередным цветом палитры, исключая цвета bcolor и tcolor. Затем справа от круга выводит долю каждого счетчика в процентах и небольшой квадрат, закрашенный тем же цветом, что и соответствующий сектор гистограммы. В норме возвращает сумму счетчиков, иначе -1, -2,... по типу ошибки (доопределить самостоятельно). */
54
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ 1. 2. 3. 4. 5. 6. 7. 8. 9.
681.3 Ф49
Фигурнов В.Э. IBM PC для пользователя. Изд. 1-5-е, исправл. и доп. – М.: Финансы и статистика, 19901994. 681.3 Шадур А.И. и др. Персональный компьютер для Ш16 начинающих. Диалоговые оболочки MS-DOS. – М.: МИП "Память", 1992. 681.3 Мурохи С.В. Операционная система MS-DOS. – М.: М58 МИП "Память", 1992. 681.3 Малютин Э.А. Введение в операционную систему М24 MS-DOS. – М.: МИП "Память", 1991. 681.3 Керниган Б., Ритчи Д. Язык программирования К36 Си/Пер. с англ. – М.: Финансы и статистика, 1992. 519 Трой Д. Программирование на языке Си для персоТ70 нального компьютера IBM PC/Пер. с англ. – М.: Радио и связь, 1991. 519 Бочков С.О., Субботин А.В. Язык программироваБ89 ния Си для персонального компьютера. – М.: СП "Диалог", Радио и связь, 1990. 681.3 Григорьев А. Программирование на языке Си для Г83 персональных компьютеров. – М.: Диалог-МИФИ, 1992. – Вып.4, 5 (Графика на экране). 519.682 Прокофьев Б.П., Сухарев Н.Н., Храмов Ю.И. ГрафиП80 ческие средства Turbo C и Turbo C++. – М.: Финансы и статистика, СП "Ланит", 1990.
10. 681.3 Д42 11. 519.682 Я41
Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT/Пер. с англ. – М.: Финансы и статистика, 1992. Язык Си для профессионалов/По материалам кн. Г. Шилдта/Пер. с англ. – М.: И.В.К.-Софт, 1992.
55
ОГЛАВЛЕНИЕ Задачи для студентов групп А1-04, 05…………………….……3 Задачи для студентов групп А2-04, 05…………………….…..36 Список рекомендуемой литературы……………………….…..55
Александр Иванович Шереметьев Информатика Сборник домашних заданий
Редактор и технический редактор М.В. Макарова Подписано в печать 29.04.2009. Формат 60 х 84 1/16. Уч.-изд. л. 3,5 Печ. л. 3,5 Тираж 200 экз. Изд. № 035-1. Заказ № 203 Московский инженерно-физический институт (государственный университет). Типография МИФИ. 115409, г. Москва, Каширское ш., 31