Sei sulla pagina 1di 24

Parole riservate Per poter programmare in qualunque linguaggio necessario conoscere i codici mediante i quali possiamo esprimere i progetti

i che andremo a realizzare. Il basic, come linguaggio di programmazione possiede un suo proprio codice espressivo con parole d'uso esclusivo per certe funzioni, queste parole le chiameremo parole riservate del basic. Le parole riservate del basic (versione 1.1 o successive) sono: ABSOLUTE AS DOUBLE LIST OFF SINGLE TO AND OR ACCESS BASE ELSE LONG ON STEP UNTIL EQW XOR ANY BINARY ELSEIF LOOP OUTPUT STRING USING MOD / APPEND CASE INTEGER NEXT RANDOM THEN WEND NOT /

Queste parole non possono essere usate come identificatori (essendo tipiche) poich ciascuna di queste ha una funzione definita in basic.
Identificatori Gli identificatori sono parole che rappresentano costanti, variabili, tipi di dati, procedure, funzioni e alcuni altri dati. Esistono vari tipi di identificatori: predefiniti dal basic e quelli definiti dal programmatore. Alcuni degli identificatori predefiniti sono: int, long, single, ... Gli identificatori definiti dal programmatore sono gli elementi aggiunti al linguaggio come variabili, procedure, funzioni, etc. Un identificatore una sequenza da 1 a 127 caratteri, che inizia con una lettera, non contiene spazi n simboli speciali: &, !, *, etc. e non una parole riservata. Per il basic non esistono differenze tra maiuscole e minuscole, cos che un identificatore denominato "valor" si pu anche riferire come "VALOR" o "VaLoR". Tutti gli identificatori in basic devono essere definiti prima di utilizzarli.

Tipi di dati La gestione dell'informazione in basic si realizza mediante diverse classi di dati. Vengono qui trattati i principali tipi semplici, poi conformemente alle necessit si espliciteranno altre forme composte a partire da queste forme semplici. Integer Chr$ String Numeri interi senza parte decimale. Caratteri del codice ASCII Una sequenza di caratteri che viene trattata come un solo dato.

Single, double, long Numeri che possono avere una parte decimale

Variabili e costanti I tipi di dati che utilizziamo nei nostri programmi possono essere di due classi: variabili o costanti. Come indicato dal nome le variabili possono cambiare contenuto nel corso dell'esecuzione del programma, mentre le costanti mantengono il loro valore fisso durante tutto il processo (un'esecuzione del programma). In sostanza a differenza delle variabili, il nome di una costante si identifica col suo valore. Un esempio di variabile l'abbiamo andando a sommare due numeri che vengono passati ad un programma, potremo introdurre due valori qualsiasi che non sarebbe utile restringere a due valori fissi, in maniera che vengano usati di volta in volta i valori che necessario sommare. Invece, se un nostro programma di operazioni matematiche va ad utilizzare il valore di PI in alcuni calcoli possiamo definire un identificatore PI con il valore di 3.1415926 costante, in modo tale che PI non possa cambiar valore, evitando di riscrivere tutto il numero ogni volta che necessario ricorrere ad esso nel nostro programma, ci baster solo scrivere PI. Le variabili e le costanti possono essere di tutti i tipi visti precedentemente: numeriche tanto intere che reali, caratteri, stringhe di caratteri, etc.

Commenti E' possibile introdurre commenti in un nostro programma utili a migliorare la comprensione del codice sorgente. Per introdurre dei commenti basta far precedere un apice all'inizio della frase. I commenti sono importanti al momento della compilazione del programma e sono di enorme importanza al momento della creazione, della modifica o della manutenzione.

Struttura dei programmi

Tutti i programmi in Basic sono costituiti da una sola sezione, cio il corpo del programma. Nel corpo del programma vengono dichiarate sia la variabile che le costanti eseguite dal programma stesso

Programma principale Come si pu vedere, non importante l'ordine con cui si fanno le dichiarazioni di variabili e costanti. si possono dichiarare prima le variabili e poi le costanti o viceversa: 'Prima prova input "Introduca un valore intero" Risposta = "Il valore introdotto " Legge un valore da tastiera e lo inserisce nella variabile Intero PRINT Compilazione ed esecuzione in memoria La compilazione di un programma il passo attraverso il quale facciamo tradurre il codice sorgente in linguaggio macchina direttamente eseguibile dal computer. Per realizzare la compilazione nell'ambiente integrato del Basic si utilizza l'opzione CALL ABSOLUTE del men con lo stesso nome.

Compilazione su disco Per poter eseguire un programma senza la necessit di avere aperto l'ambiente integrato di sviluppo del Basic necessario compilare il programma su disco. Per far questo necessario avere un compilatore per Basic. Una volta compilato un programma su disco possibile eseguirlo direttamente dal sistema operativo.

Assegnazione L'operazione di assegnazione non molto utilizzato in Basic . Nome"Giovanni" Nome costituito dalla stringa di caratteri "Giovanni" input" Numero1 - Numero2" Area = Base*Altezza/2 (calcola l'area di un triangolo e l'assegna all'identificatore Area ) Non indispensabile per ogni programma garantire l'input/output in modo da stabilire un dialogo con l'utente.

Presentazione dei dati a video Le istruzioni che permettono di presentare i dati sul video del computer sono: print . Siamo gi ricorsi ad esse nei precedenti programmi d'esempio, che qui approfondiremo. La sintassi dei procedimenti di emissione la seguente: Print(indentificatori) ; Dove gli identificatori sono quelli che contengono le informazioni che si desidera visualizzare. E' possibile utilizzarne vari in ciascuna istruzione print , unicamente separando uno dall'altro con una virgola ",". Esempio: print Questa linea di codice serve a visualizzare di seguito i contenuti degli identificatori Nome, Cognome e indirizzo. Nel caso in cui la variabile nome abbia assunto il valore "Giovanni ", la variabile Cognome "Brambilla " e la variabile Indirizzo "Via dei Ciclamini, Sondrio", il risultato a video sar: Giovanni Brambilla Via dei Ciclamini, Sondrio Avremmo potuto ottenere lo stesso risultato utilizzando la seguente scrittura: print Nome print Cognome print Indirizzo L'identificatore pu essere qualsiasi variabile che sia stata precedentemente definita, NON pu essere una costante. Pu essere una composizione di variabili, separate dalla virgola, in questo caso si assegnar il primo valore terminando con [Enter] al primo identificatore indicato nell'elenco, di seguito toccher al secondo e poi via via fino all'ultimo identificatore vedersi assegnare, sempre allo stesso modo, un valore da tastiera.

Tipi di dati semplici Un programma dev'essere capace di trattare diversi tipi di dati, come possono essere numeri interi, reali, caratteri, stringhe (sequenze di caratteri), etc... Per facilitare il trattamento di queste specifiche informazioni Basic ha definito diversi tipi di dati applicabili agli identificatori che verranno utilizzati.

Tipi interi In questa categoria Basic propone alcuni tipi diversi, ciascuno raccoglie un intervallo specifico di valori e utilizza una diversa quantit di memoria in funzione delle caratteristiche della rappresentazione interna prevista. Naturalmente lavorare con rappresentazioni corte offre una maggiore velocit e minor occupazione di memoria, per utilizzando rappresentazioni lunghe si consente una maggiore precisione e variabilit. Questi tipi di dati semplici in basic sono: Tipo Integer string ! Intervallo di valori accettati da-32677 a 32678 da 0 a 255 2^-39 a 1,7^38 -2147000000 a 2,9^31-1 Utilizzando i tipi interi possibile rappresentare nel programma un numero in formato esadecimale, per aver questo semplicemente si antepone il simbolo "$" al valore esadecimale, dove viene visualizzato il valore, o dove verr usato in un'operazione sar come fosse decimale. Per esempio: Quantit = $10 Il valore che si trova in "Quantita" sar 16. Tipi reali I numeri reali sono quelli che ammettono una parte decimale. In basic si pu contare su vari tipi di dati reali, che per non possiamo utilizzare, salvo il tipo real, se non con macchine che montano un coprocessore matematico. I tipi di dai reali sono: Tipo semplice prec.(!) Doppia prec.(#) Intervallo di valori accettati da 10^-45 a 10^38 da 10^-324 a 10^308

