Главная Учебники - Разные Лекции (разные) - часть 34
|
Программа "текстовый редактор"
Пояснительная записка к курсовой работе по дисциплине “Основы алгоритмизации и программирования” Выполнил : студент гр. 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 Логические переменные: *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); - Вызывается из основной программы Логические переменные: *s (char) - указатель на строку lng (int) - максимальная длина x,y - координаты ввода Внутренние переменные: rs[100] (char) - Временная строка n (int) - Счетчик c (char) - Введённый с клавиатуры символ 6.3 Функция load Логические переменные: Внутренние переменные: fname[25] (char) - Имя файла *f (file) - указатель на файл 6.4 Функция save Логические переменные: Внутренние переменные: fname[25] (char) - Имя файла *f (file) - указатель на файл *pr (char) - временный указатель 6.5 Функция reset Логические переменные: *a (char) - указатель на текст n (int) - количество символов в тексте Внутренние переменные: 6.6 Функция up Логические переменные: *a (char) - указатель на текст *b (char) - указатель на текущую строку Внутренние переменные: 6.7 Функция down Логические переменные: *a (char) - указатель на текст *b (char) - указатель на текущую строку Внутренние переменные: 6.8 Функция menu switch (menu(30,5," Сохранить файл " " Считать файл " " Ввод шаблона " " Параметры " " Выход из программы " "\x0")) Вызывается из основной программы Логические переменные: 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) - временный указатель 6.9 Функция end Логические переменные: *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) - временный указатель 6.11 Функция find Логические переменные: *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); - Вызывается из основной программы. Логические переменные: Внутренние переменные: s[100] (char) - временная строка rz (long) - cчитанное число n (int) - счётчик c (char) - символ 6.13 Функция centr Логические переменные: *st (char) - указатель на текст *scrs (char) - указатель на текущую строку x , y (int) - координаты left (int) - левый отступ right (int) - число символов в строке Внутренние переменные: n (int) - число символов в строке d (int) - счётчик 6.14 Основная программа Внутренние переменные: left (int) - левый отступ right (int) - число символов в строке masks (char) - маска для поиска *scrs (char) - указатель на текущую строку x , y (int) - координаты курсора c (char) - введённый с клавиатуры символ n (int) - счётчик 7 Технические требования для использования
Для запуска данной программы необходимо наличие персонального компьютера IBM PC/XT c операционной системой MS-DOS. Необходимый объем оперативной памяти - 400 Кбайт. Дла запуска программы необходимо сделать текущем каталог с программой tr.exe и вызвать её на выполнение. Программа работает в текстовом режиме 80х25 символов. Файлы программы , если не указывать дополнительный путь , будут записываться и считываться из текущего каталога текущего диска. Управление программой усуществляется с клавиатуры. 8 Описание работы программы
После своей загрузки программа осуществляет оформление экрана , вывод в нижнюю часть экрана строки подсказки , в которой содержется информация о функциональных клавишах. Пользователь может вводить и редактировать текст , задавать формат текста (левый отступ , число символов в строке) , центровать нужную строку , осуществлять поиск нужной фразы по шаблону , считать необходимый файл с диска , записать текст в файл на диске , выйти из прграммы. 9 Тестирование программы
Для полной проверки работоспособности программы необходимо её протестировать. План тестирования программы "Текстовый редактор" состоит в следующем: 1) Создание отдельно от программы файла с исходным текстом. 2) Загрузка программы tr.exe. 3) Загрузка файла test.in. 4) Редактирование текста. 5) Изменение параметров строки и центрирование отдельных строк текста. 6) Создание шаблона для поиска и поиск фразы в тексте по этому шаблону. 7) Запись отредактированного текста в файл test.out. 8) Выход из программы. Исходный тестовый файл test.in содержит в себе следующий текст: Файл для тестирования программы tr.exe эта программа предназначена для ввода и редактирования текста Тестирование программы
Далее в пункте "Результаты работы программы" приводится распечатка тестирования программы по пунктам плана тестирования и результатов тестирования. 10 Результаты работы программы 1) Создание отдельно от программы файла с исходным текстом: Файл test.in содержит в себе следующий текст: Файл для тестирования программы tr.exe эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ 2) Загрузка программы tr.exe: ESC - Меню, F4 - Поиск, Alt-C - центровка 0 0 3) Загрузка файла test.in: 1) Сохранить файл 2) Считать файл 3) Ввод шаблона 4) Параметры 5) Выход из программы Введите имя файла: test.in а 0 0 4) Редактирование текста: Файл для тестирования программы tr.exe Эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ ESC - Меню, F4 - Поиск, Alt-C - центровка 0 0 5) Изменение параметров строки и центрирование отдельных строк текста: Файл для тестирования программы tr.exe эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ 1) Сохранить файл 2) Считать файл 3) Ввод шаблона 4) Параметры 5) Выход из программы Введите левый отступ: иск, A5 а 0 0 Файл для тестирования программы tr.exe эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ 1) Сохранить файл 2) Считать файл 3) Ввод шаблона 4) Параметры 5) Выход из программы Введите количество символов 40 а 0 0 Центровка 3 строки: Файл для тестирования программы tr.exe эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ ESC - Меню, F4 - Поиск, Alt-C - центровка 0 3 6) Создание шаблона для поиска и поиск фразы в тексте по этому шаблону: Файл для тестирования программы tr.exe эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ 1) Сохранить файл 2) Считать файл 3) Ввод шаблона 4) Параметры 5) Выход из программы Введите шаблон для поиска: текст эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ ESC - Меню, F4 - Поиск, Alt-C - центровка 56 0 7) Запись отредактированного текста в файл test.out: Файл для тестирования программы tr.exe эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ 1) Сохранить файл 2) Считать файл 3) Ввод шаблона 4) Параметры 5) Выход из программы Введите имя файла: test.out а 0 0 8) Выход из программы: Файл для тестирования программы tr.exe эта программа предназначена для ввода и редактирования текста ТЕСТИРОВАНИЕ ПРОГРАММЫ 1) Сохранить файл 2) Считать файл 3) Ввод шаблона 4) Параметры 5) Выход из программы ESC - Меню, F4 - Поиск, Alt-C - центровка 0 0 Список литературы
1.Бьярн Страуструп. Язык программирования С++.в двух частях. Пер. с англ. Киев:"ДиаСофт",1993.-296 с.,ил. 2.Корриган Джон Компьютерная графика: Секреты и решения: Пер с англ. -М.:Энтроп, 1995. - 352 с., ил. ПРИЛОЖЕНИЕ 1 Распечатка программы #include <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
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||