Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 63274
Модуль Forms 63187
ТЕХНОЛОГИИ ДОСТ... 59838
Пример работы с... 58722
Имитационное мо... 55309
Реклама
Сейчас на сайте
Гостей: 13
На сайте нет зарегистрированных пользователей

Пользователей: 13,076
новичок: AnnaFil
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование работы ЭВМ на GPSS + Пояснительная записка
База данных склада на Delphi + Схема БД
Моделирование станции технического обслуживания на GPSS + Отчет

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Программа заменяет в файле все числовые записи денежных сумм их словесными эквивалентами
Задание.

В исходном файле содержится некоторый текст. Требуется разработать программу, которая заменяет в этом файле все числовые записи денежных сумм их словесными эквивалентами. При этом для рублей может быть использована сокращенная запись «руб.» или полная «рублей», а для копеек – «коп.» или «копеек», по выбору пользователя.

Постановка задачи

Описание ограничений, накладываемых на исходные данные.

В соответствии с условием задачи исходные данные представляют собой текстовый файл. Для правильного выполнения поставленной задачи должны выполняться следующие условия:

- текст в файле должен быть записан с помощью кириллической кодировки (MS-DOS);
- обрабатываемый текст должен быть написан в соответствии с правилами русского языка;
- суммы денег, преобразуемые программой, должны быть представлены натуральными числами (или нулем);
- обрабатываемые суммы денег должны быть меньше квадриллиона;

Формы представления результатов работы программы.

Результатом правильной работы программы является текстовый файл, в котором числовые записи сумм денег заменены их словесными эквивалентами. В случае несоответствия обрабатываемого текста накладываемым ограничениям, текст в файле останется без изменений, либо вместо числовой записи суммы денег будет записано сообщение о превышении максимально допустимого размера числа (в случае соответствующей ошибки).

Разработка алгоритмов

Работу программы можно условно представить в виде следующей последовательности действий: получение адреса файла, поиск слов (числовых сумм денег), подлежащих замене, замена найденных чисел их словесными эквивалентами.
Последние два действия целесообразно реализовать в виде отдельных подпрограмм.
Процедура поиска чисел, подлежащих замене, должна возвращать данные о всех числовых записях сумм денег, т.е. само число и его позицию в файле.
Процедура замены числовых записей их словесными эквивалентами должна оставлять без изменений весь текст программы, за исключением чисел, находящихся на определенных позициях (эти числа и их позиции передаются из процедуры поиска чисел). Эти числам в соответствие должна ставиться определенная строка. Для определения этого соответствия целесообразно создать дополнительную процедуру, которая будет сопоставлять числу его словесное наименование.



Подпрограмма поиска числовых записей денежных сумм.

Подпрограмма посимвольно считывает файл, анализирует и подсчитывает считанные символы. Если символ является цифрой, то она и все следующие за ней цифры объединяются в одно число. После этого происходит считывание и анализ символов, составляющих следующее слово. Если оно является формой слова «рубль» («руб.») или «копейка» («коп.»), то запоминается число и его позиция относительно предыдущей числовой записи денежной суммы.
Т.к. наперед неизвестно количество включений в обрабатываемый текст чисел, обозначающих денежные наименования, то для сохранения данных целесообразно использовать связанный список. Элементы списка должны содержать следующие поля:
само число (строковая переменная), смещение относительно предыдущего включения (целочисленная переменная), род слова, обозначающего денежную единицу (мужской или женский) (целочисленная переменная).






Подпрограмма сопоставляющая трехзначному числу, его словесную эквиваленту.

В начале выполнения подпрограммы происходит проверка, меньше ли обрабатываемое число тысячи. Если нет, то возвращается сообщение об ошибке. В ином случае происходит обработка числа.
Для сопоставления цифры и слова используются четыре массива строк: массив, содержащий наименование сотен; массив, содержащий наименования десятков от двадцати до ста; массив наименований чисел от десяти до двадцати; массив наименований единиц.
В соответствии с первой цифрой числа выбирается наименование сотен, в соответствии со второй и третьей – десятков и единиц.




Подпрограмма определения соответствия числа и его словесного эквивалента.

