Решение 50 типовых задач по программированию на языке Pascal Дата размещения сборника в сети
Данил Душистов: «Решение 50 типовых задач по программированию на языке Pascal»
Download 1.52 Mb. Pdf ko'rish
|
Задачи на Pascal
- Bu sahifa navigatsiya:
- (L – M) * (R – M) > 0
Данил Душистов: «Решение 50 типовых задач по программированию на языке Pascal»
56 Составим произведение выражений (1) и (2) и обозначим его как (3): (M – L) * (M – R). В I-ом случае оно всегда положительно как произведение отрицательных чисел, во II-ом случае – также всегда положительно как произведение положительных чисел. Что же следует из этого выражения? А то, что если результат его вычисления – положительное число, то тройка элементов L, M, R образует «правильный зуб». И как мы помним, если все тройки соседних элементов последовательности образуют «правильные зубья», то она является пилообраз- ной. Так как в условии задачи на вход подается как минимум три элемента, мы можем прочитать их в одном операторе: read(L, M, R); Затем мы входим в цикл с предусловием R < > 0. В этом цикле мы должны исследовать каждую тройку L, M, R по свойству (3): while R <> 0 do begin if (L - M) * (R - M) <= 0 then break; L := M; M := R; read(R) end; На каждом шаге цикла мы сначала исследуем уже имеющуюся тройку (оператор 1 в теле цикла), и если выражение (3) оказывается равно или меньше нуля, то выходим из цикла, так как нашли «неправильный зуб», который нарушает условие пилообразной последовательности, в силу чего дальнейшая проверка бессмысленна. Затем нам нужно «сдвинуть» последовательность: напри- мер, если в переменных L, M, R у нас соответственно хранились 4-й, 5-й и 6-й элементы последо- вательности, которые мы уже проверили, то с помощью оператора L := M мы переносим 5-й эле- мент в L, а с помощью M := R переносим 6-й элемент в M. Далее мы вводим 7-й элемент в R, после чего в тройке L, M, R у нас содержатся соответственно 5-й, 6-й и 7-й элементы, проверка которых на соответствие условию будет произведена на следующем шаге цикла. На последнем шаге цикла последовательность будет в очередной раз «сдвинута» и в R будет введено число 0, после чего должен быть выведен результат. В связи с этим возможно два варианта попадания на этот этап: a) в цикле был осуществлен выход через break. А это значит, что в переменных L, M, и R в данном случае как раз находится «неправильный зуб» и можно обойтись выводом значения выражения (L – M) * (R – M) > 0, которое как раз даст значение false: writeln((L - M) * (R - M) > 0); b) последовательность была проверена до конца, и выход из цикла был осуществлен по вводу в R нуля. Но здесь нужно учесть, что при этом в тройке L, M, R теперь находится «несуще- ствующий зуб» (так как 0 не входит в саму последовательность и не должен учитываться при проверке), который может и не быть «правильным». Самый простой выход в этом случае – если переменная R равна 0, то заменить R на L. Это приведет к тому, что в выводимом на экран выражении (3) мы перемножаем не (1) и (2), а (1) и (1), что повлечет вывод true, так как мы получаем произведение одинаковых ненуле- вых чисел, которое всегда положительно. Значит, перед выводом выражения на экран необ- ходима следующая вставка: if R = 0 then R := L; Код: 1. program Saw; 2. 3. var |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling