Ir ao conteúdo
  • Cadastre-se

Exercicio Telhado em C. Ques passos seguir.


Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
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

}

  • Curtir 1
Link para o comentário
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. 

 

  • Curtir 1
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

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!

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!