Пояснительная записка к курсовой работе по дисциплине “Основы алгоритмизации и программирования”
Выполнил : студент гр. 96-ВВ3 Курапов А.В.
Пензенский государственный технический университет, кафедра  “Вычислительная Техника”
Пенза 1997
Введение
С момента появления первых образцов персональных компьютеров прошло не так уж и много времени,но сейчас без них уже немыслимо огромное количество областей человеческой деятельности - экономика , управление , наука , инженерное дело , издательское дело , образование , культура и т.д.
Рнтерес Рє персональным компьютерам постоянно растет,а круг РёС… пользователей непрерывно расширяется.В число пользователей РџРР’Рњ вовлекаются как новички РІ компьютерном деле,так и специалисты РїРѕ РґСЂСѓРіРёРј классам РР’Рњ.В В В
Язык С++ - универсальный язык общего назначения, область приложений которого - программирование систем в самом широком смысле. Кроме этого, С++ успешно используется как во многих приложениях, так и в мощных операционных системах. Реализация С++ осуществлена для машин в диапазоне от самых простых персональных компьютеров до самых мощных суперкомпьютеров и для всех операционных систем.
1 Постановка задачи
Задача курсовой работы состоит в разработки на языке программирования С++ программы текстового редактора , которая должна осуществлять следующие функции:
1) Ввод исходного текста в заданный файл;
2) Вывод содержимого файла на экран;
3) Обработка файла: форматирование текста по заданному образцу методом центрирования.
Парамерты для форматирования:
а) левый отступ;
b) количество символов в строке;
c) красная строка.
4) Поиск заданной в тексте введённой подстроки , после поиска выдать запрос : "продолжить или закончить".
5) Cохранение результатов обработки данных.
Рмена фсех файлов задаются пользователем РІ диалоговом режиме.
2 Метод решения задачи
Анализируя постановку задачи становится ясно , что для её решения необходимо применить метод многофункционального программирования - этот метод основан на разбиении программы на отдельные функциональные модули , которые вызываются из основной программы в процессе её работы.
В основе разработки такой программы лежит низходящее программирование - т.е. сначала разрабатывается основная программа - в данном случае программа ввода текста на экран , обработки функциональных клавиш и меню , с помощью выбора пунктов которого будет в дальнейшем организовываться её работа. При выборе того или иного пункта меню или нажатии функциональной клавиши будет вызываться одна или несколько подпрограмм , но на начальном этапе разработки программы методом нисходящего программирования вместо этих подпрограмм ставяться "заглушки" - пустые подпрограммы , которые в процессе разработки будут заменяться программами , выполняющими определённую функцию.
3 Описание логического представления данных
Входными данными в программе являются:
Уже существующий текстовый файл - хранится на диске , может быть под любым именем , при загрузки имя файла запрашивается программой в диалоговом режиме , при загрузке имя файла записывается в локальную переменную типа char - fname (25 символов) , уаказатель на начало текста записывается в переменную *text , а длина текста в переменную len типа int;
Параметры текста (левый отступ , количество символов в строке) - можно изменить в процессе работы программы , начальные значения при загрузки : левый отступ=0 , количество символов=60; Данные хранятся в переменных основной программы - left , right (int).
Текст , вводимый с клавиатуры хранится в переменной text типа char , которая в конце работы может быть сохранена в файле , имя которого задаётся пользователем в диалоговом режиме , имя файла записывается в локальную переменную типа char - fname (25 символов).
Шаблон для поиска , который вводится пользователем с клавиатуры хранится в меременной типа char - mascs длинной в 40 символов
Выходными данными в программе являются:
Текст , вводимый с клавиатуры хранится в переменной text типа char , которая в сохраняется в файле , имя которого задаётся пользователем с клавиатуры в диалоговом режиме , имя файла записывается в локальную переменную типа char - fname (25 символов).
Результат поиска по шаблону - координаты курсора x,y (int) записываются как координаты первого символа найденного по шаблону слова , если слово не найденно , то x=0 , y=0.
6 Спецификация на функциональные модули
6.1 Функция output
Строка вызова: | output(scrs,x,y); |
Назначение: | Осуществляет вывод на экран текста и строки подсказки и курсора |
Функции: | Вывод текста , указатель на которого передаётся в строке параметров , вывод нижней строки подсказки , вычисление координат курсора на экране и вывод курсора на экран. |
Логические переменные: | *a (char) - указатель на начало верхней строки x,ky (int) - позиция курсора в тексте |
Внутренние переменные: | np (int) - Количество непечатаемых символов rx (int) - Реальная координата курсора на экране y (int) - Координата Y вывода * ot (char) - Временный указатель n (int) - Временная переменная , необходима для вывода строки |
Вызывает функции: | нет |
Вызывается из: | основной программы. |
6.2 Функция sinput
Строка вызова: | SInput(fname,20,21,25); - Вызывается из load SInput(fname,20,21,25); - Вызывается из save SInput(masks,40,30,25); - Вызывается из основной программы |
Назначение: | Осуществляет ввод строки. |
Функции: | Вывод пустой строки , установка координат , вывод строки запроса, считывание строки посимвольно с клавиатуры , выход , если нажата клавиша Enter или Esc , если нажата Esc то строка не записывается. |
Логические переменные: | *s (char) - указатель на строку lng (int) - максимальная длина x,y - координаты ввода |
Внутренние переменные: | rs[100] (char) - Временная строка n (int) - Счетчик c (char) - Введённый с клавиатуры символ |
Вызывает функции: | нет |
Вызывается из: | load,save,основной программы. |
6.3 Функция load
Строка вызова: | load(text); - Вызывается из основной программы |
Назначение: | Осуществляет загрузку текста из файла. |
Функции: | Запрос имени файла , открытие файла с данным именем , чтение в переменную , указатель которой передаётся в строке параметров , закрытие файла. |
Логические переменные: | *p (char) - указатель на текст |
Внутренние переменные: | fname[25] (char) - РРјСЏ файла *f (file) - указатель РЅР° файл |
Вызывает функции: | sinput |
Вызывается из: | основной программы. |
6.4 Функция save
Строка вызова: | save(text); - Вызывается из основной программы |
Назначение: | Осуществляет запись текста в файл. |
Функции: | Запрос имени файла , открытие файла с данным именем , запись текста , указатель которго передаётся в строке параметров , в файл , закрытие файла. |
Логические переменные: | *p (char) - указатель на текст |
Внутренние переменные: | fname[25] (char) - РРјСЏ файла *f (file) - указатель РЅР° файл *pr (char) - временный указатель |
Вызывает функции: | sinput |
Вызывается из: | основной программы. |
6.5 Функция reset
Строка вызова: | reset(text,32767); - Вызывается из основной программы |
Назначение: | Осуществляет уничтожение информации. |
Функции: | Заполнение кодом перевод строки переменной , указанной в сторке параметров , на длинну , указанную в строке параметров. |
Логические переменные: | *a (char) - указатель на текст n (int) - количество символов в тексте |
Внутренние переменные: | m (int) - счётчик |
Вызывает функции: | нет |
Вызывается из: | основной программы. |
6.6 Функция up
Строка вызова: | else scrs=up(text,scrs); - Вызывается из основной программы |
Назначение: | Осуществляет передвижение указателя на одну строку вверх. |
Функции: | Возвращает указатель на строку , которая выше на одну позицию, чем исходная. |
Логические переменные: | *a (char) - указатель на текст *b (char) - указатель на текущую строку |
Внутренние переменные: | нет |
Вызывает функции: | нет |
Вызывается из: | основной программы. |
6.7 Функция down
Строка вызова: | else scrs=down(text,scrs); - Вызывается из основной программы |
Назначение: | Осуществляет передвижение указателя на одну строку вниз. |
Функции: | Возвращает указатель на строку , которая ниже на одну позицию, чем исходная. |
Логические переменные: | *a (char) - указатель на текст *b (char) - указатель на текущую строку |
Внутренние переменные: | нет |
Вызывает функции: | нет |
Вызывается из: | основной программы. |
6.8 Функция menu
Строка вызова: | switch (menu(30,5," Сохранить файл    "                         " Считать файл      "                         " Ввод шаблона      "                         " Параметры         "                         " Выход из программы "                         "\x0")) Вызывается из основной программы |
Назначение: | Осуществляет вывод и обработку меню. |
Функции: | Вывод меню на экран , опрос клавиатуры , при нажатии клавиш иправления курсором (вверх , вниз) перемещение цветового курсора по пунктам меню , выбор определённого пункта меню при нажатии клавиши с номером пункта меню , при нажатии клавиши Enter возвращается номер выбранного пункта меню , при нажатии клавиши Esc возвращается -1. |
Логические переменные: | x,y (int) - координаты вывода меню на экран. *сapt (char) - указатель на текст меню |
Внутренние переменные: | n,m (int) - Счетчики num (int) - Количество пунктов k (int) - Выбранный пункт pt (char) - Временный указатель на символ c (char) - Считанный с клавиатуры символ |
Вызывает функции: | нет |
Вызывается из: | основной программы. |
6.8 Функция add
Строка вызова: | add(st,a,0,0,' '); - Вызывается из centr add(text,scrs,x,y,10);  add(text,scrs,x,y,13);    Вызывается из основной программы add(text,scrs,x,y,' ');     add(text,scrs,x,y,c);     |
Назначение: | Осуществляет добавление символа в текст. |
Функции: | Помещение указателя на начало строки , подсчёт символов в строке , вставка символа в строку. |
Логические переменные: | *st (char) - указатель на текст *a (char) - указатель на текущую строку x,y (int) - координаты c (char) - добавляемай символ |
Внутренние переменные: | n (int) - число символов в строке d (int) - счётчик *p (char) - временный указатель |
Вызывает функции: | нет |
Вызывается из: | centr , основной программы. |
6.9 Функция end
Строка вызова: | x=end(text,scrs,x,y); - Вызывается из основной программы. |
Назначение: | Осуществляет поиск конца сироки. |
Функции: | Возвращает длину строки. |
Логические переменные: | *st (char) - указатель на текст *a (char) - указатель на текущую строку x,y (int) - координаты |
Внутренние переменные: | n (int) - число символов в строке *p (char) - временный указатель |
Вызывает функции: | нет |
Вызывается из: | основной программы. |
6.10 Функция del
Строка вызова: | del(st,a,0,0); - Вызывается из centr. del(text,scrs,x,y); - Вызывается из основной программы. del(text,scrs,x-1,y); - Вызывается из основной программы. |
Назначение: | Осуществляет удаление символа из текста. |
Функции: | Поиск необходимого места в тексте , удаление символа , если был удалён "перевод строки" и остался "возврат коретки" либо наоюорот , то удаляется ещё один символ. |
Логические переменные: | *st (char) - указатель на текст *a (char) - указатель на текущую строку x,y (int) - координаты |
Внутренние переменные: | n (int) - число символов в строке d (int) - счётчик *p (char) - временный указатель |
Вызывает функции: | нет |
Вызывается из: | centr , основной программы. |
6.11 Функция find
Строка вызова: | find(text,&scrs,&x,&y,masks); - Вызывается из основной программы. |
Назначение: | Осуществляет поиск фрагмента в тексте , начиная с текущего положения курсора. |
Функции: | Поиск текущего места в тексте , поиск фрагмента , если фрагмент найден - перемещение курсора. |
Логические переменные: | *st (char) - указатель на текст *scrs (char) - указатель на текущую строку *x , *y (int) - указатель на координаты |
Внутренние переменные: | n (int) - число символов в строке d (int) - счётчик k (int) - счётчик *p (char) - временный указатель |
Вызывает функции: | нет |
Вызывается из: | основной программы. |
6.12 Функция dinput
Строка вызова: | left=DInput(30,25); - Вызывается из основной программы. right=DInput(30,25); - Вызывается из основной программы. |
Назначение: | Осуществляет ввод числа. |
Функции: | Вывод строки запроса , считывание цифр с клавиатуры , выход , если нажата клавиша Enter или Esc , если нажата Esc то число не записывается не записывается. Возвращает считанное число в формате long. |
Логические переменные: | x , y (int) - координаты ввода |
Внутренние переменные: | s[100] (char) - временная строка rz (long) - cчитанное число n (int) - счётчик c (char) - символ |
Вызывает функции: | нет |
Вызывается из: | основной программы. |
6.13 Функция centr
Строка вызова: | centr(text,scrs,y,left,right); - Вызывается из основной программы. |
Назначение: | Осуществляет центровку текущей строки. |
Функции: | Поиск текущего местоположения , удаление пробелов в начале строки , подсчёт длины строки , определение количесва добавляемых пробелов , добавление пробелов. |
Логические переменные: | *st (char) - указатель на текст *scrs (char) - указатель на текущую строку x , y (int) - координаты left (int) - левый отступ right (int) - число символов в строке |
Внутренние переменные: | n (int) - число символов в строке d (int) - счётчик |
Вызывает функции: | add , del |
Вызывается из: | основной программы. |
6.14 Основная программа
Назначение: | Осуществляет опрос клавиатуры , редактирование текста , вывод меню на экран , обработку пунктов меню , и функциональных клавиш , вызов функций в соответствии с выбранным действием. |
Функции: | Выделение памяти под текст , вывод текста на экран , считывание кода нажатой клавиши , анализ полученного кода и вызов соответствующей функции или выполнение действия. |
Внутренние переменные: | left (int) - левый отступ right (int) - число символов в строке masks (char) - маска для поиска *scrs (char) - указатель на текущую строку x , y (int) - координаты курсора c (char) - введённый с клавиатуры символ n (int) - счётчик |
Вызывает функции: | output , sinput , load , save , reset , up , down , menu , add , end , del , find , dinput , centr . |
7 Технические требования для использования
Для запуска данной программы необходимо наличие персонального компьютера IBM PC/XT c операционной системой MS-DOS.
Необходимый объем оперативной памяти - 400 Кбайт.
Дла запуска программы необходимо сделать текущем каталог с программой tr.exe и вызвать её на выполнение.
Программа работает в текстовом режиме 80х25 символов.
Файлы программы , если не указывать дополнительный путь , будут записываться и считываться из текущего каталога текущего диска.
Управление программой усуществляется с клавиатуры.
8 Описание работы программы
После своей загрузки программа осуществляет оформление экрана , вывод в нижнюю часть экрана строки подсказки , в которой содержется информация о функциональных клавишах. Пользователь может вводить и редактировать текст , задавать формат текста (левый отступ , число символов в строке) , центровать нужную строку , осуществлять поиск нужной фразы по шаблону , считать необходимый файл с диска , записать текст в файл на диске , выйти из прграммы.
9 Тестирование программы
Для полной проверки работоспособности программы необходимо её протестировать.
План тестирования программы "Текстовый редактор" состоит в следующем:
 1) Создание отдельно от программы файла с исходным текстом.
 2) Загрузка программы tr.exe.
 3) Загрузка файла test.in.
 4) Редактирование текста.
