Учебная работа. Реферат: Программа текстовый редактор

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Контрольные рефераты

Учебная работа. Реферат: Программа текстовый редактор

программка «текстовый редактор»

Объяснительная записка к курсовой работе по дисциплине “Базы алгоритмизации и программирования”

Выполнил : студент гр. 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

Метод работы программки

]]>