I numeri reali devono avere per forza almeno una cifra a destra del punto radice o decimale. Per esempio, il numero 5 va rappresentato come 5.0, il .5 come 0.5 , etc... LongInt In questo tipo di dati si utilizza la notazione scientifica, analoga a quella delle calcolatrici, le cifre che seguono la E rappresentano la potenza alla quale va elevato il numero 10 prima di moltiplicarlo per la quantit (mantissa) a sinistra della stessa E: Tipo carattere I carattere sono i simboli che formano il codice ASCII, il tipo standard del Pascal per questi dati Char. I caratteri vengono specificati tra apostrofi: 'a' </TD 'B' </TD '2' '#' Il tipo carattere un tipo ordinale del basic, questo vuol dire che i suoi elementi validi sono una sequenza ordinata di valori individuali. La sequenza di caratteri per questo tipo corrisponde al numero di codice ASCII, da 0 a 255. E' possibile accedere a ciascuno dei caratteri utilizzando il segno # prima del suo valore corrispondente, per esempio, la lettera A pu esser rappresentata come #65, il ritorno di carrello, o ENTER, si rappresenta come #13, e cos qualsiasi carattere. Operazioni elementari Le operazioni elementari in Quick Basic sono formate da due parti: l'operatore e gli operandi. Un operatore il simbolo che indica al programma quale operazione realizzare; e gli operandi sono i dati sopra i quali si effettuer l'operazione. Gli operatori di Quick Basic sono: Operatore Operazione ^ - <7TD + * / \ Elevazione a potenza Negazione Addizione Sottrazione Moltiplicazione Divisione a punto decimale mobile Divisione con interi

Il tipo di dati che Basic restituisce come risultato di una operazione dipender dal tipo di dati usati come operandi. Per esempio, la somma di due interi d come risultato un altro intero, e la somma di due numeri reali d come risultato un altro numero reale.

Operatore MOD La divisione di due numeri, senza importanza di tipo, dar come risultato un numero reale, Quick Basic offre l' operatore MOD che restituisce il resto di una divisione di interi. Es di sintassi: intero := dividendo MOD divisore Il seguente programma un esempio dell' uso degli operatori aritmetici: 'operazione aritmetiche Somma = 12 + 8 Sottrazione = 12 - 8 Moltiplicazione = 12 * 8 Divisione = 12/8 Resto_Intero = 12 MOD 8 Print "La somma di 12 + 8 uguale a:";Somma Print "La sottrazione di 12 - 8 uguale a:";Sottrazione Print "La moltiplicazione di 12 * 8 uguale a: ";Moltiplicazione Print "La divisione di 12 / 8 uguale a:";Divisione Print "Il resto della divisione intera di 12 / 8 :";Resto_Intero

Priorit degli operatori Quando si utilizzano in alcune espressioni pi di un operatore, questi si valutano conformi a una priorit stabilita per Quick Basic. E' necessario conoscere l'ordine di valutazione per evitare errori nei nostri programmi. L'ordine col quale si effettuano le operazioni il seguente: *, /, MOD +, primi nella valutazione, tutti hanno la stessa priorit. ultimi nella valutazione, entrambi hanno la stessa priorit.

In caso che ci siano parentesi nell' espressione si valuta prima il contenuto delle parentesi dopo quello degli altri operatori. Se esistono due operatori di uguale priorit si valuta da sinistra a destra. Per osservare l'importanza della valutazione corretta degli operatori si espone il seguente esempio: 'Operatori Resultato_Uno = 3 + 5 * 7 Resultato_Due = (3 + 5) * 7 ?"Il risultato dell'operazione 3 + 5 * 7 : ";Risultato_Uno ?"Il risultato dell'operazione (3 + 5) * 7 : ";Risultato_Due Come si potr osservare nella prima operazione si effettuer prima l'operazione 5*7 e al risultato si sommer 3, invece nella seconda operazione si far prima la somma 3+5 per moltiplicarla al risultato 7.

Uso delle constanti variabili Quando si dichiareranno le variabili in Quick Basic non si inizializzano con nessun valore specifico, questo significa che una variabile che non ha un certo valore avr un contenuto imprevedibile, cosa non desiderabile nella maggior parte dei programmi, per evitare resultati indesiderabili possibile assegnare a ogni variabile un valore per "dfaut" (istinto), che si fissa all'inizio del programma. Queste variabili inizializzate sono chiamate costanti variabili, le quali si dichiarano nella sezione delle costanti, per possibile cambiarne il valore. La sintassi per la loro dichiarazione la seguente: Identificatore : tipo_di_dati = valore; Esempio: 'Costanti_Variabili data Valore_Inizializzato : Integer = 23 Testo_Inizializzato : String = "Salve!" VAR Testo : String Intero : Integer BEGIN ? "Stringa inizializzata:";Testo_Inizializzato ? "Stringa da inizializzare:";Testo ? "Intero inizializzato:";Valore_Inizializzato ? "Intero da inizializzare:";Intero END

Uso delle espressioni come costanti E' possibile dichiarare costanti prendendo altre costanti gi dichiarate nel programma inserendole in qualche espressione, per esempio: DATA Colonne = 80 Righe = 24 Spazio_Totale = Righe * Colonne; E' possibile utilizzare solo costanti in espressioni di questo tipo, se si ricorre a qualche variabile si incorrer in un errore al momento della compilazione del programma.

Cicli (enumerativi) FOR Il ciclo FOR ripete una proposizione un determinato numero di volte che si indica al momento di invocare il ciclo. Ci che si ottine con FOR di incrementare una variabile da un valore iniziale a uno finale eseguendo ad ogni incremento della variabile (contatore) l'istruzione o il blocco di istruzioni che dev'essere eseguito. La sua sintassi : FOR identificatore = inizio TO fine istruzione; In cui l'identificatore la variabile che viene incrementata, inizio il primo valore che assumer tale variabile e fine il valore fino al quale sar incrementata la variabile eseguendo ogni volta l'istruzione (semplice o composta che sia). Il seguente esempio rappresenta i numeri da 1 a 50 sul video. La variabile di conta utilizzata "Numero". 'PROGRAM Ciclo_FOR FOR Numero = 1 to 50 PRINT Numero END Una delle limitazioni dei cicli FOR che una volta iniziato il ciclo verr eseguito il numero di volte predefinito senza possibilit di riunire o eliminare dei cicli. E' possibile far in modo che il conteggio del ciclo avvenga a ritroso, ovvero che la variabile al posto di incrementarsi si decrementi. Per far questo basta mettere STEP -1 e si colloca il valore maggiore a sinistra e il valore minore a destra. Esempio: 'PROGRAM Ciclo_FOR_2 FOR Numero = 50 TO 1 STEP -1 PRINT Numero END

Cicli WHILE I cicli WHILE offrono il vantaggio che l'esecuzione si svolge mentre verificata una condizione, pertanto possibile controllare il numero di ripetizioni una volta iniziato il ciclo. La sua sintassi : WHILE condizione DO istruzione; Dove condizione quella che viene valutata, mentre questa si verifica vera si esegue l'istruzione, che pu essere semplice o composta. Un programma che scriva i numeri come prima da 1 a 50, ricorrendo al ciclo WHILE il seguente: 'PROGRAM Ciclo_WHILE Numero = 1; WHILE Numero <= 50 DO PRINT Numero Numero = Numero +1 END Alla fine del programma la variabile Numero avr assunto il valore 51, che il valore che falsificando la condizione stabilita nel controllo di WHILE fa uscire dal ciclo.

Cicli DO-LOOP-UNTIL Questi titpi di cicli sono molto simili ai cicli WHILE, la loro differenza che mentre in WHILE la condizione per l'esecuzione del ciclo viene valutata prima (all'inizio), in DO-LOOP-UNTIL viene valutata alla fine, quindi dopo aver eseguito almeno una volta il ciclo. Questo, ripetiamo, significa che in un ciclo DO-LOOP-UNTIL l'istruzione sar eseguita almeno una volta, cosa che pu anche non succedere nel ciclo WHILE. Esempio: 'PROGRAM Ciclo_DOLOOPUNTIL Numero = 1 PRINT Numero Numero = Numero + 1 LOOP UNTIL Numero = 50; Per creare un buon programma necessario fornirgli la capacit di decidere in base al valore delle variabili o di eventi definiti dal programmatore le possibili alternative, diramazioni nella logica di sviluppo del progetto, in maniera che sia applicabile in situazioni diverse abbastanza generalizzate e non solo a una sequenza di passi, a una situazione, specifica.

Istruzione IF...THEN...ELSE Questa espressione si utilizza per eseguire un'istruzione nel caso che una condizione stabilita sia vera, al contrario si potr esguire un'istruzione diversa. La sua sintassi : IF condizione THEN istruzione ELSE altra Dove condizione l'espressione che verr valutata, in caso risulti vera si eseguir quanto dato in istruzione, nel caso in cui la condizione non risulti vera si esguir l'istruzione data come altra. Esempio: 'PROGRAM IF_THEN_ELSE FOR contatore = 1 to 50 IF contatore 10 THEN PRINT Contatore ELSE PRINT "*" END In questo piccolo programma la variabile Contatpre viene incrementata da 1 a 50, l'istruzione condizionale IF verifiche se vero che Contatpre maggiore di 10, se cos sar scriver a video il valore della variabile, in caso contrario scriver a video un carattere "*". Appena il contatore inizia da 1, avremo che si scriveranno 10 asterischi prima del primo numero, che sar 11, valore che verifica la condizione "Contatore 10 (rendendola vera). L'aggiunta ELSE con la sua corrispondente istruzione sono opzionali e possono essere omesse.

