• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rafzk

Calculadora Infinita

14 mensagens neste tópico

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:

#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();
      }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eh pah... não tás a chamar a função Soma em lado nenhum (como no switch...)... a mesma coisa para a subtracção (e esta tá presa no MenuPrincipal, e a função ainda nem foi feita)... será esse o teu problema :P?

Olha lá, foste mesmo tu quem fez esse código? Podes contar aqui à malta, os profs não andam cá :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, fui.

A funcao soma é aqui que vai ser feita so que nao consigo pensar como hei de fazr a funcao soma em lista.

Digito* Soma(Digito *L1,Digito *L2){
        Digito *L3,*aux1=L1,*aux2=L2;

        while(aux1!=NULL)
                        aux1=aux1->nseg;
        while(aux2!=NULL)
                         aux2=aux2->nseg;

No switch é normal que ainda nao esteja a funcionar, porque isso é a ultima coisa para ligar ao meu do. O que interessa é mexer nos apontadores e assim.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então ... fazes a soma como eu aprendi na escola:

...625 + ...669

  ...625
+ ...669
--------
  ...294

5 + 9 = 4 "e vai 1"

2 + 6 + 1 = 9

6 + 6 = 2 "e vai 1"

etc ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aí tens a dica do pmg. Repara que vais ter que começar pelo final da lista e andar para o inicio. E que ambos os números podem ter uma quantidade diferente de digitos. Pode ser mais fácil começares por fazer código para somar números com o mesmo número de digitos, e só depois disso estar a funcionar então acrescentar o casos especiais de quando tens diferentes tamanhos.

Já agora, quando usas o ApagaLista, por coerência devias fazer var = ApagaLista(var).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes acrescentar 0's à esquerda do número mais pequeno para os fazeres iguais:

  00000000498632956234523985734
+ 83524532240973246234836000232

Talvez queiras mesmo acrescentar um 0 à esquerda dos dois números por causa do (possível) "e vai 1" no último dígito

  071
+ 066
-----
  137

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A do pmg é uma boa técnica, e permite-te partir o código em mais funções e que até te poderão dar jeito para as outras operações, como: "extender um número para n dígitos" e "remover zeros à esquerda".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hmm.. pois eu ja tinha pensado nisso mas a parte dos 'e vai um' é que me tava a dar avolta a cabeca! mas com a ajuda do 0 secalhar ajudaaaaa bue! vou tentar.

outra cena, porque é que quers que eu use var = ApagaLista(var) ?

OBRIGADO A TODOS PELA AJUDA! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque definiste a função ApagaLista() a retornar um valor, que na verdade será sempre NULL. Quando apagas uma lista deves colocar a variável a NULL, e uma forma de o fazer é usando o valor de retorno da função.

Por outro lado, se puseste a função a retornar um valor mas nunca o usas, então porque é que a função retorna um valor?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A sugestão de um aluno de Engenharia Informática com a cadeira de C feita (eu xD)...

Cria uma árvore binária:

-Em cada nó metes os operadores;

-Nas folhas metes os valores (inteiros ou reais. aconselho reais)

Cria uma função para receber os valores, estilo scanf, mas personalizado:

-Usa getch() para receber cada caractere individualmente.

--Avalia se é um valor ou um operador

--Coloca os dados no devido sitio na árvore binária.

-Quando for premido o ENTER, sair da função.

Cria um algoritmo para correr a árvore binária das folhas para a raiz, actualizando os valores em cada nó atraves das devidas operações.

-Quando chegares á Raiz, printf() do valor, e tá feito.

Faz tudo o que tu queres, e podes adicionar os operadores que bem te apetecer. Bonito e sem espinhas :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

so uma pergunta rapida ? viste quando foi aberto o post ? xD

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

vi. Isso impede-me de responder / deixar ideias / esclarecer duvidas aos que vierem na posterioridade pesquisar? A resposta é não. ;)

Atenciosamente,

LordFokas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já são dois tópicos resolvidos que desenterras sem razão aparente. Controla esses impulsos, e o orgulho de teres feito uma cadeira.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Peço desculpa se fiz algo de errado :x

Não me viste por aí a vangloriar-me de ter feito a cadeira (ainda se fosse Análise Matemática >.> )

Aparentemente o tópico não foi marcado como resolvido (Não tem a TAG a dizer "Resolvido" no titulo)

Uma coisa que seria de esperar para evitar situações destas seria fechar os tópicos resolvidos (digo eu, moderar este fórum não me compete a mim)

Vou parar de desenterrar tópicos. (foram só 2, não é assim tão grave)

Uma vez mais peço desculpa pelo sucedido.

Se alguem precisar de ajuda com C, disponha ;)

Atenciosamente,

LordFokas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora