Ir para conteúdo
Fórum Script Brasil
  • 0

Lucas Bulhões

Pergunta

Olá pessoal, mais uma das questões difíceis para iniciante, estou tendo dificuldades para encontrar os erros no algoritmo que desenvolvi, conto com a colaboração de todos, e serei grato a toda dica construtiva de vocês que são mais experientes.

#include <stdio.h>
#include <stdlib.h>

int main(){

int logico,i,j,n,inicol,fimcol,inilin,fimlin,degrau;
int matriz[20][20];


do{
printf("Escreva a dimensao da matriz:");
scanf("%d",&n);
if((n<1)||(n>20)){
	printf("A dimensao da matriz precisa estar entre 1 e 20\n");
}
}while((n<1) || (n>20));
printf("A matriz informada e do tipo %dX%d\n",n,n);
printf("Digite os numeros da matriz abaixo:\n");
for(i=1;i<=n;i++){
	for(j=1;j<=n;j++){
		printf("Entre com o valor de matriz[");
		printf("%d,",i);
		printf("%d]:",j);
		scanf("%d",&matriz[i][j]);
	}
}
for(i=1;i<=n;i++){
	printf("\n");
	for(j=1;j<=n;j++){
		printf("%2d",matriz[i][j]);
		printf("  ");
	}
	printf("\n");
}
inicol=1;
fimcol=n;
inilin=1;
fimlin=n;
degrau=0;
logico=1;
while((logico=1)&&(inicol<fimcol) && (inilin<fimlin)){
	for(i=inicol;i=fimcol;i++){
		if(matriz[inilin][i]=(degrau+1)){
			degrau=(degrau+1);
		}
		else{
			logico=0;
		}
	}
	fimcol=(fimcol-1);
	for(i=fimcol;i=inicol;i--){
		if(matriz[fimlin][i]=(degrau+1)){
			degrau=(degrau+1);
		}
		else{
			logico=0;
		}		
	}
	fimlin=(fimlin-1);
	for(i=fimlin;i=inilin;i--){
		if(matriz[i][inicol]=(degrau+1)){
			degrau=(degrau+1);
		}
		else{
			logico=0;
		}
		inicol=(inicol+1);
}
if(logico=1){
	printf("A matriz e inca");
}
else{
	printf("A matriz não e inca");
}	
return 0;
}

Até essa parte abaixo o algoritmo está executando ok.

#include <stdio.h>
#include <stdlib.h>

int main(){

int logico,i,j,n,inicol,fimcol,inilin,fimlin,degrau;
int matriz[20][20];


do{
printf("Escreva a dimensao da matriz:");
scanf("%d",&n);
if((n<1)||(n>20)){
	printf("A dimensao da matriz precisa estar entre 1 e 20\n");
}
}while((n<1) || (n>20));
printf("A matriz informada e do tipo %dX%d\n",n,n);
printf("Digite os numeros da matriz abaixo:\n");
for(i=1;i<=n;i++){
	for(j=1;j<=n;j++){
		printf("Entre com o valor de matriz[");
		printf("%d,",i);
		printf("%d]:",j);
		scanf("%d",&matriz[i][j]);
	}
}
for(i=1;i<=n;i++){
	printf("\n");
	for(j=1;j<=n;j++){
		printf("%2d",matriz[i][j]);
		printf("  ");
	}
	printf("\n");
}

 

Editado por Lucas Bulhões
Ajustes necessários
Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

primeiro de tudo você precisa saber que sempre tem que postar o código usando o botão<> tal como na imagem e escolhendo a sua linguagem:
J5JDfhxET9SqVXU1msaYgg.jpeg

você deve expor qual linguagem e qual é o tipo de tarefa a realizar pois somos pessoas que temos nossa vida fora de aqui, não podemos perder tempo em coisas banais como tentar adivinhar o que é que seu programa faz, ou o que você espera que ele faça, se você nos ajudar nós lhe ajudaremos. Tendeu? Qualquer detalhe que sirva você deve por, como linguagem, padrão usado, sistema operativo etc etc etc. Caso contrario pode que seu tema não encontre ajuda ou encontre bem menos do esperado, somente são conselhos para aumentar e agilizar a obtenção de ajuda. Sorte!
O fato de usar o botão<> é que os foruns, e digo com s, porque todos os fóruns costumam "comer" letras já que por exemplo sp_c4PksToCSMh_4W3--hA.jpeg faz com que o texto saia em itálico desta forma asda e coma a parte j2BKBXNbQa6QeTOqB29CGg.jpegque possivelmente tenha seu código como índice de alguns laços. Esse é só um exemplo.

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

  • 0
3 minutos atrás, vangodp disse:

primeiro de tudo você precisa saber que sempre tem que postar o código usando o botão<> tal como na imagem e escolhendo a sua linguagem:
J5JDfhxET9SqVXU1msaYgg.jpeg

você deve expor qual linguagem e qual é o tipo de tarefa a realizar pois somos pessoas que temos nossa vida fora de aqui, não podemos perder tempo em coisas banais como tentar adivinhar o que é que seu programa faz, ou o que você espera que ele faça, se você nos ajudar nós lhe ajudaremos. Tendeu? Qualquer detalhe que sirva você deve por, como linguagem, padrão usado, sistema operativo etc etc etc. Caso contrario pode que seu tema não encontre ajuda ou encontre bem menos do esperado, somente são conselhos para aumentar e agilizar a obtenção de ajuda. Sorte!
O fato de usar o botão<> é que os foruns, e digo com s, porque todos os fóruns costumam "comer" letras já que por exemplo asda

Eu não sabia como usar essa ferramenta, daqui para frente não cometerei esse deslize, obrigado pelo toque.

Link para o comentário
Compartilhar em outros sites

  • 0

O fato de usar o botão<> é que os foruns, e digo com s, porque todos os fóruns costumam "comer" letras já que por exemplo sp_c4PksToCSMh_4W3--hA.jpeg faz com que o texto saia em itálico desta forma asda e coma a parte j2BKBXNbQa6QeTOqB29CGg.jpegque possivelmente tenha seu código como índice de alguns laços. Esse é só um exemplo.

Perceba que você declarou uma matriz:
gmg_zdMnTBaXhHSrn-xKew.jpeg
porem aqui a pagina comeu o índice i
0uJ6XogVRvKCx4QAtafgNA.jpeg

Dai quem vai lhe ajudar acaba por copiar o código com erros, isso se traduz em perda de tempo para nós que desejamos lhe ajudar. Muitas vezes não respondo a causa disso. É chato ficar explicando isso para cada novo usuário que entra a diário. Tende facilitar para o programador que lhe irá ajudar, comente as partes onde você acha que esteja problema, qualqur coisa que facilite para nós será melhor para você mesmo. Ok?! Arrume isso e lhe ajudo.

Perceba que você declarou uma matriz:
gmg_zdMnTBaXhHSrn-xKew.jpeg
porem aqui a pagina comeu o índice i
0uJ6XogVRvKCx4QAtafgNA.jpeg

Dai quem vai lhe ajudar acaba por copiar o código com erros. Isso se traduz em perda de tempo para nós que desejamos lhe ajudar. Muitas vezes não respondo a causa disso. É chato ficar explicando isso para cada novo usuário que entra a diário. Tende facilitar para o programador que lhe irá ajudar, comente as partes onde você acha que esteja problema, qualqur coisa que facilite para nós será melhor para você mesmo. Ok?! Arrume isso e lhe ajudo.

você arrumou usando o botão<> mas seu código tem erros como lhe expliquei:
o5cQMK1KSnmhPHgvz0WjAQ.jpeg

A matriz parece um vetor... não copie o código do fórum, faça do seu IDE.

você arrumou usando o botão<> mas seu código tem erros como lhe expliquei:
o5cQMK1KSnmhPHgvz0WjAQ.jpeg

A matriz parece um vetor... não copie o código do fórum, faça do seu IDE.

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

  • 0
29 minutos atrás, vangodp disse:

O fato de usar o botão<> é que os foruns, e digo com s, porque todos os fóruns costumam "comer" letras já que por exemplo sp_c4PksToCSMh_4W3--hA.jpeg faz com que o texto saia em itálico desta forma asda e coma a parte j2BKBXNbQa6QeTOqB29CGg.jpegque possivelmente tenha seu código como índice de alguns laços. Esse é só um exemplo.

Perceba que você declarou uma matriz:
gmg_zdMnTBaXhHSrn-xKew.jpeg
porem aqui a pagina comeu o índice i
0uJ6XogVRvKCx4QAtafgNA.jpeg

Dai quem vai lhe ajudar acaba por copiar o código com erros, isso se traduz em perda de tempo para nós que desejamos lhe ajudar. Muitas vezes não respondo a causa disso. É chato ficar explicando isso para cada novo usuário que entra a diário. Tende facilitar para o programador que lhe irá ajudar, comente as partes onde você acha que esteja problema, qualqur coisa que facilite para nós será melhor para você mesmo. Ok?! Arrume isso e lhe ajudo.

Perceba que você declarou uma matriz:
gmg_zdMnTBaXhHSrn-xKew.jpeg
porem aqui a pagina comeu o índice i
0uJ6XogVRvKCx4QAtafgNA.jpeg

Dai quem vai lhe ajudar acaba por copiar o código com erros. Isso se traduz em perda de tempo para nós que desejamos lhe ajudar. Muitas vezes não respondo a causa disso. É chato ficar explicando isso para cada novo usuário que entra a diário. Tende facilitar para o programador que lhe irá ajudar, comente as partes onde você acha que esteja problema, qualqur coisa que facilite para nós será melhor para você mesmo. Ok?! Arrume isso e lhe ajudo.

você arrumou usando o botão<> mas seu código tem erros como lhe expliquei:
o5cQMK1KSnmhPHgvz0WjAQ.jpeg

A matriz parece um vetor... não copie o código do fórum, faça do seu IDE.

você arrumou usando o botão<> mas seu código tem erros como lhe expliquei:
o5cQMK1KSnmhPHgvz0WjAQ.jpeg

A matriz parece um vetor... não copie o código do fórum, faça do seu IDE.

Realmente, agora acho que agora está ok.

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui deixo um exemplo... e logo abaixo explico:
 

#include<stdio.h>

int main(){    
    int m1[4][4] = {
        { 1,   2,  3, 4 },
        { 12, 13, 14, 5 },
        { 11, 16, 15, 6 },
        { 10,  9,  8, 7 }
    };
    int m2[5][5] = {
        { 1,   2,  3,  4, 5 },
        { 16, 17, 18, 19, 6 },
        { 15, 24, 25, 20, 7 },
        { 14, 23, 22, 21, 8 },
        { 13, 12, 11, 10, 9 }
    };
    int m3[6][6] = {
        { 1,   2,  3,  4,  5,  6 },
        { 20, 21, 22, 23, 24,  7 },
        { 19, 32, 33, 34, 25,  8 },
        { 18, 31, 36, 35, 26,  9 },
        { 17, 30, 29, 28, 27, 10 },
        { 16, 15, 14, 13, 12, 11 }
    };

    
    int i;                //indice
    int n = 6;           //usamos a matriz de 5 x 5 quando n é igual a 5  
    int inicio = 0;     //inicio
    int fim    = n-1;  //Marca o tamanho da matriz que vai de 0 até n-1
    int contador = 1; //contador que usaremos para conferir se o numero vai de 1 até n*n
    
    
    int (*m)[n] = m3; //m aponta para uma das matrizes acima(se quiser pode criar uma com dados personalizados por teclado e passar para m)
    
    //repete o laço até que contador alcance n*n, que seria 25 no caso de uma matriz de 5 por 5. cinco multiplicado por 5 é 25, esse seria o ultimo valor de uma matriz inca de 5 por 5
    while( contador <= (n*n)  ){
        
        //Ponto A: checamos a linha horizontal superior (de esquerda a direita)
        i=inicio;
        while(i <= fim){
            if( m[inicio][i]==contador ){
                printf("%d, ", m[inicio][i]);
                contador++;
            }else{
                printf("%d, ", m[inicio][i]);
                printf("Não é uma matriz inca. contador %d", contador);
                return 1;
            }
            i++; 
        }
        
        //ponto B: checamos a linha vertical direita ( de acima para baixo )
        i=inicio+1;
        while(i <= fim){
            if( m[i][fim]==contador ){
                printf("%d, ", m[i][fim]);
                contador++;
            }else{
                printf("%d, ", m[i][fim]);
                printf("Não é uma matriz inca. contador %d", contador);
                return 2;
            }
            i++; 
        }
        
        //Ponto C: checamos a linha horizontal inferior ( de direita para esquerda )
        i=fim-1;
        while(i >= inicio){
            if( m[fim][i]==contador ){
                printf("%d, ", m[fim][i]);    
                contador++;
            }else{
                printf("%d, ", m[fim][i]);
                printf("Não é uma matriz inca. contador %d", contador);
                return 3;
            }
            i--; 
        }
        
        //Ponto D: checamos a linha vertical esquerda ( de abaixo para cima )
        i=fim-1;
        while(i >= inicio+1){
            if( m[i][inicio]==contador ){
                printf("%d, ", m[i][fim]);
                contador++;
            }else{
                printf("Não é uma matriz inca. contador %d", contador);
                printf("%d, ", m[i][fim]);
                return 4;
            }
            i--; 
        }
        inicio ++;
        fim--;
        
    }

    return 0;
}

 

O programa tem 3 matrizes pré estabelecidas, m1, m2 e m3). Faço isso para não perder tempo entrando dados por teclado. Deixo em suas mão arrumar essa parte para pedir os dados por teclado.

O programa tem um ponteiro chamado m que nada mais é que um ponteiro a uma matriz, assim podemos passar qualquer matriz para esse ponteiro e o programa trabalhará corretamente. Por exemplo... se queremos passar a matriz m1 para averiguar se é uma matriz inca(caracol), é só mudar a linha int (*m)[n] = m1. Se por outro lado você quer passar uma matriz própria tipo matriz[10][10]... é só pegar a linha int (*m)[n] = m3 e mudar para isso int (*m)[n] = matriz, m vai apontar para sua matriz e trabalhar como se fosse a mesma, isso faz o programa mais flexível já que permite você passar qualquer matriz para ele.
Outro ponto a destacar é que dependendo do tamanho da matriz, por exemplo se a matriz é de 5*5, a variavel n deve ser 5(n=5). Então resumindo... se eu quero passar int matriz[19][19] para o ponteiro m devo atribuir 19 a n:
int matriz[19][19];
int n = 19;
int (*m)[n] = matriz;
OK?!
O resto do programa vai trabalhar corretamente independentemente do tamanho da matriz se esses dados forem preenchidos corretamente.

O programa tem 3 matrizes pré estabelecidas, m1, m2 e m3). Faço isso para não perder tempo entrando dados por teclado. Deixo em suas mão arrumar essa parte para pedir os dados por teclado.

