Indovinelli con Scratch

In questa lezione realizzemo un gioco con gli indovinelli con Scratch.
Proporremo 4 semplici indovinelli:
1) Giro curioso nel bosco fitto e frondoso. Mi arrotolo in palla, sono piccolo e gioioso.
2) Mi nutro di insetti nell’oscurità, Un piccolo mammifero nella mia verità.
3) Nella notte mi senti cantare, Con occhi grandi posso guardare.
4) Faccio il sonnellino durante la lunga stagione. Amo miele e pesce, sono un buon pescatore!

Per individuare la risposta corretta, occorre trascinare ciascun animale sulla macchina. Se la macchina parte con l’animale vuol dire che la risposta è corretta, altrimenti la macchina cambia colore e l’animale ritorna in posizione.

Ecco una possibile implementazione del gioco indovinelli con Scratch:

Le funzioni di Input e Output

Le funzioni di Input e Output

In questa lezione studieremo come utilizzare le funzioni di input e output in linguaggio C.

Le funzioni di input

Le funzioni di input in C che analizzeremo sono scanf, getc e getchar.

scanf()

La funzione scanf consente di acquisire una sequenza di caratteri (lettere o cifre) dalla tastiera e di memorizzarli all’interno di opportune variabili.

Sintassi

scanf(<StringaDiFormato>,[&]Variabile1, [&]Variabile2, ...);
StringaDiFormato: rappresenta lo specificatore di formato ed è introdotta dal simbolo %
Variabile: rappresenta il nome della variabile all’interno della quale dovrà essere memorizzato il dato proveniente dalla tastiera.
&: l’operatore & (se necessario) dovrebbe essere utilizzato per passare l’indirizzo di memoria della variabile. Ma l’operatore & non è sempre necessario per tutte le variabili, dipende dal tipo di dati. Ad esempio, è necessario utilizzare & per leggere dati in tipi di dati non puntatore come int, float, char, ecc., ma non è necessario per tipi di dati puntatore come char*, int*, ecc.

Corsi Python
Corso su JavaScript

Specificatore di formato

Specificatore di formatoEspresssioneVisualizza sul monitor
%ccharcarattere singolo
%d (%i)intintero decimale con segno
%e (%E)float o doubleformato esponenziale
%ffloat o doublereale con segno
%g (%G)float o doubleutilizza %f o %e in base alle esigenze
%0intvalore in base 8 senza segno
%ppointervalore di una variabile puntatore
%sarray of charstringa (sequenza) di caratteri
%uintintero senza segno
%x (%X)intvalore in base 16 senza segno

Es: scanf("%d", &base);

Il simbolo & davanti alla variabile indica l’indirizzo di memoria in cui si trova la variabile base.

Si interpreta in questo modo: leggi un dato intero e collocalo nella posizione di memoria il cui indirizzo è &base.

Es: scanf("%d %d", &x, &y);

Questa istruzione acquisisce due numeri interi memorizzate nelle variabili x e y

L’omissione di & non comporta nessun messaggio di errore da parte del compilatore, ma comporta degli errori nei risultati.

getc()

La funzione getc è utilizzata per leggere un singolo carattere da un file, ma può leggere anche un carattere da tastiera.

Esempio

#include <stdio.h>

int main() {
    char c;
    
    printf("Inserisci un carattere: "); // Chiede all'utente di inserire un carattere
    c = getc(stdin); // Legge un carattere da tastiera (standard input stdin)
    
    printf("Il carattere inserito è: %c\n", c); // Stampa il carattere letto

    return 0;
}

Dunque la funzione getc() è principalmente utilizzata quando si desidera leggere un singolo carattere da un file o da stdin (standard input).

Ecco alcune tipiche situazioni dove può essere utile:

Lettura da file di testo: Quando si desidera leggere un carattere per volta da un file di testo, ad esempio per analizzarne il contenuto o eseguire operazioni specifiche su di esso.

Interazione con l’utente: Per la lettura di input da parte dell’utente da tastiera quando si desidera leggere un solo carattere alla volta. Ad esempio, nei menu a selezione singola o in applicazioni che richiedono un input di carattere singolo.

Analisi dei dati: In alcune situazioni, si potrebbe dover analizzare o elaborare i dati carattere per carattere anziché linea per linea. getc() può essere utile in tali scenari.

In generale, getc() è utilizzata ogni volta che è necessario leggere un singolo carattere, sia da un file che da stdin, ed è utile in una vasta gamma di applicazioni che coinvolgono l’input e l’output di dati di carattere singolo. Ma per la lettura di righe intere di testo, è più conveniente utilizzare altre funzioni come fgets().

Corsi Python
Corso su JavaScript

