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:06. Заголовок: akira пишет: // вво..


akira пишет:

 цитата:
// ввод элементов матриц.
int a[rd1][st1];



Вообще-то, программа не должна компилироватся, так как в С++ размерность массива должна быть константным выражением, А у вас размерность массива задана переменными.

Вы компилировали программу? Каким компилятором?

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



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


- у меня комплировалось. шел ввод самих элементов. потом писало ошибку и с программы выбрасывало.
компилятор Dev C++.

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



ссылка на сообщение  Отправлено: 28.07.12 12:21. Заголовок: akira пишет: int a;..


akira пишет:

 цитата:
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];
}
};



Здесь также у вас код не должен компилироваться. Во-первых, индексация элементов массива в С/С++ должна начинаться с 0, а не с 1. К тому же для элемента массива вы должны указать два индекса, а не один, так как у вас двумерный массив.


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



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


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

 цитата:
Здесь также у вас код не должен компилироваться. Во-первых, индексация элементов массива в С/С++ должна начинаться с 0, а не с 1. К тому же для элемента массива вы должны указать два индекса, а не один, так как у вас двумерный массив.


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


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



ссылка на сообщение  Отправлено: 28.07.12 12:24. Заголовок: akira пишет: int a;..


akira пишет:

 цитата:
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 a[rd1][st1];  

for (i = 0 ; i < rd1; i++ )
{
for (j = 0; j < st1; j++)
{
cout << "vveditb element a " << i << "_" << j << " = ";
cin >> a[ i ][ j ];
}
}

Точку с запятой не надо ставить после закрывающейся фигурной скобки блока кода цикла

P.S. Я подкорректировал код.

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



ссылка на сообщение  Отправлено: 28.07.12 12:26. Заголовок: Я понял, в чем пробл..


Я понял, в чем проблема. При форматировании текста теги некоторые пропадают.
То есть, где должно быть a[ i ][ j ] редактор пишет a[j]. Ставьте пробелы после и перед квадратными скобками.

Тогда сейчас посмотрим ваш код дальше

Но тем не менее исправьте начальные индексы цикла, как я указал, то есть индекс должен начинаться с 0, а не с 1.

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



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


- все ошибки понял, кроме этого:
Сыроежка пишет:

 цитата:
cin >> a[j];


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


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



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


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

 цитата:
Я понял, в чем проблема. При форматировании текста теги некоторые пропадают.
То есть, где должно быть a[ i ][ j ] редактор пишет a[j]. Ставьте пробелы после и перед квадратными скобками.

Тогда сейчас посмотрим ваш код дальше

Но тем не менее исправьте начальные индексы цикла, как я указал, то есть индекс должен начинаться с 0, а не с 1.


- сейчас попробую

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



ссылка на сообщение  Отправлено: 28.07.12 12:31. Заголовок: akira пишет: int C;..


akira пишет:

 цитата:
int C[j][t];



Потом эта размерность матрицы не понятна. Если я еще помню математику, то размерность результирующей матрицы должна быть равна размерности матрицы, являющейся левым операндом произведения, Или это не так?!

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



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


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

 цитата:
Потом эта тразмерность матрицы не понятна. Если я еще помню математику, то размерность результирующей матрицы должна быть равна размерности матрицы, являющейся левым операндом произведения, Или это не так?!


- размерность результирующей матрицы должна быть: число рядков с первой матрицы и число столбцов со второй.


+ то, что указали выше поправил.

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



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


akira пишет:

 цитата:
// умножение.
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;
}



Мне представляется, что и с произведением вы намудрили! Зачем здесь три цикла? Два - for и один - while?

Кроме того, я хотел бы обратить внимание, что не надо было объявлять четыре переменных i, j, k, l в начале тела функции main В С++ управляющую переменную цикла можно объявить внутри цикла. Например,

int a[rd1][st1];

for ( int i = 0 ; i < rd1; i++ ) 
{
for ( int j = 0; j < st1; j++)
{
cout << "vveditb element a " << i << "_" << j << " = ";
cin >> a[ i ][ j ];
}
}




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



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


akira пишет:

 цитата:
- размерность результирующей матрицы должна быть: число рядков с первой матрицы и число столбцов со второй.



А разве не должна размерность результирующей матрицы в точности совпадать с левым операндом, то есть с первой матрицей? Сейчас гляну в учебник по линейной алгебре.:)

