Гладков_Кулютникова Информатика
.pdf33 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
Операторы ввода-вывода Ввод данных - это передача информации от внешних устройств в оперативную
память. Вводятся исходные данные решаемой задачи. Вывод - процесс передачи данных из оперативной памяти на внешние устройства. Выводятся результаты решения задачи. Стандартным устройством ввода является - клавиатура, а вывода - экран дисплея. Диалог человека и компьютера осуществляется через эти устройства с помощью операторов ввода-вывода.
Оператор ввода имеет следующий формат:
read (список ввода);
Список ввода представляет собой последовательность имен переменных, разделенных запятыми. При выполнении этого оператора происходит остановка работы компьютера, пользователь должен с клавиатуры ввести необходимые значения переменных в том порядке, в каком они записаны, разделяя их пробелами. При этом вводимые значения отображаются на экране. Заканчивается ввод нажатием клавиши
Enter.
Пример.
var a, b: integer;
....
read (a, b);
Пользователь вводит значения 5 10 . После чего у переменной a будет значение 5, у переменной b - 10.
Есть еще одна форма оператора ввода:
readln (список ввода);
Этот оператор отличается тем, что по окончанию ввода буфер клавиатуры будет очищен до признака нажатия клавиши Enter.
Оператор readln без параметров означает, что компьютер ожидает нажатия клавиши
Enter.
Оператор вывода имеет следующий формат:
write (список вывода);
Список вывода предствляет собой выражения различных типов, разделенные
запятыми. |
|
Пример. |
|
write (25); |
выводится целая константа 25 |
write (‘Доброе утро, страна!’); |
выводится строковая константа |
write (b*b-4*a*c); |
выводится значение выражения |
write (‘дискриминант= ’, d); |
выводится список, состоящий из строковой |
|
константы и значения переменной |
write (a1, a2, a3); |
выводятся значения переменных a1, a2, a3. |
Для того, чтобы выводимые значения не слились в одну строку необходимо позаботиться о разделяющих пробелах, т.е.
write(a1, ‘ ‘, a2, ‘ ‘, a3).
Другая форма оператора вывода:
writeln (список вывода);
После вывода всех значений из списка вывода происходит переход на начало новой строки. Оператор writeln без параметров означает переход на новую строку.
Рекомендуется ввод данных оформлять следующим образом: write (‘введите коэффициенты квадратного уравнения’); readln (a, b, c);
34 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
Упражнения.
1. Что будет выведено на экран в результате выполнения следующего фрагмента программы:
write (‘введите значения переменных’); readln (a, b, a);
write (a, b, a);
если будут введены числа 1, 2 и 3?
2. Объясните ошибки в следующих фрагментах: var a: integer: b, c: real;
...
а). readln (a, b); writeln (a, b+c);
б). writeln (‘введите значения’, a,b); readln (a, b);
Оператор присваивания
Оператор присваивания имеет следующий синтаксис:
переменная := выражение;
Оператор выполняется следующим образом: не внося никаких изменений в выражение, стоящее справа от оператора присваивания, вычислить это выражение и его значение поместить в переменную, имя которой указано слева от оператора присваивания, при этом старое значение переменной заменяется новым.
Переменная и выражение должны быть одного типа. Исключение составляет переменная типа real, которой можно присвоить целое значение.
Пример1. Записать оператор присваивания переменной a квадрата ее значения, а переменной b - куба переменной a.
x := a; a := a*a;
b := a*x;
Пример2. Записать оператор присваивания, который меняет знак переменной a на противоположный.
a := -a; |
или |
a := a*(-1); |
|
|
|
||
Пример3. Поменять местами значения переменных a и b. |
|
||||||
r := a; a:= b; |
b := r; |
|
|
|
|
||
Упражнения. |
|
|
|
|
|
|
|
1. |
Определите значения переменных x, y, z |
|
|
||||
|
x := 8 +6 mod 4 * 2; |
y := x div 5 * 5; |
z := x * 5 div 5; |
||||
2. |
Если x - вещественная переменная, а y - целая, то какие из следующих операторов |
||||||
присваивания правильные, а какие - нет. Ответ обоснуйте. |
|
||||||
a). x := y +1; |
|
б). y := x +1; |
в). x := 5; |
г). y := 5.0; |
|||
д). x := x div 2; |
е). y := y/2; |
ж). x := trunc(y); |
з). y := sqr(sqrt(25))/ |
||||
3. |
Правильны ли следующие операторы присваивания? Ответ обоснуйте. |
||||||
а). k := k div 3 + k*cos(0); |
|
б). k := k*2 mod 5 + k/3; |
|
||||
4. |
Присвойте целой переменной S |
|
|
|
|||
а). сумму цифр трехзначного целого числа k; |
|
|
б). первую цифру из дробной части положительного вещественного числа k; в). третью от конца цифру в записи положительного целого числа k.
35Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
5.Напишите оператор присваивания, в результате выполнения которого логическая переменная f получает значение true, если выполняется указанное условие, и значение false иначе:
а) каждое из чисел a, b, c кратно 3;
б) хотя бы одно из чисел a, b, c кратно 3; в) ни одно из чисел a, b, c не кратно 3; г) только одно из чисел a, b, c кратно 3; д) а принадлежит отрезку [-1; 1];
е) а не принадлежит отрезку [-1; 1] (воспользуйтесь законом де Моргана);
ж) поля (g1, b1) и (g2, b2) шахматной доски имеют одинаковый цвет (g1, b1, g2,b2 - целые координаты соответственно по горизонтали и вертикали от 1 до 8);
з) ферзь, расположенный на поле (g1, b1) шахматной доски, “ бъет” поле (g2, b2); и) конь, расположенный на поле (g1, b1) шахматной доски, “ бъет” поле (g2, b2);
к) можно ли с поля (g1, b1) одним ходом ферзя попасть на поле (g2, b2). Если нет, то выяснить, как это можно сделать за два хода и указать поле, на которое приводит первый ход;
л) аналогичное задание, но ферзь заменяется на коня.
Общий вид программы на Паскале program имя_программы;
const
{раздел описания констант} type
{раздел описания типов} var
{раздел описания переменных} procedure (function)
{раздел описаний подпрограмм} begin
{тело программы или раздел операторов}
end.
В { } или (* *) записываются комментарии. Раздел операторов является основным и присутствует в любой программе. Операторы отделяются друг от друга точкой с запятой. Разделы описаний (все или часть) могут отсутствовать. В Турбо-Паскале может отсутствовать заголовок программы. Разделы const, type, var могут следовать друг за другом в любом порядке и повторяться в разделе описаний несколько раз.
Пример. Написать программу, определяющую в заданном количестве суток количество часов, минут и секунд.
program task1; var
hour, sec, min, x: integer; {часы, минуты, секунды, сутки} begin
write (‘задайте количество суток’); readln (x);
hour := 24*x; min := 60*hour; sec := 60*min;
writeln (‘в ’, x, ‘сутках ’, hour, ‘часов ’, min, ‘минут ’, sec, ‘секунд’) end.
36 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
Упражнения.
1.Даны два момента времени одних суток, заданные в часах и минутах. Причем первый момент предшествует второму. Напишите программу, определяющую интервал между этими моментами времени. Результат должен быть представлен в часах и минутах.
2.Дана стоимость товара, выраженная в рублях. Напишите программу, определяющую наименьшее количество банкнот по 50 рублей, 20 рублей и 1 рублю, которыми можно расплатиться за товар.
3.Определите, какую задачу решают приведенные ниже программы:
program pr1;
var a, b, p, q: integer; begin
write (‘введите a и b’); realln (a, b); p := a div b; q := a - p*b;
writeln (‘a = ‘, p, ‘*’, b, ‘+’, q) end.
program pr2;
var n1, n2: integer; x: real; begin
write (‘n1 = ‘); readln (n1); write (‘n2 = ‘); readln (n2);
x := n1/n2; writeln (‘n1/n2=‘, x); end.
Условный оператор
Ветвящиеся (разветвляющиеся) алгоритмы (см. раздел “ Алгоритм и его свойства”) программируются при помощи условного оператора, полная форма которого следующая:
if логическое_выражение then оператор1 else оператор2; if (если), then (тогда), else (иначе) - служебные слова.
Выполнение оператора: если логическое выражение истинно, то выполняется оператор1, иначе (если логическое выражение ложно) выполняется оператор2. В качестве оператора1 и оператора2 может быть любой оператор Паскаля, в том числе и условный оператор.
Краткая форма условного оператора:
if логическое_выражение then оператор1;
Если логическое выражение истинно, то выполняется оператор1, иначе выполняется оператор, расположенный после этого условного оператора.
Если по какой-либо веточке условного оператора необходимо выполнить более одного оператора, то эти операторы надо заключить в операторные скобки begin ... end.
if логическое_выражение then begin оператор1;
оператор2;
...
end
else begin оператор1;
оператор2;
...
end;
Перед else ‘;’ не ставится. Else всегда относится к ближайшему then.
Пример. Напишите программу, определяющую максимальное из двух целых чисел. program task2;
var a, b: integer; begin
write (‘введите два целых числа’); readln (a, b); if a > b then writeln (‘максимальное =’, a)
else writeln (‘максимальное =’, b); end.
37 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
Операторы цикла
В Паскале циклические алгоритмы (см. раздел “ Алгоритм и его свойства”) могут быть записаны с помощью следующих операторов.
Арифметический цикл (или цикл с увеличивающимся параметром):
for параметр := выражение1 to выражение2 do оператор;
for, to, do - служебные слова. Выражение1 и выражение2 вычисляются только один раз при входе в цикл и в процессе выполнения цикла не изменяются. В начале выполнения цикла параметру присваивается значение выражения1. Затем проверяется значение параметра £ выражения2. Если да, то выполняется оператор тела цикла, после чего значение параметра автоматически получает значение, следующее за текущим значением параметра в соответствии с его типом. Если параметр целого типа, то значение параметра увеличивается на единицу. Если параметр символьного типа, то выбирается следующий символ из кодовой таблицы. Если параметр логического типа, то выбирается следующее логическое значение. Отсюда следует, что параметр должен быть порядкового типа и не может быть вещественного типа. Параметр, выражение1, выражение2 должны быть одного типа. Если выражение1 > выражение2, то тело цикла не выполнится ни разу. Нельзя явным образом менять значение параметра в теле цикла. Если тело цикла содержит более одного оператора, то оно оформляется как составной оператор с использованием операторных скобок begin ... end.
Арифметический цикл (или цикл с уменьшающимся параметром).
for параметр := выражение1 downto выражение2 do оператор;
for, downto, do - служебные слова . Выражение1 и выражение2 вычисляются только один раз при входе в цикл и в процессе выполнения цикла не изменяются. В начале выполнения цикла параметру присваивается значение выражения1. Затем проверяется значение параметра ³ выражения2. Если да, то выполняется оператор тела цикла, после чего значение параметра автоматически получает значение, предшествующее текущему значению параметра в соответствии с его типом. Если параметр целого типа, то значение параметра уменьшается на единицу. Если параметр символьного типа, то выбирается предыдущий символ из кодовой таблицы. Если параметр логического типа, то выбирается предыдущее логическое значение. Отсюда следует, что параметр должен быть порядкового типа и не может быть вещественного типа. Параметр, выражение1, выражение2 должны быть одного типа. Если выражение1 < выражение2, то тело цикла не выполнится ни разу. Нельзя явным образом менять значение параметра в теле цикла. Если тело цикла содержит более одного оператора, то оно оформляется как составной оператор.
Цикл с предусловием:
while логическое_выражение do оператор;
while, do - служебные слова. Оператор тела цикла выполняется до тех пор, пока значение логического_выражения истинно. Для того, чтобы цикл не стал бесконечным (не зациклился), необходимо наличие в теле цикла оператора, влияющего на значение логического выражения. В качестве оператора может быть любой оператор Паскаля. Если тело цикла содержит более одного оператора, то оно оформляется как составной оператор. Тело цикла может ни разу ни выполниться, если при первой проверке
логическое_условие ложно.
Цикл с постусловием:
repeat операторы тела цикла until логическое_выражение;
38 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
repeat, until - служебные слова. Операторы тела цикла выполняются до тех пор, пока логическое выражение ложно. В теле цикла можно указывать любые операторы Паскаля без использования операторных скобок. Для выхода из цикла необходимо, чтобы
операторы тела цикла изменили значение логического_выражения на истинное,
иначе произойдет зацикливание. Тело цикла выполнится хотя бы один раз.
ПОСТРОЕНИЕ ЛИНЕЙНЫХ АЛГОРИТМОВ
Для программирования линейных алгоритмов используются операторы ввода, вывода и присваивания.
Пример 1. Даны катеты прямоугольного треугольника. Найдите его гипотенузу и площадь.
Решение. Исходными данными являются длины катетов. Из условия задачи неясно, какого типа длины катетов, поэтому выбираем наиболее общий случай и считаем их вещественными. Потребуется переменная для гипотенузы и площади, которые также будут вещественными.
Program task3;
var a, b, c: real; {a, b - длина катетов, c - длина гипотенузы} S : real; {площадь}
begin
write (‘Задайте длины катетов’); readln (a, b);
c := sqrt(sqr(a) + sqr(b)); S := a * b/2;
writeln (‘гипотенуза равна ’, c, ‘площадь равна ’, S)
end.
Можно было написать программу без использования переменных c и S.
Program task3a;
var a, b, c: real; {a, b - длина катетов, c - длина гипотенузы} begin
write (‘Задайте длины катетов’); readln (a, b);
writeln (‘гипотенуза равна ’, sqrt(sqr(a) + sqr(b)) , ‘площадь равна ’, a * b/2)
end.
Пример 2. Дано действительное x. Вычислите y, используя только операции сложения, вычитания и умножения.
y = 2x4 - 3x3 + 4x2 - 5x + 6.
Решение. Вариант 1. y := 2*x*x*x*x - 3*x*x*x + 4*x*x -5*x + 6. Используется 14
операций.
Вариант 2. Введем дополнительные переменные:
x2 := x*x; |
x3 := x2*x; |
x4 := x2*x2; |
тогда y := |
2*x4 - 3*x3 |
+ 4*x2 -5*x + 6. Количество операций сократилось, но |
используются три дополнительные переменные.
Вариант 3 позволяет не вводить новые переменные и уменьшить количество операций, для чего используется схема Горнера:
y := (((2*x - 3)*x + 4)*x - 5)*x+6. Используется восемь операций. Реализуем программно именно этот вариант.
Proqram task4; Var x, y : real;
begin
39 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
|
write (‘задайте значение x’); |
|
||
|
readln (x); |
|
|
|
|
y := (((2*x - 3)*x + 4)*x - 5)*x+6; |
|
||
|
writeln (‘y = ‘, y) |
|
|
|
end. |
|
|
|
|
Упражнения. |
|
|
|
|
1. |
Дано действительное число x. Не пользуясь никакими арифметическими |
|||
|
операциями, кроме *, +, -, вычислите: |
|
||
1 - 2x + 3x2 - 4x3 |
и |
1 + 2x + 3x2 + 4x3. Используйте не более 8 операций. |
||
2. |
Дано действительное число a. Не пользуясь никакими операциями, кроме |
|||
|
умножения, получите: |
|
|
|
а). a8 за 3 операции; |
|
б). а21 за 6 операций; |
в). а5 и а19 за 6 операций; |
|
г). а4, а12, а28 за 6 операций. |
|
|
||
3. |
Текущее показание электронных часов: m часов (0 ≤ m ≤ 23), n минут (0 ≤ n ≤ 59), |
k секунд (0 ≤ k ≤ 59). Напишите программу, которая будет определять какое время будут показывать часы через p часов, q минут, r секунд.
_____________________________________________________________________________ |
|
Проверьте себя: 1. p=1-2*x+3*x2-4*x3=1+3*x2-(2*x+4*x3), |
|
q=1+2*x+3*x2+4*x3=1+3*x2+(2*x+4*x3 ) , |
|
Пусть а=1+3*х2; в=х*(2+4*х2), |
|
1) x2:=x*x; |
x2 |
2) a:=3*x2; |
3*x2 |
3) a:=1+a; |
1+3*x2 |
4) a3:=4*x2; |
4*x2 |
5) b:=2*a3; |
2+4*x2 |
6) b:=x*b; |
x*(2+4*x2) |
7) p:=a-b; |
1+3*x2-2*x-4*x2 |
8) q:=a+b |
1+3*x2+2*x+4*x2 |
2.a) a2:=a*a; a4:=a2*a2; a8:=a4*a4.
б) a2:=a*a; a4:=a2*a2; a8:=a4*a4; a16:=a8*a8; a20:=a16*a4; a21:=a20*a. в) a2:=a*a; a4:=a2*a2; a5:=a4*a; a10:=a5*a5; a15:=a10*a5; a19:=a15*a4. г) a2:=a*a; a4:=a2*a2; a8:=a4*a4; a12:=a8*a4; a24:=a12*a12; a28:=a24*a4.
3.m1:=(m*60+n)*60+k;
m2:=(p*60+q)*60+r;
m3:=m1+m2; сек:=m3 mod 60;
мин:=m3 div 60 mod 60; час:=m3 div 60.
ПОСТРОЕНИЕ ВЕТВЯЩИХСЯ АЛГОРИТМОВ
Условный оператор позволяет выбирать один вариант из двух. Но часто приходится решать задачи, где необходимо делать выбор их нескольких (более двух) вариантов. Алгоритмы, позволяющие решать такие задачи, называют ветвящимися.
Их можно реализовать, используя следующие конструкции:
*последовательные «if»;
*вложенные «if».
Поясним использование этих конструкций на следующем примере.
Пример. Зарплата служащих некоторого учреждения определяется следующим образом: при стаже работы менее 5 лет зарплата - 100 рублей, если стаж работы от 5 до 10
40 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
лет, то зарплата - 200 рублей, при стаже от 10 лет до 15 зарплата повышается на 10 рублей с каждым годом, а при стаже свыше 15 лет - на 20 рублей с каждым годом.
Решение. Исходные данные: стаж работы. Зарплата принимает разные значения в зависимости от того, в какой из четырех диапазонов попал стаж работы, т.е.
100, |
если st < 5 |
|
|
|
если 5 ≤ st ≤10 |
|
|
200, |
|
||
zp = |
|
если 10 |
< st ≤15 |
200 + (st −10) *10, |
|||
|
|
|
|
200 + 5 *10 + (st −15) * 20, |
если st >15. |
||
|
|
|
|
program task5; |
|
|
|
{решение задачи с помощью последовательных if} |
|||
var st, zp: integer; |
{st - стаж; zp - зарплата} |
||
begin |
|
|
|
write (‘стаж работы’); readln (st); |
if st < 5 then zp := 100;
if (st >= 5) and (st <= 10) then zp := 200;
if (st > 10) and (st<=15) then zp := 200 + (st - 10) * 10; if st > 15) then zp := 200 + 5 * 10 + (st - 15)*20; writeln (‘зарплата равна ’, zp)
end.
Это реализация предложенной задачи с помощью последовательных «if», т.е. каждый диапазон описывается отдельным оператором if, при этом приходится проверять
верхнюю и нижнюю границу диапазона. |
|
|
program task5а; |
|
|
{решение задачи с помощью вложенных if} |
|
|
var st, zp: integer; |
{st - стаж; zp - зарплата} |
|
begin |
|
|
write (‘стаж работы’); readln (st); |
|
|
if st < 5 then zp := 100 |
|
|
else if st <= 10 then zp := 200 |
|
|
else if st <= 15 then zp := 200 + (st - 10) * 10 |
|
|
else zp := 200 + 5*10 + (st - 15)* 20; |
{*} |
|
writeln (‘зарплата равна ’, zp) |
|
|
end. |
|
|
В данном варианте после служебного слова else опять записан if, но условие проверяет лишь верхнюю границу диапазона. Это естественно, поскольку оператор if работает таким образом, что на ветвь else можно попасть только в случае, если логическое выражение st < 5 не выполняется, т.е. not (st < 5) ≡ st >= 5, т.е. проверка нижней границы диапазона осуществляется автоматически. По этой же причине отсутствует проверка условия в строке {*}.
Достоинства второй конструкции несомненны, поскольку проще становятся условия, подлежащие проверке. Однако, если элементами вложенных условных операторов служат неполные условные операторы, то могут возникнуть неясности, связанные с установлением границ условных операторов. В таких случаях служебное слово else относится к ближайшему if.
Упражнения.
1.Может ли в программе быть служебных слов if больше, чем else? Возможна ли обратная ситуация: else больше, чем if?
2.Постройте график функции:
41 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
a) if x < -4 then y := 4 |
б) if x < - 1 then y := 1/(x * x) |
else if abs(x) <= 2 then y := sqr(x) |
else if x < 2 then y := x * x |
else y := -x + 6; |
else y := 4; |
3. Напишите программу вычисления функции y по x, заданной графиком:
|
|
Y |
|
|
|
|
1 |
|
|
- 2 |
- 1 |
1 |
2 |
X |
4.Напишите программу, определяющую попадает ли точка с координатами (X, Y) в заштрихованную область:
а) используя условный оператор; б) реализовать как линейный алгоритм, используя логическую переменную.
1 |
Y |
|
1 |
|
Y |
1 |
|
|
Y |
||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-1 |
|
|
|
|
|
|
|
|
|
|
1 X -1 |
|
|
|
|
|
|
|
|
|
|
|
|
1 X -1 |
|
|
|
|
|
|
|
|
|
|
|
|
1 X |
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-1 |
|
|
|
|
|
-1 |
|
|
|
|
|
-1 |
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Примечание: вспомните, что объединение реализуется с помощью оператора or, а пересечение - с помощью and.
Задача 1. Три толстяка поспорили, кто из них самый тяжелый. Напишите программу, которая бы разрешила их спор.
Решение. Исходные данные: вес каждого толстяка, результат: номер самого тяжелого толстяка. Решение задачи сводится к поиску номера наибольшего из трех чисел.
Вариант 1.
var a, b, c: integer; begin
writeln (‘Уважаемые толстяки! Задайте свой вес’); readln (a, b, c);
if (a > b) and (a >c) then writeln (‘Cамый тяжелый - первый с весом =’, a); if (b > a) and (b >c) then writeln (‘Cамый тяжелый - второй с весом =’, b); if (c > a) and (c >b) then writeln (‘Cамый тяжелый - третий с весом =’, с);
end.
При таком подходе, если бы толстяков было 5, то условия состояли бы уже из четырех частей. Следующий вариант реализует программу с использованием вложенных
“if”.
Вариант 2.
if (a > b) and (a > c) then writeln (‘Cамый тяжелый - первый с весом =’, a) else if b > c then writeln (‘Cамый тяжелый - второй с весом =’, b)
else writeln (‘Cамый тяжелый - третий с весом =’, c);
Вариант 3. Введем дополнительную переменные max, в которой будет запоминаться вес кандидата на звание “ самый тяжелый”, и imax, в которой будет храниться номер этого кандидата. В случае появления нового кандидата необходимо будет изменить значения обеих переменных.
var a, b, c, max, imax: integer; begin
writeln (‘Уважаемые толстяки! Задайте свой вес’); readln (a, b, c);
42 Гладков В.П., Кулютникова Е.А. Пособие по информатике для самообразования.
if (a > b) then begin max := a; imax := 1 end else begin max := b; imax := 2 end;
if max < c then begin max := c; imax := 3 end;
(‘Cамый тяжелый - ‘, imax, ‘с весом =’, max);
end.
Упражнение. Внесите измения в программу для случая, когда толстяков - 5.
Задача 2. У каждого из трех толстяков есть свой трон. Необходимо написать программу, которая позволила бы так пересадить толстяков, чтобы на крайнем левом троне сидел самый тяжелый, а на крайнем правом - самый легкий.
Решение. Исходные данные - вес каждого толстяка a, b, c. Результат - a ³ b ³ c. var a, b, c, r: integer; {r - вспомогательная переменная}
begin
writeln (‘Уважаемые толстяки! Задайте свой вес’); readln (a, b, c);
if a < b then begin r := a; a := b; b := r; {a >= b} if a < c then begin r := a; a := c; c := r; {a >= c} if b < c then begin r := b; b := c; c := r; {b >= c}
writeln (‘Толстяки должны сидеть в следующем порядке:’, a, ‘ ‘, b, ‘ ‘, c)
end.
Упражнения.
1.Даны пять различных чисел. Найдите два таких числа среди них, чтобы модуль разности между ними был максимален.
2.Напишите программу, которая определяет можно ли построить треугольник со сторонами a, b, c. Если - да, то какой это треугольник - равносторонний, разносторонний, равнобедренный.
3.Напишите программу размена любой суммы, большей 7 рублей, трешками и пятерками.
4.Напишите программу, проверяющую пройдет ли кирпич размерами a´b´c в окно размерами x´y.
5.Дано четырехзначное целое число. Напишите программу, проверяющую является ли сумма цифр этого числа полным квадратом.
6.Напишите программу, определяющую какое наименьшее количество почтовых марок по 10 руб., 4 руб. и 1 руб. надо наклеить на бандероль, если: за бандероль весом до 50 г взимается 10 руб., за каждые следующие полные или неполные 50 г - еще по 5 руб.
7.Плата за телефонные услуги осуществляется следующим образом:
10 руб./час - за первые 10 часов; 20 руб./час - за следующие 20 часов;
30 руб./час - за следующие 30 часов; 50 руб./час - за следующие 40 часов
и 60 руб./час - за каждый час свыше 100 часов. Напишите программу, определяющую плату за телефонные услуги для введенного времени переговоров.
ПОСТРОЕННИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ
При программировании циклических алгоритмов используются операторы цикла (арифметический, с пред- и постусловием), а также операторы ввода-вывода, условные, присваивания.
Рассмотрим типовые приемы при решении задач с использованием циклов.