Задача разборчивая принцесса excel

Формулировка задачи:

Программа DD «Разборчивая принцесса».
(со стр. 451. Самоучителя с Интернета).

На выходе имеем:
1-й запуск:

2-й запуск:

Почему первая часть условия не сраюатывает?

Код к задаче: «Программа DD Разборчивая принцесса»

textual

if (Zvet = ' голубой ') and (Rost < 140) then

Полезно ли:

6   голосов , оценка 3.833 из 5

0.1. Вложенные операторы if.
Сложное условие в операторе if. Логические операции

Согласно синтаксической схеме оператора if,
после then и else может стоять любой оператор Паскаля, в том числе и if.

Решим задачу: В компьютер вводится число (пусть для
конкретности это будет дальность какого-нибудь выстрела). Если оно находится в
интервале от 28 до 30, то напечатать текст ПОПАЛ, иначе — НЕ ПОПАЛ.

Сначала составим алгоритм: Введи число. Если оно
больше 28, то надо еще подумать, в противном случае печатай  НЕ ПОПАЛ. А о чем
же думать? А вот о чем: Если число меньше 30, то печатай  ПОПАЛ, иначе печатай 
НЕ ПОПАЛ.

А теперь по составленному алгоритму напишем программу:

VAR a : Real;
BEGIN
     ReadLn (a);
     if a>28    then   if a<30    then
WriteLn (‘
ПОПАЛ‘)
                                           else WriteLn (‘
НЕ
ПОПАЛ‘)
                   else  WriteLn (‘
НЕ ПОПАЛ‘)
END.

Как компьютер не запутается в этих then и else? Если
внимательно присмотреться, то можно увидеть, что двусмысленная ситуация
получается только тогда, когда один из if записан без else, а другой — с else.
Пример:

  d:=3;   v:=10;   if v<6 then if
v<20 then d:=1 else d:=2

Чему будет равняться d после выполнения этого фрагмента — 1, 2 или 3? Ответ зависит
от того, какому if принадлежит else —     if v<6    или    if v<20  ? Чтобы ответить на
этот вопрос, пойдем по тексту программы от интересующего нас else к началу и
если по пути нам не встретится еще один else. то первый же if, на который мы
наткнемся — наш. Если по пути нам встретится еще один else, забудем пока про
наш else и найдем сначала if для нового else, а со старым разберемся потом.

Испытайте-ка этот способ в нашем фрагменте и в предыдущей
программе. Получается, что else в нашем примере принадлежит  if v<20 и значит, d будет равняться 3.

Задание 25:
Усложним задание из 5.2: В компьютер вводятся длины
трех отрезков. Компьютер должен ответить на вопрос, правда ли, что эти отрезки могут
образовать треугольник.

Указание: Для этого каждый отрезок должен быть меньше
суммы длин двух других отрезков.

_____________  _ 
_____________

На первый взгляд применение if внутри if создает громоздкую,
трудную для понимания программу. Однако, если вы будете аккуратно использовать
ступенчатую запись, то программа получится достаточно обозримой.

В Паскале, тем не менее, есть возможность записывать многие
программы со вложенными друг в друга
if короче и понятнее, используя только один if. Для этого
используются логические операции.

Задача «Разборчивая принцесса».  В прихожей
у принцессы — длинная очередь женихов. Принцессе нравятся только голубоглазые
маленького роста. Устав принимать женихов и отбирать из них подходящих,
принцесса вместо себя поставила компьютер, написав для него программу, которая
говорит ВЫ МНЕ ПОДОЙДЕТЕ тем, у кого цвет глаз голубой и рост меньше 140 см.
Остальным программа говорит ДО СВИДАНИЯ.

Вот эта программа:

VAR   Tsvet  :String;                      {Цвет}

          Rost   :Integer;                     {Рост}

BEGIN

     WriteLn (‘Каков цвет ваших глаз?’);

     ReadLn (Tsvet);

     WriteLn (‘Введите ваш рост в сантиметрах’);

     ReadLn (Rost);

     if   (Tsvet =’Голубой’) AND (Rost<140)                 {Если
цвет голубой   И   рост<140}

              then   WriteLn (‘ВЫ МНЕ ПОДОЙДЕТЕ’)

              else   WriteLn (‘ДО
СВИДАНИЯ‘)

END.

Мы видим, что условие в операторе if уже не такое простое,
как мы описывали раньше, а сложное, то есть состоящее из двух взятых в скобки
условий[1],
соединенных знаком логической операции AND (читается
«энд», переводится «и»). Весь оператор if можно прочесть
так — если цвет глаз голубой  И  рост меньше 140 сантиметров, то печатай ВЫ МНЕ
ПОДОЙДЕТЕ, иначе печатай ДО СВИДАНИЯ.

Знак логической операции AND, поставленный между двумя условиями, говорит о том, что
должны выполняться сразу оба эти условия.

 Поэтому наш оператор if ответит ДО СВИДАНИЯ и высоким
голубоглазым и высоким неголубоглазым и маленьким неголубоглазым. И лишь
маленьким голубоглазым он ответит ВЫ МНЕ ПОДОЙДЕТЕ.

Программа для задачи ПОПАЛ — НЕ ПОПАЛ при использовании
логических операций значительно упростится:

VAR a :Real;
BEGIN
     ReadLn (a);
     if (a>28) AND (a<30)  then WriteLn (‘
ПОПАЛ‘)
                                      else WriteLn (‘
НЕ ПОПАЛ‘)
END.

Задача «Неразборчивая принцесса».
Неразборчивой принцессе нравятся все маленькие независимо от цвета глаз и все
голубоглазые независимо от роста. Программа неразборчивой принцессы будет
отличаться от программы разборчивой одним единственным знаком логической операции:

if   (Tsvet =’Голубой’)   OR   (Rost<140)   {Если цвет
голубой  ИЛИ  рост<140}

Знак логической операции OR читается «о»,
переводится «или».

Поставленный между двумя условиями, знак OR говорит
о том, что достаточно, если будет выполняться хотя бы одно из них.

Поэтому теперь оператор if ответит ВЫ МНЕ ПОДОЙДЕТЕ и
высоким голубоглазым и маленьким голубоглазым и маленьким неголубоглазым. И
лишь высоким неголубоглазым он ответит ДО СВИДАНИЯ.

Знаками AND и OR можно объединять сколько угодно условий.
Например:

  if   (a>2) OR (x=b) OR (c<>1)  
then k:=99   else k:=33

Здесь выполнится оператор k:=99, если верно хотя бы одно из трех
условий, и лишь когда все три неверны, будет выполняться оператор k:=33.

Кроме логических операций AND и OR применяется еще
логическая операция NOT (читается «нот», переводится
«не»). Запись   if NOT(a>b) then…  
переводится так — ЕСЛИ НЕПРАВДА, ЧТО a больше b, ТО….  Вот фрагмент:

a:=2;    b:=3;    if   NOT(a>b)   then
k:=1   else k:=0

Здесь выполнится оператор k:=1, так как неправда, что 2>3.

