Trabalho Prático 8 - Modularização

Ir em baixo

Trabalho Prático 8 - Modularização

Mensagem por Evandro Abu Kamel em Qui 21 Maio 2009, 17:48

Olá pessoal, temos aí mais um trabalho de ATP, e esse me deu um pouco mais de emoção, devido a alguns errinhos que tive que pesquisar um pouco para resolver. Smile
Então, vou dar uma ajudinha àqueles que não sabem nem por onde começar.

Primeiramente, pressuponho que você tenha lido o todo o arquivo referente a esse trabalho e o arquivo anterior e tenha feito o trabalho de leitura e escrita de arquivo texto, somando e multiplicando matrizes.

Ao começar, não se esqueça de incluir a biblioteca System.IO.
Podemos utilizar o código base que está no final do arquivo do enunciado, não é necessário mudar nada que está nele, pode usar aqueles mesmos procedimentos, funções e parâmetros.
A única coisa que se precisa fazer nesse programa é adicionar os códigos que foram usados no outro trabalho, colocando-os nas devidas funções/procedimentos e fazer o programa principal executar essas funções, de forma correta, é claro.

Vale lembrar que nós vamos trabalhar com duas matrizes de entrada, ou seja, dois arquivos serão lidos e duas matrizes serão geradas, logo, devem ser declaradas variáveis para essas duas matrizes e a matriz resultado.
Vamos for funções então:

carregarMatriz(): Essa função recebe como parâmetros o nome de uma matriz e seu número de linhas e colunas, os dois últimos são passados por referência, ou seja, na função Main devem ser declaradas essas variáveis para as duas matrizes de entrada, e essas variáveis terão seus valores alterados. Aqui usaremos aqueles mesmos comandos de abrir o arquivo, ler as duas primeiras linhas e jogar nas variáveis "linhas" e "colunas" e preencher uma matriz, que deve ser declarada nesse escopo, lenda as outras linhas do arquivo, não esquecendo de fechar o arquivo depois. E vejam só, essa função é declarada com o tipo int[,], isso quer dizer que ela retorna uma matriz quadrada, logo, deveremos passar como return a matriz que foi preenchida aqui dentro, e lá no bloco Main deverá ter uma matriz (declarada antes da chamada dessa função), essa matriz irá receber a chamada dessa função.


somarMatrizes(): Essa é bem simples, ela recebe como parâmetros as duas matrizes lidas/geradas e seu número de linhas e colunas, que deve ser igual para as duas matrizes, requisito para uma soma de matrizes. Declaramos e inicializamos uma matriz resultado dentro da função, efetuamos a soma como de costume e passamos essa matriz resultado como retorno, já que essa função retorna um int[,].


multiplicarMatrizes(): Não é muito diferente da anterior, basta ler os comentários que estão acima da função, lembrando dos requisitos de uma multiplicação de matrizes.


imprimeMatriz(): Agora que nossa matriz resultado já foi gerada, vamos imprimi-la na tela. Esse procedimento recebe como parâmetro a matriz e seu número de linhas e colunas (na função Main explico como consegui-las). Usando as variáveis dos parâmetros, vamos percorrer as posições das matrizes usando dois for() aninhados (um dentro do outro) e saltando a linha apenas após o for() de dentro, assim nossa matriz será impressa em forma de tabela. Não custa nada também exibir um "título", com o tamanho da matriz.


salvarMatriz(): Aqui os parâmetros serão os mesmos da anterior, mais um nome para o arquivo onde será salva a matriz resultado. Nesse procedimento usaremos aqueles comandos de criar um novo arquivo de escrita, escrever nas duas primeiras linhas, que são o número de linhas e de colunas da matriz, as outras linha é apenas percorrer a matriz e ir escrevendo os valores no arquivo. Não se esqueça de fechar o arquivo no final.


Main(): Chegamos a função principal, onde chamaremos todas as funções e procedimentos anteriores.
Primeiramente, iremos declarar as variáveis que serão usadas pelo programa, são elas:

