Міністерство освіти і науки України
Національний університет "Львівська політехніка"
Кафедра інформаційних систем та мереж
К У Р С О В А Р О Б О Т А
з дисципліни "Проблемно-орієнтовані мови програмування"
на тему:
"Простий текстовий редактор."
З А В Д А Н Н Я
на курсову роботу з дисципліни
" Проблемно-орієнтовані мови програмування "
студента групи КН-17
Корендовича Олега
Т е м а " Простий текстовий редактор "
Завдання: створення простого текстового редактора.
ЗМIСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИВИКОНАННЯ:
1.
Провести аналiтичний огляд лiтератури по заданій темi.
27.02
2.
Розробити алгоритм та графiчну схему програми розв'язування задачi
26.03
3.
Вимоги до програми:
1) програма повинна мати меню для роботи із списками;
2) вивід різних рядків здійснювати в окремих вікнах;
3)передбачити збереження рядка у файл та зчитування з файлу;
4) програма повинна бути реалізована на мові С\С++;
5)програма повинна працювати у вікні MSDOS під керуванням операційної системи Wsndows;
6)керування режимами роботи програми виконати за допомогою клавіатури та миші.
23.04
4.
Пiдготувати вхiднi данi для контрольного прикладу.
30.04
5.
Реалiзувати та вiдлагодити програми на вказаних мовах програмування.
21.05
6.
Оформити записку до курсової роботи згiдно вимог Мiжнародних стандартiв, дотримуючись такого змiсту:
28.05
-вступ;
-формулювання задачі, методи та засоби її розв’язування;
-алгоритм розв'язування задачі;
-опис програми на мові C/C++ ;
-технологія програмування, виконання та відлагодження програми;
-інструкція користувачу;
-контрольний приклад та аналіз результатів комп'ютерної реалізації програми;
-висновки;
-література;
-додатки
ЗАВДАННЯ ПРИЙНЯТО ДО ВИКОНАННЯ: ____________10.02.2008
пiдпис студента
Керівник роботи: _______________/Кравець П.О./
Зміст
Вступ 4
1. Формулювання задачі 5
1.1. Загальні вимоги до програми 5
1.2. Вимоги до інтерфейсу програми 5
1.3. Вимоги до структури програми 5
2. Методи розв’язування задачі 6
3. Алгоритми розв’язування задачі 9
4. Програма та її опис 12
4.1. Назва програми 12
4.2. Призначення програми 12
4.3. Мови програмування, на яких написана програма 12
4.4. Логічна структура програми 12
4.5. Вхідні та вихідні дані 13
4.6. Програмні засоби 13
4.7. Технічні засоби 13
5. Технологія програмування, виконання, відлагодження програми. 14
5.1. Технологія програмування 14
5.2. Технологія виконання програми 14
5.3. Відлагодження програми 14
5.4. Надійність програми у межах зміни вхідних даних 14
6. Інструкція користувачеві 15
7. Контрольний приклад та аналіз комп’ютерної реалізації програми 18
Висновки 21
Список використаної літератури 22
Додаток 1. Текст програми на мові Сі 23
Вступ
Метою виконання цієї курсової роботи є закріплення теоретичних знань та практичних навичок, набутих під час вивчення дисциплін «Основи програмування» та «Проблемно-орієнтовані мови програмування».
В ході виконання роботи я самостійно працював з навчальною літературою, розробляв алгоритми розв’язування задачі та їх програмну реалізацію.
Моїм індивідуальним завданням була розробка простого текстового редактора.
Програма написана на мові програмування Сі. Програма складається з багатьох незалежних функцій, які взаємодіють. В загальному архітектура програми відповідає вимогам структурного програмування – складається з головного файлу та 1 модуля – модуля маніпулятора «мишка». Кожен файл реалізації в свою чергу складається з окремих функцій – структурних одиниць реалізації алгоритму.
Інтерфейс програми забезпечується засобами псевдографіки. Цей спосіб був обраний в зв’язку з простотою співпраці з текстом. Навігація здійснюється з допомогою клавіатури або маніпулятора «мишка».
1. Формулювання задачі
1.1. Загальні вимоги до програми
Програма повинна бути реалізована на мові Сі/Сі++ і повинна працювати у вікні MSDOS під керуванням операційної системи Windows.
Потрібно передбачити можливість витирання та включення символів\рядків у текст програми та роботу з виділеними блоками – витирання, копіювання, переміщення; забезпечити режими читання файлів для редагування та запису відредагованих файлів на диск.
1.2. Вимоги до інтерфейсу програми.
Програма повинна мати інтерфейс у вигляді вікон та меню для вибору режимів її роботи. Керування та навігація повинні здійснюватись з допомогою клавіатури та маніпулятора «мишка»
1.3. Вимоги до структури програми.
Програма повинна відповідати вимогам структурного програмування – складатись з окремих модулів, а кожен модуль в свою чергу – з функцій, які є структурними одиницями алгоритмічної реалізації.
2. Методи та засоби розв’язування задачі.
Одна з найбільш відомих рис професійно написаних програм - це використання зникаючих та ієрархічних меню. При правильному використані, ці меню надають програмам дружелюбного інтерфейсу, які користувачі від них й очікують. Хоча насправді і прості, і зникаючі, і ієрархічни меню мають недоліки для програмування.
Важливо зрозумити що таке зникаючі та ієрархічні меню і чим вони відрізняються від стандартних меню. При використані стандартних меню екран очишується або зсувається, й з’являється меню. Коли вибір зроблено, екран знову очишується або зсувається й програма продовжується. Вибір здійснюється за номером або за першою літерою кожної альтернативи.
Коли використовуються зникаючі або ієрархічні меню, то вони покривають вміст екрана. Після вибору, екран повертається у попередній стан. Ви обираєте потрібний пункт меню одним з трьох способів: (1) натискаючи активну клавішу, яка є літерою, номером або комбінацією клавіш, пов’язаними з вибором, або (2) використовуючи клавіші управління курсором для переміщення підсвіченого поля та клавішу «ввід», або ж (3) вибором потрібного пункту меню курсором маніпулатора «мишка». Зазвичай поточне поле відображається у інверсному вигляді. Основна різниця між стандартними меню з одного боку, і зникаючими та ієрархічними меню з іншого, в тому, що стандартне меню перериває програму. зникаючі та ієрархічні меню лише призупиняють роботу програми. З точки зору користувача стандартне меню – це переривання концентрації; в той час як зникаюче меню – просто легка призупинка, концентрація уваги користувача не порушена. У данії програмі використовується зникаюче та стандартне меню.
В програмі на початку включаються необхідні файли включення і визначаються макроконстанти. Далі іде головна функція і вона підключає інші функції.
Перш ніж ім'я (ідентифікатор) може бути використане в C програмі, він повинен бути описаний. Це означає, що треба задати його тип, щоб повідомити компілятору, до якого вигляду об’єкту відноситься ім'я.
Ім'я (ідентифікатор) складається з послідовності букв і цифр. Перший символ повинен бути буквою. Символ підкреслення _ вважається буквою. C++ не накладає обмежень на число символів в імені, але деякі частини реалізації знаходяться поза веденням автора компілятора (зокрема, завантажувач), і вони, на жаль, такі обмеження накладають. Деякі середовища виконання також роблять необхідним розширити або обмежити набір символів, допустимих в ідентифікаторі;
Основні типи: char, short int, int, long int, для представлення цілих різних розмірів, та float, double, для представлення чисел з плаваючою крапкою.
Перетворення типу
Буває необхідно явно перетворити значення одного типу в значення іншого. Явне перетворення типу дає значення одного типу для даного значення іншого типу.
Тип void
Тип void (пустий) синтаксично поводиться як основний тип. Однак використати його можна тільки як частина похідного типу, об'єктів типу void не існує. Він використовується для того, щоб вказати, що функція не повертає значення, або як базовий тип для вказівників на об'єкти невідомого типу.
Змінної типу void* можна присвоювати вказівник будь-якого типу. На перший погляд це може здатись не особливо корисним, оскільки void* не можна розіменувати, але саме це обмеження і робить тип void* корисним. Головним чином, він застосовується для передачі вказівників у функції, які не дозволяють зробити припущення про тип об'єкта, і для повернення з функцій нетипованих об'єктів. Щоб використати такий об'єкт, необхідно застосувати явне перетворення типу. Подібні функції звичайно знаходяться на найнижчому рівні системи, там, де здійснюється робота з основними апаратними ресурсами.
Рядки
Рядкова константа - це послідовність символів, взята в подвійні лапки:
Кожна рядкова константа містить на один символ більше, ніж здається; всі вони закінчуються пустим символом '\0' зі значенням 0.
Рядок має тип "вектор з відповідного числа символів", тому "asdf" має тип char[5]. Пустий рядок записується "" (і має тип char[1]). Примітка: для кожного рядка s strlen(s)==sizeof(s)-1, оскільки strlen() не враховує завершальний 0.
Масив
Масив – це послідовність даних. Оголошується тип_ідент. [N1] [N2]… [Nm] і кількість вимірів необмежена. Доступ до елементів масиву здійснюється з-за допомогою індексів або вказівників за схемою a[i][j]- для двохвимірного масиву.
Вказівники та динамічна пам'ять
Вказівник – змінна, яка приймає значення комірки в динамічні пам’яті. Розрізняють фізичні та логічні адреси. Вказівники приймають значення логічної адреси у захищеному режимі мікропроцесора.
Оголошення: тип *ідентифікатор. Тип вказівника зазначає кількість байтів, на які діє цей вказівник при його розіменуванні.
Ядром програми є двонапрямлений список рядків, який складається зі структур, що містять: рядок, порядковий номер структури, вказівник на попередню структуру, вказівник на наступну структуру. Програма побудована на синхронізації двонапрямленого списку рядків та екрану монітора, за що відповідає одна із функцій. Вставка і витирання тексту у програмі оформлено, як робота з рядками, для цього також, для різноманітності, використовуються властивості вказівників. Для створення графічної оболонки використовуються символи ASCII-таблиці. Робота з клавіатурою зводиться до того, що потрібні клавіші переприсвоюються новими, потрібними для програми функціями, які мають взаємодіяти і з двонапрямленим списком рядків, і з виводом на екран комп’ютера. Робота з мишкою організована через переривання та перевірки, що оформлено як функції.
3. Алгоритми розв’язування задачі.
Завдання курсової роботи реалізувується через такі функції:
Перепризначення клавіш новими функціями та виклик цих функцій
Вивід статичних елементів інтерфейсу програми
Вставка нового елемента в список
Вставка тексту в список зі створенням нового елемента
Створення першого елемента в списку
Витирання певного елемента в списку
Вставка символа в певний елемент списку в позицію курсора
Приріст порядкових номерів елементів списку при додаванні нового елемента
Спад порядкових номерів елементів списку при витиранні елемента
Присвоєння нового обробника кнопки DELETE
Присвоєння нового обробника кнопки BackSpace
Присвоєння нового обробника кнопки ENTER
Присвоєння нового обробника кнопки ArrowUp
Присвоєння нового обробника кнопки ArrowDown
Оновлення даних на екрані
Прокрутка тексту вниз/вверх
Функція керування текстом
Знищення всіх елементів списку
Функція відкривання та зчитування файла
Функція запису в файл
Промальовка контекстного меню File
Функція виведення пунктів меню та їх підсвітки
Аналізатор вибору меню File
Вікно відкривання/збереження файлу
Включення/виключення курсора екрану
Універсальна фунція керування мишкою
Переведення координат мишки у текстовий режим
Включення мишки
Перевірка мишки на відпускання/натискання клавіші
Перевірка мишки на натискання в даних координатах
Перевірка мишки
Перевірка драйвера мишки
Ініціалізація мишки
Графічно глобальний алгоритм програми виглядає так:
Функція inchar.
Призначення: вставка символа в рядок і поточну позицію курсора.
Рис. 1. Графічна схема
Промальовка інтерфейсу
Рис.2. void interface
Вставка символа в даний елемент списку в
позицію курсора
Рис. 3. void inchar
Приріст порядкових номерів елементів списку
при додаванні нового елемента
Рис. 4. void inc_num
Присвоєння нового обробника кнопки DELETE
Рис. 5. void key_delete
Присвоєння нового обробника кнопки BackSpace
Рис. 6. void key_BkSp
Присвоєння нового обробника кнопки ENTER
Рис. 7. void key_enter
Аналізатор вибору меню File
Рис. 8. void mnu_an
Функція запису в файл
Рис. 9. void savef
Функція керування текстом
Рис. 10. void out1
Функція підсвітки пунктів меню.
Рис.11. void mnu 4. Програма та її опис.
4.1. Назва програми.
Простий текстовий редактор.
4.2. Призначення програми.
Програма призначена для редагування текстів з функціями читання та запису в файли.
4.3. Мови програмування, на яких написана програма.
Програма написана на мові програмування Сі. Дана мова вважається мовою середнього рівня завдяки наявності багатьох конструкцій мов високого рівня, але в той же час володінням майже усіма функціями асемблера. Оскільки в курсовій роботі я використовував як алгоритми опрацювання рядків, так і програмування маніпулятора «мишка» через переривання, то дана мова якнайкраще підходить для цього завдання.
4.4. Логічна структура програми.
Програма складається з 2 окремих файлів – головного, що містить функцію main(); і файлу роботи з мишкою. Функції алгоритмів викликаються через меню аналізаторами клавіатури та мишки, коли відповідні клавіші або кнопки мишки натиснуті.
В програмі обмежена кількість глобальних даних – лише ті, глобалізація яких дає переваги у реалізації алгоритму. Наприклад, глобальними є вказівник на двонапрямлений список рядків, позиція курсора мишки та клавіатури, рядок символів розділення – представлення їх глобально спричинене тим, що майже кожна функція використовує ці дані.
Окрім необхідних, решту змінні є локальними, і випадку потреби передаються у функції через вказівники. Така архітектура програми відповідає вимогам структурованості і забезпечує легше відслідковування помилок у програмі на етапі тестування.
Весь текст, набраний або зчитаний з файла під час роботи програми, записуютєся у двонапрямлений список рядків, який синхронізовується з екраном.
4.5. Вхідні та вихідні дані.
Програма приймає вхідні дані з файлу або з клавіатури. Під вхідними даними мається на увазі введений текст та дані через меню. Користувач або задає ім’я файлу для зчитування вхідних даних, або створює файл з допомогою програми. Також можливе задання файлу для зчитування через командний рядок.
Вихідними файлами є створені або відредаговані текстові дані.
4.6. Програмні засоби.
Дана програма запускається у вікні MSDOS під керуванням операційної системи Windows. Програма розроблена в інтегрованому середовищі Borland C++ 3.1
4.7. Технічні засоби.
Для повноцінного функціонування програми необхідні такі технічні засоби:
Комп’ютер класу Pentium II і вище
Монітор
Клавіатура
Маніпулятор «мишка».
5. Технологія програмування, виконання, відлагодження програми.
5.1. Технологія програмування.
Програма розділена на 2 окремі файли, кожен з яких «відповідає» за одну велику, завершену частину роботи програми.
Крім цього, кожен файл зокрема має свою структуровану архітектуру – всі завершені дії оформлені у функції, кожна функція має чітко визначені вхідні та вихідні параметри – все це відповідає вимогам структурного програмування, а також полегшує роботу програміста під час тестування, відлагодження програми чи процесу внесення змін.
5.2. Технологія виконання програми.
Перед запуском програми головний файл з функцією main() слід помістити у каталог Borlandc\Bin. Хідер-файл потрібно помістити у каталог Borlandc\Include або в інший каталог (але тоді слід прописати шлях до нього вибравши пункт меню інтегрованого середовища Options->Directories). Після цього можна запускати на виконання головний файл, натиснувши Ctrl+F9.
5.3 Відлагодження програми.
Програма написана згідно вимог структурного програмування, що значно полегшує її аналіз на помилки. Для виявлення помилок я використовую наступний алгоритм покрокового трасування:
Встановити точку перериву ПЕРЕД підозрілим фрагментом програми.
Виконати програму до точки перериву.
Покроково виконати подальшу частину програми
Відслідкувати зміну потрібних змінних у вікні Watch.
Зробити аналіз отриманих даних та виправити помилки
5.4. Надійність програми у межах зміни вхідних даних.
Програма є стійкою до вхідних даних. Наявні фільтри на введення імен файлів та шляхів до них. В текст можуть вводитись довільні дані.
6. Інструкція користувачеві.
Одразу після запуску програми ви побачите таке вікно:
Рис.1
Натиснення клавіші Alt+F дозволяє перейти в головне меню, по якому ви можете з здійснювати навігацію стрілками вниз, вверх. Натиснення клавіші Enter означає вибір відповідного пункту меню.
Рис.2
При запуску програми вона готова до вводу тексту. Якщо відкрито якесь меню, а потрібно повернутись до тексту, потрібно або мишкою натиснути будь-де на текстовому полі, або натиснути на клавіатурі клавішу Escape.
Програма має простий, інтуїтивно зрозумілий інтерфейс, з меню можна легко повернутись для редагування тексту.
Для завантаження з файлу/збереження в файл є пункти головного меню. Ці ж операції можна провести за допомогою швидких клавіш F3 i F2 відповідно. Інформацію щодо швидких клавіш можна знайти нижче текстового поля
Рис.3
Вибравши пункт меню Open… появиться вікно для введення шляху і назви файла (рис.4)
Рис.4
Для виходу з програми є 2 способи: швидка клавіша F10 та меню File->Exit.
7. Контрольний приклад та аналіз комп’ютерної реалізації програми.
Введення тексту
Рис.5
Відкривання файлу
Рис.6
Гортання тексту:
Рис.7
Висновки.
В ході виконання курсової роботи я закріпив практичні навички, набуті під час вивчення курсу «Проблемно-орієнтовані мови програмування». Крім того, я навчився самостійно опрацьовувати навчальну літературу, розробляти алгоритми та програмно втілювати їх. Я також здобув навички структурної організації програми – оформлення логічно завершених блоків програмного коду у вигляді окремих функцій.
Під час виконання роботи я також ознайомився з функціями роботи з BIOS та вказівниками, що часто використовується при розробці програм. Окрім цього, я розробив графічний інтерфейс програми у вигляді вікон та меню, що керуються з допомогою клавіатури або маніпулятора «мишка».
До недоліків моєї програми належить те, що програма є недостатньо оптимізованою, що підвищує вимоги до апаратного забезпечення.
До безумовних переваг програми слід віднести її структурованість, логічну впорядкованість. У процесі її написання я також намагався уникнути проблеми синхронізації позиції курсора на екрані та поточного елемента динамічною структури.
Алгоритм, використаний у даній курсовій роботі, може бути застосований у процесі розробки нових версій текстових редакторів.
Список використаної літератури.
Конспект лекцій з курсу «Проблемно-орієнтовані мови програмування».
Методичні вказівки до курсової роботи з дисципліни «Проблемно-орієнтовані мови програмування»
Керниган Б., Ритчи Д. «Язык программирования Си».
Шпак З.Я. «Програмування мовою С» Львів-2006
Додаток 1. Текст програми на мові Сі.
1. Головний файл TEdit.cpp (містить функцію main())
#include <stdio.h>
#include <conio.h>
#include <bios.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>
#include <ctype.h>
#include <process.h>
#include <mouse.h>
//Робота з двонапрямленим списком рядків
void inaft(struct cell *tmp,struct cell *x);
void intext(struct cell *tmp,char *txt);
void inchar(char chr);
void crt_cell(void);
void del_cell(struct cell *old);
void inc_num(struct cell *tmp);
void dec_num(struct cell *tmp);
void del_all_cell(void);
//Функції виводу на екран інтерфейсу та меню
void out1(int k);
void sl0(void);
void sl1(void);
void sl2(void);
void interface(void);
void mnu(int k);
int file_menu(void);
void mnu_an(int k);
char*open_w(void);
char*save_w(void);
//Перепризначення клавіш клавіатури
void key_enter(void);
void key_up(void);
void key_delete(void);
void key_BkSp(void);
void key_down(void);
void key_space(void);
void openf(char *path);
void savef(char *path);
void prepare();
void exec();
void save(void);
//Робота з мишкою та включення/виключення курсора
void cur_off(void);
void cur_on(void);
void mouse(int *m1, int *m2, int *m3, int *m4);
void set_mouse_posn(int xgr, int ygr);
void mouse_txt();
void mouse_on(void);
void mouse_off(void);
int button_release(int b);
int button_press(int b);
int button_state();
int mouse_in_box(int left, int top, int right, int bottom,int butt);
void init_mouse(void);
int check_mouse_driver(void);
void copy();
void paste();
struct cell *hd;
struct region
{
int x1,x2,y1,y2;
}xy;
int x,y,xp=0,max=1;unsigned char ta;char clip[80];
//x,y- змінні загального призначення
//xp-зміщення відносно першого рядка
//max-кількість struct cell
//ta-атрибути тексту
void main(int argc,char *argv[])
{
prepare();
if (argv[1][0]!=0)
openf(argv[1]);
exec();
}
/***************************************************************
Промальовка інтерфейсу
***************************************************************/
void interface(void)
{
int x1,y1,x2,y2;
textmode(C80);
clrscr();
textcolor(WHITE);
textbackground(BLACK);
window(1,1,80,1);
clrscr();
gotoxy(4,1); cprintf("ile");
textcolor(BLUE);
gotoxy(3,1); cprintf("F");
textcolor(BLUE);
window(1,2,80,25);
clrscr();
x1=2;y1=2;x2=79;y2=23;
x=x2+1; for(y=y1;y<=y2;y++){gotoxy(x,y);putch(186);}
x=x1-1; for(y=y1;y<=y2;y++){gotoxy(x,y);putch(186);}
y=y2+1; for(x=x1;x<=x2;x++){gotoxy(x,y);putch(205);}
x=x1-1; y=y2+1; gotoxy(x,y);putch(200);
x=x2+1; y=y2+1; gotoxy(x,y);putch(188);
x=x1-1; y=y1-1; gotoxy(x,y);putch(201);
y=y1-1; for(x=x1;x<=x2;x++){gotoxy(x,y);putch(205);}
x=x2+1; y=y1-1; gotoxy(x,y);putch(187);
gotoxy(80,2);putch(30);
gotoxy(80,22);putch(31);
textcolor(WHITE);
window(1,25,80,25);
clrscr();
gotoxy(6,1); cprintf("Save");
gotoxy(16,1); cprintf("Open");
gotoxy(76,1);cprintf("Exit");
textcolor(BLUE);
gotoxy(3,1); cprintf("F2");
gotoxy(13,1); cprintf("F3");
gotoxy(72,1);cprintf("F10");
textbackground(BLACK);
textcolor(WHITE);
window(2,3,79,23);
clrscr();
gotoxy(1,1);
}
/***************************************************************
Вставка нового елемента в список
***************************************************************/
void inaft(struct cell *tmp,struct cell*x)
{
x->back=tmp;
x->next=tmp->next;
tmp->next->back=x;
tmp->next=x;
x->num=tmp->num;
inc_num(x);
}
/***************************************************************
Вставка тексту в список зі створенням
нового елемента
***************************************************************/
void intext(struct cell *tmp,char *txt)
{
struct cell *p;
p=new (struct cell);
strcpy(p->ch,txt);
inaft(tmp,p);
}
/***************************************************************
Створення першого елемента в списку
***************************************************************/
void crt_cell(void)
{
hd=new (struct cell);
strcpy(hd->ch,"");
hd->back=NULL;
hd->next=NULL;
hd->num=1;
max=1;
}
/***************************************************************
Витирання даного елемента в списку
***************************************************************/
void del_cell(struct cell *old)
{
old->next->back=old->back;
old->back->next=old->next;
dec_num(old);
delete(old);
}
/***************************************************************
Вставка символа в даний елемент списку в
позицію курсора
***************************************************************/
void inchar(char chr)
{
int i;
char buf[80]="",buf2[80]="",q[80]="";
x=wherex();y=wherey();
strcpy(q,hd->ch);
if (strlen(q)>=x)
{
strncpy(buf,q,x-1);
x--;
for(i=x;i<strlen(q);i++)
buf2[i-x]=q[i];
buf[strlen(buf)]=chr;
strcpy(q,buf);
strncat(q,buf2,76-x);
strcpy(hd->ch,q);
delline();
insline();
cprintf("\r%s",q);
gotoxy(x+2,y);
}
else
{
if(x!=78)
{
strcpy(q,hd->ch);
i=strlen(q);
q[i]=chr;
strcpy(hd->ch,q);
gotoxy(1,hd->num);
cprintf("%s",q);
gotoxy(x+1,hd->num);
}
else
{
char*a;
a[0]=chr;
intext(hd,a);
hd=hd->next;
cprintf("\n\r%c",chr);
}
}
}
/***************************************************************
Приріст порядкових номерів елементів списку
при додаванні нового елемента
***************************************************************/
void inc_num(struct cell *tmp)
{
struct cell *w;
w=tmp;
while(w->next!=NULL)
{
w->num+=1;
w=w->next;}
w->num+=1;
if(w->num>max)
max=w->num;
}
/***************************************************************
Спад порядкових номерів елементів списку
при витиранні елемента
***************************************************************/
void dec_num(struct cell *tmp)
{
struct cell *w;
w=tmp;
while(w->next!=NULL)
{
w->num-=1;
w=w->next;}
w->num-=1;
max-=1;
}
void save(void)
{
struct cell *w=hd;
FILE *fp1;
if((fp1=fopen("C:\\bck_txt.txt","wt"))==NULL)
{
puts("ERROR by saving backup");
exit(1);
}
while(w->back!=NULL)
w=w->back;
if(max==1)
fprintf(fp1,"%s",w->ch);
else
while(1)
{
fprintf(fp1,"%s",w->ch);
if(w->next==NULL)
break;
w=w->next;
}
fclose(fp1);
}
/***************************************************************
Присвоєння нового обробника кнопки DELETE
***************************************************************/
void key_delete(void)
{
int i,n;
char buf[80]="",buf2[80]="",q[80]="";
x=wherex();y=wherey();
strcpy(q,hd->ch);
n=strlen(q);
if(n+1==x)
{
if(hd->next!=NULL)
{
char*p;
if((strlen(hd->ch)+strlen(hd->next->ch))<=78)
{
strcat(hd->ch,hd->next->ch);
delline();
insline();
cprintf("\r%s",hd->ch);
del_cell(hd->next);
gotoxy(1,wherey()+1);
delline();
gotoxy(x,wherey()-1);
}
else
{
p = strtok(hd->next->ch, ";, ");
if((strlen(p)+strlen(hd->ch))<=78)
{
char*a;char buf2[80]="",q[80]="";
strcpy(a,p);
strcat(hd->ch,a);
strcpy(q,hd->next->ch);
for(i=strlen(p)+1;i<strlen(q);i++)
buf2[i-strlen(p)]=q[i];
strcpy(hd->next->ch,buf2);
hd=hd->next;
gotoxy(1,wherey()+1);
}
}
}
}
else
if (n+1>x)
{
strncpy(buf,q,x-1);
for(i=x;i<strlen(q);i++)
buf2[i-x]=q[i];
strcpy(q,buf);
strncat(q,buf2,76-x);
strcpy(hd->ch,q);
delline();
insline();
cprintf("\r%s",q);
gotoxy(x,y);
}
}
/***************************************************************
Присвоєння нового обробника кнопки BackSpace
***************************************************************/
void key_BkSp(void)
{
int i,n;
char buf[80]="",buf2[80]="",q[80]="";
x=wherex();y=wherey();
strcpy(q,hd->ch);
n=strlen(q);
if(x==1)
{
if(hd->back!=NULL)
{
char*p;
if((n+strlen(hd->back->ch))<=78)
{
n=strlen(hd->back->ch);
strcat(hd->back->ch,q);
gotoxy(1,y-1);
delline();
delline();
insline();
hd=hd->back;
cprintf("\r%s",hd->ch);
gotoxy(n+1,wherey());
del_cell(hd->next);
}
else
{
p = strtok(hd->ch, ";, ");
if((strlen(p)+strlen(hd->back->ch))<=78)
{
strcat(hd->back->ch,p);
for(i=strlen(p)+1;i<strlen(q);i++)
buf2[i-