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

Estruturas de dados: Calculadora Infinita

Discussão em 'Programação' iniciada por rafzk, 7 de Novembro de 2008. (Respostas: 0; Visualizações: 1458)

  1. rafzk

    rafzk Power Member

    Estou a fazer um projecto de estruturas de dados tipo lista, que consiste em receber do teclado numeros para as listas e no fim de isso temos varias operacoes como: mostrar operandos, soma, subtracao e assim.

    Eu ja fiz como receber as listas do teclado, validar numero, contar numero de elementos e mostrar listas. Nao consigo fazer a soma e subtracao. Apartir daqui ja consigo fazer o produto e a divisao e depois consequentemente factorial e assim.

    O codigo que fiz até agora foi:

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    typedef struct DIGITO{
            int valor;
            struct DIGITO *nseg;
            struct DIGITO *nant;
            }Digito;
            
            
    Digito* RecebeListaTeclado(); 
    Digito* InsereFim(Digito *L,Digito *nv);
    Digito* InsereInicio(Digito *L,Digito *nv);
    Digito* CriaDigito(int valor);
    int MostraElementos(Digito *L);
    void MostraLista(Digito *L); 
    int NumeroValido(Digito *L);
    Digito* ApagaLista(Digito *L);
    Digito* RemoveElemento(Digito *L,Digito *del);
    int ComparaNumeros(Digito *L1, Digito *L2);
    Digito* Soma(Digito *L1,Digito *L2);
    int MenuPrincipal();
    
    
    // receber do teclado, os digitos.
    
    Digito* RecebeListaTeclado(){
            int polaridade=1;
            Digito *L=NULL, *nv;
            char c;
            while(1){
                     scanf("%c",&c);
                     getchar(); 
                     if(c==10)
                     return(L);
                     if(c=='-'){
                     polaridade=-1;
                     }else{                     
                           nv=CriaDigito((c-'0')*polaridade);
                           L=InsereFim(L,nv);
                           polaridade=1;
                          }
            }
            
    }
    
    // inserir os numeros nas listas
    
    Digito* InsereFim(Digito *L,Digito *nv){
            Digito *aux=L;
            if(L==NULL)
                       return(InsereInicio(L,nv));
            while(aux->nseg != NULL)
                            aux=aux->nseg;
            aux->nseg=nv;
            nv->nant=aux;
            return(L);
    }
    
    Digito* InsereInicio(Digito *L,Digito *nv){
            if(L==NULL)
                       return(nv);
            nv->nseg=L;
            L->nant=L;
            return(nv);
    }
    
    Digito* CriaDigito(int valor){
           Digito *nv=(Digito*)malloc(sizeof(Digito));
           nv->valor=valor;
           nv->nseg=NULL;
           nv->nant=NULL;
           return(nv);
    }
    
    // numero de elementos nas listas
    
    int MostraElementos(Digito *L){
        Digito *aux=L;
        int c=0;
        
        while(aux!=NULL){
                         c++;
                         aux=aux->nseg;
                         }    
        return(c);   
        }
    
    
    // mostrar lista
    
    void MostraLista(Digito *L){
         if(L==NULL){
                     printf("0\n");
                     return;
                     }
         while(L!=NULL){
                        printf("%d",L->valor);
                        L=L->nseg;
                        }
         printf("\n");
    }
    
    
    // validacao do numero
    
    int NumeroValido(Digito *L){
        if(L==NULL)
                   return(1);
        if(L->valor==0)
                       return(0);
        if((L->valor>=-9)&&(L->valor<=9)){
                                         L=L->nseg;
                                         while(L!=NULL){
                                                        if((L->valor>9)||(L->valor<0))
                                                                                     return(0);
                                                        L=L->nseg;
                                                        }
                                         return(1);
                                         }
        return(0);
    }
    
    // inicio do systeam clear, listas e elementos
    
    Digito* ApagaLista(Digito *L){
            Digito *del;
            while(L!=NULL){
                           del=L;
                           L=RemoveElemento(L,del);
                           }
            return(L);
    }
    
    Digito* RemoveElemento(Digito *L,Digito *del){
            if(del==L){
                       if(del->nseg==NULL){
                                           free(del);
                                           return(NULL);
                                           }
                       L=del->nseg;
                       del->nseg->nant=NULL;
                       free(del);
                       return(L);
                       }
            if(del->nseg==NULL){
                                del->nant->nseg=NULL;
                                free(del);
                                return(L);
                                }
            del->nant->nseg=del->nseg;
            del->nseg->nant=del->nant;
            free(del);
            return(L);
    }
    
    
    // confirmar se os numeros sao positivos
    
    int ComparaNumeros(Digito *L1, Digito *L2){
        int t1,t2,polaridade;
        
        if((L1==NULL)&&(L2==NULL))
                                  return(0);
        if(L1==NULL){
                     if(L2->valor>0)
                                    return(-1);
                     return(1);
                     }
        if(L2==NULL){
                     if(L2->valor>0)
                                    return(1);
                     return(-1);
                     }
        if((L1->valor>0)&&(L2->valor<0))
                                        return(1);
        if((L1->valor<0)&&(L2->valor>0))
                                        return(-1);
        if(L2->valor<0)
                      polaridade=-1;
                      
        t1=MostraElementos(L1);
        t2=MostraElementos(L2);
        
        if(t1<t2)
                 return(polaridade*-1);
        if(t1>t2)
                 return(polaridade);
        
        while(L1!=NULL){
                        if(L1->valor > L2->valor)
                                                 return(polaridade);
                        if(L2->valor > L1->valor)
                                                 return(polaridade * -1);
                        L1=L1->nseg;
                        L2=L2->nseg;
                        }
        return(0);
        
        }   
        
    // função soma (requisitos minimos)
    
    Digito* Soma(Digito *L1,Digito *L2){
            Digito *L3,*aux1=L1,*aux2=L2;
            
            while(aux1!=NULL)
                            aux1=aux1->nseg;
            while(aux2!=NULL)
                             aux2=aux2->nseg;
                            
            
            
            
            }  
       
    // Menu Principal 
       
    int MenuPrincipal(){
        int opcao;  
        do{
            system("cls");
            printf("\n\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
            printf("\t      +  CALCULADORA INFINITA  +\n");
            printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
            printf("\t<1> - Introduzir operando A.\n");
            printf("\t<2> - Introduzir operando B.\n");
            printf("\t<3> - Mostrar operandos e Total de Elementos.\n");
            printf("\t<4> - Soma de dois numeros.\n");
            printf("\t<5> - Subtracao de 2 numeros.\n");
            printf("\t<6> - Produto de 2 numeros.\n");
            printf("\t<7> - Divisao de 2 numeros.\n");
            printf("\t<8> - Media de 2 numeros.\n");
            printf("\t<9> - Maximo de 2 numeros.\n");
            printf("\t<10> - Minimo de 2 numeros\n");
            printf("\t<11> - Inversao de um numero.\n");
            printf("\t<12> - Factorial de um numero.\n");
            printf("\t<0> - Sair\n\n");
            printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
            printf("\tQual a sua opcao?\n");
            printf("\t>");
            scanf("%d", &opcao);
            getchar();
            printf("\n");
            }while(opcao<0 || opcao>4);
        return(opcao);
    }   
    
    
    // config do Menu Principal
    
    main(){
           Digito *A=NULL,*B=NULL;
           int opcao;
           
           do{
               opcao=MenuPrincipal();
               switch(opcao){
                             case 0:
                                  system("cls");
                                  // limpa as listas
                                  printf("\n\n\t\t< Pressione uma tecla para sair >\n\n\n");
                                  getchar();
                                  exit(0);
                                  
                             case 1:
                                  ApagaLista(A); // apaga a lista antes de adicionar
                                  printf("\n\nIntroduza a lista A:\n>");
                                  A=RecebeListaTeclado(); // adiciona digitos a lista
                                  break;
                                  
                             case 2:
                                  ApagaLista(B); 
                                  printf("\n\nIntroduza a lista B:\n>");
                                  B=RecebeListaTeclado();
                                  break;
                                               
                             case 3: 
                                  printf("\n\nAs listas introduzidas sao:\n\n");
                                  printf("(Lista A): ");
                                  MostraLista(A);
                                  printf("\n\n");
                                  printf("Tem %d numero(s) de elementos.\n",MostraElementos(A));
                                  printf("\n\n");
                                  printf("(Lista B): ");
                                  MostraLista(B);
                                  printf("\n\n");
                                  printf("Tem %d numero(s) de elementos.\n",MostraElementos(B));
                                  printf("\n\n");
                                  getchar();
                                  
                             }
                             
               
               }while(opcao!=0);
           
    
             
             
             
             
             
    // Validacao das listas
                         
    int x=1;
        Digito *L;
         do{
                  if(x==0){
                           printf("A Lista Inserida é invalida\n");
                           ApagaLista(L);
                           }
            printf("Insere Lista:\n");
            L=RecebeListaTeclado();
            x=NumeroValido(L);
            } 
        while(x==0);
        printf("A Lista Inserida e:\n");
        MostraLista(L);
        getchar(); 
           }
    
    
    Até esta engracado! :D
     

Partilhar esta Página