Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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. ^_^

Editado por Mauro Britivaldo
Link externo
  • 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






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

×