Código:
int lna=0, cla=0, lnb=0, clb=0;
int lnc, clc;
string mata, matb, matc;
int[,] matriza, matrizb, matrizc=null;

As variáveis strings receberão os nomes dos arquivos das matrizes, digitados pelo usuário.
Alguns erros ocorres se as variáveis e vetores forem somente declarados:

- As variáveis correspondentes ao número de linhas das matrizes A e B (lidas/geradas) devem ser inicializadas com algum valor, porque elas são passadas como parâmetro por referência.

- A matriz resultado "matrizc" deve ser inicializada com qualquer valor (usei null) para que ela possa ser usada por outros comandos/procedimentos.

As variáveis strings são as que receberão os nomes dos arquivos das matrizes.

Agora temos que escolher uma das operações a fazer, soma ou multiplicação das matrizes. Eu optei por usar um menu de opções, mas faça como quiser. Na seqüência faremos a leitura dos nomes dos arquivos das duas matrizes e chamaremos a função carregarMatriz() para cada uma delas, passando os números de linhas e colunas por referência, já que a função recebe esses valores por referência:

Código:
matriza = carregarMatriz(mata, ref lna, ref cla);
matrizb = carregarMatriz(matb, ref lnb, ref clb);

Depois, de acordo com a opção escolhida, chamaremos a função que realizará a operação:

Código:
matrizc = somarMatrizes(matriza, matrizb, lna, cla);
OU

Código:
matrizc = multiplicarMatrizes(matriza, matrizb, lna, clb, cla);

Lembrando que as funções retornam algum valor, no caso, retornam matrizes, logo, uma matriz do bloco Main deve receber a chamada da função.

Agora, vamos imprimir a matriz resultado, com o procedimento imprimeMatriz(). Mas esse procedimento pede como parâmetros o número de linhas e colunas da matriz. Para obter de forma exata esses valores, usaremos o método "int GetUpperBound(int dimensao)" que toda matriz possui. Ele retorna o número da última posição de uma dimensão da matriz, começando da dimensão 0 (linha), depois 1 (coluna) e por aí vai. Ele funciona da seguinte forma:

Código:
lnc = matrizc.GetUpperBound(0) +1;  // numero de linhas da matrizc
clc = matrizc.GetUpperBound(1) +1;  // numero de colunas da matrizc
imprimeMatriz(matrizc,lnc,clc);

Pra terminar, vamos gravar a matriz resultado em um arquivo texto, usando o procedimento salvarMatriz(). Antes disso, devemos pedir ao usuário que informe o nome do arquivo que será gerado e passamos a variável string com o nome como parâmetro do procedimento, e é claro, passando a matriz como parâmetro também.

Código:
salvarMatriz(matrizc,lnc,clc,matc);


Bem pessoal, é isso aí.
Não quero dar muitos detalhes de como fazer isso pois quem precisa aprender isso são vocês. Se eu fizer as coisas mastigadas demais, perde a graça.
Pensem um pouco sobre como fazer o programa, releiam o código várias vezes caso dê algum erro, pesquisem na internet, vejam se não é algum erro de sintaxe ou de código.
Muita gente chega pra mim perguntando sobre erros banais do tipo "Como declara vetor e matriz?", "Como passa parâmetros?", "Como chama a função?". Sobre essas coisas, basta dar uma pesquisada aqui no fórum ou nos arquivos dos trabalhos, que está tudo muito bem explicado, basta fazer um esforço pra compreender as coisas, enxergar as lógicas, as padronizações.
O negócio é praticar.

Quem tiver alguma dúvida, poste aqui no fórum.
Por favor, não deixem pra tirar dúvidas por MSN no dia de entregar. Crying or Very sad Very Happy

Obrigado.


Última edição por Evandro Abu Kamel em Qui 21 Maio 2009, 19:10, editado 1 vez(es)

_________________
"Faça as coisas o mais simples que você puder,
porém, não as mais simples." Albert Einstein

avatar
Evandro Abu Kamel
Administrador
Administrador

