On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 12:02. Заголовок: Поиск ошибки в программе для умножения матриц.


здрасте. В общем, я почти закончил свою программу. Так мне кажется. Но, при компиляции создается екзешник, затем по началу программа работает. Ввожу элементы матрицы, но до самих расчетов не доходит.
Вот сам исходник:



 цитата:
#include <iostream>
#include <conio.h>
using namespace std;


int main() {
int i=1,j=1,k=1,l=1;
int sum , rd1 , st1 , rd2 , st2 ;
char ch;
// ввод расширения первой матрицы.
cout << "Vveditb rozmirnistb pershoi Matruci: ";
cin >> rd1;
cin >> st1;
// ввод расширения 2 матрицы.
cout << "Vveditb rozmirnistb dryhoi matruci: ";
cin >> rd2;
cin >> st2;
// выход при не соответствии.
if (st1 != rd2) {
cout << "\nMatruc9 ne ob4usljuets9!";
getch();
return 0;
}
// ввод элементов матриц.
int a[rd1][st1];
for (i=1; i<=rd1; i++){
for (j=1; j<=st1; j++){
cout << "vveditb element a " << i << "_" << j << " = " << endl;
cin >> a[j];
}
};

int b[rd2] [st2];
for (k=1; k<=rd2; k++){
for (l=1; l<=st2; l++){
cout << "vveditb element b " << k << "_" << l << " = " << endl;
cin >> b[k][l];
}
};

cout << endl;
// умножение.
int t=0,z;
int C[j][t];
for (int j=0; j<rd2; j++){
while (t<st1){
for (int i=0; i<st1; i++){
z = a[t] * b[t] + z;
}
C[j][t] = z;
t++;
}
t=0;
}

// вывод результата
i=1;
j=1;
for (int i=1; i<=rd1; i++){
for (int j=1; j<=st2; j++){
cout << C[j];
}
cout << endl;
}
system("PAUSE");
return 0;
}




- если не трудно, посмотрите в чем может быть ошибка тут. Уже весь день с этой прогой сижу...

Спасибо: 0 
Цитата Ответить
Ответов - 70 , стр: 1 2 3 4 All [только новые]





ссылка на сообщение  Отправлено: 28.07.12 12:51. Заголовок: Сыроежка пишет: Над..


Сыроежка пишет:

 цитата:
Надеюсь, программа компилируется и выдает правильный результат?


- не компилирует. пишет ошибку вот тут:
akira пишет:

 цитата:
c[ i ][ j ] = 0;


45 C:\Users\Kiwi\Desktop\Untitled1.cpp `c' undeclared (first use this function)

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:54. Заголовок: - то уже поправил. С..


- то уже поправил.
Сыроежка пишет:

 цитата:
for ( int k = 0 ; k < l ; k ++ )


- тут должно быть l или 1?

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:55. Заголовок: Наверное ты забыл об..


Наверное ты забыл объявить массив c

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:56. Заголовок: Сыроежка пишет: Нав..


Сыроежка пишет:

 цитата:
Наверное ты забыл объявить массив c


- я уже поправил.

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:57. Заголовок: l - это что? ..


l - это что?


Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:58. Заголовок: akira пишет: - тут ..


akira пишет:

 цитата:
- тут должно быть l или 1?



Здесь должна быть их совпадающая размерность, то есть число столбцов первой матрицы и число строк второй матрицы. Я писал в пример размерности матриц m * l и l * n

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:00. Заголовок: Сыроежка пишет: Зде..


Сыроежка пишет:

 цитата:
Здесь должна быть их совпадающая размерность, то есть число столбцов первой матрицы и число строк второй матрицы. Я писал в пример размерности матриц m * l и l * n


- а если я делал для столбцов первой матрицы и числа строк второй матрицы разные переменные?

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:01. Заголовок: akira пишет: - а ес..


akira пишет:

 цитата:
- а если я делал для столбцов первой матрицы и числа строк второй матрицы разные переменные?



Еще раз внимательно посмотри мои рассуждения, где я писал циклы. У тебя две исходные матрицы. Первая размером m * l, вторая - l * n. Значит итоговая матрица имеет размерность m * n. В циклах я использовал эти идентификаторы. Никаких единиц там нет. Там есть три счетчика циклов: i, j и k

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:03. Заголовок: Сыроежка пишет: Еще..


Сыроежка пишет:

 цитата:
Еще раз внимательно посмотри мои рассуждения, где я писал циклы. У тебя две исходные матрицы. Первая размером m * l, вторая - l * n. Значит итоговая матрица имеет размерность m * n. В циклах я использовал эти идентификаторы. Никаких единиц там нет. Там есть три счетчика циклов: i, j и k


- так это я понял.
я о другом.
в общем, если можешь, то попробуй у себя скомпилировать:
http://zalil.ru/32080071

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:04. Заголовок: У меня не будет комп..


У меня не будет компилироваться, потому что С++ не принимает массивы с переменной размерностью. Выкладывай свой код здесь. И укажи, какую ошибку выдает компилятор при компиляции.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:05. Заголовок: // умножение. for (..



 цитата:
// умножение.
for ( int i = 0 ; i < rd1 ; i++ )
{
for ( int j = 0 ; j < st2 ; j ++ )
{
c[j] = 0;
for (int k = 0 ; k < 1 ; k ++)
{
c[j] += a[k] * b[k][j];
}
}
}


ошибка тут:
c[j] = 0;
я прописываю перед этим int c[j] и оно уже на нем ошибку выписывает.


Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:07. Заголовок: У тебя, похоже, k ме..


У тебя, похоже, k меняется от 0 до единицы, а должно меняться до количества столбцов в первой матрице или, что равносильно, до количества строк во второй матрицы.

Покажи объявление массива c и текст сообщения об ошибке.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:08. Заголовок: Сыроежка пишет: У т..


Сыроежка пишет:

 цитата:
У тебя, похоже, k меняется от 0 до единицы, а должно меняться до количества столбцов в первой матрице или, что равносильно, до количества строк во второй матрицы.


- понял, поправлю.
вот:
// умножение.
int c[j];
for ( int i = 0 ; i < rd1 ; i++ )
{
for ( int j = 0 ; j < st2 ; j ++ )
{
c[j] = 0;
for (int k = 0 ; k < rd2 ; k ++)
{
c[j] += a[k] * b[k][j];
}
}
}
ошибка:
41 C:\Users\Kiwi\Desktop\Untitled1.cpp name lookup of `i' changed for new ISO `for' scoping

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:10. Заголовок: У тебя массив cдолже..


