Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Paskal_ucheb_posob_ch1_21_11_2011

.pdf
Скачиваний:
47
Добавлен:
09.04.2015
Размер:
943 Кб
Скачать

51

a_n:=chisl/znam*koeff;

while (abs(a_n)>=pogr) do begin summa:= summa+a_n; n:=n+1;

chisl :=exp(n*ln(x)); fact:=1;

for i:=2 to n do fact:= fact * i;

znam:=fact;

if odd(n) then koeff:= -1 else koeff:=1;

a_n:=chisl/znam* koeff;

end;

writeln ('summa ryada=',summa:8:3,' shag=',n); readln;

end.

В данном примере алгоритм подобен предыдущему, только следует правильно выбрать коэффициент, на который нужно умножить элемент ряда. Этот коэффициент +1 или -1 и зависит он степени n. Его вычисление можно произвести в зависимости от четности n, так как ( 1)n записывается в виде формулы ехр(n * Ln(-1)), а натуральный логарифм от -1 не существует.

Упражнение 20.

sin( x )n

Найти сумму ряда из 10 элементов cos( 2x ) , где n номер элемента

ряда.

uses crt; const n=10; var

fact,i ,x,koef:longint; summa,a_n,chisl,znam:real;

begin

clrscr;

writeln(' a(n)=n*(sin(x)/cos(x/2)'); write('input x (zeloe)->'); readln(x);

52

summa:=0;

for i:=1 to n do begin chisl:=sin(x)*i; znam:=cos(x/2); a_n:=chisl/znam; summa:=summa+a_n;

end;

writeln ('summa ryada=',summa:8:3,' shag=',i); readln;

end.

В данном упражнении все просто. Сначала описываются переменные для хранения необходимых значений, потом вводится с клавиатуры Х и значение суммы, которое обнуляется. В цикле сначала рассчитывается очередной элемент ряда (отдельно числитель и знаменатель, потом, собственно, сама дробь), который добавляется в сумму.

Упражнение 21

Дано целое число n (вводится с клавиатуры). Вычислить сумму из n слага-

емых:

y

n!

 

(n

1)!

(n

2)!

 

 

 

 

(n

3)!

 

 

...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2

3

 

4

5

6

7

8

9

10

 

 

 

 

 

uses crt; var

y,znam:real;

k,i,f,z,chisl,j,zz,n,i2:integer;

begin

clrscr;

n:=10;

y:=0;

k:=0;

for i:= n downto 1 do begin f:=1;

for j :=1 to i do f:=f*j;

chisl:=f; i2:=n-i+1; zz:=0;

for z:=k+1 to k+i2 do begin write(z,' '); zz:=zz+z;

53

end;

writeln;

k:=z;

y:=y+chisl/SQRT(zz);

end;

writeln('y=',y:6:2);

readln;

end.

Данный ряд является достаточно сложным в его вычислении. Для подсчета текущего элемента ряда нужно вычислить факториал в числителе. Потом определить количество значений, которые будут входить в подкоренное выражение знаменателя. Затем нужно найти первоначальное значение для суммирования в подкоренном выражении. Теперь рассмотрим алгоритм практически построчно.

n:=10; -это количество элементов в ряде; y:=0; - первоначальное значение суммы ряда; k:=0;- номер элемента ряда;

for i:= n downto 1 do begin – этот цикл служит для перебора элементов ряда от первого к последнему (согласно приведенной формулы вычисление будет производится справа на лево).

f:=1; это первоначальное значение факториала в числителе элемента

ряда;

for j :=1 to i do - здесь вычисляется факториал для числителя f:=f*j;

chisl:=f; - значение числителя;

i2:=n-i+1; - количество элементов для подкоренного выражения zz:=0; - сумма элементов подкоренного выражения

for z:=k+1 to k+i2 do begin - здесь k+1 – начальное значение для суммирования в подкоренном выражении, а k+i2- конечное значение;

