PROGRAM esame(input,output); TYPE lista=^datoin; {lista dove vengono inseriti i dati di input} datoin = RECORD str:string[15]; next:lista END; VAR l, nodo : lista; {elemento della lista} filemem : text; {file in memoria di massa} temp, buff : string[80]; {stringa di input digitata dall'utente} nomefile:string[80]; {variabile che memorizza il nome del file digitato dall'utente} oper : char; exe, cont:integer; {contatori delle stringhe efettivamente trovate nella riga e dei nodi della lista} PROCEDURE instringa(VAR buff:string; VAR nodo:lista); {procedure che permette di analizzare la riga di input inserendo gli operatori in una variabile e ciascuna stringa} {in nodi differenti di lunghezza 15 di una lista} VAR i,j,ln : integer; {contatori dei tipi stringa} lunghe:boolean; {variabile che permette di controllare la fine della riga di input} BEGIN i:=1; oper:='0'; lunghe:=false; l:=NIL; {salta gli spazi bianchi nella lettura del primo carattere dell'input buffer} {strlen e' una funzione del tipo string[] che mi permette di sapere la lunghezza della stringa} WHILE (buff[i]=' ') AND (i <= strlen(buff)) DO i:=i+1; {controlla che vi sia un operatore come primo carattere inserendolo in una variabile} IF (buff[i] IN ['+','-','*']) THEN BEGIN oper:=buff[i]; i:=i+1 END; {controlla la stringa e la inserisce nella lista} WHILE (i <= (1+strlen(buff))) AND (buff[i] <> chr(13)) AND (not lunghe) DO BEGIN new(nodo); {conta i nodi creati} cont:=cont+1; {inserisce gli elementi della stessa stringa nello stesso nodo saltando gli spazi bianchi} WHILE (buff[i]=' ') AND (i <= (1+strlen(buff))) DO i:=i+1; nodo^.str :=''; ln := 0; j := 1; WHILE ((buff[i] <> ' ')AND(not lunghe) OR (i<=strlen(nodo^.str))) DO BEGIN {strmove e' una funzione del tipo string che mi permette di copiare una stringa nell'altra} strmove(1, buff, i, nodo^.str, j); {incrementa la lunghezza del singolo nodo della lista} ln := ln + 1; {ciclo che mi permette di controllare il valore di i in funzione della lunghezza della string di input} IF (i >= strlen(buff)) THEN lunghe:=true ELSE BEGIN lunghe:=false; i:=i+1; j:=j+1 END END; {while buff} nodo^.next:=l; l:=nodo END {while i} END; {instringa} PROCEDURE stampariga(VAR filemem:text; nodo:lista); {procedure che scandisce la lista di stringhe e confronta ogni singola stringa della lista {con la riga in cui mi trovo nel file caricato dalla memoria di massa} VAR esiste, i : integer; almenouna, trovo, stampato:boolean; BEGIN temp:=''; i:=1; exe:=0; WHILE not eof(filemem) DO BEGIN {copia la riga in cui si trova in una stringa} readln(filemem, temp); nodo:=l; stampato:=false; trovo:=true; almenouna:=false; {scandisce la lista delle stringhe} WHILE (nodo <> nil) DO BEGIN {strpos restituisce valore 0 se non trova la stringa nella riga del file in cui si trova} esiste:=strpos(temp, nodo^.str); IF (esiste <> 0) THEN BEGIN {incrementa il contatore delle parole nella lista} trovo:=false; END ELSE almenouna:=true; {controllo per l'operatore +} {viene eseguito esternamente in quanto deve verificare che tutte le parole della stringa} {di input siano presenti nella riga} IF(trovo=false)AND((oper='+')OR(oper='0'))AND(not stampato)THEN BEGIN stampato:=true; write(temp) END; {controllo di stampa per l'operatore -} IF(esiste=0)AND(oper='-')AND(not stampato)THEN BEGIN stampato:=true; write(temp) END; nodo:=nodo^.next END; {while nodo} {controllo di stampa per l'operatore * e la stringa senza operatore} IF(not almenouna)AND(oper='*')AND(not stampato)THEN BEGIN stampato:=true; write(temp) END; {rimposto il valore del contatore della stringa temp} exe:=0; i:=1; {si sposta nella successiva riga del file} readln END {eof} END; {stampariga} BEGIN nodo:=NIL; cont:=0; {richiesa di inserire il nome del file in memoria di massa da leggere e analizzare} writeln; writeln('Inserire il nome del file in memoria che si vuole leggere : '); writeln; readln(nomefile); {apro il file in lettura e mi posiziono nella prima riga} reset(filemem, nomefile); writeln; {richiesta di inserire la stringa da analizare all'interno del file} writeln('Digitare un''espressione formata da una o piu''parole(massimo 15 caratteri l''una)'); writeln('ed eventualmente da operatori [+,*,-] : '); writeln('[Premere INVIO ripetutamente...per visulizzare le righe del testo opportune!]'); writeln; readln(buff); instringa(buff, nodo); stampariga(filemem, nodo) END.