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

action

Ordenar por nomes

2 mensagens neste tópico

ola a todos tou a fazer este programa com e nao sei como fazr para ordenar os utentes por apelido ou pelo codigo de utilizador se me puderesm ajudar agradecia

obrigado desde ja

# include <stdio.h>
# include <string.h>
# include <conio.h>
# include <stdlib.h>   /* função exit  */
# include <ctype.h>    /* função toupper  */

# define FICH " Dados.Dat"   /* Ficheiro com os dados  */

# define OP_INSERIR          '1'
# define OP_ALTERAR          '2'
# define OP_APAGAR           '3'
# define OP_LISTAR           '4'
# define OP_PESQUISAR        '5'

# define OP_SAIR             '0'

# define OP_PESQ_APELIDO        '2'

char *MainMenu[]={
    "1. Inserir Registo",
    "2. Alterar Registo",
    "3. Apagar Registo",
    "4. Listar Registos",
    "5. Pesquisas",
    "0. Sair",
    NULL      /* Acabaram as Opções */
    };

char *PesqMenu[]={
    "1. Pesquisar por Intervalo de Idades",
    "2. Pesquisar por Apelido",
    "0. Voltar",
    NULL        /* Acabaram as Opções */
    };

FILE *fp; /* Variável Global pois é útil ao longo do prog. */


typedef struct{
               int nbi, Ano1, Mes1, Dia1, Ano2, Mes2, Dia2, Ano3, Mes3, Dia3;
               char Nac[30];
               }BI;
typedef struct Pessoa{
       char Nome[30], Apelido[30], rua[100], residencia[15], codigo[8], localidade[30], email[60], obs[100], estado[10];
       int cod_id;
       int datad, Anoad, Mesad, Diaad;
       int telef;
       BI identidade;
       char Status;
       }PESSOA;       
       void Mensagem(char *msg);

       void Ler_Pessoa(PESSOA *p)
       {
            printf("Nome               : "); gets(p->Nome);
            printf("Apelido            : "); gets(p->Apelido);
            printf("Nº Telefone        : "); scanf("%d",&p->telef);
            getchar();
            printf("Rua                : "); gets(p->rua);
            printf("Residencia         : "); gets(p->residencia);
            printf("Localidade         : "); gets(p->localidade);
            printf("Codigo Postal      : "); gets(p->codigo);
            printf("e_mail             : "); gets(p->email);
            printf("Nº B.I.            : "); scanf("%d",&p->identidade.nbi);
            getchar();
            printf("Data de Emissao    : "); scanf("%d/%d/%d",&p->identidade.Ano1,&p->identidade.Mes1,&p->identidade.Dia1);
            getchar();
            printf("Data de Validade   : "); scanf("%d/%d/%d",&p->identidade.Ano2,&p->identidade.Mes2,&p->identidade.Dia2);
            getchar();
            printf("Data de Nascimento : "); scanf("%d/%d/%d",&p->identidade.Ano3,&p->identidade.Mes3,&p->identidade.Dia3);
            getchar();
            printf("Nacionalidade      : "); gets(p->identidade.Nac);
            printf("Data de Inscriçao  : "); scanf("%d/%d/%d",&p->Anoad,&p->Mesad,&p->Diaad);
            getchar();
            printf("Estado             : "); gets(p->estado);
            printf("Observaçoes        : "); gets (p->obs);

            p->Status=' ';
            fflush(stdin);
            }

        void Mostrar_Pessoa(PESSOA p)
        {
             printf("Nome                  : %s",p.Nome);
             printf("\nApelido             : %s",p.Apelido);
             printf("\nNº Telefone         : %d",p.telef);
             printf("\nRua                 : %s",p.rua);
             printf("\nResidencia          : %s",p.residencia);
             printf("\nLocalidade          : %s",p.localidade);
             printf("\nCodigo Postal       : %s",p.codigo);
             printf("\ne_mail              : %s",p.email);
             printf("\nNº B.I.             : %d",p.identidade.nbi);
             printf("\nData de Emissao     : %d/%d/%d",p.identidade.Ano1,p.identidade.Mes1,p.identidade.Dia1);
             printf("\nData de Validade    : %d/%d/%d",p.identidade.Ano2,p.identidade.Mes2,p.identidade.Dia2);
             printf("\nData de Nascimento  : %d/%d/%d",p.identidade.Ano3,p.identidade.Mes3,p.identidade.Dia3);
             printf("\nNacionalidade       : %s",p.identidade.Nac);
             printf("\nData de Inscriçao   : %d/%d/%d",p.Anoad,p.Mesad,p.Diaad);
             printf("\nEstado              : %s",p.estado);
             printf("\nObservaçoes         : %s",p.obs);
             printf("\nCodigo de Utilizador: %d",rand() % 99999);
            }



