C++, mi serve una mano su un codice.

di il
9 risposte

C++, mi serve una mano su un codice.

Questo è il codice:

#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <string>
#include <cmath>

using namespace std;
void inserisci_operazione ();
void somma ();
void sottrazione ();
void moltiplicazione ();
void divisione ();
void potenza ();
void radice ();
void ringraziamento();
char responso[256];
char nome_utente[256];
char responso2[256];
char addendo1[256];
char addendo2[256];

int main ()
{
cout << endl << "Ciao, sono Eliobot 0001 il calcolatore. Come ti chiami?" << endl;
cin.getline(nome_utente,256);
inserisci_operazione ();
return 0;
}
void inserisci_operazione ()
{
cout << "Ciao " << nome_utente << " che operazione devo eseguire ora?" << endl << "(Digita: 1 per somma, 2 per sottrazione, 3 per moltiplicazione, 4 per divisione, 5 per potenza,6 per radice, 0 per chiudere il programma.)" << endl;
cin.getline(responso2,256);
switch (atoi(responso2))
{
case 1:
somma ();
break;
case 2:
sottrazione ();
break;
case 3:
moltiplicazione ();
break;
case 4:
divisione ();
break;
case 5:
potenza ();
break;
case 6:
radice ();
break;
case 0:
ringraziamento ();
break;
}
}
void ringraziamento ()
{
cout << "Grazie per aver usato Eliobot 0001" << endl;
}
void somma ()
{
cout << "Dimmi il primo numero." << endl;
cin.getline(addendo1,256);
cout << "Dimmi il secondo numero." << endl;
cin.getline(addendo2,256);
cout << "Il risultato è " << (atoi(addendo1) + atoi(addendo2)) << endl;
inserisci_operazione();
}
void sottrazione ()
{
cout << "Dimmi il primo numero." << endl;
cin.getline(addendo1,256);
cout << "Dimmi il secondo numero." << endl;
cin.getline(addendo2,256);
cout << "Il risultato è " << (atoi(addendo1) - atoi(addendo2)) << endl;
inserisci_operazione();
}
void moltiplicazione ()
{
cout << "Dimmi il primo numero." << endl;
cin.getline(addendo1,256);
cout << "Dimmi il secondo numero." << endl;
cin.getline(addendo2,256);
cout << "Il risultato è " << (atoi(addendo1) * atoi(addendo2)) << endl;
inserisci_operazione();
}
void divisione ()
{
cout << "Dimmi il primo numero." << endl;
cin.getline(addendo1,256);
cout << "Dimmi il secondo numero." << endl;
cin.getline(addendo2,256);
cout << "Il risultato è " << (atoi(addendo1) / atoi(addendo2)) << endl;
inserisci_operazione();
}
void potenza ()
{
cout << "Dimmi il numero." << endl;
cin.getline(addendo1,256);
cout << "Il risultato è " << (atoi(addendo1) * atoi(addendo1)) << endl;
inserisci_operazione();
}
void radice ()
{
float a,b;
cout << "Dimmi il numero." << endl;
cin >> a;
b = sqrt(a);
cout << "Il risultato è " << b << endl;
inserisci_operazione();
}



l'applicazione in se è una calcolatrice, mi serve per capire come funzionano certi ogetti, c'è un problema quando faccio la radice anziche farmi continuare a fare operazioni l'applicazione si chiude.
non so usare cicli e non mki va ancora di impararli, per favore potete dirmi cosa ho sbagliato??

