Ir ao conteúdo
  • Cadastre-se
Josesousa

C Resolvi o problema de Matriz , mas somente a parte final não da certo.

Recommended Posts

O exercicio se trata do seguinte: 

36. Escrever um algoritmo que lê uma matriz M(12,13) e divida todos os 13 elementos de cada uma das
12 linhas de M pelo maior elemento em módulo daquela linha. Escrever a matriz lida e a modificada.

 

Eu consegui resolver a parte do maior numero da linha, contudo na ultima linha da erro na hora de achar o maior numero(aparece que é o ultimo numero que e maior). E, alem disso, esta apresentando erro na hora da divisao, aparencendo somente a divisao que darão resultados exatos (no caso,o maior numero por ele mesmo).

OBSERVAÇÃO: Reduzir o tamanho da matriz, para que fique fácil para conferir.

Se puderem ajudar, agradeço!

 

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
/*36. Escrever um algoritmo que lê uma matriz M(12,13) e divida todos os 13 elementos de cada uma das
12 linhas de M pelo maior elemento em módulo daquela linha. Escrever a matriz lida e a modificada.*/
main (){
    float mat[4][5], cont=0, soma=0, maior, maior2, maior3, maior4;
    int i,j;
    float mat2[4][5];

    for(i=0;i<4;i++){
        for(j=0;j<5;j++){
            printf("Informe matriz [%d][%d]: ", i,j);
            scanf("%f", &mat[i][j]);
        }
    }
    for(i=0;i<4;i++){
        for(j=0;j<5;j++){
            if(i==0){
                maior=mat[0][j];
                }
                if(mat[0][j]>maior){
                maior=mat[0][j];
            }

        }
    }
    printf("\nO maior numero e %f.\n\n", maior);

    for(i=0;i<4;i++){
        for(j=0;j<5;j++){
            if(i==1){
                maior2=mat[1][j];
                }
                if(mat[1][j]>maior2){
                maior2=mat[1][j];
            }
        }
    }
        printf("\nO maior numero e %f.\n\n", maior2);

    for(i=0;i<4;i++){
        for(j=0;j<5;j++){
            if(i==2){
                maior3=mat[2][j];
                }
                if(mat[2][j]>maior3){
                maior3=mat[2][j];
            }
        }
    }
        printf("\nO maior numero e %f.\n\n", maior3);

    for(i=0;i<4;i++){
        for(j=0;j<5;j++){
            if(i==3){
                maior4=mat[3][j];
                }
                if(mat[3][j]>maior4){
                maior4=mat[3][j];
            }
        }
    }
        printf("\nO maior numero e %f.\n\n", maior4);

    for(i=0;i<4;i++){
        for(j=0;j<5;j++){
            if(i==0){
                mat2[0][j]=mat[0][j]/maior;
            }
            if(i==1){
                mat2[1][j]=mat[1][j]/maior2;
            }
            if(i==2){
                mat2[2][j]=mat[2][j]/maior3;
            }
            if(i==3){
                mat2[3][j]=mat[3][j]/maior4;
            }
        }
    }
    for(i=0;i<4;i++){
        for(j=0;j<5;j++){
           printf("A matriz modificada e : matriz [%d][%d]: %f\n", i, j, mat2[i][j]);
        }
    }

system("pause");
return 0;
}

 

Editado por Josesousa
Consegui resolver uma parte do problema. Resta agora outra parte!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A lógica está errada, seu programa percorre a matriz inteira para checar 1 única linha da matriz, o que significa que ele checa a mesma linha 4 vezes, quando i e j estão na linha correta da matriz ele não verifica o maior corretamente pois ele sempre troca pelo valor atual não importando se é maior ou não (

if(i==0){ maior=mat[0][j]; }

), o programa só gera o número maior correto para as 3 primeiras linhas porque ele o loop roda mais 3 vezes verificando a mesma linha, mas no caso da última linha ele não verifica novamente pois é a última passagem pela matriz então fica com o maior errado.

 

E as variáveis cont e soma não são usadas então pode excluí-las.

Editado por DiF
Botão CODE <> tem que ser usado, sempre. Mesmo quando for uma pequena fração de código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick  Os for foram feitos de forma idependente, acho que a logica nao esta toda errada...pois os primeiros estão dando certo.

O que voce mudaria para o for nao rodasse mais do que o necessario..????

 

E em relação ao soma e cont é porque nao terminei o programa, e ainda mantenho o custome (errado) de declarar variaveis que acho que vou usar...

 

Me acho a tentar resoluciona-lo....

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Josesousa Vou demonstrar o problema...

 

Nos for duplos para obter o maior valor de cada linha, o primeiro for que itera sobre i é irrelevante