write(z,' '); - печать для проверки всех элементов для суммирования в подкоренном выражении знаменателя элемента ряда;

zz:=zz+z; - вычисление суммы для подкоренного выражения end;

writeln;

k:=z; - здесь запоминается последнее значение элемента в подкоренном выражении, которое будет использоваться для следующего подкоренного выражения

y:=y+chisl/SQRT(zz);- вычисление элемента ряда и его добавление в сумму ряда;

end;

Writeln ('y=',y:6:2); печать значения суммы ряда.

54

Readln ;

end.

Начало

 

Z:=

 

 

 

 

 

y

 

 

 

 

k+1 to k+i2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N:=10;

 

z

 

 

 

 

 

 

 

 

 

Y:=0;

 

 

 

 

 

 

Конец

 

 

 

 

 

 

 

 

 

 

 

 

 

K:=0;

 

 

 

 

 

 

 

 

 

 

 

i:=n downto 1

 

Zz:=zz+z;

 

 

 

 

 

 

 

 

F:=1

 

Z:=z+1;

 

 

 

 

 

 

 

 

 

j:=1 to n

 

K:=z;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Y:=y+chisl/sqrt(zz)

 

 

 

 

 

 

 

 

f:=f*j

 

 

 

 

 

 

 

 

 

 

 

 

 

i:=i+1;

 

 

 

 

 

 

 

 

 

J:=j+1;

 

 

 

 

 

 

 

 

 

 

 

Chisl:=f;

 

 

 

 

 

 

 

 

 

 

 

I2:=n-1+1

 

 

 

 

 

 

 

 

 

 

 

Zz;=0;

 

 

 

 

 

 

 

 

 

 

 

Рисунок 8. Блок-схема вычисления ряда.

y

n!

(n

1)!

(n

2)!

 

(n

3)!

...

 

 

 

 

 

 

 

 

 

 

 

1

2

3

4

5

6

7

8

9

10

55

Рисунок 9. Пример реализации программы вычисления ряда.

Упражнение 22.

Дана непустая последовательность различных натуральных целых чисел, за которой следует 0. Определить порядковый номер наименьшего из них. Программу следует реализовать без использования массива чисел.

Для определения наименьшего из всех целых чисел нужно помнить предельные значения данного типа данных: минимальное значение –32768, а максимальное + 32767. Следовательно, изначальное минимальное число должно быть равно максимальному значению выбранного типа данных, а именно MIN:=32767. При дальнейшем переборе вводимых чисел, данное значение минимального сравнивается с введенным числом. Если введенное число меньше значения MIN, то оно в нем фиксируется. Числа добавляются до тех пор пока не будет введен 0.

Program SEM5 ;

Var

MIN,X ,KMIN,K, i : integer; Begin

MIN:=32767; Kmin:=1; i:=1; Readln ( X );

while X<>0 DO begin

if ( X < MIN ) then begin MIN:=X;

Kmin:=i;

end;

i:=i+1;

56

Readln ( X );

end;

Writeln ('номер минимального элемента ', Kmin ); End.

57

СЕМИНАРЫ ЧАСТЬ III

Действия с оператором CASE. Перечислимый и ограниченный типы данных.

Упражнение 23.

Написать программу, которая изображает на экране дни недели.

Program NAMESDAY;

Type DAYS=(‘SU’,’MO’,’TU’,’WE’,’TH’,’FR’,’SA’); Var

DAY : DAYS; Begin

for DAY:=’SU’ to ‘SA’ do case DAY of

‘SU’ : Writeln (' ВОСКРЕСЕНЬЕ '); ‘MO’ : Writeln ('ПОНЕДЕЛЬНИК '); ‘TU’ : Writeln (' ВТОРНИК ');

‘WE’ : Writeln (' СРЕДА '); ‘TH’ : Writeln (' ЧЕТВЕРГ '); ‘FR’ : Writeln (' ПЯТНИЦА '); ‘SA’ : Writeln (' СУББОТА ');

