Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2009, 23:12   #1
zverushka
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 11
По умолчанию Ввод векторов и матриц, умножение матрицы на вектор и вычисление скалярного призведения двух векторов

Задача: Даны 6-элементные вещественные векторы х и у и квадратные матрицы А,В,С 6-ого порядка. Надо найти величину (Ах,Ву)+(Сх,у)/(х,Ву)ю Ввод векторов и матриц, умножение матрицы на вектор и вычисление скалярного призведения двух векторов оформить ввиде подпрограмм.

Я не знаю, где ошибка.
program zad6;
uses SysUtils;
const n=6;
type
TMatrix=array[1..n,1..n] of integer;
TVekt=array[1..n] of integer;
var
A,B,C:TMatrix;
X,Y,PAX,PBY,PCX, Res:TVekt;
SP1,SP2,SP3,R: integer;

i,j,sum: integer;

procedure VvodA;
begin
writeln ('Vvod matr A porjdka ',n);
for j:=1 to n do
for i:=1 to n do
begin
write ('A[',i,',',j,'] : ');
readln (A[i,j]);
end;
end; {VvodA}

procedure VvodB;
begin
writeln ('Vvod matr B porjdka ',n);
for j:=1 to n do
for i:=1 to n do
begin
write ('B[',i,',',j,'] : ');
readln (B[i,j]);
end;
end; {VvodB}

procedure VvodC;
begin
writeln ('Vvod matr C porjdka ',n);
for j:=1 to n do
for i:=1 to n do
begin
write ('C[',i,',',j,'] : ');
readln (C[i,j]);
end;
end; {VvodC}

procedure VvodX;
begin
writeln ('Vvod vekt X porjdka ',n);
for i:=1 to n do
begin
write ('X[',i,'] : ');
readln (X[i]);
end;
end; {VvodX}

procedure VvodY;
begin
writeln ('Vvod vekt Y porjdka ',n);
for i:=1 to n do
begin
write ('Y[',i,'] : ');
readln (Y[i]);
end;
end; {VvodY}

procedure ProMV ( M : TMatrix; V : TVekt; var MV: TVekt);
var i,j: integer;
begin
SetLEngth (MV, Legth(V));
for i:=0 to Length(V)-1 do
begin
MV[i]:=0;
for j:=0 to Length(V)-1 do
begin
MV[i]:=MV[i]+M[i,j]*V[j];
end;
end;
end;{ProMV}

function SkalProVekt (var a,b: array of real; n:integer):real;
var i:integer; e: real;
begin
e:=0;
for i:=1 to n-1 do
e:=e+a[i]*b[i];
SkalProVekt:=e;
writeln;
end;{SkalProVekt}

begin
VvodA;
VvodB;
VvodC;
VvodX;
VvodY;

ProMV(A,X,PAX);
ProMV(B,Y,PBY);
ProMV(C,X,PCX);

SP1:=SkalProVekt(PAX,PBY,n);
SP2:=SkalProVekt(PCX,Y,n);
SP3:=SkalProVekt(X,PBY,n);

R:=SP1+SP2/SP3;
writeln ('formula =',R);
end.
zverushka вне форума Ответить с цитированием
Старый 19.02.2009, 23:28   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вам компилятор говорит где ошибка. Как можно не знать где она?
Вот несколько:
в процедуре proMV:
Код:
SetLength (MV, Length(V));
SetLength изменяет размер динамического массива, а у вас - статический.
К тому же, еще и опечатка:
Код:
Legth(V)
Вот здесь:
Код:
SP1:=SkalProVekt(PAX,PBY,n);
SP2:=SkalProVekt(PCX,Y,n);
SP3:=SkalProVekt(X,PBY,n);
Функция принимает динамический массив array of real, а вы ей даете
Код:
TVekt=array[1..n] of integer;
Функция SkalProVekt возвращает real, а вы присваиваете ее значение целочисленной переменной:
Код:
SP1:=SkalProVekt(PAX,PBY,n);
-----------
Дальше не углублялся.

ps Для кода используйте тег CODE.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 19.02.2009, 23:38   #3
Mikhail Bakurov
Форумчанин
 
Регистрация: 12.10.2008
Сообщений: 140
По умолчанию

Дофига там еще косяков, в основном все несоответствие типов

заметил кроме вышеперечисленных

Код:
SP1,SP2,SP3,R: integer;
................
R:=SP1+SP2/SP3;
Если деление, сразу R:Real;

Да, чуть не забыл, ввод можно сделать одной процедурой для каждого типа