for(i=0; i<4; i++) {

Pois você na matriz o valor de i está fixo, e só j varia, pois você só usa assim:

maior=mat[0][j];

e
  
if(mat[0][j]>maior) {

Então vamos remover esse for, e colocar i = 0; no lugar.

 

Seu código fica assim:

i = 0;
for(j=0; j<5; j++) {
    if(i==0) {
        maior=mat[0][j];
    }
    if(mat[0][j]>maior) {
        maior=mat[0][j];
    }
}

Consegue enxergar o problema agora?

 

i é sempre igual a 0, logo o primeiro if sempre é verdadeiro, logo maior vai guardar todos os valores da linha na variável maior em sequência, e o segundo if nunca é verdadeiro pois mat[0][j] é sempre igual a maior... Logo, o resultado é que no fim a variável maior armazenará o último número da linha, não o maior número da linha.

 

Por coincidência o fato de você ter colocado um segundo for para o i, faz com que i se torne diferente de 0 nas próximas iterações, ou seja, quando o programa passa pela linha 0 ele pega o número errado como maior, mas quando passa pelas demais linhas da matriz ele finalmente pega o maior valor da linha 0...

 

Mas isso não acontece no caso do maior4 pois não tem nenhuma linha depois dessa para corrigir o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Genial, apesar não ter compreendido tudo. Mas to absorvendo e procurando aprender.

 

Uma pergunta, no caso eu teria que alterar o valor de i toda vez que eu for abrir um for para encontrar o maior? Dessa forma.

i = 0;
for(j=0; j<5; j++) {
    if(i==0) {
        maior=mat[0][j];
    }
    if(mat[0][j]>maior) {
        maior=mat[0][j];
    }
}
i = 1;
for(j=0; j<5; j++) {
    if(i==1) {
        maior=mat[1][j];
    }
    if(mat[1][j]>maior) {
        maior=mat[1][j];
    }
}
// E ASSIM POR DIANTE

 

Com a sua dica de que nao tem nenhuma linha depois da ultima para ele corrigir o erro (que ainda to entendendo) eu fiz com que o i do ultimo for fosse ate o 5, corrigindo o problema..

rodou aqui.....

Essa sua forma de fazer é mais fácil para o programa ja que nao analisará as demais linhas. (MUITO BOM).

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, Josesousa disse:

Uma pergunta, no caso eu teria que alterar o valor de i toda vez que eu for abrir um for para encontrar o maior? Dessa forma.

 

Sim, mas primeiro vamos corrigir a lógica desse for:

i = 0;
for(j=0; j<5; j++) {
    if(i==0) {
        maior=mat[0][j];
    }
    if(mat[0][j]>maior) {
        maior=mat[0][j];
    }
}

Esse if dentro do for não deveria existir:

if(i==0) {
    maior=mat[0][j];
}

Vamos assumir que maior é igual a mat[0][0] antes do for, assim dentro do for você só atualiza o valor maior:

i = 0;
maior=mat[0][0];
for(j=0; j<5; j++) {
    if(mat[0][j]>maior) {
        maior=mat[0][j];
    }
}

Dessa maneira podemos até mudar e fazer o for começar com j=1 pois não precisa comparar mat[0][0] com ele mesmo:

i = 0;
maior=mat[0][0];
for(j=1; j<5; j++) {
    if(mat[0][j]>maior) {
        maior=mat[0][j];
    }
}

Agora temos algo que vai funcionar corretamente para obter o maior número da linha 0. Logo podemos imprimir e usar para dividir todos o números da linha:

i = 0;
maior=mat[0][0];
for(j=1; j<5; j++) {
    if(mat[0][j]>maior) {
        maior=mat[0][j];
    }
}
printf("\nO maior numero e %f.\n\n", maior);
for(j=0; j<5; j++) {
    mat2[0][j] = mat[0][j]/maior;
}

Agora completamos toda a operação para esta linha, mas isso é válido para todas as linhas, então vamos colocar tudo isso dentro de um for que itera sobre i, para fazer o mesmo para cada linha da matriz (e i não será mais fixo igual a 0 nos colchetes das matrizes mat e mat2):

for(i=0; i<4; i++){
    maior=mat[i][0];
    for(j=1; j<5; j++) {
        if(mat[i][j]>maior) {
            maior=mat[i][j];
        }
    }
    printf("\nO maior numero e %f.\n\n", maior);
    for(j=0; j<5; j++) {
        mat2[i][j] = mat[i][j]/maior;
    }
}

Pronto, todo o processo concluído para todas as linhas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Valeu mesmo, amigo!!!

 

Muito mais simples e enxuto que meu programa. Acho que por ser novo em programação ainda nao compreendo a capacidade de todos os comandos, mas a experiencia uma hora chega...rsrsrs

 

Vou tentar comecar a exercitar outras formas de resolver um problema, sem tentar aplicar a mesma formula para todos...:mellow:

 

Compreendi o que voce estava falando em relação ao for percorrer a matriz inteira para encontrar o maior numero na linha...

 

Valeu.......:thumbsup:

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 minutos atrás, Josesousa disse:

@isrnick Valeu mesmo, amigo!!!

 

Muito mais simples e enxuto que meu programa. Acho que por ser novo em programação ainda nao compreendo a capacidade de todos os comandos, mas a experiencia uma hora chega...rsrsrs

 

Vou tentar comecar a exercitar outras formas de resolver um problema, sem tentar aplicar a mesma formula para todos...:mellow:

 

Compreendi o que voce estava falando em relação ao for percorrer a matriz inteira para encontrar o maior numero na linha...

 

Valeu.......:thumbsup:

Muito bem. :thumbsup:

 

Isso é exatamente o que é necessário, exercitar bastante, ver modos diferentes de fazer as mesmas coisas, aí você começa a ter um arsenal de recursos, métodos e truques pra utilizar, e eventualmente vai saber meio que automaticamente o caminho mais prático pra chegar no resultado.

 

Meus códigos certamente não eram nada enxutos ou diretos quando comecei a programar. Não importa se seu código fica longo agora, com o tempo vai ganhando experiência. ;)

Editado por isrnick
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×