Ir ao conteúdo

Ajuda Programa Em C++


arturrp

Posts recomendados

Postado

Ola galera, eu estou fazendo um programa pra facul onde eu tenho que entrar com uma serie de nomes de cidades em uma matriz e as distancias entre elas, depois eu tenho que achar o menor caminho de uma cidade para outra, so que na hora de executar, ele esta numa boa ate eu pedir para ele encontar o menor caminho, ele entra em looping, nem a professora soube explicar o porque disso, se alguem puder me ajudar ficarei grato.....

Postado

#include <stdio.h>

#include <string.h>

void lertamanho ( int *n)

{

printf ("Entre com o tramanho do seu grafo: ");

scanf("%d", & (*n));

}

//--------------------------------------------------------------------------

void lermatriz(int distancia [10][10], char cidade [10][10], int n)

{

int i=0,j=0;

for (i=0;i<n;i++)

{

printf("Digite o nome da cidade: ");

scanf("%s", &cidade);

printf("\n");

}

for (i=0;i<n;i++)

{

for (j=0;j<n;j++)

{

if (i<j)

{

printf("Entre com a distancia entre a cidade %s e %s: ", cidade, cidade[j]);

scanf("%d", &distancia[j]);

distancia[j]=distancia [j];

printf("\n");

}

if (i==j)

distancia[j]=0;

}

}

}

//-----------------------------------------------------------------------------

void consulta ( int distancia [10][10], char cidade [10][10], int n )

{

char origem[10], destino[10] ;

int origcid, origdest,i,j,achou1=0,achou2=0;

printf("Entre com o nome da cidade de origem: ");

scanf("%s", &origem);

printf("Entre com o nome da cidade de destino: ");

scanf("%s", &destino);

for(i=0;i<n;i++)

{

if (strcmp(origem,cidade)==0)

{

origcid = i;

achou1=1;

}

if (strcmp(destino,cidade)==0)

{

origdest =i;

achou2=1;

}

}

if ((achou1==0)||(achou2==0))

printf ("esta cidade nao esta cadastrada");

else

printf("A distancias entre: %s e: %s é: %d",origem, destino, distancia[origcid][origdest]);

printf("\n");

system("pause");

}

//-----------------------------------------------------------------------------

void imprimir (int resultado[10],int caminho [10], char cidade [10][10],int n,char origem[10])

{

int i=0,j=0,origcid=0;

for(i=0;i<n;i++)

printf(" Origem: %s", origem, "Cidade: %s", cidade, "Resultado: %d", resultado);

for(i=0;i<n;i++)

{

if (strcmp(cidade,origem)==0)

origcid = i;

}

for(i=0;i<n;i++)

{

printf("Caminho: %d\t",caminho);

j=i;

while (caminho[j]!=origcid)

{

printf("Caminho: %d",caminho[caminho[j]]);

j=j++;

}

}

}

//-----------------------------------------------------------------------------

void menorcaminho( int resultado [10], int vertice [10], int caminho [10],int n,int distancia[10][10] )

{

int menor=999, pos,i,cont=0;

char cidade[10][10],origem[10];

while(cont<n-1)

{

for (i=0;i<n;i++)

{

if (vertice==0)

{

if ((resultado<menor)&&(resultado!=0))

{

menor=resultado;

pos=i;

}

}

}

vertice[pos]=1;

for(i=0;i<n;i++)

{

if((menor+distancia[pos])<resultado)

resultado=distancia[pos];

caminho=i;

}

cont++;

}

imprimir(resultado,caminho, cidade,n,origem);

}

//----------------------------------------------------------------------

void inicializar( int distancia [10][10], char cidade [10][10], int n )

{

int caminho[10],resultado[10], vertice[10];

char origem[10];

int i=0;

int origcid=0;

printf("Entre com o nome da cidade de origem: ");

scanf("%s", &origem);

for(i=0;i<n;i++)

{

if (strcmp(cidade,origem)==0)

origcid = i;

}

for(i=0;i<n;i++)

resultado=distancia[origcid];

for(i=0;i<n;i++)

caminho=origcid;

for(i=0;i<n;i++)

{

if (i==origcid)

vertice=1;

else

vertice=0;

}

for(i=0;i<n;i++)

{

printf("\n");

printf("CAMINHO %d\t",caminho);

printf("RESULTADO %d\t",resultado);

printf("VERTICE %d\t",vertice);

}

printf("\n\n");

menorcaminho(resultado,vertice,caminho,n,distancia);

system("pause");

}

