PDA

View Full Version : [C++] Calcolatrice


StErMiNeiToR
12-09-2004, 15:27
Come posso migliorarla? Come posso alleggerire il codice?

qualche trucchetto?

cosa aggiungo?

#include "math.h"
#include "iostream.h"

//funzione menu ;)
void menu ()
{
cout<<"**********************************************************"<<endl;
cout<<"* *"<<endl;
cout<<"* TDO banner's calculator v1.0 *"<<endl;
cout<<"* 12 September 2004 *"<<endl;
cout<<"* By: tdo staff (stermineitor69@hotmail.com) *"<<endl;
cout<<"* http://tdo.altervista.org *"<<endl;
cout<<"* Copyright © 2004 by TDO Portal *"<<endl;
cout<<"* *"<<endl;
cout<<"**********************************************************"<<endl;
}
//funzione menu scelta ^^
void menu_scelta ()
{
cout<<"**********************************************************"<<endl;
cout<<"* *"<<endl;
cout<<"* 1. Addizione *"<<endl;
cout<<"* 2. Sottrazione *"<<endl;
cout<<"* 3. Moltiplicazione *"<<endl;
cout<<"* 4. Divisione *"<<endl;
cout<<"* 5. Elevamento a potenza *"<<endl;
cout<<"* *"<<endl;
cout<<"* 0. Exit *"<<endl;
cout<<"* *"<<endl;
cout<<"**********************************************************"<<endl;
}



//funzione per l'elevamento a potenza
double potenza (double x, double y)
{
return pow(x,y);
}
//funzione per l'addiozione
double addizione (double x, double y)
{
return x+y;
}
//funzione per la sottrazione
double sottrazione (double x, double y)
{
return x-y;
}
//funzione per la moltiplicazione
double moltiplicazione (double x, double y)
{
return x*y;
}

//funzione per la divisione
double divisione (double x, double y)
{
return x/y;
}
void sw_ca ()
{
double a,b;
int scelta=-1;



do
{

cout<<endl<<"Inserisci il primo numero ";
cin>>a;
cout<<endl<<"Inserisci il secondo numero ";
cin>>b;
cout<<endl<<endl;
menu_scelta();
cout<<endl<<endl<<"Quale operazione vuoi eseguire? ";
cin>>scelta;
cout<<endl;
switch(scelta)
{
case 1:
cout<<"Il risultato dell'addizione relativa ai numeri "<<a<<" e "<<b<<" e': "<<addizione(a,b)<<endl;
scelta=-1;
break;
case 2:
cout<<"Il risultato della sottrazione relativa ai numeri "<<a<<" e "<<b<<" e': "<<sottrazione(a,b)<<endl;
scelta=-1;
break;
case 3:
cout<<"Il risultato della moltiplicazione relativa ai numeri "<<a<<" e "<<b<<" e': "<<moltiplicazione(a,b)<<endl;
scelta=-1;
break;
case 4:
if((a!=b)&&(b==0)){ cout<<"Impossibile eseguire l'operazione"; scelta=-1; break; }
cout<<"Il risultato della divisione relativa ai numeri "<<a<<" e "<<b<<" e': "<<divisione(a,b);
scelta=-1;
break;
case 5:
cout<<"Il risultato dell'elevamento a potenza relativa ai numeri "<<a<<" e "<<b<<" e': "<<potenza(a,b)<<endl;
scelta=-1;
break;
case 0:
scelta=0;
break;
default: { cout<<"Inserisci un numero compreso fra 0 e 5"<<endl; scelta=-1; }
}
}
while(scelta==-1);
}





void main ()
{
menu();
cout<<endl;
sw_ca();

}

VICIUS
12-09-2004, 17:12
Originariamente inviato da StErMiNeiToR
Come posso migliorarla? Come posso alleggerire il codice?

qualche trucchetto?

cosa aggiungo?
[...]

Che ne dici di agiungere logaritmi, esponenziali, potenze, radici, frazioni, ... la matematica è una delle materie piu vaste non hai che l'imbarazzo della scelta.

Invece che chiedere all'utente ogni singola operazione potresti implementare un piccolo parser e permettere cose come: 9 + 9 - 4. E poi mettere in output subito il risultato senza "il risultato...." qualcosa tipo:
2 + 2 <invio>
4

ciao ;)

anx721
12-09-2004, 17:22
E poi puoi implentare il tutto usando la OOP (il C++ non abdrebbe usato per programmare come si programma in C...): una classe per il parser, una classe per rappresentare un'operazione: la calcolatrice avrà quindi un parser a cui passare la strunga immessa dall'untente che che restituisce un oggetto Operazione in basse alla stringa elaboarta, la calcolatrice esegue l'operaione, senza sapere neanche di che operazione si tratta, e visualizza il risultato. Cosi diventa molto modulare e si possono agiungere nuove funzionalità facilmente.

Inoltre sostituisci:

#include "iostream.h"

che è obsoleto con


#include <iostream>

using namespace std;


e

void main ()

con


int main (){
...
...
...
return 0;
}



Ciao.

StErMiNeiToR
12-09-2004, 17:53
scusate ragazzi ma ho solo 16 anni e studio da poco....


cosa è un parser? cosa sono le classi? scusate ma non conosco il sistema ad oggetti (OOP)

potreste spiegarmi un po il OOP e darmi qualche esempio da applicare al mio programma?


grazie ve ne sono molto grato :)

anx721
12-09-2004, 18:10
Se stai strudiando da poco il C++ ok...arrivaerai a studiare le classi e la programmazione ad oggetti...non è un aromento che si puo spiegare in un post sul forum preche molto vasto, è il cuore di totta la programmazione C++. Magari quando la inizia a studiare prova a riformulare il problema usando le calssi e gli oggetti.

Un parser è un componente del programma che si dovrebbe occupare di 'interpretare' una stringa inserita dall'utente, individuandone gli elementi costitutivi; ovviamente devi prima stabilire quale deve essere 'il linguggio' che la tua calcolatrice accetta. Ad esempio potresti accettare espressioni del tipo:

1 + 3 * 5 - 4

un parser deve occuparsi di individuare nella stringa inserita i numeri e le operazioni, memorizzando queste informazioni in un'apposita struttura dati. Quindi, in base alle informazioni estratte dal parser puoi eseguire l'operazione.

Un modo elementare di eseguire ciò è di memoriazzare i numeri e le operazioni in un unico array; quindi ti scorri l'array dal fondo, estrai il primo operando, estrai l'operazione, estrai il secondo operando, calcoli il risultato e lo insrisci in fondo all'array, e ripeti l'operazione finche l'array nn contiene un solo elemento che è il risultato.

Questo è il modo piu semplice, che non tiene conto delle precedenze tra gli operatori, e inizia a calcolare a partire dal fondo del'esporessione. Per migliroerare la cosa andrebbero usate strutture dati piu consone come ad esempio alberi.

Ciao.

StErMiNeiToR
12-09-2004, 18:44
ho studiato c++ per tutto l anno scolastico con la scuola ma ovviamente il 95% di quello che ho appreso è stato per merito di internet libri ecc... insomma autodidatta rulez :)

cmq adesso ho capito cosa è un parser...

se tu magari potessi linkarmi un sito dove studiare l' OOP o un tutorial te ne sarei grato anche perche ho visto che è molto importante anche per il JAVA ;)


cmq ritornando al tuo esempio ho capito come fare ma inserendo una stringa (ovvero tutto d'un colpo senza piu di un cin o di un get) dopo come faccio a fargli capire che * e / ha piu importanza di + e - ?

anx721
12-09-2004, 19:08
Un buon testo sul c++ è Thinking in C++, che puoi scaricare sul sito dell'autore:

http://mindview.net/Books

disponibile anche in italiano, anche se la traduzione a volte non è proprio impeccabile, io ti consilio di seguire la versione in inglese, e consultare l'italiana se proprio non capisci un concetto.

Sulla stessa pagina puoi anche scaircare Thinking in Java.

Quando al calcolo del valore di un'espressione, se usi la tecnica dell'array ti basta fare una prima passata in cui risolvi le operazioni con priorita maggiore, e poi una seconda passata per le operazioni con priorita minore.

StErMiNeiToR
12-09-2004, 19:44
un ultima cosa...

ma quando inserisco tutta l espressione la inserisco passo a passo oppure con una stringa?

Frank1962
12-09-2004, 19:45
buttati su java che è il linguaggio del futuro ........è il linguaggio ad oggetti per eccellenza ed è molto più semplice sopratutto per chi vuole fare qualche programmino un pò + serio di un semplice hello world o di una calcolatrice testuale.

il C++ è troppo vincolato alla macchina e alla capacità del compilatore.....

anx721
12-09-2004, 19:53
Originariamente inviato da StErMiNeiToR
un ultima cosa...

ma quando inserisco tutta l espressione la inserisco passo a passo oppure con una stringa?

Dovresti leggere un'intera riga dalla console memorizzandola in una stringa da passare al parser.

StErMiNeiToR
12-09-2004, 20:10
Originariamente inviato da Frank1962
buttati su java che è il linguaggio del futuro ........è il linguaggio ad oggetti per eccellenza ed è molto più semplice sopratutto per chi vuole fare qualche programmino un pò + serio di un semplice hello world o di una calcolatrice testuale.

il C++ è troppo vincolato alla macchina e alla capacità del compilatore.....

:) il java si basa sul c++ quindi prima lasciami imparare questo e poi passo al java