O programa tem um ponteiro chamado m que nada mais é que um ponteiro a uma matriz, assim podemos passar qualquer matriz para esse ponteiro e o programa trabalhará corretamente. Por exemplo... se queremos passar a matriz m1 para averiguar se é uma matriz inca(caracol), é só mudar a linha int (*m)[n] = m1. Se por outro lado você quer passar uma matriz própria tipo matriz[10][10]... é só pegar a linha int (*m)[n] = m3 e mudar para isso int (*m)[n] = matriz, m vai apontar para sua matriz e trabalhar como se fosse a mesma, isso faz o programa mais flexível já que permite você passar qualquer matriz para ele.
Outro ponto a destacar é que dependendo do tamanho da matriz, por exemplo se a matriz é de 5*5, a variavel n deve ser 5(n=5). Então resumindo... se eu quero passar int matriz[19][19] para o ponteiro m devo atribuir 19 a n:
int matriz[19][19];
int n = 19;
int (*m)[n] = matriz;
OK?!
O resto do programa vai trabalhar corretamente independentemente do tamanho da matriz se esses dados forem preenchidos corretamente.

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

  • 0

Agora passamos a explicar como trabalha o programa.
Imaginamos que temos essa matriz de 5 por 5:
598662c1b0140_matrizinca.jpg.f79f06c0e344c5a33163675a1f21dace.jpg