//---------------------------------------------------------------------------

main ()

{

int n=0,x=0;

int distancia [10][10];

char origem[10];

char cidade [10][10];

for(;;)

{

system("cls");

printf("\n1. DEFINIR O TAMANHO DO GRAFO \n");

printf("2. DEFINIR AS CIDADES E SUAS DISTANCIAS \n");

printf("3. CONSULTAR AS DISTANCIAS \n");

printf("4. ENCONTRAR MENOR CAMINHO \n");

printf("5. SAIR \n");

printf("\nEntre com a opcao: ");

scanf("%d", &x);

switch(x)

{

case 1: lertamanho(&n);

printf("\n");

break;

case 2:

lermatriz (distancia,cidade,n);

printf("\n");

break;

case 3: consulta(distancia, cidade, n);

printf("\n");

break;

case 4: inicializar (distancia, cidade, n);

break;

case 5:

return;

break;

};

}

system("pause");

}

Postado

Cara, no mínimo isso aqui está errado:

void menorcaminho( int resultado [10], int vertice [10], int caminho [10],int n,int distancia[10][10] )

{

int menor=999, pos,i,cont=0;

char cidade[10][10],origem[10];

....

imprimir(resultado,caminho, cidade,n,origem);

}

Você está redeclando o vetor "cidade" que declarou no main, e a chamando a imprimir passando ele por parâmetro sem inicializá-lo.

JP

Postado

Isso, vai passando ele por parâmetro até chegar no "imprimir". Notei que tem mais ocorrências desse tipo no programa. Parece que ele foi feito tudo dentro de uma função só, depois foi quebrado em várias funções sem respeitar o escopo das variáveis.

JP

Postado

#include <stdio.h>

#include <string.h>

void lertamanho ( int *n)

{

printf ("Entre com o tramanho do seu grafo: ");

scanf("%d", & (*n));

}

//--------------------------------------------------------------------------

void lermatriz(int distancia [10][10], char cidade [10][10], int n)

{

int i=0,j=0;

for (i=0;i<n;i++)

{

printf("Digite o nome da cidade: ");

scanf("%s", &cidade);

printf("\n");

}

for (i=0;i<n;i++)

{

for (j=0;j<n;j++)

{

if (i<j)

{

printf("Entre com a distancia entre a cidade %s e %s: ", cidade, cidade[j]);

scanf("%d", &distancia[j]);

distancia[j]=distancia [j];

printf("\n");

}

if (i==j)

distancia[j]=0;

}

}

}

//-----------------------------------------------------------------------------

void consulta ( int distancia [10][10], char cidade [10][10], int n )

{

char origem[10], destino[10] ;

int origcid, origdest,i,j,achou1=0,achou2=0;

printf("Entre com o nome da cidade de origem: ");

scanf("%s", &origem);

printf("Entre com o nome da cidade de destino: ");

scanf("%s", &destino);

for(i=0;i<n;i++)

{

if (strcmp(origem,cidade)==0)

{

origcid = i;

achou1=1;

}

if (strcmp(destino,cidade)==0)

{

origdest =i;

achou2=1;

}

}

if ((achou1==0)||(achou2==0))

printf ("esta cidade nao esta cadastrada");

else

printf("A distancias entre: %s e: %s é: %d",origem, destino, distancia[origcid][origdest]);

printf("\n");

system("pause");

}

//-----------------------------------------------------------------------------

void imprimir (int resultado[10],int caminho [10], char cidade [10][10],int n,char origem[10])

{

int i=0,j=0,origcid=0;

for(i=0;i<n;i++)

printf(" Origem: %s", origem, "Cidade: %s", cidade, "Resultado: %d", resultado);

for(i=0;i<n;i++)

{

if (strcmp(cidade,origem)==0)

origcid = i;

}

for(i=0;i<n;i++)

{

printf("Caminho: %d\t",caminho);

j=i;

while (caminho[j]!=origcid)

{

printf("Caminho: %d",caminho[caminho[j]]);

j=j++;

}

}

}