Для простоты примем правило, что условия, к которым
применяются логические операции, заключаются в круглые скобки, хотя это не
всегда обязательно.

Внутри скобок можно писать не только простые, но и сложные
условия. Например, фрагмент   if NOT ((a>2) AND (b>3)) AND (s>8)) then…  можно перевести так — если неправда, что одновременно
верны три условия — a>2, b>3, s>8, то…

Примеры:

ФРАГМЕНТ

РЕЗУЛЬТАТ

a:=8;    b:=6;    if  (a>b) AND 
(b>7)       then k:=1   else k:=0

k=0

a:=8;    b:=6;    if  (a>b)  OR  
(b>7)       then k:=1   else k:=0

k=1

a:=8;    b:=6;    if  (a<b)  OR  
(b>7)       then k:=1   else k:=0

k=0

a:=8;    b:=6;    if       NOT
(a=8)             then k:=1   else k:=0

k=0

Задание 26: 
«Замысловатая принцесса». Определите, кто нравится принцессе,
по фрагменту из ее программы:

if      (Tsvet =’Черный‘)    AND   
((Rost<180)  OR  (Rost>184))

                        then
    WriteLn (‘ВЫ МНЕ ПОДОЙДЕТЕ’)

                        else      WriteLn (‘ДО
СВИДАНИЯ’)

До сих пор мы применяли оператор if для выбора одной из двух
возможностей. Покажем, как применять его для выбора одной из нескольких.
Усложним нашу задачу про ПОПАЛ — НЕ ПОПАЛ:

Человек вводит в компьютер число. Если оно находится в
интервале от 28 до 30, то нужно напечатать текст ПОПАЛ, если оно больше или
равно 30 — то ПЕРЕЛЕТ, если оно находится на отрезке от 0 до 28, то НЕДОЛЕТ,
если число меньше нуля — НЕ БЕЙ ПО СВОИМ.

Вот программа:

VAR a : Real;                 

BEGIN                           

     ReadLn (a);          

     if (a>28) AND (a<30)       then
WriteLn (‘
ПОПАЛ‘);

     if  a>=30                         then
WriteLn (‘
ПЕРЕЛЕТ‘);

     if (a>=0) AND (a<=28)     then
WriteLn (‘
НЕДОЛЕТ‘);

     if  a<0                            then
WriteLn (‘
НЕ БЕЙ ПО СВОИМ‘)

END.

Необходимо обращать внимание на аккуратную расстановку
знаков сравнения и числовых границ диапазонов.  Если во втором if вместо a>=30 мы напишем a>=20, то при вводе
числа 25 компьютер даст нам двусмыс­ленный ответ:

ПЕРЕЛЕТ
НЕДОЛЕТ

Если же мы вместо a>=30 напишем a>30, то при вводе числа 30 мы вообще не получим от
компьютера никакого ответа.

                Задание
27:

Человек вводит с клавиатуры строку, смысл которой —
приветствие при встрече. Компьютер тоже должен ответить приветствием. Отвечать
нужно в соответствии со следующей таблицей:

ПРИВЕТСТВИЕ ЧЕЛОВЕКА

ОТВЕТ КОМПЬЮТЕРА

Привет

Привет

Здравствуйте

Здравствуйте

Здорово

Здравствуйте

Добрый день

Салют

Приветик

Салют

Салют

Салют

Здравия желаю

Вольно

Скачано с www.znanio.ru

 
VictorT ©
 
(2004-04-23 15:24)
[0]

Задача про разборчивую принцессу

Некая привередливая принцесса долго не могла выбрать себе жениха. Наконец папино терпение лопнуло, и он сказал: «Сегодня же пойдёшь под венец!»

Выбор происходит так. На зов короля съехалось ровно N женихов. Женихи выстроились в очередь, по одному предстают перед принцессой, изливают ей душу и демонстрируют свои рыцарские качества и достоинства. После чего немедленно требуют ответа. Получив отказ, оскорблённый жених выбегает из дворца, вскакивает на коня и мчится прочь, так что вернуться к уже рассмотренной кандидатуре у принцессы нет возможности. Если отвергнуты все, то принцесса автоматически выходит замуж за последнего.

Предположим, что принцесса некоторым образом выставляет кандидатам оценку, причём неограниченную сверху, т.е. каким бы хорошим ни был претендент, есть шанс, что найдётся ещё лучше. Цель принцессы — выбрать самого лучшего. Известно только число женихов, про их оценки неизвестно ничего.

Самая простая тактика — выбрать первого попавшегося, с вероятностью 1/N он окажется лучшим. К сожалению, с ростом числа N эта вероятность стремится к нулю.

Вопрос: существует ли лучшая тактика, дающая вероятность, скажем, хотя бы 10% при любом N?

http://deep.webm.ru/forum/reply.php?num=4.1&id=98426


 
Dmitriy O. ©
 
(2004-04-23 15:51)
[1]

Методом статистического выборочного анализа.
См  «Статистический приемочный контроль по альтернативному признаку»
«Планы статистического приемочного контроля»
Есть методика как на основе определенной статистически достоверной выборки оценить всю партию.
Т.е. имеем партию женихов на основе берем случайную выборку женихов на основании ее оцениваем «Качество» всей партии.
Потом нам остается дождаться жениха который превышает (тут есть небольшой риск) или равняется этому качеству.
Соответственно по закону распределения можно составить таблицу риска т.е. уровень превышения качества партии и вероятность обнаружения такого жениха. Я думаю что нужно взять качество партии+3 сигмы. Тогда мы получим вполне достойного жениха с вероятностью с 99.5 %


 
pasha_golub ©
 
(2004-04-23 15:54)
[2]

Dmitriy O. ©   (23.04.04 15:51) [1]
Ого, во второй раз.


 
Vit@ly ©
 
(2004-04-23 16:01)
[3]

> Dmitriy O. ©   (23.04.04 15:51) [1]
Основная (главная) сложность в определении 3-х сигм. Поскольку (как мне представляется) характеристики женихов не всегда (и зачастую) не являются количественными, и в этом случае необходимо применять непараметрические критерии оценки. А в остальном поностью согласен.


 
Dmitriy O. ©
 
(2004-04-23 16:06)
[4]


> Vit@ly ©   (23.04.04 16:01)
Согласен хотя в условии сказанно:

> некоторым образом выставляет кандидатам оценку, причём неограниченную
> сверху,
Если эта отценка имеет размерный характер  совокупности характеристик кондидадта то можно рассчитать и среднеквадратичное отклонение.


 
Vit@ly ©
 
(2004-04-23 16:11)
[5]

> Dmitriy O. ©   (23.04.04 16:06) [4]
Если условие задачи понимать так, то почти убедил и сдамся


 
Vit@ly ©
 
(2004-04-23 16:24)
[6]

Смущает

> После чего немедленно требуют ответа. Получив отказ, оскорблённый
> жених выбегает из дворца, вскакивает на коня и мчится прочь,
> так что вернуться к уже рассмотренной кандидатуре у принцессы
> нет возможности.