Последний раз редактировалось Mikhail Bakurov; 19.02.2009 в 23:41.
Mikhail Bakurov вне форума Ответить с цитированием
Старый 19.02.2009, 23:55   #4
zverushka
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 11
По умолчанию

теперь выдает ошибку, что не может найти sysutils.tpu
Помогите, пожалуйста, с типами
Я не знаю, как сделать ввод одной процедурой для каждого типа
zverushka вне форума Ответить с цитированием
Старый 20.02.2009, 00:07   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Подправил самое необходимое. Программа компилируется и даже чего-то выводит.. Проверять, естественно, не стал, т.к. мне стало тоскливо вбивать вручную элементы уже на второй матрице.

Код:
program zad6;
uses SysUtils;
const n=6;
type
TMatrix=array[1..n,1..n] of integer;
TVekt=array[1..n] of integer;
var
A,B,C:TMatrix;
X,Y,PAX,PBY,PCX, Res:TVekt;
SP1,SP2,SP3,R: real;

i,j,sum: integer;

procedure VvodABC(var MAS : TMatrix);
begin
for j:=1 to n do
for i:=1 to n do
begin
write ('el[',i,',',j,'] : ');
readln (MAS[i,j]);
end;
end; {VvodA}

procedure VvodX;
begin
writeln ('Vvod vekt X porjdka ',n);
for i:=1 to n do
begin
write ('X[',i,'] : ');
readln (X[i]);
end;
end; {VvodX}

procedure VvodY;
begin
writeln ('Vvod vekt Y porjdka ',n);
for i:=1 to n do
begin
write ('Y[',i,'] : ');
readln (Y[i]);
end;
end; {VvodY}

procedure ProMV ( M : TMatrix; V : TVekt; var MV: TVekt);
var i,j: integer;
begin
for i:=0 to Length(V)-1 do
begin
MV[i]:=0;
for j:=0 to Length(V)-1 do
begin
MV[i]:=MV[i]+M[i,j]*V[j];
end;
end;
end;{ProMV}

function SkalProVekt (var a,b: TVekt; n:integer):real;
var i:integer; e: real;
begin
e:=0;
for i:=1 to n-1 do
e:=e+a[i]*b[i];
SkalProVekt:=e;
writeln;
end;{SkalProVekt}

begin
writeln('matrix A:');
VvodABC(A);
writeln('matrix B:');
VvodABC(B);
writeln('matrix C:');
VvodABC(C);

VvodX;
VvodY;

ProMV(A,X,PAX);
ProMV(B,Y,PBY);
ProMV(C,X,PCX);

SP1:=SkalProVekt(PAX,PBY,n);
SP2:=SkalProVekt(PCX,Y,n);
SP3:=SkalProVekt(X,PBY,n);

R:=SP1+SP2/SP3;
writeln ('formula =',R);
readln;
end.
Пример вывода:
Код:
matrix A:
........здесь куча чисел........
Y[6] : 2



formula =-1.40617124792769E+009
ps А не проще случайными заполнять?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 20.02.2009 в 00:09.
Sazary вне форума Ответить с цитированием
Старый 20.02.2009, 00:10   #6
zverushka
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 11
По умолчанию

спасибо большое,
пошла проверять
zverushka вне форума Ответить с цитированием
Старый 20.02.2009, 12:12   #7
zverushka
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 11
По умолчанию

У меня выдает ошибку
Runtime error 205 at 0000:031D
Подскажите, что не так?
zverushka вне форума Ответить с цитированием
Старый 20.02.2009, 12:51   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

zverushka
Мало информации.
Какие числа вводите?
Runtime error 205, насколько я помню, возникает при переполнении операций с плавающей точкой.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 20.02.2009, 13:00   #9
zverushka
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 11
По умолчанию

я вводила разные,
ошибка даже , если матрицы единичные, а вектора х=1.2.3.4.5.6 и у=1.1.1.1.1.1 ответ должел быть 22
zverushka вне форума Ответить с цитированием
Старый 20.02.2009, 13:32   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

zverushka Вы так и вводите что-ли, с точками? о_О
Если да, то естественно будет ошибка.
После ввода каждого элемента - <enter>
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа на вычисление скалярного произведения klopp Паскаль, Turbo Pascal, PascalABC.NET 3 05.12.2008 21:17
Класс "векторные операции" для трехмерных векторов. Студентка@ Помощь студентам 1 30.01.2008 19:21
Умножение матрицы на вектор Илья Кибель Помощь студентам 5 27.10.2007 11:02