Содержание:
Использование функции Assert для проверки корректности ввода
assert()
, в качестве параметра которой указывается условие, которое должно возвращать значение true
.Выполнить: Даны координаты точки (x,y) на координатной плоскости ( ≠ 0, ≠ 0). Вывести номер четверти:
✍ Решение:
var (x,y) := ReadInteger2; var quarter: integer; Assert((x<>0) and (y<>0), 'некорректный ввод'); // True if x>0 then if y>0 then quarter := 1 else quarter := 4 else if y>0 then quarter := 2 else quarter := 3; |
Цикл с предусловием (while) в Pascal abc.net
- Итерация — однократное повторение тела цикла.
- В цикле
while
тело может не выполниться ни разу.
while <условие> do // заголовок цикла <оператор> // тело цикла |
<условие>::= <логическое выражение>
✍ Решение:
sum := 0; x := 2; while x <= 20 do begin sum += x; x += 2; end; |
Пример вывода:
Введите положительное число: >> 10 ответ: 4
✍ Решение:
Begin var (a,b):=readInteger2; assert(a>=b); var k:=0; var s:=0; while s<=a do begin inc(k); s+=b end; writeln(k-1) End. |
Оператор break в цикле while
break
предназначен для экстренного выхода из цикла. Обычно используется в условном операторе: при выполнении условия — выход из цикла.Например, в случае, когда последовательность чисел должна заканчиваться нулем, то примерный код обработки последовательности может быть таким:
begin // ... while True do // бесконечный цикл begin // ввод очередного элемента последовательности var b := ReadInteger; // или ReadReal if b = 0 then break; // выход из цикла при вводе элемента, равного нулю // обработка очередного элемента последовательности end; // вывод результатов end. |
Пример вывода:
Введите последовательность: >> 10 8 7 9 0 ответ: 1 2
Цикл с постусловием (repeat) в Pascal abc.net
- В цикле
repeat
тело выполнится хотя бы один раз.
repeat // заголовок цикла <операторы> // тело цикла until <условие> |
✍ Решение:
sum := 0; x := 2; repeat sum += x; x += 2; until x = 22; |
Оператор цикла со счетчиком (for) в Pascal abc.net
- переменная-счетчик должна иметь порядковый тип (целый, символьный или перечислимый);
- переменная-счетчик цикла for не должна меняться внутри цикла for;
- описание переменной цикла в его заголовке:
- автоопределение типа при описании:
<заголовок цикла> <тело цикла>
<заголовок цикла> выглядит так: for <переменная>:=<выражение1> <направление> <выражение2> do <тело цикла> выглядит так: <оператор> <направление> выглядит так: to | downto
for [var] i: integer := 1 to 5 do <оператор> |
for var i := 1 to 5 do <оператор> |
✍ Решение:
begin var (a, b) := readinteger2('Введите два целых числа. Первое должно быть меньше второго:'); assert(a < b); // проверка действительно ли a < b for var i := (a + 1) to (b - 1) do println(i); println(b - a - 1); // количество чисел end. |
Пример вывода:
Введите два числа (A меньше B): >> 2 5 4 9 16 25
Введите два числа (A меньше B): >> 5 2 assert: неверный ввод
Пример вывода:
Введите стоимость: >>3 цена за 1кг = 3 цена за 1.1кг = 3.3 цена за 1.2кг = 3.6 цена за 1.3кг = 3.9 цена за 1.4кг = 4.2 цена за 1.5кг = 4.5 цена за 1.6кг = 4.8 цена за 1.7кг = 5.1 цена за 1.8кг = 5.4 цена за 1.9кг = 5.7
✍ Решение:
Begin var n:=readInteger('N = '); assert(n>0); var x:=readReal('X = '); var sum:=0.0; var f:=-1.0; var num:=1.0; for var i:=1 to n do begin num*=x; sum+=(x+f*num)/i; f*=-1.0; end; writeln(sum) End. |
Не забудьте, что использование функции возведения в степень запрещено.
Пример вывода:
Введите n: >>5 Введите х: >>2 слагаемое: 0.666666666666667 слагаемое: 0.666666666666667 слагаемое: 0.727272727272727 слагаемое: 0.8 слагаемое: 0.864864864864865 y = 3.72547092547093
Например, если необходимо как-то обработать последовательность чисел с заданным количеством элементов, то примерный код может быть таким:
begin // предварительные действия N := ReadInteger; // или Read(N); for var i := 1 to N do begin // ввод очередного элемента var b := ReadInteger; //или ReadReal, или Read(b); // обработка очередного элемента end; // вывод результатов обработки end. |
N
(N ≥ 0) и последовательность из N целых чисел. Найти количество отрицательных чисел в этой последовательности.
Пример вывода:
Введите n: >>5 Введите последовательность: >>2 -3 4 6 -2 ответ: 2
Упрощенный цикл LOOP
Пример:
// Выводить 5 раз слово "Привет!" loop 5 do begin println('Привет!'); end; // ... |
Обработка цифр числа
О том, как выделять из числа отдельные его разряды Вы ознакомились в предыдущем уроке.
Теперь рассмотрим более сложный вариант с обработкой цифр числа.
Пример:
кол-во; цифры => результат N = 3; 3,7,0 => M = 370 N = 1; 0 => M = 0 N = 5; 0,7,0,1,6 => M = 7016 N = 1; 2 => M = 2 N = 2; 0,2 => M = 2
Замечание: В решении должен использоваться один цикл, запрещено использовать математические функции наподобие power
или ln
.
✍ Решение:
begin var n := readinteger('Введите количество цифр N:'); var num := 0; assert(n > 0); println('Введите цифры:'); loop n do begin var a := readinteger; num += a; num := num * 10; end; println(num div 10); end. |
Пример:
N = 1205 => Count = 4, Sum = 8 N = -111 => Count = 3, Sum = 3 N = 0 => Count = 1, Sum = 0
Замечание: В решении должен использоваться только один цикл, запрещено использовать математические функции наподобие power
или ln
.
Пример:
N = 1205 => M = 5021 N = -950 => M = -59 N = 0 => M = 0 N = -4 => M = -4
✍ Решение:
begin println('Введите целое число:'); var n := readinteger; var (newnum, sign) := (0, sign(n)); n := abs(n); while n > 0 do begin newnum += (n mod 10); newnum *= 10; n := n div 10; end; println(sign * (newnum div 10)); end. |
Пример:
N1 = 29, N2 = -31 => M = 39 N1 = 111, N2 = 103 => M = 113 N1 = -50, N2 = 20 => M = 50
Произвольный шаг в цикле for
Выполнить: Выведите все двухзначные нечетные числа от 11 до 21.
Примерный результат:
11 13 15 17 19 21
✍ Алгоритм:
- Решение 1. С циклом
loop
- Решение 2. С циклом
for
loop
Выполнить: Выведите последовательность 3 5 7 9 … 21 (от 3 до 21 с шагом = 2). Выполнить дважды: с циклом
loop
и циклом for
.
Фрагмент программы:
begin println('результат с циклом loop'); var ...; loop ...; ... println('результат с циклом FOR'); for var ... ... end. |
[Файл: task-01step.pas
]
Выполнить: Вывести последовательность: 20 18 16 … 2 (от 20 до 2 с шагом = 2). Выполнить дважды: с циклом
loop
и циклом for
.
[Файл: task-02step.pas
]
Выполнить: Посчитать значение функции z(x) = x3
для всех x
на промежутке [1, 7] с шагом = 2. Выполнить дважды: с циклом loop
и циклом for
.
Примерный результат:
1*1*1 = 1 3*3*3 = 27 5*5*5 = 125 7*7*7 = 343
✍ Алгоритм:
- Решение с циклом
for
:
Выполнить: Посчитать значение функции
z(x) = x2
для всех x
на промежутке [3, 12] с шагом = 3. Выполнить дважды: с циклом loop
и циклом for
.
>Примерный результат:
3*3 = 9 6*6 = 36 9*9 = 81 12*12 = 144
[Файл: task-03func.pas
]
Выполнить: Посчитать значение функции
z(x) = √x
для всех x
на промежутке [5, 25] с шагом = 5. Выполнить дважды: с циклом loop
и циклом for
.
Примерный результат:
sqrt(5) = 2.23606797749979 sqrt(10) = 3.16227766016838 sqrt(15) = 3.87298334620742 sqrt(20) = 4.47213595499958 sqrt(25) = 5
[Файл: task-04func.pas
]
Выполнить: Вывести последовательность: 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0.
✍ Алгоритм:
- Решение 1. С циклом
loop
- Решение 2. С циклом
for
Выполнить: Вывести последовательность 0.1 0.3 0.5 0.7 0.9 1.1. Выполнить дважды: с циклом
loop
и циклом for
.
Примерный результат:
0.1 0.3 0.5 0.7 0.9 1.1
[Файл: task-05step.pas
]
Вложенные циклы
Пример:
Введите число: 3 7 8 6 0 4 5 4 3 1 0 4 5 6 9 0 Кол-во элементов для каждого: 3 5 4 Всего элементов: 12
✍ Решение:
begin var k:=ReadInteger('Введите число'); assert(k>0); var st:=''; assert(k>0); var c:=0; for var i:=1 to k do begin var count:=0; var x:=ReadInteger; while x<>0 do begin count+=1; read(x); end; st+=count.ToString+' '; c+=count; end; Println('Кол-во элементов для каждого =',st); println('Всего элементов',c); end. |
Пример:
K = 3, N = 5; набор 1: 6 4 2 -3 2 набор 2: -1 5 6 3 49 набор 3: 31 7 7 -8 12 ... Правильный ответ: 1 набор.
f=x2+ln|y|
.Например:
если xn = 2; xk = 3 уn = -1; yk = 1 шаг Δх = 1, шаг Δy = 0.5 то f1 = 22+ln|-1| = 4 f2 = 22+ln|-0.5|= 3.30685281944005 ...
Результат:
x= 2 y= -1 f= 4 x= 2 y= -0.5 f= 3.30685281944005 x= 2 y= 0 f= -∞ x= 2 y= 0.5 f= 3.30685281944005 x= 2 y= 1 f= 4 x= 3 y= -1 f= 9 x= 3 y= -0.5 f= 8.30685281944005 x= 3 y= 0 f= -∞ x= 3 y= 0.5 f= 8.30685281944005 x= 3 y= 1 f= 9
✍ Решение:
begin var (xn, xk) := readreal2('отрезок для x от ... и до ...'); var(yn, yk) := readreal2('отрезок для y от ... и до ...'); var hx := readreal('шаг для x'); var hy := readreal('шаг для y'); var x := xn; var y := yn; while x <= xk do begin while y <= yk do begin var f := sqr(x) + ln(abs(y)); print($'x = {x} y = {y} f = {f}'); y := y + hy; end; x := x + hx; y := yn; end end. |
Вычислить значение функции:
z(x, у) = sin x + cos y
при всех х, изменяющихся на интервале [-1, 1] с шагом Δх = 0.2, и у, изменяющихся на интервале [0, 1] с шагом Δу = 0.1.
Результат:
x=-1.00 y=0.00 z=0.16 x=-1.00 y=0.10 z=0.15 x=-1.00 y=0.20 z=0.14 x=-1.00 y=0.30 z=0.11 x=-1.00 y=0.40 z=0.08 x=-1.00 y=0.50 z=0.04 x=-1.00 y=0.60 z=-0.02 x=-1.00 y=0.70 z=-0.08 x=-1.00 y=0.80 z=-0.14 x=-1.00 y=0.90 z=-0.22 x=-1.00 y=1.00 z=-0.30 x=-0.80 y=0.00 z=0.28 ...
[Название файла: task11.pas
]
Добрый день! Спасибо за Ваш труд!
На этой странице действительно представлены коды Pascal abc.net?
Например, «newnum += (n mod 10); newnum *= 10;» ? Или это другой язык программирования?
С уважением.