//-----------------------------------------------------------------------------

void menorcaminho( int resultado [10], int vertice [10], int caminho [10],int n,int distancia[10][10],char cidade [10][10],char origem [10] )

{

int menor=999, pos,i,cont=0;

while(cont<n-1)

{

for (i=0;i<n;i++)

{

if (vertice==0)

{

if ((resultado<menor)&&(resultado!=0))

{

menor=resultado;

pos=i;

}

}

}

vertice[pos]=1;

for(i=0;i<n;i++)

{

if((menor+distancia[pos])<resultado)

resultado=distancia[pos];

caminho=i;

}

cont++;

}

imprimir(resultado,caminho, cidade,n,origem);

}

//----------------------------------------------------------------------

void inicializar( int distancia [10][10], char cidade [10][10], int n,char origem[10],int caminho[10],int resultado[10], int vertice[10] )

{

int i=0;

int origcid=0;

printf("Entre com o nome da cidade de origem: ");

scanf("%s", &origem);

for(i=0;i<n;i++)

{

if (strcmp(cidade,origem)==0)

origcid = i;

}

for(i=0;i<n;i++)

resultado=distancia[origcid];

for(i=0;i<n;i++)

caminho=origcid;

for(i=0;i<n;i++)

{

if (i==origcid)

vertice=1;

else

vertice=0;

}

for(i=0;i<n;i++)

{

printf("\n");

printf("CAMINHO %d\t",caminho);

printf("RESULTADO %d\t",resultado);

printf("VERTICE %d\t",vertice);

}

printf("\n\n");

menorcaminho(resultado,vertice,caminho,n,distancia,cidade,origem);

system("pause");

}

//---------------------------------------------------------------------------

main ()

{

int n=0,x=0;

int distancia [10][10],caminho[10],resultado[10], vertice[10];

char origem[10];

char cidade [10][10];

for(;;)

{

system("cls");

printf("\n1. DEFINIR O TAMANHO DO GRAFO \n");

printf("2. DEFINIR AS CIDADES E SUAS DISTANCIAS \n");

printf("3. CONSULTAR AS DISTANCIAS \n");

printf("4. ENCONTRAR MENOR CAMINHO \n");

printf("5. SAIR \n");

printf("\nEntre com a opcao: ");

scanf("%d", &x);

switch(x)

{

case 1: lertamanho(&n);

printf("\n");

break;

case 2:

lermatriz (distancia,cidade,n);

printf("\n");

break;

case 3: consulta(distancia, cidade, n);

printf("\n");

break;

case 4: inicializar (distancia, cidade, n,origem,caminho,resultado,vertice);

break;

case 5:

return;

break;

};

}

system("pause");

}

fiz assim, so que ta dando erro, e nao consigo achar o porque.....

Postado

Olá você está entrando em loop por isso "j=j++" você não esta incrementando o j, deve fazer j=++j; ou j++;

Isso esta acontecendo em sua função imprimir.

[]'s

Postado

#include <stdio.h>

#include <string.h>

void lertamanho ( int *n)

{

printf ("Entre com o tramanho do seu grafo: ");

scanf("%d", & (*n));

}

//--------------------------------------------------------------------------

void lermatriz(int distancia [10][10], char cidade [10][10], int n)

{

int i=0,j=0;

for (i=0;i<n;i++)

{

printf("Digite o nome da cidade: ");

scanf("%s", &cidade);

printf("\n");

}

for (i=0;i<n;i++)

{

for (j=0;j<n;j++)

{

if (i<j)

{

printf("Entre com a distancia entre a cidade %s e %s: ", cidade, cidade[j]);

scanf("%d", &distancia[j]);

distancia[j]=distancia [j];

printf("\n");

}

if (i==j)

distancia[j]=0;

}

}

}

//-----------------------------------------------------------------------------

void consulta ( int distancia [10][10], char cidade [10][10], int n )

