Jump to content

Programa em C sobre estruturas


trovasecantigas

Recommended Posts

Boa tarde a todos. 

Tenho evitado chatear a malta a perguntar coisas sobre as quais tenho obrigação de descobrir mas já ando com a cabeça à volta há alguns dias e não passo da sepa torta. 

Estou a desenvolver um programa em C que contem structs e ficheiros binários. Apesar de quando o programa corria não gravar corretamente a informação como eu pretendia, nem consultar, editar, etc, agora é que ele não corre de tudo. Tudo porque surge um erro na compilação indicado que a referencia à função 'x' está indefinida. Ora, se tenho o prototype devidamente assinalado, se tenho a função corretamente lá em baixo no alçapão, porque é que no ...switch case... ele não me aceita? E há 4 dias aceitava? Da-se! Peço desculpa mas caramba, não consigo resolver isto tão básico? quero eu ser programador? Apetece-me rebentar com o computador. Alguém me pode ajudar? 

Desejo desde já um bom Domingo a todos. 

Eis o código:

#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
#include <locale.h>
#include <string.h>

 

//estrutura
struct cliente{
    double numero;
    char nome[30];
    int idade;
    double cc;
    double tlf;
    double nif;
};

struct cliente cli;



//PROTOTYPES
void inic();
void screenheader();
void intro();
void inserirCliente();
void listarCliente();
void editarCliente();
void eliminarCliente();
void pesquisarCliente();
short clienteExiste();



FILE *fp;


//==============================main=======================================

int main ()
{


    setlocale(LC_ALL, "");

    int op; //escolher opção
    char res; //resposta escolhida
    screenheader();    
    intro();            

    do
     {
       
       screenheader();
      
       printf("\n\n\n                      Escolha uma opção:\n");
       printf("                      1. Pesquisar Cliente\n");
       printf("                      2. Listar Cliente\n");
       printf("                      3. Inserir cliente\n");
       printf("                      4. Editar Cliente\n");
       printf("                      5. Eliminar Cliente\n");
       printf("                      9. Exit\n");
       scanf("%d",&op);

     switch(op)
   {
     case 1 : pesquisarCliente(); break;
     case 2 : listarCliente(); break;
     case 3 : inserirCliente(); break;
     case 4 : editarCliente();  break;    
     case 5 : eliminarCliente(); break;
    

     case 9:exit(0);
     default:printf("\n\n\nErro!!!!\n\nInsira uma opção válida, sff.");
     getchar();
   }

     printf("\n\nDo you want to continue:");
     fflush(stdin);
     scanf("%c",&res);
    }

     while(res=='y'||res=='Y');

    return 0;
}

