Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
bb:redbook:205 [2019/06/24 13:05] prospero78 [2.3 Ввод данных] |
bb:redbook:205 [2020/10/29 07:08] (текущий) |
| |
==== 2.4 Вывод текста ==== | ==== 2.4 Вывод текста ==== |
Вывод текста не является обязательной задачей, но всё-таки сделаем это, чтобы убедиться, что текст действительно будет "развёрнут на месте". Этот же метод будет использован для вывода перевёрнутого текста. Текст метода: | Вывод текста не является обязательной задачей, но всё-таки сделаем это, чтобы убедиться, что текст действительно будет "развёрнут на месте". Этот же метод будет использован для вывода перевёрнутого текста. Текст метода: FIXME |
| <code=oberon2> |
| </code> |
| |
В связи с тем, что литерный массив выводится не полностью, а только та часть, что получила заполнение, пришлось ввести локальную переменную "i". Он позволит выводить массив до тех пор, пока он не станет равным заполнению на вводе. | В связи с тем, что литерный массив выводится не полностью, а только та часть, что получила заполнение, пришлось ввести локальную переменную ''i''. Он позволит выводить массив до тех пор, пока он не станет равным заполнению на вводе. |
| |
==== 2.5 Разворот текста на месте ==== | ==== 2.5 Разворот текста на месте ==== |
Разворот массива на месте выполним с помощью дополнительной переменной литерного типа, в качестве промежуточного хранилища элемента литерного массива. Середина введённого текста может быть найдена через целочисленное деление длины ведённого текста пополам. Для этого используется ключевое слово DIV (сокращение от DIVISION, "деление"). В остальном, метод похож на предыдущие. | Разворот массива на месте выполним с помощью дополнительной переменной литерного типа, в качестве промежуточного хранилища элемента литерного массива. Середина введённого текста может быть найдена через целочисленное деление длины ведённого текста пополам. Для этого используется ключевое слово **DIV** (сокращение от **DIVISION**, "деление"). В остальном, метод похож на предыдущие. |
| |
Точно также в начале метода используется диагностический вывод. | Точно также в начале метода используется диагностический вывод. |
| |
==== 2.6 Главная процедура модуля ==== | ==== 2.6 Главная процедура модуля ==== |
По аналогии с предыдущими программами, эта процедура будет называться "Start". Общий вид процедуры: | По аналогии с предыдущими программами, эта процедура будет называться ''Start''. Общий вид процедуры: FIXME |
| <code=oberon2> |
| </code> |
| |
Часть кода занято диагностическим выводом, другая вызовом методов переменной, имеющей тип "tString", и здесь тоже всё достаточно прозрачно. Единственная инструкция, требующая пояснения: NEW(txt). "txt" — это переменная, имеющая тип "POINTER TO RECORD" (тип "УКАЗАТЕЛЬ НА ЗАПИСЬ"). Ключевое слово NEW указывает на то, что эта переменная создаётся динамически. Динамическое создание переменных используется очень часто, и использование NEW широко распространено. Если определить переменную "txt" не как динамическую, а как статическую, то размер программы сразу вырастит до примерно 4600 байт — за счёт массива CHAR на 2049 элементов (4098 байт). Без статического определения массива программа занимает порядка 640 байт. [↑] | Часть кода занято диагностическим выводом, другая вызовом методов переменной, имеющей тип ''tString'' и здесь тоже всё достаточно прозрачно. Единственная инструкция, требующая пояснения: ''NEW(txt)''. ''txt'' — это переменная, имеющая тип ''POINTER TO RECORD'' (тип ''УКАЗАТЕЛЬ НА ЗАПИСЬ''). Ключевое слово **NEW** указывает на то, что эта переменная создаётся динамически. Динамическое создание переменных используется очень часто, и использование **NEW** широко распространено. Если определить переменную ''txt'' не как динамическую, а как статическую, то размер программы сразу вырастит до примерно 4600 байт — за счёт массива **CHAR** на 2049 элементов (4098 байт). Без статического определения массива программа занимает порядка 640 байт. |
| |
| |
==== 2.7 Итоговый текст программы ==== | ==== 2.7 Итоговый текст программы ==== |
| |
Пример текста модуля ниже. | Пример текста модуля ниже. |
| |
Hello12.odc | Hello12.odc FIXME |
| <code=oberon2> |
| </code> |
[↑] | |
| |
==== 2.8 Ввод и вывод данных ==== | ==== 2.8 Ввод и вывод данных ==== |
Для ввода данных использовать этот текст: | Для ввода данных использовать этот текст: FIXME |
| <code> |
| </code> |
| |
Вывод программы, если всё сделано училось правильно: | Вывод программы, если всё сделано училось правильно: |
| <code> |
| </code> |
| |
Как видно, вместо переводов строк появился парный символ "0DX 09X" (в шестнадцатиричном виде). Даже простой текст такому развороту поддаётся с сюрпризами. Это символ перевода строки. Результат не совсем такой, как ожидалось. Как работать со строками будет рассмотрено отдельно. В качестве самостоятельного задания попробуйте сделать так, чтобы перевод строки сохранялся[2]. [↑] | |
| |
| Как видно, вместо переводов строк появился парный символ ''0DX 09X'' (в шестнадцатиричном виде). Даже простой текст такому развороту поддаётся с сюрпризами. Это символ перевода строки. Результат не совсем такой, как ожидалось. Как работать со строками будет рассмотрено отдельно. В качестве самостоятельного задания попробуйте сделать так, чтобы перевод строки сохранялся((В качестве подсказки: надо найти все комбинации ''0DX 09Х'' и заменить их на ''00Х 00Х''. После разворота, найти эти же символы и заменить их опять на ''0DX 09Х'')). |
| |
==== 3. Примечания ==== | |
[↑] В Паскаль-семействе трюк с пропуском нулевого элемента массива применяется повсеместно. Он бывает полезен в строках, когда чтобы точно установить длину строки — её длина содержится в нулевом элементе. Такие короткие строки (до 255 литералов) и средние строки (до 65,5 тыс. литералов) до сих пор популярны у паскалистов. Если конец строки будет испорчен, то процедуры обработки всё-равно закончат обработку по её размеру в нулевой ячейке. В этом отношении Паскаль-семейство более безопасно, чем лагерь Си — там для обозначения окончания строки в конце добавляется бинарный "00X". Можно себе представить, если вдруг в ближайших мегабайтах памяти этого символа не окажется. ,) Кроме того, затраты на подсчёт длины строки в Паскале равны нулю — подсчёт происходит мгновенно. Аналогичный подсчёт строки в Си будет выполняться крайне медленно (особенно, если строка занимает мегабайты). | |
| |
[↑] В качестве подсказки: надо найти все комбинации "0DX 09Х" и заменить их на "00Х 00Х". После разворота, найти эти же символы и заменить их опять на "0DX 09Х". | |
| |
[ ← Назад ] [ Вверх ↑ ] [ Далее → ] | |