Да, посмотрел. Если умножается матрица размерностью m * l на матрицу размерностью l * n, то результирующая матрица будет размерностью m * n.:)

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



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


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

 цитата:
Кроме того, я хотел бы обратить внимание, что нре надо было объявляться четыре переменных i, j, k, l в начале тела функции main В С++ управляющую переменную цикла можно объявить внутри цикла. Например,

int a[rd1][st1];

for ( int i = 0 ; i < rd1; i++ )
{
for ( int j = 0; j < st1; j++)
{
cout << "vveditb element a " << i << "_" << j << " = ";
cin >> a[ i ][ j ];
}
}


- это я знаю.) уже поправил.
Сыроежка пишет:

 цитата:
Мне представляется, что и с произведением вы намудрили! Зачем здесь три цикла? Два - for и один - while?


- чтобы значение правильно возвращалось. но даже так у меня не вышло.
Сыроежка пишет:

 цитата:
А разве не должна размерность результирующей матрицы в точности совпадать с левым операндом, то есть с первой матрицей? Сейчас гляну в учебник по линейной алгебре.:)


- я смотрел.) должны быть матрицы, количество столбцов первой равно количеству рядков второй. умножение производиться рядок на столбец и записывается в первый элемент матрицы-результата. затем тот же рядок умножается на второй столбец второй матрицы поэлементно и результаты суммируются, после чего записываются во второй элемент рядка матрицы-результата. и т.д. потом переход на слушающий рядок, когда столбцы заканчиваются.

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



ссылка на сообщение  Отправлено: 28.07.12 12:38. Заголовок: Сейчас, я почитаю пр..


Сейчас, я почитаю про произведени матриц, и минут через 10-15 напишу правильный код

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



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


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

 цитата:
Сейчас, я почитаю про произведени матриц, и минут через 10-15 напишу правильный код


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

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



ссылка на сообщение  Отправлено: 28.07.12 12:41. Заголовок: Так, сейчас буду рас..


Так, сейчас буду рассуждать и сразу же писать код произведения матриц. Допустим, матрица A имеет размерность m * l, а матрица B - l * n. Тогда произведением будет матрица размерностью m * n, каждый элемент которой вычисляется по формуле

c[ i ][ j ] = сумма a[ i ][ k ] * b[ k ][ j ], где k меняется от 1 до l.

Это так в математике.

Заменяем это циклами языка С++

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


Правильно? Осилишь теперь вставить вместо матриц a, b и с идентификаторы своих матриц, а вместо m, n, k также размерности твоих матриц? Покажи, что получилось.

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



ссылка на сообщение  Отправлено: 28.07.12 12:43. Заголовок: - так должно быть? #..


- так должно быть?

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


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

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

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

// вывод результата.
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 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 12:46. Заголовок: Давай поработаем над..


Давай поработаем над кодом. Во-первых, у тебя не используются переменные sum и ch.

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

То есть вот эта часть кода некорректная

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


И надо вообще убрать строчки

i=1;  
j=1;


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



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


Сыроежка - все поправил. ошибки понял.
// вывод результата.
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 12:48. Заголовок: Надеюсь, программа к..


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

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



ссылка на сообщение  Отправлено: 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 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 13:22. Заголовок: - цикл правильно! вы..


- цикл правильно! вы вроде просто не поняли как умножаться матрицы.


- а ви сделали только чтобы поэлементно множилось. или вообще не так.

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



ссылка на сообщение  Отправлено: 28.07.12 13:24. Заголовок: Я еще раз повторяю, ..


Я еще раз повторяю, исправь ошибку в цикле. Я ее красным цветом выделил. Код правильный.

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



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


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

 цитата:
Я еще раз повторяю, исправь ошибку в цикле. Я ее красным цветом выделил. Код правильный.


- а, тысячу извинений. я думал, что исправил.
блин, ужасно протупил. стыдно.
спасибо большое за помощь. очень благодарен.
если что-нить помочь будет надо - то обращайтесь. помогу ем смогу.
еще один вопрос - с чего лучше начинать профессиональное изучение С++? есть какая-нибудь хорошая литература или нечто подобное? а то в нете масса всего, а толкового почти нет. потому хотел спросить у вас, специалиста.

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



ссылка на сообщение  Отправлено: 28.07.12 13:29. Заголовок: С азов надо начинать..


