67455

Составной оператор

Лекция

Информатика, кибернетика и программирование

В языке «C++» аналогичная конструкция называется БЛОК. В начале блока можно объявлять локальные переменные блока.

Русский

2014-09-23

247 KB

0 чел.

Лекция 3

Составной оператор

begin

 <Операторы>

end

Замечание. В языке «C++» аналогичная конструкция называется БЛОК. В начале блока можно объявлять локальные переменные блока.

{

 <Объявления>

 <Операторы>

}

Условный оператор (развилка)

1. Упрощенная (сокращенная) развилка. <Л.В.> – логическое выражение.

В одну строчку:

if <Л.В.> then <Оператор>

В несколько строчек:

if <Л.В.> then 

  <Оператор>

Замечание. В языке «C++» аналогичная конструкция не использует служебное слово then. Скобки вокруг <Л.В.> – обязательны.

if (<Л.В.>) <Оператор>


2. Классическая развилка

В одну строчку:

if <Л.В.> then <Оператор1> else <Оператор2>

В несколько строчек:

if <Л.В.> then 

   <Оператор1>

else 

   <Оператор2>

Замечание. В языке «C++» в аналогичной конструкции требуется точка с запятой перед служебным словом else.

if (<Л.В.>) <Оператор1>; else <Оператор2>


Замечание.
В языке программирования «Mathematica» классическая развилка имеет не две, а три ветви:  Yes,  No,  I dont know:


3. Вложенная развилка

В одну строчку:

if <Л.В.1> then <Оператор1> else if <Л.В.2> then <Оператор2> else <Оператор3>

В несколько строчек:

if <Л.В.1> then 

   <Оператор1>

else 

   if <Л.В.2> then 

       <Оператор2>

   else 

       <Оператор3>

Замечание. В языке «C++» в аналогичной конструкции требуется знак «точка с запятой» перед каждым служебным словом else.

if (<Л.В.1>) <Оператор1>; else if (<Л.В.2>) <Оператор2>; else <Оператор3> )

Вложенные развилки могут быть построены и по более громоздким схемам. Сложность этих схем принципиально ничем не ограничена.

Пример. Организовать вычисление кусочно-однородной функции

             

pi – вероятность того, что переменная x попадёт в i-й интервал из четырёх предусмотренных. Оценка вероятности возможна из соотношения pini / n0 , где      ni  – наблюденное число случаев, когда вычисления требовались по i-й строчке, n0  – общее число случаев вычисления.

ti – время, необходимое для вычисления логического выражения (какого – ясно по цвету в схеме алгоритма и в программе)


Способ 1 (линейный).

Схема алгоритма


Программа

if  x<-2  then

   y := 4/x                    //  t = t1

else 

   if  x<1  then 

       y := x                   //  t = t1 + t2

   else 

       if  x<5  then

           y := sqr(x-1)    //  t = t1 + t2 + t3

       else                   

           y := 4               //  t = t1 + t2 + t3


Среднее время вычисления:

.

Математическое ожидание времени вычисления:

.

= >   .


Способ 2 (древовидный).

Схема алгоритма

Программа

if  x<1  then    

   if  x<-2  then    

       y := 4/x              //  t = t1 + t2

   else 

       y := x                 //  t = t1 + t2

else 

   if  x<5  then

       y := sqr(x-1)      //  t = t2 + t3

   else                   

       y := 4                 //  t = t2 + t3

Математическое ожидание времени вычисления:


Пусть    ,        ().

Тогда        ,    .

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

Цикл с параметром  (1-й вариант)

for  <Параметр> := <Начальн. знач.> to <Конечн. знач.> do <Оператор>

<Параметр> может быть только порядковой переменной.

<Начальн. знач.> и <Конечн. знач.> могут быть только выражениями порядкового типа.

Шаг изменения переменной <Параметр> равен (+1).

<Оператор> является телом цикла. Он выполняется столько раз, сколько значений примет <Параметр>, изменяясь от <Начальн. знач.> до <Конечн. знач.> с шагом  (+1).

