Инструменты пользователя

Инструменты сайта


bb:redbook:205

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
bb:redbook:205 [2019/06/24 13:05]
prospero78 [2.3 Ввод данных]
bb:redbook:205 [2020/10/29 07:08] (текущий)
Строка 77: Строка 77:
  
 ==== 2.4 Вывод текста ==== ==== 2.4 Вывод текста ====
-Вывод текста не является обязательной задачей, но всё-таки сделаем это, чтобы убедиться, что текст действительно будет "развёрнут на месте". Этот же метод будет использован для вывода перевёрнутого текста. Текст метода:+Вывод текста не является обязательной задачей, но всё-таки сделаем это, чтобы убедиться, что текст действительно будет "развёрнут на месте". Этот же метод будет использован для вывода перевёрнутого текста. Текст метода: FIXME 
 +<code=oberon2> 
 +</code>
  
-В связи с тем, что литерный массив выводится не полностью, а только та часть, что получила заполнение, пришлось ввести локальную переменную "i". Он позволит выводить массив до тех пор, пока он не станет равным заполнению на вводе.+В связи с тем, что литерный массив выводится не полностью, а только та часть, что получила заполнение, пришлось ввести локальную переменную ''i''. Он позволит выводить массив до тех пор, пока он не станет равным заполнению на вводе.
  
 ==== 2.5 Разворот текста на месте ==== ==== 2.5 Разворот текста на месте ====
-Разворот массива на месте выполним с помощью дополнительной переменной литерного типа, в качестве промежуточного хранилища элемента литерного массива. Середина введённого текста может быть найдена через целочисленное деление длины ведённого текста пополам. Для этого используется ключевое слово DIV (сокращение от DIVISION, "деление"). В остальном, метод похож на предыдущие.+Разворот массива на месте выполним с помощью дополнительной переменной литерного типа, в качестве промежуточного хранилища элемента литерного массива. Середина введённого текста может быть найдена через целочисленное деление длины ведённого текста пополам. Для этого используется ключевое слово **DIV** (сокращение от **DIVISION**, "деление"). В остальном, метод похож на предыдущие.
      
 Точно также в начале метода используется диагностический вывод. Точно также в начале метода используется диагностический вывод.
Строка 88: Строка 90:
  
 ==== 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Х". 
  
-[ ← Назад  ] [ Вверх ↑ ] [ Далее → ] 
bb/redbook/205.1561370727.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)