AJUDA: Listas em c

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

AJUDA: Listas em c

Mensagempor cool_man » Terça Jun 26, 2007 21:45

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: Seleccionar todos
#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;
}
cool_man
Novato
Novato
 
Mensagens: 3
Registado: Terça Jun 26, 2007 21:34

Mensagempor Goldman69m » Terça Jun 26, 2007 22:40

primeiro que tudo ainda nao compilaste o programa para veres se tinhas erros de sintaxe, logo tens aqui umas incorrecções:
:arrow: getch() nao existe, se queres ler um char usa getchar();
:arrow: quando fizeres um malloc convem fazeres um cast, do timo de memoria que estas a alocar do genero, actual = (lista*)malloc( sizeof(struct lista) );

na funçao insere o que é que queres fazer com isto, (*actual).produto = prod[50]; ? copiar o caracter que esta na posiçao 49, ou queres copiara a string toda?

Se calhar o que tu queres é uma estrutura deste genero:


typedef struct lista{
char produto[x];
char data[x];
float quantidade;
float preco;
float iva;
struct lista *proximo, *anterior;
};

nao uses o system pause:
Código: Seleccionar todos
i've seen several people use system("PAUSE") when they want to delay their programs. i'm not sure who's teaching this method, but it's a bad habit.
by calling system(), you are invoking the default shell. the shell then executes the commandline given to it ("PAUSE", in this case). that is, it runs the 'pause.exe' program. so, now your simple c program is relying on two external programs for a stupid thing like pressing a single key. what if someone deleted or renamed 'pause.exe'? what if someone tried to compile your program on unix, or a mac? it wouldn't work. you'd get an annoying shell message and no pause. besides, why have the overhead of launching 2 programs, when you can accomplish the same thing in c?


fonte

Vais percorrer a lista do fim para o principio, se so percorreres do inicio para o fim escusas de ter o apontador anterior...

estes sao assim os maiores erros que eu detetei, tb nao estive a fazer uma leitura profunda...
E6400 @ Scythe Infinity
Lc Power 550w Green Power
P5b Deluxe
Western 250gb Sata II
Gecube X1950Pro @ Accelero X2
2 Gb Team Elite Ddr2 800
Goldman69m
Membro de Prata
Membro de Prata
 
Mensagens: 344
Registado: Sábado Set 24, 2005 19:53
Localização: Marinha Grande


Voltar para Programação

Quem está ligado:

Utilizador a ver este Fórum: Nenhum utilizador registado e 1 visitante

cron