и соответсвенно выбор стратегии :(
В такой ситуации, на мой взгляд важен и порядок представления женихов, о котором в постановке задачи я к сожалению ничего для себя не заметил (возможно я и не прав, или автор поста не дословно представил задачу — в чем я сильно для себя сомневаюсь)


 
Dmitriy O. ©
 
(2004-04-23 16:33)
[7]


> Vit@ly ©   (23.04.04 16:24)
То что он (жених) убегает нет ни чего страшного. Кстати такой метод отценки и был разработан имеено для разрушабших методов контроля. Скажем для оценки партии снарядов. Т.е. обьект испытывался и выкидывался (жених уезжает).
Вощем все это разработанно давным давно а применнено американцами еще в 40 годах . Именно они составили так называемые «оперативные планы приема».


 
Фикус ©
 
(2004-04-23 16:37)
[8]

Dmitriy O. ©, а ты еще тот жук :)))


 
Матлабист
 
(2004-04-23 17:24)
[9]

Если можно, математический вывод вероятности… К тому же в условии говориться не о достойном кандидате, а о лучшем… Да, и никаких предположений о равномерности распределения оценки делать не следует — достаточно знать, что из двух женихов один предпочтительнее и это свойство транзитивно


 
Матлабист
 
(2004-04-23 17:28)
[10]

равномерности = нормальности


 
Матлабист
 
(2004-04-23 18:45)
[11]

Да, еще… Рассуждения Dmitriy O. становятся в корне неверными, если учесть, что оценка N-го кандидата может зависеть от оценок предшествующих кандидатов. Например, если принцесса руководствуется таким правилом:
 Оценка первого кандидата = 1.
 Если кандидат наилучший среди просмотренных ранне, то его оценка равна оценке прошлого наилучшего кандидата + 1
 Если кандидат наихудший, то его оценка равна оценке прошлого наихудшего кандидата, деленной на два
 Если новый кандидат попадает между i-м и (i+1)-м кандидатом, то его оценка равна среднему арифметическому оценок i-го и (i+1)-го кандидатов.

Я молчу про то, что в случае 20-ти женихов если в качестве выборки выбрать десять первых (что уже мало), то вероятность того, что наилучший находится в первой половине уже 50%. Там что число 99.5% взято просто от потолка ;)


 
VictorT ©
 
(2004-04-29 12:02)
[12]

Ну и? Есть ещё мысли? Рассуждения Дмитрия О. меня не убедили, слишшком туманны… А на дремучих вообще сьехал, когда начал задавать конкретные вопросы…

Из асечного разговора… мож кого натолкнёт на какие-то мысли…

VictorT 27.04.2004 14:17 Задача про разборчивую принцессу

   Некая привередливая принцесса...........................
KnightWill 27.04.2004 14:21 :-)))))))
VictorT 27.04.2004 14:21 а решить?
KnightWill 27.04.2004 14:37 интересно... я в размышлениях :-)
KnightWill 27.04.2004 14:44 м-да... в жизни проще, чем в этой задаче :-)
VictorT 27.04.2004 14:44 :)))
KnightWill 27.04.2004 15:37 если без формул, то можно тактику предложить такую: сперва принцесса принимает партию женихов в числе M=kN (k<1). всем им даёт отказ, но при этом каждому выставляет оценку Ai (i=1,...,M). На основе этого набора данных можно вычислить среднюю оценку <A> , а так же максимальную из данной выборки: Amax(1,M). Реально жениха ей придётся выбирать из оставшихся N-M=(1-k)N, руководствуясь значениями <A>, Amax(1,M).... При таком подходе вероятность точно не будет стремиться к нулю при бесконечном увеличении N, но тут уже надо писать формулы... :-))
VictorT 27.04.2004 15:38 ну что- то вроде мысли... но окончательного логического завершения в формулах нет...
VictorT 27.04.2004 15:39 http://deep.webm.ru/forum/reply.php?num=4.1&id=98426
KnightWill 27.04.2004 15:39 мне надо дать конкретные формулы?
VictorT 27.04.2004 15:40 ну, наверно...
VictorT 27.04.2004 15:41 ну в общем то нужно док-во, что при такой-то тактике вероятность выбора лучшего есть 10%
VictorT 27.04.2004 15:42 > Реально жениха ей придётся выбирать из оставшихся N-M=(1-k)N, руководствуясь значениями <A>, Amax(1,M)....
 к примеру, как именно руководствоваться?
VictorT 27.04.2004 15:44 какой коеф-нт k
KnightWill 27.04.2004 15:46 во-первых, стоит подсчитать вероятность того, что Amax(1,M)>Amax(M+1,N)
 (Amax(1,N) - максимальная оценка, то есть идеальный жених)
KnightWill 27.04.2004 15:47 коэффициент k придётся оптимизировать :-) на основе каких уравнений - надо думать :-)
KnightWill 27.04.2004 15:48 либо  Amax(1,N)=Amax(1,M), либо  Amax(1,N)=Amax(M+1,N) :-)
VictorT 27.04.2004 15:49 P( Amax(1,M)>Amax(M+1,N)) = M/N
KnightWill 27.04.2004 15:49 гут :-)
VictorT 27.04.2004 15:50 я вот считал, считал, и в результате всё у меня сократилось :)
KnightWill 27.04.2004 15:51 и что 10% действительно такое уникальное число? :-) (во что я не очень-то верю)
VictorT 27.04.2004 15:51 ну 10% наверно для примера...
KnightWill 27.04.2004 15:52 вобщем, я могу ещё подумать над формулами... критерия, действительно пока нет
VictorT 27.04.2004 15:52 я так думаю, что для конкретного N есть какая-то конкретная вероятность...
KnightWill 27.04.2004 15:52 есть пока только параметры от которых "можно отталкиваться"
KnightWill 27.04.2004 16:51 вообще говоря, не факт, что среди оставшихся N-M женихов будут те, оценки которых окажутся выше <A>. То есть вероятность вообще найти "положительного" (с оценкой Ai> <A>, i=M+1,...,N) - 1/2. Может принцессе стоило бы радоваться уже такому случаю? :-)


 
Vlad Oshin ©
 
(2004-04-29 12:25)
[13]

Метод испытаний

имеем массив [1..n] of тип_;

цикл_кол-во_ испытаний начать

заполняем массив случайным образом числами, находим среди них МАКСИМУМ, откидываем первых Y<N чисел, запомнив максимум из откинутых. Следующее же число, большее(или равное) из откинутых, ВЫБОР(если такого нет, это испытание уже неудачно, гото 1).
ВЫБОР сравниваем с МАКСИМУМОМ, ведем статистику когда (ВЫБОР=МАКСИМУМ)
1:
цикл_кол-во_ испытаний закончить

вероятность = (кол-во когда ВЫБОР=МАКСИМУМ)/кол-во испытаний


 
VictorT ©
 
(2004-04-29 12:30)
[14]


> заполняем массив случайным образом числами, находим среди
> них МАКСИМУМ


