Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лекция 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-й интервал из четырёх предусмотренных. Оценка вероятности возможна из соотношения pi ≈ ni / 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(x1)
y = 4
Yes
Yes
Yes
No
No
No
x < -2
x < 1
x < 5
y = 4/x
y = x
y = sqr(x1)
y = 4
Yes
Yes
Yes
No
No
No