Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
RennarD
0 / 0 / 0
Регистрация: 17.01.2012
Сообщений: 12
1

Объект с базовым типом вектор и производным матрицей.Нужно лишь несколько советов

28.01.2013, 13:00. Просмотров 417. Ответов 8
Метки нет (Все метки)

Необходимо произвести скалярное умножение двух векторов и суммирование матрицы.
Пытался делать,но начались проблемы с выковыриванием значений из полей,я в них совсем запутался.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
uses crt;
const nmax=30;
Type VArray=array[1..nmax] of Integer;
     VMatrix=array[1..nmax] of VArray;
     
 Vectors=object
     A:VArray;
     ASize:byte;
     A_id:char;
 procedure VectorInput(var x:VArray; Size:integer);
 procedure VectorOutput(var x:VArray);
 procedure Mult;
 end;
 {----------------------------------------------------------------------------------------------}
 Matrix=object(Vectors)
     MSize:byte;
     M:VMatrix;
     M_id:char;
 procedure MatrixInput;
 procedure MatrixOutput;
 {procedure Summ(matrix1,matrix2:VMatrix;NewSize:byte);}
 end;
 {----------------------------------------------------------------------------------------------}
 procedure Vectors.VectorInput(var x:VArray;Size:integer);
  var
   i:byte;
  begin
    clrscr;
    self.ASize:=Size;
    writeln('Введите идентификатор вектора:');
    readln(A_id);
    writeln('Введите элементы вектора, целые числа :');
    for i:=1 to ASize do
      begin
        write(A_id,'[',i,']=');
        readln(x[i]);
      end;
     clrscr;
  end;
  {----------------------------------------------------------------------------------------------}
 procedure Vectors.VectorOutput(var x:VArray);
 var
   i:byte;
 begin
   for i:=1 to ASize do
     begin
       write(x[i]:4);
       write(' ');
     end;
   writeln;
 end;
 {----------------------------------------------------------------------------------------------}
 {procedure Vectors.Mult;
   var i:byte;
   Rezult:integer;
   Vect1, Vect2:VArray;
begin    
  writeln(Asize);
  Rezult:=0;
  for i:=1 to ASize do
  Rezult:=Rezult+Vect1[i]*Vect2[i];
  writeln('Скалярное произведение вектора ');
  writeln(rezult);
 end;}
 {----------------------------------------------------------------------------------------------}
 procedure Matrix.MatrixInput;
 var
   i:byte;
   x:VArray;
   TS:Vectors;
 begin
    repeat
    write('Введите размер вектора ',A_id,' до ',nmax,' VectorSize=');
    readln(ts.ASize);
    until ts.ASize in [1..nmax];
 writeln('Введите идентификатор матрицы');
 readln(M_id);
   writeln('Введите количество строк матрицы ',M_id,' до ',nmax,' MSize=');
   readln(MSize);
   for i:=1 to MSize do
     begin
       VectorInput(x,ts.ASize);
       m[i]:=x;
     end;
 end;
 {----------------------------------------------------------------------------------------------}
 procedure Matrix.MatrixOutput;
 var
   i:byte;
 begin
   for i:=1 to MSize do
     begin
       VectorOutput(m[i]);
     end;
   readln;
 end;
 {----------------------------------------------------------------------------------------------}
{procedure Matrix.Summ(matrix1,matrix2:VMatrix;NewSize:byte);
var i,j:byte;
    c:array[1..nmax,1..nmax] of integer;
begin
 for i:=1 to ASize do
  for j:=1 to MSize do
   c[i,j]:=matrix1[i,j] + matrix1[i,j];
 writeln('Сумма двух матриц');  
 for i:=1 to ASize do
 begin
  for j:=1 to MSize do 
  write(c[i,j]:4,' ');
 end;
writeln; 
 
end;}
{----------------------------------------------------------------------------------------------}
var
VectorSize:byte;
  z:Vectors;
  b:Matrix;
  j:VArray;
  u:VMatrix;
  ask:char;
 
