Annuncio

Collapse
No announcement yet.

Programmare in C++

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts

  • 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
    Penso che il backslash n si usi solamente all'interno di stringhe. Per andare a capo prova con l'end line.
    sigpic

    stupid sexy greedo butt

    Comment


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

      sigpic

      Comment


      • #4
        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++
        Last edited by Darkito; 31 October 2010, 20:39.

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

        Comment


        • #5
          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

          sigpic

          Comment


          • #6
            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

            Comment


            • #7
              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.
              Last edited by Darkito; 01 November 2010, 02:04.

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

              Comment


              • #8
                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~


                sigpic

                Comment


                • #9
                  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;
                  }

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

                  Comment


                  • #10
                    Ma non usate java a scuola??
                    Vaan9200 sigpic
                    Gioco preferito per PS2: Final Fantasy XII
                    Gioco preferito per PS3: Valkyria Chronicles

                    Comment


                    • #11
                      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.
                      Last edited by Archie Hicox; 01 November 2010, 12:45.

                      Comment


                      • #12
                        Riguardo alla tua prima domanda no, non rischi errori perch&#232; &#232; vero che inizializzi a zero entrambe per&#242; con il primo scanf fai assumere sia a max che a min lo stesso valore. Dopo per&#242; entri nel ciclo do while e sicuramente qualsiasi valore che inserirai sar&#224; o maggiore del primo inserito e quindi verr&#224; modificata la variabile max, oppure minore del primo e in questo caso verr&#224; modificata la variabile min.

                        Riguardo a \n si utilizza nella scanf per escludere il carattere invio quando acquisisci un carattere subito dopo aver acquisito un qualsiasi altro dato da tastiera. Mentre nel primo caso a te va bene che il carattere invio battuto durante l'acquisizione di val venga letto da scanf("%c",&fine) in modo da "saltare" l'acquisizione della variabile fine, nel secondo esempio non puoi farne a meno perch&#232; devi necessariamente leggere un carattere e non vuoi saltare quell'acquisizione. Lo so di non essere abbastanza chiaro ma per comprenderlo al meglio devi aver ben presente come funziona la funzione scanf e come vengono memorizzati nel buffer della tastiera i caratteri da te digitati.

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

                        Comment


                        • #13
                          Originariamente Scritto da Darkito Visualizza Messaggio
                          Riguardo alla tua prima domanda no, non rischi errori perchè è vero che inizializzi a zero entrambe però con il primo scanf fai assumere sia a max che a min lo stesso valore. Dopo però entri nel ciclo do while e sicuramente qualsiasi valore che inserirai sarà o maggiore del primo inserito e quindi verrà modificata la variabile max, oppure minore del primo e in questo caso verrà modificata la variabile min.

                          Riguardo a \n si utilizza nella scanf per escludere il carattere invio quando acquisisci un carattere subito dopo aver acquisito un qualsiasi altro dato da tastiera. Mentre nel primo caso a te va bene che il carattere invio battuto durante l'acquisizione di val venga letto da scanf("%c",&fine) in modo da "saltare" l'acquisizione della variabile fine, nel secondo esempio non puoi farne a meno perchè devi necessariamente leggere un carattere e non vuoi saltare quell'acquisizione. Lo so di non essere abbastanza chiaro ma per comprenderlo al meglio devi aver ben presente come funziona la funzione scanf e come vengono memorizzati nel buffer della tastiera i caratteri da te digitati.
                          Mmm, credo di aver capito in linea di massima. Nel primo caso, lo \n non è necessario, poichè non sappiamo se l'utente vuole inserire un ulteriore val o terminare il programma inserendo il carattere q.
                          Nel secondo caso invece l'utente deve per forza inserire uno dei 4 caratteri (+,-,*,/) e quindi \n diventa necessario.

                          Bè grazie mille credo di aver risolto la maggior parte dei miei dubbi.
                          Se qualcuno notasse qualcosa di strano nei codici o nei ragionamenti lo faccia notare senza problemi.

                          Comment


                          • #14
                            Originariamente Scritto da The Prince Visualizza Messaggio
                            Mmm, credo di aver capito in linea di massima. Nel primo caso, lo \n non &#232; necessario, poich&#232; non sappiamo se l'utente vuole inserire un ulteriore val o terminare il programma inserendo il carattere q.
                            Nel secondo caso invece l'utente deve per forza inserire uno dei 4 caratteri (+,-,*,/) e quindi \n diventa necessario.

                            B&#232; grazie mille credo di aver risolto la maggior parte dei miei dubbi.
                            Se qualcuno notasse qualcosa di strano nei codici o nei ragionamenti lo faccia notare senza problemi.
                            Secondo me nel caso in cui l'utente sceglie /(la divisione), devi mettere la condizione che b deve essere diverso da 0.

                            E poi non capisco perch&#232; inizialiazzi ok=1; perch&#232; scrivi "while(ok)"? forse volevi scrivere while(ok==0)?
                            Last edited by Smallman_647; 01 November 2010, 15:20.

                            perchè lo hai detto tu che sei ogni sapiente

                            Comment


                            • #15
                              Originariamente Scritto da Smallman_647 Visualizza Messaggio
                              Secondo me nel caso in cui l'utente sceglie /(la divisione), devi mettere la condizione che b deve essere diverso da 0.

                              E poi non capisco perchè inizialiazzi ok=1; perchè scrivi "while(ok)"? forse volevi scrivere while(ok==0)?
                              Certo, quando ci sono le divisioni si deve sempre evitare che si faccia una divisione per zero, il controllo è d'obbligo.
                              Riguardo a come utilizza la variabile ok, lui ha deciso di fare in quel modo, si poteva fare anche continuando il loop fino a che ok==0, ovviamente cambiando inizializzazione di ok e tutto quello che ci sta dentro il ciclo. L'algoritmo non è uno solo, bensì ci sono infiniti modi per realizzare un programma.

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

                              Comment

                              Working...
                              X