Если <Начальн. знач.> больше, чем <Конечн. знач.>, то тело цикла не выполняется ни разу.


Замечание.
В языке «C++» аналогичная конструкция имеет вид:

for (<Параметр> = <Начальн. знач.>; 

  <Параметр> <= <Конечн. знач.> ; 

  <Параметр>++ ) 

<Оператор>

<Параметр> может быть переменной «непорядкового» (в терминологии языка Pascal) типа. Например, может быть переменной типа Double.


Цикл с параметром  (2-й вариант)

for  <Параметр> := <Начальн. знач.> downto <Конечн. знач.> do <Оператор>

Шаг изменения переменной <Параметр> равен  (1).

<Оператор> (тело цикла) выполняется столько раз, сколько значений примет <Параметр>, изменяясь от <Начальн. знач.> до <Конечн. знач.> с шагом  (1).

Если <Начальн. знач.> меньше, чем <Конечн. знач.>, то тело цикла не выполняется ни разу.


Замечание.
В языке «C++» аналогичная конструкция имеет вид:

for (<Параметр> = <Начальн. знач.>; 

  <Параметр> >= <Конечн. знач.> ; 

  <Параметр>-- ) 

<Оператор>


Примеры

1. Вывести на экран заглавные буквы латинского алфавита

Free Pascal,  TP7:

uses crt;

var

 C:  char;  // Описание переменной C:

begin

for  C := ‘A’  to  ‘Z’  do  Write(C);

ReadKey;

end.


Язык
 «C++»:

#include <vcl.h>

#include <stdio.h>

#include <conio.h>

#pragma hdrstop

int main(int argc, char* argv[])

{

 char C;

 for (C = 'A'; C <= 'Z'; C++) printf("%c", C);

 getch();

 return 0;

}


2.  
Найти сумму  .

Free Pascal,  TP7:

1-й способ.

var

    I, N:  integer;

   S: double;

begin

S := 0;

N := 10000;

for  I := 1  to  N  do  S :=S + 1/Sqr(I);

Writeln(‘              S=’, S);

Writeln(‘Контроль: ’, Sqr(pi)/6);

end.

2-й способ.

Язык «C++»:

#include <vcl.h>

#include <stdio.h>

#include <conio.h>

#pragma hdrstop

int main(int argc, char* argv[])

{

   int I, N;

   double S;

   N = 1000;

S = 0;

for  (I = 1;  I <= N;  I++)  S += 1.0 / ((double)I * (double)I) ;

   printf(“S=%g”, S);

   getch();

}

Возможные ошибки:

Turbo Pascal 7.0:

(*   for  I := 1  to  4  do;  writeln(‘I=’, I);   *)

for  I := 1  to  4  do;  

   Writeln(‘I=’, I);

Результат:  I=4   (TP7)

Язык «C++»:

// for  (I = 1; I <= 4; I++);  printf(“I=%d”, I);

for  (I = 1; I <= 4; I++);  

   printf(“I=%d”, I);

Результат:  I=5


3. Найти сумму  .

– крайне нежелательный вариант!

,   ,   .

Рекуррентные соотношения:

S0 = 0

A0 = 1

S1 = S0 + A1

A1 = A0*x2/1

S2 = S1 + A2

A2 = A1*x2/3

. . .

. . .

Si = Si-1 + Ai

Ai = Ai-1*x2/(2*i-1)


Pascal:

var

   I, N:  integer;

   S, A, x, x2: double;

begin

writeln(‘Input N, x’);

readln(N, x);

S := 0;

A := 1;

X2 := x*x;

for  I := 1  to  N  do  

begin

       A := A * x2 / (2 * I – 1);

       S := S + A;

end;

writeln(‘S=’, S);

end.


Язык
 «C++»:

#include <vcl.h>

#include <stdio.h>

#include <conio.h>

#pragma hdrstop

int main(int argc, char* argv[])

