Ir ao conteúdo
  • Cadastre-se

C Algum experiente pode ver se o código esta certo.


jorge.b

Posts recomendados

Olá, estou a fazer um trabalho para a faculdade, que basicamente gerencia produtos clientes e encomendas. Tudo isto usando Listas duplamente ligadas.

Eu estava a tentar avançar no trabalho mas não tenho a certeza se o código que fiz para inserir produtos está a funcionar.

Gostaria que algum experiente me ajudasse.
Obrigado desde já!

 

o código é o seguinte:

 

int add_Produto(ELEM **iniList, ELEM **fimList,INFO produto ,INFO newinfo){

    ELEM *novo=NULL;

    FILE *fp=NULL;

    ELEM *atual= *iniList;

 

    novo=(ELEM *) calloc(1,sizeof(ELEM));

 

    if(novo==NULL){

        printf("\nOut of memory!");

        return -1 ;

    }

   

    fp=fopen("Produtos_Catalogo","ab");

 

    if(fp==NULL){

        printf("\nErro ao abrir o ficheiro!");

        return -1 ;

    }

 

   

    printf("\n---Dados do novo produto---");

    printf("\nCodigo: ");

    scanf("%d",&newinfo.cod);

   

   

    rewind(fp);//ter a certeza que começa a ler de cima

 

    while(fread(&produto,sizeof(INFO),1,fp)==1){ //vai percurar todos os preenchidos no ficheiro binário

        if(newinfo.cod==produto.cod){

            printf("\n Ja ha um produto com esse coidgo!");

            return -1;

        }

    }

    printf("\nNome: ");

    scanf(" %s", newinfo.nomeprod);

    printf("\nDescricao: ");

    scanf(" %s", newinfo.descricao);

    printf("\nPreco: ");

    scanf("%f", &newinfo.preco);

    printf("\nMarca: ");

    scanf(" %s", newinfo.marca);

    printf("\nModelo: ");

    scanf(" %s",newinfo.modelo);

    printf("\nData: ");

    scanf(" %s",newinfo.data);

    printf("\nQuantidade: ");

    scanf("%i", &newinfo.quantidade);

    printf("\nCategoria: ");

    scanf(" %s", newinfo.categoria);

 

    novo->info=newinfo;

    novo->seguinte=NULL;

    novo->anterior=NULL;

 

    if(*fimList==NULL){

        *fimList=novo;

        *iniList=novo;

        }else{

            (*fimList)->seguinte=novo;

            novo->anterior=*fimList;

            *fimList=novo;

        }  


 

    fwrite(&produto, 1 ,sizeof(INFO),fp);

 

    fclose(fp);

 

    free(novo);

    return 0;

}

 

Link para o comentário
Compartilhar em outros sites

@jorge.b o c é muito usado sim, porém é extremamente específico, por exemplo, quem usa python as vezes tem de usar o ctypes para chamar funções integradas do windows, otimizar um script ou criar um janela sem ter que baixar bibliotecas.

 

 

respostas do GPT-4:

calloc(1, sizeof(ELEM)) → malloc(sizeof(ELEM)).

não há necessidade de usar calloc para inicializá-los com zero.

usar strerror(errno).

fseek(fp, 0, SEEK_END) para posicionar o ponteiro no final da lista antes do loop.

No final da função, você está liberando a memória alocada para novo usando free(novo). No entanto, isso é desnecessário, pois novo é necessário para adicionar o novo elemento à lista. Você pode remover a linha free(novo).

 

ps: na faculdade eu sabia ler quanquer codigo em C, hoje em dia não consigo nem lembrar as funções.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Swalls disse:

@jorge.b o c é muito usado sim, porém é extremamente específico, por exemplo, quem usa python as vezes tem de usar o ctypes para chamar funções integradas do windows, otimizar um script ou criar um janela sem ter que baixar bibliotecas.

 

 

respostas do GPT-4:

calloc(1, sizeof(ELEM)) → malloc(sizeof(ELEM)).

não há necessidade de usar calloc para inicializá-los com zero.

usar strerror(errno).

fseek(fp, 0, SEEK_END) para posicionar o ponteiro no final da lista antes do loop.

No final da função, você está liberando a memória alocada para novo usando free(novo). No entanto, isso é desnecessário, pois novo é necessário para adicionar o novo elemento à lista. Você pode remover a linha free(novo).

 

ps: na faculdade eu sabia ler quanquer codigo em C, hoje em dia não consigo nem lembrar as funções.

Obrigado pela ajuda vou ver se melhoro isto.

Link para o comentário
Compartilhar em outros sites


Poste um programa inteiro. Algo compilável. Fica difícil ajudar sem ler nem as definições de `ELEM` e `INFO` por exemplo.

 

12 horas atrás, jorge.b disse:

basicamente gerencia produtos clientes e encomendas. Tudo isto usando Listas duplamente ligadas

 

Para qualquer linguagem, entenda que deve escrever em torno dos dados. Onde estão os dados? Onde está o protótipo de cliente, produto e encomenda? Como será isso? Deve começar por essas definições.

 

E se usa listas ligadas onde está o software de lista ligada? Se vai usar isso deveria ter seus dados representados em 3 listas dessas. Onde estão?

 

Uma lista ligada é um container. É uma lista de algo. São as mesmas funções. Se não escrever assim vai trabalhar a toa e levar eras para concluir ou ao menos testar seu programa.

 

Sobre o fragmento postado: 
 

Não parece nada bom.
 

    int add_Produto(
        ELEM **iniList,
        ELEM **fimList,
        INFO produto,
        INFO newinfo);


Adicionar produto provavelmente implica em adicionar um produto a uma lista. A julgar pelo código vai reabrir e ler um arquivo a cada vez. Não é essa a ideia, quase nunca.

 

Você quer algo assim

 

    int add_produto(Produto* prod, Lista* produtos);

 

Onde você pega um produto e tenta inserir na lista. De produtos. E se já tem devolve -1, e algo negativo para qualquer outro erro. E se inseriu retorna zero. O simples.

 

Claro que vai copiar essa função para inserir nas outras duas listas. Para isso está estudando.

 

Mais sobre o código:

  • você parece tentar inserir os produtos no fim de um arquivo de produtos, mas onde está a lista:
  • qual o propósito de abrir um arquivo em append mode (para inserir) e depois imediatamente voltar para o início para ver se já tem um produto com o mesmo código?
  • NUNCA escreva um programa interativo. Como vai testar isso? A cada vez que for rodar vai digitar produtos e clientes e encomendas? Sério? Vai levar 10 minutos para cada teste?
  • scanf retorna um int. Leia o manual. TESTE o retorno. Sempre.
  • Não use ** ou *** ou ***** ou coisas assim. Há sólidas razões pra se usar isso e vai saber quando precisar, mas não é em um programa introdutório de listas ligadas. Passe o endereço de uma lista. Passe o endereço de um item. Retorne endereços. É muito mais simples.
  • Entenda que uma lista é um container. De qualquer coisa. A mesma coisa em C ou C++ ou C# ou java ou python ou javascript. Uma lista é de nós. Como um conjunto, um mapa, um dicionário, essas estruturas de dados comuns. São coleções de nós. E cada nó representa ou contem um dado. Um dado não é a lista. Um nó não é a lista. Isso é ensinado errado ao que parece. Convem ler um livro sobre estruturas de dados. Qualquer um. Há clássicos. E seu curso já pode até adotar um.

Faça o simples: use arquivos. É trivial em C. Digite os arquivos de teste direto no seu editor de texto ou IDE. E no início do programa crie as 3 listas com esses dados.

Insira os dados por ordem de chave, código de produto por exemplo. E assim na hora de inserir uma óbvia e rápida função de busca identifica se já tem o cara. E afinal vai precisar de uma função de busca de todo jeito.

 

12 horas atrás, Pedro Vinicius G. C. disse:

pior que não vou nem conseguir ajudar, vou tentar interpretar mas não uso linguagens "C"

 

Bem ,pode aprender algo sobre C, C++ e C# acompanhando esse forum. Esse é o objetivo do forum afinal

 

12 horas atrás, jorge.b disse:

Pois quase ninguem usa pelo me dizem mas na faculdade é a primeira linguagem que ensinam

 

Essa é uma opinião curiosa. Veja a realidade:

  • A API do Windows é... C.
  • C foi criada para escrever um sistema operacional, o Unix. Esse que virou Linux, Android e o MacOS.
  • C é unanimade em software embarcado.
  • Asterisk, o serviço de VOIP dominante no planeta foi e é escrito em C
  • SQLite, provavelmente o software mais usado no planeta, é escrito em C
  • C++ é absolutamente dominante em games. Quase todos são escritos em C++.
  • software de CAD é escrito em C++ e C na maioria
  • Toda biblioteca importante em Python foi e é escrita em C ou usando um trem chamado Cython que nem vou dizer o que é. E um dos recursos mais importantes para o desenvolvimento de Python é a disponibilidade de mais e mais desenvolvedores C para trabalhar com as bibliotecas.
  • C# é usar java com acesso ao gigante ecossistema .Net
  • Software para medicina, automação e controle de veículos é escrito em geral em C, C++ e Qt.
11 horas atrás, Rodrigo J Polette disse:

Parece OK, é parecido com o arduino... alocar memória, free.... pois memória é o que quase não tem no arduino..

 

O SDK arduino é C++, mas muito mais perto de C.

 

 

  • Curtir 2
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...

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!