Подпрограмме передается определенное число. Она проводит элементарную проверку на предмет соответствия числа введенным ограничениям. Если число недопустимо, то подпрограмма вернет сообщение об ошибке, при другом исходе подпрограмма начнет выполнение преобразование числа.
Для этого выполняется следующая последовательность действий. Исходное число разбивается на более мелкие числа с шагом в три разряда, начиная со старшего разряда (возможно исключение, в случае, если общее число цифр в обрабатываемом числе не кратно трем. В этом случае сначала берется такое количество разрядов, чтобы оставшееся количество цифр обрабатываемого числа было кратно трем). Получившееся трехзначное (возможно двух- или однозначное, в зависимости от выполнения описанного выше условия) число передается в подпрограмму преобразующую трехзначные числа в их словесные эквиваленты. Затем с помощью условного оператора происходит сопоставление трехзначному числу наименования разряда. А также согласование числительного (обозначающего число) и существительного (разряда). Эта последовательность действий повторяется до тех пор пока не будет обработана последняя тройка чисел. Сформированная в результате строка и будет являться словесной эквивалентой числу, обрабатываемому процедурой.







Подпрограмма, заменяющая в файле числовые записи сумм денег их словесными эквивалентами.

Т.к. напрямую вставить слово в файл вместо другого слова невозможно, то необходимо выполнить следующую последовательность действий.
Сформировать вспомогательный файл. Скопировать все содержимое обрабатываемого файла во вспомогательный, стереть содержимое обрабатываемого файла. Затем скопировать из вспомогательного файла символы до первого заменяемого числа (количество символов (т.е. позицию числа в тексте) и само число получим из подпрограммы поиска, описанной выше). После этого с помощью подпрограммы определения соответствия числа и его словесного эквивалента число заменяется на строку и вставляется в конец обрабатываемого файла. Во вспомогательном файле указатель смещается на количество цифр в числе и снова повторяется эта последовательность действий.
В конце подпрограммы происходит копирование оставшихся символов из вспомогательного файла в исходный и уничтожение вспомогательного файла.





Вспомогательные подпрограммы.

Для более удобной обработки строк целесообразно написать вспомогательную процедуру, отсекающую лишние пробелы в начале и в конце строки. Это будет осуществляться с помощью двух циклов. Первый будет работать до тех пора, пока первый символ является пробелом, на каждой итерации в теле цикла будет отсекаться первый символ. Второй цикл будет работать пока последний символ будет пробелом, на каждой итерации в теле цикла будет отсекаться последний символ.

Так как в программе используется динамический список, то удобно создать отдельную подпрограмму освобождения памяти, выделенной под динамический список.
Эта подпрограмма реализуется в виде цикла с предусловием, условием выхода из которого будет наличие пустого указателя, на который ссылается первый элемент списка. В теле цикла выполняются три действия: присваивание значения указателя на первый элемент вспомогательному указателю, присваивание указателю на первый элемент адреса второго элемента, удаление элемента, хранящегося по адресу вспомогательного элемента.
После выхода из цикла происходит освобождение памяти по адресу первого элемента.
В ходе выполнения этой подпрограммы может возникнут ситуация, когда на первой итерации цикла указатель на первый элемент будет пустым (т.е. в подпрограмму передастся пустой список). Тогда окажется невозможным обращение ко второму элементу списка и компилятор выдаст ошибку. Во избежание этой ситуации ест смысл добавить в начало подпрограммы дополнительное условие проверки указателя на первый элемент.

Разработка программы.

Основная часть программы.


Для реализации разработанного выше алгоритма будет использован язык программирования высокого уровня Паскаль.
В основной части программы от пользователя будет запрашиваться путь к файлу, сохраняться он будет в виде строковой переменной. С помощью процедуры Assign(var f:file; name of file:string) с этой строковой переменной файловую переменную f.
Затем будет вызываться подпрограмма поиска числовых записей денежных сумм. Ее целесообразно реализовать в виде функции, возвращаемым значением будет указатель на первый элемент связанного списка. В функцию будет передаваться файловая переменная.
Функция будет называться poisk и иметь прототип poisk(var f:text):ptrt. Программа вызовет функцию poisk, в качестве аргумента передаст файловую переменную f, а в качестве возвращаемого значения будет использован указатель pfirst.
Используя условный оператор if программа проверит, является ли указатель pfirst пустым. Если нет, то вызовет подпрограмму, заменяющую в файле числовые записи сумм денег их словесными эквивалентами. Т.к. никакого значения она не возвращает, то реализовать ее надо в виде процедуры. Называться она будет vstavka. Ее прототип vstavka(var f:text; pfirst:ptrt). В качестве аргументов ей будет передаваться файловая переменная f и указатель на первый элемент связанного списка pfirst.
После ее выполнения, в случае непустоты списка будет вызвана процедура удаления списка – liberate(first:ptrt). Ей в качестве аргумента передается указатель на первый элемент – pfirst.
После этого заканчивается выполнение программы.

