Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383

    [c]ignorare cifre decimali

    Salve, sto scrivendo un programma il quale, ad un certo punto, accetta numeri interi in ingresso.
    Volevo creare un controllo, che in caso di immissione di numeri decimali, scarti tutto ciò che viene dopo il punto decimale (punto compreso), senza looppare appena si sbaglia.

    Per chiarezza posto l'intero codice:
    codice:
    #include <stdio.h>
    
    #define MAXDIM 20
    
    
    main()
    {
     char c, nomi[MAXDIM][50],cognomi[MAXDIM][50];
     int n, voti[MAXDIM][8];
     printf("\n\t\t* REGISTRO DEI VOTI DEGLI STUDENTI *\n\n");
     do {
         printf("\t\t1. Crea database studenti\n\t\t2. Registra voti studenti\n\t\t3. Visualizza risultati\n\t\t4. Esci\n");
         printf("\t\t\t\t\t\t\tScelta:");
         while((c = getc(stdin)) != EOF && c != '\n' && c != '1' && c != '2' && c !='4');
         printf("\n");
         if (c=='1') {
             int i;
             printf("// Creazione database studenti\n\n");
             do {
                 printf("numero di studenti(massimo 20): ");
                 scanf("%d",&n);
             } while(i>=2 && i<MAXDIM+1);
             for(i=1;i<n+1;i++) {
                 printf("\nSTUDENTE No.%d\n",i);
                 printf("Nome: ");
                 scanf("%s",nomi[i-1]);
                 printf("Cognome: ");
                 scanf("%s",cognomi[i-1]);
             }
             printf("\n\n");
             while(!getchar());
         }
         if (c=='2') {
             int i,j;
             printf("// Registrazione voti studenti\n\n");
             printf("[inserire solo numeri interi compresi tra 0 e 10]\n\n");
             for(i=0;i<n;i++) {
                 for(j=0;nomi[i][j]!='\0' || cognomi[i][j]!='\0';j++) {
                     if (nomi[i][j]<123 && nomi[i][j]>96)
                         nomi[i][j] -= 32;
                     if (cognomi[i][j]<123 && cognomi[i][j]>96)
                         cognomi[i][j] -= 32;
                 }
                 printf("%s %s\n",nomi[i],cognomi[i]);
                 for(j=0;j<8;j++) {
                     do {
                         printf("prova #%d voto:",j+1);
                         scanf("%d",&voti[i][j]);
                     } while(voti[i][j]>=0 && voti[i][j]<11);
                 }
                 printf("\n\n");
             }
             while(!getchar());
         }    
     } while (c!='4');
    }
    la scanf fa riferimento ala scelta c='2'

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ma non penso ci sia bisogno del controllo, se fai una scanf() su una variabile intera l'eventuale parte decimale del numero letto dovrebbe essere scartata in automatico no?

    Comunque mi sembra di leggere alcune cose un po' strane nel codice... tralasciando le dichiarazioni sparse che non sono lecite in C, non capisco come questo ciclo

    codice:
             do {
                 printf("numero di studenti(massimo 20): ");
                 scanf("%d",&n);
             } while(i>=2 && i<MAXDIM+1);
    possa non procedere all'infinito... forse volevi scrivere n al posto di i nella condizione del ciclo?
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    possa non procedere all'infinito... forse volevi scrivere n al posto di i nella condizione del ciclo?
    azz...corretto

    Ma non penso ci sia bisogno del controllo, se fai una scanf() su una variabile intera l'eventuale parte decimale del numero letto dovrebbe essere scartata in automatico no?
    invece looppa all'infinito

    Ho corretto la linea così:
    codice:
    } while(n<2 && n>MAXDIM+1);

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da cristianc
    Ho corretto la linea così:
    codice:
    } while(n<2 && n>MAXDIM+1);
    Non va bene... prova a scrivere 1 o 40, vedrai che il programma procede lo stesso (quelle condizioni non potrebbero essere mai entrambe vere... quale numero potrebbe essere minore di 2 E maggiore di 21 allo stesso tempo?)

    Devi sostituire && con ||, perché il ciclo deve continuare o se scrivi un numero minore di 2 o se ne scrivi uno maggiore di MAXDIM. tra l'altro, anche apportando questa correzione, scrivere

    n > MAXDIM+1

    legittima l'utente a scegliere 21 come opzione di risposta, perché la condizione n > MAXDIM + 1 diverrebbe 21 > 20 + 1, e 21 non è maggiore di 21. Devi eliminare +1...

    invece looppa all'infinito
    Sì con un solo valore andava bene... comunque visto che la leggi direttamente da tastiera non so se esiste un modo per troncare la parte decimale, in ogni caso se proprio vuoi fare questo controllo potresti leggere il voto proprio come float utilizzando una variabile temporanea "voto" di tipo float e poi assegnarne il contenuto castato a int all'elemento della matrice, così l'eventuale parte decimale sarebbe troncata.
    Magari aspetta risposte per eventuali altre soluzioni che in questo momento sfuggono alla mia mente ;D
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    Devi sostituire && con ||, perché il ciclo deve continuare
    si, mi ero scordato di modificare l'operatore

    Adesso ho modificato il codice, il quale adesso si presenta così:
    codice:
    #include <stdio.h>
    
    #define MAXDIM 20
    
    
    main()
    {
     char c, nomi[MAXDIM][50],cognomi[MAXDIM][50];
     int n, voti[MAXDIM][8];
     printf("\n\t\t* REGISTRO DEI VOTI DEGLI STUDENTI *\n\n");
     do {
         printf("\t\t1. Crea database studenti\n\t\t2. Registra voti studenti\n\t\t3. Visualizza risultati\n\t\t4. Esci\n");
         printf("\t\t\t\t\t\t\tScelta:");
         while((c = getc(stdin)) != EOF && c != '\n' && c != '1' && c != '2' && c !='4');
         printf("\n");
         if (c=='1') {
             int i;
             printf("// Creazione database studenti\n\n");
             do {
                 float num;
                 printf("numero di studenti(massimo 20): ");
                 scanf("%f",&num);
                 n = (int)num;
             } while(n<2 || n>MAXDIM);
             for(i=1;i<n+1;i++) {
                 printf("\nSTUDENTE No.%d\n",i);
                 printf("Nome: ");
                 scanf("%s",nomi[i-1]);
                 printf("Cognome: ");
                 scanf("%s",cognomi[i-1]);
             }
             printf("\n\n");
             while(!getchar());
         }
         if (c=='2') {
             int i,j;
             printf("// Registrazione voti studenti\n\n");
             printf("[inserire solo numeri interi compresi tra 0 e 10]\n\n");
             for(i=0;i<n;i++) {
                 for(j=0;nomi[i][j]!='\0' || cognomi[i][j]!='\0';j++) {
                     if (nomi[i][j]<123 && nomi[i][j]>96)
                         nomi[i][j] -= 32;
                     if (cognomi[i][j]<123 && cognomi[i][j]>96)
                         cognomi[i][j] -= 32;
                 }
                 printf("%s %s\n",nomi[i],cognomi[i]);
                 for(j=0;j<8;j++) {
                     do {
                         float voto;
                         printf("prova #%d voto:",j+1);
                         scanf("%f",&voto);
                         voti[i][j] = (int)voto;
                     } while(voti[i][j]<0 || voti[i][j]>10);
                 }
                 printf("\n\n");
             }
             while(!getchar());
         }    
     } while (c!='4');
    }
    grazie dell'aiuto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.