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