• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

x_soldier

Dicionario.c

10 mensagens neste tópico

Boas noites!

Pessoal tenho um trabalho final para entregar mas ando errascado com isto,da-me erro a compilar na linha que coloquei os RRRR. Isto e um dicionario cujo o objectivo é pesquisar,adicionar e alterar palavras.

Será que alguém me pode ajudar?

Desde já obrigado

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

typedef struct _word
{
char* palavra[100];
char* significado[200];
char* genero[100];
char* adicional[100];
} word;



word *procura = (word *) malloc(sizeof(word));    //apontador que procura nas listas       RRRRRRRRRRRRRRRRRRR
word *ABCDE = (word *) malloc(sizeof word));      //apontadores que sao as cabeças de lista
word *FGHIJK = (word *) malloc(sizeof(word));
word *LMNOP = (word *) malloc(sizeof(word));
word *QRSTU = (word *) malloc(sizeof(word));
word *VWXYZ = (word *) malloc(sizeof(word));
char tmp[100];  //string que serve para ler do utilizador
FILE *fp;

void Le_Ficheiro()
{    
  word *nova = (word *) malloc(sizeof(word));
  fp=fopen("dicionario.txt", "r"); // aponta para o inicio do ficheiro
  
  
  while(fscanf( fp,"%s", tmp)!=EOF)   //Le strings enquanto não encontrar o fim do ficheiro
  {
    if(!(_stricmp(tmp,"palavra:")))
    {
       fgets("%s", nova->palavra, fp);
       fscanf(fp, "%s", tmp);         //le a palavra "significado:"
       fgets("%s", nova->significado, fp);
       fscanf(fp, "%s", tmp);         //le a palavra "genero:"
       fgets("%s", nova->genero, fp);
       fscanf(fp, "%s", tmp);         //le a palavra "adicional:"
       fgets("%s", nova->adicional, fp);
       Inserir(nova);   
   }  
  fclose(fp);
}   


void procura(word *nova)
{
  if((nova->palavra[0]>='A' && tmp[0]<='E') || (nova->palavra[0]>='a' && tmp[0]<='e'))
      procura = ABCDE;
  else if((nova->palavra[0]>='F' && tmp[0]<='K') || (nova->palavra[0]>='f' && tmp[0]<='k'))
      procura = FGHIJK;
  else if((nova->palavra[0]>='L' && tmp[0]<='P') || (nova->palavra[0]>='l' && tmp[0]<='p'))
      procura = LMNOP;
  else if((nova->palavra[0]>='Q' && tmp[0]<='U') || (nova->palavra[0]>='q' && tmp[0]<='u'))
      procura = QRSTU;
  else if((nova->palavra[0]>='V' && tmp[0]<='Z') || (nova->palavra[0]>='v' && tmp[0]<='z'))
      procura = VWXYZ;
  else
      procura = VWXYZ;
      
  while(_stricmp(procura->prox->palavra, nova->palavra)<0 && procura->prox!=NULL)
      procura=procura->prox;          
}


void inserir(word *nova)
{
   procura(nova);

   //  insere a nova a seguir à procura
   nova->prox = procura->prox;
   procura->prox = nova;
}


void consultar(word *nova)
{
   procura(nova);
   
   if(_stricmp(procura->prox->palavra, nova->palavra) != 0)
      printf("palavra nao esta no dicionario\n");
   else
   {
       printf("palavra:     %s\n\n", procura->prox->palavra);
       printf("significado: %s\n\n", procura->prox->significado);
       printf("genero:      %s\n\n", procura->prox->genero);
       printf("adicional:   %s\n\n", procura->prox->adicional);
   }  
}


void modificar(word *nova)
{
   procura(nova);
   
   if(_stricmp(procura->prox->palavra, nova->palavra) != 0)
      printf("palavra nao esta no dicionario\n");
   else
   {
       printf("significado: "); gets(procura->prox->significado);
       printf("genero: ");      gets(procura->prox->genero);
       printf("adicional: ");   gets(procura->prox->adicional);
   }                
}


void remover(word *nova)
{
   procura(nova);
   
   if(_stricmp(procura->prox->palavra, nova->palavra) != 0)
      printf("palavra nao esta no dicionario\n");
   else
      procura->prox = procura->prox->prox;  //  remove a nova a seguir à procura
}


void Escreve_Ficheiro()
{
  fp=fopen("dicionario.txt", "w"); // aponta para o inicio do ficheiro

  while( ABCDE->prox != NULL)
  {
     fprintf(fp,"palavra: %s\n", ABCDE->prox->palavra);
     fprintf(fp,"significado: %s\n", ABCDE->prox->significado);
     fprintf(fp,"genero: %s\n", ABCDE->prox->genero);
     fprintf(fp,"adicional %s\n\n", ABCDE->prox->adicional);
     ABCDE=ABCDE->prox;
  }
  
  while( FGHIJK->prox != NULL)
  {
     fprintf(fp,"palavra: %s\n", FGHIJK->prox->palavra);
     fprintf(fp,"significado: %s\n", FGHIJK->prox->significado);
     fprintf(fp,"genero: %s\n", FGHIJK->prox->genero);
     fprintf(fp,"adicional %s\n\n", FGHIJK->prox->adicional);
     FGHIJK=FGHIJK->prox;
  }

  while( LMNOP->prox != NULL)
  {
     fprintf(fp,"palavra: %s\n", LMNOP->prox->palavra);
     fprintf(fp,"significado: %s\n", LMNOP->prox->significado);
     fprintf(fp,"genero: %s\n", LMNOP->prox->genero);
     fprintf(fp,"adicional %s\n\n", LMNOP->prox->adicional);
     LMNOP=LMNOP->prox;
  }  
  
  while( QRSTU->prox != NULL)
  {
     fprintf(fp,"palavra: %s\n", QRSTU->prox->palavra);
     fprintf(fp,"significado: %s\n", QRSTU->prox->significado);
     fprintf(fp,"genero: %s\n", QRSTU->prox->genero);
     fprintf(fp,"adicional %s\n\n", QRSTU->prox->adicional);
     QRSTU=QRSTU->prox;
  }  
  
  while( VWXYZ->prox != NULL)
  {
     fprintf(fp,"palavra: %s\n", VWXYZ->prox->palavra);
     fprintf(fp,"significado: %s\n", VWXYZ->prox->significado);
     fprintf(fp,"genero: %s\n", VWXYZ->prox->genero);
     fprintf(fp,"adicional %s\n\n", VWXYZ->prox->adicional);
     VWXYZ=VWXYZ->prox;
  }  

fclose(fp);
}      
         
         
         
int main()
{
  word *nova = (word *) malloc(sizeof(word));
  char tmp[100];
  int i;
  
  Le_Ficheiro();

  do{
       printf(":MENU:\n\n");
       printf("Insira uma das seguintes opcoes:\n\n\n");
       printf("\t\t (1) Consultar\n");
       printf("\t\t (2) Inserir\n");
       printf("\t\t (3) Modificar\n");
       printf("\t\t (4) Remover\n");
       printf("\t\t (5) Sair\n\n\n");
       printf("OPCAO:");
       scanf("%s", tmp);
  
  // como o _stricmp retorna 0 quando as strings a comparar forem iguais, o AND (&&) geral vai ser 0 se alguma delas 
  // for igual (0) e se todas forem diferentes (valor diferente de 0). Um valor diferente de 0 quer dizer verdade, logo
  // quando nenhuma das opções do menu for seleccionada ele faz o que está no if() , caso uma tenha sido seleccionada
  // efectua o else.
     if(_stricmp(tmp,"Consultar") && _stricmp(tmp,"1") && _stricmp(tmp,"Inserir") && _stricmp(tmp,"2") && 
        _stricmp(tmp,"Modificar") && _stricmp(tmp,"3") && _stricmp(tmp,"Remover") && _stricmp(tmp,"4") &&
        _stricmp(tmp,"Sair") && _stricmp(tmp,"5"))
        {
          system("cls");
          printf("Opcao Invalida, insira novamente\n\n");
        }
     else
        break;  // sair do ciclo
    }while(1);  //repete o ciclo até uma das opções do menu ser inserida

  // teste a qual das opções foi inserida, em cada if() se uma das opções foi a inserida, o _stricmp retornará 0$
  // logo  !(condição==0)  dará um valor verdadeiro e entrará no if() 
  if(!(_stricmp(tmp,"Consultar") && _stricmp(tmp,"1"))) 
    {  
     printf("palavra a consultar: "); gets(nova->palavra);
     consultar(nova);
    }                          
  else if(!(_stricmp(tmp,"Inserir") && _stricmp(tmp,"2")))
    {
     printf("palavra a inserir: "); gets(nova->palavra);
     printf("significado da palavra: "); gets(nova->significado);
     printf("genero da palavra: "); gets(nova->genero);
     printf("informacao adicional: "); gets(nova->adicional);
     inserir(nova);
     }
  else if(!(_stricmp(tmp,"Modificar") && _stricmp(tmp,"3")))
    {
     printf("palavra a modificar: "); gets(nova->palavra);
     modificar(nova);
    }
  else if(!(_stricmp(tmp,"Remover") && _stricmp(tmp,"4")))
   {
     printf("palavra a remover: "); gets(nova->palavra);
     remover(nova);
   }

  Escreve_Ficheiro();
  exit(0);             
                               
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Da esta msg: initializer element is not constant.

Já dei voltas e voltas e n consigo fazer nada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A linha onde me da erro é logo na primeira a seguir a estrutura,esta:

word *procura = (word *) malloc(sizeof(word));  ao qual diz: initializer element is not constant.

Thanks

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Além do parêntesis em falta indicado pelo saunde, não podes inicializar variáveis globais com o resultado da chamada a uma função. Declara-as onde estão, mas inicializa-as dentro da função main:

word *procura;    //apontador que procura nas listas       RRRRRRRRRRRRRRRRRRR
word *ABCDE;      //apontadores que sao as cabeças de lista
word *FGHIJK;
word *LMNOP;
word *QRSTU;
word *VWXYZ;
/* ... */
int main()
{
/* ... */
procura = (word *) malloc(sizeof(word));    //apontador que procura nas listas       RRRRRRRRRRRRRRRRRRR
ABCDE = (word *) malloc(sizeof(word));      //apontadores que sao as cabeças de lista
FGHIJK = (word *) malloc(sizeof(word));
LMNOP = (word *) malloc(sizeof(word));
QRSTU = (word *) malloc(sizeof(word));
VWXYZ = (word *) malloc(sizeof(word));
/* ... */

Também te falta uma chaveta a fechar a função Le_Ficheiro.

E ainda vais ter mais uns quantos problemas com esse código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já consegui resolver aquele problema, agora da-me erro nesta linha de codigo dizendo: in function Le ficheiro.

Tou tramado com este programa,lol.

fgets("%s", nova->palavra, fp);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora