Ir ao conteúdo
  • Cadastre-se
xandin_silva

C Não consigo imprimir string dentro de struct

Recommended Posts

Boa tarde,

Estou aprendendo a programar C. No momento estou praticando structs. 

Fiz o programa de uma lista encadeada de restaurantes que guarde os seguintes dados :

-Nome

-Endereço

-Tipo de comida

-Nota do restaurante

 

Todo o programa tem funcionamento satisfatório dentro do planejado, porém uma função, a qual separaria os restaurantes pelo tipo de comida que cada um tem não funciona. Já tentei de várias formas e realmente não encontrei o problema. Se alguém pudesse me ajudar ficaria grato.

Também acrescento que sou novo ao forum, é meu primeiro tópico criado, então peço desculpas se fiz algo errado e fico grato por orientações. 

 

Abaixo o código de meu programa:

 

/*
Struct descreve restaurantes. Campos armazenam o nome do
restaurante, o endereço, o tipo de comida (brasileira, japonesa ou mexicana) e
uma nota para a cozinha (entre 0 e 5). Struct inserida em lista encadeada que:
a) Insire um novo restaurante na lista;  
b ) Lista todos os restaurantes na tela;
c) Lista os restaurantes separados por nota
d) Lista os restaurantes separados por tipo de comida
*/

 

//Atualmente 1 falhas - nao exibe separacao por comidas

 

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

typedef struct Tipo_Restaurante
{
    char nome[50];
    char end[70];
    char comida[50];
    int nota;
    struct Tipo_Restaurante *proximo;
} TRestaurante;

 

void inserir(TRestaurante **cabeca);
void listar(TRestaurante *cabeca);
void listar_comida(TRestaurante *cabeca);
void listar_nota(TRestaurante *cabeca);
void exibe_menu();

 

int main()
{
    TRestaurante *cabeca=NULL;          //ponteiro para a cabeca
    TRestaurante *noatual;              //ponteiro para percorrer lista
    char q;                             //caractere de selecao de acao
    do
    {
        exibe_menu();
        
        scanf(" %c",&q);                    //captacao de escolha do usuario
        printf("\n");
        
        switch(q)
        {
            case 'i': case 'I': inserir(&cabeca); break;
            case 'l': case 'L': listar(cabeca); break;
            case 'c': case 'C': listar_comida(cabeca); break;
            case 'n': case 'N': listar_nota(cabeca); break;
            case 't': case 'T': break;
            default: printf("\nOpcao invalida!\n\n");
        }
    }while(q!='T'&&q!='t');
    
    noatual=cabeca;    //desaloca memoria alocada para lista
    
    while(noatual!=NULL)
    {
        cabeca=noatual->proximo;        //aponta cabeca para proximo elemento
        free(noatual);                  //libera memoria de elemento anterior
        noatual=cabeca;                 //aponta noatual para endereco do proximo
    }

return 0;
}

 

void exibe_menu()
{
    printf("\n Digite I para inserir um restaurante\n");       //menu de escolhas
    printf(" Digite L para listar restaurantes\n");
    printf(" Digite G para gravar restaurantes em arquivo\n");
    printf(" Digite E para exibir restaurantes de arquivo\n");
    printf(" Digite C para listar restaurantes por tipo de comida\n(Mexicana, Japonesa, Brasileira)\n");
    printf(" Digite N para listar restaurantes por nota\n(Notas de 1 a 5)\n");
    printf(" Digite T para terminar programa\n");
}

 

void inserir(TRestaurante **cabeca)
{
    TRestaurante *noatual, *novono;
    char nome[50];
    char end[70];
    char comida[50];
    int nota;
    
    printf("Por favor, digite o nome do restaurante: ");
    gets(nome);
    gets(nome);
    printf("Por favor digite o endereco do restaurante: ");
    gets(end);
    printf("Por favor digite o tipo de comida servida no restaurante(Mexicana, Japonesa, Brasileira): ");
    gets(comida);
    printf("Por favor digite a nota que voce atribui a este restaurante(1 a 5): ");
    scanf("%d", &nota);
    printf("\n\n");
    
    //Caso nao exista nenhum item na lista, cria o no cabeca
    if(*cabeca==NULL)
    {
        *cabeca=(TRestaurante*)malloc(sizeof(TRestaurante));
        strcpy((*cabeca)->nome,nome);
        strcpy((*cabeca)->end,end);
        strcpy((*cabeca)->comida,comida);
        (*cabeca)->nota=nota;
        (*cabeca)->proximo=NULL;
    }
    //Caso ja existam itens na lista, busca o ultimo e acrescenta no ao final
    else
    {
        noatual=*cabeca;
        while(noatual->proximo!=NULL)   //loop que percorre lista
            noatual=noatual->proximo;
        
        novono=(TRestaurante*)malloc(sizeof(TRestaurante)); //aloca memoria para novo no
        strcpy(novono->nome,nome);                       //atribui valores
        strcpy(novono->end,end);
        strcpy(novono->comida,comida);
        novono->nota=nota;
        novono->proximo=NULL;
        
        noatual->proximo=novono;                    //aponta para novono ao final
    }
}

 

void listar(TRestaurante *noatual)
{
    if(noatual==NULL)
    {
        printf("\nLista vazia!\n\n");
    }
    else
    {
        while(noatual!=NULL)
        {
        
            printf("\nNome do restaurante: %s\n", noatual->nome);   //exibe valores
            printf("Endereco do restaurante: %s\n", noatual->end);
            printf("Tipo de comida do restaurante: %s\n", noatual->comida);
            printf("Nota do restaurante: %d\n\n", noatual->nota);
        
            noatual=noatual->proximo;       //passa para o proximo no
        }
    }
}

 

void listar_comida(TRestaurante *noatual)          //FUNCAO NAO FUNCIONA!!!!!!!!!!!
{
    TRestaurante *aux;
    aux=noatual;
    
    if(noatual==NULL)                        //confere se lista esta vazia
        printf("\nLista vazia!\n\n");
    
    printf("\nRestaurantes de comida Mexicana:\n");  
    while(noatual!=NULL)                     //imprime todos os restaurantes mexicanos
    {
        if(((noatual->comida)=="mexicana")||((noatual->comida)=="Mexicana"))
        {
            printf("%s\n", noatual->nome);
        }
        noatual=noatual->proximo;
    }
    
    noatual=aux;
    printf("\nRestaurantes de comida Japonesa:\n");  
    while(noatual!=NULL)                     //imprime todos os restaurantes mexicanos
    {
        if((noatual->comida=="Japonesa")||(noatual->comida=="japonesa"))
        {
            printf("%s\n", noatual->nome);
        }
        noatual=noatual->proximo;
    }
    
    
    noatual=aux;
    printf("\nRestaurantes de comida Brasileira:\n");  
    while(noatual!=NULL)                     //imprime todos os restaurantes mexicanos
    {
        if((noatual->comida=="Brasileira")||(noatual->comida=="brasileira"))
        {
            printf("%s\n", noatual->nome);
        }
        noatual=noatual->proximo;
    }
}


void listar_nota(TRestaurante *noatual)
{
    TRestaurante *aux;                       //variavel auxiliar que aponta para inicio da lista
    aux=noatual;
    if(noatual==NULL)                        //confere se lista esta vazia
        printf("\nLista vazia!\n");
    
    printf("\nRestaurantes nota 1:\n");
    while(noatual!=NULL)                     //imprime todos os restaurantes de nota 1
    {
        if((noatual->nota==1))
        {
            printf(" %s\n", noatual->nome);
        }
        noatual=noatual->proximo;
    }
    
    printf("\nRestaurantes nota 2:\n");
    noatual=aux;                             //noatual aponta novamente para inicio da lista    
    while(noatual!=NULL)                     //imprime todos os restaurantes de nota 2
    {
        if((noatual->nota==2))
        {
            printf(" %s\n", noatual->nome);
        }
        noatual=noatual->proximo;
    }
    
    printf("\nRestaurantes nota 3:\n");
    noatual=aux;                             //noatual aponta novamente para inicio da lista  
    while(noatual!=NULL)                     //imprime todos os restaurantes de nota 3
    {
        if((noatual->nota==3))
        {
            printf(" %s\n", noatual->nome);
        }
        noatual=noatual->proximo;
    }
    
    printf("\nRestaurantes nota 4:\n");
    noatual=aux;                             //noatual aponta novamente para inicio da lista  
    while(noatual!=NULL)                     //imprime todos os restaurantes de nota 4
    {
        if((noatual->nota==4))
        {
            printf(" %s\n", noatual->nome);
        }
        noatual=noatual->proximo;
    }
    
    printf("\nRestaurantes nota 5:\n");
    noatual=aux;                             //noatual aponta novamente para inicio da lista  
    while(noatual!=NULL)                     //imprime todos os restaurantes de nota 5
    {
        if((noatual->nota==5))
        {
            printf(" %s\n", noatual->nome);
        }
        noatual=noatual->proximo;
    }
}

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode constatar por si mesmo que isso:

 f(((noatual->comida)=="mexicana") 

Jamais acontece entre strings ou literais em C. É preciso função que faça a comparação um a um com cada caractere até que certa condição seja ou não satisfeita.

 

Caso não queira você mesmo implementar tal rotina há função strcmp() que já faz isso e se encontra pronta para uso, basta pra tanto detalhar #include <string.h>. Para mais informações consulte função strcmp clicando no link.

 

Neste link você lerá entre muitas coisa que se função retorna 0 é porque os strings são iguais, se >0 é por que o primeiro caractere que é diferente se encontra acima na relação alfabética, se 0< é respectivamente o inverso do segundos caso e relembrando quando igual a 0 é porque são iguais os strings comparados.

 

Esse é o erro lógico mais evidente, não sabemos se revolverá a sua questão problemática, porém é  certo ser parte dela. ^_^

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado Mauro!

Estive em dúvida quanto a isso, mas achava que com o uso de structs poderia dar uma "roubada" nessas horas.

Vou implementar normal criando uma função de comparação, até para continuar o treino!

Abraço!!!!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×