getchar()

La funzione getchar() è utilizzata per leggere un singolo carattere dalla tastiera, e corrisponde ad un’applicazione specifica della funzione getc() quando viene passato stdin come argomento. In pratica, getchar() è equivalente a getc(stdin).

Utilizzo:

La funzione getchar() viene utilizzata principalmente quando è necessario leggere un singolo carattere dalla tastiera. Ad esempio, può essere utilizzata per implementare un semplice programma che acquisisce un singolo carattere da tastiera e lo utilizza per prendere decisioni o eseguire azioni.

Esempio:

#include <stdio.h>

int main() {
    char c;
    
    printf("Inserisci un carattere: "); // Chiede all'utente di inserire un carattere
    c = getchar(); // Legge un carattere da tastiera
    
    printf("Il carattere inserito è: %c\n", c); // Stampa il carattere letto
    
    return 0;
}

In questo esempio, getchar() viene utilizzata per leggere un singolo carattere dalla tastiera e memorizzarlo nella variabile c, che viene poi stampata a schermo.

In sintesi, getchar() è utile quando si desidera leggere un singolo carattere dalla tastiera e si preferisce una sintassi più concisa rispetto a getc(stdin).

Le funzioni di output

Le funzioni di output in C che studieremo sono: printf, putc e putchar.

printf()

La forma sintattica è la seguente:

printf(<StringaDiFormato>,[, <Argomenti>]);

  • <StringaDiFormato> è una stringa di caratteri che può contenere specificatori di formato.
  • <Argomenti> sono gli argomenti da stampare nella stringa di formato.

Es: printf("Base: %d", base);

Stampa a video il valore intero della base.

La sequenza di escape

Le sequenze di escape sono dei caratteri che non vengono visualizzati, ma contribuiscono a formattare il testo. Tutte le sequenze di escape iniziano con il carattere di backslash (\) e sono interpretate come un singolo carattere.

Sequenza di escapeDescrizione
\nnuova riga (new line)
\ttabulazione (tab)
\asegnale sonoro (alert)
\fnuova pagina (form feed)
\rritorno a capo della stessa riga
\vtabulazione verticale
\buna battuta indietro (backspace)
\\barra rovesciata (backslash)
\’apice singolo
\”doppi apici
\?punto di domanda
\0fine stringa
\<CifraOttale>numero ottale
\<CifraEsadecimale>numero esadecimale
Corsi Python
Corso su JavaScript

Esempio

int base = 10;
printf("Base: %d", base);

putc()

La funzione putc() è utilizzata per scrivere un singolo carattere su un file o su un dispositivo di output specificato.

La sintassi è la seguente:

int putc(int char, FILE *stream);

  • char: Il carattere da scrivere sul file o sul dispositivo di output.
  • stream: Il puntatore al file o al dispositivo di output su cui si desidera scrivere il carattere.

Esempio

#include <stdio.h>

int main() {
    char c = 'a';
    FILE *file_pointer;

    // Apre il file "output.txt" in modalità scrittura
    file_pointer = fopen("output.txt", "w");

    // Verifica se il file è stato aperto correttamente
    if (file_pointer != NULL) {
        putc(c, file_pointer); // Scrive il carattere 'a' nel file
        fclose(file_pointer); // Chiude il file
        printf("Il carattere è stato scritto correttamente nel file.\n");
    } else {
        printf("Impossibile aprire il file.\n"); // Messaggio di errore se il file non può essere aperto
    }

    return 0;
}

In questo esempio, il carattere 'a' viene scritto nel file “output.txt” utilizzando putc(). Il file viene aperto in modalità scrittura ("w") e il carattere viene scritto utilizzando il puntatore di file file_pointer. Infine, il file viene chiuso con fclose(). Se il file non può essere aperto correttamente, verrà visualizzato un messaggio di errore.

Assicuriamoci di avere i permessi necessari per scrivere sul file e che il percorso specificato sia corretto. Se il file non esiste, verrà creato; se esiste già, il suo contenuto verrà sovrascritto.

putchar()

La funzione putchar() è utilizzata per scrivere un singolo carattere su stdout.

La sintassi è la seguente:

int putchar(int c);

c: rappresenta il carattere da scrivere su stdout.

Funzionamento:

Quando chiamiamo putchar(), il carattere c viene scritto sullo standard output, che è generalmente la console o il terminale in cui il programma è in esecuzione. Il carattere verrà quindi visualizzato sullo schermo.

Esempio

#include <stdio.h>

int main() {
    char c = 'a';
    putchar(c); // Scrive il carattere 'a' su stdout (generalmente la console)
    return 0;
}

