Ir ao conteúdo

Posts recomendados

Postado

Olá estou com um trabalho da faculdade para fazer porém não consigo ordenar em ordem alfabética uma struct que está armazenada em um arquivo.dat.

Preciso ordenar o arquivo para depois realizar uma busca binária para autenticar o login dos usuários no sistema. Alguém por favor pode me ajudar nessa ordenação o mais rápido possível?

 

Segue o meu código abaixo:

=============================================================================================

/* Bibliotecas */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#include <string.h>
#include <ctype.h>

/* Tipos pré-definidos (definição dos registros) */

typedef    struct              
{
    char   nome[45];
    char   prontuario[10];   
} reg;


//VARIÁVEIS GLOBAIS
reg usuario[75];
int tamanho; //para passar como parametro na ordenação (tamanho do vetor de struct = 75)


/* Protótipos de funções */
void    insertionSort (reg *usuario, int tamanho);
void    captura_usuario(void);    
void    grava_usuario(void);    
void    cadastra_usuario(void);    
void    consulta_usuario(void); 
void    admin (void);

/* Construçao das funçoes */

void insertionSort (reg *usuario, int tamanho)      //tamanho = 75
{
    int i, j;
    reg aux;
    
    FILE *Arq;
    FILE *Arqtemp;
    
    Arq = fopen("USUARIOS.DAT","r");
    
    for (i=0; i<tamanho; i++)
    {
        fgets (usuario.nome,45,Arq);
        fgets (usuario.prontuario,10,Arq);
    }
    
    //criando outro arquivo para ordenar
    Arqtemp = fopen("USUARIOSORD.DAT","w");
    
    //ordenando as informações do arquivo
    
    /*
        saída strcmp(str1,str2)
        ==0 : str1 igual a str2
        > 0 : str1 vem depois que str2 (str1 é maior que str2)
        < 0 : str1 vem antes que str2 (str1 é menor que str2)
    */
    
    //INSERTION SORT
    for (i = 1; i < 75; i++)
    {
        aux = usuario;
        for (j=i; (j>0) && (strcmp (aux.nome, usuario[j-1].nome)<0); j--)
        {
            usuario[j] = usuario[j-1];    
        }
        usuario[j] = aux;
        
    }
   

    fclose (Arqtemp);
    fclose (Arq);
    
    /* Deleta o .DAT */
    system ("DEL  USUARIOS.DAT");
    /* Renomeia o arquivo ordenado para .DAT */
    system ("REN  USUARIOSORD.DAT USUARIOS.DAT");
}

 

void captura_usuario (void)
{
    int    indice;
    int i;
    char resp;
    
    for(i=0; resp != 'n' && resp != 'N'; i++)
    {
        system ("cls");    
        printf ("\nNome: ");
        fflush (stdin);
        gets(usuario.nome);
        _strupr(usuario.nome);
        
        printf ("\nProntuário: ");
        fflush (stdin);
        gets(usuario.prontuario);
        _strupr(usuario.prontuario);
        
        printf ("Quer registrar outro usuário?");
        fflush (stdin);
        resp = getche();
    }
}    

void    grava_usuario(void)
{
  char resposta;
  FILE *Arq;
  /* Verifica se é para gravar ou não */
    printf ("\n ================================================");
    printf ("\n Deseja gravar este registro? [n/N = nao]");
    fflush (stdin); 
    resposta = getche();
    /* se deseja gravar... (resposta != não) */    
    if ( resposta != 'n' && resposta != 'N' ) /* ... para gravar */
    {
        Arq = fopen ( "USUARIOS.DAT" , "a" );   /* Abro o arquivo */
        fflush (stdin);
        fwrite ( &usuario , sizeof(usuario), 1, Arq);   /* grava no arquivo */
        fclose (Arq);  /* Fecha o arquivo */
    }
}

void  cadastra_usuario ( void )         
{
    captura_usuario();
    grava_usuario();
}

void consulta_usuario(void)
{
  insertionSort (usuario, 75);   //EU ESTOU EM DÚVIDA DE COLOCAR A FUNÇÃO DE ORDENAÇÃO, NÃO SEI SE É AQUI MESMO
  
  FILE *Arq;
  int i;
  
  Arq = fopen ( "USUARIOS.DAT" , "r" );   /* abrir arquivo */
  while ( !feof(Arq) ) /* enquanto não for fim do arquivo...*/
  {
       fread ( &usuario, sizeof(usuario), 1, Arq); /*...lê e...*/
       

       if ( !feof(Arq) )
       {
            for(i=0; i<75; i++)
            {
            printf ("\n %5s \t %5s",usuario.prontuario,usuario.nome);    
            }
       }        
  }
  fclose (Arq);/* fecha arquivo */
    getch();
}

void    admin (void)
{   
  char  opc;
  do
  {
    /* Captura a opção desejada */    
        do
    {   system ("cls");
        printf ("\n=================== SISTEMA GERENCIADOR DE SUPERMERCADO ==================");
        printf ("\n                    1. Abastecer Gôndolas");
        printf ("\n                    2. Caixa/PDV");
        printf ("\n                    3. Gerenciar usuários");
        printf ("\n                    0. SAIR");    
        printf ("\n==========================================================================");
        printf ("\n                Escolha: "); fflush(stdin); opc = getche();
    }
    while ( opc != '1' && opc != '2' && opc != '3' &&  opc != '0');
    /* dependendo da opção, faz uma das operaçoes */
    switch ( opc )
    {
        case '1' : printf ("Abastecer Gôndolas - Tem que fazer ainda"); getch();                 break;    
        case '2' : printf ("Caixa/PDV - Tem que fazer ainda");         getch();                  break;          
        case '3' :  
                    do
                    {   system ("cls");
                        printf ("\n=================== GERENCIAMENTO DE USUÁRIOS ==================");
                        printf ("\n                    1. Cadastro de usuários");
                        printf ("\n                    2. Consulta de usuários");
                        printf ("\n                    3. Alterar registro de usuário");
                        printf ("\n                    4. Excluir registro de usuário");
                        printf ("\n                    0. VOLTAR");    
                        printf ("\n================================================================");
                        printf ("\n                Escolha: "); fflush(stdin); opc = getche();
                    }
                    while ( opc != '1' && opc != '2' && opc != '0');
                    /* dependendo da opção, faz uma das operaçoes */
                    switch ( opc )
                    {
                        case '1' : cadastra_usuario();                  break;    
                        case '2' : consulta_usuario();                  break;          
                        //case '3' : altera_registro();                   break;
                        //case '4' : deleta_registro();                   break;
                        case '0' : admin();                             break;        
                    } break;                          
        
        case '0' : exit(0); break;        
    } 
 }
 while ( opc != '0');
}

main()
{   
    setlocale (LC_ALL, "");
    admin ();    
}

 

  • Curtir 1
Postado

mano ta meio doido seu codigo você pode fazer sua funcao admin assim 

void admin() {
  int opc;
  int opc2;
      system("cls");
      printf("\n=================== SISTEMA GERENCIADOR DE SUPERMERCADO ==================");
      printf("\n                    1. Abastecer Gôndolas");
      printf("\n                    2. Caixa/PDV");
      printf("\n                    3. Gerenciar usuários");
      printf("\n                    0. SAIR");
      printf("\n==========================================================================");
    switch (opc) {
    case 1:
      printf("Abastecer Gôndolas - Tem que fazer ainda");
      break;
    case 2:
      printf("Caixa/PDV - Tem que fazer ainda");
      break;
    case 3:
        system("cls");
        printf("\n=================== GERENCIAMENTO DE USUÁRIOS ==================");
        printf("\n                    1. Cadastro de usuários");
        printf("\n                    2. Consulta de usuários");
        printf("\n                    3. Alterar registro de usuário");
        printf("\n                    4. Excluir registro de usuário");
        printf("\n                    0. VOLTAR");
        printf("\n================================================================");
    
	  switch (opc2) {
      case 1:
      	system("cls");
        cadastra_usuario();
        break;
      case 2:
      	system("cls");
        consulta_usuario();
        break;
        case 2:
      	altera_registro();
        deleta_registro();
      case 0:
      	system("cls");
        admin();
    }
  }
}

main() {
  setlocale(LC_ALL, "");
  admin();
}

 

adicionado 6 minutos depois

evite usar 2 funçoes em1 tipo captura usuario e guarda usuario. junte as 2 em cadastra usuario 

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!