Istruzioni IF annidate E' possibile utilizzare in un'espressione del tipo IF..THEN..ELSE una istruzione composta da eseguire nel caso che la condizione sia verificata, cos come nel caso alternativo con ELSE, in questa forma possiamo inserire anche altre istruzioni IF..THEN..ELSE dentro la precedente, consentendoci di valutare varie condizioni una dentro l'altra. Esempio: IF Numero 5 THEN IF Numero <10 THEN Opzione = Numero IF Numero <30 THEN Opzione2 = Numero END

Selezioni multiple CASE Questa forma di controllo si utilizza quando si deve valutare un'espressione che pu assumere valori diversi e a ciascun caso seguiranno compiti differenti. Por esempio, se si crea un men con differenti opzioni si realizzer un determinato processo per ogni possibile scelta, tuttavia la selezione da parte dell'utente verr fatta nello stesso punto. Il seguente programma illustra l'uso della forma CASE, il programma chieder un numero all'utente e lo classificher in base a tale valore. 'PROGRAM Case PRINT "Introduci un numero intero da 1 a 3" INPUT numero CASE Numero CASE 1 : CASE 2 : CASE 3 : ELSE PRINT END SELECT PRINT "Il numero 1" PRINT "Il numero 2" PRINT "Il numero 3" "Il numero non c'entra"

GOTO L'istruzione GOTO utilizzata per stravolgere il flusso logico del programma, cio, per passare ad eseguire una frase situata in un posto diverso del progrmama dalla linea successiva. L'uso del GOTO vivamente sconsigliabile perch distrugge il modello di programmazione strutturata che quella utilizzata in Qbasic, inoltre si scontra con la struttura preesistente che perde di validit. Per utilizzare questo tipo di salto incondizionato necessario dichiarare l'etichetta (label) alla quale andare, che non sono altro che identificatori che marcano il punto di rimando del flusso di programma nell momento in cui si ricorre al GOTO. La dichiarazione di etichette si pone prima di definire le costanti e le variabili, la parola riservata per queste dichiarazioni :. Il nome dell'etichetta il nome di un identificadore come qualsiasi altro, per quando si utilizza deve terminare con i due punti ":". La sintassi del comando : GOTO etichetta; Esempio: 'PROGRAM Uso_del_GOTO PRINT "Questa linea verr scritta" GOTO Etiqueta PRINT "Questa linea non verr scritta" Etiqueta: PRINT "Si effettuato il salto" END STOP L'istruzione STOP provoca la fine immediata di un programma, senza riguardo per le istruzioni che seguono. Normalmente si utilizza in caso di errori, si emette un messaggio e si termina il programma. Esempio: 'PROGRAM Uso_di_STOP PRINT "Prima linea del programma" PRINT "Qui termina l'esecuziomne del programma " STOP END Ma c' dell'altro anche in queste semplici istruzioni di controllo ... a Voi scoprirlo e documentarlo !!!

Definizione di funzione Le funzioni sono semplicemente delle procedure che restituiscono un valore. QBasic non soltanto fornisce molte funzioni gi disponibili, ma consente anche di progettarne alcune proprie. I due tipi di funzioni di QBasic sono quelle definite da DEF FN e la pi potente procedura function, che viene definita mediante l'istruzione FUNCTION.

Creazione delle funzioni

