Министерство образования Российской Федерации
Сургутский государственный университет
Кафедра «Информатики и вычислительной техники»
ОТЧЕТ О ПРОХОЖДЕНИИ ПРАКТИКИ
В Сургутском государственном университете
тема: Вычислительная практика
Студентка: Руководитель от университета:
Арестова А.Ю. Преподаватель кафедры ИВТ
Группы 11-92 Варфоломеева Н.Б.
Вариант 2
Сургут 2011
Задание 1. Экстремум функции
Вычислить экстремум функции = с заданной точностью ε на интервале [0.2;1.5]. Результаты вычисления записать в тестовый файл. Содержимое этого файла вывести на экран монитора. Привести блок-схему поиска экстремума методом дихотомии. Начальное значение шага: 0.25.
1. Назначение программы: вычисление экстремума функции с заданной точностью методом дихотомии;
2. Перечень функций, выполняемых программой: поиск экстремума функции и построение графика заданной функции (дополнительно);
3. Входные данные: границы интервала [a, b], начальное значение шага dx0, точность eps. Эти величины вещественного типа;
4. Выходные данные: координаты (xe, ye) экстремума, конечное значение шага dx2, количество разбиений n. Последняя величина целочисленного типа, остальные – вещественного типа.
Проектирование (блок-схема №1)
Реализация
program extremum;
{Для Borland Pascal 7.0}
uses
crt,graph;
function f (x: real): real;
{Возвращает значение функции в точке X}
begin
f:=(1-x)*(1-x)*(1-x)*(1-x);
end;
procedure Extrem (a,b,dx0,eps: real; var xe,ye,dx2: real; var n: longint);
{Процедура реализует поиск экстремума функции методом дихотомии. В основе метода дихотомии лежит теорема: "Если непрерывная функция на концах некоторого интервала имеет значения разных знаков, то внутри этого интервала у нее есть корень, являющийся минимумом}
var
y1,y2: real;
begin
n:=0;
dx2:= eps;
while abs(b-a)>eps do
begin
xe:=(a+b)/2;
y1:= f(xe-dx2);
y2:= f(xe+dx2);
if y1<y2 then b:=xe
else a:=xe;
inc (n);
end;
xe:=(a+b)/2;
ye:= f(xe);
end;
procedure ReadFil (fn: string);
{Процедура реализует считывание данных из файла для вывода их на экран}
var
fi:text;
s:string;
begin
assign (fi,fn);
reset (fi);
while not eof (fi) do
begin
readln(fi,s);
writeln(s);
end;
close (fi);
end;
var
x,y,a,b,eps,xe,ye,dx0,dx2: real;
n: longint;
filnm: string;
fi: text;
gd,gm,i,j: integer;
begin
clrscr;
writeln;
TextColor(red); HighVideo;
writeln('PROGRAM: SEARCHING OF THE EXTREMUM '); writeln;
Textcolor(white); HighVideo;
write ('Enter a,b,dx0,eps: ');
readln (a,b,dx0,eps); writeln;
Extrem (a,b,dx0,eps,xe,ye,dx2,n);
write ('Name of file: ');
readln (filnm);
assign (fi,filnm);
rewrite (fi);
writeln;
writeln (fi,'Extremum: (',xe:6:3,', ',ye:6:3,')');
writeln(fi);
writeln(fi,'Iterations: ',n:6);
writeln(fi);
writeln (fi,'Finish step: ',dx2:11:6);
close (fi);
readfil(filnm);
writeln;
writeln('Press any key...');
readkey;
{Переход в графический режим и изображение графика функции}
gd:=detect;
InitGraph(gd,gm,'');
OutTextXY(105,5,'Y');
MoveTo(100,10);
LineTo(100,300);
Lineto(300,300);
OutTextXY(300,295,'X');
HighVideo;
SetLineStyle(0,SolidLn,3);
x:=-5;
while x<5 do
begin
y:=f(x);
PutPixel(round(x*20+100),round(300-y*20),yellow);
x:=x+0.03;
end;
readkey;
CloseGraph;
end.
Задание 2. График функции в текстовом режиме
Построить график функции f(x) = 3sinx на интервале [π/2, π] изменения аргумента x. Использовать стандартные функции текстового режима (модуль CRT). Вычисление f(x) оформить в виде функции.
1. Назначение программы: построение графика функции в текстовом режиме без использования модуля Graph;
2. Перечень функций, выполняемых программой: изображение декартовой системы координат и построение графика функции;
3. Входные данные, вводимые с клавиатуры, отсутствуют. В качестве констант приняты границы интервала [a,b] и количество выводимых точек n;
4. В качестве выходных данных выступают символы, из которых формируется изображение.
Проектирование (блок-схема №2)
Реализация
program text_ris;
{Для Borland Pascal 7.0}
uses crt;
const
a=0;
b=2*pi;
n=30;
var
i,j,k,l: byte;
x,y: real;
xSin,ySin: byte;
dx:real;
function f (x: real): real;
{Возвращает значение функции в точке x}
begin
f:=3 * Sin(x);
end;
begin
clrscr;
TextColor (red); HighVideo;
writeln;
writeln('PROGRAM: UNIT CRT '); writeln;
GoToXY(40,10);
TextColor(magenta);
writeln ('y = 3*Sin(x)');
TextColor (white);
dx:=(b-a)/(n-1);
GoToXY (15,25);
{Изображение оси X}
for i:=10 to 80 do
begin
GoToXY(i,25);
write ('_');
end;
{Изображение оси Y}
for j:=40 downto 5 do
begin
GoToXY (15,j);
write('|');
end;
{Подписи осей координат}
GoToXY (79,26);
write ('X');
GoToXY (13,5);
write ('Y');
GoToXY (13,27);
write ('O');
k:=31;l:=25;
for i:=0 to 2 do
begin
GoToXY(k,l);
write('|');
k:=k+16;
end;
k:=15;l:=20;
for j:=0 to 2 do
begin
GoToXY(k,l);
write('-');
l:=l-5;
end;
GoToXY(13,10);
write ('3');
GoToXY(30,27);
write ('pi/2');
GoToXY (62,27);
write ('3pi/2');
{Изображение точек графика заданной функции}
for i:=0 to n-1 do
begin
x:=dx*i;
y:=f(x);
{Пересчет координат по формулам: xm=x0+x*Mx,ym=y0-y*My, где Mx, My-коэффициенты масштабирования; x, y- физические координаты точки; xm, ym- машинные координаты точки (640, 480); x0, y0- машинные координаты начала физической системы координат}
xSin:=round(x*10+15);
ySin:=round(25-y*5);
GoToXY (xSin,ySin);
if (xSin>31) and (xSin<47)
then
TextColor(magenta)
else
TextColor (yellow);
write ('*');
end;
readkey
end.
Задание 3. Процедурные типы
Использовать процедурные типы в программе, реализующей решение нелинейного алгебраического уравнения методом простой итерации. Управляющий параметр flag и значение x ввести с клавиатуры. Результат вывести на экран монитора. Итерационная формула: , .
1. Назначение программы: вычисление корня нелинейного алгебраического уравнения с заданной точностью методом итерации;
2. Перечень функций, выполняемых программой: вычисление корня с помощью итерационной формулы и осуществление проверки;
3. Формат входных данных: начальное приближение x0 и точность eps вещественного типа; функция f2 процедурного типа; управляющий параметр flag целочисленного типа;
4. Формат выходных данных: количество итераций i целочисленного типа и значение корня x3 вещественного типа. При определенном значении параметра flag выводится результат проверки: ноль с заданной точностью (переменная x4 вещественного типа).
Проектирование (блок-схема №3)
Реализация
program procedure_types;
{Для Borland Pascal 7.0}
uses crt;
type
func=function (x: real): real; {Процедурный тип данных}
function f1(x: real): real; far;
{Возвращает значение функции в точке x. Это исходное уравнение. Описатель far указывает, что функция будет компилироваться в расчете на дальнюю модель памяти}
f1:=x+0.323 - exp(x)/2;
end;
function f2 (x: real): real; far;
{Итерационная формула}
begin
f2:=ln(2*x+0.646);
end;
procedure Find_Root(x0,eps: real; ff: func; var i: integer; var x2: real);
{Процедура поиска корня нелинейного алгебраического уравнения, функция типа func передается в качестве параметра}
var
x1:real;
begin
x1:=x0; i:=1;
repeat
x2:=ff(x1);
if abs (x1-x2) < eps
then break
else
begin
x1:=x2;
inc (i);
end;
until false;
end;
var
flag: byte;
f,ff: func;
it: integer;
x0,x3,x4,eps: real;
begin
clrscr;
writeln;
textcolor (red); HighVideo;
writeln ('PROGRAM: SEARCHING OF THE ROOT F(x)=x+0.323 - exp(x)/2=0...');
writeln;
writeln ('Press:');
textcolor(white);
writeln ('1 - searching of root by iterations'); writeln;
writeln ('2 - searching with checking'); writeln;
write ('->> ');
readln(flag); writeln;
write ('Enter X,eps: ');
readln(x0,eps);
ff:=f2;
Find_Root (x0,eps,ff,it,x3);
writeln;
textcolor (red); HighVideo;
writeln('The root is ',x3:6:3); writeln;
writeln ('The number of iterations: ',it:4); writeln;
if flag=2
then
begin
x4:=f1(x3);
writeln ('Checking: ',x4:9:3);
end;
readkey
end.
Задание 4. Модули
Оформить в виде модуля подпрограммы, реализующие поиск корня нелинейного алгебраического уравнения , . Обратиться к этим подпрограммам из главной программы. Исходные данные ввести с клавиатуры в главной программе. Результаты вывести на экран монитора в главной программе.
1. Назначение программы: вычисление корня нелинейного алгебраического уравнения с заданной точностью методом итерации;
2. Перечень функций, выполняемых программой: вычисление корня с помощью итерационной формулы и осуществление проверки. Все подпрограммы реализованы в виде модуля roots.pas;
3. Формат входных данных: начальное приближение x0 и точность eps вещественного типа;
4. Формат выходных данных: количество итераций i целочисленного типа, значение корня x3 вещественного типа и результат проверки: ноль с заданной точностью (переменная x4 вещественного типа).
Проектирование (блок-схема №4)
Реализация
program procedure_types;
{Для Borland Pascal 7.0}
{Вызов процедур осуществляется в главной программе}
uses
crt,roots;
var
it:integer;
x0,x3,x4,eps:real;
begin
clrscr;
writeln;
TextColor (red); HighVideo;
writeln('PROGRAM: SEARCHING ROOTS OF 3*Sin(sqrt(x))+ 0.35*x-3.8 = 0 ');
writeln;
TextColor (white); HighVideo;
write ('Enter X on interval [2,3]: ');
readln(x0); writeln;
write('Enter eps: '); readln(eps);
FindRoot (x0,eps,it,x3); writeln;
writeln('The root is ',x3:6:3); writeln;
writeln ('The number of iterations: ',it:4); writeln;
x4:=f1(x3);
writeln ('Checking: ',x4:9:3);
readkey
end.
{Модуль roots.pas}
unit roots;
interface
function f1(x:real):real;
function f2 (x:real):real;
procedure FindRoot(x0,eps:real;var i:integer;var x2:real);
implementation
function f1(x:real):real;
{Возвращает значение функции в точке x}
begin
f1:=3*sin(sqrt(x))+0.35*x-3.8;
end;
function f2 (x:real):real;
{Итерационная формула}
begin
f2:=(3.8-3*sin(sqrt(x)))/0.35;
end;
procedure FindRoot(x0,eps:real;var i:integer;var x2:real);
{Процедура поиска корня нелинейного алгебраического уравнения}
var
x1:real;
begin
x1:=x0; i:=1;
repeat
x2:=f2(x1);
if abs (x1-x2)<eps
then break
else
begin
x1:=x2;
inc (i);
end;
until false;
end;
end.
Задание 5. Линейный регрессионный анализ.
Задана функция на интервале [0,5; 5]. Сформировать массив М(10), каждый элемент которого Мi вычисляется по формуле: .
Шаг аргумента x - 0,5, - случайное отклонение, определяемое с помощью функции случайных чисел RANDOM в интервале от - 0.5 до + 0.5.. Вычислить значения коэффициентов b1 и b0 для линейной регрессии 10 пар значений xi и yi, используя метод наименьших квадратов по приведенным ниже формулам:
(i=1…N)
В декартовой системе координат построить график полученной линейной регрессии и отметить рассчитанные по формуле точки с координатами xi и yi.
1. Назначение программы: определение зависимости между переменными на основе линейного регрессионного анализа;
2. Перечень функций, выполняемых программой: вычисление коэффициентов b1 и b0 для линейной регрессии и построение графика полученной линейной регрессии;
3. Входные данные, вводимые с клавиатуры, отсутствуют. В качестве констант заданы: границы интервала [a,b] задания функции, размерность массива N и приращение аргумента dx;
4. Выходные данные: вещественный массив размерности N, сформированный случайным образом, и значения коэффициентов b1 и b0 для построения графика линейной регрессии.
Проектирование (блок-схема №5)
Реализация
program regressia;
{Для Borland Pascal 7.0}
uses
crt,graph;
const
a=0.5;
b=5;
N=10;
dx=0.5;
mn=35; {Коэффициент масштабирования для построения графика}
function f (x: real): real;
{Возвращает значение функции в точке x}
begin
f:=x+3;
end;
var
sumM,sumX,sumXM,x,sumsqrX,c,b0,b1: real;
i,gd,gm:integer;
masM:array[1..N] of real;
begin
clrscr;
randomize;
writeln;
TextColor(red); HighVideo;
writeln('PROGRAM OF REGRESSION ANALYSIS'); writeln;
sumM:=0; sumX:=0; sumXM:=0; sumsqrX:=0;
x:=a;
i:=1;
{Формирование массива из 10 элементов}
while(x<=b) do
begin
c:=random(11);
masM[i]:=f(x)+(c-5)/10;
x:=x+dx;
inc(i);
end;
for i:=1 to N do
begin
sumM:=sumM+masM[i];
sumX:=sumX+(i*dx);
sumXM:=sumXM+(i*dx*masM[i]);
sumsqrX:=sumsqrX+sqr(dx*i);
end;
{Вычисление коэффциентов линейной регрессии, используя метод наименьших квадратов}
b1:=(sumX*sumM-N*sumXM)/((sumX)*(sumX)-N*sumsqrX);
b0:=(sumM-b1*sumX)/N;
TextColor(white);
writeln('Massiv: '); writeln;
for i:=1 to N do
writeln(masM[i]:6:3,' ');
writeln;
writeln('b1 = ',b1:6:3); writeln('b0 = ',b0:6:3);
TextColor(red); HighVideo;
writeln; writeln('Press <Enter>...');
readkey;
{Построение графика линейной регрессии с помощью модуля Graph}
gd:=detect;
InitGraph(gd,gm,'');
MoveTo(0,0);
OutTextXY(5,5,'Y');
MoveTo(0,0);
LineTo(0,300);
Lineto(300,300);
OutTextXY(300,295,'X');
SetColor(yellow);
SetLineStyle(0,SolidLn,3);
MoveTo(round(dx*mn),round(300-mn*(b0+b1*dx)));
for i:=2 to N do
begin
LineTo(round(dx*i*mn), round(300-mn*(b0+b1*dx*i)));
MoveTo(round(dx*i*mn), round(300-mn*(b0+b1*dx*i)));
Circle(round(dx*i*mn), round(300-mn*(b0+b1*dx*i)),3);
end;
readkey
end.
Задание 6. Динамическая память в программировании графического режима
Нарисовать на фоне пейзажа периодически движущийся закрашенный прямоугольник. Движение из точки с координатами (0,0) в точку с координатами (640, 400). Размеры прямоугольника ввести с клавиатуры. Движение прерывается после нажатия клавиши “F2”.
1. Назначение программы: создание движущегося объекта с помощью динамической памяти;
2. Перечень функций, выполняемых программой: изображение статического пейзажа, динамическое перемещение произвольно заданного прямоугольника по определенной траектории, выход из программы по нажатию определенной клавиши;
3. Формат входных данных: размеры прямоугольника: длина (long) и ширина (width) целочисленного типа. Для выхода из программы происходит нажатие клавиши F2, тем самым осуществляется работа с символьным типом данных;
4. Формат выходных данных: результатом работы программы является получение требуемого изображения.
Реализация
program rectangle_moving;
{Для Borland Pascal 7.0}
uses
crt,graph;
procedure Dom (x,y: integer);
{Процедура предназначена для построения домиков по передаваемым координатам}
var
dx,dy,dx2,dy2,dw,dw2: integer;
{dx,dy – размеры домика; dw – размер окна}
begin
dx:=100;
dy:=100;
dw:=50;
dw2:= dw div 2;
dx2:=dx div 2;
dy2:= dy div 2;
Rectangle(x,y,x+dx,y+dy); {корпус домика}
MoveTo(x,y);
LineTo(x+dx2,y-40);LineTo(x+dx,y); {крыша}
SetLineStyle(0,SoliDLn,3);
SetFillStyle(SolidFill,random(3));
FloodFill(x+5,y-2,magenta);
Rectangle(x+dx2-dw2,y+20,X+dx2+dw2,y+20+dw); {окно}
SetFillStyle(SolidFill,random(10));
FloodFill(x+Dx-2,y+dx-2,magenta);
Line(x+dx2-dw2,y+20+ dw2,x+dx2+dw2,y+20+dw2); {перегородки в окне}
Line(x+dx2,y+20+dw2,x+dx2,y+20+2*dw2);
end;
Procedure Tree(x,y: integer);
{Процедура предназначена для построения ели, расположенной по заданным координатам}
begin
MoveTo(x,y);
LineTo(x-30,y+20); LineTo(x+30,y+20); LineTo(x,y);
SetfillStyle(SolidFill,lightGreen);
FloodFill(x,y+10,green);
MoveTo(x,y+20);
LineTo(x-40,y+40);LineTo(x+40,y+40); LineTo(x,y+20);
FloodFill(x,y+30,green);
MoveTo(x,y+40);
LineTo(x-50,y+60);LineTo(x+50,y+60); LineTo(x,y+40);
FloodFill(x,y+50,green);
SetFillStyle(SolidFill,brown);
rectangle(x-10,y+60,x+10,y+70);
FloodFill(x,y+65,green);
end;
var
long,width,err: integer;
gm,gd,i,j,k,m,h,n: integer;
l: word;
p: pointer;
dx,dy: integer;
c: char;
begin
clrscr;
randomize;
writeln;
TextColor(red); HighVideo;
writeln ('PROGRAM: DYMAMIC PICTURE'); writeln;
TextColor(white); HighVideo;
write('Enter a long of the rectangle: ');
readln(long);
writeln;
write('Enter a width of the rectangle: ');
readln(width);
gd:=detect;
InitGraph(gd,gm,'c:\bp\bgi\egavga.bgi');
err:=GraphResult;
if err<>grOk then writeln('err');
SetBkColor(white);
setcolor(red);
rectangle(0,0,long,width);
SetfillStyle(InterleaveFill,red);
FloodFill(2,2,red);
{Рисование линии горизонта}
Setcolor(green);
SetLineStyle(0,SolidLn,3);
Line(0,getmaxy div 2,getmaxx,getmaxy div 2);
{Вызов процедуры для построения домиков}
SetFillStyle(XHatchFill,lightCyan);
FloodFill(320,250,green);
SetColor(magenta);
Dom(30,300);
Dom(200,330);
Dom(330,300);
OutTextXY(getmaxx div 2-50,450,'Exit - Press F2');
{Рисование солнца}
SetColor(yellow);
Circle(500,70,30);
SetfillStyle(SolidFill,yellow);
FloodFill(500,70,yellow);
{Рисование облаков}
SetColor(blue);
FillEllipse(200,70,80,15);
SetFillStyle(HatchFill,blue);
FloodFill(200,70,blue);
FillEllipse(350,130,60,10);
{Вызов процедур для рисования елей}
Setcolor(green);
tree(440,200);
tree(500,300);
tree(600,200);
tree(440,400);
tree(600,400);
{Формирование динамического изображения}
l:=imagesize(0,0,long,width);
getmem(p,l);
i:=0; j:=0;
dx:=8; dy:=5;
getimage (i,j,i+long,j+width,p^);
delay(3000);
putimage(i,j,p^,xorput);
repeat
i:=i+dx;
j:=j+dy;
if ((i+long)>=640) or ((j+width>=400)) or (i=0)
then
begin
dx:=-dx;
dy:=-dy;
end;
putimage (i,j,p^,xorput);
delay(10000);
putimage(i,j,p^,xorput);
{Выход из программы при нажатии клавиши F2}
if keypressed then
if readkey=#0 then
begin
c:=readkey;
if c=#60 then break;
end;
until false;
freemem(p,l);
readkey
end.
Приложение №1
Результаты тестирования программ
Программа №1:
Входные данные | Выходные данные | |||||
a | b | dx0 | eps | (xe,ye) | dx2 | n |
0.2 | 1.5 | 0.25 | 0.001 | (1.000, 0.000) | 0.001 | |
0.2 | 1.5 | 0.25 | 0.004 | (1.001, 0.000) | 0.004 | |
0.2 | 1.4 | 0.25 | 0.00001 | (1.000, 0.000) | 0.00001 |
Программа №3:
Входные данные | Выходные данные | ||||
flag | x | eps | x3 | i | x4 |
0.8 | 0.001 | 0.863 | 0.001 | ||
0.6 | 0.01 | 0.808 | 0.009 | ||
0.9 | 0.001 | 0.868 | 0.000 |
Программа №4:
Входные данные | Выходные данные | |||
x | eps | x3 | i | x4 |
2.2 | 0.002 | 2.298 | 0.000 | |
2.4 | 0.001 | 2.299 | 0.001 | |
2.8 | 0.0001 | 2.299 | 0.000 |
Список использованной литературы
1. Алексеев Е.Р., «Turbo Pascal 7.0 – полная версия», - М.: НТ Пресс, 2007. – 320 с., ил.
2. Меженный О.А., «Turbo Pascal. Самоучитель», М.: Издательский дом «Вильямс», 2005.- 336 с., ил.
3. Рапаков Г.Г., Ржеуцкая C.Ю., «Turbo Pascal для студентов и школьников». – Спб.: БХВ – Петербург, 2007. – 352 с., ил.