Функция poisk(var f:text):ptrt.

В начале происходит открытие файла, связанного с переменной f. Для этого используется процедура reset(var f:file). Для проверки успешности выполнения этой процедуры используется функция IOResult:integer. Если она имеет ненулевое значение, то выводится сообщение об ошибке, а выполнение функции прекращается.
Затем используется цикл с предусловием while. В качестве условия цикла будет использована функция eof(var f:file):boolean, в качестве аргумента которой будет использована переменная f. Для правильного функционирования нужно инвертировать условие с помощью оператора not.
Далее в теле цикла происходит посимвольное считывание в cсимвольную переменную c из файла, c помощью процедуры read. С помощью переменной n происходит подсчет считанных символов.
Если, считанный символ является цифрой, то запускается цикл while, работающий до тех пор, пока не будет достигнут пробел, или конец файла. В теле цикла происходит объединение всех считанных символов в строку s1 с помощью функции concat(s1, [s2..sN]:string):string, считывается следующий символ в файле, а также инкрементируется переменная n.
Т.к. в Паскале нет встроенных средств для позиционирования указателя внутри текстового файла, то после выхода из этого цикла, запускается вспомогательный цикл while, служащий для перемещения указателя к следующему слову в файле.
Затем, если следующий после пробелов символ является буквой или знаком препинания, то происходит считывания всех символов до тех пор, пока считанные символы являются буквами или знаками препинания. В теле цикла происходит объединение считанных символов в строковую переменную s2, а также подсчет общего количества считанных символов.
Дальнейшее действие – отделение знаков препинания, находящихся в s2. Для этого используется цикл while, условием выполнения очередной итерации которого, служит включение последнего символа строки в множество знаков препинания.
Далее происходит анализ строки s2. Если она является словом «рубль» или «копейка» (а также некоторых их падежных форм), то происходит выделение памяти под элемент динамического списка и запись в него s1 (обрабатываемое число), результата выражения (n-2-length(s2)-length(s1)) (смещение от предыдущего числа), а также переменной символизирующей род слова, обозначающего денежную единицу.
В конце функции присваивается значение указателя на первый элемент списка pfirst или nil, в случае, если ни одного включения необходимого сочетания в файле нет.
В функции poisk для проверки, является ли символ цифрой, буквой или знаком препинания, используются множества (set of…). Соответственно, создано множество, состоящее из цифр (cifra), множество букв (dopsim), множество знаков препинания (znaki). Включение символа в множество проверяется с помощью оператора in.

Процедура vstavka(var f:text; pfirst:ptrt)

Процедура формирует вспомогательный файл, c которым онна связывает файловую переменную f1, затем открывает его на запись с помощью процедуры rewrite(var f:file), а также открывает на чтение файл, c которым связана переменная f, передающаяся в процедуру как аргумент.
Для контроля успешности открытия файлов используется функция IOResult.
Если при открытии файла произошли ошибки, то процедура выдаст сообщение об ошибке и прекратит свое выполнение, в ином случае, с помощью цикла с постусловием repeat все содержимое файла f в файл f1. Это происходит в теле цикла с помощью посимвольного считьывания содержимого файла f в символьную c и последующей посимвольной записи с в файл f1. Условием выхода из цикла является конец файла f (об этом сигнализирует функция eof).
После этого оба файла закрываются процедурой close(var f:file).
Файл f1 открывается на чтение (reset), а файл f - очищается и открывается для записи (rewrite).
Запускается цикл while, условием выполнения которого является неравенство указателя phelp нулю. (phelp – указатель на текущий элемент списка, на первой итерации он равен pfirst). Внутри этого цикла запускается итерационный цикл, количество повторений которого равно количеству символов перед перед обрабатываемым числом. Оно хранится в динамическом списке. В теле цикла происходит копирование символа из f1 в f..
Затем вызывается процедура определения соответствия числа и его словесного эквивалента. Ее результат записывается в f. С помощью итерационного цикла указатель в файле f1 смещается на количество символов, равное количеству символов в цифровой записи числа. Происходит переход к следующему элементу динамического связанного списка.
После окончания этого цикла, необходимо запустить цикл while, который будет работать до конца файла f1. В его теле будет происходить посимвольное «дописывание» в f тех символов f1, которые находятся после последней числовой записи денежной суммы.
После этого происходит закрытие обоих файлов (close). И уничтожение файла, связанного с переменной f1 (erase(var f:file)).

