Пусть нужно решить уравнение f(х)=0, из которого мы получаем уравнение следующего вида: х=u(х), для решения этого уравнения методом итераций необхдимо составить последовательность приближений, причем надо учитывать что далеко не каждая последовательность приведет нас к нахождению корня, необходимым и достаточным условием для использования метода итераций является u’(x)<1. Итак, для нахождения последовательности выбираем произвольно х0, вплоть до случайного числа, вычисляем х1=U(х0), х2=U(х1) х3=U(х2) и т.д. опка не будет выполнено неравенство |хi-xi+1|
Y
0 a x1 x2…..... xn-2 xn X
Задача 3. Пусть непрерывная положительная на отрезке [a,b] (aНа каждом из отрезков [xi,xi+1] как на основании, построим прямоугольник с высотой f(xi).
Площадь прямоугольников мы умеем находить. Сумма площадей всех прямоугольников даст приближенное значение площади фигуры:
Естественно, что чем мельче будет разбиение, тем точнее мы подсчитаем площадь фигуры.
Для отладки программы возьмем функцию f(x2) на отрезке [1,2]. Площадь фигуры равна 2,333….
end;
Function F(x:real):real;
begin
F:=Sgr(x)
end;
BEGIN
Writeln(‘введите интервал и число частей для разбивки’); readln(a,b,n);
x:=a; dx:=(b-a)/n; s:=0;
For i:=1 to n-1 do
begin
s:=s+F(x);
x:=x+dx;
end;
writeln(‘Результат = ’,(b-a)/n*s);
readln;
end.
Вычислить площадь криволинейных трапеций для следующих функций: f(x)=1/(1+x) [0,1] f(x)=1/x [1,3]
f(x)=sinx [0,/2]
Для вычисления длины дуги воспользуемся тем же разбиением на прямоугольники, с тем лишь отличием что будем брать сумму длин гипотенуз прямоугольных треугольников… до тех пор пока разница между предыдущим и текущим значением не будет меньше заданной точности.
Задача 4. Для вычисления элементарных функций в математике широко распространено представление этих функций в виде некоторых бесконечных сумм. Не вдаваясь в обоснование таких представлений, приведем некоторые их них :
ex=1 + x + x2/2! + x3/3! + … + xn/n! + …
sinx=x – x3/3! + x5/5! – x7/7! +…+ (-1)nx2n-1/(2n+1)! +….
cosx= 1 – x2/2! + x4/4! – x6/6! +…+ (-1)nx2n/(2n)! +….
ln(1+x)=x – x2/2 + x3/3 – x4/4 + …+ (-1)n+1xn/n + ….. (-1
В каждом из разложений точность представления функции будет, вообще говоря, тем выше, чем больше взято слагаемых в сумме. Причем значения самих слагаемых с ростом n стремятся к нулю. Для вычисления значений функции с некоторой заданной точностью поступают следующим образом. Вычисляют и суммируют слагаемые до тех тор, пока очередное слагаемое не станет по абсолютной величине меньше или абсолютное значение разности между соседними слагаемыми не станет меньше . Полученную сумму и принимают за приближенное значение функции.
Вычисли функцию sinx.
Program rad;
const eps=1.0E-3;
var x,sn,ss : real;
p, n : integer;
{p – используется для чередования знака слагаемого}
Function Eg(x,y;real):boolean;
begin
Eg:=Abs(x-y)
end;
Function F(n:integer;var x:real):real;
var i:integer;
s:longint;
begin
s:=1;
for i:=2 to n do s:=s*i;
x:=x*sqr(x); F:=x/s
end;
BEGIN
writeln(‘Введите значение х’);
readln(x);
ss:=0; sn:=x; n:=1; p:=1;
Repeat
ss:=sn; {предыдущее значение слагаемого}
{ новое значение слагаемого}
n:=n+2; p:=-1*p; sn:=ss+p*F(n,x)
Until Eq(ss,sn) or (n>=12);
Writeln(‘Результат=’,sn); readln
end.
Задача 5. Метод Монте-Карло для приближенного вычисления площади.
Пусть есть какая-нибудь фигура на плоскости, расположенная внутри стандартного квадрата со сторонами параллельными координатным осям.
Пусть про любую точку квадрата мы можем быстро узнать, попадает ли эта точка внутрь фигуры или нет.
Для выбора точек используют случайные числа Random(x)
Если вызвать функцию много раз подряд, то множество полученных чисел будет равномерно распределено по отрезку [0,a]
Program ss;
var n: integer; {количество точек}
a : integer; {длина стороны квадрата}
m, i : integer;
x,y : real;
begin
writeln(‘введите кол-во точек и сторону квадрата’);
readln(n,a);
m:=0;
for i:=1 to n do
begin
x:=Rondom(a); y:=Random(a);
if точка(x,y) внутри квадрата then m:=m+1
end;
S:=(m/n)*a*a
writeln(‘Результат ’,s);
end.
11 класс.
Множества.
Множество в Паскале представляет собой набор различных элементов одного (базового) типа.
Базовый тип – это совокупность всех возможных элементов множества. Всего в базовом типе должно быть не более 256 различных элементов. Значение переменной множественного типа может содержать любое количество различных элементов базового типа – от нуля элементов (пустое множество) до всех возможных значений базового типа
Множества, используемые в программе, могут быть описаны либо в разделе Type:
Type <имя типа> = Set Of <тип элементов>;
Var <имя множества> : <имя типа>;
Либо непосредственно в разделе описания переменных Var:
Var <имя множества> : Set Of <тип элементов>;
Пример.
Type mnog_Char=Set Of Char;
Var mn1 : Set Of Char;
mn2 : mnog_Char;
mn3 : Set Of ‘A’..’Z’;
s1 : Set Of Byte;
s2 : Set Of 1000..1200;
Здесь mn1 и mn2 – это множества символов; так как различных символов всего 256, то тип Char можно использовать в качестве базового;
mn3 – множество больших латинских букв;
s1 – множество целых чисел (от 0 до 255); так как тип Byte содержит только целые числа от 0 до 255, его тоже можно использовать в качестве базового типа элементов;
s2 – множество целых чисел от 1000 до 1200.
Формирование (конструирование) множеств. В программе элементы множества задаются в квадратных скобках, через запятую. Если элементы идут подряд друг за другом, то можно использовать диапазон.
Пример Type digit = Set Of 1..5;
Var s : digit;
Переменная s может принимать значения, состоящие из любой совокупности целых чисел от 1 до 5;
[ ] - пустое множество;
[1], [2], [3], [4], [5] – одноэлементные множества;
[1,2], [1,3], …., [2,4], [4,5] – двухэлементные множества (пара любых элементов);
[1,2,3], [1,2,4], … , [3,4,5] - трехэлементные (тройка элементов);
[1,2,3,4], [1,2,3,5], [1,2,4,5], [1,3,4,5], [2,3,4,5] - четырехэлементные;
[1,2,3,4,5] – полное множество (взяты все элементы базового типа).
Операции над множествами
Объединение двух данных множеств называется множество элементов, принадлежащих хотя бы одному из этих множеств. Знак операции объединения множеств - «+».
A B A+B
Примеры
1) [‘A’, ‘F’] + [‘B’, ‘D’] = [‘A’, ‘F’, ‘B’, ‘D’];
2) [1..3, 5, 7, 11] + [3..8, 10, 12, 15..20] = [1..8, 10..12, 15..20]
Пусть S1:=[1..5, 9], a S2:=[3..7, 12]. Тогда если S:=S1 + S2,
то S=[1..7, 9, 12].
Пусть А1:=[‘a’..’z’]; A1:=A1 = [‘A’]. Тогда A1=[‘A’, ‘a’..’z’].
Пересечением двух множеств называется множество элементов, принадлежащих одновременно и первому, и второму множеству. Знак операции пересечения - «*».
А B A*B
Примеры.
-
[‘A’, ‘F’] * [‘B’, ‘D’] = [ ] , так как общих элементов нет;
-
[1..3, 5, 7, 11] * [3..8, 10, 12, 15..20] = [3, 5, 7];
-
если S1:=[1..5, 9] и S2:=[3..7, 12], a S:=S1 * S2, то S=[3..5].
Разностью двух множеств называется множество, состоящее из тех элементов первого множества, которые не являются элементами второго. Знак операций вычитания множеств - «»
A B A-B
Примеры.
[‘A’, ‘F’] – [‘B’, ‘D’] = [‘A’, ’F’ ] , так как общих элементов нет;
[1..3, 5, 7, 11] – [3..8, 10, 12, 15..20] = [1, 2, 11];
если S1:=[1..5, 9] и S2:=[3..7, 12], a S:=S1 – S2, то S=[1, 2, 9];
A1:=[‘A’..’Z’]; A1:=A1 – [‘A’]. Тогда А1=[‘B’..’Z’].
Операция определения принадлежности
элемента множеству
Эта логическая операция обозначается служебным словом in. Результат операции имеет значение true, если элемент входит в множество, и false в противном случае.
Примеры.
-
Выражение 5 in [3..7] имеет значение true, так как 5 [3;7]
Выражение ‘a’ in [‘A’..’Z’] имеет значение false, так как маленькой латинской буквы «а» нет среди больших латинских букв.
Сравнение множеств
Для сравнения множеств используются операции отношения:
= - проверка на равенство (совпадение) двух множеств;
<> - проверка на неравенство двух множеств;
<=, < - проверка на вхождение первого множества во второе множество;
>=, > - проверка на вхождение второго множества в первое множество.
Первое множество меньше или равно второму (AB)
B A B A B A
true false true
Первое множество меньше второго (A
B
B A B A A
true false false
Пример. Составить программу выделения следующих множеств из множества целых чисел от 1 до 30 :
- множества чисел, кратных 2;
- множества чисел, кратных 3;
- множества чисел, кратных 6;
- множества чисел, кратных 2 или 3;
Вопросы для обсуждения :
1. Сколько множеств надо описать? (Каков тип их элементов? (четыре множества с элементами типа Byte).
2. Каково начальное значение множеств ? (начальное значение множеств – пустое множество).
3. Как формируются множества? (Первые два формируются перебором всех чисел данного промежутка и отбором подходящих, а третье и четвертое получаются из первых двух путем применения операции пересечения или объединения).
4. Как осуществить вывод сформированных множеств? (Вывод множеств производится ТОЛЬКО поэлементно, поэтому удобно составить процедуру и передавать в нее множество, элементы которого и будут выводить на экран. Для этого в разделе типов надо создать соответствующий тип и использовать его в дальнейшем).
Program mnog;
const n=30;
type mn=Set Of 1..n;
var n2, n3, n6, n23 : mn;
k : integer;
procedure print(m: mn);
var i: integer;
begin
for i:=1 to n do if i In m then write(i:3);
writeln;
end;
BEGIN
n2=[ ]; n3=[ ];
for k:=1 to n do
begin
{если число делится на 2, то заносим его в n2 }
if k Mod 2 = 0 Then n2:=n2+[k];
{если число делится на 3, то заносим его в n3 }
if k Mod 3 = 0 Then n3:=n3+[k];
end;
{числа, кратные 6, - это те, которые кратны и 2 и 3, поэтому это пересечение двух множеств, а числа, кратные 2 или 3, - это объединение этих же множеств}
n6:=n2*n3; n23:=n2+n3;
writeln(‘числа, кратные 2’); print(n2);
writeln(‘числа, кратные 3’); print(n3);
writeln(‘числа, кратные 6’); print(n6);
writeln(‘числа, кратные 2 или 3’); print(n23);
END.
Пример 2. Если взять то общее, что есть у боба с ложкой, добавить кота и поместить в тепло, то получится муравей. Так ли это ?
program bob;
var y1, y2, y3, y4, x : Set Of Char;
s : Char;
BEGIN
y1:=[‘б’, ‘о’, ‘б’]; y2:=[‘л’, ‘о’, ‘ж’, ‘к’, ‘а’];
y3:=[‘к’, ‘о’, ‘т’]; y4:=[‘т’, ‘е’, ‘п’, ‘л’, ‘о’];
x:=(y1*y2) + y3 – y4;
writeln(‘множество х’);
for s:=’a’ to ‘я’ do if s In x then write(s); writeln;
{проверка: состоит ли муравей из кота}
if y3<=x then write(‘муравей состоит из кота’)
else write(‘муравей не состоит из кота’);
END.
Пример 3. Дан ребус МУХА + МУХА = СЛОН
Каждой букве соответствует некоторая цифра, разным буквам соответствуют разные цифры. Необходимо заменить буквы цифрами так, чтобы получить верное равенство.
Для решения этой задачи применим метод перебора с возвратом. Используем множество S1 для хранения цифр слова МУХА, причем будем заносить в него цифры последовательно, учитывая уже внесенные цифры. Начальное значение S1 – пустое множество. После выбора всех цифр первого слова формируем соответствующее число и находим число, соответствующее слову СЛОН. Выделяем цифры СЛОНа (множество S2), и если слова состоят из различных цифр (то есть пересечение S1 и S2 пустое) и все цифры СЛОНа разные, то выводим решение на экран. Далее удаляем из множества S1 последнюю внесенную цифру и пытаемся выбрать еще одно ее значение. Таким образом, мы перебираем все возможные варианты и выводим на экран только те, которые удовлетворяют равенству.
Заметим, что букве «М» в слове МУХА может соответствовать цифра от 1 до 4, а букве «А» в этом же слове не может соответствовать 0.
Program myxa;
type mn=Set Of 0..9;
var m, y, x, a : 0..9; {цифры числа МУХА}
n1, n2 : integer; {числа МУХА и СЛОН}
a1, a2, a3, a4 : 0..9; {цифры числа СЛОН}
S1, S2 :mn;
procedure Print(x,y:integer); {вывод решения в виде ребуса }
begin
writeln(x:5);
writeln(‘+’);
writeln(x:5);
writeln(‘____’);
writeln(y:5);
end;
BEGIN
s1:=[ ]; s2:= [ ];
for m:=1 to 4 do
begin
s1:=s1+[m]; { заносим первую использованную цифру}
for y:=0 to 9 do {если это цифра не была еще взята, то добавляем ее во множество цифр числа МУХА и выбираем цифру для следующей буквы }
if Not (y In s1)
then begin s1:=s1+[y];
for x:=0 to 9 do
if Not (x In s1)
then begin s1:=s1+x;
for a:=1 to 9 do
if Not (a In s1)
then begin s1:=s1+[a];
n1:=1000*m+100*y+10*x+a;
n2:=2*n1;
a1:=n2 div 1000;
a2:=n2 div 100 mod 10;
a3:=n2 div 10 mod 10;
a4:=n2 mod 10;
s2:=[a1,a2,a3,a4];
if (s1*s2=[]) and ([a1]*[a2]*[a3]*a[4]=[])
then Print(n1,n2);
s1:=s1-[a];
end;
s1:=s1-[x];
end;
s1:=s1-[y];
end;
s1:=s1-[m];
end;
END.
Задачи:
-
Дана непустая последовательность символов. Построить и напечатать множества, элементами которых являются встречающиеся в тексте:
-
цифры от ‘0’ до ‘9’ и знаки арифметических операций;
-
буквы от ‘A’ до ‘F’ и от ‘X’ до ‘Z’;
-
знаки препинания и буквы от ‘E’ до ‘N’.
-
Вывести в алфавитном порядке элементы множества, составленного из произвольных букв от ‘A’ ….’Z’.
-
Составить программу печати в возрастающем порядке всех цифр, входящих в десятичную запись данного числа..
-
Дан текст. Вывести в алфавитном порядке все буквы текста, входящих в него : а) не менее двух раз; б)не более двух раз; в) более двух раз.
-
Дан текст. Подсчитать количество строчных и прописных букв.
-
Составить программу подсчета общего количества цифр и знаков ‘+’, ‘-‘, ‘*’ в строке s, введенной с клавиатуры.
-
Задано множество вычислительных машин. Известен набор машин, имеющих в каждом из 10 техникумов. Построить и распечатать множества, включающие в себя вычислительные машины :
а) которыми обеспечены все техникумы;
б) которые имеет хотя бы один техникум;
в) которых нет ни в одном техникуме.
-
Составить программу формирования множества строчных латинских букв, входящих в строку, введенную с клавиатуры, и подсчета количества знаков препинания в ней.
-
Написать программы решения ребусов :
а) ЛОБ + ТРИ = САМ, б) ИСК + ИСК = КСИ,
в) ТОЧКА + КРУГ = КОНУС г) VOLVO + FIAT = MOTOR,
д) АВ + ВС + СА = АВС.
-
Дана не пустая последовательность символов. Напечатать количество вхождений в данную последовательность заглавных латинских букв ‘A’, ‘B’, ‘C’.
-
Вывести на экран все простые числа от 11 до 101.
Создание меню.
Меню бывает линейное и вложенное, горизонтальное и вертикальное, причем вложенное меню создают горизонтальным. Для организации линейного меню необходимо вывести имена каждого меню на экран, причем первое выделив каким нибудь образом. При нажатии стрелок влево или вправо происходит смещение выделения с одного раздела меню на другое, то есть с того которое было выделено снимается подсветка, а следующее (предыдущее) подсвечивается, если стрелка была нажата на конечном меню, то необходимо с него снять а подсветить либо первое, либо последнее. При нажатии клавиши Home – подсвечивается первый раздел меню, End – последний, при нажатии Esc – происходит выход из программы. При нажатии клавиши Enter происходит выполнение действия которое указано в меню.
Задача: Составить программу для организации функционирования следующего меню:
сложение
1 число
2 число
вычитание
умножение
деление
результат
При выборе первых двух пунктов появляется экран на котором запрашивается значения соответсвенно первого или второго чисел, при выборе 3, 4, 5 или 6 пунктов выдается сообщение что соответсвующее дейсвтие выполнено, но полученное значение не выводится. При этом необходимо отслеживать введены ли оба числа, если не хватает хотя бы одног нужно выдать сообщения вида: «Не хватает данных». При выборе меню результат нужно вывести результат выполнения последнего действия, если действий не было совершено то нужно об этом сказать.
Для организации линейного меню необходимо пользоваться одномерным массивом.
При организации вложенного меню необходимо использовать двухмерный массив, но и учесть еще следующие моменты, во-первых, при выборе одного из пунктов основного меню открывается панель подменю и уже выбор одного из подпунктов будет приводить к выполнению орпеделнного действия. При нажатии стрелочки в сторону при открытом подменю, оно закрывается, а открывается то в сторону которого была нажата стрелка.
Работа с мышью
Для того чтобы добавить в прорамму курсор мыши и организовать с ним работу, необходимо подключить модуль mouse. При этом в текстовом режиме курсор будет выглядеть в виде прямоугольника (размерами 8х8, при этом указывается координаты верхнего левого угла), а в графическом в виде стрелки.
Для того чтобы на экране появился курсор мыши необходимо запустить процедуру mouseshow. Для отключения изображения курсора выполняется процедура mousehide. Это необходимо делать из-за того, что при выводе на экран в точку, где изображен курсор, может происходить несколько не приятные искажения игуры или числа (т.к. в графическом режиме точки закрытые курсором закрашены не будут).
Для организации действий по желчку мыши необходимо использовать процедуру mouseread(x,y,b); где х и у – это координаты указателя (в графическом режиме размер 640х200), а b – информация о нажатой клавише мыши, все три параметра должны иметь тип word. Варианты значений параметра b: 0 – клавиша не была нажата; 1 – была нажата левая клавиша мыши; 2 – была нажата правая клавиша мыши; 3 – были нажаты одновременно левая и правая клавиши мыши (либо средняя).
Приведем фрагмент программы выполнение которой приведет к тому что по щелчку левой клавиши мыши на экране в левом верхнем углу будут отображаться сведения о координатах нахождения курсора мыши.
Для графического режима:
mouseshow;
repeat
mouseread(x,y,b);
if b=1 then begin
delay(100);
setfillstile(1,0);
bar(0,0,60,10);
str(x,xg); str(y,yg);
outtextxy(1,1,xg);
outtextxy(30,1,yg);
end;
until b=2;
Ниже приведен фрагмент программы который отображает в верхнем левом углу сведения о координатах курсора мыши соответсвующие его местоположению на экране.
Для текстового режима:
mouseshow;
repeat
mouseread(x,y,b);
gotoxy(1,1);
write(x:3,y:5);
xt:=x div 8+1;
yt:=y div 8+1;
gotoxy(1,2);
write(xt:3,yt:5);
until b=2;
Задачи:
-
Изображение звездочки в точке нажатия клавиши мыши.
-
Создать модель пианино. Изображение клавиш при щелчке, по которым происходит звук соотвествующий нажатой ноте.
-
Дана панель содержащая буквы алфавита, а также кнопку очистки экрана. при щелчке по букве происходит ее выделение, при двойном щелчке выделение снимается, при щелчке по другой букве с предыдущей выделение снимается а выделяется та по которой произвели щелчок. При выделенной букве и при щелчке в любом месте экрана кроме панели появляется изображение этой буквы на экране там где произвели щелчок. Щелчок по кнопке очистка приводит к тому, что очищается весь экран за исключением панели.
-
Аналогично третьей задаче только происходит перетаскивание букв на экран.
Самостоятельная работа.
Создать модель мозаики.
Работа с графическими файлами.
Паскаль позволяет осуществлять работу с графическими файлами созданными в других программах, например в CPENе (размер полученого файла 640х350), при этом нужно следить чтобы созданные файлы были сохранены в формате .pcx.
Для работы с файлами формата .pcx необходимо подключить модуль pcxfile.
Для работы с графическими файлами используют следующие функции: функция считывания изображения из файла pcxread(x,y,name,page):word. x,y – координаты верхнего левого угла файла с которых начинается считывание (в основном 0,0), name – имя файла с рисунком, page – номер страницы на которую будем считывать данный файл (при низком разрешении экрана можно создавать четыре страницы: 0, 1, 2, 3; при среднем разрешении экрана таких старниц уже только две: 0, 1; ну а при высоком разрешении экрана только одна 0).
Если необходимо сохранить файл созданный средствами паскаля в файл с расширением .pcx, то это можно сделать с помощью функции pcxwrite(x1,y1,x2,y2,name,page):word.