void screenheader() {
    
   printf("\n                       :::::::::::::::::::::::::::::::::::::");
   printf("\n                       ::                                 ::");
   printf("\n                       ::     @@@@@@@@@@@@@@@@@@@@@@@     ::");
   printf("\n                       ::     @                     @     ::");
   printf("\n                       ::     @                  @     ::");
   printf("\n                       ::     @      BEM-VINDO      @     ::");
   printf("\n                       ::     @                     @     ::");
   printf("\n                       ::     @                     @     ::");
   printf("\n                       ::     @@@@@@@@@@@@@@@@@@@@@@@     ::");
   printf("\n                       ::                                 ::");
   printf("\n                       :::::::::::::::::::::::::::::::::::::\n\n");
   }


   void intro()
 {
   printf("\n\t             Avenida Almirantes Reis, Cidade Lisboa,\n\t\t\t\t Portugal ");
   printf("\n\n                              TEL. No.:211-272239");
   printf("\n\n\n                                      OLÁ");
   printf("\n\n\n\tEste Hotel de 5 Estrelas em pleno coração de Lisboa está preparado para lhe oferecer toda a comodidade e transformar a sua visita numa estadia memorável. Com uma vista magnífica e extensos jardins ao ar livre, provaremos que este é o seu destino de sonho para qualquer amante de viagens.");
   printf("\n\n\tO Hotel tem os quartos diversificadamente decorados para que possa escolher aquele que se adequa mais a si. Se viaja em negócios o Corinthias Hotel estará preparado para satisfazer todas as suas necessidades de forma cómoda como se de uma viagem de lazer se tratasse.Todos os quartos estão equipados com ar condicionado.");
   printf("\n\n                             DISFRUTE das nossas condições!\n");
   printf("\n\t\t\t1. Serviço de Quartos 24h/dia.\n");
   printf("\t\t\t2. 12 Elevadores.\n");
   printf("\t\t\t3. 2 Parques de estacionamento.\n");
   printf("\t\t\t4. Segurança 24h\n");
   printf("\t\t\t5. Piscina de Água quente e fria.\n");
   printf("\t\t\t6. Serviço de Internet Gratuito.\n");
   printf("\t\t\t7. Serviço de lavandaria 24h.\n");
   printf("\t\t\t8. Passeio Turístico pela Cidade.\n");
   printf("\nPressione uma Tecla para continuar:");
   getchar();
 }



 void inserirCliente() {

     FILE *fp;
     system("cls");
     short numFirst;
     char confirm, c;
     int n, i;

     printf("\nQuantos registos pretende adicionar?");
     scanf("%d", &n);

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

         printf("\n\n******************************** Novo Cliente *******************************************");
     

    fp = fopen("clientes.dat", "a+b");

    if (fp==NULL) {

        printf("\nErro!\nO ficheiro não foi aberto.");

    }

    printf("\nDigite os dados do Novo Cliente: ");

    printf("\nNome: ");
    fflush(stdin);
    gets(cli.nome);

    printf("\nIdade: ");
    fflush(stdin);
    scanf("%d", &cli.idade);

    printf("\nNúmero Cartão de Crédito: ");
    fflush(stdin);
    scanf("%lf", &cli.cc);

    printf("\nTelefone: ");
    fflush(stdin);
    scanf("%lf", &cli.tlf);

    printf("\nNIF: ");
    fflush(stdin);
    scanf("%lf", &cli.nif);

    printf("\nConfirma a inserção de todos os novos dados? (s/n) ");


    while (confirm == 'S' || confirm == 's') {

        fp = fopen("clientes.dat", "a");
        if(!fp) {

        printf("\nErro no acesso aos dados!\n\nDigite nova tecla para encerrar o programa.");
        exit(0);
        }

    fwrite(&cli, sizeof(cli), 1, fp);
    fclose(fp);

    printf("\nO Novo Cliente foi inserido com sucesso!");

    }
        while (confirm == 'n' || confirm == 'N') {

            printf("\nA Inserção dos Novos dados foi cancelada.");
        }

    printf("\n\nPrima ENTER para voltar ao Menu Inicial");
    fflush(stdin);
    getchar();
     }

 

void listarCliente(){

    system("cls");
    
    printf("\n****************************************** Lista de Clientes ******************************************");
    
    fp = fopen("clientes.dat", "r");

    while (fread(&cli, sizeof(cli), 1, fp))

    {
          printf("\n\nNúmero: %lf", cli.numero);
          printf("\nNome: %s", cli.nome);
          printf("\nIdade: %d", cli.idade);
          printf("\nNovo Cartão de Crédito: %lf", cli.cc);
          printf("\nTelefone: %lf", cli.tlf);
          printf("\nNIF: %lf", cli.nif);
    }

    fclose(fp);
    
    printf("\n\nPrima ENTER para voltar ao menu ..");
    fflush(stdin);
    getchar();
}


void editarCliente()

{

    int i, reg, numCliente;
    short iFound = 0;
    char confirm;
    
    system("cls");
    
    printf("\n********************************************* Editar Cliente *********************************************");
    
    fp = fopen("clientes.dat", "r+");
    
    if (!fp)
    {
        printf("\nErro no acesso aos dados!\nDigite uma tecla para terminar o programa.");
        i = getchar();
        exit(0);
    }
    
    printf("\n\nIntroduza o número de cliente que pretende Editar: ");
    scanf("%d", &numCliente);
    
    reg = 0;

    while (fread(&cli, sizeof(cli), 1, fp))
    {
        if (cli.numero == numCliente){
            
            iFound = 1;

         
          printf("\nNome: %s", cli.nome);
          printf("\nIdade: %d", cli.idade);
          printf("\nTelefone: %lf", cli.tlf);
          printf("\nNIF: %lf", cli.nif);

          printf("\n\nNovo Nome: ");
          fflush(stdin);
          gets(cli.nome);

          printf("\nNova Idade: ");
          fflush(stdin);
          scanf("%d", &cli.idade);

          printf("\nNovo Cartão de Crédito: ");
          fflush(stdin);
          scanf("%lf", &cli.cc);

          printf("\nNovo Telefone: ");
          fflush(stdin);
          scanf("%lf", &cli.tlf);

          printf("\nNovo Nif: ");
          fflush(stdin);
          scanf("%lf", &cli.nif);

          printf("\nConfirma alteração dos dados (s/n) ? ");
          fflush(stdin);
          confirm = getchar();

          while (confirm == 's'){

          fseek(fp, reg*sizeof(cli), SEEK_SET);
          fwrite(&cli, sizeof(cli), 1, fp);
          fclose(fp);
          printf("\nCliente alterado com sucesso !");
          }
    }
        reg++;
  }

      fclose(fp);

          if (iFound == 0){

        printf("\nO Cliente não foi encontrado.");

        printf("\n\nPrima ENTER para voltar ao menu ..");
        fflush(stdin);
        getchar();
}
}


