Aiuto per un esercizio

di il
37 risposte

37 Risposte - Pagina 2

  • Re: Aiuto per un esercizio

    cslash89 ha scritto:


    No intendo dire, lasciando stare per un attimo il metodo da voi suggerito che già si è rivelato efficace, volevo provare a svolgere il medesimo esercizio in questa maniera:
    
    int main(int argc, char** argv) {
        int i;
        float x, min;
        
        i=0;
        while(i>=0 && x>=0){
            cout<<"Inserire un valore: \n";
            cin>>x;
            
            if(x<min){
              min=x;
            }
            i++;
        }
        cout<<"Il valore minore e': "<<min<<endl;
       
        return 0;
    }
    
    In questo esempio stampa anche il valore negativo che uso per uscire dal ciclo.
    Approfittando che ho inserito un contatore di cicli "i", nel momento in cui inserisco il valore negativo, è possibile annullare l'ultimo giro e quindi stampare l'ultimo valore minore inserito immediatamente prima del valore negativo?
    Spero di aver spiegato bene quello che intendo dire, me è un pò difficile a parole XD
    Stai complicando le cose inserendo una variabile inutile e questo sarebbe bene evitarlo sempre.
    Un possibile metodo alternativo sarebbe questo:
    int main(void){
       float x = FLT_MAX;
       float min = FLT_MAX;
       do{
    	if(x<min)
    		min=x;
    	cout << "Inserire un valore: \n";
    	cin >> x;
       }while(x >= 0.0);
        
        cout << "Il valore minore e': " << min << endl;
        return 0;
    }
  • Re: Aiuto per un esercizio

    Weierstrass ha scritto:


    cslash89 ha scritto:


    No intendo dire, lasciando stare per un attimo il metodo da voi suggerito che già si è rivelato efficace, volevo provare a svolgere il medesimo esercizio in questa maniera:
    
    int main(int argc, char** argv) {
        int i;
        float x, min;
        
        i=0;
        while(i>=0 && x>=0){
            cout<<"Inserire un valore: \n";
            cin>>x;
            
            if(x<min){
              min=x;
            }
            i++;
        }
        cout<<"Il valore minore e': "<<min<<endl;
       
        return 0;
    }
    
    In questo esempio stampa anche il valore negativo che uso per uscire dal ciclo.
    Approfittando che ho inserito un contatore di cicli "i", nel momento in cui inserisco il valore negativo, è possibile annullare l'ultimo giro e quindi stampare l'ultimo valore minore inserito immediatamente prima del valore negativo?
    Spero di aver spiegato bene quello che intendo dire, me è un pò difficile a parole XD
    Stai complicando le cose inserendo una variabile inutile e questo sarebbe bene evitarlo sempre.
    Un possibile metodo alternativo sarebbe questo:
    int main(void){
       float x = FLT_MAX;
       float min = FLT_MAX;
       do{
    	if(x<min)
    		min=x;
    	cout << "Inserire un valore: \n";
    	cin >> x;
       }while(x >= 0.0);
        
        cout << "Il valore minore e': " << min << endl;
        return 0;
    }
    Hai ragione, ma a primo ragionamento mi è venuto di risolverlo così XD In ogni caso grazie per la dritta, il fatto è che ovviamente essendo autodidatta ho solo un testo e internet a cui riferirmi quindi qualche cosa mi sfugge sicuramente
  • Re: Aiuto per un esercizio

    No, sei fuori strada, il contatore non serve a nulla e non ti aiuta.
  • Re: Aiuto per un esercizio

    Non puoi annullare l'ultimo ciclo, ma puoi evitare che faccia l'assegnazione: basta rimettere l'if come era prima:
    if (x < min && x >= 0.0)
        min = x;
    Comunque il test sul contatore non serve a niente, ti complichi la vita per niente.
  • Re: Aiuto per un esercizio

    Andrea Quaglia ha scritto:


    Non puoi annullare l'ultimo ciclo, ma puoi evitare che faccia l'assegnazione: basta rimettere l'if come era prima:
    if (x < min && x >= 0.0)
        min = x;
    Comunque il test sul contatore non serve a niente, ti complichi la vita per niente.
    Grazie ora ho imparato che non è possibile annullare l'ultimo ciclo:
    Ora passo ad un altro esercizio. Si tratta del calcolo delle potenze.
    
    int main(int argc, char** argv) {
        int i;
        double a, n, ris;
        
        cout<<"Inserire la base: \n";
        cin>>a;
        cout<<"Inserire l'esponente: \n";
        cin>>n;
        if(a==0 && n==0){
            cout<<"Non ha significato. \n";
        }
        if(n==0){
            ris=1;
        }
        if(n>0){
            ris=a;
            for(i=1; i<n; i++){
                ris=ris*a;
            }
            
        }
        if(n<0){
            ris=a;
            for(i=1; i<n; i++){
                ris=1/(ris*a);
            }
            
        }
       
        cout<<"Il risultato e': "<<ris<<endl;
        return 0;
    }
    
    Il programma funziona bene fino a n>0. Quando pongo n<0, non mi restitiusce il giusto risultato, e non capisco il perchè eppure la formula è quela giusta. es: 2^-2 = 1/2^2.
  • Re: Aiuto per un esercizio

    Prova a fare a mano quello che fa il tuo codice e l'errore lo vedi da solo già al secondo passaggio
  • Re: Aiuto per un esercizio

    Weierstrass ha scritto:


    Prova a fare a mano quello che fa il tuo codice e l'errore lo vedi da solo già al secondo passaggio
    Grazie pre il suggerimento, alla fine sono riuscit a risolvere così, ma non so quanto sia corretto, ma funzione bene:
    
    int main(int argc, char** argv) {
        int i,j;
        double a, n, ris, ris2;
        
        cout<<"Inserire la base: \n";
        cin>>a;
        cout<<"Inserire l'esponente: \n";
        cin>>n;
        if(a==0 && n==0){
            cout<<"Non ha significato. \n";
        }
        if(n==0){
            ris=1;
            ris2=ris;
        }
        if(n>0){
            ris=a;
            for(i=1; i<n; i++){
                ris=ris*a;
                ris2=ris;
            }
            
        }
        if(n<0){
            ris=-a;
            for(j=1; j<-n; j++){
                ris=ris*a;
                ris2=1/-ris;
                
            }
            
        }
       
        cout<<"Il risultato e': "<<ris2<<endl;
        return 0;
    }
    [\code]
    Cosa ne pensi?
  • Re: Aiuto per un esercizio

    Si possono usare gli else

    Non hai bisogno di una seconda variabile, basta fare l'inversione fuori dal for (a parte che non ho capito il meno)

    Comunque senza reinventarsi la ruota
    http://www.cplusplus.com/reference/cmath/pow
    e non è una scorciatoia: gli elevamenti a potenza di float e double sono operazioni complesse
  • Re: Aiuto per un esercizio

    Weierstrass ha scritto:


    Si possono usare gli else

    Non hai bisogno di una seconda variabile, basta fare l'inversione fuori dal for (a parte che non ho capito il meno)

    Comunque senza reinventarsi la ruota
    http://www.cplusplus.com/reference/cmath/pow

    E non è una scorciatoia, l'elevamento a Potenza di float e double sono operazioni complesse
    Si lo so che si possono usare gli else, è che quando sono in fase di test, scrivo semplice, poi vado a sistemare quello che posso.
    Il meno probabilmente è una forzatura per far quadrare i conti, infatti per questo non so quanto sia corretto l'algoritmo, nonstante il risultato esca.
    Per il pow, avevo letto una cosa del genere, però è mio dovere risolvere gli esercizi secondo i metodi che sono arrivato a studiare, quinsi senza l'uso del pow. Poi ci arriverò ma sono ancora agli inizi, non posso usare cose che non conosco (valeva anche per FLT_MAX dell'esercizo precedente).
  • Re: Aiuto per un esercizio

    Allora dichiara n come int, che c'entra il double?

    FLT_MAX non era necessario nell'esercizio precedente: si poteva inizializzare il minimo dopo l'immissione del primo elemento (ponendolo uguale a esso) e fare il ciclo dal secondo elemento in poi
  • Re: Aiuto per un esercizio

    Weierstrass ha scritto:


    Allora dichiara n come int, che c'entra il double?
    Ero in fase di test, ed inizialmete avevo messo float (he poi nel mio caso float o double combia poco perchè ci riferiamo a numeri reali), appunto perchè dovevo valutare il caso in cui x<0 quindi nel caso avevo 2^-2, mi doveva restituire 0.25, cosa che non avrei potuto ottenere se avessi messo int
  • Re: Aiuto per un esercizio

    cslash89 ha scritto:


    Weierstrass ha scritto:


    Allora dichiara n come int, che c'entra il double?
    Ero in fase di test, ed inizialmete avevo messo float (he poi nel mio caso float o double combia poco perchè ci riferiamo a numeri reali), appunto perchè dovevo valutare il caso in cui x<0 quindi nel caso avevo 2^-2, mi doveva restituire 0.25, cosa che non avrei potuto ottenere se avessi messo int
    Quindi per fare una potenza intera di un numero reale devi dichiarare l'esponente come numero reale, altrimenti non funziona? Sicuro sicuro?
  • Re: Aiuto per un esercizio

    Weierstrass ha scritto:


    cslash89 ha scritto:


    Weierstrass ha scritto:


    Allora dichiara n come int, che c'entra il double?
    Ero in fase di test, ed inizialmete avevo messo float (he poi nel mio caso float o double combia poco perchè ci riferiamo a numeri reali), appunto perchè dovevo valutare il caso in cui x<0 quindi nel caso avevo 2^-2, mi doveva restituire 0.25, cosa che non avrei potuto ottenere se avessi messo int
    Quindi per fare una potenza intera di un numero reale devi dichiarare l'esponente come numero reale, altrimenti non funziona? Sicuro sicuro?
    La mia teoria deriva dal fatto che, se ad esempio imposto, int a=3, b=2; e float s; se faccio a/b, s=1, invece impostando float a=3, b=2; e faccio a/b, s=1.5... ora non so se un limite del compliatore che uso (netbeans), ma se voglio il risultato preciso devo impostare float anche i numeri interi di partenza. Quindi ogni volta che mi serve un risultato reale, mi viene spontaneo partire da float.
  • Re: Aiuto per un esercizio

    Vabbè faccio prima a scriverti il codice. Volevo dire che avresti potuto fare anche così
    
    int main(int argc, char** argv) {
    	double a;
    	int n;
        
    	cout<<"Inserire la base: \n";
    	cin>>a;
    	cout<<"Inserire l'esponente: \n";
    	cin>>n;
    
    	if(a == 0.0){
    		if(n > 0)
    			cout<<"Il risultato e': 0 \n";
    		else
    			cout<<"Non ha significato. \n";
    		return 0;
    	}
    
    	double ris = 1.0;
    	int abs_n = n < 0 ? -n : n;
    
    	for(int i = 1; i <= abs_n; i++)
    		ris *= a;
    	if(n < 0)
    		ris = 1.0 / ris;
    	cout<<"Il risultato e': "<<ris<<endl;
    	return 0;
    }
    A parte questo devi studiare obbligatoriamente i tipi numerici, cioè sapere esattamente la differenza tra char, int, long, float e double, non puoi elaborare teorie da solo (a che pro, poi? E' tutto noto, non c'è da fare ipotesi). Altrimenti rischi di incorrere in gravi errori che poi non saprai come risolvere
  • Re: Aiuto per un esercizio

    Weierstrass ha scritto:


    Vabbè faccio prima a scriverti il codice. Volevo dire che avresti potuto fare anche così
    
    int main(int argc, char** argv) {
    	double a;
    	int n;
        
    	cout<<"Inserire la base: \n";
    	cin>>a;
    	cout<<"Inserire l'esponente: \n";
    	cin>>n;
    
    	if(a == 0.0){
    		if(n > 0)
    			cout<<"Il risultato e': 0 \n";
    		else
    			cout<<"Non ha significato. \n";
    		return 0;
    	}
    
    	double ris = 1.0;
    	int abs_n = n < 0 ? -n : n;
    
    	for(int i = 1; i <= abs_n; i++)
    		ris *= a;
    	if(n < 0)
    		ris = 1.0 / ris;
    	cout<<"Il risultato e': "<<ris<<endl;
    	return 0;
    }
    A parte questo devi studiare obbligatoriamente i tipi numerici, cioè sapere esattamente la differenza tra char, int, long, float e double, non puoi elaborare teorie da solo (a che pro, poi? E' tutto noto, non c'è da fare ipotesi). Altrimenti rischi di incorrere in gravi errori che poi non saprai come risolvere
    Scusa con teoria mi ero espresso male, era un fatto pratico, diciamo che per comodità, tendo a mettere float tutto cioò che possa restiuirmi un risultato reale, ma da ora in poi farò più attenzione. Piuttosto visto che mi hai scritto il codice, potresti spiegarmi gentilmente questa stringa che non mi è chiara? "
    int abs_n = n < 0 ? -n : n;[\code]
Devi accedere o registrarti per scrivere nel forum
37 risposte