Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Методические рекомендации для выполнения практических работ
В главе приведены рекомендации по применению операторов языка Турбо Паскаль и примеры близкие по теме с практическими заданиями. Тема 1: «Программы разветвленной структуры» Условный оператор Условный оператор позволяет проверить некоторое условие и в зависимости от результатов проверки выполнить то или иное действие. Таким образом, условный оператор - это средство ветвления вычислительного процесса. Структура условного оператора имеет следующий вид: IF <условие> THEN <оператор1> ELSE <оператор2>, где IF, THEN, ELSE - зарезервированные слова (если, то, иначе); <условие> - произвольное выражение логического типа; <оператор1>, <оператор2> - любые операторы языка Турбо Паскаль. Условный оператор работает по следующему алгоритму. Вначале вычисляется условное выражение <условие>. Если результат есть TRUE (истина), то выполняется <оператор1>, а <оператор2> пропускается; если результат есть FALSE (ложь), наоборот, <оператор1> пропускается, а выполняется <оператор2>. Например: var х, у, max: Integer; begin ....... if x > max then у := max else y := x; При выполнении этого фрагмента переменная Y получит значение переменной X, если только это значение не превышает МАХ, в противном случае Y станет равно МАХ. Часть ELSE <оператор2> условного оператора может быть опущена. Тогда при значении TRUE условного выражения выполняется <оператор1>, в противном случае этот оператор пропускается: var х, у, max: Integer; begin ....... if x > max then max := x; Y := x; В этом примере переменная Y всегда будет иметь значение переменной X,а в МАХ запоминается максимальное значение X. Поскольку любой из операторов <оператор1> и <оператор2> может быть любого типа, в том числе и условным, а в то же время не каждый из «вложенных» условных операторов может иметь часть ELSE <оператор2>, то возникает неоднозначность трактовки условий. Эта неоднозначность в Турбо Паскале решается следующим образом: любая встретившаяся часть ELSE соответствует ближайшей к ней «сверху» части THEN условного оператора [4]. Например: var a,b,c,d : Integer; begin a := 1; b := 2; c= 3; d := 4; if a > b then if с < d then if с < 0 then с := 0 else a := b; {а равно 1} if a > b then if с then if с then с := 0 else else else a := b; {а равно 2} Рассмотрим программу , которая вводит произвольное десятичное целое число в диапазоне 0...15, преобразует его к шестнадцатеричному и выводит на экран полученный результат. Пример Program Hex; {Программа вводит с клавиатуры целое число в диапазоне от 0 до 15, преобразует его к шестнадцатеричной системе счисления и выводит результат на экран} var n : Integer; {Вводимое число} ch : Char; {Результат} begin Write ( ',n = ' ) ; ReadLn(n); { Вводим число } {Проверяем число на принадлежность к диапазону 0...15} if (n >= 0) and (n <= 15) then begin {Да, принадлежит диапазону} if n < 10 then ch := chr(ord('0') + n) else ch := chr(ord('A') + n- 10); WriteLn('n = ',ch) end else {He принадлежит диапазону} WriteLn('Ошибка') end. В шестнадцатеричной системе счисления используется 16 цифр в каждом разряде: цифры 0...9 обозначают первые 10 возможных значений разряда, буквы A...F - остальные шесть. В программе учитывается непрерывность и упорядоченность множеств цифр 0...9, букв A...F и их кодов. Тема 2: «Программы циклической структуры» Пусть, например, в какой-то точке программы необходимо игнорировать все ранее нажатые клавиши, коды которых еще не прочитаны из буфера, т.е. необходимо очистить буфер. Этого можно достичь следующим способом: Uses CRT; var С: Char; begin while KeyPressed do С := ReadKey; ....... end. При использовании процедуры ReadKey необходимо учесть, что в клавиатурный буфер помещаются так называемые расширенные коды нажатых клавиш. Если нажимается любая алфавитно-цифровая клавиша, расширенный код совпадает с ASCII-кодом соответствующего символа. Например, если нажимается клавиша с латинской буквой «а» (в нижнем регистре), функция ReadKey возвращает значение chr (97), а если «А» (в верхнем регистре) - значение chr (65). При нажатии функциональных клавиш F1...F10, клавиш управления курсором, клавиш Ins, Home, Del, End, PgUp, PgDn в буфер помещается двухбайтная последовательность: сначала символ #0, а затем расширенный код клавиши. Таким образом, значение #0, возвращаемое функцией ReadKey, используется исключительно для того, чтобы указать программе на генерацию расширенного кода. Получив это значение, программа должна еще раз обратиться к функции, чтобы прочитать расширенный код клавиши. Т.е. код сканирования клавиши. Этот код определяется порядком, в соответствии с которым микропроцессор клавиатуры Intel 8042 периодически опрашивает (сканирует) состояние клавиш. Следующая простая программа позволит Вам определить расширенный код любой клавиши. Для завершения работы программы нажмите клавишу Esc. Uses CRT; var С: Char; begin repeat С := ReadKey; if C<>#0 then WriteLn(ord(C)) else WriteLnCO1 ,ord(ReadKey) :8) until C=#27 {27 - расширенный код клавиши Esc} end. Операторы цикла В языке Турбо Паскаль имеются три различных оператора, с помощью которых можно запрограммировать повторяющиеся фрагменты программ. Счетный оператор цикла FOR имеет такую структуру: FOR <пар_цик> := <нач_знач> ТО <кон_знач> DO <оператор>. Здесь FOR, TO, DO - зарезервированные слова (для, до, выполнить); <пар_цик> - параметр цикла - переменная типа INTEGER (точнее, любого порядкового типа, см. гл.4); <нач_знач> - начальное значение - выражение того же типа; <кон_знач> - конечное значение - выражение того же типа; <оператор> - произвольный оператор Турбо Паскаля. При выполнении оператора FOR вначале вычисляется выражение <нач_знач> и осуществляется присваивание <пар_цик> : = <нач_знач>. После этого циклически повторяется: проверка условия <пар_цик> <= <кон_знач>; если условие не выполнено, оператор FOR завершает свою работу; выполнение оператора <оператор>; наращивание переменной <пар_цик> на единицу. В качестве иллюстрации применения оператора FOR рассмотрим программу, осуществляющую ввод с клавиатуры произвольного целого числа N и вычисление суммы всех целых чисел от 1 до N . Пример Program Summ_of_Integer; {Программа вводит целое положительное число N и подсчитывает сумму всех целых чисел от 1 до N} var i, n, s : Integer; begin Write('N = '); ReadLn(n); . {Вводим N} s := 0; {Начальное значение суммы} for i : = 1 to n do {Цикл подсчета суммы} s : = s + i; writeln('Сумма = ',s) {Выводим результат} end. Отметим два обстоятельства. Во-первых, условие, управляющее работой оператора FOR, проверяется перед выполнением оператора <оператор>: если условие не выполняется в самом начале работы оператора FOR, исполняемый оператор не будет выполнен ни разу. Другое обстоятельство - шаг наращивания параметра цикла строго постоянен и равен (+1). Существует другая форма оператора: FOR<пар_цик>: = <нач_знач> DOWNTO <кон_знач> DO <оператор> Замена зарезервированного слова ТО на DOWNTO означает, что шаг наращивания параметра цикла равен (-1), а управляющее условие приобретает вид <пар_цик> = <кон_знач>. Предыдущий пример можно модифицировать так, чтобы сделать его пригодным для подсчета любых сумм - положительных и отрицательных: .................. s := 0; if n >= 0 then for i := 1 to n do s := s + i else for i := -1 downto n do s : = s + i ; ............... Два других оператора повторений лишь проверяют условие выполнения или повторения цикла, но не связаны с изменением счетчика цикла. Оператор цикла WHILE с пред проверкой условия: WHILE <условие> DO <оператор>. Здесь WHILE, DO - зарезервированные слова (пока [выполняется условие], делать); <условие> - выражение логического типа; <оператор> - произвольный оператор Турбо Паскаля. Если выражение <условие> имеет значение TRUE, то выполняется <оператор>, после чего вычисление выражения <условие> и его проверка повторяются. Если <условие> имеет значение FALSE , оператор WHILE прекращает свою работу. Рассмотрим пример, иллюстрирующий использование оператора WHILE. Найдем так называемое «машинное эпсилон» - такое минимальное, не равное нулю вещественное число, которое после прибавления его к 1.0 еще дает результат, отличный от 1.0. Пример Program EpsilpnDetect; {Программа вычисляет и выводит на экран значение "машинного эпсилон"} var epsilon: Real; begin epsilon := 1; while epsilon/2 + 1 > 1 do epsilon := epsilon/2 WriteLn('Машинное эпсилон = ',epsilon) end. У читателя, привыкшего к непрерывной вещественной арифметике, может вызвать недоумение утверждение о том, что в дискретной машинной арифметике всегда существуют такие числа 0<X<eps, что 1.0+Х=1.0. Дело в том, что внутреннее представление типа REAL может дать «лишь» приблизительно 1014 возможных комбинаций значащих разрядов в отведенных для него 6 байтах. Конечно же, это очень большое число, но оно несопоставимо с бесконечным множеством вещественных чисел. Аппроксимация бесконечного непрерывного множества вещественных чисел конечным (пусть даже и очень большим) множеством их внутреннего машинного представления и приводит к появлению «машинного эпсилон». Оператор цикла REPEAT... UNTIL с постпроверкой условия: REPEAT <тело_цикла> UNTIL <условие>. Здесь REPEAT, UNTIL- зарезервированные слова (повторять до тех пор, пока не будет выполнено условие); <тело_цикла> - произвольная последовательность операторов Турбо Паскаля; <условие> - выражение логического типа. Операторы <тело_цикла> выполняются хотя бы один раз, после чего вычисляется выражение <условие>: если его значение есть FALSE, операторы <тело_цикла> повторяются, в противном случае оператор REPEAT. . . UNTIL завершает свою работу. Для иллюстрации применения оператора REPEAT... UNTIL модифицируем программу из примера 2.3. Модификация (пример 2.7) состоит в том, что программа будет все время повторять цикл ввода символа и печати его кода до тех пор, пока очередным символом не будет символ CR (вводится клавишей Enter). Пример Program Codes_of_Chars; {Программа вводит символ и выводит на экран его код. Для завершения работы программы нужно дважды нажать Enter} var ch : Char; {Вводимый символ} const CR = 13; {Код символа CR} begin repeat ReadLn(ch); WriteLn(ch,' = ',ord(ch)) until ord(ch) = CR end. Обратите внимание: пара REPEAT... UNTIL подобна операторным скобкам begin. .. end, поэтому перед UNTIL ставить точку с запятой необязательно. Для гибкого управления циклическими операторами FOR, WHILE и REPEAT в состав Турбо Паскаля включены две процедуры: BREAK - реализует немедленный выход из цикла; действие процедуры заключается в передаче управления оператору, стоящему сразу за концом циклического оператора; CONTINUE - обеспечивает досрочное завершение очередного прохода цикла; эквивалент передачи управления в самый конец циклического оператора. Введение в язык этих процедур практически исключает необходимость использования операторов безусловного перехода GOTO. |
||
Последнее изменение этой страницы: 2018-05-29; просмотров: 146. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |