Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wagoiawrigujnweiugvneivugB

Exercício Matriz

Recommended Posts

Olá povo, estou quebrando a cabeça em um exercício de Matrizes em C aqui.

Queria saber se alguem podia me ajudar.

"Escreva um programa em C que gere uma matriz nxn de forma que, quanto mais externo um
elemento esta na matriz, menor ele é, quanto mais interno ele está, maior ele é. Siga o exemplo para n = 6, que gera uma matriz 6 6 com os seguintes elementos:"

UOVk6iN.png

Estive discutindo com o professor e cheguei a conclusão que é mais ou menos assim:

 

  • linhas 0 e n: preencher as posições 0 a n com 1;
  • linhas 1 e n-1: preencher as posições 1 a n-1 com 2;
  • linhas 2 e n-2: preencher as posições 2 a n-2 com 3;
  • ...

Porém não to conseguindo transforma isso em código, o que tenho montado aqui é só um esquema de dois "for" para percorrer todas as posições da matriz, o que é básico para mecher com matrizes, mas empaquei aqui.

 

Alguem pode me dar alguma dica de como prosseguir?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar explicar da melhor maneira possível, vamos lá!

 

Observe a imagem do exemplo, se você dividir ela em 4 partes iguais você vai ver que a parte da direita é um "reflexo" da parte da esquerda e que a parte de baixo é um "reflexo" da parte de cima.

 

Feita a observação, podemos concluir que o primeiro passo é criar somente 1/4 da matriz, já que os outros 3/4 são apenas reflexos. Como você já aprendeu a percorrer matrizes usando "for" então esse passo poder ser bem simples, basta você reduzir a área da matriz pela metade, no caso da do exemplo ela ficaria com 3 x 3.

 

Agora vem a pergunta, como saber qual número colocar em qual lugar? Simples, o número em cada posição da matriz deve ser o menor valor entre o número da linha e o número da coluna, passando para código ficaria:

 

 

int linha, coluna, centro, tamanho, matriz[6][6];

tamanho = 6; // mesmo tamanho do exemplo
centro = tamanho / 2; // só precisamos de 1/4 da matriz

for(linha = 0; linha < centro; ++linha) {
	for(coluna = 0; coluna < centro; ++coluna) {
		if(linha < coluna) {
			matriz[linha][coluna] = linha+1;
		}
		else if(coluna < linha) {
			matriz[linha][coluna] = coluna+1;
		}
		else {
			matriz[linha][coluna] = coluna+1; // tanto faz :P
		}
	}
}

 

O código acima deixará nossa matriz da seguinte maneira:

1 1 1 0 0 0
1 2 2 0 0 0
1 2 3 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
O segundo passo é espelhar o espaço preenchido que criamos na nossa matriz para preenchê-la completamente. Para espelhar um número podemos usar como base a seguinte fórmula:

reflexo = numero - ((diferenca * 2) - 1)
Agora você deve percorrer a matriz inteira ao invés de somente a metade, então os loops ficam:

for(linha = 0; linha < tamanho; ++linha) {
	for(coluna = 0; coluna < tamanho; ++coluna) {
E sempre que a coluna ou a linha forem maiores que o "centro" nós devemos espelhar o valor antes de usar:

 

 

for(linha = 0; linha < tamanho; ++linha) {
	for(coluna = 0; coluna < tamanho; ++coluna) {
		int l = linha+1, c = coluna+1;

		if(l > centro) {
			int diferenca = l - centro;
			l = l - ((diferenca * 2) - 1);
		}

		if(c > centro) {
			int diferenca = c - centro;
			c = c - ((diferenca * 2) - 1);
		}

		if(l < c) {
			matriz[linha][coluna] = l;
		}
		else if(c < l) {
			matriz[linha][coluna] = c;
		}
		else {
			matriz[linha][coluna] = l = c;
		}
	}
}

 

O código acima deverá deixar a matriz no resultado final:

1 1 1 1 1 1
1 2 2 2 2 1
1 2 3 3 2 1
1 2 3 3 2 1
1 2 2 2 2 1
1 1 1 1 1 1
Obs.: O último código deve substituir o primeiro, o primeiro foi só uma maneira de deixar a explicação mais prática.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.