Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Caio Giolo

Com código de Multiplicação de Matrizes

Recommended Posts

Galera primeira vez que estou postando aqui não sei se estou fazendo as coisas certo nem nos lugares certos..

A proposta do problema é a seguinte:

 

O programa deve ler duas matrizes em dois arquivos diferentes(que serão passados em linha de comando para o código) e na primeira linha desse arquivo esta o numero de linha e colunas da matriz e nas demais a matriz propriamente dita.. O algoritmo deve retornar a multiplicação dessas duas matrizes e considerar todos os erros.Além disso, o programa deve ser capaz de checar se as dimensões de cada uma das matrizes dos arquivos condizem com o que é especificado na primeira linha de cada um deles. - e o que esta destacado é meu grande problema.. meu código faz tudo certo.. só não consegue diferenciar um matriz 3x2 de uma 2x3, por exemplo!

 

O código que eu implementei ate agora é o seguinte:

 

#include <iostream>
#include <stdlib.h>
#include <fstream>

using namespace std;

int main (int argc, char* argv[]){

ifstream file1, file2; // Variavel para o arquivo.
char item[20]; // Variavel para a leitura de palavras do arquivo.
int mat1[30][30], mat2[30][30], matres[30][30];	
int i1, i2, j1, j2, cont, i, j, k, x, y;


if ( argc != 3) {
	cout << " \tUse: multimat <filename> <filename>\n" << endl;
	return 1;
}

file1.open(argv[1]);
if (!file1){
	cout << "\tArquivo 1 inexistente.\n" << endl;
	return 2;
}

file2.open(argv[2]);
if (!file2){
	cout << "\tArquivo 2 inexistente.\n" << endl;
	return 3;
}

file1 >> item;
i1 = atoi(item);
file1 >> item;
j1 = atoi(item);

file2 >> item;
i2 = atoi(item);
file2 >> item;
j2 = atoi(item);

if (j1 != i2) {
	cout << "Matrizes incompativeis\n" << endl;
	return 4;
}

cont = 0;
while (file1 >> item )
	cont++;	

if (cont != (i1*j1)) {
	cout << "Arquivo 1 corrompido\n";
	return 5;
}

file1.close();
file1.open(argv[1]);

file1 >> item;
file1 >> item;

for (x=0; x != i1; x++) 
	for (y=0; y != j1; y++) {
		file1 >> item;	
		mat1[x][y] = atoi(item);
	}

cont = 0;
while (file2 >> item )
	cont++;	

if (cont != (i2*j2)) {
	cout << "Arquivo 2 corrompido\n";
	return 6;
}

file2.close();
file2.open(argv[2]);

file2 >> item;
file2 >> item;

for (x=0; x != i2; x++) 
	for (y=0; y != j2; y++) {
		file2 >> item;	
		mat2[x][y] = atoi(item);
	}

for(i=0; i != i1 ; i++)
	for(j=0; j!= j2; j++)
		for (k=0; k != j1 ; k++)
			matres[i][j] = matres[i][j] + mat1[i][k]*mat2[k][j];

for (i=0; i != i1; i++) {
	for(j=0; j != j2; j++)
		cout << matres[i][j] << "  ";

	cout << endl;
}


cout << endl;
file1.close();
file2.close();
cout << " Arquivo Fechado." << endl;

return 0;

 

Compilando Ok! no g++ do ubuntu!

Sera que alguem pode me ajudar a desenvolver essa ultima parte do problema? porque do jeito que eu implementei não é considerado os espaços nem as quebras de lina!

 

Desde já agradeço pessoal..

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então são dois problemas.

 

As matrizes, pelo que eu entendi, terão somente números inteiros. Então, quando você ler um elemento do arquivo, basta verificar se ele é um número. Se o caracter lido estiver no intervalo de 0x30 (0) e 0x39 (9), logo ele é um número. O que não estiver neste intervalo, ignore. Não esqueça de levar em consideração elementos com dois, três, quatro... caracteres (10, 100, 1000...).

 

O problemas das dimensões das matrizes, a resolução vai depender da forma como você decidiu que estará a matriz no arquivo. Se toda em uma linha ou com quebras de linhas...

 

Utilizando os valores de quantidade de linhas e colunas da primeira linha do arquivo basta ler e verificar.

Se cada linha da matriz for uma linha do arquivo, você sabe que, apartir da segunda linha. O total de linhas do arquivo não pode ultrapassar o valor de linhas lido no começo do arquivo.

 

Se a matriz estiver toda em uma linha. Utilizando a quantidade de colunas lidas na primeira linha, você sabe que a cada 'x' elementos lidos é uma nova linha. Aí basta comparar.

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.