Мы не можем это сделать по условиям задачи


 
Vlad Oshin ©
 
(2004-04-29 12:30)
[15]

кол-во испытаний положим достаточно большим


 
Vlad Oshin ©
 
(2004-04-29 12:31)
[16]


> VictorT ©   (29.04.04 12:30) [14]

принцесса не может, мы — можем


 
VictorT ©
 
(2004-04-29 12:32)
[17]

ой, сорри, протормозил, не понял, что ты вероятность считаешь статистическим методом… та придирка не в счёт


 
Матлабист
 
(2004-04-29 12:50)
[18]

И чему равно при N -> infinity ?


 
Vlad Oshin ©
 
(2004-04-29 12:51)
[19]

по сути Р(следующее большее за максимальным из X<N = максимальное из N), должно как-то не очень сложно решаться

но я, с 11ого раза теорию вероятности сдавший, в аналитичекских выкладках не вспомню ничего

…забыл даже ту малость латыни, которую не знал (с):)


 
Vlad Oshin ©
 
(2004-04-29 12:54)
[20]


> Матлабист   (29.04.04 12:50) [18]

думаю, N не больше (~6млрд. )/2 :)


 
Рамиль ©
 
(2004-04-29 13:01)
[21]

ИМХО, при такой постановке задачи ни о какой вероятности речи быть не может. Ее здесь нет.


 
Vlad Oshin ©
 
(2004-04-29 13:05)
[22]


> Рамиль ©   (29.04.04 13:01) [21]

есть


 
Vlad Oshin ©
 
(2004-04-29 13:44)
[23]

испытаний 100000

Женихов-, сразу послали-, вероятность
20-,0-,0,05
20-,1-,0,19
20-,2-,0.27
20-,3-,0.32
20-,4-,0.36
20-,5-,0.38
20-,6-,0,4
20-,7-,0,41
20-,8-,0,41
20-,9-,0,4
20-,10-,0,39
20-,11-,0,36
20-,12-,0,34
20-,13-,0,31
20-,14-,0,28
20-,15-,0,24
20-,16-,0,2
20-,17-,0,15
20-,18-,0,1
20-,19-,0,5
20-,20-,0

подозреваю также, что колво женихов не причем
тестил на 50, но писать долго :)
картина стратегии в принципе ясна

(что и было мной сказано у Дремучего в первом же посте, сразу после задачи, только без проверки)


 
Vlad Oshin ©
 
(2004-04-29 13:45)
[24]


> 20-,19-,0,5

20-,19-,0,05


 
Vlad Oshin ©
 
(2004-04-29 13:53)
[25]


> думаю, N не больше (~6млрд. )/2 :)

N не больше (~6млрд. )/2 — 1

ну-ка ее :)


51

VAR a : Real;

BEGIN

ReadLn (a);

if a>28 then

if a<30 then WriteLn (‘ПОПАЛ’)

else WriteLn (‘НЕ ПОПАЛ’)

else

WriteLn (‘НЕ ПОПАЛ’)

END.

Как компьютер не запутается в этих then и else? Если внимательно присмотреться, то можно увидеть, что двусмысленная ситуация получается только тогда, когда один из if записан без else, а другой — с else. Пример:

d:=3; v:=10;

if v<6 then if v<20 then d:=1 else d:=2

Чему будет равняться d после выполнения этого фрагмента — 1, 2 или 3? Ответ зависит от того, какому if

принадлежит else —

if v<6 или if v<20 ? Чтобы ответить на этот вопрос, пойдем по тексту программы от

интересующего нас else к началу и если по пути нам не встретится еще один else. то первый же if, на который мы наткнемся — наш. Если по пути нам встретится еще один else, забудем пока про наш else и найдем сначала if для нового else, а со старым разберемся потом.

Испытайте-ка этот способ в нашем фрагменте и в предыдущей программе. Получается, что else в нашем примере принадлежит if v<20 и значит, d будет равняться 3.

Задание 25: Усложним задание из 5.2: В компьютер вводятся длины трех отрезков. Компьютер должен от-

ветить на вопрос, правда ли, что эти отрезки могут образовать треугольник.

Указание: Для этого каждый отрезок должен быть меньше суммы длин двух других отрезков.

_____________ _ _____________

На первый взгляд применение if внутри if создает громоздкую, трудную для понимания программу. Однако, если вы будете аккуратно использовать ступенчатую запись, то программа получится достаточно обозримой.

В Паскале, тем не менее, есть возможность записывать многие программы со вложенными друг в друга if короче и понятнее, используя только один if. Для этого используются логические операции.

Задача «Разборчивая принцесса». В прихожей у принцессы — длинная очередь женихов. Принцессе нравятся только голубоглазые маленького роста. Устав принимать женихов и отбирать из них подходящих, принцесса вместо себя поставила компьютер, написав для него программу, которая говорит ВЫ МНЕ ПОДОЙДЕТЕ тем, у кого цвет глаз голубой и рост меньше 140 см. Остальным программа говорит ДО СВИДАНИЯ.

Вот эта программа:

VAR Tsvet :String;

{Цвет}

Rost :Integer;

{Рост}

BEGIN

WriteLn (‘Каков цвет ваших глаз?’);

ReadLn (Tsvet);

WriteLn (‘Введите ваш рост в сантиметрах’);

ReadLn (Rost);

if (Tsvet =’Голубой’) AND (Rost<140)

{Если цвет голубой И рост<140}

then

WriteLn (‘ВЫ МНЕ ПОДОЙДЕТЕ’)

else

WriteLn (‘ДО СВИДАНИЯ’)

END.

Мы видим, что условие в операторе if уже не такое простое, как мы описывали раньше, а сложное, то есть состоящее из двух взятых в скобки условий6, соединенных знаком логической операции AND (читается «энд», переводится «и»). Весь оператор if можно прочесть так — если цвет глаз голубой И рост меньше 140 сантиметров, то печатай ВЫ МНЕ ПОДОЙДЕТЕ, иначе печатай ДО СВИДАНИЯ.

Знак логической операции AND, поставленный между двумя условиями, говорит о том, что должны выполняться сразу оба эти условия.

Поэтому наш оператор if ответит ДО СВИДАНИЯ и высоким голубоглазым и высоким неголубоглазым и маленьким неголубоглазым. И лишь маленьким голубоглазым он ответит ВЫ МНЕ ПОДОЙДЕТЕ.

Программа для задачи ПОПАЛ — НЕ ПОПАЛ при использовании логических операций значительно упростится:

6 В скобки условия нужно брать потому, что «приоритет» операции AND выше, чем у операций сравнения «=» и «<», то есть она выполняется раньше них, точно так же, как, скажем, умножение выполняется раньше сложения. В Паскале все арифметические, логические и другие операции объединены в единую систему приоритетов. Рассмотрение этой системы выходит за рамки книги.

52

VAR a :Real;

BEGIN

ReadLn (a);

if (a>28) AND (a<30) then WriteLn (‘ПОПАЛ’) else WriteLn (‘НЕ ПОПАЛ’)