Devemos começar pela primeira posição da matriz e girar no sentido horário. Isso se traduz em 4 laços WHILE e não for por uma razão... Quando queremos usar um laço para algo que não sabemos o tamanho que vai ter devemos usar um laço while, e realmente esse é um caso desses, por que podemos receber matrizes de diferentes tamanhos, porem o mais importante é que se o programa detectar que a matriz não te a ordem correta tipo 1,2,3,4.....  ...n*n,  o programa deverá ser detido imediatamente, pois não há sentido continuar averiguando nada ya que a matriz claramente não é uma matriz "inca", esse é o motivo maior para adotar while em vez de for. Capiche? >_< Laços for são para percorrer uma matriz de inicio a fim e nunca deverá ser detido, assim quando você ver um for você sabe que ele vai percorrer todos os dados, e quando ver um while você sabe que o programa pode deter antes de terminar o array. Então agora que sabemos que devemos usar while e não for vamos continuar.

O programa deve percorrer os laterais do programa como mostra a imagem acima. uma matriz maior de 4 elementos será considerado mais de uma matriz será algo como:
Se temos a matriz:

  1   2   3   4  5   
 16  17  18  19  6   
 15  24  25  20  7   
 14  23  22  21  8   
 13  12  11  10  9

...no fundo será analisado desta forma:
 

 //primeiro passo 
  1   2   3   4  5   
 16              6   
 15              7   
 14              8   
 13  12  11  10  9  
 //segundo passo  
 17  18  19
 24      20
 23  22  21
 //terceiro passo 
 25

... em três passos. É dizer... o algoritmo fará o mesmo e cada um dos passos anteriores. Normalmente usaremos um while que repita a outros 4 whiles que comprovarão cada um dos lado da matriz.

Então o programa vai pegar primeiro e vai entrar no while externo:

 //primeiro  
  1   2   3   4  5   
 16              6   
 15              7   
 14              8   
 13  12  11  10  9 

Vai analisar cada um dos lados
while interno 1(1,2,3,4,5),
while interno 2(6,7,8,9),
while interno 3(10,11,12,13) e
while interno 4(14,15,16)

Logo o programa repete a operação com o while externo, mas agora com:
 

 //segundo 
 17  18  19
 24      20
 23  22  21

while interno 1(17, 18, 19),
while interno 2(20, 21),
while interno 3(23, 23) e
while interno 4(24)

Tendeu?
No caso de uma matriz de 5 por 5 o ultimo valor seria 25. Quando no while externo o contador chegar a 25 o programa vai parar.
Na teoria basta você ter um contador que comece em 1 e ir comparando ele com cada posição da matriz, essa é a lógica.

Se o numero do contador diferir ao da matriz o programa deve parar imediatamente pois não se trata de uma matriz inca.

Se o numero do contador diferir ao da matriz o programa deve parar imediatamente pois não se trata de uma matriz inca.