{

   int  I, N;

   double  S, A x, x2;

printf(“Input N”);

scanf(“%d”, &N);

// %d – формат целого числа.

printf(“Input x”);

scanf(“%g”, &x);

// %g – формат вещественного числа, при котором сохраняется 6 значащих цифр.


S = 0;

A = 1;

x2 = x*x;

for  (I = 1; I <= N; I++)

{  

       A *= x2 / (2.0 * (double)I – 1.0);

// (double) I – преобразование целого типа к вещественному

       S += A;

}

printf(“S=%g”, S);    

// %g – формат вещественного числа, при котором сохраняется 6 значащих цифр.

   getch();

   return 0;

}

 


Visual Basic:

Sub Proc1()

   Dim  I  As  Integer, N As  Integer

   Dim  S As Double, A As Double, x As Double, x2 As Double

N = InputBox(“Input N”)

x = InputBox(“Input x”)

S = 0

A = 1

x2 = x*x

For  I = 1  To  N

       A = A * x2 / (2 * I – 1)

       S = S + A

Next

MsgBox “S=” & S

End Sub

3*. Найти сумму    с погрешностью не хуже .

.

– частичная сумма,    – остаток ряда.

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

При каком  можно гарантировать, что ,  где   – дозволенная погрешность?

,

То есть,

.                                             (*)

На оценку (*) можно положиться только в том случае, если

.


Цикл с постусловием

repeat <Операторы> until <Л.В.>

<Операторы> являются телом цикла.

Тело цикла выполняется по меньшей мере один раз, а затем, возможно, многократно, пока < Л.В.> есть ложь.

Если < Л.В.> есть истина при первой же оценке, то тело цикла выполняется один раз.

Если < Л.В.> есть ложь при каждой оценке, то тело цикла выполняется неограниченно много раз.


Инструкция  
break  применяется для досрочного прекращения цикла. Равноценна оператору “goto Metka1”, для которого “Metka1:”расположена сразу после оператора цикла.

Инструкция  continue  применяется для досрочного перехода на очередную проверку условия продолжения цикла.

Равноценна оператору “goto Metka2”, для которого “Metka2:” расположена сразу после последнего из операторов, составляющих тело цикла.


Процедуры

<Объявление процедуры> : : =

procedure <Имя процедуры>[(<Список формальных параметров>)];

[<Разделы объявления локальных типов, констант, переменных>]

[<Разделы объявления локальных процедур и функций>]

begin

}  Раздел исполнения процедуры

 <Операторы>

end;

<Список формальных параметров> : : =

<Элемент списка 1>; <Элемент списка 2>;  . . .


<Элемент списка>
: : =

<Список имён параметров-значений>: <Тип>

или

var <Список имён параметров-переменных>: <Тип>

или

const <Список имён параметров-констант>: <Тип>

<Обращение к процедуре> : : =

<Имя процедуры>[(<Список фактических параметров>)]

Замечание. Фактические параметры должны быть совместимы с формальными по типам.


Пример
 программы 2.

program Example2;

type

MyInt = integer ;

var

I: MyInt ;

J: integer ;

procedure P2(var M: integer);

begin

. . .

end;

begin

 P2(J) ;   // Нормально

P2(I) ;   // Ошибка

end.

Пример программы 3.

program Example3;

var

   I, J, K : integer ;

procedure P3(L : integer ; var M : integer ; const  N : integer);

begin

Inc(L) ;              // Бесполезно

Inc(M) ;            // Полезно

(* Inc(N) ;  *)   // Ошибка

end;

begin

I := 1;  J := 1;  K := 1;

P3(I, J, K) ;

wri teln(‘I=’, I) ;      // I = 1

wri teln(‘J=’, J) ;     // J = 2

end.

Функции

<Объявление функции> : : =

function <Имя функции>[(<Список формальных параметров>)] :

   <Тип возвращаемого значения>;

<Разделы объявления локальных типов, констант, переменных>

<Разделы объявления локальных процедур и функций>

begin

}  Раздел исполнения процедуры

 <Операторы>

end;

Среди <Операторов> должен быть хотя бы один «Оператор» вида

<Имя функции> := <Выражение> ;

