Ir para conteúdo
hitz

Calculadora em C com erro na divisão

Recommended Posts

Olá, eu fiz uma calculadora em C usando pilha. O erro é que, quando eu utilizo uma divisão, ele retorna o último valor digitado e não o resultado correto.  Ex: 6/6 + 2 . Retorno: 2 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct pilha{
	char op;
	
	struct pilha * proximo;
}Pilha;

typedef struct pilhaN{
	int op;
	
	struct pilhaN * proximo;
}PilhaN;

Pilha * posFixa=NULL;
Pilha * posFixaInv=NULL;
Pilha * temp=NULL;
PilhaN * calculo=NULL;

void calculaExpressao();
void empilhaN(PilhaN **pilha, int op);
void empilha(Pilha **pilha, char op);
void desempilhaN(PilhaN ** fPilha);
void desempilha(Pilha ** fPilha);
void transfereTempPos();
void imprime(Pilha *topo);
void calcula(char operador);
void inverte();

int main(){
	char op;

    printf( "Digite a expressao: " );
    scanf( "%c", &op );
    while( op != '\n' )
    {      
	    switch (op){
	        case '+':
	        case '-':
                while((temp) && (temp->op != '(')){
					transfereTempPos();
				}
	            empilha(&temp,op);
	            break;

	        case '*':
	        case '/':
                while((temp) && (temp->op != '+') && (temp->op != '-')
                        && (temp->op != '(')) {
					transfereTempPos();
				}
		        empilha(&temp,op);
	            break;
	
	        case ')':
                while((temp) && (temp->op != '(')){
					transfereTempPos();
                }

                if((temp) && (temp-> op == '(')){
				    Pilha *aux;
					aux = temp;
                    temp = temp->proximo;
                    free(aux);
                }
                break;
	
	        case '(':
	            empilha(&temp,op);
				break;

	        default:
	            empilha(&posFixa,op);
	            break;
	    }
	    scanf( "%c", &op );
	}	

    while(temp){
		transfereTempPos();
    }
	


	imprime(posFixa);
    printf( "\n" );
	calculaExpressao();
    printf( "\n" );
}

void empilha(Pilha ** fPilha, char op){
    Pilha * aux;
	aux = ( Pilha *) malloc( sizeof( Pilha ) );
    aux -> op = op;  
    aux -> proximo = *fPilha;
    *fPilha = aux;
}

void empilhaN(PilhaN ** fPilha, int op){
    PilhaN * aux;
	aux = ( PilhaN *) malloc( sizeof( PilhaN ) );
    aux -> op = op;  
    aux -> proximo = *fPilha;
    *fPilha = aux;
}

void desempilha(Pilha ** fPilha){
    Pilha * aux;
	aux = *fPilha;
    *fPilha = (*fPilha)->proximo;
    free(aux);
}

void desempilhaN(PilhaN ** fPilha){
    PilhaN * aux;
	aux = *fPilha;
    *fPilha = (*fPilha)->proximo;
    free(aux);
}

void transfereTempPos(){
    Pilha *aux;
	aux = temp->proximo;
    temp->proximo = posFixa;
    posFixa = temp;
    temp = aux;
}


void imprime(Pilha *topo){
    if( topo )
    {
        imprime( topo -> proximo );
		printf( "%c", topo -> op );
    }   
}

void calcula(char operador){
	int a,b,c;
    
    a = calculo->op;
    desempilhaN(&calculo);
    b = calculo->op;
    desempilhaN(&calculo);
    switch (operador){
        case '+': c = a + b; 
        	break;
		case '-': c = a - b; 
        	break;
        case '*': c = a * b; 
        	break;
        case '/': c = a / b; 
        	break;
		defalt:
			break;
	}
	empilhaN(&calculo,c);
}

void calculaExpressao(){
	inverte();
	while(posFixaInv){
		switch (posFixaInv->op){
			case '+': 
			case '-':
			case '*':
			case '/':
				calcula(posFixaInv->op);
				break;
			default:
				empilhaN(&calculo,posFixaInv->op-48);
				break;
		}
		desempilha(&posFixaInv);
	}
	printf("%i",calculo->op);
}

