Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск ошибки в программе. Есть программа по умножению двух матриц. 
:(
    Опции темы
akiraAkai
Дата 17.11.2011, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



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

Код

#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[i][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][i] * b[i][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[i][j];
            }
      cout << endl;
      }
system("PAUSE");
return 0;
}

 
- если не трудно, посмотрите в чем может быть ошибка тут. Уже весь день с этой прогой сижу...
PM MAIL   Вверх
Silent
Дата 18.11.2011, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 1
Всего: 9



наверное, это некультурно, но позволю себе сказать "какой ужас!..."

1) индексация в массиве начинается с 0. соответственно, если объявили массив как a[rd1][st1], то есть элементы a[0][0], a[0][1]... a[rd1-1][st1-1]. При попытке обратиться к a[rd1][st1] - прочитается совсем не массив.
2) объявление массива С:
Код

int t=0,z;
int C[j][t];

угадайте, чему равен размер массива? а должен быть int C[rd1][st2]
3) код перемножения матриц. просто тихо выпадаем в осадок и переделываем на три обычных цикла for.
4) вывод ответа - все в одну кучу. поставим между выводом C[i][j] хотя бы пробелы

Итоговый вариант:
Код

#include <iostream>
using namespace std;

int main() {
  int rd1 , st1 , rd2 , st2 ;
  // ввод расширения первой матрицы.
  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!";
    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 << " = " << endl;
      cin >> a[i][j];
    }
  
  int b[rd2] [st2];
  for (int i = 0; i < rd2; i++)
    for (int j = 0; j < st2; j++)
    {
      cout << "vveditb element b " << i << "_" << j << " = " << endl;
      cin >> b[i][j];
    }
  
  cout << endl;
  // умножение.
  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 < st1; k++)
    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;
  }
  return 0;
}

PM MAIL   Вверх
math64
Дата 18.11.2011, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(akiraAkai @  17.11.2011,  23:40 Найти цитируемый пост)
Код
int a[rd1][st1];

Цитата(akiraAkai @  17.11.2011,  23:40 Найти цитируемый пост)
Код
int b[rd2] [st2];

Цитата(akiraAkai @  17.11.2011,  23:40 Найти цитируемый пост)
Код
int C[j][t];

Цитата(Silent @  18.11.2011,  07:38 Найти цитируемый пост)
угадайте, чему равен размер массива? а должен быть int C[rd1][st2]

Динамические массивы C++ не поддерживает - они есть только в C99, но тогда вместо iostream используйте stdio + компилятор, поддерживающий стандарт C99.
В С++ нужно создавать массивы так:
Код

int**a;
a = new int*[rd1]; for(int i=0; i<rd1;i++)a[i] = new int[st1];
...
// и удалять после использования
for(int i=0; i<rd1;i++) delete[] a[i];
delete[] a;



Это сообщение отредактировал(а) math64 - 18.11.2011, 08:23
PM   Вверх
akiraAkai
Дата 18.11.2011, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Silent, 
math64, - спасибо, но мне уже помогли разобраться. уже все работает. простите за беспокойство.
- я пытался понять динамические массивы но не совсем вышло.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.