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


 

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

4480. Загальні відомості про розвиток довгострокових гідрологічних прогнозів 85 KB
  Загальні відомості про розвиток довгострокових гідрологічних прогнозів. Аналіз сучасного стану в області довгострокового прогнозування гідрологічного режиму річок Розвиток довгострокових гідрологічних прогнозів на різних етапах історії пов’я...
4481. Загальні принципи оцінки точності методик довгострокового прогнозування та справджуваності прогнозів 177 KB
  Загальні принципи оцінки точності методик довгострокового прогнозування та справджуваності прогнозів Похибка довгострокового прогнозу. Визначення допустимої похибки гідрологічного прогнозу Згідно Настанові по службі прогнозів оцінка прогнозу...
4482. Довгострокові прогнози меженного стоку влітку, восени і взимку 394 KB
  Довгострокові прогнози меженного стоку влітку, восени і взимку Закономірності і фактори меженного стоку Під меженним стоком рівнинних і гірських річок розуміють стік літньо-осіннього і зимового періодів, коли річки отримують живлення в основному в...
4483. Довгострокові прогнози шарів стоку весняного водопілля для рівнинних річок 2.4 MB
  Довгострокові прогнози шарів стоку весняного водопілля для рівнинних річок В період весняного водопілля, одної з найбільш багатоводних фаз гідрологічного режиму більшості рівнинних річок України, формування стоку обумовлене таненням накопичено...
4484. Довгострокові прогнози максимальних витрат води весняного водопілля 1.45 MB
  Довгострокові прогнози максимальних витрат води весняного водопілля Сучасний стан в області довгострокового прогнозування максимальних витрат води весняного водопілля Ще у 40-ві роки минулого сторіччя М.А. Великановим була запропонована для прогноз...
4485. Прогнози дат початку та проходження максимальних витрат води весняних водопіль на рівнинних річках 193.5 KB
  Прогнози дат початку та проходження максимальних витрат води весняних водопіль на рівнинних річках 1 Фізичні передумови та практичні прийоми прогнозів строків водопілля для окремих водозборів На відміну від прогнозів характеристик водного режиму вес...
4486. Довгострокові прогнози весняно-літнього водопілля гірських річок 370 KB
  Довгострокові прогнози весняно-літнього водопілля гірських річок Особливості формування водопілля гірських річок Довгострокові прогнози стоку річок базуються на знанні процесів накопичення й витрати вологи в річковому басейні, що зумовлюють характ...
4487. Довгострокові прогнози льодових явищ на основі характеристик атмосферних процесів 60 KB
  Довгострокові прогнози льодових явищ на основі характеристик атмосферних процесів 1 Фізичні основи та принципи прогнозів дат льодових явищ Строки льодових явищ на водних об’єктах залежать від масштабних атмосферних процесів, які розвиваються на...
4488. Набор учебных стендов для кабинета Правил Дорожного Движения 4.95 MB
  Введение Темой конструкторской разработки является создание учебных стендов для кабинета Правил Дорожного Движения. Эта работа содержит в себе 3 стенда: стенд макет автодрома, тренажер сигналы регулировщика и стенд сигналы светофора. Руководит...