С азов надо начинать. Есть такая хорошая книжка для начального изучения С++, как Дж. Либерти "Освой самостоятельно С++ за 21 день".

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



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


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

 цитата:
С азов надо начинать. Есть такая хорошая книжка для начального изучения С++, как Дж. Либерти "Освой самостоятельно С++ за 21 день".


- сегодня же возьмусь за изучение.
еще один вопрос - а можно как-то красивы вывести элементы матрицы-результата? и через какую функцию и как выводить первые две матрицы, перед третьей?

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



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


Если делать "красиво", то надо использовать графический режим. А прииспользовании стандартного потока вывода можно выводить лишь в режиме телетайпа. Конечно можно вставить разлиные заголовки перед выводом матриц. Можно также вывод каждой строки заключить в фигурные скобки. Но не более того.

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



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


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

 цитата:
Если делать "красиво", то надо использовать графический режим. А прииспользовании стандартного потока вывода можно выводить лишь в режиме телетайпа. Конечно можно вставить разлиные заголовки перед выводом матриц. Можно также вывод каждой строки заключить в фигурные скобки. Но не более того.


- понятно. а вывод первой и второй матрицы делать так же, как и вывод результата?

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



ссылка на сообщение  Отправлено: 28.07.12 13:34. Заголовок: Да, ведь вы имеете д..


Да, ведь вы имеете дело с одним и тем же типом объекта. Можно вообще оформить вывод матрицы в виде отдельной общей функции.

Что-то вроде следующего

void show( const char *title, int **a, int n, int m ) 
{
if ( title != NULL ) std::cout << title << "\n\n";

for ( int i = 0; i < n; i++ )
{
for ( int j = 0; j < m; j++)
{
std::cout << C[ i ][ j ] << ' ';
}
std::cout << endl;
}
}


И вызывать ее в коде в виде, например,

show( "Matrix A:", (int ** ) a, rd1, st1 );


или

show( "Matrix A:", reinterpret_cast<int **>( a ), rd1, st1 );




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



ссылка на сообщение  Отправлено: 28.07.12 13:38. Заголовок: А все начиналось где..


А все начиналось где-то на другом форуме __http://www.cyberforum.ru/cpp-beginners/thread386251.html, где наш герой заблокирован.

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



ссылка на сообщение  Отправлено: 28.07.12 13:39. Заголовок: Сыроежка - сейчас по..


Сыроежка - сейчас попробую переоформить.
AlexMyr пишет:

 цитата:
А все начиналось где-то на другом форуме __http://www.cyberforum.ru/cpp-beginners/thread386251.html, где наш герой заблокирован.


- ну а разве я виноват, что там не было ответа? человек предложил помощь и собственно помог в решении задачи, за что я очень благодарен. в чем проблема-то?

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



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


akira пишет:

 цитата:
- ну а разве я виноват, что там не было ответа? человек предложил помощь и собственно помог в решении задачи, за что я очень благодарен. в чем проблема-то?



Проблема в том, что есть люди, которым становится очень плохо, когда у других все хорошо!:)

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



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


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

 цитата:
Проблема в том, что есть люди, которым становится очень плохо, когда у других все хорошо!:)


- понятно.
у меня еще один вопрос.
я попробовал раскидать программу по функциям. но оно потом не распознает cout, cin и т.д. что можно с этим сделать?

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



ссылка на сообщение  Отправлено: 28.07.12 13:43. Заголовок: В вашей исходной про..


В вашей исходной программе есть строчка

using namespace std;

которая помещает имена cout, cin из стандартного пространства имен в глобальное пространство имен. Таким образом вы можете не указывать явно для этих имен их пространство имен. То есть без этой директивы вы должны бы были писать

std::cin или std::cout

Теперь возвращаясь к вашему вопросу, возможно вы поместили определения функций перед этой директивой. Если это так, то компилятор действительно не знает, что это за имена cin и cout

Определения ваших функций должно находиться между этой директивой и телом функции main. Либо вы можете в эту область поместить объявления функций, а их определения поместить после тела функции main

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



ссылка на сообщение  Отправлено: 28.07.12 13:44. Заголовок: - поменял. но теперь..


- поменял. но теперь константу не принимает почему-то.
вот код:

#include <iostream>
using namespace std;
int rd1 , st1 , rd2 , st2;

const mr=100;