In questo esempio, stiamo utilizzando putchar() per scrivere il carattere 'a' su stdout. Quando il programma viene eseguito, il carattere 'a' verrà visualizzato sulla console.

Nota:

  • putchar() è simile a putc(), ma è progettato specificamente per scrivere un singolo carattere su stdout. Inoltre, restituisce il carattere scritto come un valore intero, o EOF in caso di errore.

La funzione putchar() è utile quando si desidera scrivere un singolo carattere senza dover aprire o chiudere un file. È particolarmente comoda per la stampa di singoli caratteri su stdout, come messaggi di testo, prompt o caratteri di separazione.

Corsi Python
Corso su JavaScript

Altre funzioni di input/output

Oltre alle funzioni di input e output discusse precedentemente, ci sono molte altre funzioni utili disponibili nel linguaggio C. Ecco alcune di esse:

  1. Funzioni di Input da File:
    • fgets(): Utilizzata per leggere una riga di testo da un file.
    • fscanf(): Simile a scanf(), ma legge input da un file anziché dalla tastiera.
  2. Funzioni di Output su File:
    • fputs(): Utilizzata per scrivere una stringa su un file.
    • fprintf(): Simile a printf(), ma scrive output su un file anziché su stdout.
  3. Gestione dei File:
    • fopen(): Utilizzata per aprire un file.
    • fclose(): Utilizzata per chiudere un file aperto.
    • feof(): Utilizzata per verificare se è stata raggiunta la fine di un file.
  4. Funzioni di Input/Output Binario:
    • fread(): Utilizzata per leggere blocchi di dati da un file binario.
    • fwrite(): Utilizzata per scrivere blocchi di dati in un file binario.
  5. Gestione del Puntatore di File:
    • ftell(): Utilizzata per ottenere la posizione corrente nel file.
    • fseek(): Utilizzata per spostare il puntatore di file a una posizione specificata nel file.
  6. Funzioni di Output su Standard Error:
    • fprintf(stderr, ...): Simile a fprintf(), ma scrive output su stderr, che di solito è associato all’output degli errori anziché alla console.

Queste sono solo alcune delle funzioni più comuni per l’input e l’output in C. Ogni funzione ha le proprie caratteristiche e scopi specifici, e la scelta della funzione da utilizzare dipenderà dalle esigenze del programma e del tipo di dati con cui si sta lavorando.

Conclusioni

In questo articolo abbiamo esaminato le funzioni di input e output in linguaggio C, con un focus su scanf(), getc(), getchar(), putc(), e putchar().

Ecco un breve riassunto di quanto discusso:

  1. Funzioni di Input:
    • scanf(): Utilizzata per acquisire input dalla tastiera e memorizzarlo in variabili specificate. È necessario specificare il formato di input utilizzando specificatori di formato come %d, %f, %c, ecc.
    • getc(): Utilizzata per leggere un singolo carattere da un file. Può anche leggere un carattere dalla tastiera.
    • getchar(): Simile a getc(), ma specificamente utilizzata per leggere un carattere dalla tastiera.
  2. Funzioni di Output:
    • putc(): Utilizzata per scrivere un singolo carattere su un file o su un dispositivo di output specificato.
    • putchar(): Simile a putc(), ma specificamente utilizzata per scrivere un singolo carattere su stdout.
  3. Utilizzi Principali:
    • scanf(), getc(), e getchar() sono utilizzate per l’input da tastiera o da file.
    • putc() e putchar() sono utilizzate per l’output su file o su dispositivi di output specificati.
  4. Sequenze di Escape:
    • Abbiamo esaminato alcune sequenze di escape comuni utilizzate per formattare il testo in C, come \n, \t, \b, ecc.
  5. Considerazioni Finali:
    • È importante utilizzare correttamente le funzioni di input e output in base alle esigenze del programma.
    • Le sequenze di escape possono essere utili per formattare il testo in modo appropriato.

In sintesi, le funzioni di input e output in C forniscono gli strumenti necessari per acquisire input dall’utente, leggere e scrivere su file, e gestire l’output dei programmi. Con una comprensione chiara di queste funzioni e delle sequenze di escape, è possibile sviluppare applicazioni C più efficaci e flessibili.

N.B.: Assicuriamoci sempre di gestire gli errori in modo appropriato durante l’utilizzo delle funzioni di input e output, controllando il valore restituito dalle funzioni e gestendo situazioni inaspettate in modo adeguato.

Alcuni link utili

Introduzione al linguaggio C

Le variabili in C

Le costanti in C

Printf

Tipi di operatori

Operatori di confronto

Stdin

Le funzioni di input e output

Scanf

Area di un rettangolo in C

Media in C

Casting in C