Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C]la fulminea finestrella DOS

    Ragazzi,ho capito che per evitare che un programma dos dopo esser girato si chiuda istantaneamente devo terminare il codice con una funzione getchar() che accetti un carattere da tastiera. Però nel codice seguente ho provato e sono giunto alla conclusione che ho bisogno di due getchar(), uno dopo la presa dell variabili in input con scanf, e l'altro dopo la stampa dell'output. Se lascio uno solo dei due getchar() e come se non l'avessi proprio inserito, e quindi lancio l'eseguibile ma non faccio neanche in tempo a vederlo in esecuzione che si chiude all'istante. Potete spiegarmi il xkè di questa cosa che mi appare strana? E mi è strano anche nella soluzione con 2 getchar(), mi aspetterei di dare due volte il carattere da tastiera, e invece appena ne do uno si chiude il programma..


    Codice PHP:
    #include <stdio.h>

    int basealtezzaarea;           

    int main(int argcchar *argv[])

    {                                  
      
    printf("AREA RETTANGOLO\n\n");

      
    printf("Valore base: ");
      
    scanf("%d", &base);
      
    printf("Valore altezza: ");
      
    scanf("%d", &altezza);

      
    area base*altezza;

      
    getchar();

      
    printf("\nBase: %d\n"base);
      
    printf("Altezza: %d\n"altezza);
      
    printf("Area: %d\n"area);

      
    getchar();
      return 
    0;


  2. #2
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    system("PAUSE"); no è ?
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  3. #3
    ...devi pulire il buffer

    codice:
        printf("Valore base: ");
        scanf("%d", &base);
        while(getchar()!='\n')
            ;
        printf("Valore altezza: ");
        scanf("%d", &altezza);
        while(getchar()!='\n')
            ;
        area = base*altezza;
    
        printf("\nBase: %d\n", base);
        printf("Altezza: %d\n", altezza);
        printf("Area: %d\n", area);
    
        getchar();
        return 0;
    N.B. prova ad eseguire il tuo esempio... inserendo come input un carattere: ad esempio 'A'
    poi fai la stessa cosa utilizzando questo codice.
    ...Terrible warlords, good warlords, and an english song

  4. #4
    originariamente inviato da infinitejustice

    system("PAUSE"); no è ?
    originariamente inviato da Johnny_Depp

    ...devi pulire il buffer
    Ehm,scusate, ma sono appena giunto alla fine del primo capitolo del McGraw Hill...
    Ecco, perchè questa cosa non viene mai detta fin dall'inizio? Poi si pretende che un'autodidatta impari...e come impara se non ha nemmemo il tempo di vedere in esecuzione l'esercizietto? E' un piccolo problemuccio per i newbye che nessuno affronta!
    E se non ci fosse un forum come questo? E la mia amica di caserta che abita in un paesino di campagna dove nn c'è il telefono, se vuole imparare il C come lo risolve il problemino insorto alla prima pagina del manuale?

    Vabbè, vabbè,lasciamo da parte questa piccola nota polemica.

    Johnny, ma all'apparenza, e solo se si digitano valori int, il tuo codice ed il mio funzionano in esecuzione alla stessa maniera. Ed il tuo è addirittura più complesso del mio per il fatto che aggiunge una terza istruzione! Io avevo due getchar(), il tuo ha 2 while(getchar()!='\n'); ed un getchar().

    La differenza da sottolineare sta nel fatto che, se io do in input a "base" il valore "a", il mio codice va "in tilt", nel senso che si chiude la finestra dos all'istante, come se non avessi provveduto ad inserire il getchar(). Evidentemente è un errore di tipo, giacchè il programma si aspetta un int. Il tuo codice non va in tilt, e mi permette di inserire un carattere anche per la variabile "altezza". Poi va in esecuzione e mi restituisce

    Base: 0
    Altezza: 0
    Area: 0

    Il system("PAUSE"); propostomi da infinitejustice sembra stilisticamente più simpatico e veloce, xkè basta una sola istruzione (niente while e getchar) ed avvisa l'utente di "premere un tasto per continuare...". Però, a differenza del tuo codice, se digito un carattere in input per la prima variabile, va subito in esecuzione perchè forse subito si accorge dell'errore di tipo, e non attende di digitare per la seconda variabile il secondo valore di input.

    Poi, per la chiusura dell'applicazione, il codice di Johnny_Depp ed il mio, hai voglia di premere tutte le lettere dell'alfabeto, ma prima o poi o si da INVIO o posso anche scrivere la famosa lettera di totò (i fratelli capone... che siamo noi!). Il codice di infinitejustice, una volta eseguita chiaramente l'applicazione non ha più ragione di continuare a vivere, ed un qualsiasi click sulla tastiera la chiude.

    Potete spiegarmi quel minimo di teoria che c'è sotto alla pulitura del buffer [cioè il perchè di quel while(getchar()!='\n');]? Ed al system("PAUSE")?


  5. #5
    Originariamente inviato da gemini_76_it
    Potete spiegarmi quel minimo di teoria che c'è sotto alla pulitura del buffer [cioè il perchè di quel while(getchar()!='\n');]? Ed al system("PAUSE")?
    getchar è una macro che acquisisce un carattere da tastiera, in pratica è come se scrivessi:

    codice:
    getc (stdin);
    In pratica quel ciclo while non fà altro che eseguire il comando getchar finchè quest'ultimo non assume il carattere invio.

    Questo si deve fare perchè la scanf sporca il buffer di input e quindi possono capitare caratteri spazzatura (strani), si che nn servino.

    codice:
    system ("PAUSE");
    Questo invece blocca la schermata invocando il comando del dos che blocca l'esecuzione del programma batch è visualizza il messaggio di premere un tasto.

    Ciao!

  6. #6
    Originariamente inviato da Michele Facchin

    In pratica quel ciclo while non fà altro che eseguire il comando getchar finchè quest'ultimo non assume il carattere invio.

    Questo si deve fare perchè la scanf sporca il buffer di input e quindi possono capitare caratteri spazzatura (strani), si che nn servino...
    aggiungo:

    che a loro volta vengono passati AUTOMATICAMENTE come input al successivo getchar(), ecco perchè la finestra del prompt si chiude senza accettare l'input da tastiera da parte dell'utente... prende come input la parte "sporca" del buffer



    il system("pause"); è molto pratico ma non è portabile... (su UNIX "pause" non esiste)
    ...Terrible warlords, good warlords, and an english song

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 © 2025 vBulletin Solutions, Inc. All rights reserved.