void inverte(){
	Pilha * aux; 
	while(posFixa){
		empilha(&posFixaInv,posFixa->op);
		desempilha(&posFixa);
	}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Dan Borges
      Olá,
       
      Tenho conhecimentos em C#, e ultimamente venho programando utilizando o MonoGame para desenvolver jogos. Estava procurando como é feito uma pista pseudo 3D, e achei esse artigo em JS: https://codeincomplete.com/posts/javascript-racer-v1-straight/
       
      Por ter a lógica de programação da mente, mesmo sem saber js, entendi parte do código, mas esse trecho, não:
      segments = []; for(var n = 0 ; n < 500 ; n++) { // arbitrary road length segments.push({ index: n, p1: { world: { z: n *segmentLength }, camera: {}, screen: {} }, p2: { world: { z: (n+1)*segmentLength }, camera: {}, screen: {} }, color: Math.floor(n/rumbleLength)%2 ? COLORS.DARK : COLORS.LIGHT }); } A primeira vista entendi que ele está adicionando valores ao array segments com o método push. Mas, os valores colocados, não fazem sentido para mim.
      É como se fosse criada uma classe dinamicamente (que contenha as variáveis:, index, p1, p2...) sem precisar declará-la.
      Seria basicamente isso? Ele criou um objeto que representa uma classe, mas sem nomeá-la, ou algo semelhante?
    • Por EREGON
      Bom dia,
       
      estou a tentar fazer um exercício para, dado um ficheiro .txt na directoria do programa, terei de encontrar todas as palavras que são palíndromos. Tendo este código para ler as palavras do ficheiro .txt (letra a letra) para uma matrix.
       
      Estando as palavras armazenadas numa matrix, como faço essa validação?
       
      Obg,
       
      #include <stdio.h> #include <stdlib.h> int main(int argc, char const *argv[]) { FILE* inp; inp = fopen("palindromo.txt","r"); char arr[100][50]; int i = 0; while(1){ char r = (char)fgetc(inp); int k = 0; while(r!=',' && !feof(inp)){ //Le ate fim de ficheiro arr[i][k++] = r; //armazena no array r = (char)fgetc(inp); } arr[i][k]=0; //ultimo carater nulo //Alguma parte aqui, valida se a palavra e PALINDROMO. //COMO?? if(feof(inp)){ //valida EOF break; } i++; } int j; for(j = 0;j<=i;j++){ printf("%s\n",arr[j] ); //Imprime array } return 0; }  
    • Por Bruno Goedert Dalmolin
      Não consigo apresentar as palavras equivalentes conseguem me ajudar???
      O código é o seguinte: 
       
      #include <stdio.h>
      char equivale(int ddd){
          switch(ddd){
              case 61:
                  return "Brasilia";
                  break;
              case 71:
                  return "Salvador";
                  break;
              case 11:
                  return "Sao Palo";
                  break;
              case 21:
                  return "Rio de Janeiro";
                  break;
              case 32:
                  return "Juiz de Fora";
                  break;
              case 19:
                  return "Campinas";
                  break;
              case 27:
                  return "Vitoria";
                  break;
              case 31:
                  return "Belo Horizonte";
                  break;
          }
      }
      int main(){
          int ddd;
          scanf("%d",&ddd);
          equivale(ddd);
          printf("%d",equivale(ddd));
      }
    • Por darkskull10
      Numa cidade as crianças costumam brincar com um jogo (de dois jogadores) onde:
      um jogador A define uma sequência de 10 letras usando: G, R e B (exemplo: G – G – G – R – B – R – B – B – B – R)
      um jogador B pode ler a sequência quantas vezes quiser
      o jogador B também pode dizer uma das letras e obter em quais posições a letra dada se encontra na sequência
      o jogador B também pode dar uma posição e saber qual letra ocupa a posição na sequência
      para finalizar, o jogador B deve dizer a sequência de letras, obtendo um ponto para cada acerto.
       
      Só consegui pensar nisso por enquanto.
       
      //identificar que letra ocupa esta posição na sequência:
      do{
      scanf(“%d”,&Posicao);
      Posicao=Posicao-1;}
      while ((Posicao<0)||(Posicao>9));
      printf(“%c”,Sequencia[Posicao]);
       
      //exibir sequencia
      for (Cont=0; Cont<=9; Cont++)
      printf(“%c”,Sequencia[Cont]);
       
      //exibir posições
      for (Cont=0; Cont<=9; Cont++)
      printf(“%d%c”,Cont+1,Sequencia[Cont]);
    • Por IgorWeldt
      Bom dia, galera.
       
      Essa é a minha primeira postagem 
       
      Seguinte, estou desenvolvendo um website simples de compra, onde o usuário fará o pagamento pela API do PagSeguro, o problema é que não estou conseguindo usar a calculadora de frete do Correios.
       
      Encontrei diversos códios prontos pela internet, porém, nenhum funciona.
       
      Minha página fica carregando e não sai disso.
       
      Falta basicamente isso para finalizar o projeto, alguém pode me dar uma luz?
       
      <?php $parametros = array(); // Código e senha da empresa, se você tiver contrato com os correios, se não tiver deixe vazio. $parametros['nCdEmpresa'] = ''; $parametros['sDsSenha'] = ''; // CEP de origem e destino. Esse parametro precisa ser numérico, sem "-" (hífen) espaços ou algo diferente de um número. $parametros['sCepOrigem'] = '81810110'; $parametros['sCepDestino'] = '80050530'; // O peso do produto deverá ser enviado em quilogramas, leve em consideração que isso deverá incluir o peso da embalagem. $parametros['nVlPeso'] = '1'; // O formato tem apenas duas opções: 1 para caixa / pacote e 2 para rolo/prisma. $parametros['nCdFormato'] = '1'; // O comprimento, altura, largura e diametro deverá ser informado em centímetros e somente números $parametros['nVlComprimento'] = '16'; $parametros['nVlAltura'] = '5'; $parametros['nVlLargura'] = '15'; $parametros['nVlDiametro'] = '0'; // Aqui você informa se quer que a encomenda deva ser entregue somente para uma determinada pessoa após confirmação por RG. Use "s" e "n". $parametros['sCdMaoPropria'] = 'n'; // O valor declarado serve para o caso de sua encomenda extraviar, então você poderá recuperar o valor dela. Vale lembrar que o valor da encomenda interfere no valor do frete. Se não quiser declarar pode passar 0 (zero). $parametros['nVlValorDeclarado'] = '200'; // Se você quer ser avisado sobre a entrega da encomenda. Para não avisar use "n", para avisar use "s". $parametros['sCdAvisoRecebimento'] = 'n'; // Formato no qual a consulta será retornada, podendo ser: Popup – mostra uma janela pop-up | URL – envia os dados via post para a URL informada | XML – Retorna a resposta em XML $parametros['StrRetorno'] = 'xml'; // Código do Serviço, pode ser apenas um ou mais. Para mais de um apenas separe por virgula. $parametros['nCdServico'] = '40010,41106'; $parametros = http_build_query($parametros); $url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx'; $curl = curl_init($url.'?'.$parametros); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $dados = curl_exec($curl); $dados = simplexml_load_string($dados); ?> <html> <head> <title>Frete Correios Testes</title> </head> <body> <h1>Calculadora de frete dos Correios</h1> <?php foreach($dados->cServico as $linhas) { if($linhas->Erro == 0) { echo $linhas->Codigo.'</br>'; echo $linhas->Valor .'</br>'; echo $linhas->PrazoEntrega.' Dias </br>'; }else { echo $linhas->MsgErro; } echo '<hr>'; } ?> </body> </html>  
      Obrigado à todos!
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.