или

 result := <Выражение> ;


Пример
 программы 4.

program Example4;

var

x, y, Eps : Double ;

function BesselI0(x, Eps : Double) : Double ;

var

   S, A, B, R: Double ;

begin

. . .

BesselI0 := S ;

end;

begin

writeln(‘x=? ’) ;   readln(x);

writeln(‘Eps=? ’) ;   readln(Eps);

y := BesselI0(x, Eps) ;    writeln(‘y=’, y) ;

end.


<Л.В.
>

<Оператор>

Yes

No

<Л.В.>

Оператор1>

<Оператор2>

Yes

No

<Л.В.1>

<Л.В.2>

<Оператор1>

<Оператор2>

<Оператор3>

Yes

Yes

No

No

x < -2

x < 1

x < 5

y = 4/x

y = x

y = sqr(x–1)

y = 4

Yes

Yes

Yes

No

No

No

x < -2

x < 1

x < 5

y = 4/x

y = x

y = sqr(x–1)

y = 4

Yes

Yes

Yes

No

No

No


 

А также другие работы, которые могут Вас заинтересовать

6961. Экономика предприятия. Учебный курс 1.58 MB
  В учебном пособии Экономика предприятий дается представление о производственном предприятии как целостной организационно-экономической и социальной системе. Подробно рассмотрены темы, касающиеся обоснования потребности предприятия в основных ресурса...
6962. Назначение режима резания при сверлении, зенкеровании и развертывании 143 KB
  Назначение режима резания при сверлении, зенкеровании и развертывании Цель работы: изучить методику назначения режимов резания по таблицам нормативов. Ознакомиться и приобрести навыки работы с нормативами. Задание: На вертикально-сверлильном станке ...
6963. Серебренный век в русском искусстве 1.4 MB
  Введения Тема меня заинтересовала сразу, потому что считал серебренный век одна из важнейших частей нашей культурной истории России. Задача как можно больше рассказать и пояснить о особенностях серебренного века. Описать каждую из отраслей серебренн...
6964. Учет изменений, вызванных развитием застроенных территорий населенного пункта в государственном кадастре недвижимости (на примере г. Сухой Лог) 1 MB
  В связи с постоянным развитием и перепланировкой городских территорий, изменением социальных, технических требований возникает необходимость проведения реконструкции. Это вызвано и экономической важностью более эффективного использования...
6965. Исследование деятельности ОАО Банка Петрокоммерц 1.34 MB
  Глава 1. Правовые и экономические основы деятельности ОАО Банка Петрокоммерц. Правовое положение Открытое акционерное общество Коммерческий банк Петрокоммерц, именуемое в дальнейшем Банк, является кредитной организацией, созданной по решению внеочер...
6966. Моделирование автоклава с ПИД-регулятором 759.17 KB
  Содержание пояснительной записки Введение 1. Технологический процесс. Автоматическое регулирование. Виды и преимущества регуляторов. ПИД-регулятор. Автоклав 2. Моделирование автоклава с ПИД-регулятором 3. Вычислительный эксперимент ПИД-регуляторов н...
6967. Понятие о поле. Физические поля, используемые в интроскопии 18.23 KB
  Понятие о поле. Физические поля, используемые в интроскопии. Поле, особая форма материи физическая система, обладающая бесконечно большим числом степеней свободы. Примерами поля могут служить электромагнитное и гравитационное поля, поле ядерных сил...
6968. Изучение диполя. Волновая зона. Мощность изучения диполя 19.49 KB
  Изучение диполя. Волновая зона. Мощность изучения диполя Диполь идеализированная система, служащая для приближённого описания распространения поля. Дипольное приближение основано на разложении потенциалов поля в ряд по степеням радиус-вектора...
6969. Рассеяние и дифракция акустических и электромагнитных волн 23.5 KB
  Рассеяние и дифракция акустических и электромагнитных волн. Акустические и электромагнитные волны, распространяющиеся в различных средах и устройствах, подчиняются единым волновым законам. Это явления возбуждения волн конкретными источниками, отраже...