ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 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 – это индекс.

Оператор цикла с параметром.

Если нам известно число повторений одних и тех же действий, то удобно применять этот оператор.

Синтаксис:

  1. FOR <параметр цикла>:=<начальное значение> TO <конечное значение> DO <оператор>;

  2. FOR <параметр цикла>:=<конечное значение> DOWNTO <начальное значение> DO <оператор>;

<оператор> (тело цикла) может быть простым, составным и пустым.

<параметр цикла> может быть только целочисленного или перечислимого типа и должен быть описан как переменная.

Шаг цикла всегда постоянный (+1 или -1) – это недостаток. Если нужен другой шаг, то используются другие операторы цикла WHILE…DO или REPEAT…UNTIL.

Семантика:

I=1

оператор

I=i+1

i>n

да

  1. Параметру цикла присваивается начальное значение;

  2. Следует проверка: параметр цикла больше конечного значения?

  3. Если проверка истинна, то цикл заканчивается, и управление передается следующему за циклом оператору;

  4. Если проверка ложна, то выполняется оператор (тело цикла);

  5. Параметр цикла получает следующее значение и всё повторяется со 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 следует помнить о двух вещах:

  1. Цикл обязательно должен завершиться, поэтому тело цикла S должно влиять на <B>;

  2. <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

Описание матрицы:

  1. VAR A:array[1..10,1..15] of <тип>;

  2. 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) над главной диагональю.

  1. Главная диагональ: a11, a22, a33, …, ann, т.е. i=j.

  2. Под главной диагональю: a21,a32, …, т.е. i>j.

  3. Над главной диагональю: 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