END.

Задача «Неразборчивая принцесса». Неразборчивой принцессе нравятся все маленькие независимо от цвета глаз и все голубоглазые независимо от роста. Программа неразборчивой принцессы будет отличаться от программы разборчивой одним единственным знаком логической операции:

if (Tsvet =’Голубой’) OR (Rost<140) {Если цвет голубой ИЛИ рост<140} Знак логической операции OR читается «о», переводится «или».

Поставленный между двумя условиями, знак OR говорит о том, что достаточно, если будет выполняться хотя бы одно из них.

Поэтому теперь оператор if ответит ВЫ МНЕ ПОДОЙДЕТЕ и высоким голубоглазым и маленьким голубоглазым и маленьким неголубоглазым. И лишь высоким неголубоглазым он ответит ДО СВИДАНИЯ.

Знаками AND и OR можно объединять сколько угодно условий. Например: if (a>2) OR (x=b) OR (c<>1) then k:=99 else k:=33

Здесь выполнится оператор k:=99, если верно хотя бы одно из трех условий, и лишь когда все три неверны, будет выполняться оператор k:=33.

Кроме логических операций AND и OR применяется еще логическая операция NOT (читается «нот», переводится «не»). Запись if NOT(a>b) then… переводится так — ЕСЛИ НЕПРАВДА, ЧТО a больше b, ТО…. Вот фрагмент:

a:=2; b:=3; if NOT(a>b) then k:=1 else k:=0

Здесь выполнится оператор k:=1, так как неправда, что 2>3.

Для простоты примем правило, что условия, к которым применяются логические операции, заключаются в круглые скобки, хотя это не всегда обязательно.

Внутри скобок можно писать не только простые, но и сложные условия. Например, фрагмент if NOT ((a>2) AND (b>3)) AND (s>8)) then… можно перевести так — если неправда, что одновременно верны три условия — a>2, b>3, s>8, то…

Примеры:

ФРАГМЕНТ

РЕЗУЛЬТАТ

a:=8;

b:=6;

if (a>b) AND (b>7)

then k:=1

else k:=0

k=0

a:=8;

b:=6;

if (a>b)

OR

(b>7)

then k:=1

else k:=0

k=1

a:=8;

b:=6;

if

(a<b)

OR

(b>7)

then k:=1

else k:=0

k=0

a:=8;

b:=6;

if

NOT (a=8)

then k:=1

else k:=0

k=0

Задание 26: «Замысловатая принцесса». Определите, кто нравится принцессе, по фрагменту из ее программы:

if (Tsvet =’Черный’) AND ((Rost<180) OR (Rost>184)) then WriteLn (‘ВЫ МНЕ ПОДОЙДЕТЕ’) else WriteLn (‘ДО СВИДАНИЯ’)

До сих пор мы применяли оператор if для выбора одной из двух возможностей. Покажем, как применять его для выбора одной из нескольких. Усложним нашу задачу про ПОПАЛ — НЕ ПОПАЛ:

Человек вводит в компьютер число. Если оно находится в интервале от 28 до 30, то нужно напечатать текст ПОПАЛ, если оно больше или равно 30 — то ПЕРЕЛЕТ, если оно находится на отрезке от 0 до 28, то НЕДОЛЕТ, если число меньше нуля — НЕ БЕЙ ПО СВОИМ.

Вот программа:

VAR a : Real;

BEGIN

ReadLn (a);

if (a>28) AND (a<30)

then WriteLn (‘ПОПАЛ’);

if a>=30

then WriteLn (‘ПЕРЕЛЕТ’);

if (a>=0) AND (a<=28)

then WriteLn (‘НЕДОЛЕТ’);

if a<0

then WriteLn (‘НЕ БЕЙ ПО СВОИМ’)

END.

53

Необходимо обращать внимание на аккуратную расстановку знаков сравнения и числовых границ диапазонов. Если во втором if вместо a>=30 мы напишем a>=20, то при вводе числа 25 компьютер даст нам двусмысленный ответ:

ПЕРЕЛЕТ

НЕДОЛЕТ

Если же мы вместо a>=30 напишем a>30, то при вводе числа 30 мы вообще не получим от компьютера никакого ответа.

Задание 27:

Человек вводит с клавиатуры строку, смысл которой — приветствие при встрече. Компьютер тоже должен ответить приветствием. Отвечать нужно в соответствии со следующей таблицей:

ПРИВЕТСТВИЕ ЧЕЛОВЕКА

ОТВЕТ КОМПЬЮТЕРА

Привет

Привет

Здравствуйте

Здравствуйте

Здорово

Здравствуйте

Добрый день

Салют

Приветик

Салют

Салют

Салют

Здравия желаю

Вольно

5.6. Символьный тип данных Char

Для того, чтобы получить более полное представление о возможностях оператора варианта case, который нам предстоит изучить, познакомимся сначала с новым типом данных. Мы с вами уже познакомились с четырьмя типами данных в Паскале: Integer и LongInt (целые числа), Real (вещественные числа) и String (строки символов). Введем еще один тип — Char (символьный). По-английски Char читается — «кэр», это сокращение от Character — «символ».

Описание VAR a,b: Char означает, что переменные a и b имеют право принимать значения любых символов, с которыми может работать компьютер. (О символах мы говорили в 3.5) Мы можем записать a:=’Л’; b:=’+’, что означает приказ присвоить переменной a значение символа Л, а переменной b — значение символа +. Мы можем записать ReadLn (a) , что означает приказ компьютеру ждать ввода с клавиатуры любого одного символа и присвоить его значение переменной a. Мы можем записать WriteLn (b) и на экране появится плюсик.

Вот программа, переворачивающая любое трехбуквенное слово, введенное человеком с клавиатуры:

VAR c1,c2,c3: Char;

BEGIN

ReadLn (c1,c2,c3);

WriteLn (c3,c2,c1)

END.

Если мы по оператору ReadLn введем символы ТОК, то оператор WriteLn напечатает КОТ. При вводе нескольких символов одним оператором ReadLn, все символы набираются на клавиатуре подряд, без пробелов, которыми мы привыкли разделять при вводе числовые данные. После ввода последнего символа нажимаем клавишу Enter. Таким образом, ввод трех символов одним оператором ReadLn не отличается от ввода одной трехсимвольной строки. Вообще, тип Char похож на тип String. Строка состоит из символов, да и сам символ — это как бы очень короткая строка длиной в один символ.

5.7.Оператор варианта case

ВПаскале есть специальный оператор, который позволяет делать выбор одной из нескольких возможностей. Рассмотрим программу, спрашивающую у ученика его отметку по чистописанию и реагирующую на нее подходящим текстом:

VAR Otmetka: Integer;

BEGIN

WriteLn (‘Какую отметку ты получил по чистописанию?’);

ReadLn (Otmetka);

CASE otmetka OF {Перевод: В СЛУЧАЕ ЕСЛИ отметка РАВНА…}

54

1,2 :WriteLn(‘Кошмар!’);

3:WriteLn(‘Неважно’);

