Ir ao conteúdo
  • Cadastre-se

C Ordenação em C Banco de dados


Posts recomendados

Olá, alguém poderia me ajudar? Tenho que fazer um projeto, mas n faço ideia de como. Preciso ordenar os nomes das peças em ordem alfabética. Como é trabalhado em banco de dados n sei muita coisa sobre. Isso é o que eu fiz só precisa do ordenação; 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct pecas
 {
     char nome[34];
     int codigo;
     float valor;
     int e;
     int quantidade, quant, conf, totalquant;
 }  f;

FILE *fptr;
FILE *fptrvendas;
FILE *fptrback;
FILE *fptraux;
int codigovendas, quanti;


 void cadastro();
 void ordenacao();


int main()
{
  char opc;

  do
  {   system("cls");
      printf("\n  1 - Cadastro de peca");
      printf("\n  8 - Ordenacao");
       printf("\n  p - Sair ");
      printf("\n Opcao: ");
      opc=getche();
      switch (opc)
        {
            case '1':  cadastro();
                       break;
           
           case '8':  ordenacao();
                       break;
            
            case 'p': printf("\n\nSaindo...\n");
                       break;
            default :  printf("\n Opcao %c invalida", opc);
                       getch();
                       break;
        }

  } while (opc!='p');
return 0;
}



void cadastro()
  { char op;
    if ((fptr=fopen("pecas.dados", "rb+"))==NULL)
        {if ((fptr=fopen("pecas.dados", "wb"))==NULL)
            {   printf("\n Erro");
                exit(1);
            }
        }
    do
    {
        printf("\n Entre com os dados para o cadastro de pecas \n");
        printf("\n Nome: ");
        setbuf(stdin, NULL);
        scanf("%[^\n]",f.nome);
        printf("\n Codigo: ");
        scanf("%d",&f.codigo);
        printf("\n Valor: ");
        scanf("%f", &f.valor);
        printf("\n Quantidade: ");
        scanf("%d", &f.quantidade);
        f.e=0;
        fseek(fptr,0,2);
        fwrite(&f,sizeof(f),1,fptr);
        printf("\n Deseja cadastrar outro (S/N): ");
        op=getche();

    } while ((op!= 'N') && (op!='n')); ((op=='S')||(op=='s'));
    fclose(fptr);
  }





 void ordenacao()
  {
      
    if ((fptr=fopen("pecas.dados", "rb"))==NULL)
            {   printf("\n Erro");
                exit(1);
            }

        

  }

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

9 horas atrás, AmandaEstella disse:

void ordenacao()
  {
      
    if ((fptr=fopen("pecas.dados", "rb"))==NULL)
            {   printf("\n Erro");
                exit(1);
            }

        

  }

se voce tiver os dados armazenados nas variaveis é mais pratico voce escolher um método de ordenação, ordenalos e gravar na saída.

Link para o comentário
Compartilhar em outros sites

7 horas atrás, AmandaEstella disse:

Preciso ordenar os nomes das pecas em ordem alfabética como é trabalhado em banco de dados n sei muita coisa sobre. Isso é o que eu fiz so precisa do ordenação

 

Em banco de dados você cria a tabela com os campos, define os campos pelos quais quer ordenar como chaves e, na hora de ler, no select acrescenta ORDER BY no final. Só isso.

 

Se o que está dizendo nada tem a ver com bancos de dados eu postei uma função dias atrás em C e que até roda em C++ que faz isso enquanto lê do arquivo, usando uma variação do que é conhecido por insertion sort, aquele bem ingênuo que vai, claro, inserindo na ordem, como uma criança faria.

 

Eis um código para inserir o registro R na tabela CSV. Pode adaptar em minutos para o seu caso. Sugiro ler com calma e entender como funciona. 

int     insere_registro(Registro* R, CSV* csv)
{
    int pos = csv->N;
    for (; pos > 0; pos = pos - 1)
    {
        if (csv->R[pos - 1].ispb > R->ispb)
            csv->R[pos] = csv->R[pos - 1];
        else
            break;
    };
    // achou o lugar
    csv->R[pos] = *R;
    csv->R[pos].ispb = R->ispb;
    csv->R[pos] = *R;
    csv->N += 1;
    return csv->N;
};

Eis a ideia:

  • você olha do fim pro começo procurando o lugar pra colocar o novo
  • se o que está vendo na tabela é maior você vai puxando pra cima abrindo lugar para o novo
  • quando sair do loop pos vai marcar o lugar certo e você copia o novo para lá. Insertion Sort.

Sobre seu programa

  • Use aquele botão <> neste forum para colocar seu código dentro de um formulário, como está vendo aqui neste tópico. Assim facilita para alguém copiar para testar e tentar te ajudar.
     
  •  Não use menus para testar seu programa. Só coloque isso depois que estiver funcionando. Só perde tempo assim. E perde muito tempo.
     
  • main() deve ser SEMPRE a primeira função de seu programa. Use protótipos e declare as funções no início SEM nomes para os argumentos/ E use argumentos...
     
  • Escreva seu programa em torno dos dados. Sempre.
     
  • NUNCA use variáveis globais. É um problema e vai sempre dar errado. Por alguma razão os autores recomendam não usar. Ou deveriam. Os professores recomendam não usar. Ou deveriam. Empresas proíbem.
     
  • Se usa função retorna void perde uma oportunidade de no mínimo retornar uma condição de erro. Se ela não tem argumentos em geral quer dizer que está usando uma variável global e é uma bobagem.
     
  • Use typedef para dar um nome às suas estruturas. Assim é mais legível e evita o inferno de ter que digitar struct coisa x toda hora.
     
  • NUNCA declare nada num struct. Se copiar para outro arquivo a declaração vai junto. E fica difícil de achar. Veja o f solitário no seu programa...
     
  • Use uma convenção para seus tipos, como a primeira letra maiúscula como é costume  em java, ou algum padrão tipo um prefixo ST_ ou sei lá, pra você saber quando lê que é um tipo e não uma variável qualquer

Ao invés de 

struct pecas
 {
     char nome[34];
     int codigo;
     float valor;
     int e;
     int quantidade, quant, conf, totalquant;
 }  f;

Entenda que seria bem melhor, se fosse usar assim, declarar a struct como f e a variável como pecas. Pense bem: no programa vai usar um nome bobinho como f toda hora? junto com todas aquelas variáveis de uma letra?

Não ficaria melhor escrever

	pecas.codigo = 324;

do que

	f.valor = 34.56;
  • Não declare mais de uma variável por linha. C não cobra por linha de programa. E depois é um inferno você ficar procurando onde está a declaração de conf por exemplo. E quando tem ponteiros e valores é o d!@80 também.
    Veja
int a,* e, c=0;
int d=22, f = 300, coisa = 3;

E compare

int 	a = 0;
int	c = 0; // sempre inicialize tudo
int	coisa = 22; 
int 	d=22, 
int*	e = NULL; // o tipo de e eh int*
int	f = 300; 

E veja como é mais simples achar as coisas, descobrir o tipo de algo e tal.

 

E que assim

typedef struct
{
	char   nome[34];
	int    codigo;
	float  valor;
	int    e;
	int    quantidade;
	int    quant;
	int    conf;
	int    totalquant;
 } 	Peca;

// e depois em main()

Peca	pecas[300]; // plural :) afinal sao 300
Peca	uma_peca;
Peca*	estoque = pecas;

estaria bem melhor.

 

  • Tem certeza de que faz sentido ter um campo quant, um campo quantidade e um campo totalquant no mesmo registro??? E não teria um nome mais expressivo para e? Vai lembrar do que é e daqui a 4 dias? 40 dias? 🤔
     
  • E veja que a struct define uma peca e não várias, de modo que o plural não se aplica :) 
  • Quando você declara uma função void cadastra() quase sempre está errado.

    Veja a diferença
int res = cadastra(&uma_peca, estoque);

e você já imagina que cadastra vai retornar algum status e vai inserir uma peça em um estoque. No mínimo já deu pra ver que pode ter mais de um estoque, por exemplo...

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

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...