Estruturas de dados: Calculadora Infinita

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
 
Back
Topo