Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Оператор безусловного перехода goto



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

Дело в том, что процедуры break и continue прерывают только один цикл - тот, в теле которого они содержатся. Поэтому в упомянутой выше ситуации пришлось бы заметно усложнить текст программы, вводя много дополнительных прерываний. А один оператор goto способен заменить их все.

Сравните, например, два программно-эквивалентных отрывка:

write('Матрица '); write('Матрица ');

for i: =1 to n do for i: =1 to n do

begin for j: =1 to m do

flag: =false; if a[i, j]> a[i, i]

for j: =1 to m do then begin

if a[i, j]> a[i, i] write('не ');

then begin flag: =true; goto 1;

write('не '); end;

break; 1: writeln('обладает

end свойством

if flag then break; диагонального

end; преобладания.');

writeln('обладает свойством

диагонального

преобладания.');

 

 

2. ПРАКТИЧЕСКАЯ РАБОТА

 

2.1 Программирование алгоритма циклической структуры

1. Задание: Вывод массива, удобный для пользователя. Распечатать двумерный массив размерности MxN удобным для пользователя способом. (Известно, что массив содержит только целые числа из промежутка [0..100].). Вычислите сумму элементов.

2. Алгоритм. Понятно что, если весь массив мы вытянем в одну строчку (или, того хуже, в один столбик), хороших слов в свой адрес мы не дождемся. Именно поэтому нам нужно вывести массив построчно, отражая его структуру.

3. В рабочей области редактора наберите код программы, представленный на листинге 1.

Листинг 1.

program Z1;

{$APPTYPE CONSOLE}

uses

SysUtils;

Const n=4;

m=5;

var a: array[1..n, 1..m] of integer;

s, i, j: integer;

begin

{Ввод данных}

for i: = 1 to n do

for j: = 1 to m do

begin

Write(‘Vvedite element A[‘, i, ’, ’, j, ’]: ’);

Readln(a[i, j]);

end;

 

{Печать результата}

Writeln;

Writeln('Matrix: ');

for i: = 1 to n do

begin

for j: = 1 to m do

begin write(a[i, j]: 4); s: =s+a[i, j] end;

writeln;

end;

Writeln('Summa=', s);

Writeln('End program.'); Readln;

end.

 

5. Запустите программу на решение и проверьте полученные результаты.

 

2.2 Программирование таблично заданной функции

1. Задание: Вычислить и вывести на печать значения функции y = a3 / (a2 + x2) при значениях x, изменяющихся от 0 до 3 с шагом 0, 1.

2. В программе заранее можно определить число повторений и использовать оператор цикла for.

3. Для оптимизации вычислительного процесса значения параметра a3 и a2 вычислим вне цикла.

4. Наберите код программы, представленный на листинге 2.

Листинг 2.

program Z2;

{$APPTYPE CONSOLE}

uses

SysUtils;

var a, x, y, a2, a3: real;

i: integer;

begin

Write(‘Vvedite A=’);

Readln(a);

{Расчет и печать таблицы}

a2: =a*a; a3: =a*a*a;

x: =0;

Writeln;

Writeln(' x y');

for i: = 1 to 31 do

begin

y: =a3/(a2+x*x);

writeln(x: 8: 4, y: 8: 4);

x: =x+0.1;

end;

Writeln('End program.'); Readln;

end.

 

5. Проведите отладку программы и проверьте полученные результаты.

6. Проверьте работу программы, где количество повторений определяется автоматически: n: =Trunc((xk-xn)/hx)+1,
где xk, xn и hx – начало, конец интервала и шаг счета.

7. Для закрепления практических приемов работы выполните упражнение 1 из раздела 3 самостоятельной работы.

 

2.3 Вычисления по формуле линейной интерполяции

1. Вычислить по формуле линейной интерполяции значения таблично заданной функции.

2. Таблично задана функция Yi = f(xi).

X
y=f(x) -65.8 -33.9 -11.1 0.2 10.0 28.9 49.5 62.2 79.7 96.3

Вычислить по формуле линейной интерполяции

значения функции в точках x = 5.5; 7.25.

3. В этом задании заранее не известно в каком интервале узловых точек окажется заданное значение аргумента x, а следовательно, применить оператор цикла с известным числом повторений будет затруднительно. Так как порядковый номер точки интервала интерполяции не известен, в этой задаче применим оператор цикла с неизвестным числом повторений While...do.

4. Наберите код программы, представленный на листинге 4. Самостоятельно оформите описание необходимых переменных и массивов. Организуйте ввод данных в массивы Х и Y.

Листинг 4.

.....

Readln(xA);

i = 1

While xA > X[i] do i = i + 1

{Интерполяции значения yA}

yA = Y[i – 1] + (xA – X[i – 1]) *

(Y[i] – Y[i – 1]) / (X[i) – X[i – 1]);

.....

 

5. Проведите отладку программы и проверьте полученные результаты.

 

 

2.4 Вычисление определенного интеграла

1. Вычислить интеграл в заданных границах a и b для некоторой гладкой функции f от одной переменной (с заданной точностью).

2. Алгоритм. Метод последовательных приближений, которым мы воспользуемся для решения этой задачи, состоит в многократном вычислении интеграла со все возрастающей точностью, - до тех пор, пока два последовательных результата не станут различаться менее, чем на заданное число (скажем, e = 0, 001). Количество приближений нам заранее неизвестно (оно зависит от задаваемой точности), поэтому здесь применим только цикл с условием (любой из них).

3. Вычислять одно текущее значение для интеграла мы будем с помощью метода прямоугольников: разобьем отрезок [a, b] на несколько мелких частей, каждую из них дополним (или урежем - в зависимости от наклона графика функции на данном участке) до прямоугольника, а затем просуммируем получившиеся площади. Количество шагов нам известно, поэтому здесь удобнее всего воспользоваться циклом с параметром.

4. На рисунке изобразим функцию f(x) = x2 (на отрезке [1, 2]). Каждая из криволинейных трапеций будет урезана (сверху) до прямоугольника: высотой каждого из них послужит значение функции на левом конце участка. График станет " ступенчатым".

5. Наберите код программы, представленный на листинге 3. Самостоятельно оформите описание необходимых переменных и организуйте ввод данных - границ a и b интервала интегрирования, погрешность вычисления интеграла e. Для вычисления значений функции используйте ее предварительное описание и обращение к ней.

Листинг 3.

Function f(x: real) real;

begin f: =x*x end;

..............

step: = 1;

h: = b-a;

s_nov: = f(a)*h;

repeat

s_star: = s_nov;

s_nov: = 0;

step: = step*2;

h: = h/2;

for i: = 1 to step do

s_nov: = s_nov+f(a+(step-i)*h);

s_nov: = s_nov*h;

until abs(s_nov - s_star)< = eps;

writeln(s_nov);

6. Проведите отладку программы и проверьте полученные результаты.

 

 


3. САМОСТОЯТЕЛЬНАЯ РАБОТА

 

Задание 1. Разработать программу для табулирования функции, заданной в соответствии с вариантом задания (таблица 1). Реализовать диалоговый ввод данных параметров функции. Печать результатов оформить в виде таблицы.

Таблица 1.

№ п/п Расчетные формулы Условие Исход-ные данные Диапазон и шаг изменения аргумента
a= 2, 5 b = 0, 4 x Î [1; 2] Dx = 0, 05
a= -0, 5 b= 2 x Î [0, 7; 2] Dx = 0, 1
a= 1, 5 x Î [1; 2] Dx = 0, 05
a= 2, 8 b=-0, 3 c = 4 x Î [0, 2; 2, 8] Dx = 0, 2
a= 1, 65 x Î [0, 7; 2] Dx = 0, 1
a= 2, 3 x Î [0, 2; 2, 8] Dx = 0, 2
a= 2, 5 x Î [1; 5] Dx = 0, 5
b= 1, 5 x Î [0, 1; 2] Dx = 0, 1
- x Î [2; 5] Dx = 0, 25
a= 20, 3 x Î [0, 5; 2] Dx = 0, 1
t= 2, 2 x Î [0, 2; 2] Dx = 0, 2
a= 2, 6 b= -0, 39 x Î [0; 7] Dx = 0, 5
a= 0, 9 x Î [0, 8; 2] Dx = 0, 1
a= 2, 1 b = 1, 8 c = -20, 5 i Î [0; 12] Di = 1
a= 0, 3 n = 10 i Î [0; 10] Di = 1

 

Задание 2. Составить программу для вычисления произведения положительных элементов массива целых чисел X[20].

 

Задание 3. Составить программу для вычисления суммы 20 членов ряда

, где xi -элементы массива (x1, x2, … x20).

 

Задание 4. Составить программу для вычисления суммы бесконечного ряда с точностью до e = 10-4 (суммирование осуществлять, пока абсолютное значение текущего члена ряда не станет меньше e).

 


Контрольные вопросы

1. Указать последовательность действий, выполняемых при организации циклических участков программы с заданным числом повторений.

2. Какие действия выполняются оператором перехода go to?

3. Указать назначение и правила организации цикла?

4. Перечислить возможные способы организации цикла с заданным числом повторений.

5. Зачем необходимо при отладке программы тестировать все ветви алгоритма?

6. Перечислить возможные способы организации итерационных циклов.

 

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-03; Просмотров: 597; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.039 с.)
Главная | Случайная страница | Обратная связь