5) Рзменение параметров строки Рё центрирование отдельных строк текста.
6) Создание шаблона для поиска и поиск фразы в тексте по этому шаблону.
7) Запись отредактированного текста в файл test.out.
8) Выход из программы.
Рсходный тестовый файл test.in содержит РІ себе следующий текст:
Файл для тестирования программы tr.exe
эта программа предназначена для ввода и редактирования текста
Тестирование программы
Далее в пункте "Результаты работы программы" приводится распечатка тестирования программы по пунктам плана тестирования и результатов тестирования.
10 Результаты работы программы
1) Создание отдельно от программы файла с исходным текстом:
Файл test.in содержит в себе следующий текст:
Файл для тестирования программы tr.exe
эта программа предназначена для ввода и редактирования текста
ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
2) Загрузка программы tr.exe:
  ESC - Меню, F4 - Поиск, Alt-C - центровка       0    0
3) Загрузка файла test.in:
                           1) Сохранить файл
                           2) Считать файл
                           3) Ввод шаблона
                           4) Параметры
                           5) Выход из программы
Введите имя файла: test.in                а       0    0
4) Редактирование текста:
Файл для тестирования программы tr.exe
В Рта программа предназначена для РІРІРѕРґР° Рё редактирования текста
ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
  ESC - Меню, F4 - Поиск, Alt-C - центровка       0    0