Функция cif_buk(s:string; rod:integer):string

В процедуре vstavka происходит обращение к подпрограмме, сопоставляющей числу его текстовое написание. Эта подпрограмма реализована в виде функции под названием cif_buk. В качестве аргумента ей передается число (в виде строки) и целочисленная переменная, которая равна 0, если слово, стоящее за числом, женского рода, или 1, если слово – мужского). Возвращает она строку, являющуюся текстовым написанием переданного в нее числа. В случае ошибки, процедура вернет сообщение об ошибке, заключенное в два символа “#” с каждой стороны.
С помощью процедуры val строковая переменная преобразуется к целочисленному типу. Если преобразование проходит успешно и получившаяся переменная равна нулю, то функции присваивается значение “ноль”, и она заканчивает свое выполнение. В ином случае происходит анализ числа (как строковой переменной). Отбрасываются лишние ноли в начале строки с помощью итерационного цикла, совершающего количество итераций равное количеству символов в строке представляющей число. Для этого используется функция length(s:string):integer (возвращает длину строки), delete(var s s:string; n,m:integer) (удаляющей заданное количество символов, начиная с некоторого). Затем функция проверяет является ли число допустимым (менее квадриллиона, целое неотрицательное) и возвращает сообщение об ошибке при отрицательном варианте.
После этого происходит разбиение этого числа на трехзначные. Для этого используется функция copy(s:string; n:integer;l:integer):string.
Получившееся трехзначное число передается в подпрограмму сопоставляющую трехзначному числу, его словесную эквиваленту.
Эта подпрограмма в свою очередь является функцией do_1000. В ней используются четыре массива строк, содержащих наименование сотен, десятков, единиц и чисел от одиннадцати до двадцати. С помощью нескольких условных операторов по цифрам числа определяется индексы элементов этих массивов, из которых конкатенируется искомая строка. Которая возвращается функцией.
Затем функция cif_buk отсекает последнюю цифру трехзначного числа и с помощью оператора case и нескольких операторов if происходит выборка из строкового массива, хранящего наименования разрядов, того разряда, который соответствует этим трем числам в обрабатываемом числе, и его согласование с о словом, обозначающим разряд, в соответствии с правилами русского языка (для этого используется переменная, являющаяся вторым аргументом функции).
Эта последовательность действий повторяется до тех пор, пока не буду обработаны последние три цифры исходного числа. Получившуюся в конце строку, функция возвращает в качестве своего значения.

Процедура liberate(first:ptrt)

Т.к. программа использует динамический список, то встает необходимость освобождения памяти в конце выполнения программы. Для этого используется функция liberate.
Ее аргументом является указатель на первый элемент списка. Если список не пуст, то используя цикл while выполняется следующая последовательность действий: вспомогательному указателю help присваивается адрес первого элемента списка, указателю first присваивается адрес второго элемента, элемент, на который ссылается help, уничтожается с помощью процедуры dispose(var p). Цикл работает до тех пор, пока второй элемент существует. После его выполнения происходит уничтожение первого элемента.

Структура данных.

Программа считывает данные из текстового файла. Внутри программы данные передаются в виде связанного списка. Каждый элемент списка является записью следующего вида:


kos=Record
Cif:string; {число, которое заменяется программой}
Sm:longint;{смещение относительно предыдущего обработанного числа}
B:integer;{род слова, обозначающего денежную единицу (1-мужской, 0-женский)}
Next:ptrt; {указатель на следующий элемент списка}
End;