End else Writeln (' WeeKEnd ');

readln;

End.

Для реализации данного задания используется перечислимый тип данных DAYS, в котором указывается необходимый диапазон значений дней недели. Переменная DAY принимает одно значение из перечисленных дней недели. Непосредственно в цикле производится перебор всех дней недели, начиная от первого значения из перечислимого типа данных, и заканчивая последним значением. Если значение переменной – селектора DAY совпадает со значением метки в операторе case, то будет выполнена команда ей соответствующая.

Упражнение 24.

Заданы два ограниченных типа: 1)A..Q - латинские буквы 2)1..9 - цифры. Определить какие из букв 1)русские и латинские 2) только латинские; 3) какие из цифр кратны а) 2 , б) 3 , в) 2 и 3, г) простое число.

58

Для пояснений напомню, что таблица ASCII кодов хранит значения всех символов и цифр. Следовательно, можно описать тип поддиапазон, значениями которого будут символы или цифры из этой таблицы. В данном примере это переменные SYM : 'A'..'G'; I: 1..9;. Далее выборка символов и цифр идет согласно нижеприведенной программе.

Program Q; Var

SYM : 'A'..'G'; I: '1'..'9';

Begin

Write ('input 1 char from A to G'); Readln (sym);

Writeln ('input 1 char from 1 to 9 '); Readln(I);

case SYM of

'A','B','C','E': Writeln ( SYM ); 'D','F','G': Writeln ( SYM );

end; case I of

'2','4','8' : Writeln (I:2,' kratno 2' ); '3','9' : Writeln (I:2,' kratno 3' ); '6' : Writeln (I:2,' kratno 2 & 3' ); '1','5','7' : Writeln (I:2,' prostoe' );

end;

readln;

End.

Упражнение 25.

Написать программу, которая при помощи оператора CASE вводит и выводит значения цветов.

Program COLORE;

Type COLOR=(RED,BLUE,BLACK);

Var

X : integer;

CLR : COLOR;

Begin

write(' color-? ');

readln( X );

59

case X of

0 : CLR:=RED;

1 : CLR:=BLUE;

2 : CLR:=BLACK;

end; writeln('color-'); case CLR of

RED : write('КРАСНЫЙ'); BLUE : write('СИНИЙ'); BLACK : write('ЧЕРНЫЙ');

end;

End.

Строковый тип данных

Для работы со строковыми переменными применяются специальные процедуры и функции, список которых приведен в таблице 15.

Пример описания данных типа STRING: Var

S: string; {в памяти выделяется 256 ячеек (байт), где 1-ый (т.е. нулевой) байт будет служить для запоминания реального количества введенных символов в строку}

S1: string[50]; {под строку выделяется 51 байт, т.к. в описании не учитывается 0 байт}

S2: string [85]; {под строку выделяется 86 байт, т.к. в описании не учитывается 0 байт}

Формат записи

Назначение

операции

 

Concat (Str1, Str2)

Возвращает объединение строк Str1, Str2. Явля-

 

ется аналогом операции конкатенации «+».

Copy (Str1, I, J)

Возвращает часть строки Str1 (ее копию),

 

начиная с позиции I на длину J символов

Delete (Str1, I, J)

Удаляет J символов из строки Str1, начиная с

 

позиции I

Insert (Context, Str1, I)

Вставка подстроки Context в строку Str1, начи-

 

ная с позиции I

Length(Str1)

Возвращает реальную длину строки Str1. Зна-

 

чение функции берется из Str1[0]

Pos(Context, Str1)

Возвращает номер позиции, начиная с которой

 

внешний эталон Context располагается в строке

 

Str1

 

60

 

 

Str (N, Str1)

Преобразование числа N в строку Str1

Val(Str1, X, Code)

Преобразует строку Str1в двоичное X, где Code

 

– код неправильного символа (по умолчанию

 

Code=1)

Таблица 15. Операции для работы со строковыми переменными

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]