5) Рзменение параметров строки Рё центрирование отдельных строк текста:
Файл для тестирования программы tr.exe
эта программа предназначена для ввода и редактирования текста
ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
                           1) Сохранить файл
                           2) Считать файл
                           3) Ввод шаблона
                           4) Параметры
                           5) Выход из программы
Введите левый отступ: иск, A5             а       0    0
Файл для тестирования программы tr.exe
эта программа предназначена для ввода и редактирования текста
ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
                           1) Сохранить файл
                           2) Считать файл
                           3) Ввод шаблона
                           4) Параметры
                           5) Выход из программы
Введите количество символов 40            а       0    0
Центровка 3 строки:
Файл для тестирования программы tr.exe
эта программа предназначена для ввода и редактирования текста
         ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
  ESC - Меню, F4 - Поиск, Alt-C - центровка       0    3
6) Создание шаблона для поиска и поиск фразы в тексте по этому шаблону:
Файл для тестирования программы tr.exe
эта программа предназначена для ввода и редактирования текста
         ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
                           1) Сохранить файл
                           2) Считать файл
                           3) Ввод шаблона
                           4) Параметры
                           5) Выход из программы
Введите шаблон для поиска: текст
эта программа предназначена для ввода и редактирования текста
         ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
  ESC - Меню, F4 - Поиск, Alt-C - центровка      56    0
