Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Josesousa

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

Recommended Posts

Postado (editado)

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
Postado (editado)

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
Postado (editado)
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






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

×