Учебная работа. Реферат: Программа текстовый редактор
Объяснительная записка к курсовой работе по дисциплине “Базы алгоритмизации и программирования”
Выполнил : студент гр. 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.Бьярн Страуструп. язык программирования С++.в 2-ух частях. Пер. с англ. Киев:»ДиаСофт»,1993.-296 с.,ил.
2.Корриган Джон Компьютерная графика: Секреты и решения: Пер с англ. -М.:Энтроп, 1995. — 352 с., ил.
приложение 1
Распечатка программки
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
// Указатель на начало текста
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;
ot++;
n—;
}
// Если строчка окнчилась ранее края экрана — перевести строчку
if (*ot==13) {
cout<<(char) 13<<(char) 10;
ot++;
if (*ot==10) ot++;
} else {
while (*ot!=13) ot++;
if (*ot==13) ot++;
if (*ot==10) ot++;
}
y++;
} else {
// Если печатать нечего — перевод строчки
cout<<(char) 13<<(char) 10;
ot++;
y++;
if (*ot==10) ot++;
}
// Пока не распечатаны все строчки
} while (y<23);
// Вывод подсказки и курсора
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<lng;n++) cprintf(» «);
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<(lng-1)) {
// Добавление знака
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<lng+1;n++) cprintf(» «);
}
// Чтениефайла
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<32767)&&((*pr!=13)||(*(pr+1)!=13))) {
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<n;m++) *(a+m)=13;
}
// Вверхнастроку
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<num;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<20;m++) cprintf(«%c»,*(pt++));
}
textbackground(3);
textcolor(1);
// Опросклавиатуры
c=getch();
if (!c) c=getch();
// Проверка, не нажата ли кнопка с цифрой
if (((c-‘1’)>=0)&&((c-‘1’)<num)) {
// установка указателя зависимо от нажатой числа
k=c-‘1’;
// Запись в буфер клавиатуры знака ENTER
ungetch(13);
} else {
// анализ
switch(c) {
// Ввысь
case (72):
if (k>0) k—; else k=num-1;
break;
// Вниз
case (80):
if (k<(num-1)) k++; else k=0;
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<(st+32767))&&(*a!=13)) a++;
if (*a==13) a++;
if (*a==10) a++;
n—;
}
// Подсчетсимволоввстроке
n=0;
while ((*(a+n)!=13)&&((a+n)<(st+32767))) n++;
if (n<x) {
// Если делается вставка в строчку
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<(st+32767))&&(*a!=13)) a++;
if (*a==13) a++;
if (*a==10) a++;
n—;
}
n=0;
while ((*(a+n)!=13)&&((a+n)<(st+32767))) 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<(st+32767))&&(*a!=13)) a++;
if (*a==13) a++;
if (*a==10) a++;
n—;
}
n=0;
while ((*(a+n)!=13)&&((a+n)<(st+32767))) n++;
if (n<x) x=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<(st+32767))&&(*a!=13)) a++;
if (*a==13) a++;
if (*a==10) a++;
n—;
}
n=0;
while ((*(a+n)!=13)&&((a+n)<(st+32767))) n++;
if (n<*x) *x=n;
a+=*x;
// Поиск фрагмента
do {
a++;
k=1;
for (n=0;n<strlen(b);n++)
if (a[n]!=b[n]) k=0;
} while ((k!=1)&&(a<(st+32767)));
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<15;n++) cprintf(» «);
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<14) {
// Добавление числа
if ((c>=’0′)&&(c<=’9′)) {
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<15;n++) cprintf(» «);
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<(st+32767))&&(*a!=13)) 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)<(st+32767))) n++;
// Определение количества добавляемых пробелов
if ((n>(right-left))||(n==0)) return;
d=left+((right-left)-n)/2;
// Добавление пробелов
for (n=0;n<d;n++) add(st,a,0,0,’ ‘);
}
// Основная программка
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<22) y++;
else scrs=down(text,scrs);
break;
case (77):
if (x<32767) 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<22) y++; else down(text,scrs);
x=0;
break;
// BackSpace
case (8):
if (x>0) {
del(text,scrs,x-1,y);
x—;
}
break;
// Tab
case (9):
for (n=0;n<(5-(x-x/5));n++) add(text,scrs,x,y,’ ‘);
x=x+(5-(x-x/5));
break;
// Другие знаки
default:
add(text,scrs,x,y,c);
x++;
}
}
}
приложение 2
Метод работы программки
]]>