ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 01.04.2025
Просмотров: 269
Скачиваний: 1
Begin
X:=a+b;
GOTO m1;
999: GOTO KON;
M1: y:=2*x;
GOTO 999;
KON: end.
Условный оператор
Синтаксис: IF <B> THEN <S1> [ELSE <S2>];
Семантика: Если <B> истинно, то выполняется оператор S1, иначе выполняется оператор S2.

S1
S2
S1
или
Составной оператор
Синтаксис: begin <S1>; <S2>; … ; <SN> end;
Семантика: …
S1
S2
SN
Лекция № 6
Условный и составной оператор
Пример1: если A>0 и B>0, то y:=1 и x:=1, иначе y:=0, а x:=2.
IF (A>0) and (B>0) THEN begin y:=1; x:=1; end
ELSE begin y:=0; x:=2 end;
Пример 2:
На языке Pascal:
IF <B1> THEN ELSE begin <S2>;
IF <B2> THEN begin <S3>; <S4>; end;
End;
Пример3: sin2(kx),
если x<0
Вычислить значение y= ln(x+1), если 0<=x<=1
Cos(x/2), если x>1
На языке Pascal:
IF (x>=0) and (x<=1) THEN y:=ln(x+1)
ELSE IF (x<0) THEN y:=sqr(sin(k*x)) ELSE y:=cos(x/2);
Оператор выбора
Синтаксис: case <i> of
<i1>, … :<S1>;
<i2>, … :<S2>;
…
<in>, … :<Sn>;
[ELSE <Sm>]
END;
Где I – это переменная счётного типа (все, кроме real).
Семантика:

S2
Sn
Sm
Пример: var i:integer;
Case i of
1,2,3: y:=0;
5,8: y:=1;
12: y:=5
End;
То же самое с помощью условного оператора IF:
IF (i=1) or (i=2) or (i=3) THEN y:=0;
IF (i=5) or (i=8) THEN y:=1;
IF i=12 THEN y:=5;
Пример: IF <B> THEN <S1> [ELSE <S2>];
Var f:boolean;
Begin
F:=B;
Case f of
True: <S1>;
False: <S2>;
End;
Массивы
Массив (структурированный тип данных) – это однотипная совокупность данных, поименованная, расположенная последовательно (в порядке возрастания индекса) в оперативной памяти.
A
|
A[1] |
A[2] |
… |
A[100] |
Индекс элемента массива записывается в квадратных скобках
1 способ описания массива:
Const n=100;
Var A: array [1..n] of real;
Память под элементы массива выделяется на этапе компиляции программы.
2 способ описания массива:
Type MAS1=array[0..100] of real;
VAR A:MAS1;
До любого элемента в массиве можно добраться по его индексу: A[i], где i – это индекс.
Оператор цикла с параметром.
Если нам известно число повторений одних и тех же действий, то удобно применять этот оператор.
Синтаксис:
-
FOR <параметр цикла>:=<начальное значение> TO <конечное значение> DO <оператор>;
-
FOR <параметр цикла>:=<конечное значение> DOWNTO <начальное значение> DO <оператор>;
<оператор> (тело цикла) может быть простым, составным и пустым.
<параметр цикла> может быть только целочисленного или перечислимого типа и должен быть описан как переменная.
Шаг цикла всегда постоянный (+1 или -1) – это недостаток. Если нужен другой шаг, то используются другие операторы цикла WHILE…DO или REPEAT…UNTIL.
Семантика:
I=1
оператор
I=i+1
i>n
да
-
Параметру цикла присваивается начальное значение;
-
Следует проверка: параметр цикла больше конечного значения?
-
Если проверка истинна, то цикл заканчивается, и управление передается следующему за циклом оператору;
-
Если проверка ложна, то выполняется оператор (тело цикла);
-
Параметр цикла получает следующее значение и всё повторяется со 2) пункта.
Более правильно:
I=1
i>n
оператор
I=i+1
Да
Нет
Нельзя! Изменять начальное, конечное значения и сам параметр цикла внутри цикла. Нельзя писать:
FOR i:=i-5 TO i+5 DO …
Не имеют смысла операторы:
FOR i:=5 TO 4 DO …
FOR i:=4 DOWNTO 5 DO …
Оператор FOR i:=N TO N DO … будет выполнен только один раз.
Пример: Дан массив из 100 элементов A[1..100]. Найти две суммы следующих элементов:
S1=A[1]+A[4]+A[7]+A[10]+ …
S2=A[2]+A[5]+A[8]+A[11]+ …
Program M1;
Type MAS=array [1..100] of real;
Var i,n:integer;
A:MAS;
S1,S2:real;
Begin
<ввод n>;
<ввод массива A>;
S1:=0;
S2:=0;
FOR i:=1 TO n div 3 DO
Begin
S1:=S1+A[3*(i-1)+1];
S2:=S2+A[3*(i-1)+2];
End;
{Печать результатов}
Writeln (S1,S2);
End.
Лекция №7
Оператор цикла с предусловием
Синтаксис:
WHILE <B> DO <S>;
B – логическое выражение;
S – оператор.
Семантика:
B
S
False
true
Оператор S будет выполняться циклически до тех пор, пока истинно <B>. <B> проверяется до начала выполнения цикла. Если <B> ложно, то тело цикла игнорируется, и управление передается оператору, стоящему сразу за телом цикла.
При программировании оператора WHILE … DO следует помнить о двух вещах:
-
Цикл обязательно должен завершиться, поэтому тело цикла S должно влиять на <B>;
-
<B> должно состоять из корректных выражений и значений, определенных до начала цикла, чтобы не привело к ошибкам:
А) неверное число повторений цикла;
Б) получение бесконечного цикла.
Пример:
Вычислить S=
или S=1+1/22+1/32+…+1/n2
Программа (первый вариант):
Program p1;
Var S:real; I,n:integer;
Begin
Readln(n);
S:=0;
I:=1;
While i<=n DO
Begin
S:=S+1/(i*i);
I:=i+1;
End;
Writeln(S);
End.
Второй вариант:
…
Begin
Readln(n);
S:=0;
I:=n;
While i>=1 DO
Begin
S:=S+1/(i*i);
I:=i-1;
End;
Writeln(S);
End.
Оператор цикла с постусловием
Этот оператор такой же, как и While …DO, только условие проверяется после выполнения цикла, поэтому While …DO может не сделать ни одного цикла, а REPEAT…UNTIL хотя бы один цикл сделает.
Синтаксис:
REPEAT
<S1>;
<S2>;
…
<Sn>;
UNTIL <B>;
Где S1, S2, …,Sn – операторы, а <B> - логическое выражение.
Семантика:
S1
S2
Sn
B
…
False
True
Операторы S1, S2, …,Sn будут выполняться до тех пор, пока <B> ложно. Как только <B> станет истинным, цикл заканчивается и начинает работать оператор после UNTIL.
Бесконечные циклы:
WHILE TRUE DO …;
REPEAT … UNTIL FALSE;
Циклы могут вкладываться друг в друга.
Матрица и описание матрицы.
Пример: A(10,15)
a11
a12
a13
… a1,15 j
I a21 a22 a23 … a2,15
aij
a10,1 a10,2 … a10,15
Описание матрицы:
-
VAR A:array[1..10,1..15] of <тип>;
-
TYPE matr=array[1..10,1..15] of real;
VAR A:matr;
Обращение к элементу матрицы: A[1,2] A[i,j] A[2*i, 3*(j+1)]
Расположение в памяти:
1 строка 2 строка 10 строка
|
A11 |
A12 |
A13 |
… |
A1,15 |
A21 |
A22 |
… |
A10,1 |
A10,15 |
Задача1 Найти min сумму элементов строк (управляемый курсор)
Uses CRT;
GOTOXY (x,y);
Max по y = 25;
Max по x = 80;
Program P1;
Uses CRT;
Type MATR=array[1..10,1..15] of real;
VAR A:MATR;
i,j:integer; S,min:real;
Begin
Clrscr; {очистка экрана}
{ввод матрицы по строкам}
FOR i:=1 TO 10 DO
FOR j:=1 TO 15 DO
Begin
GOTOXY (5*i+30, j+5);
Readln(A[i,j]);
End;
Min:=10E10;
FOR i:=1 TO 10 DO
Begin
S:=0;
FOR j:=1 TO 15 DO
S:=S+a[i,j];
IF S<min THEN min:=S;
Writeln(‘Сумма ‘,I,’ =’,S:6:2);
End;
Writeln(‘min Сумма =’,min:6:2);
End.
Задача 2 Найти три суммы элементов матрицы: 1) на главной диагонали; 2) под главной диагональю; 3) над главной диагональю.
-
Главная диагональ: a11, a22, a33, …, ann, т.е. i=j.
-
Под главной диагональю: a21,a32, …, т.е. i>j.
-
Над главной диагональю: a12,a23, …, т.е. i<j.
Program P2;
Uses crt;
Const m=20;
Type matr=array[1..m, 1..m] of real;
VAR A:matr;
I,j,n:integer;
S1,S2,S3:real;
Begin
Clrscr;
Write(‘введите n<=20 =’);
Readln(n);
Writeln(‘введи матрицу размером ‘,n,’*’,n);
{ввод матрицы по столбцам}
FOR j:=1 TO n DO
FOR i:=1 TO n DO
Begin
GOTOXY(5*j+30,i+5);
Readln(A[I,j]);
End;
S1:=0; S2:=0; S3:=0;
FOR i:=1 TO n DO
FOR j:=1 TO n DO
IF (i=j) THEN S1:=S1+a[I,j] ELSE IF (i>j) THEN S3:=S3+a[I,j] ELSE S2:=S2+a[I,j];
Writeln(S1, S2, S3);
End.
Лекция №8
Дана матрица A[10,10]. Найти сумму элементов под главной диагональю.
1 способ:
i>j
…
S1:=0;

FOR
i:=1 to 10 DO
FOR
j:=1 to 10 DO

IF (i>j) THEN S1:=S1+A[i,j];
Writeln(S1);
…
2 способ:
Внешний цикл 2<=i<=10 – перебор строк
Внутренний цикл 1<=j<=i-1 – перебор столбцов
…
S1:=0;

FOR
i:=2 to 10 DO 
FOR
j:=1 to i-1 DO
S1:=S1+A[i,j];
…
3 способ:
…
S1:=0;

FOR
j:=1 to 9 DO
FOR
i:=j+1 to 10 DO

S1:=S1+A[i,j];
Writeln(S1);
…
4 способ:
…
S1:=0;

FOR
i:=2 to 10 DO

FOR
j:=i-1 DOWNTO 1 DO
S1:=S1+A[i,j];
Writeln(S1);
…
Найти сумму элементов под побочной диаганалью:
…
S:=0;


FOR
j:=10 DOWNTO 2 DO
FOR
i:=12-j TO 10 DO
S:=S+A[i,j]:
…
Досрочный выход из цикла
Дан массив {A}100 = {A1, A2, …, Ai, …, A100}
Определить индекс (номер) первого нулевого элемента.
начало
I=i+1
A100
I=1
Ai=0
i>100
Нет 0
i