C++ - Risorse gratuite :: programmi,esercizi,visual,dev,compilatori,esempi,classi,strutture,liste,array,funzioni,C,java :: Leggi il Topic - L'incubo continua: Calcolatrice
 FAQFAQ   CercaCerca   Lista degli utentiLista degli utenti   RegistratiRegistrati   ProfiloProfilo   Messaggi PrivatiMessaggi Privati   LoginLogin 

L'incubo continua: Calcolatrice
Nuovo Topic   Rispondi    Indice del forum -> Aiuto - C++
Pagina 1 di 1
Precedente :: Successivo  
Autore Messaggio
Mefistofele
Nuovo membro



Messaggi: 10
Località: Bergamo

MessaggioInviato: Giovedì 29 Aprile 2004    Oggetto: L'incubo continua: Calcolatrice
Rispondi citando

Ecco il listato:

#include <iostream.h>
void main () {
int a;
int b[100];
char c[100];
int s=0; int g=0;
cout<<"Inserisci numeri e operatori, quando avrai finito pusha INVIO"<<endl;
for(a=0;;a++){ //ciclo infinito
if (a%2==0) {a=g; cout<<"Inserisci numero: "; cin>>b[g]; g++;} //Se il numero è pari sarà un numero
if (a%2!=0) {cout<<"Inserisci operatore: "; cin>>c[a]; //se dispari un operatore
if (c[a]=='+') {s+=(b[g]+b[g-1]);} if (c[a]=='*') {s*=(b[g]*b[g-1]);}
if (c[a]=='/') {s/=(b[g-1]/b[g]);} if (c[a]=='-') {s-=(b[g-1]-b[g]);}
if (c[a]!='\0') {cout<<"n"<<s;}
} } }

Esempio di output:
Inserisci numeri e operatori, quando avrai finito pusha INVIO
Inserisci numero: 3
n-2133120091Inserisci operatore: -
Inserisci numero: 4
Inserisci operatore: // \0
//E poi.. il vuoto....

Cosa c'è che non va nel programma?
_________________
<<L'unica cosa che so fare col computer è farlo lavorare per me...>> yumichan
Torna in cima
Profilo Messaggio privato Invia email
Webmaster
Amministratore del forum



Messaggi: 438
Località: Provincia AL

MessaggioInviato: Giovedì 29 Aprile 2004    Oggetto: Re: L'incubo continua: Calcolatrice
Rispondi citando

Mefistofele ha scritto: Espandi/Riduci
Ecco il listato:

#include <iostream.h>
void main () {
int a;
int b[100]; cosa te ne fai di 2 array di dimensione 100? prova usando solo 2 double per i numeri e un char per l'operatore
char c[100];
int s=0; int g=0;
cout<<"Inserisci numeri e operatori, quando avrai finito pusha INVIO"<<endl;
for(a=0;;a++){ //ciclo infinito perchè? il programma forse si impalla per questo...
if (a%2==0) {a=g; cout<<"Inserisci numero: "; cin>>b[g]; g++;} //Se il numero è pari sarà un numero non mi è molto chiaro cosa intendi dire/fare
if (a%2!=0) {cout<<"Inserisci operatore: "; cin>>c[a]; //se dispari un operatore
if (c[a]=='+') {s+=(b[g]+b[g-1]);} if (c[a]=='*') {s*=(b[g]*b[g-1]);}
if (c[a]=='/') {s/=(b[g-1]/b[g]);} if (c[a]=='-') {s-=(b[g-1]-b[g]);}
if (c[a]!='\0') {cout<<"n"<<s;}
} } }

Esempio di output:
Inserisci numeri e operatori, quando avrai finito pusha INVIO
Inserisci numero: 3
n-2133120091Inserisci operatore: -
Inserisci numero: 4
Inserisci operatore: // \0
//E poi.. il vuoto....

Cosa c'è che non va nel programma?


A mio avviso c'è ancora un bel pò di confusione in merito ad array e cicli for. :? Ti consiglio di scaricarti una delle guide linkate sul sito e di vederti bene la teoria.
Appena ho un pò di tempo libero ti posto una possibile soluzione al problema. Wink
Torna in cima
Profilo Messaggio privato
Mefistofele
Nuovo membro