4:WriteLn(‘Неплохо’);

5:WriteLn(‘Молодец!’);

ELSE WriteLn(‘Таких отметок не бывает’)

END

{Конец оператора CASE}

END.

Основой программы является оператор варианта CASE (читается «кэйс», переводится «случай»). Предлог OF читается «эв». Весь оператор CASE нужно понимать так:

В СЛУЧАЕ ЕСЛИ отметка РАВНА

1

или 2

печатай ‘Кошмар!’

3

печатай ‘Неважно’

4

печатай ‘Неплохо’

5

печатай ‘Молодец!’

ИНАЧЕ

печатай ‘Таких отметок не бывает’

КОНЕЦ оператора case

В процессе исполнения оператора case компьютер сравнивает значение переменной Otmetka по очереди со всеми значениями, перечисленными перед двоеточиями. Наткнувшись на совпадающее значение, он выполняет оператор, стоящий после двоеточия. На этом исполнение оператора case завершается. Если же совпадающего значения так и не нашлось, то выполняется оператор, стоящий после слова else (в нашей программе он полезен на тот случай, если ученик болен манией величия и вводит число 6). После else может стоять и цепочка операторов, записанных через точку с запятой.

Если вы еще недостаточно хорошо поняли логику оператора case, то обратите внимание на то, что в нашей программе он работает так же, как следующий оператор if:

if (Otmetka=1) OR (Otmetka=2) then WriteLn(‘Кошмар!’) else if Otmetka=3

then WriteLn(‘Неважно’) else if Otmetka=4

then WriteLn(‘Неплохо’) else if Otmetka=5

then WriteLn(‘Молодец!’)

else WriteLn(‘Таких отметок не бывает’)

У оператора case есть существенное ограничение — переменная, стоящая после слова case, должна быть так называемого порядкового типа. Подробно о порядковых типах мы поговорим в Глава 12, пока же мы знаем три типа, относящиеся к порядковым — это Integer, LongInt и Char. Порядковыми они называются потому, что все

их возможные значения можно выстроить по порядку и перечислить с начала до конца: -32768,

….4,5,6,7,8…

32767 для Integer,

…..‘д’,’е’,’ж’,’з’,’и’…. для Char. Получается, что значения типов Real и String применять в опе-

раторе case нельзя, так как совершенно непонятно, как их перечислять по порядку.

Таким образом, задачу про ПОПАЛ-НЕ ПОПАЛ в принципе невозможно решить при помощи

case. И этому

две причины: 1)переменная имеет тип Real,

2)перед двоеточием в операторе case нельзя писать условия со

знаками >, < и т.п.

Вот еще пример программы с оператором case:

VAR a,k : Integer;

BEGIN

a:=3;

case a*a+1 of

{В СЛУЧАЕ ЕСЛИ a*a+1

РАВНО…}

8,3,20

:k:=0;

7,10

:begin k:=1; WriteLn(k) end;

12 ..18

:k:=3

end

{Конец оператора CASE}

END.

Эта программа напечатает 1. Здесь мы видим несколько новых для нас элементов:

Во-первых, после слова case стоит не переменная, а выражение, поэтому с перечисленными перед двоеточиями значениями будет сравниваться число 10, полученное как 3*3+1. Кстати, выражение тоже обязано быть порядкового типа (о том, что такое тип выражения, мы строго поговорим в 14.4, а сейчас скажем только, что это выражение, имеющее значения порядкового типа).

Во-вторых, один из операторов, стоящих после двоеточий, составной. Это begin k:=1; WriteLn(k) end В-третьих — конструкция 12 ..18 . Она обозначает то же, что и 12,13,14,15,16,17,18. Она служит в нашем

случае для сокращения записи и называется диапазоном.

55

В-четвертых, здесь отсутствует конструкция else. Это значит, что если бы в нашей программе мы вместо a:=3 написали a:=0, то оператор case, не найдя совпадения, не выбрал бы ни один из трех своих вариантов и, не найдя также else, завершил бы свою работу, так ничего и не сделав.

Задание 28:

Ученик вводит с клавиатуры букву русского алфавита. Компьютер должен сказать, какая это буква — гласная, согласная звонкая, согласная глухая или другая какая-нибудь (можно и НЕ ЗНАЮ).

Задание 29: «Калькулятор». Ученик вводит с клавиатуры число, символ арифметического дей-

ствия (+, -, *, /) и еще одно число. Компьютер должен напечатать результат. Указание: Используйте три оператора

ReadLn.

56

Глава 6. Циклические программы

6.1. Оператор перехода GOTO. Цикл. Метки

Цикл – главное средство заставить компьютер много раз сделать одно и то же или похожее. Первое представление о цикле я дал в 2.8. Посмотрим, как осуществить цикл на Паскале. Предположим, мы хотим, чтобы компьютер бесконечно повторял выполнение следующего фрагмента:

Write (‘Это ‘);

Write (‘тело ‘);

Write (‘цикла’);

Write (‘

‘)

в результате чего на мониторе мы бы увидели:

Это тело цикла Это тело цикла Это тело цикла Это тело цикла . . . .

Большинство языков программирования (в том числе и Паскаль) устроены так, что операторы выполняются в том порядке, в котором они записаны. Это значит, что после оператора Write (‘Это ‘) обязательно выполнит-

ся оператор Write (‘тело ‘), а после него — Write (‘цикла’), а после него — Write (‘

‘). Все это хорошо. Но нам

нужно, чтобы после выполнения оператора Write (‘

‘) Паскаль нарушал этот свой принцип последовательного

выполнения операторов и выполнял бы оператор Write (‘Это ‘). Если мы этого добьемся, то дальше все пойдет само собой, так как после Write (‘Это ‘) Паскаль автоматически выполнит Write (‘тело ‘) и так далее до бесконечности.

Если бы операторы Паскаля можно было писать по-русски, то для достижения нашей цели было бы естественно воспользоваться такой конструкцией:

метка m1:

Write (‘Это ‘);

Write (‘тело ‘);

Write (‘цикла’);

Write (‘

‘);

иди к оператору, помеченному меткой m1

Здесь мы видим новый для нас «оператор» ИДИ, который выполняется после Write (‘ ‘) и единственная работа которого заключается в том, чтобы заставить компьютер перескочить к выполнению оператора Write (‘Это ‘), помеченного меткой m1.

А вот как этот фрагмент выглядит реально на Паскале:

m1: Write (‘Это ‘); Write (‘тело ‘); Write (‘цикла’); Write (‘ ‘);

GOTO m1

Здесь GOTO — оператор перехода, читается » ‘гоуту», переводится «иди к», m1 — метка.

