WinRAR ZIP archi / 2011_Лабораторные по инф_паскаль_Ч2
.pdfКомпьютерная программа для реализации метода половинного деления имеет вид:
program N_18_2;
var
A, B, C, EPS: real;
{A,B-концы отрезка[A,B];EPS - абсолютная дoпустимая погрешность результата.}
function func_x(x: real): real; begin
func_x := cos(2 / x) - 2 * sin(1 / x) + 1 / x; end;
begin
write('Задайте интервал:'); readln(a, b);
if func_x(a) * func_x(B) < 0 then {Проверка на-
личия корней на заданном интервале} begin
write('дoпустимая погрешность='); readln(EPS);
while ABS(A - B) > EPS do { Начало цикла ПОКА} begin
writeln(' A=', A:12:8, ' B=', B:12:8); C := (A + B) / 2;
if func_x(C) <> 0 then begin
if func_x(C) * func_x(B) < 0 then A := C
else
B := C
end else
a := c;
end;
writeln(' Корень=', A:12:8); end
else
writeln(' Интервал задан неверно! На данном интервале нет корней');
end.
21
Метод простых итераций
Предположим, уравнение f(x) = 0 при помощи некоторых тождественных преобразований приведено к виду x=φ(x).
Далее на отрезке [a,b] выбирается точка x0 и последовательно вы-
числяется: x1= φ (x0), x2= φ (x1), ... xi+1= φ (xi) ……. ( такие вычис-
ления по одной и той же формуле xi+1= φ (xi), когда полученное на предыдущем шаге значение используется на последующем шаге, называет-
ся итерациями),
до тех пор, пока соблюдается условие xi+1-xi>e, где e - заданная погрешность вычисления корня x*. Итерационный процесс сходится
(т.е. xi→ x*, при i → ∞ ), если φ'(x)<1 при а<x<b.
Начало
'Задайте начальное значение Х='
x
'Задайте абсолютную дoпустимую погрешность
eps
s := 0
ABS(f - x) > EPS
Y f, ' '
s := s + 1 x := f
calc(x)
'Корень уравнения x=', x:12:8, ' Число итераций=', s
'Проверка x-sin(x)-0.2 =', x - sin(x)
-0.2:10:4
Конец
Рисунок 18.4 Схема алгоритма метода простых итераций
22
Программа, реализующая метод итераций, имеет вид:
program N_18_3;
{Решение уравнения x-sin(x)-0.2=0 методом итераций}
var
f, x, eps, s: real;{описание глобальных переменных}
procedure calc(y: real); begin
f := sin(y) + 0.2; end;
begin
write('Задайте начальное значение Х='); readln(x);
write('Задайте абсолютную дoпустимую погрешность
результата='); |
|
readln(eps); |
|
s := 0; |
|
while ABS(f - x) > EPS do |
|
begin |
|
writeln(f, ' '); |
|
s := s + 1; {Счетчик числа итераций} |
|
x := f; |
|
calc(x); |
|
end; |
Чис- |
writeln('Корень уравнения x=', x:12:8, ' |
|
ло итераций=', s); |
|
writeln('Проверка x-sin(x)-0.2 =', x - sin(x) - 0.2:10:4);
end.
В подпрограмме записано выражение φ (x)=sin(x)+0,25 соответствующее решению трансцендентного уравнения x-sin(x)-0,25=0. Для начального значения x0=1.2 и погрешности ε=0.000001 получим x=1.1712297.
Задания 1: решить три из приведенных в таблице 18.1 уравнений (по выбору)
методом половинного деления c допустимой погрешностью ε =10-5.
23
2: Решить три из приведенных в таблице 18.2 уравнений (по выбору) методом итераций c допустимой погрешностью ε=10-5.
Таблица 18.1 Уравнения для решения
|
Уравнение |
|
отрезок |
корень |
||||
1 |
æ 1ö |
|
|
1.9311083 |
||||
|
2,8 - cosç ÷ |
- x = 0 |
[1.5;2.5] |
|
||||
|
|
è xø |
|
|
|
|||
2 |
|
|
|
|
|
[2;3] |
2.2985362 |
|
3sin( x) + 0,35x - 3,8 = 0 |
||||||||
|
|
|
||||||
|
|
|
|
|
||||
3 |
0,25x3 + x -12502, = 0 |
[0;2] |
1.0001143 |
|||||
4 |
3x - 4 log(x) - 5 = 0 |
[2;4] |
3.2299594 |
|||||
|
|
|
|
|
||||
5 |
æ 1 |
ö |
[1.2;2] |
1.3076627 |
||||
|
x - 2 + sinç |
|
÷ = 0 |
|
|
|||
|
|
|
|
|||||
|
|
|
è x |
ø |
|
|
||
6 |
1- x + sin(x) - log(1+ x) = 0 |
[0;1.5] |
1.1474389 |
|||||
|
|
|
|
|||||
7 |
x2 - log(1+ x) - 3 = 0 |
[2;3] |
2.0266893 |
|||||
8 |
log(x) - x +18, = 0 |
[2;3] |
2.8458682 |
|||||
|
|
|
|
|
|
|
|
|
9 |
2 |
|
|
|
|
[0;1] |
|
|
|
0,8e−x - 2x2 = 0 |
|
0,5451310 |
|||||
|
|
|
|
|
|
|
||
10 |
ex2 - 2x2 = 0 |
[0;1] |
0,5398353 |
|||||
|
|
|
|
|
|
|
||
11 |
sin(x) - e−x2 |
= 0 |
[0,π/2] |
0,6805982 |
||||
|
|
|
|
|
|
|
||
12 |
2x2 - 5,2x +13, = 0 |
[1;3] |
2,3198039 |
|||||
|
|
|
|
|
|
|
||
13 |
3,7x2 +18,x - 6 = 0 |
[1;2] |
1,0532092 |
|||||
|
|
|
|
|
|
|
Контрольные вопросы
1.Опишите метод итераций. Условие прекращения процесса.
2.Опишите метод половинного деления. Условие прекращения процесса.
3.В каких случаях целесообразно использовать процедуры и функции пользователя?
4.Описание процедуры в программе. В чем отличие фактических параметров от формальных?
5.Определение функции в программе. Вызов функции. В чем отличие вызова функции от вызова процедуры?
24
Лабораторная работа №19 Обработка текстовых данных (2 часа).
Цель работы: получение практических навыков разработки и выполнения компьютерной программы.
Предмет и содержание работы: разработка и отладка компьютерной программы для обработки текстов.
Технические средства и программное обеспечение: персональный компьютер с операционной системой Windows™, система PascalABC.NET.
Часто возникает необходимость в обработке текста (поиск слов, подсчет числа символов и строк и т.д.). Для этого в Pascal ABC имеется целый ряд средств и специальных функций.
Строковые константы представляют собой любой набор символов, заключенный в апострофы.
const Name = 'Mike';
Строки имеют тип string, состоят из набора последовательно расположенных символов char и используются для представления текста.
Строки могут иметь произвольную длину. К символам в строке можно обращаться, используя индекс: s[i] обозначает i-тый символ в строке, нумерация начинается с единицы. Если индекс i выходит за пределы длины строки, то генерируется исключение.
Операция + для строк означает конкатенацию (слияние) строк. Например: 'Петя'+'Маша' = 'ПетяМаша'.
Операция += для строк добавляет в конец строки - левого операнда строку - правый операнд. Например:
var
s: string := 'Петя';
begin
s += 'Маша'; // s = 'ПетяМаша' writeln(s);
end.
25
Пример 1. Конкатенация двух строк.
Начало
A := 'Иван'
B := ' Петров'
C := A + B
c
Конец
Рисунок 19.1 - Схема алгоритма конкатенации двух строк
program N_19_1;
var
A, B, C: string;
begin
A:= 'Иван';
B:= ' Петров';
C:= A + B; writeln(c);
end.
напечатает текст: Иван Петров
К символам в строке можно обращаться, используя индекс: s[i] обозначает i-тый символ в строке. Обращение к нулевому символу s[0] считается ошибочным.
Имеется 6 операторов сравнения (<, <=, =, <>, >=, >), которые позволяют сравнивать литеры. Сравнение производится по ASCII-кодам символов: большим считается тот символ, код которого больше.
Стандартные процедуры и функции для работы со строками
Length(s) - возвращает длину строки s.
Copy(s,index,count)- возвращает count символов, начиная с index позиции строки s).
Delete(s,index,count) - удаляет в строке s count символов начиная с позиции index.
26
Insert(subs,s,index) - вставляет подстроку subs в строку s с пози-
ции index.
Pos(subs,s) - возвращает позицию первой подстроки subs в строке s (или 0 если подстрока не найдена).
SetLength(s,n) - устанавливает длину строки s равной n. Val(s,v,code) - преобразует строку s к числовому представлению и
записывает результат в переменную v. Если преобразование возможно, то в переменной code возвращается 0, если невозможно, то в code возвращается ненулевое значение.
IntToStr(i) - преобразует целое число в строку.
UpperCase(s) - возвращает строку s, преобразованную к верхнему регистру.
LowerCase(s) - возвращает строку s, преобразованную к нижнему регистру.
Ниже приведено несколько примеров программ для обработки текстов. Их назначение и принцип работы ясны из схем алгоритмов и.текстов программ Пример 2. Выбор заданного числа символов из строки с заданного места.
Начало
'Строка:' s
len := Length(s)
'Длина строки-"', s, '" ', len:3, 'символов'
'Сколько символов выбрать?' count
'С какой позиции?' index
'Пожалуйста:', copy(s, index, count)
Конец
Рисунок 19.2 - Схема алгоритма выбора заданного числа символов из строки с заданного места.
27
program N_19_2;
var
s: string;
index, count, len: integer;
begin write('Строка:'); read(s);
len := Length(s);
writeln('Длина строки-"', s, '" ', len:3, ' символов'); write('Сколько символов выбрать?');
read(count);
write('С какой позиции?'); read(index);
writeln('Пожалуйста:', copy(s, index, count)); end.
Пример 3. Подсчет числа слов в тексте, начинающихся на букву К
Начало
'Подсчет числа слов в тексте, начинающихся на букву К(рус)' 'Строка:'
S
S := ''+ S len := length(s)
'Длина строки-"', S, '"', len:3, 'символов'
1
Рисунок 19.3 - Схема алгоритма подсчет числа слов в тексте, начинаю-
щихся на букву К(часть 1)
28
1
N := 0
i := 1 to len
Y
copy(s, i, 2) = ' К'
N := N + 1
'На букву К начинается', N:4, 'слов'
Конец
Рисунок 19.3 - Схема алгоритма подсчет числа слов в тексте, начинаю-
щихся на букву К(часть 2)
program N_19_3;
var
S: string;
index, count, len, I, N: integer;
begin
writeln('Подсчет числа слов в тексте, начинающихся на букву К(рус)');
write('Строка:'); read(S);
S := ' ' + S;
len := length(s);
writeln('Длина строки-"', S, '"', len:3, ' символов'); N := 0;
for i := 1 to len do
if copy(s, i, 2) = ' К' then N := N + 1; writeln('На букву К начинается', N:4, ' слов');
end.
29
Пример 4 Подсчет общего числа слов, слов, начинающихся на заданную букву, числа букв в тексте.
Начало |
|
|
'Строка:' |
1 |
|
s |
|
|
|
'В заданном тексте-', N:4, 'слов' |
|
'Буква:' |
'На букву ', d, 'начинается', |
|
n1:4, 'слов' |
||
d |
||
'В заданном тексте-', N2:4, |
||
|
||
|
'букв' |
|
d := UpperCase(d) |
|
|
S := UpperCase(s) |
Конец |
|
len := length(s) |
||
|
||
S := ''+ S |
|
|
i := 1 to len + 1 |
|
|
(copy(s, i, 1) = ' ') and |
Y |
|
(copy(s, i + 1, 1) <> ' ') |
|
|
|
N += 1 |
|
(copy(s, i, 2) = (' ' + d)) |
Y |
|
|
||
|
n1 := n1 + 1 |
|
(copy(s, i, 1) <> ' ') |
Y |
|
|
||
|
N2 := N2 + 1 |
1
Рисунок 19.4 - Схема алгоритма подсчета общего числа слов, слов, начинающихся на заданную букву, числа букв в тексте.
30