Messaggi: 10
Località: Bergamo

MessaggioInviato: Giovedì 29 Aprile 2004    Oggetto: Re: L'incubo continua: Calcolatrice
Rispondi citando

Citazione: Espandi/Riduci
for(a=0;;a++){ //ciclo infinito perchè? il programma forse si impalla per questo...

Non penso si impalli per questo visto che arriva fino ai cout successivi, anyway non essendoci condizioni sulla variabile 'a', il ciclo dovrebbe essere infinito no?

Citazione: Espandi/Riduci
if (a%2==0) {a=g; cout<<"Inserisci numero: "; cin>>b[g]; g++;} //Se il numero è pari sarà un numero non mi è molto chiaro cosa intendi dire/fare

Beh, visto che la successione di richiesta è "numero-operatore-numero", se l'indice del vettore è pari (divisibile per due) sarà 0-2-4-6-8 etc. etc. mentre se sarà dispari, la variabile corrisponderà alle celle 1-3-5 etc.etc.


Citazione: Espandi/Riduci
A mio avviso c'è ancora un bel pò di confusione in merito ad array e cicli for. :? Ti consiglio di scaricarti una delle guide linkate sul sito e di vederti bene la teoria.

E' quello che sto facendo! D'altra parte programmo da 4 giorni e queste cose che cerco di creare mi seriverebbero per vedere se ho ben capito la teoria... (tralasciando i 3 anni di pascal a scuola...)
_________________
<<L'unica cosa che so fare col computer è farlo lavorare per me...>> yumichan
Torna in cima
Profilo Messaggio privato Invia email
Webmaster
Amministratore del forum



Messaggi: 438
Località: Provincia AL

MessaggioInviato: Venerdì 30 Aprile 2004    Oggetto:
Rispondi citando

Eccoti una possibile implementazione (sempre ammesso che io abbia capito bene cosa vuoi realizzare; la prossima volta aggiungi qualche riga per descrivere le tue intenzioni )

#include <iostream.h>

void main () {
int n1,n2; //per semplicità suppongo che i 2 numeri siano interi
char op;
cout<<"Inserisci il primo numero:"<<endl;
cin>>n1;
for (; ; ){ //ciclo for infinito (non molto "elegante" da usare ma utile e semplice)
cout<<"Inserisci l'operatore (+ , - , * , /) o 'q' per interromepere:"<<endl;
cin>>op;
if (op=='q') break;
cout<<"Inserisci l'altro numero:"<<endl;
cin>>n2;
switch (op) { //uso lo statement switch-case che è l'ideale in questa situazione
case '+': n1+=n2; break;
case '-': n1-=n2; break;
case '*': n1*=n2; break;
case '/': n1/=n2; break;
}
cout<<"Il risultato è: "<<n1<<endl;
}
}


Il programma esegue l'operazione scelta tra i 2 interi forniti in input e permette di eseguire ulteriori operazioni sul risultato.
L'uso di array in questo caso, secondo me, è da evitare (per via dei limiti legati alla definizione e al "riempimento"). Wink
Torna in cima
Profilo Messaggio privato
Mefistofele
Nuovo membro



Messaggi: 10
Località: Bergamo

MessaggioInviato: Venerdì 30 Aprile 2004    Oggetto:
Rispondi citando

Fantastico! Ma la mia idea originale era di fargli inserire operatori e numeri fino a che scrivesse 'q', qui invece fa un ciclo poi da il risultato e poi riprende... sono arrivato a modificare quindi così:

#include <iostream.h>

void main () {
int n1,n2; //per semplicità suppongo che i 2 numeri siano interi
char op; int a=1;
for (; ;a++ ){ if (a>1) { cout<<"Inserisci l'operatore o 'q' per interromepere:"<<endl;

cin>>op; }
cout<<"Inserisci il primo numero:"<<endl;
cin>>n1;
cout<<"Inserisci l'operatore o 'q' per interromepere:"<<endl;
cin>>op;
if (op=='q') break;
cout<<"Inserisci l'altro numero:"<<endl;
cin>>n2;
switch (op) { //uso lo statement switch-case che è l'ideale in questa situazione
case '+': n1+=n2; break;
case '-': n1-=n2; break;
case '*': n1*=n2; break;
case '/': n1/=n2; break;
}
}
cout<<"Il risultato è: "<<n1<<endl;
}

Ora devo vedere come dare il risultato giusto....
_________________
<<L'unica cosa che so fare col computer è farlo lavorare per me...>> yumichan
Torna in cima
Profilo Messaggio privato Invia email
Webmaster
Amministratore del forum



Messaggi: 438
Località: Provincia AL

MessaggioInviato: Venerdì 30 Aprile 2004    Oggetto:
Rispondi citando

Ora forse ho capito. Idea In pratica vuoi che l'utente possa inserire subito tutti i numeri e tutti gli operatori e poi il programma svolga il calcolo completo.
In questo caso allora credo proprio che dovrai rimettere gli array...

Buon lavoro! e se giungi a qualche buon risultato posta mi raccomando! Wink Laughing
Torna in cima
Profilo Messaggio privato
Mefistofele
Nuovo membro



Messaggi: 10
Località: Bergamo

MessaggioInviato: Sabato 01 Mag 2004    Oggetto:
Rispondi citando

Per ora sono arrivato a questo:

#include <iostream.h>
#include <stdlib.h>

void main () {
int n1,n2; int s[100]; int i=0; int ss[i];
char op; int a=0; char ope;
for (; ;a++,i++){
cout<<"Inserisci un numero:"<<endl;
cin>>n1;
cout<<"Inserisci l'operatore:"<<endl;
cin>>op;
cout<<"Inserisci un numero:"<<endl;
cin>>n2;
cout<<"Inserisci l'operatore o 'q' per interromepere:"<<endl;
cin>>ope;
switch (op) {
case '+': s[i]=n1+n2; break;
case '-': s[i]=n1-n2; break;
case '*': s[i]=n1*n2; break;
case '/': s[i]=n1/n2; break;
}
switch (ope) {
case '+': ss[i]+=s[i]; break;
case '-': ss[i]-=s[i]; break;
case '*': ss[i]*=s[i]; break;
case '/': ss[i]/=s[i]; break;
case 'q': cout<<ss[i]; exit(0);
}
}
}

Purtroppo così per fermarti devi scrivere "+" e poi "0" (a meno che hai altre operazioni da fare in modo che arrivi al secondo inserimento di operatore giusto giusto).
I risultati però sono sempre numeri molto alti (in genere provo con 4+4+3...=452 o qualcosa così).
Teoricamente pensavo ad una struttura di questo tipo:
n1 'op' n2 = s }
ope; } --> s 'ope' s
n1 'op' n2 = s }
Shocked :? Question
_________________
<<L'unica cosa che so fare col computer è farlo lavorare per me...>> yumichan
Torna in cima
Profilo Messaggio privato Invia email
riccardo_m
Moderatore



