Выделение цифр числа

advertisement
Использован учебник Лукин, С.Н. Турбо-Паскаль 7.0 самоучитель для школьников,
студентов и начинающих.-М., 1999.
Операторы ввода данных ReadLn и Read.
Задача: Сложить два числа - 20 и 16.
Сравним две программы решения этой задачи:
VAR a,b : Integer; VAR a,b :
Integer;
BEGIN
a:=20; b:=1
BEGIN
WriteLn (a+
ReadLn (a,b);
WriteLn (a+b)
END.
END.
Программы отличаются только одной строкой. Первая программа не требует пояснений она печатает число 36. Во второй программе нигде не сказано, чему равны a и b, а вместо
этого включен оператор ReadLn. Поговорим о нем.
ReadLn читается "рид'лайн", переводится "читай строку". Он приказывает компьютеру
остановиться и ждать, когда человек введет с клавиатуры определенную информацию,
после чего продолжить работу. В частности, ReadLn (a,b) будет ждать ввода двух целых
чисел.
Таким образом, если первая программа после запуска будет работать без остановки до
самого конца и без хлопот выдаст результат, то вторая программа на операторе ReadLn
остановится и будет ждать. Во время этого ожидания человек должен на клавиатуре
набрать число 20 (так как первым в списке оператора ReadLn стоит a), затем нажать
клавишу пробела, затем набрать 16 и нажать клавишу Enter. Паскаль воспринимает
нажатие пробела, как сигнал человека о том, что закончен набор на клавиатуре одного
числа и сейчас начнется набор другого. После набора на клавиатуре последнего числа
необходимо нажать клавишу Enter в знак того, что ввод чисел для данного оператора
ReadLn закончен и компьютер может продолжать работу. В соответствии с этим
компьютер сразу же после нажатия Enter прекращает ожидание и прежде всего направляет
число 20 в память, в ячейку a, число же 16 - в ячейку b. На этом он считает выполнение
оператора ReadLn законченным и переходит к следующему оператору - WriteLn. В
результате будет напечатано число 36.
Таким образом, обе программы делают одно и то же. Зачем же тогда применять ReadLn
вместо оператора присваивания? Ведь первая программа понятней, да и работает без
остановки. Одна из причин в том, что программа с ReadLn гораздо универсальнее,
"свободнее": если первая программа решает задачу сложения только двух конкретных
чисел, то вторая программа складывает два любых числа. Вторая причина в том, что
программа с ReadLn позволяет программисту во время написания программы не
задумываться над конкретными значениями исходных данных, оставляя эту головную
боль на момент выполнения программы. Но самая главная причина в том, что ReadLn
позволяет человеку общаться с компьютером, вести с ним диалог во время выполнения
программы.
В подтверждение важности первой причины напишем программу для решения следующей
задачи: В зоопарке три слона и довольно много кроликов, причем количество кроликов
часто меняется. Слону положено съедать в сутки сто морковок, а кролику - две. Каждое
утро служитель зоопарка сообщает компьютеру количество кроликов. Компьютер в ответ
на это должен сообщить служителю общее количество морковок, которые сегодня нужно
скормить кроликам и слонам.
Придумаем имена переменным величинам:
kol_krol
-
количество кроликов в зоопарке
kol_slon
-
количество слонов в зоопарке
norma_krol
-
сколько морковок в день положено кролику
norma_slon
-
сколько морковок в день положено слону
vsego
-
сколько всего требуется морковок
А теперь напишем программу:
VAR kol_krol,kol_slon,norma_krol,norma_slon,vsego :Integer;
BEGIN
norma_krol:=2;
norma_slon:=100;
ReadLn (kol_krol);
kol_slon:=3;
vsego := norma_krol * kol_krol + norma_slon * kol_slon;
WriteLn (vsego)
END.
Написав программу, программист вводит ее в компьютер, отлаживает и записывает на
диск. На этом его миссия закончена. Утром служитель, пересчитав кроликов и найдя, что
их 60 штук, подходит к компьютеру и запускает программу на выполнение.
Компьютер, выполнив автоматически первые два оператора (norma_krol:=2 и
norma_slon:=100), останавливается на операторе ReadLn. Служитель вводит число 60,
после чего компьютер посылает это число в ячейку kol_krol и переходит к выполнению
следующего оператора ( kol_slon:=3 ). В конце концов на мониторе появится ответ: 420.
Вот схематическое изображение процесса выполнения программы:
ПОРЯДОК
ИСПОЛНЕНИЯ
ОПЕРАТОРОВ
norma_krol:=2
norma_slon:=100
ReadLn (kol_krol)
kol_slon:=3
vsego:=norma_krol
WriteLn (vsego)
ЧТО НАХОДИТСЯ В ЯЧЕЙКАХ ПАМЯТИ
norma_k norma_slo
kol_krol kol_slon
vsego
rol
n
?
?
60
60
60
60
?
?
?
3
3
3
2
2
2
2
2
2
?
100
100
100
100
100
?
?
?
?
420
420
На следующее утро, обнаружив, что 5 кроликов продано другому зоопарку, служитель
запускает ту же самую программу, вводит число 55 и получает ответ - 410.
На этом несколько фантастичном примере я хотел показать, что применение ReadLn
позволяет создавать программы, которые, оставаясь приятно неизменными, позволяют
легко решать задачу в любое время для любых значений исходных данных. Можно было
бы пойти по другому пути - вместо ReadLn использовать оператор присваивания,
например kol_krol:=60. Но в этом случае программист каждое утро должен был бы
бежать в зоопарк, чтобы исправлять в программе этот оператор присваивания.
Оператор ReadLn можно писать и без скобок, просто так: ReadLn . Выполняя оператор в
такой записи, компьютер остановится и будет ждать, но не ввода какой-то информации, а
просто нажатия на клавишу Enter. Таким образом, это просто оператор создания паузы в
процессе выполнения программы. О том, зачем нужны паузы, поговорим чуть ниже.
Кроме оператора ReadLn для ввода данных применяется также оператор Read. Для
начинающего программиста различия в их применении несущественны. Мы будем пока
употреблять только ReadLn. Оператор Read без скобок паузу не создает.
Интерфейс пользователя
Когда служитель запускает программу и она делает паузу на операторе ReadLn(kol_krol),
служитель видит перед собой пустой экран монитора, на котором нет никаких намеков на
приглашение вводить какую-либо информацию. Посторонний человек ни за что и не
догадается, что компьютер чего-то ждет. Это не очень удобно. Было бы гораздо лучше,
если бы на экране все-таки можно было в нужный момент видеть подходящее
приглашение, чтобы служитель с раннего утра чего-нибудь не перепутал.
Это же касается и выдачи результатов. На пустом экране появляется сухое число 420.
Посторонний человек ни за что не поймет, какой оно имеет смысл: то ли это 420 рублей,
то ли 420 зоопарков. Говорят, что у нашей программы неудобный интерфейс
пользователя, то есть человеку, использующему нашу программу, неудобно с ней
общаться. Слово "интерфейс" можно перевести, как "взаимодействие", в данном случае
взаимодействие человека с компьютером.
Дополним чуть-чуть нашу программу, чтобы интерфейс стал более удобным:
VAR kol_krol,kol_slon,norma_krol,norma_slon,vsego : Integer;
BEGIN
norma_krol:=2;
norma_slon:=100;
WriteLn ( 'Введите, пожалуйста, количество кроликов' );
ReadLn ( kol_krol);
kol_slon:=3;
vsego := norma_krol * kol_krol + norma_slon * kol_slon;
WriteLn( 'Вам всего понадобится ' ,vsego, ' морковок' );
ReadLn
END.
Эта программа будет работать точно так же, как и предыдущая, с тем отличием, что во
время паузы, вызванной оператором ReadLn ( kol_krol), на экране будет гореть удобная
надпись Введите, пожалуйста, количество кроликов
а результат будет выведен на экран в виде Вам всего понадобится 420 морковок
Оператор ReadLn без скобок в конце программы нужен для нейтрализации одной
неприятной особенности в работе Паскаля. Дело в том, что выполнив программу, Паскаль
торопится погасить экран с результатами решения задачи и делает это так быстро, что
человек просто не успевает эти результаты разглядеть. Оператор ReadLn, поставленный
после оператора WriteLn, выводящего результаты на экран, задает паузу. Во время этой
паузы экран не гаснет, так как программа еще не выполнилась до конца, и человек может
спокойно разглядеть результаты. После этого он нажатием клавиши Enter позволит
компьютеру продолжить выполнение программы (в нашем случае после ReadLn стоит
END с точкой, поэтому программа завершится).
Часто, впрочем, можно обойтись и без ReadLn. Нажав пару клавиш на клавиатуре (Alt-F5),
мы можем снова зажечь погасший экран с результатами. В дальнейших примерах я буду
для экономии места и "смысла" обходиться без ReadLn.
Строковые переменные
Сравним две программы:
VAR a : Integer;
BEGIN
a:=98;
WriteLn (a)
END.
VAR a : Strin
BEGIN
a:='Привет
всем!';
WriteLn (a)
END.
В первой программе описание VAR a : Integer говорит о том, что переменная a обязана
иметь числовое значение, а оператор a:=98 записывает в ячейку a число 98.
Во второй программе описание VAR a : String говорит о том, что переменная a обязана
иметь строковое (текстовое) значение, то есть ее значением будет не число, а
произвольная цепочка символов, например,
Привет всем! или рпН2Н(*fD6:u .
Оператор a:='Привет всем!' записывает в ячейку a строку Привет всем! . Оператор
WriteLn (a), поскольку он обязан всегда выводить на экран содержимое ячейки a, выведет
на экран текст Привет всем!
Обратите внимание, что в программе текст должен браться в кавычки, а в памяти он
хранится без кавычек и на экран выводится без кавычек.
Слово String читается "стринг", переводится "строка".
Какой смысл переменным иметь текстовое значение, выяснится в следующем параграфе.
Информация в ячейке памяти под строковую переменную может в процессе выполнения
программы меняться точно так же, как и в ячейке для числовой переменной. Например,
при выполнении фрагмента
a:='Минуточку!'; WriteLn(a); a:='Здравствуйте!'; a:='До свидания!'; WriteLn (a)
в ячейке a будут по очереди появляться строки
Минуточку!
Здравствуйте!
До свидания!
а на экран будут выведены строки
Минуточку!
До свидания!
Строковую переменную можно задавать не только оператором присваивания, но и
оператором ReadLn. Пример:
VAR a : String;
BEGIN
WriteLn ('Введите какое-нибудь слово');
ReadLn (a);
WriteLn ('Вы ввели слово ' ,a)
END.
Во время паузы, вызванной оператором ReadLn, вы должны ввести какой-нибудь набор
символов, например Изнакурнож , и затем нажать клавишу Enter в знак того, что ввод
закончен. В результате на экране будет напечатан текст:
Вы ввели слово Изнакурнож
Диалог с компьютером
Напишем программу, которая осуществляла бы такой диалог человека с компьютером:
КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН:
как зовут?
ЧЕЛОВЕК ВВОДИТ С КЛАВИАТУРЫ:
КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН:
тебе лет?
ЧЕЛОВЕК ВВОДИТ С КЛАВИАТУРЫ:
КОМПЬЮТЕР ВЫВОДИТ НА ЭКРАН:
взрослый!
Вот программа:
Здравствуй, я компьютер, а тебя
Коля
Очень приятно, Коля. .Сколько
16
Ого!Целых 16 лет!Ты уже совсем
VAR
imya
:String;
vozrast :Integer;
BEGIN
WriteLn ('Здравствуй, я компьютер, а тебя как зовут?');
ReadLn (imya);
WriteLn ('Очень приятно, ', imya, ' . Сколько тебе лет?');
ReadLn (vozrast);
WriteLn ('Ого! Целых ' ,vozrast, ' лет! Ты уже совсем взрослый!')
END.
Диалог будет отличаться только той информацией, которую вводит человек. Так, в другой
раз по этой же программе будет осуществлен следующий диалог:
КОМПЬЮТЕР:
Здравствуй, я компьютер, а тебя как зовут?
ЧЕЛОВЕК :
Фантомас!
КОМПЬЮТЕР:
Очень приятно, Фантомас! . Сколько тебе лет?
ЧЕЛОВЕК:
100
КОМПЬЮТЕР:
Ого! Целых 100 лет! Ты уже совсем взрослый!
Не подумайте, что эта программа очень умная. Она совершенно не анализирует,
какую информацию человек ввел с клавиатуры. Поэтому с ней возможен и такой диалог:
КОМПЬЮТЕР:
Здравствуй, я компьютер, а тебя как зовут?
ЧЕЛОВЕК:
Сгинь с моих глаз!
КОМПЬЮТЕР:
Очень приятно, Сгинь с моих глаз! . Сколько тебе лет?
ЧЕЛОВЕК:
-2
КОМПЬЮТЕР:
Ого! Целых -2 лет! Ты уже совсем взрослый!
Выделение цифр числа
Используя операции деления mod и div можно выделять нужные цифры числа. Проще
всего выделить последнюю цифру числа, для этого надо найти остаток от деления числа
на 10, например:
3456 mod 10 = 6 – последняя цифра числа 3456
Теперь давайте попробуем найти предпоследнюю цифру. Попробуйте самостоятельно
решить это задание, прежде чем читать дальше.
Существует два способа решения этой задачи.
Первый способ сводится к нахождению последней цифры числа. Для этого надо
сначала «отбросить» правую цифру в исходном числе, тогда искомая цифра окажется
последней. А последнюю цифру мы умеем находить. Как же «отбросить» последнюю
цифру? Очень просто, надо число поделить на 10:
3456 div 10 = 345 - начальное число без последней цифры
Теперь выделим последнюю цифру нового числа:
345 mod 10 = 5 - искомая предпоследняя цифра!
Теперь объединим эти два действия в одно:
3456 div 10 mod 10 = 5.
Во втором способе мы подойдём к числу с другой стороны и выделим сначала две
крайние правые цифры, получим двузначное число:
3456 mod 100 = 56
Теперь от этого двузначного числа надо «отбросить» последнюю цифру:
56 div 10 = 5
Вот и всё. Осталось только объединить эти два действия в одно:
3456 mod 100 div 10 = 5
Ещё раз самостоятельно разберите эти примеры и попробуйте выделить третью с
конца цифру двумя способами.
Конструирование числа по его цифрам
Как из цифр числа составить само число?
Может быть помните, как в 4-ом классе на уроке математики вы расписывали числа по
разрядам:
89743 = 8*10000 + 9*1000 + 7*100 + 4*10 + 3
В чём суть этого равенства? В том, что можно числа собирать из цифр, как машинку из
деталей конструктора. Например, у нас есть три переменные a, b, c, в которых записаны
цифры трёхзначного числа, которое символически можно обозначить так: (abc). Тогда
собрать по косточкам это число можно так:
chislo := 100*a + 10*b + c
Например, если a=3, b=7, c=1, то
(abc) = 100*3 + 10*7 + 1 = 371
Попробуйте аналогичным образом собрать следующие числа из их цифр:
(abcd) (cd) (dbase) (snickers) (dardva)
Download