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


 

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

466. Знакомство с операционной системой MS DOS та Windows XP 315 KB
  Основные команды MS DOS. Основные команды работы с файлами и каталогами. Знакомство с программой Volkov Commander. Принципы организации многозадачной работы в системе. Исследование методов запуска программы Проводник.
467. Градієнтний метод числової оптимізації задач нелінійного програмування 1.16 MB
  Застосування градієнтного методу, коли обмеження на область зміни змінних х відсутні. Застосування градієнтного методу, коли наявні обмеження на область зміни змінних х. ознайомлення з градієнтним методом числової оптимізації, набуття навиків розв’язку та аналізу задач нелінійного програмування градієнтним методом.
468. Инженерные решения постройки много квартирных домов старого образца 197.5 KB
  Ознакомление с постройками много квартирных домов старого образца, инженерными системами этих домов, системами энергосбережения этих домов (до реконструкции, после реконструкции).
469. Концепція суспільства К. Поппера 130 KB
  Комплексний аналіз сутності й складових концепції суспільства К.Поппера, її ролі у системі філософських знань людства про суспільство, а також сучасної практичної цінності вказаної концепції. Критичний раціоналізм як методологічна основа соціальної теорії К.Поппера.
470. Расчёт себестоимости и формирование плановой сметы затрат для выполнения работы по теме: Восстановление данных с мобильного телефона 474.84 KB
  Теоретическая составляющая. Критерии и показатели, определяющие смету затрат на выполнение работы по оптимизации работы ПК. Расчёт затрат на основные и вспомогательные материалы. Расчёт затрат на ремонт, содержание и эксплуатацию оборудования и оснастки.
471. Теория системно-информационного подхода 1.46 MB
  Информационный принцип максимальной энтропии. Определения количества возможных схем разделения исходной смеси. Задача выбора оптимальной схемы разделения. Оптимальная декомпозиция ректификационной системы. Распределение концентраций компонентов в выходных потоках.
472. Создание реалистического изображения трехмерной сцены методом трассировки лучей 254.5 KB
  Базовые возможности и входной язык программы синтеза реалистических изображений на основе метода трассировки лучей, разработать трехмерный композитный объект с применением операций конструктивной твердотельной геометрии (CSG).
473. Карбюратор Солекс Ваз 2108 176.5 KB
  Устройство карбюратора ВАЗ Солекс. Экономайзер мощностных режимов состоит. Следует отметить, что экономайзер мощностных режимов карбюратора 2108 Солекс вступает в работу при практически полностью нажатой педали газа.
474. Исследование электрических цепей при переходных процессах первого и второго родов 407 KB
  Расчёт и исследование электрических цепей при переходных процессах. При решении задач использовались законы коммутации: iL(0-)=iL(0+), UC(0-) = UC(0+). Также использовался метод наложения при определении некоторых токов и напряжений в промежуточных стадиях решения задач.