Link para o comentário
Compartilhar em outros sites

  • 0

Cara você não sabe o quanto estou agradecido, sei o tempo que deve ter gasto para você entender o meu problema e organizar tudo isso para que eu pudesse entender.

Emfim fiz algumas alterações no algoritmo final, juntamente com alguns testes e parece que está tudo certo, vou postar o resultado do algoritmo aqui para que outras pessoas que se deparem com a mesma questão futuramente possa ter uma resolução.

#include<stdio.h>

int main(){
int minerva;
int ok;
int i;   
int DIM;
printf("Digite o tamanho da matriz que deseja criar: "); scanf("%d",&DIM);
int matriz[DIM][DIM];
int linha, coluna;
for(linha = 0 ; linha < DIM ; linha++){
for(coluna = 0 ; coluna < DIM ; coluna++)
{
printf("Elemento [%d][%d]: ", linha+1, coluna+1);
scanf("%d", &matriz[linha][coluna]);
}
}
for(linha = 0 ; linha < DIM ; linha++){
for(coluna = 0 ; coluna < DIM ; coluna++){
printf("%4d", matriz[linha][coluna]);

printf("\n");
}
}
    int n = DIM;
    int inicio = 0;     //inicio
    int fim    = n-1;  //Marca o tamanho da matriz que vai de 0 até n-1
    int contador = 1; //contador que usaremos para conferir se o numero vai de 1 até n*n
    
    
    int (*m)[n] = matriz; //m aponta para uma das matrizes acima(se quiser pode criar uma com dados personalizados por teclado e passar para m)
    
    //repete o laço até que contador alcance n*n, que seria 25 no caso de uma matriz de 5 por 5. cinco multiplicado por 5 é 25, esse seria o ultimo valor de uma matriz inca de 5 por 5
    while( contador <= (n*n)  ){
        
        //Ponto A: checamos a linha horizontal superior (de esquerda a direita)
        i=inicio;
        while(i <= fim){
            if( m[inicio][i]==contador ){
                ok=1;
                contador++;
            }
	    else{printf("A matriz não e inca.");
		return 1;		
		}
            i++; 
        }
        
        //ponto B: checamos a linha vertical direita ( de acima para baixo )
        i=inicio+1;
        while(i <= fim){
            if( m[i][fim]==contador ){
                ok=1;
                contador++;
            
            }
	    else{printf("A matriz não e inca.");
		return 2;		
		}
            i++; 
        }
        
        //Ponto C: checamos a linha horizontal inferior ( de direita para esquerda )
        i=fim-1;
        while(i >= inicio){
            if( m[fim][i]==contador ){
                ok=1;    
                contador++;
            
            }
	    else{printf("A matriz não e inca.");
		return 3;
		}
            i--; 
        }
        
        //Ponto D: checamos a linha vertical esquerda ( de abaixo para cima )
        i=fim-1;
        while(i >= inicio+1){
            if( m[i][inicio]==contador ){
                ok=1;
                contador++;
            
            }
	    else{printf("A matriz não e inca.");
		return 4;	
		}
            i--; 
        }
        inicio ++;
        fim--;
        
    }
	if(ok=1){
		printf("A matriz e inca.");
		minerva=2;
	}
	if(minerva!=2){
		printf("A matriz não e inca");
	}
return 0;
}

Muito obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

O importante é você entender o algoritmo. Normalmente você precisa usar papel e lápis para buscar uma solução, não tenha vergonha disso.

Esse pdf é interessante hsuehshe. Qual é o nome dele?

Esse pdf é interessante hsuehshe. Qual é o nome dele?

Link para o comentário
Compartilhar em outros sites

  • 0
12 horas atrás, vangodp disse:

O importante é você entender o algoritmo. Normalmente você precisa usar papel e lápis para buscar uma solução, não tenha vergonha disso.

Esse pdf é interessante hsuehshe. Qual é o nome dele?

Esse pdf é interessante hsuehshe. Qual é o nome dele?

Calculus Tom Apostol

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...