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


 

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

7257. Связь науки и техники на примере развития вычислительных средств 178.61 KB
  Введение. Наука играет огромную роль в развитии человеческого общества. Она пронизывает все сферы нашей деятельности как материальной, так и духовной и по праву является неотъемлемым звеном социально-политического развития страны. В литературе им...
7258. Расчет цифрового радиоприёмника по исходным данным: 786 KB
  1. Задание. Произвести расчёт цифрового радиоприёмника по следующим исходным данным: Приёмник работает с ФМ сигналом на частоте F0=22 МГц. Необходимо обеспечить перестройку по 19 каналам. Скорость цифрового потока в последовательном коде V: 7000 бит...
7259. Книга. Сто великих сокровищ 1.84 MB
  Сто великих сокровищ. История человечества столь удивительна и разнообразна, что всякая ее достопримечательность потрясает наше сознание. Любой драгоценный предмет имеет очень интересную судьбу, порой таинственную и загадочную. История каж...
7260. Гидравлика. Учебное пособие 3.04 MB
  Гидравлика Учебное пособие подготовлено в соответствии с Государственным образовательным стандартом высшего профессионального образования по дисциплине Гидравлика. Рассматриваются основные теоретические положения гидростатики, кинематики и динамик...
7261. Економіка підприємства. Опорний конспект лекцій 3.95 MB
  Зміст Вступ до економіки підприємства Підприємство як субєкт господарювання Поняття, цілі та напрямки діяльності підприємства Правові основи функціонування підприємства Класифікація підприємств Добровільні та інституціон...
7262. Специфіка мовлення фахівця. Поняття ділового спілкування 69 KB
  Тема. Специфіка мовлення фахівця. Поняття ділового спілкування Спілкування, основні його види та форми. Майстерність публічного виступу. 3. Ділова бесіда. 1. Сфера використання усного літературного мовлення сьогодні надзвичайно розширюєт...
7263. Вироби з дріжджового тіста 94 KB
  Вироби з дріжджового тіста Способи приготовлення дріжджового тіста - Безопарний спосіб приготування дріжджового тіста - Опарний спосіб приготування дріжджового тіста Процеси, що відбуваються під час замісу і броді...
7264. Конфлікти у великих групах 80.5 KB
  Тема Конфлікти у великих групах. План. Конфліктологічна проблематика в історії соціології. Загальна соціологічна теорія конфліктної взаємодії. Конфліктологічна проблематика в історії соціології. Соціологія - та ...
7265. Економічна система суспільства. Типи економічних систем 117.5 KB
  Система як загальнонаукове поняття - це сукупність взаємоповязаних і розміщених у належному порядку елементів певного цілісного утворення...