Метка — это произвольное имя или произвольное не слишком большое целое положительное число. Оператор GOTO можно писать в любых местах программы и метку можно ставить перед любым оператором ,заставляя компьютер таким образом перескакивать в программе откуда угодно куда угодно (правда, в сложных программах и внутри сложных операторов эта свобода перескакивания существенно ограничивается. Метка должна отделяться от оператора двоеточием.

Мы пока знаем, что переменная, встречающаяся в программе, должна быть описана выше BEGIN после слова VAR. Метки, встречающиеся в программе, тоже должны быть описаны выше BEGIN после слова LABEL (читается «лэйбл», переводится «метка»).

Вот наша программа полностью:

LABEL m1;

BEGIN

m1:Write (‘Это ‘); Write (‘тело ‘); Write (‘цикла’);

57

Write (‘ ‘); goto m1

END.

Если вы уже запустили эту программу, то через некоторое время перед вами должен встать жизненно важный вопрос – как же ее остановить? Для этого достаточно прочесть параграф «Выполнение программы» из части IV. Вот вкратце, что вам нужно оттуда знать:

Для прерывания работы программы (в том числе и зациклившейся) существует комбинация клавиш Ctrl-Break (имеется в виду, что, удерживая нажатой клавишу Ctrl,

вы должны щелкнуть по клавише Break). На экран возвращается окно редактора. Строка программы, на которой она была прервана, выделяется полосой белого цвета. Если вы снова запустите программу, она продолжит работу с прерванного места. Чтобы начать сначала, уберите полосу с экрана клавишами Ctrl-F2.

Группа операторов, выполняющихся многократно, называется телом цикла. У нас это все операторы, начиная с Write (‘Это ‘) и кончая GOTO m1.

Пример программы:

LABEL 8;

VAR a,k : Integer;

BEGIN k:=6; a:=100; goto 8; a:=a+k; k:=2*k;

WriteLn(a);

8:a:=a+1;

k:=k+10; WriteLn(k,’ ‘ ,a);

END.

Эта программа напечатает 16 101. Операторы выполняются в такой последовательности:

k:=6;

a:=100; goto 8; a:=a+1; k:=k+10;

WriteLn(k,’ ‘ ,a);

А операторы a:=a+k; k:=2*k; WriteLn(a) выполнены не будут вообще, несмотря на то, что написаны. Задание 30: Определить без компьютера, что будет печатать программа:

LABEL m1,met5; VAR n,k : Integer;

BEGIN n:=10; k:=0;

WriteLn(‘Считаем зайцев’ ); met5:Write(n);

n:=n+k; goto m1; n:=n+1;

m1: Write(‘ зайцев ‘); ReadLn;

k:=k+1; goto met5;

WriteLn(‘Посчитали зайцев’)

END.

А теперь, уважаемый читатель, нам с вами пришла пора снова отвлечься от программирования и расширить свои знания о работе на компьютере. Сейчас вам необходимо проделать то, что сказано в части IV в параграфе «Работа с несколькими окнами» и пункте «Работа с окнами пользователя и отладчика» параграфа «Исправление ошибок. Отладка программы».

58

Задания 31-33:

Написать программы для выполнения следующих заданий:

31)Бесконечно печатать букву А: ААААААААААА…..

32)Бесконечно печатать 1000 999 998 997 996 ……

33)Бесконечно печатать 100 50 25 12.5…. с 8 десятичными знаками.

Примечание: Во всех программах используйте ReadLn для создания паузы на каждом цикле. Чтобы программа шла все-таки довольно быстро, нажмите клавишу ввода и не отпускайте.

6.2. Выход из цикла с помощью if

Интересно рассмотреть применение оператора goto внутри операторов if или case. Задача: При помощи цикла напечатать на экране:

Начало счета 3 5 7 9 Конец счета

Вот три варианта программы. Первый – самый простой, а второй и третий нам понадобятся в дальнейшем.

1 ВАРИАНТ

2 ВАРИАНТ

LABEL m;

LABEL m1,m2;

VAR

f : Integer;

VAR

f : Integer;

BEGIN

BEGIN

Write(‘Начало счета ‘);

Write(‘Начало счета ‘);

f:=3;

f:=3;

m:

Write(f,’ ‘);

m1:

Write(f,’

‘);

f:=f+2;

f:=f+2;

if f<=9 then goto m;

if f>9

then

goto m2

else

goto m1;

Write(‘ Конец счета’)

m2:

Write(‘ Конец счета’)

END.

END.

Вот в каком порядке выполняются операторы программы первого варианта:

Write(‘Начало счета ‘) f:=3 Write(f,’ ‘)

{печатается 3} f:=f+2 {f становится равным 5}

if f<=9 goto m Write(f,’

‘) {печ. 5} f:=f+2 {f = 7}

if f<=9 goto m

Write(f,’ ‘) {печ. 7} f:=f+2 {f = 9} if f<=9 goto m

Write(f,’ ‘) {печ. 9}

f:=f+2 {f = 11} if f<=9

Write(‘ Конец счета’)

Здесь оператор goto выполняется три раза. На четвертый раз условие f<=9 оказывается ложным и поэтому выполняется не goto, а следующий за if оператор Write(‘ Конец счета’), то есть программа выходит из цикла и завершает свою работу.

3 ВАРИАНТ

LABEL m1,m2,m3;

VAR

f : Integer;

BEGIN

Write(‘Начало счета ‘);

f:=3;

m1:

if f<=9

then

goto m3

else

goto m2;

m3:

Write(f,’

‘);

f:=f+2;

goto m1;

m2:

Write(‘ Конец счета’)

END.

Задания 34-36:

34)Напечатать 1 2 3 4 . . . 99 100 99 . . . 3 2 1.

35)«Таблицы Брадиса«- вычислить и напечатать с 6 десятичными знаками квадраты чисел 0.000 0.001 0.002

0.003 . . . 0.999 1.000.

59

36)Для х=2700, 900, 300, 100 . . . и т.д. вычислять и печатать y=x/4 + 20 и z=2y+0.23 до тех пор, пока yz не станет меньше 1/х.

Совет: Теперь, когда вы владеете отладочным режимом, смело применяйте его всякий раз, когда ваша программа не хочет делать то, что нужно. Зачем ломать голову над непослушной программой? – Берегите серое вещество, жмите F7!

6.3. Оператор цикла repeat

Циклы настолько широко применяются в программах, что у программистов давным-давно появилась потребность написать специальный оператор цикла, не использующий оператор goto, так как последний неудобен хотя бы тем, что у программистов, пишущих большие программы, много времени и внимания уходит на поиск взглядом меток в тексте программы.

В Паскале — три оператора цикла: repeat, while и for. Первым изучим оператор repeat.

Конструкция repeat . . . . . until a+2>3*b читается «ри’пит…..ан’тил…», а переводится «повторяй……до тех пор, пока a+2 не станет больше 3*b».

Составим с использованием оператора repeat программу решения задачи о печати чисел 3 5 7 9 из предыдущего параграфа. Для того, чтобы точно определить работу оператора repeat, приведем ее параллельно со вторым вариантом программы решения этой задачи из того же параграфа:

2 ВАРИАНТ

ВАРИАНТ С REPEAT

LABEL m1,m2;

VAR

f : Integer;

VAR f : Integer;

BEGIN

BEGIN

Write(‘Начало счета ‘);

Write(‘Начало счета ‘);

f:=3;

