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:  
Pedro Henrique Faria Teixe

Exercicio Telhado em C. Ques passos seguir.

Recommended Posts

Escreva em linguagem C uma função denominada telhado que receba como parâmetros uma matriz Anxn e um valor inteiro e ímpar (n) que define a dimensão da matriz nxn. A função telhado deve preencher a matriz recebida Anxn como ilustrado nos exemplos abaixo. Elabore a função main() para testar a função telhado. O programa deve ler do dispositivo padrão de entrada (teclado) a dimensão n da matriz A e mostrar o resultado na tela de saída.

0 1 2 1 0

1 0 1 0 1

2 1 0 1 2

1 0 1 0 1

0 1 2 1 0

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está com dificuldades em fazer que parte? Para simplificar, vamos dividir em entrada de dados, processamento de dados e saída de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 3 minutos atrás, Rafael Marinho disse:

    Você está com dificuldades em fazer que parte? Para simplificar, vamos dividir em entrada de dados, processamento de dados e saída de dados.

    tenho dificuldade de como fazer com que os numeros da matriz decresca e cresca nos momentos certos, como tenho que zerar as diagonais principais, em cada lado da matriz tenho q fazer o numero crescer e decrescer, por exemplo, 1 2 3 4 3 2 1. Isso na parte superior, inferior, direita e esquerda.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Certo, a um tempo atrás fiz uma questão que necessita uma manipulação elaborada das matrizes.

     

    Você tem 2 opções:

     

    Arranjar um jeito de dentro de um loop aninhado em outro (loop dentro de outro), colocar os números no lugar, normalmente usando uma equação ou outros parâmetros para auxiliar. Por experiência própria, esse dá bastante trabalho, e só recomendo para quem já tem bastante experiência em programação e lógica de programação. Você pode tentar como desafio, mas não recomendo resolver assim (principalmente que o problema que eu resolvi, tinha um padrão mais simples, logo era menos difícil de resolver por esse método)

     

    A segunda opção é percorrer a matriz sem seguir a ordem das linhas e colunas, ou seja, escolha que linha você vai operar, em vez do loop fazer isso para você. Assim, dá para começa dá 1 linha e pular para outras que seguem o mesmo padrão de uma vez só. Não sei se ficou claro.

     

    Já para fazer os números aumentarem e depois diminuírem, basta usar um loop for,

    for(I=0;I<n/2;I++){

    //Colocar na matriz o valor I+1

    }

    Editado por Rafael Marinho
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    A saída é a coisa mais estranha, vejo a repetição alterna de certos valores observe abaixo enxergo:

    0 1 2 1 0

    1 0 1 0 1

    2 1 0 1 2

    1 0 1 0 1

    0 1 2 1 0

    Os números coloridos são alternos em 0 e 2.

     

    Plano Vertical:

    0 1 2 1 0

    1 0 1 0 1

    2 1 0 1 2

    1 0 1 0 1

    0 1 2 1 0

     

    Plano Horizontal

    0 1 2 1 0

    1 0 1 0 1

    2 1 0 1 2

    1 0 1 0 1

    0 1 2 1 0

     

    * Onde havia 0, tornasse 2 e onde havia 2 tornasse 0.

    * Acontece apenas nas linhas e colunas  ̶p̶a̶r̶e̶s̶  impares

    Desculpa queria ajudar mais não entendo os porquês destes números.

    adicionado 1 minuto depois

    PS.: Mesmo acontece nas colunas e linhas pares em relação ao 0 e 1

    sendo tão simplesmente isto pode resolver com 2 loops

    1 loop- preenche de 0 e 1 alternado;

    2 loop- opera somente as linhas ímpares e salta 1 elemento apos o primeiro

                começa a inserir 0 e 2 alternados e salta 1 elemento apos casa inserção. 

     

    Editado por Mauro Britivaldo
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Se entendi direito o padrão segue o desenho de um telhado, onde as 2 diagonais principais recebem 0, e as posições imediatamente próximas as diagonais recebem 1, e as posições próximas as estas recebem 2, e assim por diante aumentando o número conforme se afasta das diagonais principais:

     

    0 1 2 3 2 1 0

    0 1 2 1 1

    1 0 1 0 2

    3 2 1 0 1 2 3

    1 0 1 0 1 2

    0 1 2 1 1

    0 1 2 3 2 1 0

     

    O valor armazenado na casa da matriz é igual a distância desta casa até a casa que pertence a diagonal principal mais próxima. Não importa se na vertical ou na horizontal isso é válido, então vamos considerar apenas a direção horizontal.

     

    Do exemplo acima podemos observar que na primeira linha as casas que pertencem a diagonal principal estão na coluna 0 e na coluna N-1, vamos então chamar coldiag1 = 0 e coldiag2 = N-1 na primeira linha, mas na linha seguinte coldiag1 = 1 e coldiag2 = N-2, e esse padrão segue a cada linha... Daí podemos tirar que a cada linha a posição da coluna que pertence a primeira diagonal principal (coldiag1) é incrementada de 1, e o oposto acontece na segunda diagonal, coldiag2 é subtraído de 1 a cada linha.

     

    Ok, agora sabemos as posições das colunas na respectiva linha que pertencem as diagonais principais, então para obter o valor a ser armazenado na casa basta calcular as distâncias da coluna atual até estas colunas, e armazenar o menor dos 2 valores. Ou seja, o mínimo entre |coluna - coldiag1| e |coluna - coldiag2| (onde | | indica o módulo ou valor absoluto).

     

    Agora tente implementar a lógica/código...

    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 1 hora atrás, isrnick disse:

    Se entendi direito o padrão segue o desenho de um telhado, onde as 2 diagonais principais recebem 0, e as posições imediatamente próximas as diagonais recebem 1, e as posições próximas as estas recebem 2, e assim por diante aumentando o número conforme se afasta das diagonais principais:

     

    0 1 2 3 2 1 0

    0 1 2 1 1

    1 0 1 0 2

    3 2 1 0 1 2 3

    1 0 1 0 1 2

    0 1 2 1 1

    0 1 2 3 2 1 0

     

    O valor armazenado na casa da matriz é igual a distância desta casa até a casa que pertence a diagonal principal mais próxima. Não importa se na vertical ou na horizontal isso é válido, então vamos considerar apenas a direção horizontal.

     

    Do exemplo acima podemos observar que na primeira linha as casas que pertencem a diagonal principal estão na coluna 0 e na coluna N-1, vamos então chamar coldiag1 = 0 e coldiag2 = N-1 na primeira linha, mas na linha seguinte coldiag1 = 1 e coldiag2 = N-2, e esse padrão segue a cada linha... Daí podemos tirar que a cada linha a posição da coluna que pertence a primeira diagonal principal (coldiag1) é incrementada de 1, e o oposto acontece na segunda diagonal, coldiag2 é subtraído de 1 a cada linha.

     

    Ok, agora sabemos as posições das colunas na respectiva linha que pertencem as diagonais principais, então para obter o valor a ser armazenado na casa basta calcular as distâncias da coluna atual até estas colunas, e armazenar o menor dos 2 valores. Ou seja, o mínimo entre |coluna - coldiag1| e |coluna - coldiag2| (onde | | indica o módulo ou valor absoluto).

     

    Agora tente implementar a lógica/código...

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(){
    int n,i,j;
                scanf("%d",&n);
        int m[n][n];
        int meio = n%2 == 0? n/2:((n-1)/2);
        int v,x;
    
                    for(i=0;i<n;i++){
                        for(j=0,x=1,v=0;j<n;j++){
                            if(i == j || j == (n-1)-i)
                                m[i][j] = 0;
                            if(j>i && j<(n-1)-i){
                                m[i][j] = x;//parte superior da matriz.
                                m[j][i] = x;//parte lateral esquerda da matriz.
                                m[(n-1)-i][(n-1)-j] = x;//parte de baixo da matriz.
                                m[(n-1)-j][(n-1)-i] = x;//parte lateral direita da matriz.
                                if(!v)
                                    x++;
                                if(v)
                                    x--;
                                if(x == (meio-i))
                                    v=1;
    
                            }
    
                        }
                    }
    
                    for(i=0;i<n;i++){
                        for(j=0;j<n;j++){
                            printf("%d",m[i][j]);
                            //if(meio<10 || m[i][j]>9)
                                printf(" ");
                               // else
                                    printf(" ");
                        }
                        printf("\n");
                    }
    return 0;
    }

    Com a ajuda de um amigo, e de vocês consegui chegar a solução, olhem o código e testem em seus computadores para ver como ficou, obrigado pessoal!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Essa seria minha solução para a função:

    void telhado(int n, int matriz[n][n]){
        int linha, coluna, coldiag1 = 0, coldiag2 = n-1;
        for (linha=0; linha < n; linha++){
            for(coluna=0; coluna < n; coluna++) {
                if (abs(coluna - coldiag1) <= abs(coluna - coldiag2))
                    matriz[linha][coluna] = abs(coluna - coldiag1);
                else
                    matriz[linha][coluna] = abs(coluna - coldiag2);
            }
            coldiag1++;
            coldiag2--;
        }
    }
    • Curtir 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

    ×