begin
 
  clrscr;
  {writeln('Программа для вычисления скалярного произведения двух векторов и суммы двух матриц');
  writeln('Сделайте свой выбор:');
  writeln('-----------------------------------------------------------');
  writeln('1 - Ввод векторов матрицы');
  writeln('2 - Вывод всей матрицы векторов');}
  {writeln('3 - Расчет скалярного произведения двух векторов');
  writeln('4 - Расчет суммы двух матриц');}
 { writeln('5 - Выход');
   
    readln(ask);
    case (ask) of
    '1':
      begin}
       b.MatrixInput;
     { end;
    '2':
      begin}
       b.MatrixOutput;
    {  end;}
    {'3':}
       b.Mult;
     {'4':
      begin
       z.Mult;
      end;
  end;}
readkey;
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2013, 13:00
Ответы с готовыми решениями:

Что называется базовым типом множества
Следующий вопрос, что называется базовым типом множества? Я предполагаю...

Заданные множественные числа элементов с базовым типом byte: А=[1,3,5,7,9], В=[3, 5, 9]
Выбрать все элементы множественного числа А, что не принадлежат В, и вывести их...

Описать тип указатель, базовым типом которого является массив
Описать тип указатель, базовым типом которого является массив с максимальной...

Создание гибких подпрограмм для обработки матриц произвольного порядка с фиксированным базовым типом
Даны две квадратные матрицы разных порядков. Для каждой из матриц найти...

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

8
Zhexon
312 / 271 / 272
Регистрация: 25.09.2011
Сообщений: 477
28.01.2013, 14:31 2
напиши правильное условие.
Просто нет скалярного произведения векторов. Есть скалярное пр. вектора на число, можно строку на столбик помножить если у них одинаковая размерность. Скорее всего тебе нужно просто произведение элементов разных векторов. уточни.
Методы в объектах не рабочие
Цитата Сообщение от RennarD Посмотреть сообщение
procedure Vectors.VectorInput(var x:VArray;Size:integer);
этот, например.
внешний х не нужен, это же объект ты с данными внутри работаешь. короче - полное условие, чтобы понятно было.

Добавлено через 1 минуту
да, кстати, суммирование матрицы с чем?
0
RennarD
0 / 0 / 0
Регистрация: 17.01.2012
Сообщений: 12
28.01.2013, 15:22  [ТС] 3
Само задание:
Описать базовый объект, который включает в себя:
- поля: вектор , его размер и идентификатор в символьном виде;
- методы: ввод/вывод векторов, определение скалярного произведения двух векторов.
Производный объект:
- матрица– как массив базового типа , ее размер и символьный идентификатор;
- методы: ввод/вывод матрицы, определение сумы двух матриц.
Реализовать экземпляр этого типа и выполнить над ним все возможные действия.

Цитата Сообщение от Zhexon Посмотреть сообщение
Просто нет скалярного произведения векторов.
http://ru.wikipedia.org/wiki/%D0%A1%...BD%D0%B8%D0%B5
И реализация скалярного произведения в ТП указана в
Pascal
1
2
3
4
5
 Rezult:=0;
  for i:=1 to ASize do
  Rezult:=Rezult+Vect1[i]*Vect2[i];
  writeln('Скалярное произведение вектора ');
  writeln(rezult);
да, кстати, суммирование матрицы с чем?
Я вообще сначала собирался сделать менюшку с выбором двух векторов по их номеру через вызов их как элементов производного типа для их скалярного произведения.
И матрицу аналогично,выбрать два раза по Х элементов массива VMatrix для создания двух матриц размером ASize*X для их суммы.
Вот на этом и застрял,как это выполнить,а точнее как организовать доступ к конкретнным данным полей.
В комментариях заготовки,которые буду пилять в нужный код.
0
Zhexon
312 / 271 / 272
Регистрация: 25.09.2011
Сообщений: 477
28.01.2013, 16:32 4
там по ссылке немного другое. Возьму за основу как ты сказал)
И реализация скалярного произведения в ТП указана в
Добавлено через 43 минуты
пока вот это:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
{Описать базовый объект, который включает в себя:
- поля: вектор , его размер и идентификатор в символьном виде;
- методы: ввод/вывод векторов, определение скалярного произведения
  двух векторов.}
 
const max=100;
type
  tVector = object
    M : byte;
    ID : char;
    a : array[1..max] of integer;
    procedure Wwod(num : byte);
    procedure wywod;
    function Getitem(item : byte) : Integer;
    function SkProizw(var V : tvector) : Integer;
  end;
 
{ Производный объект:
- матрица- как массив базового типа , ее размер и символьный идентификатор;
- методы: ввод/вывод матрицы, определение сумы двух матриц. }
 
  tMatrix = object
    ID : char;
    N : Byte; { kolwo strok (vectorow) }
    St : array[1..max] of tVector;
    procedure wwod(ident : char);
    procedure wywod;
  end;
 
  procedure tvector.Wwod(num : byte); var i : byte;
  begin
    write(' Input ident vector [char] : '); readln(ID); M:=num;
    writeln('Vector ',ID);
    writeln('Введите элементы вектора, целые числа :');
    for i:=1 to m do begin
      write(id,'[',i,']= '); readln(a[i]);
    end;
  end;
 
  procedure tVector.Wywod; var i : byte;
  begin write(ID,': '); for i:=1 to m do write(a[i]:4); writeln; end;
 
 
  function tvector.getItem(item : byte) : Integer;
  begin if item>m then getitem:=1 else GetItem:=a[item]; end;
 
  function tVector.SkProizw(var V : tvector) : Integer;
  var Result,i : Integer;
  { И реализация скалярного произведения в ТП указана }
  begin
    Result:=0; for i:=1 to m do Result:=Result+a[i]*v.getItem(i);
    SkProizw:=Result;
  end;
 
  procedure tMatrix.wwod(ident : char);
  var m,i : byte;
  begin
    ID:=ident;
    write('Razmernostx matricy [n,m] : '); readln(n,m);
    for i:=1 to n do St[i].wwod(m);
  end;
 
  procedure tMatrix.wywod; var i :  byte;
  begin
    writeln; writeln('   Matrix ',ID);
    for i:=1 to n do St[i].wywod;
  end;
 
var
  M,N : tMatrix;
  A,B : tVector;
Begin
  A.wwod(5); A.wywod;
  B.wwod(5); B.wywod;
  writeln('Sk Proizw A*B = ',A.SkProizw(B));
  M.wwod('M'); M.wywod;
  N.wwod('M'); N.wywod; { 2 matricy M i N }
  readln;