void eliminarCliente(void){
    
    FILE *temp;
    int i;
    double numCliente;
    short deleted = 0;
    char confirm;

    system("cls");
    
    printf("\n******************************************* Eliminar Cliente *******************************************");
    
    printf("\n\nIntroduza o Número de Cliente que pretende Eliminar: ");
    scanf("%lf", &numCliente);

    fp = fopen("alunos.dat", "r");
    
    if (!fp){
        printf("\nErro no acesso aos dados!\nPrima uma tecla para terminar o programa.");
        i = getchar();
        exit(0);
    }

    temp = fopen("temp.dat", "a");

    if (!fp){
            printf("\nErro no acesso aos dados!\nPrima uma tecla para terminar o programa.");
            i = getchar();
            exit(0);
    }

    while (fread(&cli, sizeof(cli), 1, fp)){        

        if (cli.numero != numCliente)
            fwrite(&cli, sizeof(cli), 1, temp);

        else {

            printf("\nConfirma a eliminação do Cliente Nº: %lf - %s ? (s/n) :", cli.numero, cli.nome);
            fflush(stdin);
            confirm = getchar();
            
            if (confirm == 's'){
                deleted = 1;
            }
            else
            {
                printf("\nEliminação cancelada!");
                deleted = -1;
                break;    
            }
        }    
        fflush(stdin);
    }
    
    fclose(fp);
    fclose(temp);
    
            if (deleted == 1){
            remove("clientes.dat");
            rename("temp.dat", "clientes.dat");
            printf("\nCliente eliminado !");
            }

            else if (deleted == 0)

            printf("\nCliente não encontrado.");
            else if(deleted == -1)
            remove("temp.dat");
        
            printf("\n\nPrima ENTER para voltar ao Menu Inicial");
            fflush(stdin);
            getchar();
}

void pesquisarCliente(){

    int numCliente;
    short found = 0;
    
    system("cls");
    
    printf("\n******************************************* Pesquisar Cliente *******************************************");
    
    printf("\n\nIntroduza o Nº de Cliente: ");
    scanf("%d", &numCliente);
    
    fp = fopen("clientes.dat", "rb");
    
    while ((fread(&cli, sizeof(cli), 1, fp) == 1)){

        
            printf("\nNúmero: %lf", cli.numero);
            printf("\nNome: %s", cli.nome);
            printf("\nCartão de Crédito: %lf", cli.cc);
            printf("\nTelefone: %lf", cli.tlf);
            printf("\nNIF: %lf", cli.nif);
            found = 1;
            break;
            }
        
            fclose(fp);

        printf("\nO Cliente não foi encontrado.");    
    
    printf("\n\nPrima ENTER para voltar ao Menu Inicial");
    fflush(stdin);
    getchar();
}

}

 

Link to comment
Share on other sites

/tmp/ccm3ISix.o: In function `inserirCliente':
main.c:(.text+0x3a0): warning: the `gets' function is dangerous and should not be used.
/tmp/ccm3ISix.o: In function `main':
main.c:(.text+0xba): undefined reference to `pesquisarCliente'
main.c:(.text+0xc6): undefined reference to `listarCliente'
main.c:(.text+0xde): undefined reference to `editarCliente'
main.c:(.text+0xea): undefined reference to `eliminarCliente'
collect2: error: ld returned 1 exit status
 

Link to comment
Share on other sites

Aproveito para deixar aqui as mensagens de erro dadas pelo clang, que é um pouco mais restritivo na interpretação do standard do C.

Citação

main.c:204:21: error: function definition is not allowed here
void listarCliente(){
                    ^
main.c:233:1: error: function definition is not allowed here
{
^
main.c:317:27: error: function definition is not allowed here
void eliminarCliente(void){
                          ^
main.c:392:24: error: function definition is not allowed here
void pesquisarCliente(){
                       ^
4 errors generated.

 

Sugiro-te que tentes também indentar devidamente o código (há ferramentas que fazem isso automaticamente por ti).  Penso que o teu erro se tornará óbvio (em geral, ter o código indentado correctamente ajuda a prevenir erros).

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.