Содержание:
Принцип локальности
В обычном Паскале описание переменных обычно находится до тела программы:
{описание переменных} begin ... end. |
Если программный код достаточно большой, то такой вариант инициализации переменных весьма неудобен. В Pascal abc.net переменные могут описываться внутри тела программы — между begin
и end
и инициализироваться при описании.
В этом состоит принцип локальности: переменная описывается непосредственно перед началом своего использования.
Внутриблочные переменные позволяют сильно уменьшить количество глобальных переменных в разделе описания.
Т.е. чем ближе к месту использования описывается некоторый программный объект, тем читабельней код и модифицируемей программа.
Раньше:
var n,i,p:integer; begin read(n); ... p:=1; for i:=1 to n do p:=p*i; ... |
Pascal abc.net:
begin var n:integer; read(n); |
ИЛИ
begin var n:=ReadInteger('введите n: '); |
var p:=1; // канонический способ - тип определяется по правой части for var i:=1 to n do p:=p*i; // можно заменить на компактную форму p*=i; print (p); // write() заменяем на print() end. |
Теперь этот фрагмент кода можно вырезать и перенести в функцию или в модуль. В этом и заключается модифицируемость.
Ввод данных:
var n:=ReadInteger(); var n:=ReadReal();
Канонический способ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var a: integer; b: real; begin a := 1; writeln('a := 1; a = ',a); a += 2; // Увеличение на 2 writeln('a += 2; a = ',a); a *= 3; // Умножение на 3 writeln('a *= 3; a = ',a); writeln; b := 6; writeln('b := 6; b = ',b); r /= 2; writeln('b /= 2; b = ',b); end.
y = 5(x−3)6 − 8(x−3)3 + 2
для нескольких заданных x.
✍ Решение:
1 2 3 4 5 6 7 | begin writeln('Введите значение x'); var x:=ReadReal; var a:=(x-3)*(x-3)*(x-3); var y:= 5*sqr(a)-8*a+2; writeln('Значение функции для x = ', y); end. |
Проверьте правильность вашей программы на следующих значениях:
d((0, 0); (6, 0)) = 6; d((0, -4); (0, 1)) = 5; d((-1, 1); (2, 5)) = 5.
[Название файла: L1abc1.pas
]
Базовые типы и методы внутри стандартных типов
Для обращения к методам используется точечная нотация:
arr.MaxValue;
Целочисленные:
var i:integer; i. ... // выпадает список методов для целочисленных i.MaxValue; i.MinValue; i.ToString; |
Вещественные:
begin var a:=1.0; var b:=0.0; print (a.MinValue); // -1.79769313486232E+308 print (a/b); // в прежних компиляторах выдается RunTime Error - исключение // в abc.net результатом будет бесконечность print(Sqrt(-1)); // результат NAN - не число |
Исключение — управляемая ошибка, которую можно перехватывать и погашать.
WritelnFormat
:WritelnFormat('f({0}, {1}) = {2}', a, b, c); |
Результатом будет:
f(x, y) = z
a + b = b + a = сумма
то нужно просто заменить a, b на {0}, {1}:
WritelnFormat('{0} + {1} = {1} + {0} = {2}', a, b, x + y) |
Стандартные функции
Обмен значениями переменных происходит без использования буферной переменной:
swap(a,b); |
Поиск максимального и минимального значения:
min(a,b); max(a,b); |
Операции целочисленного деления и остатка
div
предназначена для вычисления целой части от результата деления целых чисел (неполное частное). Пример:
16 div 2 = 8 22 div 7 = 3 66 div 10 = 6
[Название файла: L1abc2.pas
]
N div K
показывает, сколько полных раз K «помещается внутри» N.mod
предназначена для вычисления остатка от деления одного целого числа на другое. Если числа делятся нацело, то остаток равен нулю.Пример:
16 mod 2 = 0 22 mod 7 = 1 66 mod 10 = 6
N mod K
показывает, что «остаётся от N» после того, как из него «убрали» максимальное число фрагментов размером K.Работа с отдельными цифрами числа
123 = 1∗100 + 2∗10 +3
✍ Решение:
begin var a := abs(readinteger); // модуль числа println(a div 100 + (a div 10) mod 10 + a mod 10); end. |
Пример:
35 => 8, 15 90 => 9, 0 -11 => 2, 1 // сумма и произведение цифр положительны
Приведите лог работы программы с одним из введенных чисел в форме комментария.
[Название файла: L1abc3.pas
]
Пример:
234 >>> 342 -602 >>> -26
[Название файла: L1abc4.pas
]
Логические выражения и условный оператор
Логические переменные и выражения
- логические переменные (имеют тип:
boolean
); - логические операции (
or
,and
,xor
,not
); - операции сравнения чисел и числовых переменных (например,
x <= y
, где x и y имеют тип real или integer). - Для вывода результата вычисления логического выражения может быть использован операторы
write
иprint
. - Если требуется проверить истинность какого-либо выражения, то эти операторы могут выводить значения True и False; достаточно написать:
True
(истина) или False
(ложь). Логическое выражение может включать:
Writeln(<логическое выражение>); |
True
или False
).✍ Решение:
begin var (a, b) := readinteger2; println(a > b); end. |
A < B < C
.Пояснение: Запрещено использовать условный оператор. Следует использовать вывод результата вычисления логического выражения.
[Название файла: L1abc5.pas
]
Пояснение: Используйте стандартную функцию
odd
.
[Название файла: L1abc6.pas
]
Короткая форма условного оператора:
if <логическое выражение> then <оператор> // выполнится, если <условное выражение> возвращает True |
Полная форма:
if <логическое выражение> then <оператор-1> else <оператор-2> |
При использовании нескольких операторов в одном условии необходимы операторные скобки begin..end
:
if <логическое выражение> then begin <оператор-1> <оператор-2> ... end |
else
-3 => -4 0 => -1 1 => 2 5 => 6
✍ Решение:
begin var a := readinteger; if (a > 0) then a := a + 1 else a := a - 1; println(a); end. |
Дополните программу:
begin var x, y: integer; // аргументы функции f Write('Введите числа x, y: '); Readln(x, y); var f: integer; // записать в переменную f значение функции f(x, y) ... WritelnFormat('f({0}, {1}) = {2}', x, y, f); end. |
True
, если среди этих чисел нет ни одного положительного, и False
- в противном случае.
[Название файла: L1abc7.pas
]
True
, если треугольник со сторонами a, b, c является равнобедренным, и False
- в противном случае.
[Название файла: L1abc8.pas
]
Рассмотрим оператор на примере:
1 — дециметр, 2 — километр, 3 — метр, 4 — миллиметр, 5 — сантиметр
Вводится номер единицы длины (целое число в диапазоне 1–5) и длина отрезка в этих единицах (вещественное положительное число). Найти длину отрезка в метрах.
✍ Решение:
begin var n := readinteger('Введите номер единицы:'); var a := readreal('Введите длину в заданных единицах:'); case n of 1: a /= 10; // дециметр 2: a *= 1000; // километр 4: a /= 1000; // миллиметр 5: a /= 100; // сантиметр end; println('Длина в метрах:', a); end. |
[Название файла: L1abc9.pas
]