Messaggi: 653
Località: Cagliari/Pisa

MessaggioInviato: Mercoledì 30 Giugno 2004    Oggetto:
Rispondi citando

perchè non usi la reversed polish notation?

si tratta di scrivere le operazioni del tipo:

3 * 5 + 4 * 6

così:

3 5 * 4 6 * +

l'utilizzo di questa notazione, fra l'altro semplifica notevolmente il codice...

vedi anche: Linguaggio C - di Kernigharn e Ritchie
_________________
Sito Web di Riccardo Metere
Torna in cima
Profilo Messaggio privato HomePage
salvatore
Nuovo membro



Messaggi: 15

MessaggioInviato: Giovedì 05 Mag 2005    Oggetto:
Rispondi citando

Forse non è propri quello che volevi ma io ho scritto una calcolatrice in c.

#include <stdio.h>
#include <math.h>

int scelta;
float x, y, risultato;
double z;

main()
{

start:

printf ("\a calcolatrice elementare\n");
printf ("inserire la scelta");
printf ("\n 0. Esci");
printf ("\n 1. Addizione");
printf ("\n 2. Differenza");
printf ("\n 3. Moltiplicazione");
printf ("\n 4. Divisione");
printf ("\n 5. Radice quadrata");
printf ("\n 6. logaritmo decimale");
printf ("\n\t\t");
scanf ("%d", &scelta);

switch(scelta){

case 0 :
goto fine;
break;
case 1 :
printf (" inserire il primo addendo \n");
scanf("%f", &x);
printf ("\a inserire il secondo addendo \n");
scanf ("%f", &y);
printf ("\a");
/*calcolo dati*/
risultato=x+y;
break;

case 2:
printf (" inserire il primo numero \n");
scanf("%f", &x);
printf ("\a inserire il secondo numero\n");
scanf ("%f", &y);
printf ("\a");
/*calcolo dati*/
risultato=x-y;
break;

case 3:
printf (" inserire il primo numero \n");
scanf("%f", &x);
printf ("\a inserire il secondo numero\n");
scanf ("%f", &y);
printf ("\a");
/*calcolo dati*/
risultato=x*y;
break;

case 4:
printf (" inserire il primo numero \n");
scanf("%f", &x);
printf ("\a inserire il secondo numero\n");
scanf ("%f", &y);
printf ("\a");
/*calcolo dati*/
risultato=x/y;
break;

case 5:
printf ("inserire il numero di cui si vuole calcolare la radice\n");
scanf ("%f", &z);
printf ("\a");
risultato= sqrt(z);

case 6:
printf ("inserire il numero di cui si vuole sapere il log\n");
scanf ("%f", &z);
printf ("\a");
risultato= log10 (z);
}
printf ("\t il risultato e %f \a\a", risultato);
fine:
printf ("\n\n inserisci 1 per continuare 0 per uscire\n");
scanf ("%d", &scelta);

switch(scelta){

case 0:
break;

case 1:
goto start;
break;
default:
goto fine;

}

}


