1. Записать рассуждение в логической символике, обосновать выбор логических связок
2. Проверить правильность рассуждений, составив таблицу истинности
Если подозреваемый совершил кражу, то либо кража была тщательно подготовлена, либо имелся соучастник. Если бы кража была тщательно подготовлена, то был бы соучастник. Значит, подозреваемый не виновен в краже.
Получается, зависит от последних цифр возраста:
1) "лет" -если последняя цифра 0,5,6,7,8,9 или две цифры 05÷20
а остальные (не попавшие в первое условие) именуются так:
2) "год" -если последняя цифра 1
3) "года" -если последняя цифра 2,3,4
Вот несколько вариантов программы (проверял в PascalABC.NET 3.4.2.1837, и часть программ будет работать только там):
1) Вариант с самыми простыми и известными операторами (для начинающих и для совместимости с другими версиями Pascal). Поэтому: используются только if-then-else, составной оператор (блок) begin-end, операции сравнения, обычные ввод и вывод, и переменные типов integer и string; не используются логические операции. Правда, есть операции нахождения остатка от деления на 10 и на 100 (n mod 10 и n mod 100). Если вы их не проходили, то остаток можно вычислять, используя функции, возвращающие целую часть числа: n-Int(n/10)*10 и n-Int(n/100)*100 или n-Trunc(n/10)*10 и n-Trunc(n/100)*100. Всё это нужно для получения последней цифры числа (или двух последних цифр).
var
n: integer;
s: string;
begin
write('Введите возраст: ');
read(n);
if n < 0 then write('Недопустимый возраст.') else
if n > 120 then write('Недопустимый возраст.') else
begin
s := ' лет.';
if n mod 10 >= 2 then
if n mod 10 <= 4 then s := ' года.';
if n mod 10 = 1 then s := ' год.';
if n mod 100 >= 5 then
if n mod 100 <= 20 then s := ' лет.';
write('Вам ', n, s);
end;
end.
2) Вариант с использованием оператора выбора (case) и диапазонов значений. Я начинал с этого варианта, и тут я записал все диапазоны значений возраста до 120 лет (я не вспомнил общих правил написания лет-год-года в зависимости от количества лет, поэтому перебрал все возраста, проверяя написание на слух :)
Здесь и далее использована переменная типа byte (целые значения от 0 до 255, размер 1 байт). Если использовать тип integer, то по идее надо проверять на отрицательные значения, которые возможны при вводе для этого типа. Хотя, можно конечно считать, что вводить будут всегда правильно, и делать проще - не проверять это вообще (тогда пойдёт и integer). Если так упрощать, то можно не проверять и на возраст больше 120 лет.
Кроме byte, с той же целью можно использовать word (2 байта, 0..65535) или longword (4 байта, 0..4294967295), если вы их проходили. Правда, они слегка избыточны для этой задачи.
var n: byte;
begin
write('Введите возраст: ');
read(n);
case n of 0,5..20,25..30,35..40,45..50,55..60,65..70,75..80,85..90,95..100,105..120: write('Вам ',n,' лет.');
1,21,31,41,51,61,71,81,91,101: write('Вам ',n,' год.');
2..4,22..24,32..34,42..44,52..54,62..64,72..74,82..84,92..94,102..104: write('Вам ',n,' года.');
else write('Недопустимый возраст.');
end;
end.
2а) В той же программе часть условий можно не писать (тут в проверке используется максимальное значение для типа byte, поэтому если менять тип, то нужно менять и это значение):
var n: byte;
begin
write('Введите возраст: ');
read(n);
case n of
121..255: write('Недопустимый возраст.');
1,21,31,41,51,61,71,81,91,101: write('Вам ',n,' год.');
2..4,22..24,32..34,42..44,52..54,62..64,72..74,82..84,92..94,102..104: write('Вам ',n,' года.');
else write('Вам ',n,' лет.');
end;
end.
3) Тут остаток от деления на 10 проверяется на принадлежность к множеству указанных остатков. Ещё, есть логическая операция (or):
var n: byte;
begin
write('Введите возраст: ');
read(n);
if n>120 then write('Недопустимый возраст.') else
if (n mod 10 in [0,5..9]) or (n mod 100 in [5..20]) then write('Вам ',n,' лет.') else
if n mod 10 = 1 then write('Вам ',n,' год.') else write('Вам ',n,' года.')
end.
4) И напоследок, вариант с условной операцией (условие ? выражение1 : выражение2), конвертацией из строки в byte (и прочими непотребствами :) Лишние пробелы ужаты, поэтому всё не очень читаемо.
begin
var n:=byte.Parse(ReadString('Введите возраст:'));
write('Вам ',n>120?'многовато лет':n+' '+((n mod 10in[5..9,0])or(n mod 100in[5..20])?'лет':n mod 10=1?'год':'года'),'.')
end.
Отдельно, строка с выводом (более читаемо, без ужатия пробелов):
write('Вам ', n>120 ? 'многовато лет' : n + ' ' + ((n mod 10 in [5..9,0]) or (n mod 100 in [5..20]) ? 'лет' : n mod 10 = 1 ? 'год' : 'года'), '.')
Хотя, если перенести пробел и точку в сами сообщения, то строка даже чуть короче станет:
write('Вам ', n>120 ? 'многовато лет.' : n + ((n mod 10 in [5..9,0]) or (n mod 100 in [5..20]) ? ' лет.' : n mod 10 = 1 ? ' год.' : ' года.'))
B. k<5, k=k+1
Объяснение:
k=0
while k<5:
print('privet')
k=k+1
начальное значение k = 0
условие из А (k > 0) будет ложным и цикл не выполнится ни разу, т.к. 0 равен 0, а не больше
условие из С (k > 6) будет ложным и цикл не выполнится ни разу, т.к. 0 меньше 6, а не больше
условие из В (k < 5) будет истинным и цикл начнет выполнятся, т.к. 0 меньше 5
далее переменная k будет увеличиваться на 1 каждый повтор цикла
после первого повтора цикла она будет равна 1, после второго 2 и т.д.
пока эти значения будут меньше 5 цикл будет выполнятся
после пятого повтора цикла переменная k станет равна 5, условие (k < 5) будет ложным и цикл прервется