Una procedura definita dall'istruzione Function simile ad un sottoprogramma, tranne per il fatto che restituisce un valore; inoltre deve essere denominata come se fosse una variabile dello stesso tipo del valore restituito . Ad esempio, possibile dichiarare una funzione che restituisce un'intero lungo, come nel seguente caso: DECLARE Function BinDec& (binario AS STRING) L'istruzione DECLARE specifica il numero e il tipo delle variabili che devono essere inserite nella chiamata a BinDec&. In questo caso non viene utilizzata l'istruzione CALL, ma sufficiente assegnare il valore restituito dalla funzione a un'altra variabile. E' anche possibile utilizzare una procedura definita da Function in un'istruzione QBasic, oppure come argomento di un'altra istruzione o funzione. In modo analogo ai sottoprogrammi, le procedure definite da FUNCTION utilizzano argomenti e variabili locali (tranne quelle passate o quelle specificate da un 'istruzione SHARED). 'titolo print "Programma in quick basic"

. Uso delle funzioni


Una funzione un insieme separato di istruzioni che restituisce un valore. Il valore restituito da una funzione definita da un'altra variabile, tuttavia anche possibile applicarle il valore direttamente a un'altra funzione o istruzione di QBasic. E' persino possibile utilizzare una funzione come argomento per un'altra funzione o sottoprogramma definiti dall'utente. L'istruzione di seguito riportata rappresenta un'applicazione corretta della funzione con segno % Dato che una funzione restituisce sempre un valore, QBasic gestisce il nome della funzione come variabile. Per questo motivo in base al valore che restituisce; se questo carattere non viene inserito, QBasic presuppone che il valore restituito sia a precisione semplice o del definito dall'istruzione DEFtipo. Generalmente le funzioni assumono una o pi variabili come argomenti. I tipi di queste variabili possono essere definiti utilizzando il carattere di dichiarazione del tipo corretto, la clausola AS con INTEGER, LONG, SINGLE, DOUBLE ,string, oppure il nome di un tipo definito dall'utente. Gli array passati alla funzione come argomenti devono comprendere le parentesi dopo il nome, sebbene non sia necessario elencare il numero delle dimensioni. 'PROCEDIMENTO funzione titolo print "Programma in quick basic" print "Programma esempio di uso delle funzioni", titolo$ ' chiamata della funzione print titolo$ 'richiamo della funzione

Variabili locali e globali All'interno di una funzione definita dall'utente possibile specificare un numero qualsiasi di variabili; per default esse sono presenti soltanto durante l'esecuzione della funzione e il relativo contenuto viene eliminato quando il controllo ritorna alla riga che ha richiamato la funzione. Per mantenere il contenuto delle variabili locali tra le chiamate, sufficiente utilizzare la parola chiave STATIC. Questa operazione permette di velocizzare in modo considerevole l'esecuzione del programma, dato che, dopo la prima chiamata non pi necessario che QBasic crei le variabili locali ogni volta che la funzione viene chiamata. E' anche possibile sfruttare l'istruzione STATIC al posto dell'omonima parola chiave per mantenere tra le chiamate soltanto alcuni valori delle variabili locali. Queste ultime sono disponibili soltanto per la funzione in cui vengono utizzate; questo significa che altre funzioni o istruzioni presenti nel codice da cui viene richiamata la funzione non possibile utilizzarle. In modo analogo , le variabili definite Esempio: 'Variabili function prueba 'in questa sezione possibile utilizzare la variabile ciao ADDIO$ = "Addio, qui va bene" Print Addio$ 'in questa sezione non riconoscibile la variabile addio ciao$ = "ciao, benvenuto nel programma" print ciao$ print addio$ 'Nel compilare il programma si generer un errore E' possibile dare lo stesso nome a una variable locale e a una globale nello stesso programma, per entro la procedura non sar utilizzabile la variabile globale perch prevarranno le variabili locali sulle variabili globali. Per esempio: 'variabili FUNCTION Messaggio saluto$ = "Questo messaggio valido solo per il procedimento \messaggio\" print saluto$ saluto$ = "primo saluto (globale)" print saluto$ 'si scriver il messaggio:primo saluto

Parametri Per poter passare informazioni tra il programma principale e le procedure, o tra le stesse procedure usiamo i parametri, che sono canali di passaggio dei dati.

I parametri sono opzionali e se non necessari meglio non usarli. Per usarli necessario dichiararli con la seguente sintassi: FUNCTION nome (lista dei parametri); La lista dei parametri composta dai loro nomi e dal tipo di dati che li rappresentano, quelli dello stesso tipo sono separati da virgole "," e quelli differenti sono separati da punto e virgola ";". Esempio: fUNCTION Esempio(a, b AS Integer; c, d AS String); Per chiamare una procedura che utilizza parametri si possono utilizzare come tutte le altre variabili o costanti, purch siano dello stesso tipo di quelle dichiarate. E' sempre possibile creare una procedura che chiama un'altra procedura purch la procedura chiamata sia stata dichiarata prima di quella che lo user Definizione delle funzioni Le funzioni sono, analogamente alle procedure, una raccolta di istruzioni che potranno essere eseguite quando invocate, la differenza tra queste e le procedure che le funzioni restituiscono un valore. La dichiarazione delle funzioni si realizza nel seguente modo: FUNCTION nome(parametri) Di seguito si scrive il contenuto della funzione come una normale istruzione (semplice o composta), normalmente terminando con l'assegnazione di un valore al nome della funzione che lo ritorner. Esempio: FUNCTION semisomma (a, b) 'semisomma di due numeri reali semisomma = (a + b) / 2 Uso delle funzioni Siccome le funzioni restituiscono un valore specifico, la forma d'utilizzo abituale avviene per mezzo dell'assegnazione del valore della funzione a una variabile. Esempio: 'funzioni FUNCTION semisomma (a, b) 'Semisomma di due numeri naturali Semisomma = (a + b) / 2 Print" X = 5.89" Print " Y = 9.23" print" Z = semisomma (X, Y)" 'Eguaglia Z al valore risultante dalla funzione semisomma" print "La semisomma di ,X, Y : Z"

Procedura di STOP
La procedura STOP gi vista precedentemente, semplicemente trattata come un'istruzione, in verit una procedura predefinita in QBasic che ci permette di terminare il nostro programma in qualunque punto dello stesso. La procedura EXIT provoca l'immediata uscita dalla procedura o dal blocco che si sta eseguendo, rimandando all'istruzione successiva a quella dove fu chiamata. Troncamento e arrotondamento La funzione cint(nmero) arrotonda un numero reale all'intero pi vicino e restituisce il risultato come numero reale. La funzione fix(nmero) elimina la parte decimale del numero reale e restituisce il risultato come tipo intero. Esempio: 'troncamento INPUT"inserisci un numero decimale";A PRINT fix (A) 'arrotondamento INPUT"inserisci un numero decimale";A PRINT cint (A)

Funzioni esponenziali e logaritmiche La funzione Sqrfornisce la radice quadrata di x. x^2restituisce il quadrato di x. Esempio: 'funzioni esponenziali INPUT"inserisci un numero reale":x y = SQR(x) PRINT y x = y^2

PRINT x Le funzioni Exp e Log riguardano i logaritmi neperiani e naturali. Exp restituisce la funzione esponenziale e^x e Log restituisce il logaritmo naturale di x. Il risultato in entrambi i casi sempre di tipo reale. E' possibile creare una funzione con le due basi dette per calcolare il risultato di un numero x elevato alla potenza n, che noi proponiamo cos: 'funzioni logaritmiche (x,n:Real) Potenza=exp(n*Ln(x)) L'uso di questa funzione in un programma potrebbe essere la seguente: FUNZIONI ESPONENZIALI(x, n : Real) CLS SCREEN 12 INPUT"inserisci la base"; b INPUT"inserisci il numero"; N potenza=log N/log b PRINT Potenza, b^Potenza

Funzioni aritmetiche Abs ritorna il valore assoluto di un identificatore che viene passato come parametro. Il valore restituito sarebbe dello stesso tipo dell'argomento. Abs(-24) {Ritorna il valore 24} La funzione Int restituisce la parte intera di un valore reale, come tipo reale. La funzione Frac ritorna la parte decimale di un valore reale, sempre come valore reale.

Funzioni trigonometriche Le funzioni trigonometriche definite in qbasic sono: Sin(angolo), Cos(angolo) e atn(valore), tutte le altre possono essere definite come queste: Tan(x) Sin(x) / Cos(x) Cot(x) Cos(x) / Sin(x) Sec(x) 1 / Cos(x) Csc(x) 1 / Sin(x) Le funzioni per richiamarle sono: FUNCTION Tan(x : Real) Tan := Sin(x) / Cos(x) END FUNCTION Cot(x : Real) Cot := Cos(x) / Sin(x) END FUNCTION Sec(x : Real) Sec := 1 / Cos(x) END FUNCTION Csc(x : Real) Csc := 1 / Sin(x) END

Generazione di numeri casuali Per generare numeri casuali in qbasic ricorre alla funzione Random e alla procedura Randomize. La funzione Random genera un numero casuale di tipo reale compreso tra 0 e 1, in cambio la funzione Random (x) genera un intero casuale tra 0 e x. Il solo utilizzo della funzione Random risulta da sola insufficiente per la generazione di valori casuali per via del fatto che essi sono in realt solo pseudocasuali, il che vuol dire che se viene rieseguito il programma si ripresenteranno gli stessi valori. Per evitare ci dobbiamo utilizzare in ogni programma che utilizza valori casuali la procedura Randomize, che inizializza il generatore di numeri casuali, in altre parole, ci assicura che i numeri ottenuti saranno diversi ogni volta che si esegue il programma. E' raccomandabile il ricorso a tale procedimento prima delle chiamate alla funzione random del programma. Esempio di un programma generatore di numeri casuali: 'PROGRAMMA Creatore di numeri casuali RANDOMIZE TIMER A=(RND*X) ?A END. Le stringhe di caratteri sono sequenze di caratteri con lunghezze che variano da 1 fino a 255 caratteri. Il tipo d'identificatore delle stringhe String o S$. Quando dichiariamo una variabile del tipo string sar possibile introdurre fino a 255 caratteri, cos pure possibile dichiarare stringhe con il comando DEF che definisce una funzione: Preparazione di stringhe

La comparazione di stringhe un'operazione molto comune in Quick Basic; queste comparazioni si realizzano basandosi sull'ordine del codice ASCII, per esempio la stringa 'Prueba' minore della stringa 'prueba' poich il valore del codice ASCII di P 80 e quello di p 112. Cos pure possiamo distinguere la stringa rispetto alla sua lunghezza: 'Hola' minore di 'Bienvenido'. Esiste un caso speciale di una stringa, che quando non ha nessun carattere in s diciamo che una stringa nulla o vuota. E' possibile leggere elementi di una stringa per separarli Per prendere in considerazione un numero di caratteri alla sinistra di una stringa si utilizza il comando LEFT. Esempio: A$="IL BASIC E' UN LINGUAGGIO" B$=LEFT$(A$,8) PRINT B$ Questo programma restituisce i primi 8 caratteri alla sinistra della stringa A$, quindi il monitor visualizzer: IL BASIC Invece per prendere in considerazione e per conoscere la lunghezza di una stringa usiamo la funzione Len che fornisce la lunghezza e il numero di caratteri. Vengono contati anche i caratteri non stampabili e gli spazi vuoti. In sintassi : Len (stringa); La funzione restituisce un valore intero. Funcion.Len x$="COMO, ITALIA" PRINT LEN(X$) d 12 Il programma visualizza un messaggio con la lunghezza della stringa immagazzinata in memoria, in questo caso specifico 12. Operatore + E'una delle forme pi semplici per unire due stringhe e si usa esattamente come una somma, l'unico limite che nel caso in cui maggiore la lunghezza risultante dalla somma rispeto alla lunghezza che pu avere la variabile in cui si va ad immagazzinare truncar i caratteri sovrabbondanti. Esempio: Stringa = "Buenos" Stringa2 ="dias" Stringa3 = stringa1 + stringa2 Print stringa3 <ALIGN="LEFT"<ALIGN="LEFT"Verr visualizzato: "Buenos dias" Pos La funzione Pos ci serve per indicare la posizione orizzontale(la colonna) in cui si trova il cursore. La posizione pi a sinistra 1. I un argomento fittizio. Per ottenere la posizione verticale in cui si trova il cursore, usare la funzione CSRLIN Esempio: IF POS(X)60 THEN BEEP Str La funzione STR$ fornisce una rappresentazione a stringa del valore di n. Val La funzione VAL fornisce il valore numerico della . Elimina gli spazi vuoti davanti, le tabulazioni e gli avanzamenti di riga dalla stringa argomento. Per esempio: VAL("-3) d -3 Mki$ La funzione MIKI$ converte dei valori numerici in valori stringa. Prima di poter immettere un valore numerico esso deve essere trasformato in una stringa. Mki$ converte un valore intero in un valore di 2 byte. Concetto di Funzioni

Le Funzioni sono gruppi di procedure compilate e usate da Basic che possono essere chiamate e utilizzate in qualunque programma senza necessit di scriverle di nuovo. Le Funzioni in Basic si dividono in Interseche e definite dall'Utente. La Funzioni Interseche richiamano un'operazione determinata da far eseguire da un operando; il Basic dispone di funzioni che risiedono nel sistema, quali SQR (radice quadrata) e SIN (seno); queste sono dette "funzioni interseche". Le funzioni definite dall'utente sono quelle scritte dal programmatore come COLOR e SCREEN.