Mettendo le scelte all'inizio è molto più semplice. Wink
Torna in cima
Profilo Messaggio privato Invia email
elbambolo
Membro



Messaggi: 25

MessaggioInviato: Sabato 12 Mag 2007    Oggetto:
Rispondi citando

Salve Salve :D

mi sono appena iscritto e sono circa 2 settimane che ho iniziato a giocare con il c++ (ancora non sono in grado di dire programmare perche alla fine piu di giocarci non ci riesco).

ho letto l'evoluzione di questa calcolatrice e mi ci sono messo un po sotto.

il primo problema che avevo visto è che nella calcolatrice da voi proposta negli esercizi, mancavano dei controlli che a mio avviso sono importanti.
ad esempio controllare che quando si chiede di inserire un numero, l'utente inserisca realmente un numero e non una lettera.
cosi come per l'operatore.

ho creato un codice che in pratica, oltre che calcolare i numeri, li controlla e fa si che non ci siano sorprese.

PREMESSA: sono un meganibbuo.... probabilmente ci saranno parecchi errori nel mio listato, ne sono sicuro.. :D

se qualcuno è interessato, il codice è il seguente:
Codice: Espandi/Riduci
#include <iostream>
#include <string>
#include <cmath>

using namespace std;

int main()
{
   /**
      Elenco dei possibili operatori e delle loro funzioni
   */
   cout << "benvenuti nella calcolatrice di elbambolo :D \n";
   cout << "I possibili comandi sono: \n";
   cout << "\"+\" Addizione \n";
   cout << "\"-\" Sottrazione \n";
   cout << "\"*\" Moltiplicazione \n";
   cout << "\"/\" Divisione \n";
   cout << "\"r\" Radice quadrata \n";
   cout << "\"q\" Numero 1 elevato al numero 2: 3 alla 4 ec..\n";
   /**
      Il ciclo finisce quando alla domanda: un'altro calcolo? l'utente risponde con "n"
   */
   bool more = true;
   while(more)
   {
      double numero_1;
      cout << "Inserisci il primo numero seguito da invio: ";
      cin >> numero_1;
      if(cin.fail()) /** viene controllato che l'utente inserisca un numero valido */
      {
         cout << "Il numero inserito non e' valido";
         return 1;
      }

      

      cout << "Inserisci l'operatore seguito da invio: ";
      string operatore;
      cin >> operatore;
      
      /**
         Viene controllato se l'utente inserisce un'operatore valido
      */
      if (operatore != "+")
         if (operatore != "-")
            if (operatore != "*")
               if (operatore != "/")
                  if (operatore != "q")
                     if (operatore != "r")
                        if (operatore != "Q")
                           if (operatore != "R")
                     {
                        cout << "L'operatore inserito non e' valido";
                        return 1;
                           }

                        
                           
                /** Se l'operatore è radice quadrata, non c'è bisogno di inserire il secondo numero
                e il programma esegue subito il calcolo
            */
            if (operatore == "r")
               {
                  cout << "Il risultato e': " << sqrt (numero_1);
                  return 0;
               }
            
            if (operatore == "R")
            {
               cout << "Il risultato e': " << sqrt (numero_1);
               return 0;
            }


      cout << "Inserisci il secondo numero seguito da invio: ";
      double numero_2;
      cin >> numero_2;
      if (cin.fail()) /** controlla che il numero inserito sia valido */
      {
         cout << "Il numero inserito non e' valido!!!";
         return 1;
      }

      double risultato = 1;

      if (operatore == "+")
      {
         cout << "Il risultato e': " << numero_1 + numero_2 << "\n";
            cout << "Eseguire un'altro calcolo? (s/n) ";
         string risposta;
         cin >> risposta;

         if (risposta == "s")
            more = true;
         else
            if (risposta == "n")
               more = false;
      }
      else

      if (operatore == "-")
      {
         cout << "Il risultato e': " << numero_1 - numero_2 << "\n";
            cout << "Eseguire un'altro calcolo? (s/n) ";
         string risposta;
         cin >> risposta;

         if (risposta == "s")
            more = true;
         else
            if (risposta == "n")
               more = false;
      }
      else

      if (operatore == "*")
      {
         cout << "Il risultato e': " << numero_1 * numero_2 << "\n";
            cout << "Eseguire un'altro calcolo? (s/n) ";
         string risposta;
         cin >> risposta;

         if (risposta == "s")
            more = true;
         else
            if (risposta == "n")
               more = false;
      }
      else

      if (operatore == "/")
      {
         cout << "Il risultato e': " << numero_1 / numero_2 << "\n";
            cout << "Eseguire un'altro calcolo? (s/n) ";
         string risposta;
         cin >> risposta;

         if (risposta == "s")
            more = true;
         else
            if (risposta == "n")
               more = false;
      }

      else

      if (operatore == "q")
      {
         cout << "Il risultato e': " << pow (numero_1,  numero_2) << "\n";
            cout << "Eseguire un'altro calcolo? (s/n) ";
         string risposta;
         cin >> risposta;

         if (risposta == "s")
            more = true;
         else
            if (risposta == "n")
               more = false;
      }



   }
       /** il programma è finito, salutiamo e ringraziamo chi lo ha usato :D */
   cout << "Grazie per aver usato la calcolatrice di elbambolo :D";
   return 0;
}