У тебя массив c должен быть объявлен с размерностью rd1 * st2. А у тебя там какое-то j задано. Я имею в виду объявление массива с, а не обращение к его элементам в цикле.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:12. Заголовок: Сыроежка пишет: У т..


Сыроежка пишет:

 цитата:
У тебя массив cдолжен быть объявлен с размерностью rd1 * st2. А у тебя там какое-то j задано. Я имею в виду объявление массива с, а не обращение к его элементам в цикле.


- работает. но не так, как должно. оно множит поэлементно. и при умножении матрицы 2х2 где все элементы 2 на такую же матрицы выдает матрицу 2х2 где все элементы 4. а должны быть 8.

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:15. Заголовок: Показывай еще раз ци..


Показывай еще раз цикл перемножения и цикл вывода на экран результата.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:18. Заголовок: // умножение. int c..


// умножение.
int c[rd1][st2];
for ( int i = 0 ; i < rd1 ; i++ )
{
for ( int j = 0 ; j < st2 ; j ++ )
{
c[j] = 0;
for (int k = 0 ; k < 1 ; k ++)
{
c[j] += a[k] * b[k][j];
}
}
}

// вывод результата.
for (int i=0; i < rd1; i++){
for (int j=0; j < st2; j++){
cout << c [j];
}
cout << endl;
}
system("PAUSE");
return 0;
}


Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:19. Заголовок: - оно тут не полност..


- оно тут не полностью массивы отображает

Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:20. Заголовок: Если код у тебя совп..


Если код у тебя совпадает с приведенным мною кодом ниже, то должно все правильно считать.

// умножение.  
int c[rd1][st2];

for ( int i = 0 ; i < rd1 ; i++ )
{
for ( int j = 0 ; j < st2 ; j ++ )
{
c[ i ][ j ] = 0;
for (int k = 0 ; k < 1 ; k ++) // Я же говорил, что здесь не единица, а st1 или rd2!!!!
{
c[ i ][ j ] += a[ i ][ k ] * b[ k ] [ j];
}
}
}
// вывод результата.
for (int i=0; i < rd1; i++)
{
for (int j=0; j < st2; j++)
{
cout << c] i ] [ j ];
}
cout << endl;
}

system("PAUSE");

return 0;
}



Можно на пальцах проверить. Если i = 0, j = 0, то в цикле

      for (int k = 0 ; k < 1 ; k ++)  
{
c[ i ][ j ] += a[ i ][ k ] * b[ k ] [ j];
}


должно быть две итерации. Первая - a[ 0 ][ 0 ] * b[ 0 ][ 0] . Вторая - a[ 0][ 1 ] * b[ 1 ][ 0 ] . И берется их сумма. Как может получиться неверный результат?!

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:21. Заголовок: Короче говоря, напиш..


Короче говоря, напиши наконец-то правильно цикл! Я тебе комментарием пометил ошибку в коде!

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 70 , стр: 1 2 3 4 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 10
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет