Pascal/Input e Output
Finalmente ci occupiamo del grande problema dell'input-output.
Gran parte delle funzioni di input-output sono contenute nella libreria standard di Pascal. Queste funzioni sono tipicamente:
- read() e readln() che permettono di leggere l'input dell'utente da tastiera inserendo fra le parentesi il nome della variabile in cui vogliamo salvare il dato. La differenza consiste nel cursore, che nel caso di un'istruzione read continua sulla stessa riga mentre nel caso di readln va a capo.
- write() e writeln() che permettono, come già visto in precedenza, di stampare su schermo il contenuto delle parentesi. Anche in questo caso la differenza è relativa all'andare a capo.
Un semplice esempio per iniziare
modificaUn semplice esempio basato sull'uso delle variabili e dell'input-output potrebbe essere un modo per personalizzare un programma, salvando in una stringa il nome dell'utente per inserirlo nelle domande.
program username;
uses crt;
var name: String[50];
begin
clrscr;
writeln('Inserisci il nome');
readln(name);
clrscr;
writeln('Benvenuto, ', name);
readkey;
end.
Analizziamo come al solito il listato riga per riga:
- dichiarazione del nome
- dichiarazione della variabile name di tipo Stringa di dimensione 50 (i tipi di dati saranno affrontati in seguito)
- dichiarazione delle librerie necessarie. Di questo argomento riparleremo a breve, ma sappiate che almeno due dei comandi utilizzati di seguito sono dipendenti da questa libreria
- inizio programma
- pulizia dello schermo. Questa è la prima (e forse la più usata) delle due funzioni che dipendono da crt.
- stampa sullo schermo della stringa ‘Inserisci il nome’. Dopo questa istruzione il programma va a capo
- lettura della stringa corrispondente al nome ed inserimento di questa stringa letta da tastiera nella variabile name
- nuova pulizia dello schermo
- stampa del messaggio di benvenuto
- altra funzione dipendente dalla libreria crt che permette di leggere un solo carattere qualunque da tastiera. Vedremo che questa funzione è molto utilizzata per risolvere un problema riguardo all'esecuzione dei programmi compilati finora.
read e readln
modificaL'istruzione assegna il valore immesso dall'utente nella variabile specificata tra parentesi. Il contenuto delle parentesi che seguono l'istruzione read o readln può essere una o più variabili. Nel secondo caso, in fase di esecuzione, i diversi valori di input vanno inseriti separandoli con uno spazio.
write e writeln
modificaIl contenuto della parentesi che seguono l'istruzione writeln può essere sia un'espressione (stringa o numerica), sia una variabile sia una combinazione.
La parte testuale è compresa tra due apici; per separare il testo dalle variabili si usa una virgola, come nell'esempio precedente.
Alcuni compilatori, soprattutto i più vecchi, possono inoltre dare problemi nella stampa dei caratteri accentati: in questi casi l'accento può essere sostituito con un apostrofo che, per il problema relativo agli apici nelle stringhe, si deve indicare con due apici. Un'istruzione come
writeln('Il valore è ');
è preferibile sostituirla quindi con
writeln('Il valore e''');
(che stampa Il valore e').
Formattare i numeri
modificaQuando la variabile inserita nel writeln è di tipo numerico è possibile specificare con quante cifre dev'essere rappresentato il numero e quante di queste devono essere decimali (nel caso il numero sia reale e non intero); per fare ciò si utilizza la sintassi
nome_della_variabile : numero_di_cifre [: numero_di_cifre_decimali];
Ad esempio:
writeln(n:8:6);
writeln(10+2:4);
Ovvero, nel primo caso il contenuto della variabile n verrà rappresentato con 8 cifre di cui 6 decimali; nel secondo caso verranno stampati 2 spazi vuoti e poi il numero 12.
Una istruzione come questa
writeln(n);
stamperebbe invece il valore di n in notazione esponenziale (ad esempio 3.4E4 anziché 34.000).
Riguardo input e output, si può anche fare un esempio con i numeri di con un programma che calcoli il quadrato di un numero reale:
program quadrato_di_un_numero;
uses crt;
var n,r:real;
begin
clrscr;
writeln('Inserisci un numero reale');
readln(n);
clrscr;
r:=sqr(n);
writeln('Il quadrato del numero inserito è',r:10:6);
readkey;
end.
- il programma stampa la stringa 'Inserisci un numero reale';
- con readln(n) assegna alla variabile n un valore immesso da tastiera;
- alla variabile r viene assegnato il valore del quadrato di n;
- viene scritto il risultato.
Si noti che per l'assegnazione di un certo valore a una variabile si usa la sintassi:
nome_della_variabile := valore_assegnato_alla_variabile;
Questo valore può essere, come nell'esempio precedente, il risultato di un'espressione.
Esercizi
modifica- Scrivere un programma che applichi l'algoritmo dello scambio. Il programma deve chiedere all'utente i valori da inserire in due variabili, scambiare il contenuto delle variabili e poi stamparle (nello stesso ordine in cui le ha chieste). L'utente vedrà così scambiato l'ordine dei valori inseriti.
- Il programma chiede di immettere due numeri. Immetto come num1
10
e comenum2
30. - Il programma scambia i valori delle variabili num1 e num2.
- Vengono stampati i valori di num1 e num2. Vedrò quindi prima
30
e poi10
.
program scambio;
var num1, num2, tmp: integer;
begin
{chiedo due valori}
writeln('Dammi due numeri che te li scambio');
write('num1: '); readln(num1);
write('num2: '); readln(num2);
writeln; {lascia una riga bianca}
{scambio i valori}
tmp := num1;
num1 := num2;
num2 := tmp;
{li stampo}
write('num1: ', num1);
write('num2: ', num2);
readln;
end.
- Scrivere un programma che legga un numero e lo stampi formattandolo, chiedendo all'utente quante cifre utilizzare per i decimali.
program formatta_decimali;
var num: real;
dec: integer;
begin
write('Immettere il numero da formattare: '); readln(num);
write('Quante cifre decimali devo stampare? '); readln(dec);
writeln;
writeln(num:10:dec);
readln;
end.