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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2013, 11:43   #1
Htebazile
 
Регистрация: 21.06.2013
Сообщений: 9
По умолчанию Умножение двух матриц одинаковой размерности 3х3 в Delphi

Умножение Матриц 3х3 в Делфи, вот и все что надо сделать. Нужно написать простенькую программу, но я в дельфи вообще практически не разбираюсь(перевелся на др. специальность, теперь надо закрыть академ разницу, а мы не проходили практически делфи). Помогите плиз доделать, или объясните как. Вот я написал для начала, но не знаю почему не умножает. Там осталось доделать на 5 мин работы наверно. Ошибок не выдает.
P.S. Пожалуйста не смейтесь.
Вложения
Тип файла: rar програ2.rar (3.2 Кб, 14 просмотров)
Htebazile вне форума Ответить с цитированием
Старый 19.09.2013, 11:55   #2
Htebazile
 
Регистрация: 21.06.2013
Сообщений: 9
По умолчанию

Объясните пожалуйста, что мне еще там нужно доделать.
Htebazile вне форума Ответить с цитированием
Старый 19.09.2013, 12:05   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
Var 
  c,d,n2: array[1..10,1..10] of real;
  i,j,k:integer;
begin
 For i:=0 to 3 do
   For j:= 0 to 3 do
     c[i,j]:= StrToInt(A.Cells[j,i]);

 For i:=0 to 3 do
   For j:= 0 to 3 do
     d[i,j]:= StrToInt(B.Cells[j,i]);

 for j:=0 to 3 do 
 begin
   For i:=0 to 3 do 
   begin
     n2[i,j]:=0;
     for k:= 0 to 3 do
     begin 
       n2[i,j]:= n2[i,j]+c[i,k]*d[k,j];
     end;
//можно выводить сразу как посчитали и тогда следующий цикл не нужен.
     AB.Cells[j,i]:=FloatToStr(n2[i,j]);
   end;
 end;

begin // ЗДЕСЬ begin не нужен.  
For i:=0 to 3 do
For j:=0 to 3 do
   n2[k,i]:=n2[k,i]+c[k,j]*d[j,i]; //а что такое k ЗДЕСЬ для ЭТОГО цикла? зачем здесь после подсчета еще раз считать?

AB.Cells[j,i]:=FloatToStr(n2[i,j]);//а вот это в цикл не входит, после оператора цикла(for do) НЕТ begin посему и не выводит ("не считает")

end;// если нет begin то и end не нужен.

end;
Цитата:
//а что такое k ЗДЕСЬ для ЭТОГО цикла?
про такое компилятор вообще-то сообщает. называется [Warning]
т.е. вообще-то допустимо, но скорее что-то будет не так как вы ожидаете.
Цитата:
[Warning] controller.pas(330): FOR-Loop variable 'k' may be undefined after loop
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.09.2013 в 12:15.
evg_m вне форума Ответить с цитированием
Старый 19.09.2013, 12:14   #4
Htebazile
 
Регистрация: 21.06.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
1 -   n2[k,i]:=n2[k,i]+c[k,j]*d[j,i]; //а что такое k ЗДЕСЬ для ЭТОГО цикла? зачем здесь после подсчета еще раз считать?

2 - AB.Cells[j,i]:=FloatToStr(n2[i,j]);//а вот это в цикл не входит, после оператора цикла(for do) НЕТ begin посему и не выводит ("не считает")

end;// если нет begin то и end не нужен.


end;
Я делал по методичке, поэтому наверно лишнее тут k. Получается для того, чтобы работала программа, "1" - мне нужно вообще убрать, а "2" исправить? Перед оператором цикла поставить begin?

Последний раз редактировалось Htebazile; 19.09.2013 в 12:20.
Htebazile вне форума Ответить с цитированием
Старый 19.09.2013, 12:21   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
"1" - мне нужно вообще убрать, а "2" исправить?
именно так. и при удалении 1. следующая строка попадает в цикл и 2. автоматически исправляется.

а еще можно воспользоваться 0
Цитата:
//можно выводить сразу как посчитали и тогда следующий цикл не нужен.
AB.Cells[j,i]:=FloatToStr(n2[i,j]);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.09.2013 в 12:25.
evg_m вне форума Ответить с цитированием
Старый 19.09.2013, 12:39   #6
Htebazile
 
Регистрация: 21.06.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
именно так. и при удалении 1. следующая строка попадает в цикл и 2. автоматически исправляется.

а еще можно воспользоваться 0

Вот я привел вроде в божеский вид(скидываю), но когда пытаюсь умножить, выскакивает вот такая ошибка.
Изображения
Тип файла: jpg New Year Wallpapier (18).jpg (106.7 Кб, 120 просмотров)
Вложения
Тип файла: rar Новая папка.rar (183.1 Кб, 14 просмотров)
Htebazile вне форума Ответить с цитированием
Старый 19.09.2013, 12:46   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

:=strtoint(a.Cells[j,i]);
ищите где вы используете для получения числа ПУСТУЮ ячейку. (без всякого явно заданного числа).
Delphi такую строку(пустую) не считает числом.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.09.2013 в 12:48.
evg_m вне форума Ответить с цитированием
Старый 19.09.2013, 13:08   #8
Htebazile
 
Регистрация: 21.06.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
:=strtoint(a.Cells[j,i]);
ищите где вы используете для получения числа ПУСТУЮ ячейку. (без всякого явно заданного числа).
Delphi такую строку(пустую) не считает числом.
Извините за мою некомпетентность, но не очень понимаю о чем, т.к. говорю, что дельфи практически не проходил=( вроде как раз нигде не использую пустую ячейку, в коде такой пустой строки не нашел, ч/з F8 не находит ничего. Чтобы не менял, все та же ошибка=(
Как именно можно это исправить?

Последний раз редактировалось Htebazile; 19.09.2013 в 13:24.
Htebazile вне форума Ответить с цитированием
Старый 19.09.2013, 18:18   #9
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

У вас все StringGrid'ы имеют размерность 3х3, а соответственно номер последнего столбца и строки будет 2. И циклы соответственно должны быть от 0 до 2. И чтобы избежать подобной ошибки лучше пользовать циклом вида
Код:
for i := 0 to SG.RowCount - 1 do
  for j := 0 to SG.ColCount - 1 do
где SG - имя вашего грида.
И еще у вас все циклы начинаются с 0, а массивы объявлены как [1..10, 1..10]. Тогда уж и массивы описывайте [0..9,0..9].
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение двух матриц F1nt Общие вопросы C/C++ 6 24.06.2014 23:37
Умножение матриц (Delphi) Denis0993 Помощь студентам 4 27.05.2013 21:44
Умножение двух матриц на С++ machines Visual C++ 0 16.05.2011 01:20
Delphi. Умножение матриц. Manik Помощь студентам 39 26.12.2009 14:20
Ввод векторов и матриц, умножение матрицы на вектор и вычисление скалярного призведения двух векторов zverushka Помощь студентам 18 20.02.2009 15:25