sicuramente, noterete una cosa:
quando si esegue il calcolo della radice quadrata, il programma da il risultato ed esce dall'esecuzione.
questo perche io non sono ancora in grado di interromprere un ciclo e farlo riniziare da 0.

questo perche in pratica, la radice quadrata vuole solo un numero, mentre il resto delle operazioni ne richiedono 2.

qualsiasi critica o suggerimento è ben accetto :D
Torna in cima
Profilo Messaggio privato
j@k
Membro esperto



Messaggi: 216
Località: firenze

MessaggioInviato: Martedì 29 Mag 2007    Oggetto:
Rispondi citando

io è un pò ke avevo fatto questo ke ne pensate?
Codice: Espandi/Riduci

#include<iostream.h>
#include<math.h>//richiamo alla libreria usata per le operazioni matematiche
#include<windows.h>//richiamo alla libreria usata per le istruzioni "pause" e "cls"
void main()
{
   double x,y,ris=0;//definizione variabili
   char o='s';//idem
   short int cont=0;
   do//inizio ciclo con controllo in coda utilizzato per eseguire più calcoli
   {
      system("CLS");//istruzione importata poichè nn ha uguali in win 32 console application serve a cancellare la schermata
      cout<<"calcolatrice By Jak\ninserisci il calcolo che vuoi eseguire nella seguente formattazione\n( numero 1 operatore numero 2 )"<<endl;
      cout<<"------------------------------------------------"<<endl;
      cout<<"|  ";
      if (cont<1)
      {
         cin>>x;
         cin>>o;
         cin>>y;
         cont=cont++;
      }
      else
      {
         cout<<"vuoi che il primo termine sia sostituito dal risultato?"<<endl;
         cin>>o;
         if (o=='s'||o=='S'&&o!='n'&&o!='N')
         {
            system("CLS");
            cout<<"calcolatrice By Jak\ninserisci il calcolo che vuoi eseguire nella seguente formattazione\n( numero 1 operatore numero 2 )"<<endl;
            cout<<"------------------------------------------------"<<endl;
            cout<<"|  ";
            x=ris;
            cout<<x;
            cin>>o;
            cin>>y;
         }
         else
         {
            system("CLS");
            cout<<"calcolatrice By Jak\ninserisci il calcolo che vuoi eseguire nella seguente formattazione\n( numero 1 operatore numero 2 )"<<endl;
            cout<<"------------------------------------------------"<<endl;
            cout<<"|  ";
            cin>>x;
            cin>>o;
            cin>>y;
         }
      }

      cout<<"------------------------------------------------"<<endl;
      switch(o)//switch usato per definire il tipo di operazione da svolgere
         {
            case '^'://case per l'elevazione all'yesima potenza di x
               ris=pow(x,y);
            break;
            case 'r'://case per la radice 'y'esima di x
               ris= pow (x,1/y);
            break;
            case '+'://case per la somma
               ris=x+y;
               break;
            case '-'://case per la sottrazione
               ris=x-y;
            break;
            case '/'://case per la divisione
               ris=x/y;
            break;
            case '*'://case per il prodotto
               ris=x*y;
            break;
         }//fine switch
      cout<<"|";
      cout<<"="<<ris<<endl;//output della soluzione del calcolo
      cout<<"------------------------------------------------"<<endl;
      cout<<"vuoi eseguire un'altro calcolo?(s/n)"<<endl;//richiesta di input per sapere se eseguire altri calcoli o terminare
      cin>>o;//input di o
      }
      while (o!='n'|| o!='N'&& o=='s' && o=='S');//fine ciclo con controllo in coda utilizzato per eseguire più calcoli
      cout<<" -------------------"<<endl;
      cout<<"\a|programma terminato|"<<endl;//istruzione che indica l'uscita dal progamma con testo e audio(bip dato dal carattere di escape \a
      cout<<" -------------------"<<endl;
      system("PAUSE");//istruzione importata poichè nn ha uguali in win 32 console application serve a chiedere di premere un tasto prima di uscire per non perdere la schermata appena si eseguono i calcoli
}

_________________
ci sono 10 tipi di persone:
chi conosce il binario... e chi no... ;-)
Torna in cima
Profilo Messaggio privato HomePage
Mostra prima i messaggi di:   
Nuovo Topic   Rispondi    Indice del forum -> Aiuto - C++
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi Topic in questo forum
Non puoi rispondere ai Topic in questo forum
Non puoi modificare i tuoi messaggi in questo forum
Non puoi cancellare i tuoi messaggi in questo forum
Non puoi votare nei sondaggi in questo forum


Powered by phpBB

 

home - esercizi base - esercizi oop - algoritmi - java - forum - info & siti amici

Siti partner: c++ maniacs . web-creations . compilatori.com