Pagina 1 di 3 123 UltimaUltima
Risultati da 1 a 10 di 26

Discussione: Programmare in C++

Visualizzazione Ibrida

Messaggio precedente Messaggio precedente   Nuovo messaggio Nuovo messaggio
  1. #1

    Predefinito Programmare in C++

    Vorrei capire una cosa.
    Guardate questo programma (per calcolare il massimo e il minimo tra n numeri inseriti dll'utente):
    #include <stdio.h>
    #include <iostream>
    int main () {

    char fine;
    int val, max=-val, min=val;

    printf("Inserire i numeri da confrontare e premere q per terminare.\n");
    do {
    scanf("%d", &val);
    if (val>=max) max=val;
    if (val<=min) min=val;

    scanf("%c", &fine);
    }while(fine!='q');


    printf("Massimo: %d\n", max);
    printf("Minino: %d\n", min);

    system ("pause");
    return 0;
    }
    Perchè se utilizzo i float al posto degli int il programma preimposta come 1° minimo il valore 0 anziche il valore val?

    Seconda domanda: così com'è quotato il programma funziona. Ma non dovrebbe esserci una \n all'interno della seconda scanf che legge il carattere fine?
    Eppure se la inserisco il programma è errato. Boh...

    Spero qualcuno sappia rispondermi.

  2. #2
    coffeecoffeecoffeecoffeec L'avatar di Black Ghost
    Data Registrazione
    Sat Feb 2007
    Località
    クィーン・デキム
    Messaggi
    12,356

    Predefinito

    Penso che il backslash n si usi solamente all'interno di stringhe. Per andare a capo prova con l'end line.

    stupid sexy greedo butt


  3. #3
    Senior Member L'avatar di Roscio360
    Data Registrazione
    Tue Mar 2009
    Messaggi
    20,647

    Predefinito

    mi spiace. a scuola uso dei comandi un p&#242; diversi <_<


  4. #4
    A morte i camperoni! L'avatar di Darkito
    Data Registrazione
    Sat May 2006
    Località
    Catania
    Messaggi
    4,083

    Predefinito

    1) non ho capito bene la domanda ovvero, non ho capito se con la frase utilizzare i float intendi riscrivere il programma interamente oppure inserire dei numeri con la virgola senza modificare il programma. Nel primo caso dovrebbe funzionare,ma stai attento a non cambiare solo la dicitura int in float perch&#232; devi anche modificare i parametri delle funzioni printf e scanf. Ovvero devi scrivere cos&#236;:

    #include <stdio.h>
    #include <iostream>
    int main () {

    char fine;
    float val, max=-val, min=val;

    printf("Inserire i numeri da confrontare e premere q per terminare.\n");
    do {
    scanf("%f", &val);
    if (val>=max) max=val;
    if (val<=min) min=val;

    scanf("%c", &fine);
    }while(fine!='q');


    printf("Massimo: %f\n", max);
    printf("Minino: %f\n", min);

    system ("pause");
    return 0;
    }
    Nel secondo caso invece siccome accetti solo interi puoi avere problemi quando provi ad inserire numeri decimali.

    2) No, forse non hai ben chiaro come funzioni la funzione scanf. Il suo prototipo &#232; int scanf ( const char * formato, &variabile)
    Il primo argomento &#232; il tipo di dato che si vuole leggere dalla tastiera. Nel tuo caso "%d" per gli interi o "%f" per i float. Il secondo membro &#232; l'indirizzo della variabile in cui vuoi "salvare" il carattere letto dalla tastiera. Quindi scrivi &fine.


    PS: Comunque questo &#232; C e non C++
    Ultima modifica di Darkito; 31-10-2010 alle 19:39


    Max Pezzali Mania
    ---> http://www.maxpezzalimania.it

  5. #5
    Senior Member L'avatar di Roscio360
    Data Registrazione
    Tue Mar 2009
    Messaggi
    20,647

    Predefinito

    Citazione Originariamente Scritto da Darkito Visualizza Messaggio


    PS: Comunque questo è C e non C++
    ah ecco. ora si spiega io in c non so ancora programmare


  6. #6
    Senior Member L'avatar di Smallman_647
    Data Registrazione
    Tue Apr 2010
    Località
    Manfredonia(FG)
    Messaggi
    5,592

    Predefinito

    Per la tua prima domanda, semplicemente in queste stringa:

    if (val>=max) max=val;
    if (val<=min) min=val;

    se tu inserisci un float non riesce a fare un confronto in modo giusto.

    Precisamente non riesce a confrontare ad esempio se 7.00=7.00, per una questione di approssimazione. Proprio per questo bisogna sempre evitare i confronti con i numeri float.

    Per la seconda, semplicemente \n si usa al massimo nella printf, non nella scanf.

    perchè lo hai detto tu che sei ogni sapiente

  7. #7
    A morte i camperoni! L'avatar di Darkito
    Data Registrazione
    Sat May 2006
    Località
    Catania
    Messaggi
    4,083

    Predefinito

    Citazione Originariamente Scritto da Smallman_647 Visualizza Messaggio
    Per la tua prima domanda, semplicemente in queste stringa:

    if (val>=max) max=val;
    if (val<=min) min=val;

    se tu inserisci un float non riesce a fare un confronto in modo giusto.

    Precisamente non riesce a confrontare ad esempio se 7.00=7.00, per una questione di approssimazione. Proprio per questo bisogna sempre evitare i confronti con i numeri float.

    Per la seconda, semplicemente \n si usa al massimo nella printf, non nella scanf.
    In realt&#224; quella riga di codice non da alcun problema in questo caso specifico,dato che l'operazione di maggiore o minore sui float funziona perfettamente. L'unica operazione che non si riesce a fare perfettamente con i float sono le operazione di uguaglianza del tipo:
    float prova=7.8;
    if(prova==7.8)
    printf("Confronto riuscito!");
    else
    printf("Confronto non riuscito!")
    L'output de codice di sopra sar&#224; sempre "Confronto non riuscito", per via delle varie approssimazioni che avvengono dopo la virgola.
    Ultima modifica di Darkito; 01-11-2010 alle 01:04


    Max Pezzali Mania
    ---> http://www.maxpezzalimania.it

  8. #8
    *spallucce* L'avatar di Naked
    Data Registrazione
    Tue Mar 2005
    Località
    Milano | Caltanissetta
    Messaggi
    4,227

    Predefinito

    Intanto &#232; sbagliato non inizializzare le variabili. Il programma sostanzialmente sembra che funzionai perch&#232; i valori che spara dentro le variabili all'inizio sono altissimi (a me 4200240). Se provi a dare come input 9999999 il programma produce come massimo 9999999 e minimo 4200240, anche se io non l'ho digitato.
    Per quanto riguarda le float il discorso parte da qua: tu non inizializzi le variabili, ed &#232; il programma che da come valore iniziale 0.000000.
    Per quanto riguarda \n dentro la scanf, non serve a niente. \n &#232; semplicemente un carattere di 'a capo' quando stampi a schermo, non ha alcuna influenza sulla scanf.
    ~Pray, saviour\Dream, Child of Prayer\Forever and ever\Bring us peace~



  9. #9
    A morte i camperoni! L'avatar di Darkito
    Data Registrazione
    Sat May 2006
    Località
    Catania
    Messaggi
    4,083

    Predefinito

    Citazione Originariamente Scritto da Naked Visualizza Messaggio
    Intanto è sbagliato non inizializzare le variabili. Il programma sostanzialmente sembra che funzionai perchè i valori che spara dentro le variabili all'inizio sono altissimi (a me 4200240). Se provi a dare come input 9999999 il programma produce come massimo 9999999 e minimo 4200240, anche se io non l'ho digitato.
    Per quanto riguarda le float il discorso parte da qua: tu non inizializzi le variabili, ed è il programma che da come valore iniziale 0.000000.
    Per quanto riguarda \n dentro la scanf, non serve a niente. \n è semplicemente un carattere di 'a capo' quando stampi a schermo, non ha alcuna influenza sulla scanf.
    Il valore di default varia da compilatore a compilatore.Però l'esempio dovrebbe funzionare senza problemi perchè mette in max un valore negativo mentre in min un valore positivo e finchè si inseriscono entrambi i numeri non si hanno problemi. Per essere più preciso ed evitare errori il codice dovrebbe essere così:

    #include <stdio.h>
    #include <iostream>
    int main () {

    char fine;
    int val=0, max=0, min=0;

    printf("Inserire i numeri da confrontare e premere q per terminare.\n");
    scanf("%d", &val);
    max=val;
    min=val;
    do {
    if (val>=max) max=val;
    if (val<=min) min=val;
    scanf("%d",&val);
    scanf("%c", &fine);
    }while(fine!='q');


    printf("Massimo: %d\n", max);
    printf("Minino: %d\n", min);


    system ("pause");
    return 0;
    }


    Max Pezzali Mania
    ---> http://www.maxpezzalimania.it

  10. #10

    Predefinito

    Allora, intanto grazie per il chiarimento sui float. In particolare, non sapevo dei problemi che si possono creare andando ad uguagliare dei float.

    Darkito, il programma che hai modificato contiene un paio di righe in pi&#249;. In pratica se inizializzo a zero i parametri e poi faccio assumere loro il valore inserito dall'utente non rischio errori?

    Un'ultima cosa per quanto riguarda gli \n all'interno di una scanf.
    La maggior parte di voi ritiene siano inutili e per il 90% dei casi potrei essere d'accordo.

    Se notate, la scanf sui caratteri in cui volevo inserire uno \n &#232; la seconda che si incontra nel codice scritto da me. Prima di quella c'&#232; una scanf su un numero intero inserito dall'utente. Durante questa prima scanf, l'utente inserisce il numero ma preme anche Invio. Nella standard input del computer entrano sia il valore intero inserito, sia il carattere invio. Proprio questo carattere Invio potrebbe causare un problema in una seconda scanf dedicata ai caratteri (come accade nel mio caso), poiche questa seconda scanf andrebbe a leggere non "q" per terminare, ma ci&#242; che nella standard input lo precede, ovvero l'Invio inserito dall'utente nella prima scanf. Inserendo una \n nella seconda scanf risolveremmo il problema. Ma perch&#232; qui invece non serve?

    Ora per semplificare vi mostro un codice che senza una \n in una seconda scanf per caratteri genererebbe un piccolo problema (provate a togliere \n):
    #include <stdio.h>
    #include <iostream>
    int main () {
    float a, b;
    char operation;
    int ok=1;

    printf("Inserire i valori a e b:\n");
    scanf("%f%f", &a, &b);

    do {printf("Indacare l'operazione da eseguire (+,-,*,/):\n");
    scanf("\n%c", &operation);
    if (operation=='+') ok=0;
    if (operation=='-') ok=0;
    if (operation=='*') ok=0;
    if (operation=='/') ok=0;
    } while(ok);

    switch(operation){
    case '+': printf("%f+%f=%f\n", a, b, a+b);
    break;
    case '-': printf("%f-%f=%f\n", a, b, a-b);
    break;
    case '*': printf("%f*%f=%f\n", a, b, a*b);
    break;
    case '/': printf("%f/%f=%f\n", a, b, a/b);
    break;
    default: printf("Operazione non riconosciuta.\n");
    }
    system("pause");

    return 0;
    }
    @Vaan: no, non ancora.
    Ultima modifica di Archie Hicox; 01-11-2010 alle 11:45

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •