1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

AJUDA: Listas em c

Discussão em 'Programação' iniciada por cool_man, 26 de Junho de 2007. (Respostas: 2; Visualizações: 564)

  1. Boas pessoal,

    Tou com alguma dificuldade em fazer trabalho para a faculdade que usa listas.

    O trabalho que tenho de fazer tem o enunciado que se encontra neste link http://trabalhosuniv.com.sapo.pt/Projecto.pdf

    Alguma parte do programa ja está feito mas tou com dificuldade em fazer a listagem dos valores introduzidos, não saem como foram introduzidos, e isto esta-me a dificultar em poder avançar com o trabalho.

    Em baixo junto o codigo que ja esta contruido.

    Agradecia a vossa ajuda, pois tou a ter dificuldades em fazer o trabalho que tem de ser entregue até dia 30 de junho e conta para nota final. Até agora tenho conseguido fazer os trabalhos solicitados pelo professor, mas neste projecto, e devido ao facto de para alem estudar tambem ser trabalhador, não estou inserido num grupo e tenho feito o trabalho sozinho o que torna as coisas mais dificeis.

    Agradeço imenso qualquer ajuda que possa ser dada.



    Codigo ja feito:
    Código:
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct lista{
    char produto;
    char data;
    float quantidade;
    float preco;
    float iva;
    struct lista *proximo, *anterior;
    };
    struct lista *primeiro;
    struct lista *actual; 
    struct lista *anterior;
    struct lista *proximo;
    struct lista *gravar;
    char op;
    char prod[50];
    char dat[10];
    float quant[5];
    float prec[5];
    float i[4];
    void insere(void){
    system("cls");
    printf("Inserir novo registo\n\n"); 
    primeiro = NULL;
    for(;;)
    {
    scanf("%s %s %d %d %d", &prod, &dat, &quant, &prec, &i);
    op = getch();
    actual = malloc( sizeof(struct lista) );
    (*actual).produto = prod[50];
    (*actual).data = dat[10];
    (*actual).quantidade = quant[5];
    (*actual).preco = prec[5];
    (*actual).iva = i[4];
    (*actual).proximo = primeiro;
    primeiro = actual;
    if( op == 42)
    break;
    }
    primeiro->proximo = NULL;
    for(actual = primeiro; actual != NULL; actual = (*actual).proximo)
    printf( "%s %s %d %d %d\n", (*actual).produto, (*actual).data, (*actual).quantidade, 
    (*actual).preco, (*actual).iva);
    system("pause");
    }
    void listar(void){
    system("cls");
    actual = primeiro;
    while( actual != NULL )
    {
    printf( "%c %c %f %f %f\n", (*actual).produto, (*actual).data, (*actual).quantidade, 
    (*actual).preco, (*actual).iva);
    actual = (*actual).proximo;
    }
    system("pause");
    }
     
    void elimina(void){
    char op;
    printf("Elimina produto\n\n");
    if(primeiro == NULL){
    system("cls");
    printf("Nenhum registro armazenado...\n\n");
    system("pause");
    return;
    }
    else{
    actual = primeiro->proximo;
    do{
    system("cls");
    printf("Pressione + e - para alternar entre os registros, sair e confirmar\n\n");
    printf("Produto: %s\n\nData: %s\n\nQuantidade: %s\n\nPreco: %s\n\nIVA: %s\n",
    actual->produto,actual->data,actual->quantidade,actual->preco,actual->iva);
     
    op = getch();
    switch (op){
    case 43:{
    if (actual->proximo == primeiro)
    actual = primeiro->proximo;
    else
    actual = actual->proximo;
    break;
    }
    case 45:{
    if (actual->anterior == primeiro)
    actual = primeiro->anterior;
    else
    actual = actual->anterior;
    }
    }
    }while((op != 27) && (op != 13));
    }
    if(op == 27)
    return;
     
    printf("\n\nVoce confirma a exclusao deste registro (S/N): [ ]\b\b");
    op = getch();
    if (op >= 97)
    op -= 32;
    if(op == 'S'){
    anterior = actual->anterior;
    proximo = actual->proximo;
    anterior->proximo = proximo;
    proximo->anterior = anterior;
    free(actual);
    if (primeiro == primeiro->proximo) // se for excluido o penultimo registro, sobrando apenas o registro 
    "primeiro" que não é util para nós, o primeiro tambem será liberado
    primeiro = NULL;
     
    printf("\n\nRegistro excluido com sucesso!\n\n");
    system("pause");
    }
    else
    return;
    }
     
    int main(void){
    char escolha;
    insere();
    do{
    system("cls");
    printf("I<nsere>, E<limina>, L<istar>, S<air>\n\nEscolha[ ]\b\b");
    escolha = getch();
    if(escolha >= 97)
    escolha -= 32;
     
    if(escolha == 'I')
    insere();
     
    if(escolha == 'E')
    elimina();
     
    if(escolha == 'L')
    listar();
     
    if(escolha == 'S')
    break;
     
    }while(escolha != 27);
     
    return 0;
    }
    
     
    Última edição: 26 de Junho de 2007
  2. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    dois conselhos:
    - usa as tags "code" para que o código fique minimamente legível;
    - não coloques aqui o código todo, mas apenas aquele onde estás a ter problemas (e outros blocos eventualmente necessários para se compreender o código), é que assim poucos terão paciência para andar à procura do problema.
     
  3. mokojin

    mokojin Power Member

    Convêm especificares um pouco mais o problema, dizeres os resultados e o comportamento que tens no listar.

    Já agora tens a certeza que isto assim está correcto (*actual).produto ? Eu normalmente faria actual->produto, ponto para estruturas seta para pointers para estruturas.
     

Partilhar esta Página