выводит ошибку Array type Requied в выделенной строке…((((как исправить?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit10: TEdit;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Edit19: TEdit;
Label3: TLabel;
Edit20: TEdit;
Label4: TLabel;
Edit21: TEdit;
Label5: TLabel;
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
Matrix=class
a:array[1..3,1..3]of real;
constructor create(x1,x2,x3,x4,x5,x6,x7,x8,x9:integer);
procedure Umnogenie(k:integer);
procedure vyvod;
procedure Delenie(d:integer);
procedure vvod;
procedure Stepen(r:integer;a:array of integer);
end;
var
i,j:integer;
Form1: TForm1;
Tmatrix:matrix;
x1,x2,x3,x4,x5,x6,x7,x8,x9:integer;
implementation
{$R *.dfm}
constructor matrix.create;
begin inherited create;
a[1,1]:=x1;
a[1,2]:=x2;
a[1,3]:=x3;
a[2,1]:=x4;
a[2,2]:=x5;
a[2,3]:=x6;
a[3,1]:=x7;
a[3,2]:=x8;
a[3,3]:=x9;
end;
procedure matrix.vvod;
begin
x1:=strtoint(form1.edit1.text);
x2:=strtoint(form1.edit2.text);
x3:=strtoint(form1.edit3.text);
x4:=strtoint(form1.edit4.text);
x5:=strtoint(form1.edit5.text);
x6:=strtoint(form1.edit6.text);
x7:=strtoint(form1.edit7.text);
x8:=strtoint(form1.edit8.text);
x9:=strtoint(form1.edit9.text);
end;
procedure matrix.vyvod;
begin
form1.edit10.text:=floattostr(a[1,1]);
form1.edit11.text:=floattostr(a[1,2]);
form1.edit12.text:=floattostr(a[1,3]);
form1.edit13.text:=floattostr(a[2,1]);
form1.edit14.text:=floattostr(a[2,2]);
form1.edit15.text:=floattostr(a[2,3]);
form1.edit16.text:=floattostr(a[3,1]);
form1.edit17.text:=floattostr(a[3,2]);
form1.edit18.text:=floattostr(a[3,3]);
end;
procedure matrix.Umnogenie;
begin
for i:=1 to 3 do
for j:=1 to 3 do
a[i,j]:=a[i,j]*k;
end;
procedure matrix.Delenie;
begin
for i:=1 to 3 do
for j:=1 to 3 do
a[i,j]:=a[i,j]/d;
end;
procedure matrix.Stepen;
begin
for i := 1 to 3 do begin
for j := 1 to 3 do begin
a[i,j]:=0;
end;end;
begin
for r := 1 to 3 do
a[i,j]:= a[i,j]+a[i,r]*a[r,j];
end;
end;
procedure TForm1.N2Click(Sender: TObject);
var
k:integer;
begin
k:=strtoint(form1.edit19.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Umnogenie(k);
Tmatrix.Vyvod;
end;
procedure TForm1.N3Click(Sender: TObject);
var
d:integer;
begin
d:=strtoint(form1.edit20.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Delenie(d);
Tmatrix.Vyvod;
end;
procedure TForm1.N4Click(Sender: TObject);
var
r:integer;
begin
r:=strtoint(form1.edit21.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Stepen(r,a);
Tmatrix.Vyvod;
end;
end.
27 мая 2009 в 21:01
Циклы по i и j, конечно, забыл У мну ж даж Дельфи не стоит, чтоп проверить…
Вместо
for r := 1 to 3 do
temp[i,j]:= temp[i,j]+result[i,r]*a[r,j];
Надо
for i := 1 to 3 do
for j := 1 to 3 do
for k := 1 to 3 do
temp[i,j]:= temp[i,j]+result[i,k]*a[k,j];
Самое главное-то (умножение матриц) и не написал
26 мая 2009 в 3:00
TMatrix = array of real;
индексация в динамических массивах начинается с нуля
чтобы использовать его как двумерный нужно использовать правильную индексацию
то есть на примере
n – размерность
var
a: TMatrix;
i, j: integer;
Setlength(a,n*n);
Randomize;
for i:=0 to n-1 do
for j:=0 to n-1 do
a[i*n+j]:=Random(100)-100;
таким циклом можно обрабатывать матрицу представленную одномерным массивом
26 мая 2009 в 0:04
а где циклы по i и j?
И переменные так в делфи не объявлялись, по крайней мере когда я еще в нем кодил, хз что в последних версиях там…
25 мая 2009 в 22:04
Внесу и я свою лепту, хотя в Дельфях не силен, могу накосячить с синтаксисом
procedure matrix.Stepen;
begin
// создаем матрицу, где будет результат. Записываем текущее значение – 1я степень
MyMatrix result = a;
// Возводим в степень.
for r_cur:= 2 to r do // <– Первая степень у нас уже есть – начинаем со 2й.
begin
// Умножаем текущий результат на a.
MyMatrix temp;
// Вычисляем значение степени для ячейки [i, j]. Возможно ее сначала надо заполнить нулями.
for r := 1 to 3 do
temp[i,j]:= temp[i,j]+result[i,r]*a[r,j];
result = temp; // Запоминаем промежуточный вариант.
end;
a = result; // Окончательное значение.
end;
25 мая 2009 в 21:04
Удачно разобраться
Если не получится, пиши завтра днём в личку, продолжим здесь обсуждение, чем смогу помогу.
p.s. Утро вечера мудренее будет.
25 мая 2009 в 21:03
procedure matrix.Stepen;
begin
for i := 1 to n do
for j := 1 to n do
a[i,j]:=exp(r*ln(a[i,j]));
еще такой вариант возведения есть)
25 мая 2009 в 21:03
А что такое r? ) показатель степени?
Ато функция stepen совсем не похожа на функцию возводящую матрицу в степень )
25 мая 2009 в 21:02
Напони что такое степень матрицы, т.е что ты хочешь чтобы этот метод делал?
25 мая 2009 в 21:02
for i := 1 to n do
for j := 1 to n do
a[i,j]:=0;
Собсна не удивительно что все нули
25 мая 2009 в 21:02
возвести матрицу в степень значит умножить ее саму на себя столько раз,в какую степень ее над возвести
25 мая 2009 в 21:02
Процедура, осуществляющая произведение двух матриц. Данная процедура организована с помощью вложенного цикла по параметрам iи j. В качестве входных параметров используется:
- две матрицы, которые буду умножены
- количество строк и столбцов матриц
В качестве выходных параметров используется матрицы, содержащая результат произведения двух матриц.
{процедура, осуществляющая умножение двух матриц}
{A размерность m*n}
{B размерность n*p}
{a,b – матрицы, которые будем умножать}
{KP – результирующая матрица}
{n –количество столбцов первой матрицы}
{m – количество строк первой матрицы}
{n – количество строк второй матрицы}
{p – количество столбцов второй матрицы}
procedure ymnog(a,b:typematrix; n,m:integer; var KP:typematrix);
var
i,j,k:integer;
begin{ymnog}
for i:=1 to m do
for j:=1 to p do
begin
C[i,j]:=0;
for k:=1 to n do
C[i,j]:=C[i,j]+a[i,k]*b[k,j];
end;
end;{ymnog}
воть че в инете нашла.на всех сайтах так
25 мая 2009 в 21:02
Хм…. не так всё просто надо повспоминатьт линейную алгебру….
25 мая 2009 в 21:01
так он выводит все нули…
25 мая 2009 в 21:01
Это раз!
procedure TForm1.N4Click(Sender: TObject);
var
r:integer;
a:MyMatrix;
begin
r:=strtoint(form1.edit21.text);
Tmatrix.vvod;// Ввели в Иксы из едитов
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);// Заполнили экземляр массива
Tmatrix.Stepen(r,Tmatrix.a);// Возводим встепень
Tmatrix.Vyvod;
end;
Передавать параметром матрицу вовсе не обязатльно коли ты работаешь в видимости одного экземпляра.
Это два!
procedure matrix.Stepen;
begin
for i := 1 to n do
for j := 1 to n do
a[i,j]:=0;// все 0
for r := 1 to 3 do
a[i,j]:= a[i,j]+a[i,r]*a[r,j]; // := 0 + 0*0 = 0
end;
И сознаюсь ноль всё же надо.
25 мая 2009 в 21:01
а как тогда.не обнулять ее совсем?но тогда ведь вычисления неверные будут..или неть?
25 мая 2009 в 21:00
Напиши полнорстью свою задачу, что тебе надо получить и необходимый в использовании инструмент, пробуем с объяснениями ещё разок.
25 мая 2009 в 21:00
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Edit13: TEdit;
Edit14: TEdit;
Edit15: TEdit;
Edit16: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit10: TEdit;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Edit19: TEdit;
Label3: TLabel;
Edit20: TEdit;
Label4: TLabel;
Edit21: TEdit;
Label5: TLabel;
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
n =3;
type MyMatrix=array[1..n] of array[1..n] of real;
type
Matrix=class
a:MyMatrix;
constructor create(x1,x2,x3,x4,x5,x6,x7,x8,x9:real);
procedure vvod;
procedure Umnogenie(k:integer);
procedure Delenie(d:integer);
procedure Stepen(r:integer;a:MyMatrix);
procedure vyvod;
end;
var
i,j:integer;
Form1: TForm1;
Tmatrix:matrix;
x1,x2,x3,x4,x5,x6,x7,x8,x9:integer;
implementation
{$R *.dfm}
constructor matrix.create;
begin inherited create;
a[1,1]:=x1;
a[1,2]:=x2;
a[1,3]:=x3;
a[2,1]:=x4;
a[2,2]:=x5;
a[2,3]:=x6;
a[3,1]:=x7;
a[3,2]:=x8;
a[3,3]:=x9;
end;
procedure matrix.vvod;
begin
x1:=strtoint(form1.edit1.text);
x2:=strtoint(form1.edit2.text);
x3:=strtoint(form1.edit3.text);
x4:=strtoint(form1.edit4.text);
x5:=strtoint(form1.edit5.text);
x6:=strtoint(form1.edit6.text);
x7:=strtoint(form1.edit7.text);
x8:=strtoint(form1.edit8.text);
x9:=strtoint(form1.edit9.text);
end;
procedure matrix.vyvod;
begin
form1.edit10.text:=floattostr(a[1,1]);
form1.edit11.text:=floattostr(a[1,2]);
form1.edit12.text:=floattostr(a[1,3]);
form1.edit13.text:=floattostr(a[2,1]);
form1.edit14.text:=floattostr(a[2,2]);
form1.edit15.text:=floattostr(a[2,3]);
form1.edit16.text:=floattostr(a[3,1]);
form1.edit17.text:=floattostr(a[3,2]);
form1.edit18.text:=floattostr(a[3,3]);
end;
procedure matrix.Umnogenie;
begin
for i:=1 to n do
for j:=1 to n do
a[i,j]:=a[i,j]*k;
end;
procedure matrix.Delenie;
begin
for i:=1 to 3 do
for j:=1 to 3 do
a[i,j]:=a[i,j]/d;
end;
procedure matrix.Stepen;
begin
for i := 1 to n do
for j := 1 to n do
a[i,j]:=0;
for r := 1 to 3 do
a[i,j]:= a[i,j]+a[i,r]*a[r,j];
end;
procedure TForm1.N2Click(Sender: TObject);
var
k:integer;
begin
k:=strtoint(form1.edit19.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Umnogenie(k);
Tmatrix.Vyvod;
end;
procedure TForm1.N3Click(Sender: TObject);
var
d:integer;
begin
d:=strtoint(form1.edit20.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Delenie(d);
Tmatrix.Vyvod;
end;
procedure TForm1.N4Click(Sender: TObject);
var
r:integer;
a:MyMatrix;
begin
r:=strtoint(form1.edit21.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Stepen(r,Tmatrix.a);
Tmatrix.Vyvod;
end;
end.
25 мая 2009 в 21:00
воть программа.все работет,тока не выводит результат возведения в степень,а выводит матрицу которую вводишь в начале
25 мая 2009 в 21:00
[quote] скопировала вставила то что написал.выводит то же самое(данную матрицу [/quote]
Вот и начали проявляться бонусы от сюрреализма в коде
Делфи под рукой нет, и писал на нем я давно, но попробуй изменить определение метода степень вот так
procedure stepen(r:integer; var a:MyMatrix);
25 мая 2009 в 20:05
скопировала вставила то что написал.выводит то же самое(данную матрицу
25 мая 2009 в 20:05
ну ни че себе девушка программист…..))
25 мая 2009 в 20:05
да девушка то не оч программист)
хорошо тут люди отзывчивые попались,чем могут помогают,спасибо им,почти уже сделали все)
25 мая 2009 в 20:04
Сергей молодец – дело подсказал, определить тип – самый простой метод. +5
25 мая 2009 в 20:04
Tmatrix.Stepen(r;a);
Первая точка с запятой откуда )
25 мая 2009 в 20:04
а если запятую ставить то грит что неопределенынй параметр а
25 мая 2009 в 20:04
procedure TForm1.N4Click(Sender: TObject);
var
r:integer;
a:MyMatrix;
begin
r:=strtoint(form1.edit21.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Stepen(r,a);
Tmatrix.Vyvod;
end;
программа заработала))
тока она выводит почему то матрицу которую я ввела
25 мая 2009 в 20:04
omg )
Поле a определено в классе matrix, а метод n4click в форме, естественно что они друг друга не видят.
Tmatrix.Stepen(r,tmatrix.a);
25 мая 2009 в 20:03
Хотя нет , цикл править не нужно, он уже правильный )
25 мая 2009 в 20:03
private
{ Private declarations }
public
{ Public declarations }
end;
const
n =3;
type MyMatrix=array[1..3] of array[1..3] of real;
type
Matrix=class
a:array[1..n,1..n] of MyMatrix;
constructor create(x1,x2,x3,x4,x5,x6,x7,x8,x9:real);
procedure Umnogenie(k:integer);
procedure vyvod;
procedure Delenie(d:integer);
procedure vvod;
procedure Stepen(r:integer;a:array of MyMatrix);
end;
var
i,j:integer;
Form1: TForm1;
Tmatrix:matrix;
x1,x2,x3,x4,x5,x6,x7,x8,x9:integer;
implementation
{$R *.dfm}
constructor matrix.create;
begin inherited create;
a[1,1]:=x1;————вот сюда показывает и пишет что не совпадают типы myMatrixи real
a[1,2]:=x2;
a[1,3]:=x3;
a[2,1]:=x4;
a[2,2]:=x5;
a[2,3]:=x6;
a[3,1]:=x7;
a[3,2]:=x8;
a[3,3]:=x9;
end;
25 мая 2009 в 20:03
Нет, не так брутально )
const
n =3;
type MyMatrix=array[1..n] of array[1..n] of real;
type
Matrix=class
a:MyMatrix;
…
procedure Stepen(r:integer;a:MyMatrix);
25 мая 2009 в 20:03
урря)))почти работает))
procedure TForm1.N4Click(Sender: TObject);
var
r:integer;
begin
r:=strtoint(form1.edit21.text);
Tmatrix.vvod;
Tmatrix:=matrix.create(x1,x2,x3,x4,x5,x6,x7,x8,x9);
Tmatrix.Stepen(r;a);—–говорит что не хватает параметров О_о
Tmatrix.Vyvod;
end;
end.
25 мая 2009 в 20:02
Пару строчек поправить всего )
Хотя в принципе стоило бы и всю программу переписать, она немного пугающе выглядит щас )
25 мая 2009 в 20:02
я уже пятый час сижу с этой фигней((
переписывать все не в моих силах уже
25 мая 2009 в 20:02
четя прям оч не пойму как тут исправить пару строчек и получится программа О_о
можете помочь?)
25 мая 2009 в 20:02
Перед определением класса с матрицей вставить строчку
type MyMatrix=array[1..3] of array[1..3] of real;
Потом определение поля a сделать типа MyMatrix, параметр у функции степень тоже сделать MyMatrix, и поправить цикл for внутри процедуры степень чтобы он проходил от 1 до 3 а не от 0 до 2. Вроде все
25 мая 2009 в 20:01
Смотри.У тебя написано в определении класса
procedure Stepen(r:integer;a:array of integer);
т.е. a – одномерный массив.
А в реализации функции ты пишешь
a[i,j]:= a[i,j]+a[i,r]*a[r,j];
т.е. индексируешь этот массив как двухмерный. Так нельзя делать )
25 мая 2009 в 20:01
а если я пишу procedure Stepen(r:integer;a:array[1..3,1..3] of real); воть так то он ошибку выдает((
и как из этого выйти
25 мая 2009 в 20:01
Ну ващет по хорошему стоило бы определить тип
type MyMatrix=array[0..2] of array[0..2] of real;
и использовать его везде по коду…
25 мая 2009 в 20:01
эт мне сейчас придется всю программу переписываь получается?((((
25 мая 2009 в 20:00
А зачем ты отпределила аргумент в заголовке процедуры:?
procedure Stepen(r:integer;a:array of integer);
не верно ли будет будет описывать её так:
procedure Stepen(r:integer);
А использовать вот так:
Tmatrix.Stepen(r);
25 мая 2009 в 20:00
Ошибка собсна потому, что аргументпроцедуры определен так
a: array of integer;
т.е. как одномерный массив. а используется как двухмерный массив.
вот он и хочет вместо интегера видеть массив )
25 мая 2009 в 20:00
тогда компилится но в результате выводит нули все,потому что неучитывает массив совсем.воть(
25 мая 2009 в 20:00
Сергей Lucius Старовой
О_о.где именно?там вроде все норм задано
25 мая 2009 в 19:05
Уй блин сколько лишних операторских скобок.
Так короче и понятнее будет
procedure matrix.Stepen;
begin
for i := 1 to 3 do
for j := 1 to 3 do
a[i,j]:=0;
for r := 1 to 3 do
a[i,j]:= a[i,j]+a[i,r]*a[r,j];
end;
Комментируй операционную строчку, будем дальше смотреть.
25 мая 2009 в 19:05
procedure matrix.Stepen;
begin
for i := 1 to 3 do
for j := 1 to 3 do
a[i,j]:=0;—-указывает на эту строку пишет array type requied
for r := 1 to 3 do
a[i,j]:= a[i,j]+a[i,r]*a[r,j];
end;
25 мая 2009 в 19:04
*Нефига не видно выделенной строки.
Что за аргумент в "a"?
И где его определение в вызове?
procedure Stepen(r:integer;a:array of integer);
25 мая 2009 в 19:04
procedure matrix.Stepen;
begin
for i := 1 to 3 do begin
for j := 1 to 3 do begin
a[i,j]:=0;
end;end;
begin
for r := 1 to 3 do
a[i,j]:= a[i,j]+a[i,r]*a[r,j];!!!!!!!!!!!!!!!!!!!!!
end;
end;
воть она)
25 мая 2009 в 19:04
а-это массив с которым мы работаем и который мы вводим через эдиты
его надо возвести в степень(это у меня и не выходит никак