Inform e Glulx/Le basi di Inform/Caratteri e stringhe

Indice del libro

Caratteri e stringhe

modifica

Finora abbiamo visto come gestire i dati numerici ("10", "13", "56" e così via), ma esistono anche i dati alfabetici (le sole lettere, come ad esempio "a", "b", "c", "casa", "papà", ecc.) e i dati alfanumerici (le lettere e i numeri, come ad esempio "alpha202", "omega3", ecc.).

In Inform una variabile, oltre ai valori numerici, può contenere anche dei caratteri e perfino delle stringhe (sequenze di numeri e lettere, come ad es. "Ogni mattina mi sveglio alle 6:00"):

! Esempio sull'utilizzo di variabili con dati non numerici - versione 1 

Include "Parser"; Include "VerbLib"; Include "Replace";
[ Funz_princip carattere parola stringa; ClearScreen(); ! pulisce lo schermo carattere = 'a'; parola = "terrazzo"; stringa = "I miei 9 gatti"; print (char) carattere, "^", (string) parola, "^", (string) stringa, "^"; print "^Premi un tasto per uscire^"; KeyCharPrimitive(); ! legge un carattere dalla tastiera ];
[ Initialise; Funz_princip(); quit; ! fine del programma ];
Include "ItalianG";

come potete vedere, il computer visualizza a, terrazzo, I miei 9 gatti, esattamente quello che ci si aspetta. Questa volta entrano però in gioco le funzioni di stampa (char) e (string); la prima, dice all’istruzione print di stampare a video il contenuto della variabile carattere, la seconda il contenuto delle variabili parola e stringa. Altra cosa da notare, almeno per quelli un po’ più esperti nella programmazione, è che in Inform (purtroppo) le variabili non si differenziano per tipo.

 

Osserviamo ora quest’altro esempio:

! Esempio sull'utilizzo di variabili con dati non numerici – versione 2

Include "Parser"; Include "VerbLib"; Include "Replace";
[ Funz_princip carattere parola stringa car; ClearScreen(); ! pulisce lo schermo carattere = 'a'; parola = "terrazzo"; stringa = "La mia casa"; print (char) carattere, "^", (string) parola, "^", (string) stringa, "^"; print "^Premi il tasto q per uscire^"; do { car = Presskey(); } until (car == 'q'); ];
[ Initialise; Funz_princip(); quit; ! fine del programma ];
Include "Io"; Include "ItalianG";

l’istruzione Presskey da me scritta legge il carattere del tasto premuto dall’utente e ne restituisce il valore alla variabile car. Se il tasto premuto corrisponde alla lettera q, il programma termina, altrimenti richiede la pressione di un altro tasto. Potete testare tutte le lettere che volete, ma se si volessero usare dei tasti "particolari" come ad esempio la barra spaziatrice o Esc?
In questo caso bisogna ricorrere all’utilizzo dei codici ZSCII (attenzione, non ASCII), perché a ogni simbolo rappresentato sulla tastiera, corrisponde un determinato codice numerico indicante il carattere, e varia a seconda del sistema operativo e dei programmi che si stanno usando. Sul mio computer (un PC equipaggiato con Windows XP), ecco a quali codici corrispondono i seguenti tasti:

  • 8 per il tasto Delete
  • 13 per il tasto Invio
  • 27 per il tasto Esc
  • 32 per la barra spaziatrice

volendo quindi terminare il programma premendo la barra spaziatrice, occorre modificare il ciclo do-until nel seguente modo:

print "^Premi spazio per uscire^";
  do
  {
    car = Presskey();
  }
  until (car == 32);
];

se usate Linux o il Mac-OS, per sapere a quali codici corrispondono i vostri tasti, potete inserire una print car; sotto la riga car = Presskey();. Provate a premere un tasto che sia diverso dalla barra spaziatrice, e vedete quale numero appare sul video: quello è il codice effettivo da usare nel test.

Sempre per quanto riguarda la gestione dei caratteri e delle stringhe, Inform mette a disposizione alcune istruzioni molto utili, rappresentate nell’esempio che segue:

! Esempio sull'utilizzo di variabili con dati non numerici - versione 3 

Include "Parser"; Include "VerbLib"; Include "Replace";
[ Funz_princip car1 car2 stringa lungh; ClearScreen(); ! pulisce lo schermo car1 = 'a'; car2 = UpperCase(car1); print (char) car2, "^"; car1 = 'A'; car2 = LowerCase(car1); print (char) car2, "^"; stringa = "ciao Andrea!"; print (string) stringa, "^"; lungh = Length(stringa); print "Lunghezza: ", lungh, "^"; print (Cap) stringa, "^"; print "^Premi un tasto per uscire^"; KeyCharPrimitive(); ! legge un carattere dalla tastiera ];
[ Initialise; Funz_princip(); quit; ! fine del programma ];
Include "ItalianG";

Il risultato che si ottiene è il seguente:

A

a

ciao Andrea!

Lunghezza: 12

Ciao Andrea!

L’istruzione UpperCase converte il carattere passatole come parametro da minuscolo a maiuscolo, mentre l’istruzione LowerCase fa esattamente l’opposto (converte cioè un carattere da maiuscolo a minuscolo). L’istruzione Length restituisce la lunghezza di una stringa passatale come parametro (restituisce, cioè, il numero totale di caratteri che compongono quest’ultima) mentre la funzione di stampa (Cap) stampa a video la stringa con la prima lettera maiuscola.

 

Concludiamo ora il paragrafo con quest’ultimo esempio:

! Esempio sull'utilizzo di variabili con dati non numerici - versione 4 

Include "Parser"; Include "VerbLib"; Include "Replace";
[ Funz_princip stringa1 stringa2 car; ClearScreen(); ! pulisce lo schermo stringa1 = "Ciao Andrea!"; stringa2 = "Ciao Andrea!"; print (string) stringa1, " ", (string) stringa2, "^"; if (stringa1 == stringa2) print "Le due stringhe sono uguali.^"; print "^Premi il tasto q per uscire^";
do { car = Presskey(); } until (car == 'q'); ];
[ Initialise; Funz_princip(); quit; ! fine del programma ];
Include "Io"; Include "ItalianG";

le stringhe sono uguali, ma la condizione dell’istruzione if viene ignorata. A questo punto, le sole variabili non bastano più, e bisogna passare ai vettori (o in inglese array)[1].

  1. Cliccate qui per scaricare i listati di questi quattro esercizi (i file 3.14_1.inf, 3.14_2.inf, 3.14_3.inf e 3.14_4.inf).