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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2015, 06:25   #1
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию Произведение матрицы

Задача такова, что надо считать размерность матриц из файлов и перемножить их.

Считывание и умножение вроде бы сделал, но выдает ошибочку:"Constant expression required"

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

Вот код:
Код:
//---------------------------------------------------------------------------
#include <iostream.h>
#include <conio.h>
#include "stdio.h"
#include <fstream.h>
#pragma hdrstop
#pragma argsused

int main()
{//Открытие файла
  char path[] = "A.txt";
  ifstream in(path); // input
  if(!in) {cout << "Cannot open file.\n";
}
double d;
int cnt = 0;
//Получение количества дробных чисел в файле
while(!in.eof())
{
  in >> d;
  cnt++;
}

char buf[256];
int M = 0;
in.close();
in.clear();
in.open(path);
//Получение количества строк
while(!in.eof())
{
  in.getline(buf, 255);
  M++;
}
in.close();
in.clear();
//Получение количества столбцов
int N=cnt/M;
//Создание матрицы
double **A = new double*[M];
for(int i=0; i<M; i++)
   A[i] = new double[N];
in.open(path);
//Чтение матрицы
cout<<"Matrix A:\n";
for(int i=0; i<M; i++)
   {
    for(int j=0; j<N; j++)
       {
         in>>A[i][j];
         cout<<A[i][j]<<" ";
       }
    cout<<endl;
   }

{//Открытие файла
  char path[] = "B.txt";
  ifstream in(path); // input
  if(!in) {cout << "Cannot open file.\n";
}
double g;
int cnt1 = 0;
//Получение количества дробных чисел в файле
while(!in.eof())
{
  in >> g;
  cnt1++;
}

char buf1[256];
int m = 0;
in.close();
in.clear();
in.open(path);
//Получение количества строк
while(!in.eof())
{
  in.getline(buf1, 255);
  m++;
}
in.close();
in.clear();
//Получение количества столбцов
int n=cnt/M;
//Создание матрицы
double **B = new double*[m];
for(int i=0; i<m; i++)
   B[i] = new double[n];
in.open(path);
//Чтение матрицы
cout<<"\nMatrix B:\n";
for(int i=0; i<m; i++)
   {
    for(int j=0; j<n; j++)
       {
         in>>B[i][j];
         cout<<B[i][j]<<" ";
       }
    cout<<endl;
   }

int r;
int c;
int R[r][c];
for (r = 0; r < M; r++) {
        for (c = 0; c < n; c++) {
            //Произведение матриц
            for (int inner = 0; inner < N; inner++) {
                R[r][c] += A[r][inner] * B[inner][c];
            }
            cout << R[r][c] << "  ";
        }
        cout << "\n";

getch();
}
}
}

Последний раз редактировалось Vitalyas; 04.04.2015 в 06:29.
Vitalyas вне форума Ответить с цитированием
Старый 04.04.2015, 09:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
int R[r][c];
Обрати внимание как у тебя создается массив double **B
Тут то же самое только с int.
Цитата:
сделать ее гораздо проще.
Я бы для начала по функциям развел...
И кстати: Я бы не хранил матрицу в текстовике. Лучше бинарный файл.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.04.2015, 09:22   #3
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию

Хранение матрицы в текстовике прихоть преподавателя.
То если задать матрицу через double, то вы думаете проблема исчезнет?
Спешу вас огорчить - проблема остается такая же. Он жалуется на переменные r и c.
Пробовал расписать через #define, но там еще больше проблем создается, поэтому решил оставить так. Разбить по функциям идея хорошая, надо попробовать реализовать.
Vitalyas вне форума Ответить с цитированием
Старый 04.04.2015, 09:36   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
То если задать матрицу через double, то вы думаете проблема исчезнет?
Мдя... Смотрим в книгу - видим... НЛО.
Метод распределения массива возьми, а не сделай его вещественным.
Понял? Посмотри как у тебя тот массив создается и таким же способом создай int.
Вот как тут: http://www.programmersforum.ru/showp...79&postcount=4
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.04.2015, 16:53   #5
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию

Всё, понял, но что-то реализовать не получается, также как первые два массива.
Vitalyas вне форума Ответить с цитированием
Старый 04.04.2015, 20:28   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну значит код выше писал не ты. Иначе бы разобрался мгновенно.
Изучай пример, что я дал по ссылке.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.04.2015, 11:19   #7
Vitalyas
Пользователь
 
Регистрация: 25.11.2014
Сообщений: 47
По умолчанию

Помогите адаптировать произведение матриц из файлов (выделено /**/), а то у меня не получается
Код:
#include <iostream.h>
#include <conio.h>
#include "stdio.h"
#include <fstream.h>
#include <algorithm>
#include <ctime>
#pragma hdrstop
#pragma argsused
using namespace std;
int main()
{
  //Считывание и вывод массива А
     int M, N;
     ifstream ifs("A.txt");
     ifs >> M >> N;
     int ** a = new int * [M];
     cout << "Matrix A:\n";
     for (int r = 0; r < M; r++, cout << endl)
     {
        a[r] = new int [N];
        for (int c = 0; c < N; c++)
        {
           ifs >> a[r][c];
           cout << a[r][c] << ' ';
        }
     }
     for (int r = 0; r < M; r++) delete[] a[r];
     delete[] a;
     cout<<"\n";
  //Считывание и вывод массива B
     int m, n;
     ifstream ifs1("B.txt");
     ifs1 >> m >> n;
     int ** a1 = new int * [m];
     cout<<"Matrix B:\n";
     for (int r1 = 0; r1 < m; r1++, cout << endl)
     {
        a1[r1] = new int [n];
        for (int c1 = 0; c1 < n; c1++)
        {
           ifs1 >> a1[r1][c1];
           cout << a1[r1][c1] << ' ';
        }
     }
     for (int r1 = 0; r1 < m; r1++) delete[] a1[r1];
     delete[] a1;
     cout<<'\n';
/*
    int R[r2][c2];
    for (int r2 = 0; r2 < M; r2++)
    {
        for (int c2 = 0; c2 < n; c2++)
        {
            // Multiply the row of A by the column of B to get the row, column of product.
            for (int inner = 0; inner < N; inner++)
            {
                R[r2][c2] += a[M][inner] * a1[inner][N];
            }
            std::cout << R[r2][c2] << "  ";
        }
        std::cout << "\n";
    }
*/
    getch();
    return 0;
}

Последний раз редактировалось Vitalyas; 12.04.2015 в 12:20.
Vitalyas вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
матрицы: Найти произведение элементов матрицы mхn, удовлетворяющих условию А[i,j]<=2, и количество неотрицательных (QBasic) eescad Помощь студентам 1 04.12.2013 17:41
Произведение элементов матрицы Dark Raven Помощь студентам 2 05.06.2012 14:35
Произведение матрицы BaronVik Помощь студентам 2 05.05.2010 08:49
Сумма четных элементов матрицы. Произведение элементов 3-го столбца. Минимальный элемент матрицы. renovare Помощь студентам 2 03.07.2009 21:13
Произведение элементов матрицы Sasuke-sama Microsoft Office Excel 1 28.05.2009 05:13