Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    35

    problema esercizio con lo stack

    Sto studiando programazione 2, programmando in C, scrivendo un programma per gestire la calcolatrice con notazione polacca, ho utilizzato lo stack(pila), ma ho dei problemi nella lettura dei caratteri, perchè il printf mi stampa dei valori assurdi.
    ES.
    se do in ingrasso 1 2 3 * +=
    la funzione dovrebbe darmi 7, perchè fa (3*2) +1 = 7
    potreste darmi consigli????....
    vi posto il codice


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define STACK_SIZE 100
    
    char contents[STACK_SIZE];
    int top=0;
    typedef int Bool;
    
    
    void stack_overflow()
    {
    	printf("Espressione troppo complessa!\n");
    	exit(EXIT_FAILURE);
    }
    
    void stack_underflow()
    {
    	printf("Non ci sono abbastanza operandi!\n");
    	exit(EXIT_FAILURE);
    }
    
    void make_empty(void)
    {
    	top=0;
    }
    
    Bool is_empty(void)
    {
    	return top==0;
    }
    
    Bool is_full(void)
    {
    	return top==STACK_SIZE;
    }
    
    void push(int i)
    {
    	if(is_full())
    		stack_overflow();
    	else
    		contents[top++]=i;
    }
    
    double pop(void)
    {
    	if(is_empty())
    		stack_underflow();
    	else
    		return contents[--top];
    }
    
    int main(void)
    {
    	char ch;
    	double risult=0.0;
    	printf("inserisci un espressione RPN: ");
    	do
    	{
    		scanf("%c", &ch);
    		if(ch<='9' && ch>='0')
    			push(ch);
    		else
    			if(ch!=' ' && ch!='\n')
    		{
    			switch(ch)
    			{
    				case '*':
    					risult=pop();
    					risult*=pop();
    					push(risult);
    					break;
    				case '+':
    					risult=pop();
    					risult+=pop();
    					push(risult);
    					break;
    				case '-':
    					risult=pop();
    					risult-=pop();
    					push(risult);
    					break;
    				case '/':
    					risult=pop();
    					risult/=pop();
    					push(risult);
    					break;
    				case '=':
    					printf("Il risultato e': %f", pop());
    					/*exit(EXIT_SUCCESS);*/
    					break;
    				default:
    					printf("Operando non valido");
    				/*	exit(EXIT_FAILURE);*/
    					break;
    			}
    		}
    	}
    	while(ch!='\n');
    	system("PAUSE");
    	return 0;
    	
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Succede perché memorizzi il valore ASCII delle cifre e non quello effettivo. Devi scrivere

    push(ch-'0');
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Presumo il problema stia nel fatto che le operazioni aritmetiche siano fatte con il valore ascii e non con l'effettivo valore.
    Per gli Spartani e Sparta usa spartan Il mio github

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    35
    grazie funziona benissimo.....ma come posso fare ad evitare in futuro errori del genere????

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da andreajk
    grazie funziona benissimo.....ma come posso fare ad evitare in futuro errori del genere????
    Per prevenire, devi pensare meglio a quello che fai (non c'è altro modo).

    Per correggere da solo, la prossima volta fai un po' di debugging.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6

    Moderazione

    Incidentalmente:
    - quando posti del codice, inseriscilo tra tag [co­de] ... [/co­de], in modo che non perda l'indentazione;
    - ricordati di aggiungere il tag del linguaggio al titolo della discussione.
    Ora ho corretto io, in futuro ricordatene.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.