void Mensagem(char *msg);


/* Lê os dados de um registo introduzidos pelo utilizador */



/* Adiciona uma Pessoa ao Ficheiro */
void Adicionar_Pessoa(PESSOA p)
{
    fseek(fp, 0L, SEEK_END);
    if (fwrite(&p,sizeof(p),1,fp)!=1)
    Mensagem("Adicionar Pessoa: Falhou a escrita do Registo");
}

/* Coloca uma mensagem no ecrã */     
void Mensagem(char *msg)
{
    printf(msg);
    getchar();
    }

/*
* Verifica se o Ficheiro já existe. Se não existir cria-o
* Se já existir, abre-o em Modo de Leitura e Escrita (r+b)
*/     

void Inic()
{
    fp=fopen(FICH,"r+b");   /* Tentar Abrir */
    if (fp==NULL)
    {
                 fp=fopen(FICH, "w+b"); /* Criar Ficheiro */
                 if(fp==NULL)
                 {
                 fprintf(stderr,"ERRO FATAL: Impossível Criar Ficheiro de Dados\n");
                 exit(1);
                 }
    }
}

/*
* Faz um Menu Simples com as opções do vector de Strings.
* Selecciona a opção, usando o 1º carácter de cada string.
* Devolve o primeiro carácter da opção
*/                   
char Menu(char *Opcoes[])
{   int i;
   char ch;

         while (1)
         { /* Cls */
         printf("\n\n\ 1.Inserir Registo\n 2. Alterar Registo\n 3. Apagar Registo\n 4. Listar Registos\n 5. Pesquisas\n 0. Sair");

               printf("\n\n\t\tOpcao: ");
               ch = getchar(); fflush(stdin);
               for (i=0; Opcoes[i]!=NULL; i++)
               if(Opcoes[i][0]==ch)
               return ch;
               }
    }

void Inserir_Pessoa()
{ PESSOA x;
    Ler_Pessoa(&x);
    Adicionar_Pessoa(x);
}

void Alterar_Pessoa()
{ PESSOA x;
    long int n_reg;
    printf("Qual o Nº do Registo: ");
    scanf("%ld",& n_reg);fflush(stdin);
    if (fseek(fp,(n_reg-1)*sizeof(PESSOA),SEEK_SET)!=0)
    {
    Mensagem("Registo Inexistente ou Problemas no posicianamento!!!");
    return;
    }
    if(fread(&x,sizeof(PESSOA),1,fp)!=1)
    {
    Mensagem("Problemas na Leitura do Registo!!!");
    return;
    }

    if(x.Status=='*')
    {
    Mensagem("Um Registo Apagado não pode se alterado!!!\n\n");
    return;
    }

    printf("\n\nDados Actuais\n\n");
    Mostrar_Pessoa(x);
    printf("\n\nNovos Dados\n\n");
    Ler_Pessoa(&x);

    // Recuar um Registo no Ficheiro
    fseek (fp,-(long) sizeof(PESSOA),SEEK_CUR);
    // Reescrever o Registo;
    fwrite(&x,sizeof(PESSOA),1,fp);
    fflush(fp);   /* Despejar os Dados no Disco Rígido */
    }

void Apagar_Pessoa()
{ PESSOA x;
    long int n_reg;
    char resp;

    printf("Qual o Nº do Registo:");
    scanf("%ld", & n_reg);fflush(stdin);
    if (fseek(fp, (n_reg-1)*sizeof(PESSOA),SEEK_SET)!=0)
    {
    Mensagem("Registo Inexistente ou Problemas no posicionamento!!!");
    return;
    }
    if (fread(&x,sizeof(PESSOA),1,fp)!=1)
   {
    Mensagem("Problemas na Leitura do Registo!!!");
    return;
    }

    if(x.Status=='*')
    {
    Mensagem("Registo ja esta Apagado!!!\n\n");
    return;
    }

    printf("\n\nDados Actuais\n\n");
    Mostrar_Pessoa(x);
    printf("\n\nApagar o Registo (s/n)???: "); resp=getchar();
    fflush(stdin);
    if(toupper(resp)!='S') return;

    x.Status='*';
    // Recuar um Registo no Ficheiro
    fseek(fp,-(long) sizeof(PESSOA),SEEK_CUR);
    // Reescrever o Registo;
    fwrite(&x,sizeof(PESSOA),1,fp);
    fflush(fp); /* Despejar os Dados no Disco Rigido */
}

void Listar()
{ long int N_Linhas =0;
    PESSOA reg;
    rewind(fp);
    while(1)
    {
            if (fread(&reg,sizeof(reg),1,fp)!=1)break; /* Sair do Ciclo */
            if (reg.Status=='*')continue; /* Passa ao próximo */
            Mostrar_Pessoa(reg);
            N_Linhas++;
            if (N_Linhas%20==0)
            Mensagem ("PRIMA <ENTER> para continuar...");
            }
            Mensagem("\n\nPRIMA <ENTER> para continuar..."); /* No fim da Listagem */
            }



void Pesquisar_Apelido(char *s)
{ PESSOA reg;
    rewind(fp);

    while(fread(&reg,sizeof(PESSOA),1,fp))
    if(reg.Status!='*'  &&  strstr(reg.Apelido,s))
    Mostrar_Pessoa(reg);

    Mensagem("\n\nPRIMA <ENTER> para continuar..."); /* No fim da Listagem */
    }



main()
{
char Opcao;
Inic();
       while((Opcao=Menu(MainMenu))!=OP_SAIR)
       switch(Opcao)
       {
                 case OP_INSERIR: Inserir_Pessoa(); break;
                 case OP_ALTERAR: Alterar_Pessoa(); break;
                 case OP_APAGAR: Apagar_Pessoa(); break;
                 case OP_LISTAR: Listar(); break;
                 case OP_PESQUISAR:
                      while((Opcao=Menu(PesqMenu))!=OP_SAIR)
                      switch (Opcao)
                      {


                     case OP_PESQ_APELIDO:
                          { char string[bUFSIZ+1];
                          printf("Qual o Apelido a Procurar: ");
                          gets(string);fflush(stdin);
                          Pesquisar_Apelido(string);
                          }
                     }
       }
                 system("pause");
                 }
 
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cara vou te dar um conselho que o meu prof. me deu!

Quando Cria esses tipos de programa, seria melhor que em vez de toda a hora que queres mexer no com o ficheiro seja ele binário ou texto faz o seguinte:

Cria duas funções.

1º- Para ler todos os elementos do ficheiro e incia quando abre o teu programa! (modo abertura ficheiro "r" ou "rb")

2º- Para Guardar todas as alterações que fizeste ao longo da abertura do programa e depois quando estiveres a sair do programa volta a gravar no ficheiro. (modo abertura ficheiro "w" ou "wb")

Espero que ajude! abraços.

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