{

char origem[10], destino[10] ;

int origcid, origdest,i,j,achou1=0,achou2=0;

printf("Entre com o nome da cidade de origem: ");

scanf("%s", &origem);

printf("Entre com o nome da cidade de destino: ");

scanf("%s", &destino);

for(i=0;i<n;i++)

{

if (strcmp(origem,cidade)==0)

{

origcid = i;

achou1=1;

}

if (strcmp(destino,cidade)==0)

{

origdest =i;

achou2=1;

}

}

if ((achou1==0)||(achou2==0))

printf ("esta cidade nao esta cadastrada");

else

printf("A distancias entre: %s e: %s é: %d",origem, destino, distancia[origcid][origdest]);

printf("\n");

system("pause");

}

//-----------------------------------------------------------------------------

void imprimir (int resultado[10],int caminho [10], char cidade [10][10],int n,char origem[10])

{

int i=0,j=0,k=0,origcid=0;

for(i=0;i<n;i++)

{

printf("Origem: %s Cidade: %s Resultado %d ", origem, cidade, resultado);

printf("\n");

}

printf("\n");

for(i=0;i<n;i++)

{

if (strcmp(cidade,origem)==0)

origcid = i;

}

for(i=0;i<n;i++)

{

printf("Caminho: %d\t",caminho);

j=i;

}

while (caminho[k]!=origcid)

{

printf("Caminho: %d\t",caminho[j]);

k++;

}

}

//-----------------------------------------------------------------------------

void menorcaminho( int resultado [10], int vertice [10], int caminho [10],int n,int distancia[10][10],char origem[10],char cidade[10][10] )

{

int menor=999, pos,i,cont=0;

while(cont<n-1)

{

for (i=0;i<n;i++)

{

if (vertice==0)

{

if ((resultado<menor)&&(resultado!=0))

{

menor=resultado;

pos=i;

}

}

}

vertice[pos]=1;

for(i=0;i<n;i++)

{

if((menor+distancia[pos])<resultado)

resultado=distancia[pos];

caminho=i;

}

cont++;

}

imprimir(resultado,caminho, cidade,n,origem);

}

//----------------------------------------------------------------------

void inicializar( int distancia [10][10], char cidade [10][10], int n )

{

int caminho[10],resultado[10], vertice[10];

char origem[10];

int i=0;

int origcid=0;

printf("Entre com o nome da cidade de origem: ");

scanf("%s", &origem);

for(i=0;i<n;i++)

{

if (strcmp(cidade,origem)==0)

origcid = i;

}

for(i=0;i<n;i++)

resultado=distancia[origcid];

for(i=0;i<n;i++)

caminho=origcid;

for(i=0;i<n;i++)

{

if (i==origcid)

vertice=1;

else

vertice=0;

}

for(i=0;i<n;i++)

{

printf("\n");

printf("CAMINHO %d\t",caminho);

printf("RESULTADO %d\t",resultado);

printf("VERTICE %d\t",vertice);

}

printf("\n\n");

menorcaminho(resultado,vertice,caminho,n,distancia,origem,cidade );

printf("\n\n");

system("pause");

}

//---------------------------------------------------------------------------

main ()

{

int n=0,x=0;

int distancia [10][10];

char origem[10];

char cidade [10][10];

for(;;)

{

system("cls");

printf("\n1. DEFINIR O TAMANHO DO GRAFO \n");

printf("2. DEFINIR AS CIDADES E SUAS DISTANCIAS \n");

printf("3. CONSULTAR AS DISTANCIAS \n");

printf("4. ENCONTRAR MENOR CAMINHO \n");

printf("5. SAIR \n");

printf("\nEntre com a opcao: ");

scanf("%d", &x);

switch(x)

{

case 1: lertamanho(&n);

printf("\n");

break;

case 2:

lermatriz (distancia,cidade,n);

printf("\n");

break;

case 3: consulta(distancia, cidade, n);

printf("\n");

break;

case 4: inicializar (distancia, cidade, n);

break;

case 5:

return;

break;

};

}

system("pause");

}

GAÇERA A TODOS OBRIGADOPELA AJUDA, ESTA AE O RESULTADO DA AJUDA QUE vocês ME DERAM, NAO SEI SE ESTA CORRETO, MAS ESTA IMPRIMENDO TUDO E SEM ERROS.........DESDE JA MUITO OBRIGADO

Arquivado

Este tópico foi arquivado e está fechado para 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!