9 Risposte

  • Re: C++, mi serve una mano su un codice.

    Hai un atteggiamento sbagliato ... "non mi va ..." ...

    Chiamare continuamente la funzione

    inserisci_operazione ();

    è gravemente sbagliato in quanto non trasferisci semplicemente l'esecuzione ma effettui continuamente chiamate ricorsive.

    Il metodo corretto è usare un ciclo e dovresti imparare a farlo.

    Il problema dell'uscita del programma è un altro, basta una linea

    cin.ignore();

    dopo la cin >> a; nella funzione che calcola la radice ma non mi preoccuperei molto di quel problema.
  • Re: C++, mi serve una mano su un codice.

    Infatti quoto oregon.
    E comunque perchè prendere in input una stringa quando poi è molto semplice dichiarandolo come intero ed evitare un bel pò di casini....
    #include <iostream>
    #include <cstring>
    #include <stdlib.h>
    #include <string>
    #include <cmath>
    
    using namespace std;
    void inserisci_operazione ();
    void somma ();
    void sottrazione ();
    void moltiplicazione ();
    void divisione ();
    void potenza ();
    void radice ();
    void ringraziamento();
    char responso[256];
    char nome_utente[256];
    int responso2;
    char addendo1[256];
    char addendo2[256];
    
    int main ()
    {
    cout << endl << "Ciao, sono Eliobot 0001 il calcolatore. Come ti chiami?" << endl;
    cin.getline(nome_utente,256);
    inserisci_operazione ();
    return 0;
    }
    void inserisci_operazione ()
    {
    cout << "Ciao " << nome_utente << " che operazione devo eseguire ora?" << endl << "(Digita: 1 per somma, 2 per sottrazione, 3 per moltiplicazione, 4 per divisione, 5 per potenza,6 per radice, 0 per chiudere il programma.)" << endl;
    cin >> responso2;
    switch (responso2)
    {
    case 1:
    somma ();
    break;
    case 2:
    sottrazione ();
    break;
    case 3:
    moltiplicazione ();
    break;
    case 4:
    divisione ();
    break;
    case 5:
    potenza ();
    break;
    case 6:
    radice ();
    break;
    case 0:
    ringraziamento ();
    break;
    }
    }
    void ringraziamento ()
    {
    cout << "Grazie per aver usato Eliobot 0001" << endl;
    }
    void somma ()
    {
    cout << "Dimmi il primo numero." << endl;
    cin.getline(addendo1,256);
    cout << "Dimmi il secondo numero." << endl;
    cin.getline(addendo2,256);
    cout << "Il risultato è " << (atoi(addendo1) + atoi(addendo2)) << endl;
    inserisci_operazione();
    }
    void sottrazione ()
    {
    cout << "Dimmi il primo numero." << endl;
    cin.getline(addendo1,256);
    cout << "Dimmi il secondo numero." << endl;
    cin.getline(addendo2,256);
    cout << "Il risultato è " << (atoi(addendo1) - atoi(addendo2)) << endl;
    inserisci_operazione();
    }
    void moltiplicazione ()
    {
    cout << "Dimmi il primo numero." << endl;
    cin.getline(addendo1,256);
    cout << "Dimmi il secondo numero." << endl;
    cin.getline(addendo2,256);
    cout << "Il risultato è " << (atoi(addendo1) * atoi(addendo2)) << endl;
    inserisci_operazione();
    }
    void divisione ()
    {
    cout << "Dimmi il primo numero." << endl;
    cin.getline(addendo1,256);
    cout << "Dimmi il secondo numero." << endl;
    cin.getline(addendo2,256);
    cout << "Il risultato è " << (atoi(addendo1) / atoi(addendo2)) << endl;
    inserisci_operazione();
    }
    void potenza ()
    {
    cout << "Dimmi il numero." << endl;
    cin.getline(addendo1,256);
    cout << "Il risultato è " << (atoi(addendo1) * atoi(addendo1)) << endl;
    inserisci_operazione();
    }
    void radice ()
    {
    float a,b;
    cout << "Dimmi il numero." << endl;
    cin >> a;
    b = sqrt(a);
    cout << "Il risultato è " << b << endl;
    inserisci_operazione();
    }
  • Re: C++, mi serve una mano su un codice.

    Sto appena iniziando, e scusa se l'atteggiamento è sbagliato, i cicli li conosco ma non li so usare...
    grazie, non ho capito cosa intendevi con fare ricorso a una funzione visto che mi sembra di farci sempre ricorso :/ , e neanche cosa intendevi con intero... sono ancora molto ignorante, comunque grazie dell'aiuto
  • Re: C++, mi serve una mano su un codice.

    Non fare ricorso ... ma usare la funzione "ricorsivamente".

    Non puoi comprendere appieno adesso il problema. Se vuoi accogliere l'aiuto (dato che l'hai chiesto) in modo che sia fruttuoso per te, impara ad usare i cicli.
  • Re: C++, mi serve una mano su un codice.

    Mi puoi consigliare la guida, oppure me li potresti spiegare tu, io conosco il ciclo for, il ciclo while e il do-while. Non so se sono gli unici, ma trovo molta difficoltà ad applicarne anche solo uno
  • Re: C++, mi serve una mano su un codice.

    Prova a fare questi tre esercizi...

    -mediante il ciclo for() stampa tutti i numeri da 10 a 100
    -mediante il ciclo while() simula una funzione ricorsiva per il calcolo del fattoriale di N
    -mediante un ciclo do...while() alloca dinamicamente una stringa che contiene il tuo nome(il programma aggiunge un nuovo char all'array in cui salva il carattere appena letto, finchè il carattere inserito !='\n')(ps: un modo è usare la realloc () )

    Secondo me, se sai scrivere questi programmi conosci perfettamente i 3 cicli.
    Altrimenti prova almeno a pensare a una soluzione e poi dicci i tuoi dubbi
  • Re: C++, mi serve una mano su un codice.

    Conosco solo i nomi non li so proprio usare questo è il dunque in più nel libro che ho non sono spiegati molto bene
  • Re: C++, mi serve una mano su un codice.

    elithebest_98 ha scritto:


    Conosco solo i nomi non li so proprio usare questo è il dunque in più nel libro che ho non sono spiegati molto bene
    Ma che schifo di libro hai???

    provo a spiegarti un po' in generale questi tre cicli (lo so, sono negato con le spiegazioni , ma almeno ho tentato di aiutarti)

    i cicli sono dei frammenti di codice che ti permettono di eseguire più volte determinate istruzioni.
    ci sono tre principali tipi di iterazione: a condizione iniziale, a condizione finale e a conteggio.

    Il ciclo a condizione iniziale è costituito da
    while(<condizione>){
       ...istruzioni...
    }
    
    In questo tipo di iterazione le istruzioni (tutto il codice scritto tra le graffe) vengono eseguite finchè la variabile <condizione> è vera.
    Questo ciclo viene solitamente utilizzato quando non si conosce a priori il numero di iterazioni necessarie, ma solo la condizione di uscita.
    Un'esempio e' il ciclo principale di un videogioco: finchè la partita non è terminata, esegue tutte le operazioni necessarie e crea un altro frame.

    ps: se la <condizione> è falsa fin dall'inizio, il ciclo non si esegue mai.

    Il ciclo a condizione finale è costituito da
    do{
        ...istruzioni...
    }while(<condizione>);
    Questo tipo di iterazone è uguale al ciclo while(), ma la condizione di ripetizione viene verificata alla fine del blocco di istruzioni.
    E' utile quando si vuole eseguire almeno una volta le istruzioni del ciclo, che spesso determinano se verrà rieseguito o meno.
    Un esempio è un algoritmo che prende in input una serie di numeri finchè non viene inserito '0'; ovviamente per eseguire il controllo è necessario inserire prima il numero, quindi il ciclo while() sarebbe un po' scomoda.

    Il ciclo a conteggio è costituito da
    for(<contatore>=<valore di partenza>;<condizione>;<modifica del contatore>){
         ...istruzioni...
    }
    Questo ciclo è utilizzato assieme a una variabile definita "variabile contatore", che viene inizialmente inizializzata, e poi le istruzioni vengono eseguite finchè la <condizione>(che spesso ha a che fare con il contatore) è vera.
    Alla fine di ogni ripetizione il contatore viene modificato opportunamente(spesso incrementato o diminuito di un unità);
    E' utile quando devi eseguire un blocco di istruzoni un numero conosciuto di volte.
    Un esempio e' scrivere 10 volte la stessa frase.
    E' utilissimo quando si lavora con array/vettori;

    ps: non è obbligatorio riempire tutti e tre i campi

    esempi
    
    
    int main(){
        while(1){                //ciclo infinito
            int i,                //variabile contatore
            int v[50];                //array 
    
            for(i=0;i<50;i++){                //inizializza tutto l'array a 0
                v[i]=0;
            }
    
            i=(-1);                                //così parte dall'elemento 0
            do{
                i+=1;                                //incrementa il contatore
                cin << v[i];                        //input il valore 
            }while(v[i]!=0 and i<50);                //finchè il valore inserito è diverso da 0 e sono stati inseriti meno di 50 num(x evitare overflow dell'array statico)
    
            for( ;i>0; ){                //stampa tutti gli elementi
                cout << v[i-1];
                i--;                         //decrementa il contatore(avrei potuto farlo nel ciclo)
            }                                        
            
        }
    }
    

    Spero di averti fatto capire quacosa... al massimo guardati qualch video su youtube

  • Re: C++, mi serve una mano su un codice.

    Grazie, ora faccio qualche test e provo anche ad aggiungerlo al codice di sopra. Grazie dell'aiuto
Devi accedere o registrarti per scrivere nel forum
9 risposte