Frank1962
12-09-2004, 21:15
Originariamente inviato da StErMiNeiToR
:) il java si basa sul c++ quindi prima lasciami imparare questo e poi passo al java
che discorso è? .....allora il C++ si basa su assembler, e l'assembler si basa su binario.....

cioè di solito quando uno vuole imparare inizia con le cose più semplici, magari con un linguaggio accessibile che ti permetta di avere qualche piccola soddisfazione e ti permetta in futuro, appunto, il passaggio a un linguaggio più complesso come può essere il C++ ;)

StErMiNeiToR
12-09-2004, 21:19
posso assicurarti che non mi pento di aver studiato c++ ;)

Frank1962
12-09-2004, 21:38
Originariamente inviato da StErMiNeiToR
posso assicurarti che non mi pento di aver studiato c++ ;)
mica di ti devi pentire ......il problema era soltanto che di solito è più difficile passare da C a Java che non il contrario ;)

poi ognuno è libero di fare quello che vuole ;)

Jonny32
12-09-2004, 21:50
Ciao stermi...
Com'è?

Ti stai dando alla programmazione? Ormai hai lasciato il mondo CS?


Oh mettici almeno anche le radici... o sennò mettici "Elevamento a potenza o radice"...
(questo l'ho scritto altrimenti questo post è totalmente OT)




Ci vediamo domattina...

Ciao

anx721
12-09-2004, 21:59
Originariamente inviato da Frank1962
mica di ti devi pentire ......il problema era soltanto che di solito è più difficile passare da C a Java che non il contrario ;)


Da java a C forse...ma da java a C++ è parecchio faticoso...te lo dice uno che ha sviluppato in java per anni e che ora studiando il c++ sto facendo un bello sforzo...prechè? Bhè proprio perche, come hai detto tu, java è piu semplice, ma dire 'semplice' non è tanto corretto, io direi che java, intendendo con ciò solo il linguaggio in se, è molto piu lineare, omogeneo, senza tante caratteristiche ostiche del c++.

Detto questo...la parte che StErMiNeiToR ha studiato, ovvero tutto cio che non riguarda le classi, è la parte semplice del c++.

StErMiNeiToR
12-09-2004, 23:34
perfetto quindi io mi sono fatto solo le stronzate :D

adesso allora comincia il bello :D mettiamoci a fare le classi e giu di manuali ;)

cmq x jonny32


io è piu di un anno ke mi sono dato alla programmazione non solo del c++ ;)

cmq ci becchiamo domani mattina ciao bello

Frank1962
13-09-2004, 00:06
Originariamente inviato da anx721
Da java a C forse...ma da java a C++ è parecchio faticoso...te lo dice uno che ha sviluppato in java per anni e che ora studiando il c++ sto facendo un bello sforzo...prechè? Bhè proprio perche, come hai detto tu, java è piu semplice, ma dire 'semplice' non è tanto corretto, io direi che java, intendendo con ciò solo il linguaggio in se, è molto piu lineare, omogeneo, senza tante caratteristiche ostiche del c++.

Detto questo...la parte che StErMiNeiToR ha studiato, ovvero tutto cio che non riguarda le classi, è la parte semplice del c++.
infatti anche io mi sono trovato nella tua stessa situazione .........nessuno dice che sia semplice, però molte cose suonano già familiari e si può notare qualche tipo di somiglianza tra java e c, cosa che non può avvenire per qualcuno che incomincia da zero!