7) Запись отредактированного текста в файл test.out:
Файл для тестирования программы tr.exe
эта программа предназначена для ввода и редактирования текста
         ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
                           1) Сохранить файл
                           2) Считать файл
                           3) Ввод шаблона
                           4) Параметры
                           5) Выход из программы
Введите имя файла: test.out               а       0    0
8) Выход из программы:
Файл для тестирования программы tr.exe
эта программа предназначена для ввода и редактирования текста
         ТЕСТРР РћР’РђРќРР• ПРОГРАММЫ
                           1) Сохранить файл
                           2) Считать файл
                           3) Ввод шаблона
                           4) Параметры
                           5) Выход из программы
  ESC - Меню, F4 - Поиск, Alt-C - центровка       0    0
Список литературы
1.Бьярн Страуструп. Язык программирования С++.в двух частях. Пер. с англ. Киев:"ДиаСофт",1993.-296 с.,ил.
2.Корриган Джон Компьютерная графика: Секреты Рё решения: Пер СЃ англ. -Рњ.:Рнтроп, 1995. - 352 СЃ., РёР».
РџР РЛОЖЕНРР• 1
Распечатка программы
#include
#include
#include
#include
#include
// Указатель на начало текста
char * text;
// Длинна текста
long len;
// Вывод на экран
// Входные данные:
//  Адрес начала верхней строки
//  Позиция курсора на ~бесконечном~ по ширине экране (x,y)
void output(char * a,int x,int ky) {
// Количество непечатаемых символов
В int np=(x/80)*80;
// Реальная координата курсора на экране
В int rx=x-np;
// Координата Y вывода
В int y;
В char * ot=a;
В clrscr();
В int n;
В y=0;
В do {
// Пропуск непечатаемых символов
В В n=np;
В В while ((n>0)&&(*ot!=13)) {
В В В В ot++;
В В В В n--;
В В }
// Если есть, что печатать на этой строке - печать
В В if (*ot!=13) {
 // Печать строки
В В В В n=80;
В В В В while ((n>0)&&(*ot!=13)) {
В В В В В В cout
В В В В В В ot++;
В В В В В В n--;
В В В В }
 // Если строка окнчилась раньше края экрана - перевести строку
В В В В if (*ot==13) {
В В В В В В cout
В В В В В В ot++;
В В В В В В if (*ot==10) ot++;
В В В В } else {
В В В В В В while (*ot!=13) ot++;
В В В В В В if (*ot==13) ot++;
В В В В В В if (*ot==10) ot++;
В В В В }
В В В В y++;
В В } else {
 // Если печатать нечего - перевод строки
В В В В cout
В В В В ot++;
В В В В y++;
В В В В if (*ot==10) ot++;
В В }
// Пока не распечатаны все строки
В } while (y
// Вывод подсказки и курсора
В gotoxy(5,25);
В textcolor(14);
В cprintf(
 "ESC - Меню, F4 - Поиск, Alt-C - центровка    %4d %4d    ",x,ky);
В textcolor(15);
В gotoxy(rx+1,ky+1);
}
// Ввод строки
// s - указатель на строку
// lng - Максимальная длинна
// x,y - координаты
void SInput(char * s,int lng,int x,int y) {
В lng--;
 char rs[100];        // Временная строка
 strcpy(rs,s);        // Копирование резерва строки
 int n;               // Счетчик
В char c;В В В В В В В В В В В В В В // РЎРёРјРІРѕР»
// Вывод пустой строки
В textbackground(2);
В textcolor(15);
В gotoxy(x,y);
В for (n=0;n
 n=strlen(s);         // Положение курсора
В do {
 // Вывод строки
В В gotoxy(x,y);
В В cprintf("%sВ ",s);
В В gotoxy(x+n,y);
  c=getch();         // Считывание символа с клавиатуры
В В if ((c!=13)&&(c!=27)&&(c!=8)) {
  // Нажата символьная клавиша
В В В В if (n
    // Добавление символа
В В В В В В s[n+1]=0;
В В В В В В s[n]=c;
В В В В В В n++;
В В В В }
В В } else {
В В В В if (c==8) {
    // Нажата клавиша BackSpace
В В В В В В if (n>0) {
В В В В В В В В n--;
В В В В В В В В s[n]=0;
В В В В В В }
В В В В }
В В }
// Выход, если ESC или ENTER
В } while ((c!=27)&&(c!=13));
 if(c==27) strcpy(s,rs);      // Восстановление строки
// Стирание строки
В textbackground(0);
В textcolor(7);
В gotoxy(x,y);
В for (n=0;n
}
// Чтение файла
void load(char * p) {
В char fname[25];
В fname[0]=0;
В FILE * f;
В gotoxy(1,25);
 printf(" Введите имя файла:                        ");
В SInput(fname,20,21,25);
В f=fopen(fname,"rb");
В len=fread(p,32767,1,f);
В fclose(f);
}
// Запись в файл
void save(char * p) {
В char fname[25];
В fname[0]=0;
В char * pr;
В pr=p;
В len=0;
В while((len
В В len++;
В В pr++;
В }
В FILE * f;
В gotoxy(1,25);
 printf(" Введите имя файла:                        ");
В SInput(fname,20,21,25);
В f=fopen(fname,"wb");
В fwrite(p,len,1,f);
В fclose(f);
}
// Уничтожение информации - заполнение кодом "Перевод строки"
void reset(char * a,int n) {
В for (int m=0;m
}
// Вверх на строку
char * up(char * a,char * b) {
В if (a==b) return b;
В b--;
В while ((a!=b)&&(*b!=13)) b--;
В if (a==b) return b;
В if (*b==13) b--;
В if (a==b) return b;
В while ((a!=b)&&(*b!=13)) b--;
В if (*b==13) b++;
В if (*b==10) b++;
В return b;
}
// Вниз на строку
char * down(char * a,char * b) {
В while (((a+32767)>=b)&&(*b!=13)) b++;
В if (*b==13) b++;
В if (*b==10) b++;
В return b;
}
// Обработка меню
int menu(int x,int y,char * capt) {
 int n,m; // Счетчики
 int num; // Количество пунктов
 int k; // Выбранный пункт
 char * pt; // Временный указатель на символ
 char c; // Считанный с клавиатуры символ
// Вычисляем количество пунктов
В num=strlen(capt)/20;
// Курсор на нулевой элемент
В k=0;
// Бесконечный цикл обработки
В for (;;) {
// Вывод меню
В В pt=capt;
В В for (n=0;n
В В В В gotoxy(x,y+n);
 // Закраска пункта, на который указывает курсор
В В В В if (n==k) {
    // Закраска
textbackground(12);
textcolor(14);
В В В В } else {
    // Нормальный
textbackground(3);
textcolor(1);
В В В В }
В В В В cprintf("%d) ",n+1);
В В В В for (m=0;m
В В }
В В textbackground(3);
В В textcolor(1);
 // Опрос клавиатуры
В В c=getch();
В В if (!c) c=getch();
 // Проверка, не нажата ли клавиша с цифрой
В В if (((c-'1')>=0)&&((c-'1')
 // Установка указателя в зависимости от нажатой цифры
В В В В k=c-'1';
 // Запись в буфер клавиатуры символа ENTER
В В В В ungetch(13);
В В } else {
  // Анализ
В В В В switch(c) {
      // Вверх
В В В В В В case (72):
В if (k>0) k--; else k=num-1;
В break;
В В В В В В // Р’РЅРёР·
В В В В В В case (80):
В if (k
В break;
      // Выход по ESC - возвращается -1
В В В В В В case (27):
В return -1;
      // Выход по ENTER - возвращается номер пункта
В В В В В В case (13): return k;
В В В В }
В В }
В }
}
// Добавление символа в текст
void add(char * st,char * a,int x,int y,char c) {
В int n;
В int d;
В n=y;
В char * p;
// Перемещение указателя к началу строки
В while (n>0) {
В В while ((a
В В if (*a==13) a++;
В В if (*a==10) a++;
В В n--;
В }
// Подсчет символов в строке
В n=0;
В while ((*(a+n)!=13)&&((a+n)
В if (n
// Если производится вставка в строку
В В a=a+n;
В В d=x-n;
В В p=st+32767;
В В while ((p-d)!=a) {
В В В В *p=*(p-d-1);
В В В В p--;
В В }
В В p=a;
В В while (d!=0) {
В В В В *p=' ';
В В В В d--;
В В В В p++;
В В }
В В *p=c;
В } else {
 // Если производится добавление к строке не только символа,
 // но и пробелов до него
В В a=a+x;
В В p=st+32767;
В В while (p!=a) {
В В В В *p=*(p-1);
В В В В p--;
В В }
В В *a=c;
В }
}
// Поиск конца строки - фактически возвращает длину строки
int end(char * st,char * a,int,int y) {
В int n;
В n=y;
В char * p;
В while (n>0) {
В В while ((a
В В if (*a==13) a++;
В В if (*a==10) a++;
В В n--;
В }
В n=0;
В while ((*(a+n)!=13)&&((a+n)
В return n;
}
// Удаление символа
void del(char *st,char * a,int x,int y) {
В int n;
В int d;
В n=y;
В char * p;
// Поиск необходимого места в тексте
В while (n>0) {
В В while ((a
В В if (*a==13) a++;
В В if (*a==10) a++;
В В n--;
В }
В n=0;
В while ((*(a+n)!=13)&&((a+n)
В if (n
В a+=x;
В p=a;
В n=*p;
// Удаление символа
В while (a!=(st+32767)) {
В В *a=*(a+1);
В В a++;
В }
// Если был удален "Перевод строки" и остался
// "Возврат каретки" либо наоборот, то удаляется еще один символ
В if ((*p==13)&&(n==10)||(*p==10)&&(n==13)) {
В В while (p!=(st+32767)) {
В В В В *p=*(p+1);
В В В В p++;
В В }
В }
}
// Поиск фрагмента в тексте, начиная с текущего положения курсора
void find(char * st,char * * scrs,int * x,int * y,char * b) {
В char * a=*scrs;
В int n;
В int k;
В int d;
В n=*y;
В char * p;
// Поиск текущего места
В while (n>0) {
В В while ((a
В В if (*a==13) a++;
В В if (*a==10) a++;
В В n--;
В }
В n=0;
В while ((*(a+n)!=13)&&((a+n)
В if (n
В a+=*x;
// Поиск фрагмента
В do {
В В a++;
В В k=1;
В В for (n=0;n
В В В В if (a[n]!=b[n]) k=0;
В } while ((k!=1)&&(a
В if (k==1) {
 // Если фрагмент найден - перемещение курсора
В В *x=0;
В В *y=0;
В В while ((*a!=13)&&(a!=st)) {
В В В В a--;
В В В В (*x)++;
В В }
В В if (*a==13) {
В В В В a++;
В В В В (*x)--;
В В }
В В if (*a==10) {
В В В В a++;
В В В В (*x)--;
В В }
В В *scrs=a;
В }
}
// Ввод числа
// x,y - координаты
long DInput(int x,int y) {
 char s[100];        // Временная строка
В char *stpe;
В long rz;
В s[0]=0;
 int n;               // Счетчик
В char c;В В В В В В В В В В В В В В // РЎРёРјРІРѕР»
// Вывод пустой строки
В textbackground(2);
В textcolor(15);
В gotoxy(x,y);
В for (n=0;n
 n=strlen(s);         // Положение курсора
В do {
 // Вывод строки
В В gotoxy(x,y);
В В cprintf("%sВ ",s);
В В gotoxy(x+n,y);
  c=getch();         // Считывание символа с клавиатуры
В В if ((c!=13)&&(c!=27)&&(c!=8)) {
  // Нажата символьная клавиша
В В В В if (n
    // Добавление цифры
В В В В В В if ((c>='0')&&(c
В В В В В В В В s[n+1]=0;
В В В В В В В В s[n]=c;
В В В В В В В В n++;
В В В В В В }
В В В В }
В В } else {
В В В В if (c==8) {
    // Нажата клавиша BackSpace
В В В В В В if (n>0) {
В В В В В В В В n--;
В В В В В В В В s[n]=0;
В В В В В В }
В В В В }
В В }
// Выход, если ESC или ENTER
В } while ((c!=27)&&(c!=13));
В if(c==27) return 0;
// Стирание строки
В textbackground(0);
В textcolor(7);
В gotoxy(x,y);
В for (n=0;n
В sscanf(s,"%ld",&rz);
В return rz;
}
// Центровка текущей строки
void centr(char *st,char * a,int y,int left,int right) {
В int n;
В int d;
В n=y;
// Поиск текущего местоположения
В while (n>0) {
В В while ((a
В В if (*a==13) a++;
В В if (*a==10) a++;
В В n--;
В }
// Удаление пробелов в начале строки
В while ((*a==32)&&(!((*a==13)||(a==(st+32767))))) del(st,a,0,0);
// Подсчет длины строки
В n=0;
В while ((*(a+n)!=13)&&((a+n)
// Определение количества добавляемых пробелов
В if ((n>(right-left))||(n==0)) return;
В d=left+((right-left)-n)/2;
// Добавление пробелов
В for (n=0;n
}
// Основная программа
void main() {
// Границы текста
В int left=0;
В int right=60;
// Маска для поиска
В char masks[40];
В masks[0]=0;
// Положение курсора
В char * scrs;
В int x,y;
В char c;
В int n;
// Выделение памяти под текст
В text=new char[32767];
В len=0;
В reset(text,32767);
В scrs=text;
В x=0;y=0;
// Цикл обработки данных
В for (;;) {
В В textbackground(1);
В В textcolor(15);
 // Вывод данных на экран
В В output(scrs,x,y);
 // Считывание символа
В В c=getch();
 // Обработка
В В switch (c) {
В В В В case (27):
  // Вывод меню
      switch (menu(30,5," Сохранить файл    "
                        " Считать файл      "
                        " Ввод шаблона      "
                        " Параметры         "
                        " Выход из программы "
В В В В В В В В В В В В В В В В В В В В В В В В "\x0")) {
В В В В В В В В case (0):
В В В В В В В В В В save(text);
В В В В В В В В В В break;
В В В В В В В В case (1):
В В В В В В В В В В reset(text,32767);
В В В В В В В В В В load(text);
В В В В В В В В В В break;
В В В В В В В В case (2):
В В В В В В В В В В gotoxy(1,25);
          printf(" Введите шаблон для поиска: ");
В В В В В В В В В В SInput(masks,40,30,25);
В В В В В В В В В В break;
В В В В В В В В case (3):
В В В В В В В В В В gotoxy(1,25);
          printf(" Введите левый отступ: ");
В В В В В В В В В В left=DInput(30,25);
В В В В В В В В В В gotoxy(1,25);
          printf(" Введите количество символов в строке: ");
В В В В В В В В В В right=DInput(30,25);
В В В В В В В В В В break;
В В В В В В В В case (4):
В В В В В В В В В В textbackground(0);
В В В В В В В В В В textcolor(7);
В В В В В В В В В В clrscr();
В В В В В В В В В В return;
В В В В В В }
В В В В В В break;
В В В В case (0):
  // Расширенный код - считывание значащей части
В В В В В В c=getch();
    // обработка
В В В В В В switch(c) {
В В В В В В // Alt-C
В В В В В В В В case (46):
В В В В В В В В В В centr(text,scrs,y,left,right);
В В В В В В В В В В break;
В В В В В В // F4
В В В В В В В В case (62):
В В В В В В В В В В find(text,&scrs,&x,&y,masks);
В В В В В В В В В В break;
В В В В В В // Home
В В В В В В В В case (71):
В В В В В В В В В В x=0;
В В В В В В В В В В break;
В В В В В В // End
В В В В В В В В case (79):
В В В В В В В В В В x=end(text,scrs,x,y);
В В В В В В В В В В break;
В В В В В В // Delete
В В В В В В В В case (83):
В В В В В В В В В В del(text,scrs,x,y);
В В В В В В В В В В break;
      // Стрелки перемещения курсора
В В В В В В В В case (72):
В В В В В В В В В В if (y>0) y--;
В В В В В В В В В В В В else scrs=up(text,scrs);
В В В В В В В В В В break;
В В В В В В В В case (80):
В В В В В В В В В В if (y
В В В В В В В В В В В В else scrs=down(text,scrs);
В В В В В В В В В В break;
В В В В В В В В case (77):
В В В В В В В В В В if (x
В В В В В В В В В В break;
В В В В В В В В case (75):
В В В В В В В В В В if (x>0) x--;
В В В В В В В В В В break;
В В В В В В }
В В В В В В break;
В В // Enter
В В В В case (13):
В В В В В В add(text,scrs,x,y,10);
В В В В В В add(text,scrs,x,y,13);
В В В В В В if (y
В В В В В В x=0;
В В В В В В break;
В В // BackSpace
В В В В case (8):
В В В В В В if (x>0) {
В В В В В В В В del(text,scrs,x-1,y);
В В В В В В В В x--;
В В В В В В }
В В В В В В break;
В В // Tab
В В В В case (9):
В В В В В В for (n=0;n
В В В В В В x=x+(5-(x-x/5));
В В В В В В break;
  // Остальные символы
В В В В default:
В В В В В В add(text,scrs,x,y,c);
В В В В В В x++;
В В }
В }
}
РџР РЛОЖЕНРР• 2
Алгоритм работы программы
Для подготовки данной работы были использованы материалы с сайта http://kurslab.chat.ru/