int a[mr][mr];
int b[mr][mr];
int c[mr][mr];

void dimension(){

// расширение первой матрицы.
cout << "enter the dimension of the first matrix:" <<endl;
cout << "line=";
cin >> rd1;
cout << "column=";
cin >>st1;
// расширение второй матрицы.
cout << "enter the dimension of the second matrix:" << endl;
cout << "line=";
cin >> rd2;
cout << "column=";
cin >> st2;
// выход при неправильности условия.
if (st1 != rd2) {
cout << "product of these matrices can be calculated";

}
}

void input_a(){
// ввод элементов.

for (int i=0; i < rd1; i++){
for (int j=0; j<st1; j++){
cout << "type element a [" << i <<"]_[" << j << "] = ";
cin >> a [j];
}
}
}
void input_b(){

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

void multiplication(){
// умножение.


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

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

int main(){

dimension();
input_a();
input_b();
multiplication();
output();

system("PAUSE");
return 0;
}


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



ссылка на сообщение  Отправлено: 28.07.12 13:45. Заголовок: Надо указать тип это..


Надо указать тип этой константы const mr=100;

Например,

const int mr=100;

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



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


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

 цитата:
Надо указать тип этой константы const mr=100;


- прописать int mr
перед объявление константы?

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



ссылка на сообщение  Отправлено: 28.07.12 13:47. Заголовок: Я привел пример в пр..


Я привел пример в предыдущем ответе.

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



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


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

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



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


akira пишет:

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



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

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



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


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

 цитата:
Но, думаю, вам достаточно просто после вывода каждого элемента следом выводить один пробел.


- а как это прописать?
cout << b[k] << " " << [l];
так?

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



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


akira пишет:

 цитата:
- а как это прописать?
cout << b[k] << " " << [l];
так?



Одного пробела для вызова достаточно. то есть пробел можно заключить в одинарные кавычки.

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



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


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

 цитата:
Одного пробела для вызова достаточно. то есть пробел можно заключить в одинарные кавычки.


- можете пример показать?

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



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


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

Это тот же код, что вы сами привели


 цитата:
- а как это прописать?
cout << b[k] << ' ' << [l];
так?



Только пробел я поставил в одинарные кавычки. Разница в том, что когда используются одинарные кавычки, то это - один символ. А когда используются двойные кавычки - это это символьный массив, состоящий из символа пробела и завершающего символьного нуля. Только и всего.

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



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


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

 цитата:
Только пробел я поставил в одинарные кавычки. Разница в том, что когда используются одинарные кавычки, то это - один символ. А когда используются двойные кавычки - это это символьный массив, состоящий из символа пробела и завершающего символьного нуля. Только и всего.


- ошибку пишет.

expected primary-expression before '[' token

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



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


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

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



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


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

 цитата:
Скопируй оттуда вывод


- я так и сделал.
суть в том, что если убрать эти << ' ' << то все нормально работает.

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



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


akira пишет:

 цитата:
- я так и сделал.
суть в том, что если убрать эти << ' ' << то все нормально работает.



У тебя синтаксически неправильная конструкция. Должно быть

cout << a[ i ][ j ] << ' ';


Таким образом должна выводиться строка элементов матрицы. После вывода строки пишешь

cout << endl;


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



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


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

 цитата:
У тебя синтаксически неправильная конструкция. Должно быть

cout << a[ i ][ j ] << ' ';


Таким образом должна выводиться строка элементов матрицы. После вывода строки пишешь

cout << endl;


- вышло.
каким оператором в функции можно осуществить выход?

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



ссылка на сообщение  Отправлено: 28.07.12 14:08. Заголовок: akira пишет: каким ..


akira пишет:

 цитата:
каким оператором в функции можно осуществить выход?



Если у функции тип возвращаемого значения объыявлен как void, то функция завершит свою работу по достижению закрывающейся фигурной скобки тела функции. Либо можно вставить предложение return; Но оно будет просто тлишним, если логика выполнения функции достигает закрывающейся фигурной скобки.

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



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


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

 цитата:
Если у функции тип возвращаемого значения объыявлен как void, то функция завершит свою работу по достижению закрывающейся фигурной скобки тела функции. Либо можно вставить предложение return; Но оно будет просто тлишним, если логика выполнения функции достигает закрывающейся фигурной скобки.


- я уже сам справился. сделал через return возвращение к началу программы.

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

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