На выходе программа выдает текстовый файл с замененными числовыми записями на текстовые.

Экспериментальная проверка программы.

Вывод: программа функционирует на 100% правильно.

Руководство оператора.

Назначение программы.


Программа предназначена для работы с текстовым файлом. Если в тексте, содержащимся в файле есть числовая запись денежной суммы, то она будет заменена своим словесным эквивалентом.

Условия выполнения программы.

Для корректной работы программы достаточно:
-процессор с тактовой частотой 100 мГц;
-оперативная память 4 мБ;
-память на жестком диске 16 мБ;
-оперативная система MS-DOS;

Выполнение программы.

Для запуска программы необходимо запустить файл kursovoi.exe.
В начале выполнения программы выводится сообщение: «Введите путь к файлу.» пользователь должен ввести путь к обрабатываемому текстовому файлу. Программа в ходе выполнения преобразует текстовый файл. Результатом правильного выполнения программы является преобразованный текстовый файл.

Сообщение оператору.

«Ошибка открытия файла» – файл, находящийся по адресу, введеному пользователем не может быть открыт или не существует;
«Ошибка. Не может быть создан вспомогательный файл» – на жестком диске не достаточно места для создания вспомогательного файла;
«##Превышен максимально допустимый размер числа##» - число, обозначающее денежную сумму слишком велико.

Заключение.

В результате выполнения курсового проекта была создана полностью функционирующая программа, решающая поставленную задачу.

Список использованных источников

В.С.Новичков, Н.И.Парфилова, А.Н.Пылькин «Алгоритмизация и программирование на Турбо Паскале»
В.В.Фаронов «Турбо Паскаль 7.0»
Вирт Н. «Алгоритмы и структуры данных»
Н.Культин «Турбо Паскаль в задачах и примерах.»

Приложение.
Исходный текст программы.

Program dec;
{$I-}
Type
Ptrt=^kos;

kos=Record
Cif:string;
Sm:longint;
B:integer;
Next:ptrt;
End;
edi=array[1..10] of string;
desy1=array[1..10] of string;
desy2=array[1..8] of string;
sotk=array[1..10] of string;
razryad=array[1..5] of string;


const
ed:edi=('','один','два','три','четыре','пять','шесть',
'семь','восемь','девять');

des1:desy1=('десять','одиннадцать','двенадцать',
'тринадцать','четырнадцать','пятнадцать','шестнадцать',
'семнадцать','восемнадцать','девятнадцать');

des2:desy2=('двадцать','тридцать','сорок',
'пятьдесят','шестьдесят','семьдесят','восемьдесят',
'девяносто');

sot:sotk=('','сто','двести','триста','четыреста','пятьсот',
'шестьсот','семmcот','восемьсот','девятьсот');

razr:razryad=('', 'тысяч', 'миллион', 'миллиард', 'триллион');


Var
Put:string;
F:text;
Pfirst:ptrt;

procedure lish32(var s:string);
begin
while s[1]=' ' do delete(s,1,1);
while s[length(s)]=' ' do delete(s,length(s),1);
end;

function do_1000(n:integer):string;
var
k:integer;
stroka:string;
Begin
if (n>999) or (n<0) then stroka:='##Ошибка обработки данных##'
else
If n=0 then stroka:='ноль'
else
begin
stroka:='';
stroka:=concat(stroka,sot[(n div 100)+1]);
stroka:=concat(stroka,' ');
k:=(n mod 100) div 10;
if k=1 then
stroka:=concat(stroka, des1[n mod 10+1])
else
if k=0 then
stroka:=concat(stroka, ed[(n mod 10)+1])
else
begin
stroka:=concat(stroka, des2[k-1]);
stroka:=concat(stroka,' ');
stroka:=concat(stroka, ed[(n mod 10)+1]);
end;
end;
lish32(stroka);
do_1000:=stroka;
end;

Function cif_buk (s:string; rod:integer):string;
Var
r,h,err,i,m,k:integer;
vs, stroka:string;
Begin
stroka:='';
val(s,r,err);
if not((r=0)and(err=0)) then
begin
While s[1]='0' do delete(s,1,1);
For i:=1 to length(s) do
if not(s[i] in ['0'..'9']) then
begin
cif_buk:='##Недопустимый формат данных##';
exit;
end;