La dichiarazione Funzione
Per dichiarare una Funzione, o che lo stesso, inserirla in lista per essere utilizzata,basta inserirla nella PARTE DEL PROGRAMMA CHE DEVE UTILIZZARLA Struttura delle Funzioni Le Funzioni sono composte da quattro parti: Il nome della Funzione E' il nome della Funzione e del tipo di dati che vengono restituiti, indicati da un suffisso relativo al tipo di dati (%, &, $ o !): FUNCTION nome; Elencoparametri L'elencoparametri vuole indicare una o pi variabili che specificano i parametri da passare alla Funzione quando questa viene chiamata. Esempio: Variabile [( )] [AS tipo] [, variabile [( )] [AS tipo]] ... Variabile:Nome di una variabile Basic Tipo: Il tipo dei dati relativi alla variabile(INTEGER, LONG o un tipo di dati definiti dall'utente). STATIC:Specifica che i valori della variabili locali della funzione vengono salvati tra una chiamata e l'altra. Esempio: CLS RANDOMIZE TIMER DO PRINT" INDOVINA IL NUMERO CHE HO PENSATO DA 1 A 10" A = INT(RND * 10) PRINT "DIGITA IL NUMERO CHE PENSI CHE ABBIA PENSATO" : INPUT X PRINT A: BEEP IF A = X THEN PRINT " CONGRATULAZIONI SEI BRAVO" ELSE PRINT "RITENTA SARAI PIU' FORTUNATO" LOOP IF a <> 0 THEN PRINT u = b / a IF b <> 0 THEN PRINT "Nessuna soluzione" ELSE PRINT " qualsiasi soluzione" PRINT c = b / a Espressione E' il valore di ritorno della funzione.

Creazione di Funzioni La creazione di Funzioni propria si realizza utilizzando le parti gi citate. La sua creazione si realizza nella stessa forma di un progranmma. Un esempio di una funzione : DECLARE FUNCTION OttieneFile$ (nomePercorso$) CONST FALSO=0, VERO=NOT FALSO DIM SHARED termine AS INTEGER cr$=CHR$(13) : esc$ =CHR$ (27):backSpace$= CHR$(8): curSinistra$=CHR$(29) nomeFile=OttieneFile$ ("*.*") LOCATE 15, 1 IF termine THEN PRINT "Terminato!" ELSE PRINT "Hai scelto"; nomeFile$ END FUNCTION OttieneFile$ (percorso$) STATIC SHARED cr$, esc$, backSpaces$, curSinistra$ termine= FALSO buffer$ = " " : puntatore %= 0 CLS: FILES percorso$ PRINT "Inserisci il nome di un file:"; DO tasto$= UCASE$ (INKEY$) SELECT CASE tasto$ CASE esc$ termine=VERO EXIT DO CASE backSpace$ PRINT " "; curSinistra; curSinistra$; puntatore%=puntatore% -1 buffer$ =LEFT$ (buffer$,puntatore%) CASE " " CASE ELSE PRINT tasto$; buffer$ = buffer$ + tasto$

puntatore%=puntatore% +1 END SELECT LOOP UNTIL tasto$ = CHR$(13) OttieneFile$= buffer$ END FUNCTION

Compilazione delle Funzioni Per compilare una Funzione e lasciare la lista per la sua utilizzazione in programmi successivi si utilizza l'opzione Esegui nel men dello stesso nome. La sequenza di tasti [Maiusc.] + [F5] compilano anche le funzioni cos come i programmi da esse dipendenti.

Uso delle funzioni


Una volta compilata una funzione si pu incorporare nel programma aggiungendo l'istruzione FUNZIONI della quale si parlato all'inizio, e dichiarando le funzioni che si utilizzeranno, si pu accedere usando tutte le procedure e le funzioni incluse come si troveranno scritte nello stesso programma. Concetto di Subroutine

Le Subroutine rappresentano il metodo tradizionale per la memorizzazione del codice che deve essere eseguito ripetutamente nel corso del programma. Per passare il controllo ad una subroutine, sufficiente utilizzare la seguente sintassi: GOSUB posizione In questa isruzione, posizione rappresenta il numero di riga o l'etichetta di una istruzione presente nel codice della Subroutine. Non indispensabile che sia la prima isruzione della Subroutine, sebbene inserirla in un punto diverso indichi una scarsa capacit di programmazione. Il programma prosegue dal punto indicato fino a quando individua una istruzione RETURN , che provoca la ripresa dell'esecuzione coll'istruzione successiva a GOSUB . In QBasic la gran parte delle subroutine stata sostituita dai pi potenti sottoprogrammi. In ogni modo esse sono ancora utili per l'individuazione degli eventi.

Utilizzo di GOSUB e RETURN

L'istruzione GOSUB consente di eseguire un salto incondizionato a una Subroutine in un punto qualsiasi dello stesso modulo; RETURN contrassegna un'uscita dalla Subroutine. Questa istruzione permette di riprendere l'esecuzione in corrispondenza dell'istruzione successiva a quella che ha richiamato la Subroutine, oppure di un'altra sezione del programma. Sintassi

GOSUB (riga |etichetta) .. RETURN [(riga|etichetta)] Riga o etichetta indicano la destinazione di un istruzione GOSUB. Quindi, l'esecuzione procede fino a quando viene individuata l'istruzione RETURN; a questo punto il controllo ritorna all'istruzione che segue GOSUB, oppure al numero di riga o all'etichetta specificati nell'istruzione RETURN. Descrizione L'istruzione GOSUB indica a QBasic di eseguire un salto incondizionato al numero di riga o all'etichetta specificati.Il controllo viene trasferito alla riga di destinazione, indipendentemente dal risultato delle istruzioni eseguite in precedenza. Questa istruzione non pu essere utilizzata per passare all'interno o all'esterno di un sottoprogramma o di una funzione definita dall'utente, mentre invece GOSUB pu essere sfruttata per passare all'interno di un sottoprogramma o di una funzione, a patto che l'esecuzione ritorni a un'istruzione contenuta nella procedura chiamante. Tutte le variabili utilizzate dalla Subroutine sono condivise dalle altre istruzioni presenti nella parte del programma che la comprende. Qualsiasi modifica apportata a queste variabili viene mantenuta quando la Subroutine termina. Le Subroutine possono contenere istruzioni GOSUB che richiamano altre Subroutine (in questo caso si parla di nidificazione) o persino esse stesse (ricorsione), anche se il programma deve allocare uno spazio per lo stack sufficiente per il livello di nidificazione utilizzato. Se viene utilizzato RETURN con un numero di riga o un'etichetta per uscire da una Subroutine nidificata, l'indirizzo di ritorno deve trovarsi nella stessa Subroutine che l'ha richiamato. Se le Subroutine sono nidificate su pi livelli, possibile ritornare soltanto al livello che ha richiamato la Subroutine.

Subroutine generali

Le routine generali contengono le istruzioni in base alle quali verranno eseguite particolari operazioni nell'applicazione. Mentre le routine generali definite devono essere richiamate in modo specifico dall'applicazione, le routine di eventi rimangono in pausa finch non vengono richiamate per rispondere a particolari eventi generati dall'utente o dal sistema. Diverse routine di eventi possono richiedere l'esecuzione delle stesse istruzioni. in questo caso consigliabile creare una routine generale ed inserirvi le istruzioni comuni che verranno quindi richiamate dalle routine di eventi. In questo modo non sar necessario duplicare il codice e la gestione dell'applicazione risulter semplificata.

Subroutine di eventi

Quando viene generato un evento, un oggetto di QBasic richiama automaticamente la routine di eventi corrispondente. Poich il nome della routine stabilisce una associazione tra l'oggetto e il codice, le routine di eventi possono risultare associate a "Form" o a "Controlli". Tutte le routine di eventi utilizzano la stessa sintassi generale. Sintassi per gli eventi associati a controlli

Private Subnomecontrollo - nomeevento (argomenti) istruzioni End Sub Sintassi per gli eventi associati a form

Private Sub Formnomeevento (argomenti) istruzioni End Sub

Archivi ad accesso sequenziale Gli archivi ad accesso sequenziale sono nominati anche archivi di testo, questi sono formati da catene di caratteri separati uno dall'altro dai codici di ritorno di carrello o di linea, che corrispondono ai caratteri 13/10 del codice ASCII. La fine dell'archivio indicata dal carattere ASCII 26, anche espressa come ^Z o EOF. E' possibile visualizzare questi archivi con il comando TYPE del sistema operativo DOS e si possono editare con qualsiasi editor di testi. Questo tipo di archivi permette solo operazioni di lettura e scrittura sequenziale, l'unico modo per modificarli aggiungere linee alla fine dell'archivio. I passi per leggere o scrivere in un archivio di questo tipo sono: Aprire l'archivio per lettura o scrittura. Leggere o scrivere dati nell'archivio. Chiudere l'archivio

Aprire archivi
Per l'apertura si utilizza il comando OPEN specificando con "for" di che tipo . (Append nel nostro caso per i file di tipo sequenziale). Esempio: OPEN nome del file FOR APPEND / INPUT / OUTPUT # n.file

Scrivere dati in un archivio


Per scrivere dati in un archivio si ricorre alle istruzioni PRINT e WRITE specificando il numero di file e la variabile dell'archivio. Esempio: PRINT# n. file; variabile

Leggere dati da un archivio


Per leggere i dati di un archivio ad accesso sequenziale si utilizzano le istruzioni INPUT# e PRINT con la variabile. L'istruzione Print visualizza sul video i dati.

Fine dell'archivio
La sintassi della funzione EOF : EOF (numero file) La funzione EOF controlla se stata raggiuntala fine del file. La funzione EOF d -1 (vero) se la fine di un file sequenziale stata raggiunta. Usiamo questa funzione per controllare se, nel corso di un'immissione, stata raggiunta la fine del file, per evitare l'errore "INPUT PAST END" (Immissione dopo fine file).

10 OPEN "I",#1,"DATI" 20 C=0 30 IF EOF (1) THEN 100 40 INPUT #1,M(C) 50 C=C+1:GOTO 30

Chiudere archivi Per assicurare che tutte le informazioni finiscano nel disco correttamente necessario chiudere l'archivio prima di terminare l'esecuzione del programma, altrimenti si corre il rischio che l'ultima informazione che stata passata non venga completamente salvata. L'istruzione per chiudere un archivio Reset, e la sua sintassi : Reset Per chiudere un singolo file si usa l'istruzione CLOSE, la sua sintassi : Close# n. file

Aggiungere dati a un archivio di testo


Per aggiungere dati a un archivio di testo sono necessari i seguenti passi: Aprire ilfile da modificare Scrivere i dati Chiudere l'archivio

Archivi ad accesso diretto


Un archivio ad accesso diretto formato da una raccolta di dati individuali (campi) che appartengono allo stesso tipo de dati (record). Ciascuno dei componenti (record) di questo tipo di archivio accessibile direttamente. Gli archivi ad accesso diretto sono anche chiamati archivi con tipi o tipizzati.

Struttura dell'archivio
A differenza degli archivi sequenziali, gli archivi tipizzati non sono composti di linee di caratteri, ma sono costituiti da registrazioni con struttura fissata. L'ampiezza delle registrazioni determinata dalla quantit di bytes necessari per registrare il tipo di dato che conterr il record (registro). Per esempio, se si vanno a registrare numerosi interi in un archivio, ogni registrazione (record) servir per un numero specifico e occuper 2 bytes, la registrazione seguente utilizzer i due bytes seguenti dell'archivio e cos sucessivamente fino a completare la quantit di dati che si vogliono registrare. Questo tipo di archivi non possono essere visualizzati con l'istruzionetype del sistema operativo per via del formato utilizzato per presentarli.

Aprire archivi Quando si tratta di aprire un archivio nuovo o un archivio gi esistente sul disco si apre con la procedura OPEN for RANDOM Non c' nessuna differenza tra l'apertura di un archivio ad accesso diretto per leggere o per scrivere.

Registro attuale e dimensione di u archivio


La funzione FileSize restituisce la dimensione di un archivio, o per meglio dire fornisce il numero di registrazione in esso contenute. Al momento di aprire un archivio nuovo la funzione FileSize restituisce il valor 0, che significa che l'archivio non contiene ancora dati.

Posizionamento all'interno di un archivio


Per posizionarsi in un punto nel file, si utilizza la funzione EOLN ; per muoversi fino a una registrazione determinata si utilizza la funzione SEEK .

Lettura e scrittura di archivi


Per la lettura e la scrittura in un archivio ad accesso diretto unicamente si utilizzano le procedure Get# e Put# Dopo ogni operazione di lettura o scrittura il puntatore si posiziona sulla seguente registrazione. Per essere sicuri che legga la registrazione che si desidera si deve ricorrere al procedimento seek prima di qualunque procedura di lettura o scrittura.

Chiudere un archivio
Per chiudere gli archivi aperti si procede allo stesso modo che con uno ad accesso sequenziale, utilizzando la procedura close: Close CLS Sintassi: CLS; Si utilizza per cancellare l'intero contenuto del video. Esempio: CLS FOR x = 1 TO 24 FOR y = 1 TO 80

NEXT NEXT PRINT "#"; PRINT "Premi [ENTER] per cancellare li schermo"; INPUT "Prb";A CLS; PRINT "Si cancella lo schermo";

Sleep Sintassi: Sleep [secondi] Detiene l' esecuzione del programma durante un tempo specifico secondi. La precisione del ritardo dipende dalla precisione dell'orologio interno del computer. Esempio: 'Retardo CLS PRINT "Inizia con un ritardo approssimativamente di 5 secondi" Step 5 PRINT "Fine del ritardo"

Locate
Sintassi: Locate x, y Sposta il cursore nella posizione specificata. I parametri opzionali fanno lampeggiare il cursore e definiscono la riga di inizio e di fine. x y. Il byte x rappresenta la colonna partendo da sinistra a destra e il byte y rappresenta la fila partendo dall'alto verso il basso. Esempio: REM 'Posizione'; CLS Locate 10,10 PRINT "*"; Locate 20,20 PRINT "*";

Sound
Sintassi: Sound (Frequenza ,durata) Genera un suono del clacson nel computer a una frequenza determinata per il valore di Frequenza.

Screen
Sintassi: Screen modalit Si utilizza per selezionare la risoluzione del video. Modalit 0 1 2 3 Risoluzione Solo testo 320*200 CGA, EGA, VGA o MCGA 640*200 CGA, EGA, VGA o MCGA 720*348 HERCULES, OLIVETTI o MCGA

4 7 8 9 10 11 12 13

640*400 HERCULES, OLIVETTI o MCGA 320*200 EGA, VGA 640*480 EGA, VGA 640*350 EGA, VGA 640*350 EGA, VGA MONOCROMATICI 640*480 VGA, MCGA 640*480 VGA 320*200 VGA o MCGA

Color Imposta i colori per la visualizzazione. COLOR [primo piano%] [,[fondo%] [,bordo%]] COLOR [fondo%] [,palette%] COLOR [primo piano%] COLOR [primo piano%] [,fondo&] Modalit schermo 0 (solo testo) Modalit schermo 1 Modalit schermo 4, 12, 13 Modalit schermo 7-10

Window Sintassi: Definisce le dimensioni logiche del viewport grafico corrente. Usare l'istruzione WINDOW per definire un proprio sistema di coordinate del viewport. WINDOW [[SCREEN] (x1!,y1!)-(x2!,y2!)] SCREEN Inverte la direzione normale della coordinata y dello schermo in modo che il valore di y aumenti procedendo dal limite superiore al limite inferiore dello schermo. _ (x1!,y1!) Coordinate logiche dello schermo a partire dall'angolo superiore sinistro del viewport. _ (x2!,y2!) Coordinate logiche dello schermo a partire dall'angolo inferiore destro del viewport.

inkey$

La funzione inkey$ fornisce una stringa di un carattere contenente il carattere presente nella tastiera, o una stringa nulla se al dispositivo non vi nessun carattere.

Pos Pos restituisce il numero della colonna dove si incontra il cursore.

CSRLIN La funzione CSRLIN restituisce il numero della riga dove si incontra il cursore al momento della chiamata della funzione. OBIETTIVO DEL MODULO: - Far conoscere la funzione Screen, usata per attribuire colore ad un carat- tere ed le caratteristiche del video dei sistemi di coordinate della unit; e anche conoscere le costanti deiloro differenti colori per colorare lo schermo.

PROGRAMMA 1.1 GRAFICA LINEARE IN MODO TESTO: In questa modalit il programma lavora con l' unita di Windows '95 Nella modalit testo il video consta de 25 righe di 40 o 80 caratteri cada uno. Lo schermo video si divide in righe e colonne. Le righe si enumerano da 1 a 80, dove la colonna 1 sta nella parte superiore sinsitra e la colonna 80 all estremit destra. Ogni elemento si identifica con una coppia di numeri, che indicano la riga e la colonna. Per collocare il cursor a colonna x e alla riga y, si usa l'istruzione pset(x,y) dove la x e la y che si trovano tra parentesi rappresentano le coordinate dello schermo, vale a dire, la riga e la colonna. Si possono scrivere caratteri del codice ASCII in modo da poter fare linee e grafici in modo testo (semi-grafica). Programma Esempio: Programma in modalita Screen 0 CLS SCREEN 0 COLOR 5 PRINT " ITC "; " De Simoni"; " Sondrio ITALIA" LOOP

1.2 MODI GRAFICI: COME INIZIALIZZARE E CHIUDERE UN PROGRAMMA DI GRAFICA IN BASIC E' sempre un programma di BASIC, caratterizzato dallo specifico tipo di unit che vengono utilizzate, in questo caso si usa SCREEN 2, 3, 4, ecc.. Di seguito si iniziano i controlli grafici, questo si fa specificando il tipo di adattatore il modo grafico e dopo aver chiamato che quello che prepara l'Hardware per la grafica. Dopo aver inizializzato il programma con SCREEN, il programma avr sempre l'estensione *.BAS. Continuando viene eseguito il codice del programma, qui che porremo le istruzioni per realizzare i grafici che si desiderano e chiuderemo con END. che chiude tutto il corpo del programma. Esempio: Program Esempio; CLS SREEN 12 a = 0 DO a = a + 4 CIRCLE (320, 240), a, 9 LOOP UNTIL INKEY$ = CHR$ (13) RADOMIZE TIMER a = 0 DO a = a + 3 CRICLE(320, 240), a, 2 LOOP UNTIL INKEY$ = CHR$ (13) DO b = INT(RND *10) c = c + 2 CIRCE (320, 240), c, b LOOP UNTIL INKEY$ = CHR$ (13)

Funzione Screen Questa unit di BASIC abbastanza completa poich un uso molto accurato delle modalit grafiche. Sono compresi controlli per gli adattatori grafici pi importanti e adatti a disegnarer una grande quantit di stili di caratteri.

Lo schermo grafico formato da pixels ordinati in linee orizzontali e verticali. Ci valido per ogni modalit grafica del computer; la differenza sta nel numero di pixel. Per Esempio: CGA: i pixels sono abbastanza grandi, per cui ne sono contenuti solo 320orizzontalmente e 200 verticalmente. (320 x 200). VGA: i pixels sono piccoli e ne sono contenuti 640 orizzontalmente e 480 verticalmente. (640 x 480). Quanto pi piccoli sono i pixel, maggiore sar il loro numero, la definizione e quindi la qualit dell'immagine (monitor). Maggiore risoluzione. Tutti i PC, XT, o AT sono equipaggiati per alcuni tipi di scheda video. Le schede molto elementari, hanno l'adattatore monocromatico (MDA), che supporta solamente la modalit testo. In questo caso non si pu programmare per usare la grafica. Il primo avanzamento stato la scheda adattatore CGA (Color Graphics Adapter), bench l'alta risoluzione e le molte opzioni di cui disponr la MCGA (Monochrome Graphics Adapters) e la EGA (Enhaned Graphics Adapter) siano maggiori vennero dopo. Per le pi avanzate applicazioni grafiche sono quelle CAD, le AT&T 400 e VGA (Video Graphics Array), PC-3270 e IBM-8514, tutti adattatori video che offrono un'alta risoluzione. Continuando si osservano nella tabella le schede di adattamento del video, le modalit video con le maggiori risoluzioni dello schermo per colonne e righe e i colori che ognuna utilizza: SCHEDA MODALITA' COLORI scheda risoluzione colori

CGA CGA0 CGA1 CGA2 CGA3 CGAHi MCGA MCGAC0 MCGAC1 MCGAC2 MCGAC3 MCGAMed MCGAHi EGA EGALO EGAHi EGA64LO EGA64Hi EGAMonoMi HERC HERCMonoHi ATT400 ATT400C0 ATT400C1 ATT400C2 ATT400C3 ATT400Med ATT400Hi VGA VGALO VGAMed VGAHi

320*200 320*200 320*200 320*200 640*200 320*200 320*200 320*200 320*200 640*200 640*480 640*200 640*350 640*200 640*350 640*350 720*348 320*200 320*200 320*200 320*200 640*200 640*200 640*200 640*350 640*480

Verde chiaro, Rosso chiaro, Giallo. Cyan chiaro, Magenta chiaro, Bianco. Verde, Rosso, Caff. Cyan, Magenta, Grigio chiaro. Monocromatico. Verde chiaro, Rosso chiaro, Giallo. Cyan chiaro, Magenta chiaro, Bianco. Verde, Rosso, Caff. Cyan, Magenta, Grigio chiaro. Monocromatico. Monocromatico. 16 colores. 16 colori. 16 colori. 4 colori. 2 colori. Monocromatico. Verde chiaro, Rosso chiaaro, Giallo. Cyan chiaro, Magenta chiaro, Bianco. Verde, Rosso,Caff. Cyan, Magenta, Grigio chiaro. Monocromatico. Monocromatico. 16 colori. 16 colori. 16 colori. 256 colori.

IBM8514 IBM8514LO 640*480 IBM8514Hi PC3270 PC3270Hi Ritorna all'indice

1024*768 256 colori. 720*350 Monocromatico.

1.3 COLORI: Nel modo CGA, MCGA e ATT400 la selezione dei colori limitata ai quattro predefiniti che includono C0, C1, C2 e C3. Con una alta risoluzione, alcune schede grafiche offrono 16 colori; oltre offrono due o quattro colori, per la selezione dei colori indipendente dalla palette predefinita. In quanto ai modi IBM8514, la sua paletta di colori di 256 colori con una possible selezione di 262,144 sfumature. E' per questo che in questo tema si tratteranno i colori e le selezioni di colori nei modi EGA/VGA e di seguito, con CGA e sistemi monocromatici. Nei sistemi monocromatici, l'apertura e la chiusura dei grafici limitata da due bits di informazione per pixel: uno di video on/off e l'altro di intensit di bit. Nei sistemi CGA, il sistema di colore RGBI(Red, Green, Blue, e Intensit) sono usati con quattro bits di informacioni por pixel, per le combinazioni sono limitate solo a quattro. Il color di fondo nero, per pu essere selezionato per l'intero intervallo di 16 colori. Nei sistemi EGA/VGA il sistema di colori RrGgBb usa sei bits di infomazione per pixel per un totale di 64 colori. Dipende dal comando che si possa colorare una regione che sia lo sfondo, il contorno o riempito di figure. Per colorare si utilizza SetColor, questa istruzione stabilisce il colore basta stabilire quello che cambia. Si fisser l'istruzione e tra parentesi si dar il numero del colore desiderato o la costante di colore. Per colorare lo sfondo si utilizzer l'enunciato Color e si utilizzer allo stesso modo del precedente. Per restituire il colore che si tiene in primo piano si utilizza la funzione Color. In base alla risoluzione usando il colore della paletta, il valore restituito sar il numero della paletta e non il valore del colore attuale. In alta risoluzione (16 colori) il valore restituito corrisponde al valore del colore a meno che SetPalette e SetAllPalete stiano usando o cambiando i valori della paletta. In BASIC, per sistemi EGA/VGA si possono scegliere i colori mediante le seguenti costanti o corrispondenti nomi: Nome Const. Color

Black Blue Green Cyan Red Magenta White Gray LightBlue LightGreen LightBlue LightRed

0 1 2 3 4 5 6 8 9

Nero Azzurro Verde Celeste Rosso Magenta Bianco Grigio Blu chiaro

10 Verde chiaro 11 Azzurro chiaro 12 Rosso chiaro

LightMagenta 13 Magenta chiaro Yellow White 14 Giallo 15 Bianco intenso

Ritorno all'indice

1.4 SISTEMI DI COORDINATE: Nei modi grafici le coordinate sono rimpiazzate dalle coordinate dei pixel, in funzione dell'hardware dependono le coordinate, se sono schermi ad alta o bassa risoluzione dependeranno le coordinate, e si adegueranno le operazioni a questi limiti, per Esempio: nel modo EGAHi ser di 640*350. Ciascun pixel verr individuato da una coppia di coordinate (x,y), dove x il numero della colonna e y il numero della riga.

Le righe e le colonne si numerano a partire da 0 e non da 1 come nel modo testo. Nel modo grafico CGA, le righe sono numerate da 0 a 199 e le colonne da 0 a 319. Nel modo grafico CGA ad alta risoluzione, le righe sono numerate da 0 a 199 e le colonne da 0 a 639. Le coordinate nel modo grafico si determinano prima con la colonna, vale a dire, la coordinata x. Ci sono molte variet di risoluzione del video, per si pu far uso di funzioni in Basic come GetX e GetY che determinano l'ampiezza dello schermo, aggiustando le operazioni susseguenti dentro i limiti dello schermo. Le funzioni GetX e GetY restituiscono il massimo valore x e y delle coordinate del video nel modo grafico attuale. Per Esempio, nel modo EGAHI, GetMaxX restituisce 639 (0..639) e GetY restituisce 349 (0..349). Nel modo grafico, il cursore non risulta visibile. Al suo posto si mantiene un puntatore nell'ultimo punto considerato, che si chiama puntatore attivo. Per sapere la posizione del puntatore attivo, si ricorre alle funzioni GetX e GetY che restituiscono le coordinate x e y del puntatore attivo, rispettivamente. Vale a dire, GetX e GetY restituiscono la posizione attuale nelle coordinate dei pixel orizzontali e verticali. La funzione Moveto muove la posizione attuale, con le coordinate specificate, nel modo testo questa funzione equivalente alla funzione GotoXY. Ritorna all'indice

1.5 TESTO IN MODO GRAFICO: La unit Screen in Basic non viene utilizzata per la modalit testo, ma solo come modalita grafica; la modalita testo di Basic viene attivata all' apertuta di Basic. Per selezionare una sorgente del carattere in Basci non esiste il comando, ma bisogna utilizzare versioni pu aggiornate di Basic, o passare su VisualBabsic Per visualizzare i Basic un testo in qualsiasi parte dello schermo basta usare la funzione LOCATE. che serve per dare le coordinate di qualsiasi punto dello schermo e visualizzare il testo selezionato 0 PROGRAMMA FINALE DEL MODULO: program pcxx; uses crt,graph,dos; PROCEDURE INICIAR_GRAFICOS; VAR MONITOR,MODO,ERROR:INTEGER; BEGIN MONITOR:=DETECT; INITGRAPH(MONITOR,MODO,' '); ERROR:=GRAPHRESULT; IF ERROR<>GROK THEN BEGIN WRITELN('ERROR EN GRAFICOS ');DELAY(3000); HALT; END; CLEARDEVICE; END; Procedure SetRGBPalette(Col,R,G,B:byte); Var Regs:registers; begin Fillchar(Regs,sizeof(Regs),0); Regs.AX:=$1010; Regs.BX:=col; Regs.Dh:=R; Regs.Ch:=G; Regs.Cl:=B; Intr ($10,Regs); end; Procedure Graba_Pcx(xmin,ymin,xmax,ymax:integer;nombre:string); type maping=arraY[0..15,1..3] of byte; pcxinit=record manufactura,version,codigofin,bitsporpixel:byte; xmin,ymin,xmax,ymax,hres,vres:integer; mapacolor:maping; reservado,nplanes:byte; bytesporlinea,typopaleta:integer; sheet:array[1..58] of byte; end; const

Colors:maping= ( (0,0,0),(0,0,2),(0,2,0), (0,2,2),(2,0,0),(2,0,2), (2,2,0),(2,2,2),(1,1,1), (1,1,3),(1,3,1),(1,3,3), (3,1,1),(3,1,3),(3,3,1), (3,3,3) ); Var archi1:file of pcxinit; archi:file of byte; Hdr:pcxinit; punto,contador,l:byte; i,j,k,x,y:integer; Function Lee_color(var x,y:integer):byte; var co:byte; begin if y<=ymax then co:=Getpixel(x,y); inc(x); if x>xmax then begin x:=xmin; inc(y) end; Lee_color:=co end; Function Lee_byte:byte; var l:byte; begin l:=Lee_color(x,y); l:=l mod 16; l:=Lee_color(x,y)+(16*l); Lee_byte:=l end; Begin Hdr.manufactura:=10; Hdr.version:=5; Hdr.codigofin:=1; Hdr.bitsporpixel:=4; Hdr.hres:=26; Hdr.vres:=26; Hdr.reservado:=0; Hdr.nplanes:=1; if odd(xmax-xmin+1) then Hdr.bytesporlinea:=(xmax-xmin+1) div 2 else Hdr.bytesporlinea:=((xmax-xmin+1) div 2)+1; Hdr.typopaleta:=0; for i:=0 to 15 do for j:=1 to 3 do Hdr.mapacolor[i,j]:=Colors[i,j]*85; Hdr.xmin:=xmin; Hdr.xmax:=xmax; Hdr.ymin:=ymin; Hdr.ymax:=ymax; {$i-} assign(archi1,nombre); rewrite(archi1); write(archi1,Hdr); close(archi1); {$i+} assign(archi,nombre); reset(archi); seek(archi,128); x:=xmin; y:=ymin; contador:=1; l:=Lee_byte; punto:=Lee_byte; repeat While (l=punto) and (contador<63) do begin inc(contador); punto:=Lee_byte end; if ((contador=1) and (l<192)) then write(archi,l) else begin contador:=contador+192; write(archi,contador); write(archi,l); end; l:=punto; contador:=1; punto:=Lee_byte; Until (y>ymax);

close(archi); {$i+} end; Procedure Lee_Pcx_16(nombre:string); {$r-}{$v-} type plano=^tplano; tplano=array[0..38399] of byte; maping=Array[0..15,1..3] of byte; pcxinit=record manufactura,version,codigofin,bitsporpixel:byte; xmin,ymin,xmax,ymax,hires,vres:integer; mapacolor:maping; reservado,nplanes:byte; bytesporlinea,typopaleta:integer; sheet:array[1..58] of byte; end; Var p:Array[0..5] of word; archi1:file of pcxinit; archi:file of byte; Hdr:pcxinit; punto,contador,l,npl:byte; i,j,k,x,y:integer; xmax,ymax,xmin,ymin,bpl:integer; plane,color:word; count,cuantos:longint; plano0,plano1,plano2,plano3:plano; Procedure Configura_Paleta(Colors:maping); var i:byte; Begin for i:=0 to 5 do SetRgbPalette(i,Colors[i,1] div 4,Colors[i,2] div 4,Colors[i,3] div 4); for i:=6 to 15 do begin SetRgbPalette(21+i,Colors[i,1] div 4,Colors[i,2] div 4,Colors[i,3] div 4); SetPalette(i,21+i); end; end; Procedure Pon_Punto(var x,y:integer;co:byte); begin if y<=ymax then Putpixel(x,y,co); inc(x); if x>xmax then begin x:=xmin; inc(y) end; end; Begin {$i-} assign(archi1,nombre); reset(archi1); read(archi1,Hdr); close(archi1); {$i+} {$i-} xmin:=Hdr.xmin; ymin:=Hdr.ymin; xmax:=Hdr.xmax; ymax:=Hdr.ymax; assign(archi,nombre); reset(archi); seek(archi,128); { Configura_Paleta(Hdr.mapacolor);} x:=0; y:=0; case Hdr.bitsporpixel of 4: begin repeat contador:=1; read(archi,l); if (l and $c0)=$c0 then begin contador:=l and $3f; read(archi,punto) end else punto:=l; for i:=1 to contador do begin pon_punto(x,y,punto div 16);

pon_punto(x,y,punto mod 16) end; until (Eof(Archi)) or (y>=ymax); end; 1:begin new(plano0); new(plano1); new(plano2); new(plano3); count:=0;plane:=0; bpl:=Hdr.bytesporlinea; npl:=Hdr.nplanes; cuantos:=bpl* npl*(1+ymax-ymin); for i:=0 to 3 do p[i]:=0; repeat contador:=1; read(archi,l); if (l and $c0)=$c0 then begin contador:=l and $3f; read(archi,punto) end else punto:=l; for i:=1 to contador do begin while (p[plane]>=38399) do inc(plane); case plane of 0: plano0^[p[0]]:=punto; 1: plano1^[p[1]]:=punto; 2: plano2^[p[2]]:=punto; 3: plano3^[p[3]]:=punto; end; inc(p[plane]); if (p[plane] mod bpl)=(bpl-1) then begin if plane=3 then inc(y); plane:=(plane+1) mod npl; end; end; count:=count+contador; until (Eof(Archi)) or (plane>3) or (count=cuantos); cleardevice; for y:=0 to ymax do for x:=24 to xmax-20 do begin color:=(plano0^[(bpl*y)+(x div 8)] shr (7-(x mod 8))) and 1 ; color:=color+2*((plano1^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); color:=color+4*((plano2^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); color:=color+8*((plano3^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); putpixel(x,y,color); end; dispose(plano0);dispose(plano1);dispose(plano2);dispose(plano3); End; End; close(archi); {$i+} end; Begin iniciar_graficos; readln; Lee_Pcx_16('b:velero.pcx'); SETCOLOR(0); {CIRCLE(100,100,40); SETFILLSTYLE(1,14); FLOODFILL(100,100,0); SETCOLOR(0); LINE(0,450,150,450);} {SETFILLSTYLE(1,LIGHTCYAN); FLOODFILL(200,100,0);} readln; end.

Ritorno all'indice

AUTOVALUTAZIONE: 1. Spiegare la funzione di SCREEN.

2. Se si deve realizzare della semigrafica (grafica in modo testo) che unit si utilizzer ? E in che modo grafico ? 3. In funzione di cosa si migliora la qualit dell'immagine sullo schermo ? 4. Che cos' un pixel? (e un voxel ?) 5. Si indicano allo stesso modo le coordinate grafiche e testo? Perch? 6. Realizzare un programma che : a) Divida lo schermo in tre parti con linee in modo testo. b) Nella prima parte far apparire l'alfabeto in dimensione normale, per con lettere di tipo gotico. c) Nella seconda parte far apparire i numeri dallo 0 al 9, di colore rosso e di dimensioni mediane. d) Nella terza parte far apparire il nome del corso di colore azzurro.