End.
осталось произведение матриц реализовать. если устраивает, то буду дальше делать
1
RennarD
0 / 0 / 0
Регистрация: 17.01.2012
Сообщений: 12
28.01.2013, 16:42  [ТС] 5
Конечно устраивает,у меня просто уже голова ничего не варит)
Спасибо большое,сейчас буду ковырятся в твоем коде что где и как
0
Zhexon
312 / 271 / 272
Регистрация: 25.09.2011
Сообщений: 477
28.01.2013, 17:48 6
конечно, если бы не тип tvector внутри все было бы намного проще (я когдато модуль писал ниже скину)
немного нужно доработать с идентификацией векторов (зачем оно нужно?? непонятно) при создании результирующей матрицы нет идентификации, можно с исходных брать, конечно (опять через функции Set Get )
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const max=100;
type
  tVector = object
    M : byte;
    ID : char;
    a : array[1..max] of integer;
    procedure Wwod(num : byte);
    procedure wywod;
    function Getitem(item : byte) : Integer;
    function SkProizw(var V : tvector) : Integer;
    function GetNum : byte;
    procedure SetNum(NNum : byte);
    procedure SetData(nm : byte; Data : integer);
    function getData(nm : byte) : integer;
  end;
 
  tMatrix = object
    ID : char;
    N : Byte; { kolwo strok (vectorow) }
    St : array[1..max] of tVector;
    procedure wwod(ident : char);
    procedure wywod;
    procedure SetRazm(x,y : byte);
    procedure SetData(nn,nm : byte; D : integer);
    function GetData(nn,nm : byte) : integer;
    procedure Mul(var b,c : tMatrix);
  end;
 
  procedure tvector.Wwod(num : byte); var i : byte;
  begin
    write(' Input ident vector [char] : '); readln(ID); M:=num;
    writeln('Vector ',ID);
    writeln('Введите элементы вектора, целые числа :');
    for i:=1 to m do begin
      write(id,'[',i,']= '); readln(a[i]);
    end;
  end;
 
  procedure tVector.Wywod; var i : byte;
  begin write(ID,': '); for i:=1 to m do write(a[i]:4); writeln; end;
 
  function tvector.getItem(item : byte) : Integer;
  begin if item>m then getitem:=1 else GetItem:=a[item]; end;
 
 function tVector.SkProizw(var V : tvector) : Integer;
 var Result,i : Integer;
 { И реализация скалярного произведения в ТП указана }
 begin
   Result:=0; for i:=1 to m do Result:=Result+a[i]*v.getItem(i);
   SkProizw:=Result;
 end;
 
 function tvector.GetNum : byte; begin GetNum:=M; end;
 
 procedure tvector.SetNum(NNum : byte); begin M:=NNum; end;
 
 procedure tvector.SetData(nm : byte; Data : integer);
 begin a[nm]:=Data; end;
 
 function tvector.getData(nm : byte) : integer;
 begin GetData:=a[nm]; end;
 
 procedure tMatrix.wwod(ident : char);
 var m,i : byte;
 begin
   ID:=ident;
   write('Razmernostx matricy [n,m] : '); readln(n,m);
   for i:=1 to n do St[i].wwod(m);
 end;
 
 procedure tMatrix.wywod; var i :  byte;
 begin
   writeln; writeln('   Matrix ',ID);
   for i:=1 to n do St[i].wywod;
 end;
 
 procedure tMatrix.SetRazm(x,y : byte); var i : Byte;
 begin     N:=x; for i:=1 to n do St[i].SetNum(y); end;
 
 procedure tmatrix.SetData(nn,nm : byte; D : integer);
 begin St[nn].Setdata(nm,d); end;
 
 function tmatrix.GetData(nn,nm : byte) : integer;
 begin GetData:=St[nn].Getdata(nm); end;
 
  procedure tMatrix.Mul(var b,c : tMatrix);
  var i,j,k,p :byte;
  begin
    writeln('------------------');
    wywod; b.wywod;
    { число столбцов первого множителя равно числу строк второго }
    if St[1].getnum = b.n then begin
    { A[N,P] * B[P,M] = C[N,M] }
      c.setRazm(n,b.St[1].getnum);
 
      for i:=1 to n do
      for j:=1 to b.St[1].getnum do
      for k:=1 to b.n do
      c.SetData(i,j,St[i].getData(k)*b.GetData(k,j));
 
    end else writeln('Umnovenie newozmovno! raznaq razmernostx');
  end;
 
var
  M,N,C : tMatrix;
  A,B : tVector;
Begin
{  A.wwod(5); A.wywod;
  B.wwod(5); B.wywod;
  writeln('Sk Proizw A*B = ',A.SkProizw(B)); }
  M.wwod('M'); M.wywod;
  N.wwod('N'); N.wywod; { 2 matricy M i N }
  M.Mul(N,C); C.wywod;
  readln;
End.
1
RennarD
0 / 0 / 0
Регистрация: 17.01.2012
Сообщений: 12
28.01.2013, 17:58  [ТС] 7
Спасибо большое,сейчас буду разбираться)))
0
Zhexon
312 / 271 / 272
Регистрация: 25.09.2011
Сообщений: 477
28.01.2013, 18:17 8
вот держи модуль еще.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
unit matric;
interface
const maxn = 20; zn=0;
type
  tMaxArr = array [1..maxn,1..maxn] of real;
  tMatric = object
    simb : char;
    a : tMaxArr;
    n,m : byte ;
    procedure Init(ch:char);
    procedure InputData;
    procedure InputDataArm;
    procedure SetRazm(x,y : Byte);
    procedure View;
    procedure Sum(var b : tMatric);
    procedure Razn(var b : tMatric);
    procedure Mul(var b,c : tMatric);
  end;
 
implementation
 
  procedure tmatric.init(ch:char);
  begin writeln; simb:=ch; end;
 
  procedure tmatric.SetRazm(x,y : Byte);
  begin n:=x; m:=y end;
 
  procedure tmatric.inputData;
  var i,j:byte;
  begin
    writeln(' Matric '+simb);
    write('Input Strok x Stolbcow, max= ',maxn,'  n,m : '); readln(n,m);
    randomize;
    for i:=1 to n do for j:=1 to m do a[i,j]:=random(3)+1;
    view;
  end;
 
  procedure tmatric.inputDataArm;
  var i,j:byte;
  begin
    writeln(' Matric '+simb);
    write('Input Strok x Stolbcow, max= ',maxn,'  n,m : '); readln(n,m);
    for i:=1 to n do for j:=1 to m do begin
      write(simb+'[',i,',',j,'] = '); readln(a[i,j]);
    end;
    view;
  end;
 
  procedure tmatric.view;
  var i,j:byte;
  begin
    writeln; writeln('Matric '+simb+' :');
    for i:=1 to n do begin
      for j:=1 to m do write(a[i,j]:4:zn); writeln;
    end;
  end;
 
  procedure tMatric.Sum(var b : tMatric);
  var i,j:byte;
  begin
    writeln('------------------');
    if (n=b.n) and (m=b.m) then begin
      writeln('Matric '+simb+' = '+simb+' + '+b.simb);
      for i:=1 to n do for j:=1 to m do a[i,j]:=a[i,j]+b.a[i,j];
      view;
    end else writeln('Sum newozmoven! raznaq razmernostx');
  end;
 
  procedure tMatric.Razn(var b : tMatric);
  var i,j:byte;
  begin
    writeln('------------------');
    if (n=b.n) and (m=b.m) then begin
      writeln('Matric '+simb+' = '+simb+' - '+b.simb);
      for i:=1 to n do for j:=1 to m do a[i,j]:=a[i,j]-b.a[i,j];
      view;
    end else writeln('Raznostx newozmovna! raznaq razmernostx');
  end;
 
  procedure tMatric.Mul(var b,c : tMatric);
  var i,j,k :byte;
  begin
    writeln('------------------');
    { view; b.view; }
    if (m=b.n) then begin
      c.setRazm(n,b.m);
    {  writeln('Matric '+c.simb+' = '+simb+' * '+b.simb); }
      for i:=1 to n do
      for j:=1 to b.m do
      for k:=1 to m do
      c.a[i,j]:=a[i,k]*b.a[k,j];
    end else writeln('Umnovenie newozmovno! raznaq razmernostx');
  end;
 
begin
end.
Добавлено через 2 минуты
http://dic.academic.ru/dic.nsf/bse/1...B8%D1%86%D0%B0
тут про умножение матриц, как нужно это делать.
0
Dmitrinik
536 / 393 / 99
Регистрация: 18.08.2012
Сообщений: 1,015
29.01.2013, 15:13 9
Цитата Сообщение от Zhexon Посмотреть сообщение
Просто нет скалярного произведения векторов. Есть скалярное пр. вектора на число...
Это новое слово в математике. Можно на филдсовкую премию.
0
29.01.2013, 15:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2013, 15:13

Как можно выполнить преобразование списка с базовым типом в список с производным?
Поодиночке я делаю это с помощью такого конструктора: DerivedClass(BaseClass...

Нужно несколько советов по DirectX + C++
Всем привет! Пару дней назад начал изучать DirectX + С++. Помогите немного...

нужно несколько советов по безопастности
чтоб защитить свой сайт от атак, что нужно использовать? !!! В sql запросах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru