Скачиваний:
26
Добавлен:
01.05.2014
Размер:
167.42 Кб
Скачать

1. Формулировка задания

Для заданного варианта программы обработки данных, представленной на языке Паскаль, разработать вычислительный алгоритм и варианты программ его реализации на языках программирования Си и Ассемблер. Добиться, чтобы программы на Паскале и Си были работоспособны и давали корректные результаты (это потребуется в дальнейшем при проведении с ними измерительных экспериментов). Для получения ассемблерного представления программы можно либо самостоятельно написать код на ассемблере, реализующий заданный алгоритм, либо установить опцию "Code generation/Generate assembler source" при компиляции текста программы, представленной на языке Си. При этом в ассемблерном представлении программы нужно удалить директивы описаний и отладочные директивы, оставив только исполняемые операторы.

2. Реализация вычислительного алгоритма

2.1. Алгоритм на языке с

#include <stdlib.h>

#define size 20

void linfit1(double x[size],double y[size], double* y_calc, double* a, double* b,int n)

{

int i;

double sum_x,sum_y,sum_xy,sum_x2,sum_y2,xi,yi,sxy,sxx,syy;

sum_x = 0;

sum_y = 0;

sum_xy = 0;

sum_x2 = 0;

sum_y2 = 0;

for (i=0; i<n; i++)

{

xi=x[i];

yi=y[i];

sum_x += xi;

sum_y += yi;

sum_xy += xi*yi;

sum_x2 += xi*xi;

sum_y2 += yi*yi;

}

sxx = sum_x2-sum_x*sum_x/n;

sxy = sum_xy-sum_x*sum_y/n;

syy = sum_y2-sum_y*sum_y/n;

*b=sxy/sxx;

*a=((sum_x2*sum_y-sum_x*sum_xy)/n)/sxx;

for (i=0;i<n;i++)

*(y_calc+i) = *a + *b * x[i];

}

void main(void)

{

int i;

double a,b,x[size],y[size],y_calc[size];

randomize();

printf("Input Data: \n");

for (i=0;i<size;i++)

{

x[i] = 10+i*10;

y[i] = 10+i*10 + random(20) - 10;

printf("x[%d] = %3.1f y[%d] = %3.1f\n",i,x[i],i,y[i]);

}

linfit1(x,y,&y_calc[0],&a,&b,size);

printf("a: %3.1f, b: %3.1f\n",a,b);

for (i=0;i<size;i++)

printf("y_calc = %3.1f\n",y_calc[i]);

}

2.2. Алгоритм на языке Pascal

Program LineFit1;

const max = 20;

type ary = array[1..max] of real;

procedure linfit1(x,y: ary; var y_calc: ary; var a,b:real; n:integer);

{ fit a straight line (y_calc) through n sets of x and y pairs of points }

var i : integer;

sum_x,sum_y,sum_xy,sum_x2,

sum_y2,xi,yi,sxy,sxx,

syy: real;

begin { linfit }

sum_x:=0.0;

sum_y:=0.0;

sum_xy:=0.0;

sum_x2:=0.0;

sum_y2:=0.0;

for i:=1 to n do

begin

xi:=x[i];

yi:=y[i];

sum_x:=sum_x+xi;

sum_y:=sum_y+yi;

sum_xy:=sum_xy+xi*yi;

sum_x2:=sum_x2+xi*xi;

sum_y2:=sum_y2+yi*yi;

end;

sxx:=sum_x2-sum_x*sum_x/n;

sxy:=sum_xy-sum_x*sum_y/n;

syy:=sum_y2-sum_y*sum_y/n;

b:=sxy/sxx;

a:=((sum_x2*sum_y-sum_x*sum_xy)/n)/sxx;

for i:=1 to n do

y_calc[i]:=a+b*x[i]

end; { LINFIT }

var x,y,y_calc:ary;

i:integer;

a,b:real;

begin

{creating new mass x and y}

randomize;

writeln('Input Data: ');

for i:=1 to max do

begin

x[i] := i*10;

y[i] := i*10 + random(20) - 10;

writeln('x[',i:2,'] = ',x[i]:3:0,' y[',i:2,'] = ',y[i]:3:0);

end;

linfit1(x,y,y_calc,a,b,max);

writeln('a: ',a:3:1,' b: ',b:3:1);

for i:=1 to max do

writeln('y_calc: ',y_calc[i]:3:1);

end.

Соседние файлы в папке Лабораторные работы 1-4