Ir ao conteúdo
  • Cadastre-se

Matriz em C


faervict

Posts recomendados

Bom dia! Estou com pequeno problema com meu código.

Estou criando um programa que seleciona um Grafo ou um Dígrafo e através do ponto de origem e do ponto de destino ele monta uma matriz colocando '1' onde corresponder o valor.

Porém não sei se minha lógica esta errada ou o que está acontecendo, já tentei de inúmeras formas, porém sem sucesso.

 

O funcionamento do programa é o seguinte, você seleciona se é um grafo ou um dígrafo, quando selecionado, o programa pede o numero de vertices e o numero de arestas do Grafo, assim que passado os valores, o programa em seguida pede o ponto de origem e o ponto de destino. Usei o if e else para identificar se o ponto de origem e o ponto de destino que esta no comando de repetição corresponde a sentença do if e se pertencer ele adiciona '1' se não ele adiciona '0'.

Porém não estou obtendo êxito, ou a matriz zera tudo, ou fica '1' espalhados.

 

Segue meu código.

 

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

main(){
	
	int result, vertice, arest;
	int i ,j, pOri, pDest, pi, matriz[i][j];
	
	printf("Matriz de grafos ou digrafos!");
	printf("\n\n Escolha: (1) Grafos (2) Digrafos :"); 
	scanf("%d", &result);
	
	
		if(result = 1){ //GRAFO
		
		printf("\nGRAFO NAO DIRECIONADO\n");
			printf("\nInsira o numero de VERTICES: "); // Numero de Vertices do Grafo, determina quantas linhas e colunas da matriz
			scanf("%d", &vertice);
			printf("\nInsira o numero de ARESTAS por VERTICES: "); // Numero de arestas (linhas de conexão com vertices)
			scanf("%d", &arest);
			
			
			for( pi=0 ; pi < arest; ++pi){ // Repete ponto de Origem e Destino de acordo com o numero de Arestas
				printf("\nPonto de Origem [%d]: ", pi+1);
				scanf("%d", &pOri);
				printf("\nPonto de Destino [%d]: ", pi+1);
				scanf("%d", &pDest);
						
				for(i = 0; i < vertice; i++) //Percorre a Matriz
					for(j = 0; j < vertice; j++){
						if(matriz[i][vertice] == matriz[pOri][vertice]){ // Verifica ponto de origem da matriz (Linha)
							if(matriz[i][j] == matriz[i][pDest]){ // Verifica ponto de destino da matriz (coluna)
								matriz[i][j] = 1;  //Adiciona 1 se for encontrado
							}
							else{
								matriz[i][j] = 0; //Adiciona 0 se não for encontrado
							}
						}
						else{
							matriz[i][j] = 0; //Adiciona 0 se não for encontrado
						}															
				}
			}
	}
		
			for(i = 0; i<vertice; ++i){ //Le a matriz 
				for(j = 0; j<vertice; ++j){
					printf("%3d", matriz[i][j]);
				}
				printf("\n");
		}
			

	
	getch();
	return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Não entendi o que você está tentando fazer no programa. Vai representar o grafo como uma matriz de adjacência? Está construindo um grafo ou checando/analisando o grafo?

 

Talvez fique mais claro se você der algum exemplo postando uma matriz de um grafo e o que o programa deve fazer.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...
Em 14/03/2017 às 01:53, faervict disse:

Bom dia! Estou com pequeno problema com meu código.

Estou criando um programa que seleciona um Grafo ou um Dígrafo e através do ponto de origem e do ponto de destino ele monta uma matriz colocando '1' onde corresponder o valor.

Porém não sei se minha lógica esta errada ou o que está acontecendo, já tentei de inúmeras formas, porém sem sucesso.

 

O funcionamento do programa é o seguinte, você seleciona se é um grafo ou um dígrafo, quando selecionado, o programa pede o numero de vertices e o numero de arestas do Grafo, assim que passado os valores, o programa em seguida pede o ponto de origem e o ponto de destino. Usei o if e else para identificar se o ponto de origem e o ponto de destino que esta no comando de repetição corresponde a sentença do if e se pertencer ele adiciona '1' se não ele adiciona '0'.

Porém não estou obtendo êxito, ou a matriz zera tudo, ou fica '1' espalhados.

 

Segue meu código.

 


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

main(){
	
	int result, vertice, arest;
	int i ,j, pOri, pDest, pi, matriz[i][j];
	
	printf("Matriz de grafos ou digrafos!");
	printf("\n\n Escolha: (1) Grafos (2) Digrafos :"); 
	scanf("%d", &result);
	
	
		if(result = 1){ //GRAFO
		
		printf("\nGRAFO NAO DIRECIONADO\n");
			printf("\nInsira o numero de VERTICES: "); // Numero de Vertices do Grafo, determina quantas linhas e colunas da matriz
			scanf("%d", &vertice);
			printf("\nInsira o numero de ARESTAS por VERTICES: "); // Numero de arestas (linhas de conexão com vertices)
			scanf("%d", &arest);
			
			
			for( pi=0 ; pi < arest; ++pi){ // Repete ponto de Origem e Destino de acordo com o numero de Arestas
				printf("\nPonto de Origem [%d]: ", pi+1);
				scanf("%d", &pOri);
				printf("\nPonto de Destino [%d]: ", pi+1);
				scanf("%d", &pDest);
						
				for(i = 0; i < vertice; i++) //Percorre a Matriz
					for(j = 0; j < vertice; j++){
						if(matriz[i][vertice] == matriz[pOri][vertice]){ // Verifica ponto de origem da matriz (Linha)
							if(matriz[i][j] == matriz[i][pDest]){ // Verifica ponto de destino da matriz (coluna)
								matriz[i][j] = 1;  //Adiciona 1 se for encontrado
							}
							else{
								matriz[i][j] = 0; //Adiciona 0 se não for encontrado
							}
						}
						else{
							matriz[i][j] = 0; //Adiciona 0 se não for encontrado
						}															
				}
			}
	}
		
			for(i = 0; i<vertice; ++i){ //Le a matriz 
				for(j = 0; j<vertice; ++j){
					printf("%3d", matriz[i][j]);
				}
				printf("\n");
		}
			

	
	getch();
	return 0;
}

Brother, entendi sua logica e sei o que você precisa, segue um codigo funcinando :

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

main(){
    inicio_programa:
    int result = 0;
    
    // Menu de escolha 
    printf("Matriz Adjacente de Grafos ou Digrafos!");
    printf("\n\n Escolha: (1) Grafos (2) Digrafos :"); 
    scanf("%d", &result);
            
        system("cls");
        
        // Condição de GRAFO ou DIGRAFO
        if( result == 1)
        {
            printf("\nGRAFO SELECIONADO\n ");
        }
        
        else{
            if (result == 2)
            {
                printf("\nDIGRAFO SELECIONADO\n ");
            }
            // se nenhuma opção for valida, gera um erro e volta o programa
            else{
                printf("\n %d NAO EH UMA OPCAO VALIDA. DIGITE UMA OPCAO VALIDA PARA CONTINUAR\n", result);
                system("pause");
                system("cls");
                goto inicio_programa;            
            }
        }
        
        // definição da variavel Vertice
        int i, j, x, a1, v1, POrig,PDest;
        printf("\nQuantidade de Vertices: ");
        scanf("%d", &v1);
        v1 = v1 + 1;
        int m[v1][v1]; // inicia matriz
        
        // inicia todos os pontos da matriz como "0"
        for(i = 0; i<v1; i++)
            for(j = 0; j<v1; j++)
                m[j] = 0;
                
        // implementa titulo de linha e coluna na matriz
                
        for(i = 0; i<v1; i++)
        {    m[0] = i;    }
        
        for(j = 0; j<v1; j++)
        {    m[0][j] = j;    }
        
        // Colocar pontos na matriz
        
        printf("\nQuantidade de Arestas: ");
        scanf("%d", &a1);
        
        for(x = 0; x < a1; x++) 
        {    
            ponto_origem:
                
            printf("\nVertice de Origem %d: ", x+1);
            scanf("%d", &POrig);
            
            if(POrig >v1-1) // verifica se vertice existe na matriz
            {
                printf("\nPosicao de Vertice de Origem nao existente");
                printf("\n\nInsira novamente\n\n");
                goto ponto_origem;
            }
            
            ponto_destino:
            
            printf("\nVertice de Destino %d: ", x+1);
            scanf("%d", &PDest);
            
            if(PDest >v1-1) // verifica se vertice existe na matriz
            {
                printf("\nPosicao de Vertice de Destino nao existente");
                printf("\n\nInsira novamente\n\n");
                goto ponto_destino;
            }
            
            switch(result) // define entre GRAFO e DIGRAFO usando a varialvel "result" definida no começo do programa
                {
                    case 1:  //GRAFO
                        m[POrig][PDest] = 1; 
                        m[PDest][POrig] = 1;
                        break;
                    case 2: //DIGRAFO
                        m[POrig][PDest] = 1;
                        break;
                }
        
        // print da matriz 
        for(i = 0; i<v1; i++) 
        {
            printf("\n");
            for(j = 0; j<v1; j++)
                printf("%d ", m[j]);
        }
        
        printf("\n\n");
        
        
    }
    getch();
    return 0;
}
 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • 11 meses depois...
Em 21/03/2018 às 19:12, Murilo Ferreira Rufino disse:

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

main(){
    inicio_programa:
    int result = 0;
    
    // Menu de escolha 
    printf("Matriz Adjacente de Grafos ou Digrafos!");
    printf("\n\n Escolha: (1) Grafos (2) Digrafos :"); 
    scanf("%d", &result);
            
        system("cls");
        
        // Condição de GRAFO ou DIGRAFO
        if( result == 1)
        {
            printf("\nGRAFO SELECIONADO\n ");
        }
        
        else{
            if (result == 2)
            {
                printf("\nDIGRAFO SELECIONADO\n ");
            }
            // se nenhuma opção for valida, gera um erro e volta o programa
            else{
                printf("\n %d NAO EH UMA OPCAO VALIDA. DIGITE UMA OPCAO VALIDA PARA CONTINUAR\n", result);
                system("pause");
                system("cls");
                goto inicio_programa;            
            }
        }
        
        // definição da variavel Vertice
        int i, j, x, a1, v1, POrig,PDest;
        printf("\nQuantidade de Vertices: ");
        scanf("%d", &v1);
        v1 = v1 + 1;
        int m[v1][v1]; // inicia matriz
        
        // inicia todos os pontos da matriz como "0"
        for(i = 0; i<v1; i++)
            for(j = 0; j<v1; j++)
                m[j] = 0;
                
        // implementa titulo de linha e coluna na matriz
                
        for(i = 0; i<v1; i++)
        {    m[0] = i;    }
        
        for(j = 0; j<v1; j++)
        {    m[0][j] = j;    }
        
        // Colocar pontos na matriz
        
        printf("\nQuantidade de Arestas: ");
        scanf("%d", &a1);
        
        for(x = 0; x < a1; x++) 
        {    
            ponto_origem:
                
            printf("\nVertice de Origem %d: ", x+1);
            scanf("%d", &POrig);
            
            if(POrig >v1-1) // verifica se vertice existe na matriz
            {
                printf("\nPosicao de Vertice de Origem nao existente");
                printf("\n\nInsira novamente\n\n");
                goto ponto_origem;
            }
            
            ponto_destino:
            
            printf("\nVertice de Destino %d: ", x+1);
            scanf("%d", &PDest);
            
            if(PDest >v1-1) // verifica se vertice existe na matriz
            {
                printf("\nPosicao de Vertice de Destino nao existente");
                printf("\n\nInsira novamente\n\n");
                goto ponto_destino;
            }
            
            switch(result) // define entre GRAFO e DIGRAFO usando a varialvel "result" definida no começo do programa
                {
                    case 1:  //GRAFO
                        m[POrig][PDest] = 1; 
                        m[PDest][POrig] = 1;
                        break;
                    case 2: //DIGRAFO
                        m[POrig][PDest] = 1;
                        break;
                }
        
        // print da matriz 
        for(i = 0; i<v1; i++) 
        {
            printf("\n");
            for(j = 0; j<v1; j++)
                printf("%d ", m[j]);
        }
        
        printf("\n\n");
        
        
    }
    getch();
    return 0;
}
 

Estou com problemas, quando vou executar aparece os seguintes erros.


46    22    C:\Users\Caio\Documents\Trabalho\Sem Título1.cpp    [Error] incompatible types in assignment of 'int' to 'int [v1]'
51    19    C:\Users\Caio\Documents\Trabalho\Sem Título1.cpp    [Error] incompatible types in assignment of 'int' to 'int [v1]'

 

Está dando erro nesta parte do código.

 



 // inicia todos os pontos da matriz como "0"
        for(i = 0; i<v1; i++)
            for(j = 0; j<v1; j++)
                m[j] = 0;
                
        // implementa titulo de linha e coluna na matriz
                
        for(i = 0; i<v1; i++)
        {    m[0] = i;    }
        
        for(j = 0; j<v1; j++)
        {    m[0][j] = j;    }
        

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Justiceiro741     esses erros das linhas 46 e 51 é porque você usa uma matriz que tem que ter duas dimensões , e  nessas linhas você está usado apenas uma dimensção , então seu código com algumas modificações poderia ficar assim ,  e está rodando mas creio que o resultado não seja o que você espera ,  provável que precisa consertar mais alguma coisa .  :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(){
    int result;
    inicio_programa:
    result = 0;
    // Menu de escolha
    printf("Matriz Adjacente de Grafos ou Digrafos!");
    printf("\n\n Escolha: (1) Grafos (2) Digrafos :");
    scanf("%d", &result);
    system("cls");
    // Condição de GRAFO ou DIGRAFO
    if( result == 1){
        printf("\nGRAFO SELECIONADO\n ");
    }
    else{
        if (result == 2){
            printf("\nDIGRAFO SELECIONADO\n ");
        }
        // se nenhuma opção for valida, gera um erro e volta o programa
        else{
            printf("\n %d NAO EH UMA OPCAO VALIDA. DIGITE UMA OPCAO VALIDA PARA CONTINUAR\n", result);
            system("pause");
            system("cls");
            goto inicio_programa;
        }
    }
    // definição da variavel Vertice
    int i, j, x, a1, v1, POrig,PDest;
    printf("\nQuantidade de Vertices: ");
    scanf("%d", &v1);
    v1 = v1 + 1;
    int m[v1][v1]; // inicia matriz
    // inicia todos os pontos da matriz como "0"
    for(i = 0; i<v1; i++)
        for(j = 0; j<v1; j++)
            m[i][j] = 0;
    // implementa titulo de linha e coluna na matriz
    for(i = 0; i<v1; i++){
        m[i][0] = i;
    }
    for(j = 0; j<v1; j++){
        m[0][j] = j;
    }
    // Colocar pontos na matriz
    printf("\nQuantidade de Arestas: ");
    scanf("%d", &a1);
    for(x = 0; x < a1; x++){
        ponto_origem:
        printf("\nVertice de Origem %d: ", x+1);
        scanf("%d", &POrig);
        if(POrig >v1-1){ // verifica se vertice existe na matriz
            printf("\nPosicao de Vertice de Origem nao existente");
            printf("\n\nInsira novamente\n\n");
            goto ponto_origem;
        }
        ponto_destino:
        printf("\nVertice de Destino %d: ", x+1);
        scanf("%d", &PDest);
        if(PDest >v1-1){ // verifica se vertice existe na matriz
            printf("\nPosicao de Vertice de Destino nao existente");
            printf("\n\nInsira novamente\n\n");
            goto ponto_destino;
        }
        switch(result){ // define entre GRAFO e DIGRAFO usando a varialvel "result" definida no começo do programa
        case 1:  //GRAFO
            m[POrig][PDest] = 1;
            m[PDest][POrig] = 1;
            break;
        case 2: //DIGRAFO
            m[POrig][PDest] = 1;
            break;
        }
        // print da matriz
        for(i = 0; i<v1; i++){
            printf("\n");
            for(j = 0; j<v1; j++)
                printf("%d ", m[i][j]);
        }
        printf("\n\n");
    }
    printf("      Tecle !\n\n");
    getch();
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, devair1010 disse:

@Justiceiro741     esses erros das linhas 46 e 51 é porque você usa uma matriz que tem que ter duas dimensões , e  nessas linhas você está usado apenas uma dimensção , então seu código com algumas modificações poderia ficar assim ,  e está rodando mas creio que o resultado não seja o que você espera ,  provável que precisa consertar mais alguma coisa .  :


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(){
    int result;
    inicio_programa:
    result = 0;
    // Menu de escolha
    printf("Matriz Adjacente de Grafos ou Digrafos!");
    printf("\n\n Escolha: (1) Grafos (2) Digrafos :");
    scanf("%d", &result);
    system("cls");
    // Condição de GRAFO ou DIGRAFO
    if( result == 1){
        printf("\nGRAFO SELECIONADO\n ");
    }
    else{
        if (result == 2){
            printf("\nDIGRAFO SELECIONADO\n ");
        }
        // se nenhuma opção for valida, gera um erro e volta o programa
        else{
            printf("\n %d NAO EH UMA OPCAO VALIDA. DIGITE UMA OPCAO VALIDA PARA CONTINUAR\n", result);
            system("pause");
            system("cls");
            goto inicio_programa;
        }
    }
    // definição da variavel Vertice
    int i, j, x, a1, v1, POrig,PDest;
    printf("\nQuantidade de Vertices: ");
    scanf("%d", &v1);
    v1 = v1 + 1;
    int m[v1][v1]; // inicia matriz
    // inicia todos os pontos da matriz como "0"
    for(i = 0; i<v1; i++)
        for(j = 0; j<v1; j++)
            m[i][j] = 0;
    // implementa titulo de linha e coluna na matriz
    for(i = 0; i<v1; i++){
        m[i][0] = i;
    }
    for(j = 0; j<v1; j++){
        m[0][j] = j;
    }
    // Colocar pontos na matriz
    printf("\nQuantidade de Arestas: ");
    scanf("%d", &a1);
    for(x = 0; x < a1; x++){
        ponto_origem:
        printf("\nVertice de Origem %d: ", x+1);
        scanf("%d", &POrig);
        if(POrig >v1-1){ // verifica se vertice existe na matriz
            printf("\nPosicao de Vertice de Origem nao existente");
            printf("\n\nInsira novamente\n\n");
            goto ponto_origem;
        }
        ponto_destino:
        printf("\nVertice de Destino %d: ", x+1);
        scanf("%d", &PDest);
        if(PDest >v1-1){ // verifica se vertice existe na matriz
            printf("\nPosicao de Vertice de Destino nao existente");
            printf("\n\nInsira novamente\n\n");
            goto ponto_destino;
        }
        switch(result){ // define entre GRAFO e DIGRAFO usando a varialvel "result" definida no começo do programa
        case 1:  //GRAFO
            m[POrig][PDest] = 1;
            m[PDest][POrig] = 1;
            break;
        case 2: //DIGRAFO
            m[POrig][PDest] = 1;
            break;
        }
        // print da matriz
        for(i = 0; i<v1; i++){
            printf("\n");
            for(j = 0; j<v1; j++)
                printf("%d ", m[j]);
        }
        printf("\n\n");
    }
    getch();
    return 0;
}

 

O código que você me enviou deu certo, porém contem muito erros no resultado, comecei a utilizar o código do @faervict, solucionei um dos problemas do resultado, porém não está chegando no resultado que desejo....
Teria como você me ajudar @devair1010 ?

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

10 minutos atrás, devair1010 disse:

@Justiceiro741      qual o objetivo do código , o que você precisa que ele mostre no resultado ?  

O intuito é o mesmo, fazer um software que gere uma matriz de adjacência de um grafo ou digrafo, onde o usuário que irá escolher a opção se é grafo ou digrafo e também fornecer os dados das arestas e vértices.

O meu professor deu um exemplo de saída que o programa irá retornar.

Deixei o Exemplo  e o resultado do programa anexado.

 

WhatsApp Image 2019-02-24 at 21.51.55.jpeg

soft.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

6 minutos atrás, devair1010 disse:

@Justiceiro741     editei e ajeitei o código acima , parece que seria isso , copie novamente e teste aí .

Deu certo @devair1010, muito obrigado por me ajudar, poderia me informar o motivo do erro pra que eu possa aprender a solucionar quando o problema ocorrer ?

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Justiceiro741     que bom que deu certo , não sei nada sobre matriz de adjacência e nem sobre grafos e dígrafos , mas estava faltando colocar  a outra dimensão da matriz na hora de imprimir o resultado final , lá na linha 80  :

// print da matriz
for(i=0; i<v1; i++){
    printf("\n");
    for(j=0; j<v1; j++)
        printf("%d ",m[i][j]);/* aqui precisa das duas dimensões  */
    }
    printf("!\n\n");
}
printf("       Tecle !\n\n");

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

6 minutos atrás, devair1010 disse:

@Justiceiro741     que bom que deu certo , não sei nada sobre matriz de adjacência e nem sobre grafos e dígrafos , mas estava faltando colocar  a outra dimensão da matriz na hora de imprimir o resultado final , lá na linha 80  :


// print da matriz
for(i=0; i<v1; i++){
    printf("\n");
    for(j=0; j<v1; j++)
        printf("%d ",m[i][j]);/* aqui precisa das duas dimensões  */
    }
    printf("       Tecle !\n\n");
}

 

Ah sim, igual a alteração que você tinha realizado na primeira vez, porém lá na primeira parte.

Obrigado pela ajuda, de verdade mesmo.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!