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


 

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

84965. Комп’ютерна підтримка української мови. Ненаголошені е та и. Програма “Незнайка на містку” 175.63 KB
  Удосконалення вмінь працювати мишкою у програмі “Незнайко на містку”. Закріплення правил правопису ненаголошених е, и в корені слів, Розвиток вмінь практично застосовувати набуті знання; Підвищення інтересу до роботи з комп’ютером.
84966. Комп’ютерна підтримка української та англійської мови. Програма “Ведмедик-поліглот” 293.5 KB
  Удосконалення знань слів української та англійської мови, уміння їх перекладати. Розвиток просторової уяви, логічного мислення, уваги. Продовження формування умінь і навичок роботи з комп’ютером.
84967. Техніка безпеки при роботі з комп’ютером 94.4 KB
  Техніка безпеки при роботі з комп’ютером Мета. Навчити учнів поводитися в комп’ютерному класі дотримуючись усіх правил техніки безпеки ТБ. Виховувати культуру поведінки в комп’ютерному класі толерантність при роботі в парах культуру мовлення і бережливе ставлення до держмайна. Хто знає в який клас ми прийшли Чи доводилось тобі працювати з комп’ютером А чи знаєш ти що таке комп’ютер Робота з тлумачним словником.
84968. Обговорення можливостей і демонстрація режимів комп’ютера. Гра “Стрільці по яблуках” 131.78 KB
  Дати уявлення про використання комп’ютера в побутовій сфері. Познайомити з маніпулятором “миша”, вчити дітей керувати подіями за допомогою миші. Розвивати логічне мислення, збагачувати мовлення учнів словами: “миша”, “стрілка-вказівник”, “килимок”. Розвивати загальний кругозір учнів, дрібну моторику руки...
84969. Застосування комп’ютера у різних сферах діяльності 59.72 KB
  Ознайомити учнів з можливостями застосування комп’ютера у різних сферах діяльності. Повторити правила техніки безпеки. Закріплювати уміння працювати з клавіатурою, використовуючи клавіші “Space” (пропуск)...
84970. Складові частини комп’ютера. Призначення окремих блоків комп’ютера (клавіатура, миша, монітор, системний блок, принтер). Програма “Лісова галявина” 166.5 KB
  Ознайомлення учнів з складовими частинами комп’ютера. Відпрацювання практичних навичок роботи на комп’ютері. Формування навичок роботи з мишею, зокрема знайомство з операцією “перетягни й кинь”. Розвиток просторової уяви, пам’яті, логічного мислення, спостережливості. Виховання культури навчальної праці при роботі з комп’ютером.
84971. Істинні та хибні висловлювання. Приклади логічних умов у повсякденному житті. Програма “Мильні бульки” 162.15 KB
  Розкриття змісту поняття “істинні та хибні висловлювання”, розрізнення їх; Ознайомлення з прийомом роботи з мишею – подвійним щигликом; Розвиток логічного мислення учнів, уваги, пам’яті. Закріплення правил поводження у комп’ютерному класі.
84972. Розвиток логічного мислення і математичних здібностей. “Розбірні малюнки” 118.93 KB
  Формування умінь роботи з комп’ютером, користування мишею. Розвиток уваги, логічного мислення, просторової уяви, пам’яті. Виховання цікавості до інформатики, інформаційної культури.
84973. Короткі історичні відомості про старовинні обчислювальні прилади. Програма “Космодром” 203.18 KB
  Як потрібно заходити до комп’ютерного класу Поведінка дітей в комп’ютерному класі. Коли можна розпочинати роботу за комп’ютером На якій відстані повинні сидіти діти за комп’ютером Що потрібно робити по закінченню роботи в комп’ютерному класі ІІІ. Які дії можна виконувати за допомогою комп’ютерної миші ІV.