Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Занятие 5. Оператор безусловного перехода Goto. Решение задач.
В языке принят естественный порядок выполнения программы: последовательный. Рассмотренные выше операторы if и case осуществляют переход к выполнению соответствующего оператора в зависимости от выполнения условия или предложенного выбора. Однако в практике программирования задач возникает необходимость безусловного перехода для выполнения нужной последовательности операторов. Например, необходимо обойти участок программы, а вернуться к нему позже. Для этого предназначен оператор безусловного перехода, который имеет следующую форму записи: goto метка; Метка представляет собою число без знака в диапазоне 1-9999 либо последовательность латинских букв и цифр. Перед использованием метка должна быть объявлена в разделе описания меток, который срузу следует за разделом описания используемых модулей: Uses Crt, Graph; Label Metka1, Metka2; Const P=3.14; Var x: integer; После описания метки ее можно использовать в программе. Метка записывается перед помечаемым оператором и отделяется от него двоеточием. А оператор goto должен помещен в то место программы, откуда выполняется переход. Оператор goto передает управление на оператор с заданной меткой. Оператор goto можно вставлять в любое место программы, где могут располагаться операторы языка. Например, Begin ... if Alpha = 360 then Goto Metka1 else writeln (‘Эта фигура – не окружность‘); ... Metka1: Arc(X, Y, 0, Alpha, R); ... End. Приведём пример уже знакомой Вам программы, применив в ней оператор безусловного перехода. Program Number2; Label Metka; Var a, b, c: integer; Begin Metka: writeln(‘Введите цифру ‘); readln(a); case a of 0: writeln (‘ноль‘); 1: writeln (‘один‘); 2: writeln (‘два‘); 3: writeln (‘три‘); 4: writeln (‘четыре‘); 5: writeln (‘пять‘); 6: writeln (‘шесть‘); 7: writeln (‘семь‘); 8: writeln (‘восемь‘); 9: writeln (‘девять‘) else begin writeln (‘Это число не является цифрой‘); goto Metka; end; end; readln; End. Теперь в этой программе мы заставляем пользователя правильно ввести цифру. Сколько бы раз пользователь ни вводил числа не из промежутка 0..9, программа будет выдавать сообщение об ошибочном вводе и снова просить ввести цифру. Задание. Наберите программу и протестируйте ее.
В простых программах этот оператор не вызывает затруднений. При написании сложных и объёмных программ могут быть затруднения, поэтому программисты стараются не использовать этот оператор. Возникает вопрос: где должен использоваться безусловный переход? На этот вопрос следует ответить – “нигде”. Любая программа, написанная с goto, может быть запрограммирована без этого оператора. Следует ли вообще использовать оператор перехода? Ответить трудно. В основном применение оператора безусловного перехода оправдано в двух случаях: при преждевременном завершении цикла или программы. Но даже в этих случаях можно обойтись некоторой стандартной управляющей структурой. Не будет ничего удивительного в том, что в Ваших программах не будет применяться безусловный переход. В общем случае рекомендуется избегать использования этого оператора для обеспечения лучшего понимания работы программы. Бесконтрольное применение оператора goto может усложнить программу настолько, что разобраться в ней будет невозможно. Поэтому программисты считают применение оператора безусловного перехода плохим стилем программирования. Задание. Выберите произвольно из решенных Вами задач две и дополните их решение использованием оператора безусловного перехода goto. Занятие 6. Контрольная работа
1) Есть ли в следующих текстах пустые операторы? (Если есть, то отметьте в тетради под какими буквами.) а) if x> 0 then x: =2 else; y: =x+1; б) if odd(k) then else k: =0; в) begin x: =2; y: =5; end; г) begin a: =true; ; b: =b or a end; д) begin if x=0 then goto 1; y: =x; 1: end 2) Если n=3, то какое значение будет иметь переменная f после выполнения следующего составного оператора? Запишите в тетрадь. begin f: =1; i: =2; 1: if i> n then goto 9; f: =f*i; i: =i+1; goto 1; 9: end 3) Найдите ошибки в программе, записав уже исправленную программу в тетрадь: Program Errors; Const L=18; Label 18, 8; Var x, y: integer; Begin y: =0; 8: read(x); if x< 0 then goto L; y: =y+x; goto 18; L: writeln(y) End. 4) Найти ошибки в следующих операторах, запишите исправленные операторы в тетрадь: а) begin 77: if |x|< 1 then goto 5 begin x: =x/2; goto 77; 5: y: =sin(x) end end; б) 34: if 0< x< 2 then if y< 1 then goto 34 else goto 15 else 15: y: =sqr(y) в) if 1< x< 2 then x: =x+1; y: =0; else x: =0; y: =y+1; г) if 1< x and x< 2 then begin x: =x+1; y: =0 end; else begin x: =0; y: =y+1 end 5) Запишите в тетрадь, какое значение будет иметь переменная z после выполнения операторов z: =0 if x> 0 then if y> 0 then z: =1 else z: =2 при следующих значениях переменных х и у: а) х=у=1; б) х=1, у=-1; в) х=-1, у=1. Сдайте свою тетрадь на проверку учителю. Творческое задание. Придумайте и решите задачу с применением графического режима, предлагая для выбора пользователю некоторое меню. Для любознательных Рассмотрим решение таких задач, в которых требуется выполнить группу операторов определенное количество раз. Задача. Дано 10 вещественных чисел. Найти величину наибольшего из них. Program Maximum; Uses Crt; Label Metka1; Var Kolich: integer; Max, x: real; Begin ClrScr; Kolich: =0; Max: =-32768; Metka1: write (‘Введите число ‘); readln (x); if x> Max then Max: =x; Kolich: =Kolich+1; if Kolich< 10 then goto Metka1; writeln (‘Наибольшее число равно ‘, x); readln; End. Рассмотрим подробнее действие операторов. После очистки экрана (ClrScr) мы присвоим переменной Kolich, которая определена для подсчета введенных чисел, первоначальное значение равное нулю. Переменной Мах мы будем присваивать наибольшее значение из вводимых чисел. Так как переменная Мах типа integer, то присвоим ей первоначальное значение равное наименьшему из диапазона этого типа, т. е. числу -32768. Далее выделен целый блок. Он будет повторяться при запуске программы 10 раз, т.е. столько сколько чисел нам нужно запросить у пользователя и исследовать их. Просмотрим действие этого блока. Сначала мы запрашиваем у пользователя первое число и считываем его в переменную х. Затем идет анализ этого числа. Если введенное число х оказалось больше числа, находящегося в переменной Мах, то происходит пере присваивание: переменной Мах присваиваем значение х. Итак, считано одно число, поэтому счетчик введенных чисел (Kolich) увеличиваем на 1. Проверяем условным оператором, может быть уже достаточно введено и проанализировано чисел? Если Kolich меньше 10, то еще недостаточно, а значит надо вернуться для того чтобы снова запросить и проанализировать следующее число, что и выполнено с помощью оператора goto. Этот оператор не пропустит нас дальше выполнять программу пока не выполниться условие, при котором переменная Kolich будет равна 10. А такой момент обязательно наступит, потому что в результате выполнения блока переменная Kolich увеличивается на 1. В результате выделенный блок повториться 10 раз, будет запрошено 10 чисел и среди них постоянным сравнением с предыдущим числом будет выявлено наибольшее, которое будет содержаться в переменной Мах. После выхода из блока останется только вывести это число на экран. Задание. Решите подобную задачу с использованием выше описанного метода. 1) Дано n вещественных чисел. Определить, сколько среди них отрицательных. 2) Дано n вещественных чисел. Определить, сколько среди них положительных чисел. 3) Дано n вещественных чисел. Найти их сумму. 4) Дано n вещественных чисел. Найти их среднее арифметическое. 5) Дано n вещественных чисел. Определить сумму чисел, стоящих на четных местах в этой последовательности. 6) Дано n вещественных чисел. Определить сумму положительных чисел. 7) Дано n вещественных чисел. Определить сумму отрицательных чисел. 8*) Дано целое k от 1 до 180. Определить, какая цифра находится в k-ой позиции последовательности 10111213...9899, в которой выписаны подряд все двузначные числа. 9*) Дано натуральное k. Определить k-ую цифру в последовательности 110100100010000..., в которой выписаны подряд степени 10. 10*) Вычислить с – наибольший общий делитель натуральных чисел а и b. Приготовьте файлы и листинги с решенными задачами, а также проверьте, все ли задания выполнены в тетради. Дополнительно Выберите с учителем задачу для решения. 1) Написать программу для решения указанной задачи: для заданного числа а найти корень уравнения f(x)=0, где f(x)= 2) Дано число х. Напечатать в порядке возрастания числа x, 1+|x| и (1+х2). 3) Даны числа a1, b1, c1, a2, b2, c2. Напечатать координаты точки пересечения прямых, описываемых уравнениями a1х+b1у=c1и a2х+b2у=c2, либо сообщить, что прямые совпадают, не пересекаются или вовсе не существуют. 4) Даны числа a, b и с (а ). Найти вещественные корни уравнения ах +bx +c=0. Если корней нет, сообщить об этом. 5) Даны произвольные числа a, b и с. Если нельзя построить треугольник с такими длинами сторон, то напечатать 0, иначе напечатать соответствующее сообщение в зависимости от того, равносторонний это треугольник, равнобедренный или какой-либо иной. Контрольные вопросы 1. Какой алгоритм называется разветвляющимся? 2. Что такое ветвь алгоритма? 3. Какое условие называется составным? 4. Верно ли, что в качестве метки можно использовать любое положительное целое число? 5. Обязательно ли описывать все метки, которыми помечены операторы программы? 6. Верно ли, что в разделе меток все описываемые метки должны быть перечислены по возрастанию? 7. Допустимы ли в Паскале следующие составные операторы? а) begin end; б) begin x: =0 end; в) begin; end 8. Какое выражение называется булевым? Почему? 9. Какая форма условного оператора называется полной? Краткой? 10. Какие условные операторы называются вложенными? Как они применяются? 11. Как применяется оператор выбора? Когда он особенно необходим? 12. Для чего нужен оператор безусловного перехода? Почему он так называется?
Циклы |
Последнее изменение этой страницы: 2017-03-17; Просмотров: 1409; Нарушение авторского права страницы