Número de Mensagens : 222
Idade : 29
Data de inscrição : 11/03/2009

Ver perfil do usuário http://forum.clubedosistema.com

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por Nessa em Qui 21 Maio 2009, 18:39

[b]Evandro...VocÊ é feraa mesmooo....

Very Happy

Obrigada por me ajudar...
avatar
Nessa
Membro
Membro

Número de Mensagens : 8
Idade : 29
Data de inscrição : 24/03/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por bruno em Dom 24 Maio 2009, 20:50

minha matriz tá mostrando em todas as posições "zero"...quebrando a cabeça aqui!!

bruno
Membro
Membro

Número de Mensagens : 4
Idade : 32
Data de inscrição : 12/03/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por Evandro Abu Kamel em Seg 25 Maio 2009, 17:42

Parece que sua matriz não está sendo preenchida.

_________________
"Faça as coisas o mais simples que você puder,
porém, não as mais simples." Albert Einstein

avatar
Evandro Abu Kamel
Administrador
Administrador

Número de Mensagens : 222
Idade : 29
Data de inscrição : 11/03/2009

Ver perfil do usuário http://forum.clubedosistema.com

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por bruno em Seg 25 Maio 2009, 22:06

Evandro Abu Kamel escreveu:Parece que sua matriz não está sendo preenchida.

achei meu erro, realmente não estava sendo preenchida corretamente! Abraço..

bruno
Membro
Membro

Número de Mensagens : 4
Idade : 32
Data de inscrição : 12/03/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por Larissa em Ter 26 Maio 2009, 21:19

Não entendi nada.pra mim ta grego. Razz
avatar
Larissa
Membro
Membro

Número de Mensagens : 4
Data de inscrição : 30/03/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por Evandro Abu Kamel em Ter 26 Maio 2009, 23:11

Só lamento... deveria ter feito os trabalhos anteriores pra conseguir fazer esse. Neutral

_________________
"Faça as coisas o mais simples que você puder,
porém, não as mais simples." Albert Einstein

avatar
Evandro Abu Kamel
Administrador
Administrador

Número de Mensagens : 222
Idade : 29
Data de inscrição : 11/03/2009

Ver perfil do usuário http://forum.clubedosistema.com

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por Larissa em Ter 26 Maio 2009, 23:15

Nossa que incentivo,bacana............. Suspect
avatar
Larissa
Membro
Membro

Número de Mensagens : 4
Data de inscrição : 30/03/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por Nessa em Qui 28 Maio 2009, 17:07