/\/\@®¢Ø
13-09-2004, 13:35
Originariamente inviato da StErMiNeiToR
Come posso migliorarla? Come posso alleggerire il codice?

qualche trucchetto?

cosa aggiungo?

Una prima cosa che potresti fare sarebbe quello di estendere la calcolatrice in modo che possa valutare piu' operazioni assieme ( ad esempio 3+5*2)
La cosa piu' semplice e' quella di usare la cosiddetta notazione polacca inversa (RPN), conosciuta molto bene da chi usa una calcolatrice scientifica HP.
Ad esempio invece di scrivere 3+5*2
scriveresti 3 5 + 2 *
Questo rende piu' difficile a te la scrittura delle espressioni, ma molto piu' semplice il lavoro della calcolatrice :D
In questo modo infatti il calcolo diverrebbe relativamente semplice. Questo e' un passo relativamente facile da implementare una volta che capisci come funziona.

anx721
13-09-2004, 13:59
Originariamente inviato da /\/\@®¢Ø
La cosa piu' semplice e' quella di usare la cosiddetta notazione polacca inversa (RPN), conosciuta molto bene da chi usa una calcolatrice scientifica HP.
Ad esempio invece di scrivere 3+5*2
scriveresti 3 5 + 2 *
Questo rende piu' difficile a te la scrittura delle espressioni, ma molto piu' semplice il lavoro della calcolatrice :D


Si..magari l'utente puo pure scrivere direttamente il risultato e la calcolatrice si limita a ristamparlo... :oink: Lo so che diventa piu facile..ma per l'utente diventa anche molto piu difficile scsrivere l'espressione in modo corretto e fino a prova contraria il programma deve facilitare il calcolo dell'utente.

cionci
13-09-2004, 15:09
Originariamente inviato da Frank1962
buttati su java che è il linguaggio del futuro ........è il linguaggio ad oggetti per eccellenza ed è molto più semplice sopratutto per chi vuole fare qualche programmino un pò + serio di un semplice hello world o di una calcolatrice testuale.

il C++ è troppo vincolato alla macchina e alla capacità del compilatore.....
Su questo avrei molto da ridire... Java potrà essere il linguaggio del futuro, ma solo nelle situazioni in cui è il linguaggiod el presente...ovvero programmazione server-side e programmazione per dispositivi embedded... Per il resto lasciamolo perdere ;)

Inoltre riguardo al fatto che sia il linguaggio ad oggetti per eccellenza: non lo è assolutamente... SmallTalk può essere definito il linguaggio ad oggeti per eccellenza.... C++ racchiude solo una parte, anche se abbastanza ampia, della programmazione OO... Java un'altra parte, in proporzione, più piccola del C++...

Inoltre il fatto di avere la GUI inclusa porta la gente a fregarsene dello stile di programmazione e si vedono certi obbrbri proprio perchè molte persone sono convinte di programmare ad oggetti solo utilizzando il framework... Il che è profondamente scorretto...

La programmazione ad oggetti esiste a priori di SmallTalk, C++ e Java... Un linguaggio di programmazione deve essere solo un mezzo per mettere in atto un progetto scritto o un processo mentale già preesistente...

Programmare ad oggetti significa raggiungere un livello di astrazione tale per cui un linguaggio ad oggetti valga quanto un altro...almeno in fase di definizione del problema...

/\/\@®¢Ø
13-09-2004, 19:35
Originariamente inviato da anx721
Si..magari l'utente puo pure scrivere direttamente il risultato e la calcolatrice si limita a ristamparlo... :oink: Lo so che diventa piu facile..ma per l'utente diventa anche molto piu difficile scsrivere l'espressione in modo corretto e fino a prova contraria il programma deve facilitare il calcolo dell'utente.
Le calcolatrici RPN sono tutt'altro che disprezzabili (e per chi le usa da anni pure piu' intuitive di quelle normali :D). Non solo permettono di ottenere la stessa espressione in modo piu' semplice (le parentesi non sono necessarie), ma fanno anche di piu'. La calcolatrice di cui sopra, se di tipo RPN, in un attimo la trasformi in una macchina stack-based (anzi, lo e' di suo), programmabile. aggiungendo "operatori" adatti la calcolatrice tradizionali la implementi con la RPN :D :cool:
Si potrebbero quindi ottenere risultati piu' interessanti pur con uno scalino iniziale piu' bacco