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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2007, 18:33   #1
POPOV
Форумчанин
 
Аватар для POPOV
 
Регистрация: 26.10.2007
Сообщений: 124
По умолчанию Задача с матрицей на Delphi

Короче такая задача: Даны матрицы A(n,k), B(k,m). Умножить матрицы.
Исходные данные в объектах TMemo.
Мучаюсь уже больше недели, осталось прямо чусть и всё будет ок, но не могу (

Прикладываю скрин (см. как прикреплённый файл) как это должно выглядеть и программный код кнопки "Вычислить", который написан на данный момент:

procedure TForm1.Button9Click(Sender: TObject);
var
a:array [1..10,1..10] of integer;
b:array [1..10,1..10] of integer;
i,j,i1,j1,k,k1,rez,l,i2,j2:integer;
str,s,s1:string;
begin
str:=Memo1.text;
S:=Memo2.Text;
S1:=Memo4.Text;
for i:=1 to strtoint(edit2.text) do
begin
for j:=1 to strtoint(edit2.text) do
begin
for i1:=1 to strtoint(edit6.Text) do
begin
for j1:=1 to strtoint(edit6.Text) do
begin
k:=pos(' ',str);
k1:=pos(' ',S1);
a[i,j]:=StrToInt(copy(str,1,k-1));
b[i1,j1]:=StrToInt(copy(S1,1,k1-1));
rez:=a[i,j] * b[i1,j1];
delete(str,1,k);
delete(S1,1,k1);
end;
delete(str,1,2);
delete(S1,1,2);
end;
Memo3.Clear;
For i:=1 to strtoint(edit2.text) do
for i1:=1 to strtoint(edit6.text) do
begin
S:='';
for j:=1 to strtoint(edit2.Text) do
for j1:=1 to strtoint(edit6.text) do
S:=S+inttostr(rez)+' ';
memo3.Lines.Add(s);

end;
end;
end;
end;

При попытке запуска программа выдаёт следующие ошибки :
[Error] Unit1.pas(202): Assignment to FOR-Loop variable 'i'
[Error] Unit1.pas(206): Assignment to FOR-Loop variable 'j'
[Fatal Error] Project1.dpr(6): Could not compile used unit 'Unit1.pas'

Ребята, очень прошу, помогите мне справиться с этим, пожалуйста...
Изображения
Тип файла: jpg Безымянный.jpg (23.9 Кб, 142 просмотров)
POPOV вне форума Ответить с цитированием
Старый 26.10.2007, 20:37   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
[Error] Unit1.pas(202): Assignment to FOR-Loop variable 'i'
[Error] Unit1.pas(206): Assignment to FOR-Loop variable 'j'
Компилятор дает тебе знать что счетчикам циклов приваиваются значения (внутри циклов), чего быть не должно (смотри строки 202 и 206).
Введи дополнительные переменные для вложенных циклов.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 26.10.2007, 21:00   #3
POPOV
Форумчанин
 
Аватар для POPOV
 
Регистрация: 26.10.2007
Сообщений: 124
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Компилятор дает тебе знать что счетчикам циклов приваиваются значения (внутри циклов), чего быть не должно (смотри строки 202 и 206).
Введи дополнительные переменные для вложенных циклов.
Не помогает, ввёл туда новые переменные в эти два цикла, теперь выдаёт следующую ошибку (Смотреть прикрёплённый файл).

Ребят, у кого стоит Delphi 7 , пожалуйста попробуйте у себя позапускать..
Это займёт у вас меньше времени, чем отписываение на форуме..
Изображения
Тип файла: jpg Безымянный1.jpg (24.0 Кб, 146 просмотров)

Последний раз редактировалось POPOV; 26.10.2007 в 21:02.
POPOV вне форума Ответить с цитированием
Старый 26.10.2007, 23:48   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

а это ошибка несовпадения типов, нужно интегер а присваивается чего-то другое
p.s. щас попробую у себя скомпилировать

p.p.s. кажется я понял, там у тебя данные из Editов бурутся, и вероятно один из них (или все) пустой либо в нем не число, если хочешь избежать ошибки вместо StrToInt используй StrToIntDef (в ней можно указать число по умолчанию, на случай если в строке не интегер)
ну и проверь все ли данные правильно введены
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 27.10.2007 в 00:08.
mutabor вне форума Ответить с цитированием
Старый 27.10.2007, 01:05   #5
POPOV
Форумчанин
 
Аватар для POPOV
 
Регистрация: 26.10.2007
Сообщений: 124
По умолчанию

Не втыкнул (я тупой) что именно делать с этим StrToIntDef. Попробовал тупо впихнуть вместо всех StrToInt и не помогло, какая-то новая ошибка:

[Error] Unit1.pas(206): Not enough actual parameters
[Fatal Error] Project1.dpr(6): Could not compile used unit 'Unit1.pas'

Как понять все ли данные правльно введены ? Если ты про ввод данных в запущенном приложении, то там делаю всё правильно : После каждого числа ставлю пробел, в конце строки также ставлю пробел.

Я ПРИКРЕПИЛ СВОЮ ПРОГУ НА ВСЯКИЙ СЛУЧАЙ, вдруг кому не влом посмотреть будет.. Это задание в закладке Memo в проге.
Вложения
Тип файла: rar Работа 4.rar (810.9 Кб, 10 просмотров)

Последний раз редактировалось POPOV; 27.10.2007 в 01:50.
POPOV вне форума Ответить с цитированием
Старый 27.10.2007, 03:47   #6
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Не втыкнул (я тупой) что именно делать с этим StrToIntDef. Попробовал тупо впихнуть вместо всех StrToInt и не помогло, какая-то новая ошибка:
это можно было не менять, это не критично если правильно вводить данные

посмотрю исходник ближе к вечеру, там скорее всего ты не в те эдиты не те данные вводишь (кстати пробелы не надо)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 27.10.2007, 14:43   #7
POPOV
Форумчанин
 
Аватар для POPOV
 
Регистрация: 26.10.2007
Сообщений: 124
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
посмотрю исходник ближе к вечеру, там скорее всего ты не в те эдиты не те данные вводишь (кстати пробелы не надо)
Как это пробелов не надо ? А как тогда прога будет различать например двузначное число от вдух разных чисел ?

Тут ещё вспомни ,что матрицы умножаются вообще по другому в математике и совсем поник (
Мне бы хоть так сделать
POPOV вне форума Ответить с цитированием
Старый 27.10.2007, 16:16   #8
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

Для procedure Button9Click ::
Добавь переменные: A_r,A_c,B_r,B_c:Integer;
И код кнопки замени(вредыдущий свой код можешь пока закомментировать - поставь перед ним- { и после него- }) на:
Код:
begin
s:=Edit2.Text;
A_r:=StrToInt(Copy(S,1,Pos(',',s)-1));
A_c:=StrToInt(Copy(S,Pos(',',s)+1,Length(s)));
B_r:=A_c;
s:=Edit6.Text;
B_c:=StrToInt(Copy(S,Pos(',',s)+1,Length(s)));
s:=Memo1.Text;
if s[Length(s)]<>' ' then s:=s+' ';
for i := 1 to A_r do
  for j := 1 to A_c do
    begin
      s1:=Copy(s,1,Pos(' ',s)-1);
      a[i,j]:=StrToInt(s1);
      delete(s,1,Length(s1)+1);
    end;
s:=Memo4.Text;
if s[Length(s)]<>' '
then s:=s+' ';
for i := 1 to B_r do
  for j := 1 to B_c do
    begin
      s1:=Copy(s,1,Pos(' ',s)-1);
      b[i,j]:=StrToInt(s1);
      delete(s,1,Length(s1)+1);
    end;
S:='';
for i := 1 to A_r do
 begin
  for j := 1 to B_c do
   begin
     rez:=0;
     for k := 1 to B_r do
      rez:=rez+a[i][k]*b[k][j];
    s:=s+IntToStr(rez)+' ';
   end;
 end;
 Memo3.Text:= Memo3.Text+s;
Это без форматирования, красивостей и проверок класса "защита от дурака".
В эдиты вписываешь размерности без пробелов через запятую. Например "2,3" и "3,7" (без кавычек). TMemo заполняешь целымы числами через пробел ("1 1 1 1 1 1" и "2 3 4 5 6 7 4 5 3 4 4 5 4 6 4 5 6 4 5 6 4")

Жмёшь "Вычислить" - получаешь результат: "11 11 14 13 16 17 14
11 11 14 13 16 17 14"



Если решать на бумаге, то выглядеть будет так:

|1 1 1| |2 3 4 5 6 7 4| |11 11 14 13 16 17 14|
|1 1 1|x |5 3 4 4 5 4 6| = |11 11 14 13 16 17 14|
|4 5 6 4 5 6 4|
Maslan вне форума Ответить с цитированием
Старый 27.10.2007, 16:47   #9
POPOV
Форумчанин
 
Аватар для POPOV
 
Регистрация: 26.10.2007
Сообщений: 124
По умолчанию

Боже мой !!!! Работает , ураааааааааааааааааа!!!!

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

Ну вообщем и на том огромное человеческое спасибо )
POPOV вне форума Ответить с цитированием
Старый 27.10.2007, 17:00   #10
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

Можно конечно =)
Код:
for i := 1 to A_r do
  begin
   s:=Memo1.Lines.Strings[i-1];
   if s[Length(s)]<>' ' then s:=s+' ';
  for j := 1 to A_c do
    begin
      s1:=Copy(s,1,Pos(' ',s)-1);
      a[i,j]:=StrToInt(s1);
      delete(s,1,Length(s1)+1);
    end;
  end;
Ну и для B аналогичный...
Maslan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача,опять же с матрицей groth88 Паскаль, Turbo Pascal, PascalABC.NET 3 16.04.2008 13:22
Задача с матрицей. Ломаю голову уже неделю Damokl Помощь студентам 6 19.12.2007 03:20
Задача с матрицей H[o][o]K Помощь студентам 1 15.12.2007 16:51
Задача с матрицей(нужна помощь) VDK23RUS Помощь студентам 5 14.06.2007 12:55
Задача с матрицей, Паскаль Integra Помощь студентам 1 25.04.2007 16:14