ОТЧЕТ О ПРОХОЖДЕНИИ ПРАКТИКИ




Министерство образования Российской Федерации

Сургутский государственный университет

Кафедра «Информатики и вычислительной техники»

 

 

ОТЧЕТ О ПРОХОЖДЕНИИ ПРАКТИКИ

 

В Сургутском государственном университете

тема: Вычислительная практика

 

Студентка: Руководитель от университета:

Арестова А.Ю. Преподаватель кафедры ИВТ

Группы 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 с., ил.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: