Exercicio Telhado em C. Ques passos seguir. - C/C#/C++ - Clube do Hardware
Exercicio Telhado em C. Ques passos seguir.
Por Pedro Henrique Faria Teixe, 7 de janeiro de 2017 em C/C#/C++
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.
@Pedro Henrique Faria TeixeDá uma olhada nesse post talvez ajude:
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.
Certo, a um tempo atrás fiz uma questão que necessita uma manipulação elaborada das matrizes.
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,
//Colocar na matriz o valor I+1
Editado 7 de janeiro de 2017 por Rafael Marinho
AnsiC 515
A saída é a coisa mais estranha, vejo a repetição alterna de certos valores observe abaixo enxergo:
Os números coloridos são alternos em 0 e 2.
* 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.
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.
isrnick 681
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:
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...
int meio = n%2 == 0? n/2:((n-1)/2);
int v,x;
for(j=0,x=1,v=0;j<n;j++){
if(i == j || j == (n-1)-i)
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(x == (meio-i))
//if(meio<10 || m[i][j]>9)
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!