Ultimo aggiornamento: 2022-05-08
Scrivere un programma che legge da un file, il cui nome viene passato come unico parametro sulla riga di comando, una sequenza di righe, ciascuna contenente una stringa di caratteri di lunghezza massima (LEN-1)
, dove LEN
è un simbolo definito nel codice fornito. Per ciascuna riga, il programma deve controllare se le parentesi eventualmente presenti sono bilanciate oppure no. Nel caso in cui le parentesi siano bilanciate, il programma stampa BILANCIATE
, altrimenti stampa NON BILANCIATE
. La stringa vuota si considera bilanciata.
I tipi di parentesi da considerare sono ([{}])
, e possono essere tra loro annidate in qualunque ordine. Alcuni esempi:
Input | Output |
---|---|
abcdef |
BILANCIATE |
AB[(2x)cd()]eF2() |
BILANCIATE |
{a+b}*(a-(b+f+g-(g/h)/(2*g))) |
BILANCIATE |
(((())))efGH2x(*)) |
NON BILANCIATE |
(ab(cd(e(f*g))) |
NON BILANCIATE |
)[] |
NON BILANCIATE |
(a[b((c+d)-e)[f]]+h{n-1}) |
BILANCIATE |
([{abcd}][]{}{aaa*b} |
NON BILANCIATE |
Dato che le righe del file possono contenere spazi, per leggerle correttamente occorre usare la funzione di libreria
char *fgets(char *s, int size, FILE *stream)
che legge dal file stream
una sequenza di al più size
caratteri e la memorizza nel buffer puntato da s
, che deve essere già stato allocato dal chiamante. La lettura si interrompe se viene raggiunta la fine del file oppure un ritorno a capo; il terminatore viene aggiunto automaticamente al termine del buffer. La funzione ritorna un puntatore al buffer s
.
Per compilare:
gcc -std=c90 -Wall -Wpedantic parentesi.c -o parentesi
Per eseguire:
./parentesi parentesi.in