f:=3;

repeat

m1:

Write(f,’

‘);

Write(f,’ ‘);

f:=f+2;

f:=f+2;

if f>9

then

goto m2

until f>9;

else

goto m1;

m2:

Write(‘ Конец счета’)

Write(‘ Конец счета’)

END.

END.

Порядок работы обеих программ совершенно одинаков, так что можно считать слово repeat заменой метки

m1, а конструкцию until f>9 считать заменой оператора if f>9 then goto m2 else goto m1.

Синтаксис оператора repeat:

REPEAT оператор ; оператор ;. . . ; оператор UNTIL условие

Вкратце работу оператора repeat можно описать так: Повторяй выполнение операторов, стоящих между словами repeat и until, до тех пор, пока не станет истинным условие.

Более подробно работа оператора repeat описывается так:

Сначала компьютер по очереди выполняет операторы, стоящие после слова repeat, пока не дойдет до слова until, после чего проверяет истинность условия, стоящего после until. Если условие ложно, то компьютер снова по очереди выполняет эти операторы и снова проверяет истинность условия и т.д. Если условие оказывается истинным, то работа оператора repeat прекращается и компьютер переходит к выполнению следующего по порядку оператора.

Задача: Компьютер предлагает человеку ввести слово, после чего распечатывает это слово, снабдив его восклицательным знаком. Затем снова предлагает ввести слово и так до тех пор, пока человек не введет слово «Хватит». Распечатав его с восклицательным знаком, компьютер отвечает «Хватит так хватит» и заканчивает работу.

Придумаем строковую переменную, в которую человек будет с клавиатуры вводить слово. Назовем ее Slo-

vo.

VAR Slovo : String;

BEGIN repeat

60

WriteLn(‘Введите слово’); ReadLn(Slovo); WriteLn(Slovo, ‘!’)

until Slovo=’Хватит’; WriteLn(‘Хватит так хватит’)

END.

Задание 37: Усложним эту задачу. Пусть компьютер перед распечаткой каждого слова ставит его порядковый номер.

Задание 38-39: Выполнить с применением оператора repeat последние два задания из предыдущего параграфа.

Задание 40: Если камень бросить горизонтально со 100-метровой башни со скоростью v=20м/с, то его

расстояние от башни по горизонтали (s) будет выражаться формулой s=vt, где t – время полета камня в секундах. Высота над землей h будет выражаться формулой h=100 – 9.81t2/2. Вычислять и печатать t, s и h для t=0, 0.2, 0.4, 0.6 и так далее до тех пор, пока камень не упадет на землю.

6.4. Оператор цикла while

Синтаксис оператора while:

WHILE условие DO оператор

Слово while читается «вайл», слово do — «ду», вся конструкция переводится так — Пока условие истинно, делай оператор. Например, while a>b do b:=b+1.

Работает оператор while так:

Сначала компьютер проверяет истинность условия, стоящего после слова while. Если условие истинно, то выполняется оператор, стоящий после do. Затем снова проверяется истинность условия и в случае истинности снова выполняется этот оператор. И т.д. Если условие ложно, то оператор while прекращает свою работу и компьютер переходит к выполнению следующего оператора.

Оператор, стоящий после while, вполне может быть составным, поэтому тело цикла у оператора while, так же как и у оператора repeat, может состоять из многих операторов.

Решим при помощи while ту же задачу о печати чисел 3 5 7 9, что в предыдущем параграфе решили с помощью repeat. Для того, чтобы точно определить работу оператора while, приведем программу ее решения параллельно с третьим вариантом программы из 6.2:

3 ВАРИАНТ

ВАРИАНТ С WHILE

LABEL m1,m2,m3;

VAR

f : Integer;

VAR f : Integer;

BEGIN

BEGIN

Write(‘Начало счета ‘);

Write(‘Начало счета ‘);

f:=3;

f:=3;

m1:

if f<=9

then

goto m3

while f<=9 do

else

goto m2;

begin

m3:

Write(f,’

‘);

Write(f,’ ‘);

f:=f+2;

f:=f+2;

goto m1;

end;

m2:

Write(‘ Конец счета’)

Write(‘ Конец счета’)

END.

END.

Как видите, здесь после do стоит составной оператор begin Write(f,’ ‘); f:=f+2; end. Последовательность исполнения операторов и проверки условий в обеих программах совершенно аналогичны.

Типичная ошибка начинающих – небрежное обращение со знаками сравнения. Многие не видят большой разницы в том, как записать – while f<=9 или while f<9 , а затем, «недополучив» результат, удивляются, почему. И здесь лучшим средством для понимания является отладочный режим. Попробуйте ошибочный вариант последней программы (с while f<9) выполнить в пошаговом режиме с использованием окон пользователя и отладчика. Для этого введите в окно отладчика две вещи: переменную f и выражение f<9 (оно может иметь только два значения: true — истина и false — ложь, другими словами – «условие выполнено» и «условие не выполнено»).

Petro29

197 / 9 / 3

Регистрация: 30.04.2016

Сообщений: 733

1

30.12.2017, 09:55. Показов 1500. Ответов 1

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Программа DD «Разборчивая принцесса».
(со стр. 451. Самоучителя с Интернета).

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uses Crt;
var Zvet: String; {Цвет}
      Rost: integer; {Рост}
begin
ClrScr;
   write(' Каков цвет ваших глаз? ');
       readln(Zvet);
   write(' Введите ваш рост в см: ');
       readln(Rost);
   if (Zvet = ' голубой ') and (Rost < 140) then
      writeln(' Вы мне подойдёте. ');
         else writeln(' До свидания.');
     readln
end.

На выходе имеем:
1-й запуск:

Pascal
1
2
3
Каков цвет ваших глаз?  Голубой
Введите ваш рост в см:  120
До свидания.

2-й запуск:

Pascal
1
2
3
Каков цвет ваших глаз?  Серый
Введите ваш рост в см:  150
До свидания.

Почему первая часть условия не сраюатывает?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

30.12.2017, 09:55

Ответы с готовыми решениями:

Предприимчивая принцесса
«Следующий», — сказала принцесса и оценивающе посмотрела на очередного жениха.
Принцессе очень…

Принцесса и тигры
Король посадил за три двери два тигра и принцессу. На каждой двери по табличке. Табличка на первой…

Принцесса или тигр?
В некотором царстве правил король. Однажды он решил провести эксперимент над заключенными. В одну…

Принцесса хочет замуж
Вот такую задачку сегодня навеяло. Она довольно древняя, но любопытная.
Деспот-король объявил, что…

1

Puporev

Почетный модератор

64279 / 47578 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

30.12.2017, 11:16

2

В строке

Pascal
1
if (Zvet = ' голубой ') and (Rost < 140) then

уберите пробелы перед и после голубой.



0



Like this post? Please share to your friends:
  • Задача принятия решения в excel
  • Задача поиска кратчайшего пути excel
  • Задать формулой ссылку на ячейку в excel
  • Задать формат ячеек vba excel
  • Задать формат для ячейки в excel