Посимвольная обработка
Условные обозначения используемых языков программирования
1. Условные обозначения языка Бейсик:
- DIM X, L, M AS INTEGER — в алгоритме используются целые числа;
- INPUT X — введите Х;
- L = 1; M = 0 — заданы начальные значения переменных;
- WHILE — условие выполнения алгоритма, пока что-то соответствует условию, алгоритм выполняется;
- М=М+1 — формула для нахождения следующего значения М;
- IF THEN — цикл, который выполняется при определенных условиях, если что-то удовлетворяет условию, то выполняется такое-то действие; если что-то не соответствует условию, то указанное действие не выполняется;
- END IF — окончание цикла;
- MOD — остаток от деления;
- Х МОD 2 <> 0 — остаток от деления числа х на 2 не равен 0;
- Х\8 — целая часть от деления числа Х на 8.
2. Условные обозначения языка Python:
3. Условные обозначения языка Паскаль:
4. Условные обозначения Алгоритмического языка:
5. Условные обозначения языка С++:
Общие математические знания
1. Чтобы найти остаток от деления нужно самому выполнить деление в столбик. Образец:
- 455:2=…
2. Чтобы найти целую часть от деления можно воспользоваться калькулятором/ Excel. Целая часть — это то, что стоит слева от запятой.
3. Четное число делится на 2 нацело, то есть остаток от деления на 2 равен 0.
4. Нечетное число не делится на 2 нацело, то есть остаток от деления на 2 не равен 0.
Образец решения
Задание № 1. Ниже на пяти языках программирования записан алгоритм. Получив на вход натуральное десятичное число x, этот алгоритм печатает два числа: L и M. Укажите наибольшее число x, при вводе которого алгоритм печатает сначала 21, а потом 3.
Бейсик
DIM X, L, M AS INTEGER
INPUT X
L = 1
M = 0
WHILE X > 0
M = M + 1
IF X MOD 2 <> 0 THEN
L = L * (X MOD 8)
END IF
X = X \ 8
WEND
PRINT L
PRINT M
Python
x = int(input()) L = 1 M = 0 while x > 0: M = M + 1 if x % 2 != 0: L = L * (x % 8) x = x // 8 print(L) print(M)
Паскаль
var x, L, M: integer; begin readln(x); L := 1; M := 0; while x>0 do begin M :=M+1; if x mod 2 <> 0 then L := L * (x mod 8); x := x div 8; end; writeln(L) writeln(M) end.
Алгоритмический язык
алг нач цел x, L, M ввод x L := 1 M := 0 нц пока x > 0 M := M + 1 если mod(x,2) <> 0 то L := L * mod(x,8) все x := div(x,8) кц вывод L, нс, M кон
С++
#include <iostream> using namespace std; int main(){ int x, L, M; cin >> x; L = 1; M = 0; while (x > 0) { M = M + 1; if(x % 2 != 0) { L = L * (x % 8); } x = x / 8; } cout << L << endl << M << endl; return 0; }
Решение:
1. Переводим программу на человеческий язык. Выбираем программу, написанную на любом языке. Я выберу Python:
- x = int(input()) — введите число х;
- L = 1 — начальное значение числа L, при выполнении алгоритма оно будет меняться;
- M = 0 — начальное значение числа L, при выполнении оно будет меняться;
- while x > 0: - цикл будет выполняться пока х>0;
- M = M + 1 - если число х>0, то значение числа М увеличивается на 1;
- if x % 2 != 0: - если остаток от деления числа х на 2 не равен 0 (то есть число не делится на 2 нацело), то L = L * (x % 8) - новое значение числа L получается при умножении старого значения L на остаток от деления числа х на 8;
- если остаток от деления числа х на 2 равен 0 (х-четно), то изменений с L не происходит;
- x = x // 8 — числу х присваивается новое значение, которое равно целой части от деления предыдущего значения числа х на 8;
- print(L) — вывод на экран значения L (по условию задачи — 21)
- print(M) — вывод на экран значения М (по условию задачи — 3).
2. Анализируем условие:
- так как М возрастает от 0 до 3, цикл выполняется 3 раза, то есть делить число х на 8 мы будем 3 раза.
- что мы знаем про L
- получается в результате умножения остатков от деления Х на 8;
- равно 21,
- значит множители должны быть равны 3 и 7;
- то есть остатки от деления должны быть равны или 3, или 7.
3. От какого числа будем отталкиваться в решении:
- число должно будет 3 раза разделиться на 8, поэтому искать нужно около числа 8•8•8=512.
- число 512 не подходит, так как все остатки при делении на 8 будут равны 0, а нам нужны или 3, или 7.
- так как по условию нужно найти большее число, то проверим числа чуть большие 512; возьмем числа 515 (даст остаток 3) и 519 (даст остаток 7).
3. Составим таблицу результатов выполнения алгоритма для 515:
Х
(целая часть от деления х на 8) |
M | остаток от деления Х на 8 | L |
начальное значение: 515 | 511>0, поэтому М=0+1=1 | 3 | L=1•3=3 |
64 | 64>0, поэтому М=1+1=2 | число четное, поэтому | L остается неизменным |
8 | 8>0, поэтому М=1+2=3 | число четное, поэтому | L остается неизменным |
- вывод: третьим шагом мы не получим L=21;
- делаем так же вывод, что большие числа не дадут возможности получить третьим шагом L=21 (для неверующих совет, просто просчитайте несколько бОльших чисел, так же поступите на экзамене — это нормально).
4. Будем брать числа меньшие 512, начнем с 511 (остаток от деления на 8 = 7) и 507 (остаток от деления на 8 = 3). Составляем таблицы:
Х
(целая часть от деления х на 8) |
M | остаток
от деления Х на 8 |
L |
начальное значение: 511 | 511>0, поэтому М=0+1=1 | 7 | L=1•7=7 |
63 | 63>0, поэтому М=1+1=2 | 7 | L=7•7=49 |
- вывод: третьим шагом мы не получим L=21;
Х
(целая часть от деления х на 8) |
M | остаток от
деления Х на 8 |
L |
начальное значение: 507 | 511>0, поэтому М=0+1=1 | 3 | L=1•3=3 |
63 | 63>0, поэтому М=1+1=2 | 7 | L=3•7=21 |
8 | 8>0, поэтому М=2+1=3 | 7 | L=21•7=147 |
- вывод: третьим шагом мы не получим L=21.
5. Составим таблицу результатов выполнения алгоритма для чисел 503 (остаток от деления на 8 = 7) и 499 (остаток от деления на 8 = 3):
Х
(целая часть от деления Х на 8) |
M | остаток от
деления Х на 8 |
L |
503 | 503>0, поэтому М=0+1=1 | 7 | L=1•7=7 |
62 | 62>0, поэтому М=1+1=2 | число четное, поэтому | L остается неизменным |
7 | 7>0, поэтому М=2+1=3 | 6 | L=7•6=42 |
- вывод: третьим шагом мы не получим L=21.
Х
(целая часть от деления х на 8) |
M | остаток от
деления Х на 8 |
L |
начальное значение: 499 | 499>0, поэтому М=0+1=1 | 3 | L=1•3=3 |
62 | 62>0, поэтому М=1+1=2 | число четное, поэтому | L остается неизменным |
7 | 7>0, поэтому М=2+1=3 | 7 | L=3•7=21 |
- вывод: третьим шагом мы получили L=21;
- четвертого шага не будет, так как целая часть от деления 7 на 8 равно 0, то есть следующее значение х=0, но условие выполнения алгоритма х>0;
- так как алгоритм больше не выполняется, то на экран выводятся числа 21 и 3.
Ответ: 499.