m:=length(s) mod 3;
if m=0 then k:=length(s) div 3 else k:=(length(s) div 3)+1;
if k>5 then
begin
cif_buk:='##Превышен максимально допустимый размер числа##';
exit;
end;

for i:=1 to k do
begin
if (i=1) and (m<>0) then
begin
vs:=copy(s,1,m);
delete(s,1,m);
end
else
begin
vs:=copy(s,1,3);
delete(s,1,3);
end;

val(vs,r,err);
stroka:=concat(stroka,do_1000(r));
stroka:=concat(stroka,' ');
h:=r mod 10;
if r=0 then delete(stroka, length(stroka)-4, 5)
else
case h of

1: begin
if ((k+1-i)=2) then
begin
if (r mod 100)=11 then
stroka:=concat(stroka,razr[2])
else
begin
delete(stroka, length(stroka)-2, 3);
stroka:=concat(stroka,'на тысяча');
end;
end
else
begin
stroka:=concat(stroka, razr[k+1-i]);
if ((r mod 100)=11) and ((k+1-i)<>1) then
stroka:=concat(stroka, 'ов');
end;
if ((k+1-i)=1) and (rod=0) then
begin
delete(stroka, length(stroka)-2,3);
stroka:=concat(stroka, 'на');
stroka:=concat(stroka, ' ');
end;

END;

2: BEGIN
if (k+1-i)=2 then
if (r mod 100)=12 then
stroka:=concat(stroka,razr[k+1-i])
else
begin
delete(stroka, length(stroka)-1, 2);
stroka:=concat(stroka,'е тысячи');
end
else
begin
if (k+1-i)<>1 then
begin
stroka:=concat(stroka,razr[k+1-i]);
if (r mod 100)=12 then
stroka:=concat(stroka,'ов')
else
stroka:=concat(stroka,'а');
end
else
if rod=0 then
begin
delete(stroka, length(stroka)-1,2);
stroka:=concat(stroka, 'е');
end;
end;
stroka:=concat(stroka, ' ');
end;

3,4: begin
if (k+1-i)=2 then
begin
if ((r mod 100)=13) or ((r mod 100)=14) then
stroka:=concat(stroka,'тысяч')
else
stroka:=concat(stroka,'тысячи');
end
else
begin
if (k+1-i)<>1 then
begin
stroka:=concat(stroka,razr[k+1-i]);
if ((r mod 100)=13) or ((r mod 100)=14) then
stroka:=concat(stroka,'ов')
else
stroka:=concat(stroka,'а');
end;
end;
stroka:=concat(stroka, ' ');
end;

5,6,7,8,9: begin
if (k+1-i)>2 then
begin
stroka:=concat(stroka,razr[k+1-i]);
stroka:=concat(stroka,'ов');
end
else stroka:=concat(stroka,razr[k+1-i]);
stroka:=concat(stroka, ' ');
end;
0: begin
if (k+1-i)>2 then
begin
stroka:=concat(stroka,razr[k+1-i]);
stroka:=concat(stroka,'ов');
stroka:=concat(stroka, ' ');
end
else
begin
stroka:=concat(stroka,razr[k+1-i]);
stroka:=concat(stroka,' ');
end;
end;
end;
end;
lish32(stroka);
cif_buk:=stroka;
end
else
cif_buk:='ноль';
end;

function poisk(var f:text):ptrt;
var
cifra,dopsim,znaki:set of char;
s1,s2:string;
c:char;
b:integer;
control,l,n,k,err:integer;
phelp:ptrt;

BEGIN
Control:=0;
reset(f);
if IOResult<>0 then
begin
writeln('Ошибка открытия файла.');
readln;
end
else
begin

DopSim:=['а'..'я','А'..'Я'];
cifra:=['0'..'9'];
znaki:=['.',',',';',':','?','?','!'];
n:=0;
pfirst:=nil;
phelp:=nil;
while not(eof(f)) do
begin
read(f,c);
n:=n+1;
b:=0;
s1:='';
if (c in cifra) then
begin
while (c<>' ') and (c<>#26) do
begin
s1:=concat(s1,c);
read(f,c);
n:=n+1;
end;

while c=' ' do
begin
read(f,c);
n:=n+1;
end;

s2:='';

while ((c in dopsim ) or (c in znaki)) do
begin
s2:=concat(s2,c);
read(f,c);
n:=n+1;
end;

l:=0;

while s2[length(s2)] in znaki do
begin
delete(s2, length(s2),1);
n:=n-1;
l:=l+1;
end;

if (s2='рубль') or (s2='рублей') or (s2='рубля') or (s2='руб') or
(s2='копейка') or (s2='копеек') or (s2='копейки') or (s2='коп') then
begin
if (s2='рубль') or (s2='рублей') or (s2='рубля') or (s2='руб') then b:=1;
if pfirst<> nil then
begin
new(phelp^.next);
phelp:=phelp^.next;
end
else
New(phelp);

phelp^.cif:=s1;
phelp^.sm:=n-2-length(s2)-length(s1);
phelp^.b:=b;
control:=1;
phelp^.next:=nil;

if pfirst=nil then pfirst:=phelp;
n:=length(s2)+l+2;
end;
end;
end;
end;
if control=0 then poisk:=nil
else poisk:=pfirst;
close(f);
END;



procedure liberate(first:ptrt);
var
help:ptrt;
begin
if first<>nil then
begin
while (first^.next<>nil) do
begin
help:=first;
first:=first^.next;
dispose(help);
end;
dispose(first);
end;
end;



procedure vstavka(var f:text;pfirst:ptrt);
var
f1:text;
c:char;
phelp:ptrt;
i:integer;
Begin
assign(f1,'led.txt');
rewrite(f1);
reset(f);
if IOResult<>0 then
begin
writeln('Ошибка. Не может быть создан вспомогательный файл');
readln;
end
else
begin
repeat
read(f,c);
write(f1,c);
until eof(f);
close(f1);
close(f);
reset(f1);
rewrite(f);
phelp:=pfirst;
while phelp<>nil do
begin
for i:=1 to phelp^.sm do
begin
read(f1,c);
write(f,c);
end;
write(f,cif_buk(phelp^.cif, phelp^.b));
for i:=1 to length(phelp^.cif) do
read(f1,c);
phelp:=phelp^.next;
end;
while not eof(f1) do
begin
read(f1,c);
write(f,c);
end;
close(f1);
close(f);
erase(f1);
end;
end;

BEGIN
writeln('Vvedite put k failu');
readln(put);
assign(f,put);
pfirst:=poisk(f);
if pfirst<>nil then
vstavka(f,pfirst);
if pfirst<>nil then
liberate(pfirst);
END.



Опубликовал Kest July 28 2009 20:58:35 · 0 Комментариев · 10232 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Генетический алго...
DelphiXIsoDemo1
DemoEdit [Исходни...
Работа с матрицами
IIIDTrans
iChat v.7.0 Final...
IpEditAdress
Matrix2D
XPATComponents
OnlineIP
Игра "Астероиды" ...
Приемы программир...
Разработка клиент...
ComboBox97
Х. М. Дейтел, П. ...
Шаблон для новост...
Анекдоты с ostrie.ru
Шифрование по алг...
TrayComp
Сложный калькулятор

Топ загрузок
Приложение Клие... 100426
Delphi 7 Enterp... 85329
Converter AMR<-... 20062
GPSS World Stud... 12244
Borland C++Buil... 11461
Borland Delphi ... 8428
Turbo Pascal fo... 7014
Visual Studio 2... 4985
Калькулятор [Ис... 4685
FreeSMS v1.3.1 3530
Случайные статьи
Как должен выгляде...
Экспертная система...
Сжатие данных
Уровень статей раз...
10.4. Принцип рез...
168.10.
Клоакинг
Фактически при выв...
Помещение модулей ...
помещая их учетные...
Полная ленивость
Подключение Micros...
Загрузить в указат...
• попытка соединен...
Создание простейше...
Получи, клиент, ра...
Справочные материалы
Справочные списки
Понятие свойства. ...
Label
Division by zero
Границы ячейки
Связываемые таблиц...
Демонтаж жидкокрис...
Стандартные модули
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?