Evandroo..minha multiplicação de matrizes está dando errado será que vc poderia me ajudar? Very Happy [url][/url]
Spoiler:
using System;
using System.IO;
namespace ATPLab
{
class Matrizes
{

// Dado um nome de arquivo, retornar uma matriz com os valores lidos.
// As dimensões da matriz devem ser retornadas por referencia.

static int[,] carregarMatriz(string arquivo, ref int linhas, ref int colunas)
{


// Abre um arquivo para leitura da matriz .

TextReader texto = new StreamReader(arquivo);


linhas = int.Parse(texto.ReadLine());
colunas = int.Parse(texto.ReadLine());


//Declaração da matriz .
int[,] matriz = new int[linhas, colunas];

//Preenche matriz.
for (int ln = 0; ln < linhas; ln++)
{
for (int col = 0; col < colunas; col++)
{

matriz[ln, col] = int.Parse(texto.ReadLine());

}

}

//Fechar o arquivo da matriz.
texto.Close();
return matriz;

}

// Dada uma matriz, suas dimensões e um nome de arquivo,
// gravar a matriz no arquivo.
static void salvarMatriz(int[,] matriz, int linhas, int colunas, string arquivo)
{

//Abre um arquivo para a leitura da matriz 2.

TextWriter texto = new StreamWriter(arquivo);

texto.WriteLine(linhas);
texto.WriteLine(colunas);


//Escreve matriz .
for (int ln = 0; ln < linhas; ln++)
{
for (int col = 0; col < colunas; col++)
{

texto.WriteLine(matriz[ln, col]);

}

}
//Fechar o arquivo da matriz .

texto.Close();
}


// Retorna a matriz resultante da soma de duas matrizes
static int[,] somarMatrizes(int[,] matrizA, int[,] matrizB, int linhas, int colunas)
{
//Declaração da matriz que ira receber a soma.

int[,] matrizC = new int[linhas, colunas];

//Soma das matrizes.

for (int ln = 0; ln < linhas; ln++)
{
for (int col = 0; col < colunas; col++)
{
matrizC[ln, col] = matrizA[ln, col] + matrizB[ln, col];

}

}

return matrizC;

}


// Retorna a matriz resultante da multiplicacao de duas matrizes.
// linasC e colunasC sao as dimensoes da matriz resultante.
// colunasA eh a quantidade de colunas da matriz A, que eh o mesmo valor de linhas de B.

static int[,] multiplicarMatrizes
(int[,] matrizA, int[,] matrizB, int linhasC, int colunasC, int colunasA)
{

//Declaração da matriz que ira receber a multiplicação.

int[,] matriz_mult = new int[linhasC, colunasC];

int soma = 0;

//Preenchimento da matriz C.

for (linhasC = 0; linhasC < colunasC; linhasC++)
{

for (colunasC = 0; colunasC < colunasA; colunasC++)
{
soma = 0;
for (int i = 0; i < colunasC; i++)
{
soma += matrizA[i,linhasC] * matrizB[colunasC,i];
}

matriz_mult[linhasC, colunasC] = soma;
}

}


return matriz_mult;

}

// Imprime uma matriz.
static void imprimeMatriz(int[,] matriz, int linhas, int colunas)
{

//Exibe matriz.

for (int ln = 0; ln < linhas; ln++)
{
for (int col = 0; col < colunas; col++)
{
Console.Write(matriz[ln, col] + " ");

}
Console.WriteLine();
}


}

// Programa principal.
static void Main(string[] args)
{
//Declaração de variaveis.

int[,] matriz1;
int[,] matriz2;
int[,] matriz3;
int numeroLinhas1 = 0;
int numeroLinhas2 = 0;
int numeroLinhas3 = 0;
int numeroColunas1 = 0;
int numeroColunas2 = 0;
int numeroColunas3 = 0;

//Armazenar os valores da matriz.

matriz1 = carregarMatriz("m01.txt", ref numeroLinhas1, ref numeroColunas1);
matriz2 = carregarMatriz("m02.txt", ref numeroLinhas2, ref numeroColunas2);
matriz3 = carregarMatriz("m03.txt", ref numeroLinhas3, ref numeroColunas3);

int[,] matrizSoma = somarMatrizes(matriz1, matriz2, numeroLinhas1, numeroColunas1);

matrizSoma = somarMatrizes(matriz3, matrizSoma, numeroLinhas1, numeroColunas1);

imprimeMatriz(matrizSoma, numeroLinhas1, numeroColunas1);

salvarMatriz(matrizSoma, numeroLinhas1, numeroColunas1, "soma_m01_m02_m03.txt");

matriz1 = carregarMatriz("m04.txt", ref numeroLinhas1, ref numeroColunas1);
matriz2 = carregarMatriz("m05.txt", ref numeroLinhas2, ref numeroColunas2);

int[,] mat_mult = multiplicarMatrizes(matriz1, matriz2, numeroLinhas3, numeroColunas3, numeroColunas1);

imprimeMatriz(mat_mult, numeroLinhas3, numeroColunas3);

salvarMatriz(mat_mult, numeroLinhas3, numeroColunas3, "mult_m04_m05.txt");


matriz1 = carregarMatriz("m06.txt", ref numeroLinhas1, ref numeroColunas1);
matriz2 = carregarMatriz("m07.txt", ref numeroLinhas2, ref numeroColunas2);

mat_mult = multiplicarMatrizes(matriz1, matriz2, numeroLinhas3, numeroColunas3, numeroColunas1);

imprimeMatriz(mat_mult, numeroLinhas3, numeroColunas3);

salvarMatriz(mat_mult, numeroLinhas3, numeroColunas3, "mult_m06_m07.txt");


matriz1 = carregarMatriz("m08.txt", ref numeroLinhas1, ref numeroColunas1);
matriz2 = carregarMatriz("m09.txt", ref numeroLinhas2, ref numeroColunas2);

matrizSoma = somarMatrizes(matriz1, matriz2, numeroLinhas1, numeroColunas1);

imprimeMatriz(matrizSoma, numeroLinhas1, numeroColunas1);

salvarMatriz(matrizSoma, numeroLinhas1, numeroColunas1, "soma_m08_m09.txt");

matriz1 = carregarMatriz("m10.txt", ref numeroLinhas1, ref numeroColunas1);
matriz2 = carregarMatriz("m11.txt", ref numeroLinhas2, ref numeroColunas2);

matrizSoma = somarMatrizes(matriz1, matriz2, numeroLinhas1, numeroColunas1);

imprimeMatriz(matrizSoma, numeroLinhas1, numeroColunas1);

salvarMatriz(matrizSoma, numeroLinhas1, numeroColunas1, "soma_m10_m11.txt");


matriz1 = carregarMatriz("m12.txt", ref numeroLinhas1, ref numeroColunas1);
matriz2 = carregarMatriz("m13.txt", ref numeroLinhas2, ref numeroColunas2);

mat_mult = multiplicarMatrizes(matriz1, matriz2, numeroLinhas3, numeroColunas3, numeroColunas1);

imprimeMatriz(mat_mult, numeroLinhas3, numeroColunas3);

salvarMatriz(mat_mult, numeroLinhas3, numeroColunas3, "mult_m12_m13.txt");


matriz1 = carregarMatriz("m14.txt", ref numeroLinhas1, ref numeroColunas1);
matriz2 = carregarMatriz("m15.txt", ref numeroLinhas2, ref numeroColunas2);

matrizSoma = somarMatrizes(matriz1, matriz2, numeroLinhas1, numeroColunas1);

imprimeMatriz(matrizSoma, numeroLinhas1, numeroColunas1);

salvarMatriz(matrizSoma, numeroLinhas1, numeroColunas1, "soma_m14_m15.txt");


matriz1 = carregarMatriz("m16.txt", ref numeroLinhas1, ref numeroColunas1);
matriz2 = carregarMatriz("m17.txt", ref numeroLinhas2, ref numeroColunas2);

mat_mult = multiplicarMatrizes(matriz1, matriz2, numeroLinhas3, numeroColunas3, numeroColunas1);

imprimeMatriz(mat_mult, numeroLinhas3, numeroColunas3);

salvarMatriz(mat_mult, numeroLinhas3, numeroColunas3, "mult_m16_m17.txt");







Console.ReadLine();


}
}
}
avatar
Nessa
Membro
Membro

Número de Mensagens : 8
Idade : 29
Data de inscrição : 24/03/2009

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por Evandro Abu Kamel em Qui 28 Maio 2009, 17:39

Vanessa, os dois primeiros for() da função multiplicarMatrizes() estão fazendo a contagem errada. Deveriam estar assim:

Código:
//Preenchimento da matriz C
for (int ln = 0; ln < numeroLinhas3; ln++)
{
      for (int cl = 0; cl < numeroColunas3; cl++)
      {
                soma = 0;
                for (int k = 0; k < numeroColunas1; k++)
                {
                        soma += matrizA[ln,k] * matrizB[k,cl];
                }
                matriz_mult[ln,cl] = soma;
      }
}

Veja se funciona.

_________________
"Faça as coisas o mais simples que você puder,
porém, não as mais simples." Albert Einstein

avatar
Evandro Abu Kamel
Administrador
Administrador

Número de Mensagens : 222
Idade : 29
Data de inscrição : 11/03/2009

Ver perfil do usuário http://forum.clubedosistema.com

Voltar ao Topo Ir em baixo

Re: Trabalho Prático 8 - Modularização

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum