Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Процедуры обработки строк.
Для иллюстрации использования переменных, объявленных локально, будут разработаны две процедуры сравнения строк. Эти процедуры имеют два входных параметра файлового типа для строк и символьный параметр результата. Рабочие данные объявляются внутри процедуры.
Рассмотрим задачу сравнения длин строк, сохраненных в файлах F1 и F2. Результат сравнения возвращается в переменной Result: 1, если строка в F1 короче; 2, если строка в F2 короче; 0, если строки равной длины.
Раздел проекта 1 [DP 1]
PROCEDURE Length(VAR F1, F2: TEXT; VAR Result: CHAR); {Result 0, 1, 2 если длина F1 =, <, > длины F2 соответственно. Фактические параметры, соответствующие F1 и F2 должны быть различными} VAR Ch1, Ch2: CHAR; BEGIN {Length} RESET(F1); RESET(F2); WHILE NOT EOF(F1) AND NOT EOF(F2) DO BEGIN READ(F1, Ch1); READ(F2, Ch2) END {Анализировать F1, F2 и установить Result в соответствии с длиной} END {Length}
Раздел проекта 1.1 [DP 1.1]
BEGIN {Анализировать F1, F2 и установить Result в соответствии с длиной} IF EOF(F1) THEN {в F1 уже пусто} IF EOF (F2) THEN {и в F1 и в F2 пусто} Result: = ‘0’ ELSE {в F1 пусто, в F2 еще есть символы} Result: = ‘2’ ELSE {в F1 есть символы, а F2 уже пуст (из условия в WHILE)} Result: = ‘1’ END
Лексикографический порядок строк – это их порядок появления как слов в словаре – алфавитный порядок, где алфавит – набор символов Паскаль-машины. Из двух строк различной длины, имеющих одинаковые последовательности символов, короткая предшествует. Например, †ABC† предшествует †ABCDEF†, но †XYZ† предшествует †YZ†. Определять лексикографический порядок строк простое дело: сравнивать их символы попарно, пока не встретятся неравные символы или одна из строк не закончится. Хотя Lexico предназначена для использования с 1-строками, она может быть использована и для сравнения n-строк.
Раздел проекта 2 [DP2]
PROCEDURE Lexico(VAR F1, F2: TEXT; VAR Result: CHAR); {Result 0, 1, 2 если лексикографический порядок F1 =, <, > чем F2 соответственно. Фактические параметры, соответствующие F1 и F2, должны быть различными} VAR Ch1, Ch2: CHAR; BEGIN {Lexico} RESET(F1); RESET(F2); Result: = ‘0’; WHILE (NOT EOF(F1) AND NOT EOF(F2)) AND (Result = ‘0’) DO BEGIN READ(F1, Ch1); READ(F2, Ch2); IF (Ch1 < Ch2) OR (EOF (F1)) THEN {Ch1 < Ch2 или F1 короче F2} Result: = ‘1’ ELSE IF (Ch1 > Ch2) OR (EOF (F2)) THEN {Ch1 > Ch2 или F2 короче F1} Result: = ‘2’ END {WHILE} END {Lexico}
Length и Lexico – полезные “кирпичики”, которые можно использовать при разработке приложений, работающих со строками. Программы SelectSort и SelectReverse, разработанные в разделе 4.2 также могут быть преобразованы в процедуры. Эти частицы могут быть преобразованы в библиотеку подпрограмм для работы со строками. Конкретный набор процедур для работы со строками - вопрос вкуса и опыта. По мере использования такой библиотеки и чем больше будет узнано о алгоритмах работы со строками, она может вырасти до мощного средства решения задач. Когда процедуры из библиотеки будут использоваться в проекте, будет удобно включать их имена и комментарий. Комментарий к процедуре в библиотеке должен в основном отражать информацию о том, как используется процедура, т.е. что она делает не как, хотя можно упомянуть и о некоторых моментах реализации важных с точки зрения использования. Например, о том, что вызов процедуры потребует больших затрат процессорного времени. Комментарий должен быть достаточен для корректного использования каждой процедуры. Такой комментарий обычно называют комментарием включения (include comment). Например, если мы включаем в проект Lexico, комментарий может быть следующим:
{Включить PROCEDURE Lexico(VAR F1, F2: TEXT; VAR Result: CHAR); Result 0, 1, 2 если лексикографический порядок F1 =, <, > чем F2 соответственно. Фактические параметры, соответствующие F1 и F2, должны быть различными}
Таким образом, каждая процедура в библиотеке должна начинаться с информации, необходимой для включающего комментария. Заголовок процедуры предоставляет имя и подробную информацию о ее параметрах. Оставшаяся часть включающего комментария должна позволять использовать процедуру без изучения ее текста. Необходимо тщательно описывать ограничения и специальные случаи. В нашем случае подразумевается, что строки в файлах-параметрах не содержат маркеров строки, к входному файлу применяется RESET, но он не остается в этом состоянии по завершению процедуры, к выходному файлу применяется REWRITE, алиасинг фактических параметров не допускается.
PROCEDURE InString(VAR F1: TEXT); {Создает строку в файле F1 из символов в INPUT до следующего маркера конца строки}
PROCEDURE OutString(VAR F1: TEXT); {Печатает строку в файле F1 в OUTPUT, завершая ее маркером конца строки}
PROCEDURE CopyOpen(VAR F1, F2: TEXT); {Копирует строку из F1 в F2 без выполнения RESET или REWRITE, F1 должен быть подготовлен для чтения, а F2 – для записи. Строка прошлого этих файлов может быть непустой}
PROCEDURE Sort(VAR F1, F2: TEXT); {Помещает в F2 отсортированную строку символов из F1}
PROCEDURE Reverse(VAR F1, F2: TEXT); {Помещает в F2 строку символов из F1 в обратном порядке}
PROCEDURE Concatenate(VAR F1, F2, F3: TEXT); {Создает F3 из символов F1, за которыми следуют символы из F2}
Библиотечные процедуры часто используются при разработке других библиотечных процедур. Например, проект для Concatenate может быть:
PROCEDURE Concatenate(VAR F1, F2, F3: TEXT); {Создает F3 из символов F1, за которыми следуют символы из F2}
{Включаем PROCEDURE CopyOpen(VAR F1, F2: TEXT); Копирует строку из F1 в F2 без выполнения RESET или REWRITE, F1 должен быть подготовлен для чтения, а F2 – для записи. Строка прошлого этих файлов может быть непустой}
BEGIN {Concatenate} RESET(F1); RESET(F2); REWRITE(F3); CopyOpen(F1, F3); CopyOpen(F2, F3) END {Concatenate}
|