Home
        calcolatore, sistema di elaborazione elettronico
         Contents
1.                                                       gt  6 6  E O EE 2 6e B V    Ora ripetiamo ma fermandoci alla terzultima posizione  le ultime due sono in ordine           5 4 z nessuno scambio                                                       Vv y rv                                           0                      2    e Ra 2 b     A     gt  NOTA  il vettore sarebbe gi   in ordine  ma l algoritmo    non se ne accorge    e  ciecamente  continua i confronti     y          2    6 8 9 Nessuno scambio 2  3  6 8 9                                                             2 3 6 8 9 l   algoritmo si ferma quando ha ripetuto il processo n 1 volte          Ed ecco la codifica in pascal      per n  l volte         for i  1ton 1 do    procedure bubble_sort VAR vet  vettore_interi  n  integer    var i j  integer        parti dalla prima posizione e confronta begin  tutte le coppie fino allan   i    for i  1ton 1 do  forj  1ton ido forj  1ton ido  if vet j   gt  vet j 1  then     se trovi due celle adiacenti non begin  in ordine  scambiale    tmp  vet j    vet j   vet j 1    if vettore j   gt  vettore j 1  then vet j 1   tmp  begin end  tmp  vettore j   end        vettore j   vettore j 1    vettore j 1   tmp  end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  125    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       7  Ordinamento dei valori in un vettore di N elementi  con N  lt  MAX_ELEMENTI  METODO PER SELEZIONE   PER RICERC
2.                                         totale  lt   0 l  1 totale  lt   0  ooo cont  lt   0  L n i  L n  E  C lt  C 1    totale  lt   totale   n                        totale  lt   totale   n                                  S    Finiti     L risp  F  F  V  S totale V          media  lt   totale   c         Sc             NOTA  essendo il messaggio  domanda  per la  terminazione del ciclo particolarmente importante      meglio indicarlo nel flow chart           Esercizi risolti riassuntivi          Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  81    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    1  Chiedere da tastiera l   inserimento di una sequenza di date  Ad ogni data  espressa nella forma giorno mese ed  anno     g        m    ed    a    nel flow chart   aggiungere un giorno e stampare la data risultante  E    l   utente del programma  che dice quando sono finite le date  rispondendo ad una opportuna domanda posta dal programma   Ipotesi  semplificativa  considerare Febbraio sempre da 28 giorni  Traccia     necessario prestare attenzione alle date che  corrispondono a fine mese o anno  nella data risultante cambier   sicuramente il mese e forse anche l   anno                                                           m  lt   m 1 m  lt   m 1                                        V    m lt   1  a lt   a 1                      S  finiti     L risp                Autore  Fabrizio Camuso  email  camuso camuso it sito web  www 
3.                                  ITE1  stampa dei primi N numeri naturali  ITE2  stampa dei primi N numeri naturali   con N letto da tastiera  con N letto da tastiera  stampa dal pi   grande al pi    piccolo  i lt   1 i lt  n  Y  i lt  j 1 je  i 1                               E  F    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  79       ITE3  Stampa dei primi N numeri naturali   con N letto da tastiera  a fianco di ciascun  numero indicare se e  pari o dispari                                     Ln  i lt   1       Y  S i  F V  S  dispari  S    pari                E         i lt  j 1                      i gt n    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ITE4  Stampa dei numeri dispari minori o uguali a  N  con N letto da tastiera         i lt   1    a    ai    7    i lt  j 1                                           n    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  80    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ITES  Far inserire una sequenza di numeri da tastiera  ITE6  Far inserire una sequenza di numeri da tastiera   La sequenza si intende terminata quando viene E    l   utente del programma che dice quando sono finiti i  inserito il numero 0  Si deve calcolare e visualizzare numeri  rispondendo ad una opportuna domanda posta  la somma di tutti i numeri inseriti  dal programma   Si deve calcolare e visualizzare    la media di tutti i numeri inseriti     D  G   
4.               L uso della memoria dinamica consentir   di occupare all inizio solo la memoria necessaria per le 20 stringhe del primo  blocco e di occuparne dell altra solo quando veramente necessario  E    facile convincersi che in questo modo la  memoria eventualmente sprecata    quella corrispondente a 19 stringhe  nell ipotesi di usare solo la prima stringa  dell ultimo blocco allocato           Rifletti              Pur non essendo ottimale  rimane il limite delle 20 1000 blocchi 20000 stringhe  in questo modo riusciamo a gestire  una GROSSA quantit   di stringhe ottimizzando l uso della memoria  In seguito estenderemo la tecnica per gestire  elenchi    infinitamente    lunghi  ad esaurimento RAM     o spazio su disco visto che tutti i moderni sistemi operativi  supportano la gestione virtuale della RAM usando il disco come estensione    lenta    di quest ultima           8 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it         Allocazione dinamica della memoria versione 2 5 Luglio 2003    Procediamo con gradualit    Prima preoccupiamoci della gestione dinamica di un singolo vettore di 20 stringhe  cio   di  un solo blocco  Poi estenderemo la gestione a 1000 blocchi  Come si fa a chiedere al Pascal di allocare spazio per un  vettore di 20 stringhe  Ed il vettore si user   come tutti gli altri vettori  Un passo alla volta        Iniziamo con il definire un tipo che rappresenta un singolo blocco     type  vettore   array 1  20  of string 50      i
5.         ESERCIZI SUGGERITI  ES  1  trovate un modo per generare numeri tra 1 e N   ES  2  sfruttando quanto scoperto nell esercizio n  1  generate una colonna  di risultati di una schedina del totocalcio   ES  3  generate in modo casuale la sequenza dei nomi per le interrogazioni di una classe con solo quattro alunni che  si chiamano Primo  Secondo  Terzo  e Quarto     SUGGERIMENTI  il problema sara  non estrarre piu  volte lo stesso nome  fate corrispondere ogni nome ad un  numero  quando viene estratto quel numero  stampate il nome corrispondente e poi  cancellate  quel nome  copiando nella variabile che lo memorizza una  X  al posto del nome  se generate un numero casuale che corrisponde  ad una X  nome gia  estratto  dovete provare con un altro numero  per sapere quando fermarsi gestite   un contatore che aumenterete solo quando non troverete una  X                                                                                    end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  55    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       ITES  difficolt    bassa  utilizza la random per estrarre numeri da 1 a N             program estrai_1_N   uses newdelay  crt   var i n  integer     begin  clrscr        dato che random N  estrae numeri tra 0 ed N 1  e  sufficiente aggiungere  1 al risultato per avere numeri tra 0 1 1 e N 1 1 N       write  Che N vuoi usare    gt         readln n         estraiamo 20 numeri da 1 a n     fo
6.         readin     per dare il tempo di leggere il messaggio       end           SEL 6  difficolt    bassa Inserite le misure dei lati di 2 rettangoli dire quale dei due ha la superficie maggiore       program confrontaAree    uses  newdelay  crt    var  bl  b2  real     variabile in cui verranno memorizzate le due basi     h1  h2  real     variabile in cui verranno memorizzate le due altezze     al  a2  real     variabile in cui verranno memorizzate le due aree       begin  clrser     cancello lo schermo     write  Inserisci la base del primo rettangolo   gt       readIn b1      write  Inserisci l altezza del primo rettangolo   gt       readIn h1      write  Inserisci la base del secondo rettangolo   gt       readIn b2      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  40    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    writel  Inserisci l altezza del secondo rettangolo   gt       readIn h2         PRIMA SOLUZIONE     writeln  PRIMA SOLUZIONE            se non interessa memorizzare i valori delle due aree si puo  procedere  al confronto diretto delle rispettive formule di calcolo     if b1 h1  gt  b2 h2 then  writeln  Il primo rettangolo ha la superficie maggiore    else  if b1 h1  lt  b2 h2 then  writeln  Il secondo rettangolo ha la superficie maggiore      else  writeln  I due rettangoli hanno la stessa superficie          SECONDA SOLUZIONE  migliore      writeln SECONDA SOLUZIONE         calcoliamo prima le due superfici 
7.        readln numero    somma  somma numero     i  i     end     media  somma n   writeln  media    media 6 2      readin     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ITE15  difficolt    bassa  Calcolo della media di N numeri inseriti dall utente          Pag  66    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       VEDIAMO INFINE LA SOLUZIONE CON IL FOR        writeln  SOLUZIONE CON IL FOR     somma  0      for i  1 to n do   begin  write  Inserire un numero    1      gt       readln numero    somma  somma numero     end     media  somma n   writeln  media    media 6 2      readIn     end        ITE16  difficolt    media  Dato in input un numero intero N  sommare i primi N numeri dispari e  verificare che tale somma e  uguale al quadrato di N              program som_disp   uses newdelay  crt   var  i quanti  integer  numero somma  real     begin  clrscr        il controllo che segue sembra  efficace  provate con 35000   e poi con 70000  l errore non viene rilevato  perche         repeat  writeln  Quanti numeri dispari vuoi considerare   da 0 a  MAXINT        readIn quanti    if  quanti lt 0  or  quanti gt MAXINT  then    writeln  Errato  ripetere l inserimento     N      until  quanti gt  0  and  quanti lt  MAXINT   NOTA  MAXINT    una costante predefinita che rappresenta il    pi   grande numero intero e si pu   utilizzare  con il turbo Pascal in  pratica corr
8.       E    ovvio che ci   che conta    il    contenuto    di ogni nodo  Per un gioco  scacchi ad esempio  ogni nodo potrebbe  memorizzare la situazione appena prima o appena dopo una certa mossa  la matrice della scacchiera   Il sistema  operativo potrebbe memorizzare l   elenco dei file in quella directory  non    proprio cos         per l albero genealogico  i dati anagrafici della persona associata a ciascun nodo ecc     Ma come si rappresentano gli archi  La soluzione classica prevede la gestione tramite memoria dinamica  ogni nodo  memorizza i puntatori ai figli  Ad esempio     type  Pun  Nodo   Nodo record  ParteInformativa  string   sx  Pun     memorizza il puntatore al figlio di sinistra     dx  Pun    memorizza il puntatore al figlio di destra     end    OK  immaginiamo di avere l albero gi   perfettamente costruito e che la variabile puntatore inizio punti al primo  nodo  root   Ed ecco la sfida  scrivere un programma che stampi l   elenco di tutte le parti informative memorizzate  nell   albero  E    una richiesta banale  se non riuscissimo a fare almeno questo l   albero sarebbe inutilizzabile  Da un  punto di vista logico si tratta di visitare tutti i nodi e per ciascuno stampare la parte informativa  Sfido chiunque a  trovare una soluzione che faccia uso di cicli  essa esiste ma    di elevata complessit    E    anche quasi incomprensibile      Ed    pure lunga alcune decine di righe  Guardate invece l   eleganza  la semplicit   e l   estrema leggibilit   di ques
9.       Immaginando di aver gi   creato l oggetto vettore  proviamo a memorizzare una stringa nel suo primo elemento     blocco  1    Sono la prima stringa del blocco      10 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Allocazione dinamica della memoria versione 2 5 Luglio 2003    Attenzione a non usare blocco come se fosse esso stesso il vettore di stringhe   blocco 1    una stringa    NO   Il puntatore infatti non    l oggetto ma l indirizzo dell oggetto  Per passare dall indirizzo all oggetto    necessario    indicare il simbolo   dopo il nome del puntatore  In progressione  blocco    l indirizzo  blocco     l oggetto puntato   cio   il vettore e blocco  1     il suo primo elemento       Ed ora un ciclo for per valorizzare a stringa vuota i restanti elementi  for i  2 to 20 do  blocco  i           Ed un altro ciclo for che visualizza tutte le stringhe     for i  1 to 20 do    writeln  blocco  i        L istruzione dispose  restituzione della memoria          Quando il vettore ha esaurito la sua utilit   possiamo restituire con il comando dispose la memoria al sistema  operativo  cio   deallocarla     dispose blocco   blocco  nil   end     NOTA BENE  dopo la dispose il puntatore perde di significato  E  un GRAVE errore tentare di usare un puntatore  deallocato  Purtroppo  il Turbo Pascal non mette automaticamente a nil un puntatore deallocato  con altri linguaggi    accade  ed    allora buona pratica farlo personalmente     E  altrettanto GRA
10.       non cancellare         const MAX_VOCI_MENU 9   type  voci_menu array 1  MAX_VOCI_MENU  of string     TPersona record   codice  integer    cognome  string  30     attivo  boolean     false  record da considerare cancellato     end     fDati file of TPersona     var  dati  fDati  i scelta integer  ultimo_codice unCodice  longint   nomerile riga  string   unaPersona  TPersona   procedi  boolean  conferma  char   menu_database  voci_  menu        restituisce true se il file il cui nome logico    passato come parametro esiste  false altrimenti     function esiste var f  fdati   boolean   var esito  boolean   begin  reset f      if IOResult 0 then  begin  close f    esito  true  end  else  esito  false   esiste   esito  end     Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 8 di 177       Ricorsione     versione 2 02   Febbraio 2005       riceve un vettore di stringhe ed il numero di queste da considerare e presentare come menu sullo schermo   intitola anche il menu con un altro parametro stringa  restituisce il numero della voce del menu scelta     function menu voci  voci menu  n_voci  integer titolo  string   integer   var i voce_scelta  integer   begin  repeat  writeln titolo  writeln   for i  1 to n_voci do  writeln voci i     write  Scegli   gt       readin voce_ scelta    if  voce_scelta lt 1  or  voce_scelta gt n_voci  then  begin  writeln  Scelta errata    UN TASTO PER RIPROVARE      readin  end  until  voce_scelta gt 0  and  voce_scelta lt  n_voci    menu  voc
11.       readIn citta      repeat  writeln  Quanto dista   citta   in km      readIn km_tappa    if  km_tappa lt 0  or  km_tappa gt MAXINT  then  writeln  Errato  ripetere l inserimento    until  km_tappa gt  0  and  km_tappa lt  MAXINT      somma_km  somma_km km_tappa   end     writeln  Percorso totale    somma_km 5 1  km     writeln  Percorso medio per tappa    somma_km quante_tappe 5 1  km       readln    end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  68    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    COSA SONO I FLOW CHART    I flow chart sono schemi che descrivono visivamente come procede l  esecuzione di un programma  Essi non sono  legati ad uno specifico linguaggio  dato un flow chart  il programmatore pu   poi usare un qualsiasi linguaggio di  programmazione  si tratta  per cos   dire  di un linguaggio visuale comprensibile a tutti i programmatori   Il flow  chart aiuta anche il programmatore a descrivere correttamente un algoritmo  il procedimento risolutivo di un  problema      Ogni tipo di istruzione che si pu   inserire in un programma ha un suo simbolo ed ognuna delle tre strutture  fondamentali della programmazione  sequenza  selezione ed iterazione  pu   essere rappresentata  Esistono anche  simboli speciali  inizio programma  fine programma ecc   che non rappresentano istruzioni vere e proprie ma che  sono utili per la costruzione del flow chart     I PRI NCI PALI SI MBOLI    Inizio programma  i simboli 
12.       readin     end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  101    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Metodologie Top Down e Bottom Up    L esercizio precedente introduce in modo naturale una tecnica di sviluppo utilizzata per problemi di media alta  complessit    Invece di tentare di risolvere il problema come un tutt uno  compito di solito molto difficile  si procede  ad una suddivisione in sottoproblemi  E    intuitivo che ogni sottoproblema sia pi   semplice di quello originale  Per ogni  sottoproblema che si ritiene ancora troppo complesso si procede ad ulteriore suddivisione  Il procedimento viene  ripetuto fino ad ottenere un certo numero di sottoproblemi sufficientemente semplici da essere risolti e codificati con  una certa facilit    A livello pratico questo coincide ad individuare tutta una serie di sottoprogrammi che a loro volta  ne richiamano altri  Questa metodologia viene chiamata  TOP DOWN  dall alto al basso   perch   graficamente  possiamo rappresentarla come una struttura a piramide in cui in cima  top  si mette il problema originale e via via  che si scende di livello sottoproblemi sempre pi   semplici  fino ad arrivare alla base  bottom  della piramide in cui  troviamo i sottoproblemi pi   semplici           Vediamo di riconoscere questo procedimento nell esercizio precedente  Si trattava di realizzare un comando per  trasformare una stringa in minuscolo o in maiuscolo  Questo proble
13.      Dobbiamo convincerci che ci   che viene costruito nelle  memorie di un elaboratore    solo un modello  una rappresentazione semplificata  parziale  mai perfetta  della realt     Certo  quando scriviamo una lettera con Word    esattamente quello che si voleva fare  in questo caso il modello     praticamente perfetto  Ma in altri  per motivi pratici  sono stati imposti dei limiti  Pensiamo ai numeri interi  Pi   sono  grandi e pi   bit sono necessari per rappresentarli  questo    intuitivo  Per motivi di efficienza e praticit   si    deciso di  dedicare sempre lo stesso numero di bit per rappresentare un intero  sono usati cio   gli stessi bit per un numero  grande che per uno piccolo  E    un po    come scrivere 00128 che    ancora 128  stessa cosa in binario  i bit di pi   ed  inutili sono messi a 0   Gi    ma quanti bit   Se ne vengono usati pochi allora non sar   possibile rappresentare numeri  grandi  Se ne vengono usati tanti  tutte le volte che si rappresenta un numero piccolo ne vengono    sprecati    un certo  numero     Qualunque sia la scelta  la conclusione    sempre la stessa  fissato il numero di bit da usare   automaticamente    fissato anche il pi   grande ed il pi   piccolo numero intero  positivo e negativo  che si pu    rappresentare  Stessa cosa per i numeri reali  quelli    con la virgola      in questo caso  oltre ai limiti esiste anche un  problema di precisione  Infatti un numero pu   anche essere piccolo ma con un numero infinito di cifre decimali 
14.      begin     specificando come parametri delle costanti numeriche         writeln   max 3 46   2  0     writeln   max 46  3  2 0     writeln   max 3 3  2 0     writeln   max  43  1   2  0         specificando come parametri delle variabili esterne     writeln  Inserisci due numeri e ti diro  qual e  il piu  grande     write  Dimmi il primo   gt      readin n1     write  Dimmi il secondo   gt      readin n2      writeln   max n1 n2   2 0    writeln   max n1 46   2 0    writeln   max 46 n2   2 0         una funzione puo  essere usata direttamente nel calcolo di un espressione     x  13     max n1 6    18    writeln  X    x 2 0         max puo  essere usata nella condizione di un if     if max n1 n2   gt  100 then  writeln  Il massimo tra i due valori supera 100          o di un repeat           ad una centralina di controllo arrivano i dati sull inquinamento letti da due sonde poste in punti strategici della  citta   leggere questi dati fino a quando una delle due sonde comunica un valore maggiore di 50  microgrammi mc           repeat  write  Inserire valore sonda n  1   gt       readln n1      write  Inserire valore sonda n  2   gt       readln n2   until max n1 n2  gt 50     grazie alla funzione max il controllo pu   essere effettuato in contemporanea       readin   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  105    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004             SOT 13  difficolt    bassa  Determinare il n
15.      begin  clrscr   writeln  Inserire minuti     readin mm      writeln mm   minuti corrispondono a   mm_hh mm avanzano    ore e    avanzano    minuti       readin   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  97    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SOT 7  difficolt    bassa Convertire un certo numero di secondi nelle ore corrispondenti  Si vogliono anche sapere  i minuti ed i secondi che che avanzano        program conversioni   uses newdelay  crt   var ss  avanzano  avanzano_mm  integer        da secondi a minuti  viene calcolato anche l avanzo     function ss_mm quantiSecondi  integer  var avanzo  integer   integer   begin  avanzo    quantiSecondi mod 60   ss_mm    quantiSecondi div 60   end        da minuti a ore  viene calcolato anche l avanzo     function mm_hh quantiMinuti  integer  var avanzo  integer   integer   begin     sfrutto la precedente  il calcolo da fare e  infatti lo stesso       mm_hh    ss_mm quantiMinuti  avanzo    end        da secondi a ore  viene calcolato anche l avanzo     function ss_hh quantiSecondi  integer  var avanzo_ss  avanzo_mm  integer   integer   var quantiMinuti  integer   begin  quantiMinuti    ss_mm quantiSecondi  avanzo_ss    ss_hh    mm_hh quantiMinuti  avanzo_mm   end     begin  clrscr   writeln  Inserire i secondi per convertirli in ore          readin ss      write ss   secondi corrispondono a   ss_hh ss avanzano  avanzano_mm    ore       writeln avanzan
16.      primo numero lotto estratto         writeln   estrai 90        writeln     tiro il dado        uscito         writeln   estrai 6        end     program esempio   var numero  integer     procedure asterischi quanteRighe  integer    var i  integer   begin  for i  1 to quanteRighe do  writeln   4k  gt   gt   gt  gt  kkk kk kkk kk 7  s    end     begin  writeln     quante righe di   devo stampare         readin numero      asterischi  numero     readin   end        parametri vengano specificati tra parentesi prima  del nome del sottoprogramma  Per ciascuno deve  essere specificato il tipo  Notate come sia ancora  necessario  se si tratta di una funzione  indicare il  tipo del valore restituito dal sottoprogramma              Il nome che scegliamo per il parametro serve al  sottoprogramma per sapere come riferirsi al valore  che riceve quando viene chiamato     Anche le procedure possono ricevere valori sotto  forma di parametri  Nell esempio qui a lato la  procedura riceve il numero di righe di asterischi che  deve stampare  il parametro chiamato quanteRighe            Essendo una procedura  dopo la parentesi determina  l elenco dei parametri non deve essere specificato un  tipo come abbiamo visto per le funzioni     In questo esempio c    un altro particolare molto  interessante da notare  dopo l intestazione con il  nome della procedura funzione    possibile iniziare  una sezione VAR in cui dichiarare le variabili ad  uso esclusivo del sottoprogramma  Nel caso in  question
17.     Assign lettera  nomerisico     La procedura assign deve essere usata una volta sola prima di iniziare a lavorare con il file  Ovviamente dovremo  comandare un assign per ciascun file che intendiamo usare     FILE TIPIZZATI    Non c    nessuna differenza nell uso dell assign  Dobbiamo per   dichiarare il file in modo che sia riconosciuto come  tipizzato     type   TPersona record  cognome  string 30      e  obbligatorio definire il numero dei caratteri della stringa      codice  integer    end     fpersona file of TPersona     senza il tipo non potremmo passare un file come parametro           Var  elenco  fPersona     assign elenco     C  dati dat      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  139    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Creazione   procedura REWRITE       L assegnazione da sola non basta per usare un file  E  necessario crearlo  Un file appena creato risulter   vuoto e non  si    obbligati ad inserire subito nuovi dati  anche se di solito lo si fa   Un file creato e lasciato vuoto risulter   con 0  byte nelle cartelle di windows  Non confondete quindi la creazione con l inserimento dei dati     La creazione pu   fallire per vari motivi     il percorso nome del file fornito dal programmatore non    valido    il supporto di massa non    disponibile  nastro non montato  floppy non inserito  CD non scrivibile     il supporto    in avaria  floppy o hard disk rotti         spazio sul supporto esaur
18.     function lowCase c  char    char   var distanza  integer   begin  if isupCase c  then  begin  distanza    ord  a     ord  A       97   65   32     lowCase    chr  ord c    distanza    end  else  lowCase  c  end        converte una stringa in minuscolo     function minuscolo s  string   string   var i  integer  ris  string   begin  ris      for i  1 to length s  do  ris    ris   lowCase s i       minuscolo  ris   end      Converte una stringa in maiuscolo     function maiuscolo s  string   string     var i  integer  ris  string   begin    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  100    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ris      for i  1 to length s  do  ris  ris   upcase s i       sfrutta la funzione predefinita upcase           maiuscolo   ris   end        converte un maiuscolo a seconda del parametro  come   se come  m  converte in minuscolo  se come  M   converte in maiuscolo  se come non ha un valore valido la stringa viene restituita identica     function MiniMaiu s  string  come  char    string   begin  case come of   m   MiniMaiu     M   MiniMaiu    else  MiniMaiu    s   end   end     minuscolo 5   Sfruttando i sottoprogrammi gi   esistenti  la soluzione del  maiuscolo s   problema originale diventa banale        begin  clrscr        esempi d uso         writeln  MiniMaiu  AaZz12    m         writeln  MiniMaiu  AaZz12    M       writeln  MiniMaiu  AaZz12    t         writeln  INVIO per continuare   
19.     lt   minore od uguale X lt  4 x y  lt Z a lt  b c Ord c   lt   67 Parolal  lt   Parola2    uguale Voto 6 x y Z a  b c  a b  div 2   4 Cliente 1   Cliente2   gt   maggiore od uguale   Totale gt  10  x y gt  z a gt  b c   X gt  sqrt z   3    Parolal  gt   Parola2   gt  maggiore Somma gt 100   x y  gt z a gt b c X  gt  sgqr z  Length cognome  gt 12  4    lt  gt  diverso x lt  gt y x y  lt  gt  Z a gt b c X  lt  gt  sqr z  Cognomel  lt  gt  Cognome                           1  c    un carattere  la funzione ord restituisce il valore del suo codice ASCII che viene confrontato con il  valore 67     2  Parolal e Parola2 sono due stringhe  il confronto deve essere inteso in senso lessicografico  cio    considerando la posizione che ciascuna parola occuperebbe sul vocabolario  per cui    cane     lt     ca in anni  libri  e mi sa     il tutto si applica anche quando la stringa contiene pi   parole come in    bel cane     lt     bel gatto       3  Il valore della variabile X viene confrontato con quello della radice quadrata del valore contenuto nella  variabile z    4  Si controlla se la lunghezza in caratteri della stringa cognome supera 12    Immaginiamo di voler applicare uno sconto al prezzo di un prodotto solo ai clienti abituali          program ApplicaSconto   var 7 7 z z 7     costo  real  tipoCliente  string  percentualeSconto  OTA  in molti degli esempi che verranno proposti non ci si          reoccuper   di controllare la correttezza dei dati inseriti  tramite la tastie
20.     readln   end     program cicli   var i  integer   begin  for i  1 to 1 do  writeln    ciao          readIn   end     program cicli   var i  integer   begin  for i  1 to 0 do  writeln    ciao          readln   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  48    dimentichiamo che deve considerare  anche il valore 0 nella sequenza che qui  riporto per intero  3  2 10123     program cicli   var i  integer   begin  for i    3 to 3 do  writeln    ciao          readln   end     program cicli    var i  base  altezza  quanti  integer    begin  writeln    Quanti triangoli vuoi esaminare         readIn  quanti       for i   1 to quanti do  begin  writeln    Inserisci la misura della base del  triangolo       readIn  base       writeln     Inserisci la misura dell       altezza  corrispondente       readIn  altezza       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Questo esempio chiarisce come non sia necessario conoscere l esatto  valore del numero delle volte che sar   ripetuto il ciclo al momento della  scrittura del codice        invece necessario che questo valore sia noto al momento in cui il ciclo  dovr   essere eseguito  noto non significa sapere quale sar    effettivamente questo valore     l utente programma che decide quanti  saranno i triangoli esaminati digitando questo un valore quando il  programma glielo chiede   significa invece sapere che questo valore     contenuto in una certa variabile  quanti  ed    que
21.     write  Quanti hanni hai  0 120      gt       readin  eta         SOLUZIONE 1        controlliamo per errori  eta  negative o superiori a 120     writeln  SOLUZIONE 1       if   eta lt 0   or   eta gt 120   then  writeln  ERRORE  l eta  deve essere compresa tra 0 e 120 1    else  if eta gt  18 then  writeln  OK  vedo che sei maggiorenne        else  writeln  Sei ancora un poppante  torna tra    18   eta     anni             commenti  notate le parentesi OBBLIGATORIE quando in un if c e  pi   di una condizione  notate come sia  possibile iniziare una parte ELSE subito con un altro test  questo tipo di struttura    if     then  else  if     then  else  if     then  ecc  ecc     e  detta con if in cascata e permette di verificare in successione una sequenza di condizioni    La soluzione precedente non consente  in caso di errore  di capire se lo sbaglio e  relativo ad un et    minore di zero  o ad un et    troppo grande perch   le due condizioni sono testate insieme  Vediamo come ottenere un controllo ancora  piu  accurato rispondendo con messaggi di errore differenziati e piu  accurati         SOLUZIONE 2       writeln  SOLUZIONE 2     if   eta lt 0   then  writeln  ERRORE  l eta  non puo essere negativa     else  if   eta gt 120   then  writeln   ERRORE  l eta  non puo essere maggiore di 120     else  if eta gt  18 then  writeln  OK  vedo che sei maggiorenne        else  writeln  Sei ancora un poppante  torna tra    18   eta    anni          writeln  Programma terminato  Pr
22.    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  10    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    I registri  sono celle di memoria speciali  interne alla CPU  usate per memorizzare valori per diversi  scopi  la CPU impiega pochissimo a trovare o scrivere un dato nei registri  perch   sono molto vicini ad  essa e molto veloci  E  quindi assai conveniente tenere qui i risultati intermedi delle operazioni e tutto  ci   che si dovrebbe continuamente rileggere o scrivere nella pi   lenta RAM  Purtroppo la spazio  all interno della CPU    veramente minimo  c    spazio solo per alcune decine di registri     Chiaro che di  volta in volta si terr    della RAM  solo ci   che serve alle istruzioni del momento  poi si dovr   sostituire  il contenuto dei registri con un altra parte della RAM  Pur con queste limitazioni  lavorare con i registri d   grossi  benefici rispetto all uso della sola RAM        Alcuni registri hanno poi una funzione speciale  uno  chiamato contatore di programma  program counter  indica a  quale indirizzo della RAM si trova il dato che rappresenta la prossima istruzione da eseguire        Un altro    chiamato registro indirizzi     qui che va depositato un indirizzo ogni volta che si vuole leggere o scrivere un  byte della RAM  quando si vuole leggere il codice della prossima istruzione da eseguire  il contatore di programma  viene infatti copiato qui      Un altro    chiamato registro istruzioni e contiene il
23.    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  14    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004     pensate al pi greco   se si fissa il numero di bit  pi   di tante cifre decimali non potranno essere rappresentate  Ecco  allora che un numero come 3 145672943456 sar   invece memorizzato come 3 145673  arrotondando la sesta cifra   Ai fini pratici  per la stragrande maggioranza delle applicazioni  la questione    praticamente ininfluente  ma    giusto  sapere che questi limiti esistono e che ci   che viene rappresentato all   interno di un sistema di elaborazione pu    essere soggetto ad approssimazioni  Attenzione  poich   ogni informazione    rappresentata in forma numerica   questo significa che ogni tipo di informazione    soggetto ad approssimazioni  scegliendo  ad esempio  di usare pochi  bit per le intensit   dei colori di un immagine  la gamma dei colori risultanti sar   povera e discorde da quella reale      Evoluzione dei linguaggi di programmazione       Ok  tutto questo discorso per avere perfettamente chiaro questo concetto  nella sua forma pi   primitiva un  programma    una sequenza di valori numerici memorizzati in altrettanti byte della RAM  il formato di memorizzazione  di questi valori    quello binario  Un programma in questa forma    immediatamente comprensibile al decodificatore e  di linguaggio in cui    espresso    chiamato linguaggio macchina    Si parla anche di linguaggio basso livello   perch     
24.    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  4    I record con il Turbo Pascal versione 1 3 Luglio 2003      INSERIMENTO IN CODA DI UN NUOVO ELEMENTO  riceve il puntatore  p  ad una lista ed un valore da inserire     procedure inserisci_in_coda var p puntatore  valore integer    var nuovo_nodo fine_lista  puntatore   begin Anche se sar   poi necessario differenziare il caso lista vuota     new nuovo_nodo   nuovo_nodo  inf  valore  queste istruzioni vanno bene in entrambi i casi   nuovo_nodo    pun  nil        devo distinguere il caso lista vuota     if p lt  gt nil then    lista non vuota     begin  fine_lista  p     parto dall inizio         while fine_lista  pun lt  gt nil do        ed avanzo fino alla fine         fine_lista  fine_lista     pun     fine_lista  pun  nuovo_nodo    end fine_lista  fine_lista  pun     go e   else TN TN TN  p  nuovo_nodo Z info   gt linfo info    linfo E    end     non vuota       Il disegno qui a lato si riferisce al caso lista     24   NU     nuovo_nodo       INSERIMENTO DI UN NUOVO ELEMENTO IN UNA POSIZIONE INTERMEDIA  riceve il puntatore  p  al nodo che  preceder   quello da inserire  procedure inserisci _in_mezzo var p puntatore  valore integer    var nuovo_nodo  puntatore   begin  new nuovo_nodo   nuovo_nodo    inf  valore   if p nil then    la lista e  vuota     begin  nuovo_nodo     pun  nil  p  nuovo_nodo  end  else  begin  nuovo_nodo  pun  p  pun     aggancio successivo     p  pun  nuovo_nodo    m
25.    InizioLista NuovoNodo  new NuovoNodo    NuovoNodo     inf  24     NuovoNodo    pun  nil     NOTA BENE Non    possibile usare ancora InizioLista per creare il secondo nodo  perderemmo il primo     InizioLista     inf  24   InizioLista   pun  nil    InizioLista    new InizioLista    ESE NIL    Da qualche parte in memoria i dati del primo elemento ci sono ancora  avendo per   cambiato l indirizzo memorizzato  nel puntatore con la seconda new  sono diventati irraggiungibili   InizioLista porta ora al secondo nodo  perdendo la  possibilit   di usare il primo        Ora concateniamo i due nodi  agganciando il secondo al primo     ee 24  n    NuovoNodo    InizioLista   pun  NuovoNodo  oN  InizioLista    Nella casella puntatore del primo nodo  la casella dopo il 12  viene memorizzato l indirizzo del secondo  NuovoNodo     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  3    I record con il Turbo Pascal versione 1 3 Luglio 2003    In effetti il secondo nodo    raggiunto in questo momento da due puntatori  quello usato per crearlo e quello del nodo  che lo precede  realizzando cos   la catena      Dopo aver visto i meccanismi fondamentali  siete pronti per l analisi di un programma abbastanza completo di  gestione delle liste semplici  Naturalmente tutte le operazioni verranno implementate come sottoprogrammi  Infatti  sarebbe molto sconveniente scrivere un codice apposito per aggiungere il terzo elemento e poi il quarto ecc     Per brevit   non viene 
26.    N   e  w                                                       orreri     A__     NOTA  tenete d   occhio il numero 9  come una bolla d   aria nell   acqua risalir   verso la    superficie     la parte finale   del vettore   da cui il nome dell   algoritmo  bubble bolla sort ordinamento     2  spostati di una posizione verso destra e ripeti il confronto scambio                t y RN     2    33 s 0 P l6 33 s R 0 Teo B                                                       A _      3  ripeti il punto 2 fino a raggiungere la penultima posizione  che verr   confrontata con l   ultima             yY  6                                     v y  O                3 8 2 O       A  v                                                    y e E    B s R b    B s PR b6 3 DD             A    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  124    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Dopo questo primo    giro     passata  l elemento pi   grande del vettore  il 9  ha raggiunto la sua giusta posizione  Ora  si ripete il tutto fermandoci per   alla penultima posizione  l   ultima  come detto prima     gi   ordinata e va lasciata  stare    Per ricordarcelo  sfumiamo in grigio l   ultima casella del vettore     t yY rv                                  O 2 6 B P    R 6b B P 2 Q b6 33                               A             l          w  O  N   o  w  O  N   o  w                               N                                     y y y     
27.    che  verranno riscritte uguali insieme al nuovo indirizzo     e poter proporre le vecchie informazioni sul video facilitando chi usa il programma nell inserimento dei  campi del record che devono essere cambiati     La lettura della vecchia scheda fa per   avanzare al record successivo e non siamo perci   pi   posizionati nel punto  giusto per l aggiornamento  Se scrivessimo in questa situazione andremmo ad aggiornare in realt   la scheda  successiva  od aggiungeremmo una nuova scheda se fossimo avanzati oltre la fine del file   E    quindi necessario  ripetere il posizionamento con seek prima di riscrivere la scheda     L aggiornamento pu   fallire     i parametri indicati sono errati    l unit   non    disponibile  ad esempio il floppy    stato nel frattempo tolto     l unit      andata in avaria    Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 4 di 177       Ricorsione     versione 2 02   Febbraio 2005    Dopo l aggiornamento ci si trova poi all   inizio dell unit   informativa successiva     Ecco un esempio che propone la sequenza delle operazioni per modificare solo il cognome della persona  corrispondente al secondo record  posizione 1  ricordatevi che si conta da zero          type  TPersona record  cognome  string 30      e  obbligatorio definire il numero dei caratteri della stringa      codice  integer   end     fpersona file of TPersona     senza il tipo non potremmo passare un file come parametro           var  elenco  fPersona     assign elenco     C  d
28.    con x ed y interi positivi        Indichiamo con XallaY x y  il sottoprogramma     L   obiettivo    darne una definizione ricorsiva  esprimere una potenza usando ancora una potenza ma calcolata su un  valore pi   semplice   Si ragiona cos    qual    il caso pi   semplice   Quando si chiede di elevare un numero alla zero   In questo caso infatti per definizione il risultato    1  Un numero elevato alla prima pu   essere calcolato come il  numero stesso moltiplicato la sua potenza zero  Infatti x    x   x     x   1   x  Abbiamo allora ricondotto un caso  pi   complesso al calcolo di uno di cui sappiamo subito il risultato  x     Ora che sappiamo calcolare un numero  elevato alla prima siamo in grado di calcolare i quadrati  Infatti un numero al quadrato pu   essere calcolato come il  HO stesso moltiplicato per la sua potenza prima  x    x   x   E cos   via  x   x  x   x x x  x x x x  xX  x x   ecc     Abbiamo allora ricondotto in generale un caso pi   complesso  x     al calcolo di un caso pi   semplice  x   x      Schematicamente    function XallaY x y  integer   real   begin  if y 0 then  XallaY  1  else  XallaY   x   XallaY x y 1     1sey 0    XallaY x y    d  end     x   XallaY x y 1  se y gt 0 NOTA  come valore restituito ho scelto un real in quanto il  calcolo di una potenza molto rapidamente pu   portare al  superamento della capacit   di una variabile integer                 Esempio 3  calcolo di x y con x ed y interi  y lt  gt 0        Indichiamo con XperY x y  il s
29.    contatore ciclo    n  integer     qui viene memorizzato il numero letto da tastiera       begin  clrscr     cancello lo schermo       write  Fino a che numero devo arrivare    gt      readIn  n          ricordo che l operatore MOD calcola il resto della divisione tra il numero che viene messo alla sua sinistra e  quello che viene messo alla sua destra  ad esempio 7 mod 3 calcola il resto della divisione tra 7 e 3  quindi 1  13  mod 8   gt  5  19 mod 5   gt  4  quando il primo numero e  multiplo del secondo il resto e  zero  4 mod 2   gt  0    15 mod 3   gt  0  15 mod 5   gt  0        for i    1 tondo  begin  write  i          i numeri pari divisi per due danno resto 0     if i mod 2   0 then   writeln   numero pari    else   writeln   numero dispari       end   writeln  Programma terminato  Premere INVIO per continuare          readin     per dare il tempo di leggere il messaggio     end              ITEA4  difficolt    bassa  Stampa dei numeri dispari minori o uguali a N  con N letto da tastiera       program dispari   uses newdelay  crt     var  i  integer     contatore ciclo    n  integer     qui viene memorizzato il numero letto da tastiera       begin  clrscr     cancello lo schermo       write  Fino a che numero devo arrivare    gt      readIn  n     for i    1 tondo  begin  if i mod 2   1 then  writeln  i     end   writeln  Programma terminato  Premere INVIO per continuare          readin     per dare il tempo di leggere il messaggio     end     Autore  Fabrizio Cam
30.    generiamo una sequenza di 10 numeri compresi tra 0 e 15     for i  1 to 10 do  writeln  Esperienza 2     random 16       readIn        NOTA BENE  tutte le volte che si fa ripartire il programma  random genera  la stessa sequenza di numeri  osservatelo con l esperienza n  2 facendo  partire il programma piu  volte      Se si vuole iniziare ogni volta con una sequenza diversa  usare il comando  randomize  esso cambia la sequenza basandosi sul tempo scandito  dall orologio interno del computer          ESPERIENZA 3        riscrivete il ciclo dell esperienza due facendolo precedere dal comando    randomize  fate ripartire piu  volte il programma e notate come la sequenza  dell esperienza 3 cambi tutte le volte      randomize    for i  1 to 4 do    writeln  Esperienza 3    random 16     readin        ESPERIENZA 4        Invece di un numero possiamo usare come parametro per la random una  variabile intera     write  Dimmi un numero       readln num    writeln  Ora genero una sequenza di 10 numeri tra 0 e   num   1    for i  1 to 10 do  writeln  Esperienza 4     random num       readIn        PROVA DA SOLO     1  Cosa accade indicando 1 come parametro della random    2  Cosa accade indicando 0 come parametro della random    3  Cosa accade indicando un numero negativo come parametro della random    4  Cosa accade indicando un numero reale come parametro della random    5  Cosa accade indicando una variabile integer che contiene un valore  negativo come parametro della random      
31.    gt       readin  c         PRIMA SOLUZIONE     writeln  PRIMA SOLUZIONE     if   c  a    or   c  e    or   c  i    or   c  o    or   c  u    then  writeln  e  una vocale    else  writeln  e  una consonante          commento  questa soluzione non tiene conto delle vocali in maiuscolo          SECONDA SOLUZIONE      writeln  SECONDA SOLUZIONE      if   c  a    or   c  e    or   c     or   c  o    or   c  u    or   c  A    or   c  E    or   c T   or   c  O    or   c  U      then  writeln  e  una vocale     else  writeln  e  una consonante            commento  provate con la A  la prima soluzione non fornisce un risultato  corretto  la seconda si   pero  ci sono molti test     ecco una soluzione  piu  efficiente          TERZA SOLUZIONE     writeln  TERZA SOLUZIONE            prima trasformiamo il carattere in maiuscolo e poi facciamo i test  solo con le maiuscole  upcase e  una funzione che restituisce il  maiuscolo del carattere fornito come parametro tra parentesi   se il carattere era gia  in maiuscolo  rimane in maiuscolo      c    upcase  c       if   c  A    or   c  E    or   c  T   or   c  O    or   c  U    then  writeln  e  una vocale     else  writeln  e  una consonante         Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  37    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       QUARTA SOLUZIONE     writeln QUARTA SOLUZIONE            soluzione con if in cascata  poco leggibile e lunga     c    upcase  c       if   c lt
32.    prima o poi provvedere anche alla registrazione dei dati sui supporti di massa  permanenti  pena la perdita dei dati  stessi allo spegnimento del computer   Ad esempio  i documenti creati con Word sono prima registrati nella RAM e  solo con un comando esplicito di registrazione  File   Salva  sono memorizzati sui dischi     Alcune istruzioni chiederanno alla CPU di controllare l   uso di periferiche di input o di output  Sempre pensando a  Word  non    difficile convincersi che le sue istruzioni debbano fare in modo che la CPU rimanga in attesa fino a che  chi sta usando il programma non preme un tasto qualsiasi o usa il mouse  Non appena l utente preme un tasto  le  istruzioni comandano la sua visualizzazione sul video  se con il mouse viene scelto un comando dal menu  le  istruzioni chiederanno alla CPU di comportarsi in modo appropriato        In realt   tutto questo avviene con la collaborazione del sistema operativo  Windows o Lilnux  ad esempio    quest ultimo mette a disposizione di ogni programma una serie di servizi che possono essere invocati  ad esempio se  un carattere deve essere fatto apparire sullo schermo  tutte le operazioni coinvolte non sono gestite al massimo  dettaglio dal programmatore di word  per fortuna    quello che accade    che il programmatore che ha scritto Word     chiede    a Windows di fare questo per lui  Sono tantissimi i servizi messi a disposizione da un sistema operativo   gestione di tutte le periferiche  gestione della ram  del file 
33.    somma_vettore  tot  end              4  Media degli elementi di un vettore di N elementi  con N  lt  MAX_ELEMENTI    NOTA  questo esempio    particolarmente interessante se utilizziamo i sottoprogrammi  Infatti la funzione che  calcola la media pu   richiamare quella  gi   scritta  che calcola la somma           Funzione per la stessa operazione   somma  0   function media_vettore vet  vettore_interi  N  integer  integer   begin   media_vettore   somma_ vettore vet N  div N  end     for i  1 to N do  somma  somma   vettore i       media   somma   N     NOTA  un sottoprogramma pu   passare ad un altro i suoi stessi parametri   con le stesse modalit   viste sino ad ora  per valore o per indirizzo         Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  121    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          5  Posizione dell   elemento con valore minimo in un vettore di N elementi  con N  lt  MAX _ ELEMENTI       L   algoritmo    basato su questo ragionamento  all   inizio ipotizzo che il minimo sia l   elemento che si trova in  posizione 1  Quindi controllo tutti gli altri elementi  dal secondo in poi  e tutte le volte che trovo una posizione con  un valore pi   piccolo diventa quest   ultima la nuova posizione del minimo     posizione_min   1     for i  2 to N do  if vettore i   lt  vettore posizione_min  then    trovata posizione i con valore pi   piccolo     posizione_min    i     Funzione per la stessa operazione     fu
34.   0  else  if N 1 then    0 se N  0  1 se N 1    Fib N       Fib  1    else    Fib N 2  Fib N 1  se N gt 1 r Fib  Fib N 2    Fib N 1   end        Esercizi suggeriti   e calcolo di A B  e calcolo di A B  e inversione di una stringa    6 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Allocazione dinamica della memoria versione 2 5 Luglio 2003    LI MI TI DELLA MEMORI A ALLOCATA STATI CAMENTE             LIMITE 1       Consideriamo la seguente dichiarazione     var  voti  array 1  10  of integer     Il programmatore sta indicando al compilatore che intende usare un vettore di 10 interi  II compilatore di  conseguenza  nella traduzione in linguaggio macchina  predispone  alloca  la quantit   di RAM  byte  necessaria     Con la maggior parte dei linguaggi di programmazione  quando il programma    mandato in esecuzione non c    modo  di mutare questa situazione  aumentare ad esempio il numero di elementi nel vettore   L unico modo per aggiungere  elementi al vettore    quello di modificare il sorgente e ricompilare il programma     Immaginate la scena  un programmatore    tirchio    dimensiona un vettore con troppo pochi elementi  un cliente  a  mille chilometri di distanza  usa il programma in modo da esaurire il vettore     costretto ad attendere l intervento del  programmatore  con grave disagio  ed arrabbiatura      Esagerare con il numero di elementi del vettore potrebbe comportare uno spreco di RAM inaccettabile  se  mediamente il numero di elem
35.   Sistema  Insieme di componenti  ognuno con la sua specifica funzione  ma con uno scopo comune  elaborare   si parla di    processing     dati forniti in ingresso  si parla di    input     e fornire risultati  si parla di    output      adeguatamente presentati        In un moderno sistema di elaborazione elettronico possiamo individuare tra i componenti  il microprocessore   ad esempio Intel Pentium  AMD Athlon   la memoria di lavoro RAM  il disco fisso  hard disk   il monitor  la  stampante ecc              Elaborazione  Operazione  tra cui i calcoli  che trasforma uno o pi   dati informazioni in altri dati informazioni   Questi dati possono insomma essere s   tra loro sommati  sottratti ecc   se sono numeri   ma possono anche  essere confrontati tra loro  spostati o copiati da un punto all altro della memoria  inviati ad un dispositivo per la  loro visualizzazione  ad esempio il monitor  o stampa        NOTA  un dato    una misurazione di un aspetto della realt   e diventa informazione solo quando sappiamo  dare un significato ad esso  ecco allora che un numero da anonimo diventa un peso  un altezza  un punto di       un immagine sul video ecc              Elettronico  Un elaborazione pu   avvenire anche in modo manuale  come quando con carta e penna si mette in  ordine alfabetico un elenco di nomi         Se l elaborazione avviene senza l intervento umano si parla allora di elaborazione automatica   ad esempio le  macchine per lo smistamento della posta       E se infine
36.   caratteristica troppo  piccola per essere rappresentata   divisione per zero  argomento illegale  illegal argument  come in sqrt  10       Problemi di precisione     limitata dal numero di bit dedicati alla mantissa       Problemi di approssimazione  sono dovuti alla conversione tra decimale e binario  ad esempio 0 1  in decimale  pu         essere rappresentati in binario solo come numero periodico  0 0001 0001 0001     che una volta convertito in  decimale pu   dare origine a nome approssimati come 0 0999999 o 9 99999E 2    Confronti  predicati       lt   minore    gt   maggiore    lt  gt   diverso    lt    minore od uguale    gt    maggiore od uguale               STRINGHE    Concatenazione     ciao         a tutti      ciao a tutti     Copy s  inizio  Restituisce della stringa s la sotto stringa che inizia alla posizione inizio e continua per quanti caratteri  quanti           Confronti  predicati       lt   minore    gt   maggiore    lt  gt   diverso    lt    minore od uguale    gt    maggiore od uguale    NOTA  sono tutti da intendersi in senso alfabetico     ALTRI COMANDI UTILI       Length s     Restituisce alla lunghezza  numero di caratteri  della stringa s       Pos s1  s2     Restituisce la posizione della stringa s1 all interno della stringa s2  se s1 non viene trovata restituisce zerc       Val s  x  errore     Se possibile trasforma la stringa s nel numero corrispondente e memorizza il risultato nella variabile X  s  la conversione riesce nella variabile inte
37.   cognome       ROSSI       Nome   QUI NDI   si inizia con il nome della variabile record  Una_Persona    si mette un punto  e si indica il campo da usare  cognome         Similmente si potrebbe procedere con il nome e l et       I campi di un record sono a tutti gli effetti variabili come quelle che gi   conoscete  E    quindi possibile scrivere   readin Una_Persona nome      lettura da tastiera     writeln    La persona si chiama       Una_Persona Cognome             Una_Persona nome    if Una  Persona cognome  Rossi    then       NOTA  dimenticarsi il nome della variabile record  a meno di utilizzo del with  spiegato pi   avanti     un grave errore     cognome     rossi    DI QUALE PERSONA     ci potrebbero essere tante variabili di tipo  TPersona        II costrutto with       Immaginiamo di avere una variabile record con il nome piuttosto lungo e con molti campi all interno  E    scomodo  riscrivere il nome della variabile tutte le volte che si vuole usare un suo campo  se poi questi ultimi sono molti     ancora pi   scomodo  Il Pascal mette a disposizione un costrutto  with  cio   con      che consente di scrivere una volta  sola il nome della variabile record finch   non si ha finito di usare i suoi campi     with Una_ Persona do  begin Tra il begin e l   end del costrutto with invece di scrivere   Readln Una_Persona cognome         readin cognome     NE    resuln nomeli    sufficiente scrivere     ReadIn cognome    readIn eta   end     Vettori di record       Una fami
38.   coppie di numeri tipo  10 20   50 150  eccetera  Poi ci si potrebbe domandare se il programma fornisce risultati  corretti anche quando il primo numero    maggior dal secondo   240 60   e scopriremo che la risposta    s    otterremo  come valore 400   in effetti  240    il quadruplo di 60   E se usassimo numeri negativi  Nessun problema       Ok     arrivato il momento di essere cattivi  e se usassimo numeri decimali  Tipo  10 2  97 5    E se il primo numero  fosse zero   0  34   Anche con queste configurazioni di valori in input il programma continua a fornire risultati  corretti  Giunti a questo punto  il programmatore inesperto  o pigro  potrebbe concludere che il programma funziona  bene in tutti i casi possibili  Purtroppo  la matematica c insegna che non    possibile dividere per zero  inserendo una  configurazione di input con il secondo uguale a zero  come in  72 0   il programma andrebbe letteralmente tilt  Gli  informatici in questi casi usano un espressione assai colorita  il programma va in crash     Il caso dello zero come secondo numero    un cosiddetto caso limite  ogni programma dovrebbe essere testato in  tutti i casi limite che potrebbero presentarsi  anche se con probabilit   molto bassa     La fase di test viene di solito suddivisa a sua volta in     e alpha test     quello svolto direttamente dal programmatore che ha scritto il codice o comunque da personale  interno alla ditta che commercializzer   il software  potremmo dire che in questa fase vengono 
39.   di modificare   riscrivere  una scheda    Nota  ribadisco che a livello fisico i file sono comunque tutti formati da una sequenza di byte  la differenziazione che    ne facciamo    a livello logico  Una parte della letteratura informatica si limita a distinguere tra file di testo e non di  testo  i file tipizzati vengono considerati file binari      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  135    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    TI PI DI ORGANI ZZAZI ONE  ACCESSO     L organizzazione fa riferimento alle modalit   con cui    possibile accedere ai dati sui supporti     Sequenziale  i dati possono essere letti scritti in modo strettamente lineare  per leggere scrivere un dato     necessario leggere i precedenti per posizionare il dispositivo di lettura scrittura nel punto giusto  il tempo per  accedere ad un dato    quindi molto dipendente dalla sua posizione sul supporto  ad esempio  per un nastro  magnetico l   unico tipo di organizzazione possibile    quella sequenziale  se il nastro    all inizio  il tempo per  leggere il primo blocco di dati    assai inferiore al tempo necessario per leggere un blocco che sta a met   o alla  fine del nastro     Random  se    possibile raggiungere un blocco qualsiasi di dati impiegando praticamente lo stesso tempo  indipendentemente dalla posizione del blocco  Ad esempio il tempo necessario a pilotare una delle testine di  lettura scrittura in un punto qualsiasi della supe
40.   eliminazione in testa     p  corrente    pun  precedente   dispose corrente  A TN    end    si Aerei  end  a  Cancellazione in testa alla lista     corrente    INSERIMENTO IN UNA LISTA ORDINATA  Il nuovo elemento deve essere inserito mantenendo la lista ordinata     procedure inserisci_in_ordine var p puntatore  valore integer    var nuovo_nodo  precedente  corrente  puntatore        begin  new nuovo_nodo   nuovo_nodo    inf  valore   if p nil then  begin Inserisce nuovi valori mantenendo un  nuovo_nodo    pun  nil  p  nuovo_nodo ordinamento crescente  La tecnica usata    la    nd      stessa del sort per inserzione  ricerca del giusto  punto di inserimento  usata per i vettori ma  else grazie ai puntatori    evitato tutto il  if valore lt p  inf then    inserzione in testa    sovraccarico dello spostamento degli elementi  begin per far posto a quello nuovo   nuovo_nodo  pun  p  p  nuovo_nodo  end  else  begin       cerca il punto di inserimento     precedente   p  corrente   p   while  corrente  inf lt  valore  and  corrente  pun lt  gt nil  do  begin  precedente   corrente  corrente   corrente  pun  end   if valore gt corrente  inf then    inserimento in coda     begin  nuovo_nodo  pun   nil  corrente  pun  nuovo_nodo  end  else    inserimento in mezzo     begin  nuovo_nodo  pun  corrente  precedente  pun  nuovo_nodo  end end end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  7    I record con il Turbo Pascal versione 1 3 Luglio 2003   
41.   esempi   a volte l help    addirittura ipermediale  si  possono richiamare filmati  animazioni  commenti vocali ecc       e permettono  addirittura  di    disegnare    parte del programma invece di scriverlo  usando il mouse il  programmatore dispone componenti preconfezionati su quella che diventer   la finestra del programma in  esecuzione  caselle in cui inserire del testo  bottoni su cui fare clic  men    tavolozze che appariranno quando si  vorr   far scegliere un colore all utente  finestre di dialogo che permetteranno di cercare un file sul disco quando  l utente comander   il caricamento di un documento o il suo salvataggio eccetera  per ogni componente scelto  l editor inserir   automaticamente il codice corrispondente  Quando un editor    in grado di funzionare in questo  modo    detto visuale     e sono in grado di richiamare automaticamente il compilatore ed il linker e se uno di questi due programmi trova  degli errori mostrare a video i relativi messaggi spostando il punto di inserimento del testo sulla riga del primo  errore  se invece il programma non contiene errori pu   anche essere mandato automaticamente in esecuzione  per provarlo  al termine dell esecuzione si verr   riportati nell ambiente di lavoro dell editto  In questo modo il  programmatore    in grado di controllare tutti i passaggi senza mai abbandonare le editor     per queste  caratteristiche che oggi  pi   che di semplici editor  si preferisce parlare di IDE  Integrated Development  Envinronm
42.   gt  A    then  if   c lt  gt  E    then  if  cT   then  if   c lt  gt  O    then  if   c lt  gt  U    then  writeln  e  una consonante    else  writeln  e  una vocale  U     else  writeln  e  una vocale  O     else  writeln  e  una vocale  1I     else  writeln  e  una vocale  E        else  writeln  e  una vocale  A         commenti  questa soluzione  piuttosto pesante  consente pero  di  intraprendere azioni differenziate a seconda delle vocali incontrate   i blocchi ELSE sono tutti necessari  diversamente inserendo quella vocale  non verrebbe stampato nulla  Prova a togliere l ultimo blocco ed inserisci    la A_        writeln        QUINTA SOLUZIONE     writeln  QUINTA SOLUZIONE          la piu  efficiente  sfruttando una delle funzioni disponibili  per le stringhe  la funzione pos restituisce la prima posizione di una  stringa all interno di un altra  se non la trova restituisce zero   ad esempio pos  po   topolino   restituisce 3 perche  la stringa  po   e  stata trovata a partire dalla posizione 3 nella stringa  topolino        if pos c  aAeEiloOuU    lt  gt  0 then    c trovata da qualche parte     writeln  e  una vocale      else  writeln  e  una consonante       writeln  Programma terminato  Premere INVIO per continuare        readin     per dare il tempo di leggere il messaggio       end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  38    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SELA  difficolt    b
43.   maggiorenne                 NO      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  74    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    SEL2 bis  Con l algoritmo precedente  quando l   utente sbaglia ad inserire un valore per l   et   non si sa se per un  valore negativo o maggiore di 120  si sa solo che ha commesso un errore ma non quale  Il seguente flow chart  rappresenta un algoritmo che tiene conto anche di questo particolare  differenziando i controlli sui possibili errori     eta lt 0    Struttura a    cascata             eta gt 120       S  et   negativa           S  non puoi avere pi       di 120 anni             S  minorenne  S  maggiorenne           __   _                           SEL3bis  Inserito un numero  dire se e  pari o dispari    NOTA  si sta immaginando che in ogni linguaggio di  programmazione esista un operatore per il calcolo del  modulo  MOD     E    comunque accettabile  mi sto rivolgendo ai miei  alunni  usare gli operatori del Pascal     S  dispari              Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  75    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    SELA  Inserito un carattere  dire se e  una vocale od una consonante     Soluzione 1  non si fa distinzione tra le vocali     Soluzione 2     possibile intraprendere  lun   azione diversa per ogni vocale          c  lt   maiuscolo  c               O    c  lt   maiuscolo  c          c  A  or c  E
44.   ok_data  true    end   writeln  Con il case      if ok_data then   writeln  Data corretta         else    writeln  Data errata          readIn     end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  47    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    STRUTTURE ITERATIVE    Esamineremo ora i tre tipi classici di struttura iterativa enumerativa  ciclo for    do   indefinita con controllo in  coda uscita per vero  ciclo repeat     until  e della indefinita con controllo in testa uscita per falso  ciclo while      Premessa  in realt   potremo scrivere un qualsiasi programma utilizzando solo una delle due forme di struttura  iterativa indefinita  Infatti la struttura iterativa enumerativa pu   essere    simulata    con una delle altre due  ed     sempre possibile riscrivere un segmento di codice che utilizza una delle due forme di iterazione indefinita usando  l altra  Detto in altre parole tutte le nostre esigenze potrebbero essere soddisfatte o utilizzando solo il ciclo repeat      until o usando solo il ciclo while     Come ho avuto gi   modo di sottolineare per i costrutto case l uso di forme diverse facilita la programmazione in  quei casi in cui una delle forme di iterazione esistenti    particolarmente indicata    Struttura iterativa enumerativa   Si chiama cos   perch   pu   essere usata solo se il numero di volte che l istruzione od il blocco di istruzioni deve    essere ripetuto    noto nel momento in cui il ciclo in
45.   or c     or c  O  or c  U                       S  vocale     S  consonante   F a D V  e a i    S vocale A     F V  S  vocale E     S  vocale l                 S    vocale O     S  consonante  S    vocale U                          NOTA  ogni struttura selettiva    completamente contenuta in       quella del livello superiore  c      sempre un solo punto di  ingresso  freccia F della struttura superiore  ed un solo punto  lt    di uscita  dal connettore              Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  76    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    SELS  Inseriti A  B e C dire se B e  compreso tra A e C  in pratica si controlla se B appartiene all intervallo  A C            S  intervallo    impossibioe     b gt  a and b lt  c       S    non appartiene  S  appartiene                    O    Iterazione   ripetizione  cicli     Pur avendo a disposizione sequenza e  iterazione rimangono molte le situazioni    intrattabili    con questi strumenti  Consideriamo infatti questo problema  all   apparenza molto semplice  stampare i numeri da 1 a 10000  Certamente la soluzione di usare per 10000 volte  l   istruzione di scrittura per stampare ogni numero non    molto praticabile        A parte i problemi di trovare uno spazio sufficiente per disegnare schemi cos   enormi ed il tempo  per disegnarli  saremmo costretti a modificare sostanzialmente il diagramma al variare della    richiesta  stampare solo i primi 5000 numeri
46.   via  Ecco  schematizzata la sequenza sul disegno dell   albero     I numeri indicano ovviamente la sequenza cronologica  Solo quelli vicino alle  frecce continue indicano per   l   attivazione di una nuova    incarnazione    della  procedura  Le frecce tratteggiate indicano il raggiungimento della base della  ricorsione che fa terminare  relativamente a quella parte dell   albero  la catena  delle chiamate  Ad esempio  la procedura attiva al punto 4  dopo aver  stampato la sua parte informativa fa la chiamata ricorsiva passando come  parametro NIL  infatti non ha figli   La procedura chiamata  punto 5  non fa  allora nulla e termina  Il controllo ritorna allora alla procedura del punto 4     seguite la freccia tratteggiata numerata 6  che    in attesa alla riga 2 del  codice e che pu   finalmente fare la seconda chiamata ricorsiva   corrispondente alla riga 3 del codice  passando ancora NIL  anche il figlio di  destra non esiste   La procedura invocata  numerata con 7  termina e  restituisce il controllo ancora una volta a quella numerata con 4  Quest   ultima  ha infine esaurito le sue istruzioni e termina  restituendo il controllo a quella  numerata con 3  che chiama 10  che chiama 11  con nil  e cos   via           Gestione dello stack per la ricorsione    Tutte queste    incarnazioni    della stessa procedura condividono lo stesso codice  Non si pensi cio   che se il  meccanismo ricorsivo ha bisogno di 20 chiamate  in memoria sia presente 20 volte il codice della proced
47.  A  to    Z  do Non    pi   cos   ovvio che la variabile usata per un ciclo for sia  write  i   per forza di tipo integer  vero      readin   end     Meno riutilizzabile  se spostiamo la procedura in un altro programma o la includiamo in una libreria non    detto che  in quel programma o in quella libreria sia presente  come nelle programma originale  una variabile di tipo integer  chiamata i  il ciclo for della procedura non potrebbe quindi funzionare  E per quanto vi possa sembrare strano questo     il caso pi   fortunato tra quelli che possono capitare  infatti il compilatore ci avverte dell assenza della variabile ed il  programmatore pu   intervenire e soprattutto si accorge che c    un problema     Meno sicura  provate a pensare se nel programma in cui viene copiata la procedura esiste gi   una variabile con lo  stesso nome e dello stesso tipo  il compilatore non farebbe una grinza perch   la procedura pretende una certa  variabile nel programma principale e questa viene trovata  Il problema    che se in questo nuovo programma quella  stessa variabile serve per altri scopi  non appena si invoca la procedura quest ultima modifica in modo inaspettato il  suo valore interferendo con il resto del programma     Ne discende un altra regola  tutte le variabili di lavoro di un sottoprogramma dovrebbero essere definite all interno di  quest ultimo  Eventuali valori variabili esterne verranno comunicati tramite un parametro     Autore  Fabrizio Camuso  email  camuso camuso it sit
48.  ESTRAZIONE DI UN ELEMENTO    Estrai si differenzia dalla elimina perch      sgancia    il nodo che contiene l informazione cercata ma non lo distrugge     restituisce il puntatore al nodo ed    poi responsabilit   del chiamante liberare la memoria     function estrai var p  puntatore  valore  integer   puntatore   var corrente  precedente  puntatore   begin  cerca_non_ordinata p valore  corrente  precedente    if corrente lt  gt nil then  begin  if precedente lt  gt nil then    eliminazione in mezzo o in coda     precedente     pun  corrente  pun  else    eliminazione in testa     p   corrente   pun  end   estrai  corrente     eventualmente  nil    end     Ora che padroneggiate   J   i meccanismi di gestione delle liste siete in grado di capire gli svantaggi della gestione    dinamica della RAM  dei vantaggi abbiamo gi   discusso         e Gli algoritmi sono pi   difficili ed    pi   facile commettere errori       Non    possibile un accesso casuale agli elementi  per usare quello in posizione    N       necessario scorrere gli       N 1    che precedono con un ciclo  Confrontate questa tecnica con l immediatezza degli array  vett N     e A parit   di tipo e di numero di elementi usa pi   memoria  quella usata per memorizzare i puntatori    ma in  alcune situazioni globalmente abbiamo comunque un grosso risparmio  ricordate l esercizio sullo SMAU e le    20 000 stringhe       Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Pag  8    
49.  Num    T       Num  lt   Num  1                F          vV             num  lt   10000          num  lt   num  1                      Autore  Fabrizio Camuso  email  camuso car                   La variabile Num    usata per controllare l   uscita dal ciclo  Essa viene  impostata al valore 1 prima di iniziare il ciclo     Il ciclo inizia stampando sul video il valore della variabile Num  la prima    La variabile Num viene incrementata di 1     Se la variabile Num ha raggiunto il valore 10001  quindi ha gi   stampato il  10000  si esce  altrimenti si ritorna all   inizio  verr   stampato sul video un  nuovo numero  si incrementa ancora il valore di Num e cos   via          Ed ecco un esempio di flow chart per  l   altro tipo fondamentale di ciclo   quello detto con controllo in testa   all   inizio  ed uscita per falso o   ancora  di ripetizione per vero     Infatti fintanto che la condizione  rimane vera il ciclo viene ripetuto   Non appena la condizione diviene  falsa il ciclo termina     Il ciclo potrebbe anche non  cominciare neppure  se la condizione  fosse da subito falsa  Il ciclo visto in  precedenza  invece  controllando la  condizione alla fine  almeno una volta  comunque esegue le istruzioni  e  questo potrebbe essere indesiderabile  quando si vogliono eseguire le  istruzioni del ciclo solo se    vera fin  da subito una certa condizione        78    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          Esercizi risolti sulla struttura iterativa    
50.  Ogni frase ha poi il suo    significato     l   effetto che produce     Un primo miglioramento  oltre alla diffusione di dispositivi come le tastiere ed i dischi     stato introdotto con l   uso di  codici mnemonici al posto delle sequenze di 1 e di 0  Il concetto    assai intuitivo     molto pi   semplice ricordare    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  15    qualche cosa del tipo    SUM 15    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    21    che non    100100101011     per indicare che vanno sommati 15 e 21  Il    programmatore pu   ora scrivere il programma usando un linguaggio un po    pi   lontano da quello macchina ma pi    vicino al suo modo di esprimersi  Questo linguaggio    chiamato assembly  Naturalmente  prima di sottoporre il  programma al computer    necessario un processo di traduzione  i codici mnemonici ed i valori espressi in decimale  non sono comprensibile dalla CPU   Un programma apposito chiamato lassemblatore  assembler    scritto  ovviamente in linguaggio macchina  traduce ogni codice mnemonico e valore decimale nella corrispondente sequenza  di 1 e di 0    linguaggi assembly devono essere considerati  come linguaggio macchina  di basso livello                    Qui a lato  un esempio di programma    BEGIN   Inizio programm nd   scritto in un linguaggio assembly   START  IN 1    lettura dato da unit   1 Esso calcola la somma di una   5   x sequenza di numeri letti  istruzione  JPZ FINE  c
51.  Pagina 7 di 177    Ricorsione     versione 2 02   Febbraio 2005    ESEMPIO COMPLETO 2       In questo secondo esempio gestiamo una semplice scheda di dati anagrafici  per sfruttare al meglio l istruzione seek  immaginiamo che ogni scheda sia individuata da un codice numerico che facciamo corrispondere alla sua posizione  come record  Quindi se si cerca la scheda con codice 7 si utilizza seek file  6  e cos   via  Il codice viene mantenuto  strettamente progressivo ed    assegnato in automatico dal programma    Questo esempio fa uso di procedure e funzioni con parametri  In alcuni casi fa anche il controllo degli errori con i file     Il programma tiene sempre sotto controllo il numero dei record presenti nell archivio  per poter generare in  automatico il codice da assegnare alle schede   In partenza  infatti  se il file    vuoto mette la variabile inseriti a zero  altrimenti gli assegna il numero di record presenti nel file  Il programma tiene poi aggiornato questo contatore ad  ogni inserimento o cancellazione  La cancellazione non avviene in modo fisico ma mettendo a FALSE un boolean del  record  campo attivo      Le scelte di chi usa il programma sono gestite da una funzione menu che riceve l elenco delle voci da presentare  un  vettore di stringhe  e restituisce il valore della scelta fatta     program ProvaFileTipizzati        e  necessario disabilitare l intercettazione degli errori di 1 0 da  parte del Turbo Pascal al fine di gestirli in modo personalizzato         1
52.  Per ROSSI la R corrisponde al 2  la O al 3  la prima S al 5  la seconda S al 7 e la   all   11  Poi  eleviamo ogni numero primo alla potenza corrispondente al codice ASCII delle lettere corrispondenti  Cos    eleveremo il 2 alla 82  codice ASCII della R   il 5 alla 83  codice ASCII della S   il 7 ancora alla 83 e cos   via  Poi  moltiplichiamo tra loro i numeri ottenuti  il risultato    l indirizzo richiesto  La matematica ci assicura  teorema  dell   unicit   della scomposizione in potenze di numeri primi di un numero  che due cognomi diversi genereranno  due indirizzi diversi  Parrebbe di aver risolto il problema dei conflitti con un solo calcolo per qualsiasi campo da  indicizzare di natura alfanumerica  Immaginate per   di dover inserire il prodotto    ZUCCA CON ZENZERO E  ZAFFERANO     il valore generato dall algoritmo    MOLTO grande  MOLTO pi   grande del corrispondente decimale  con tutti 9      II numero eccede anche le capacit   di memorizzazione del pi   grande hd esistente  anche  immaginando di associare un singolo byte su di esso ad un indirizzo diverso      Potremmo scoprire  quindi  che  per memorizzare anche solo il primo record dovremmo farlo ad un indirizzo impossibile da far corrispondere  nella pratica  un miliardo di miliardi  Dovremmo creare tutti i record vuoti corrispondenti alle posizioni  precedenti esaurendo  tempo permettendo  anche la batteria di hard disk pi   capiente dell universo           Morale  la tecnica hash    utile solo in casi partic
53.  Tradizionali   versione 3 1 Settembre 2004    La struttura di destra    si legge    cos    nel caso il valore di mese sia  case mese of      2 fai il controllo per il bisestile   nel caso invece il valore sia uno tra 1 3 5 7 8 10 12 i giorni sono 31  altrimenti sono 30  In pratica si elencano uno  dopo l altro i casi possibili  i valori assunti dalla variabile che si sta controllando  e per ciascun caso si indicano le  istruzioni da eseguire  La struttura che ne risulta    certamente pi   lineare e leggibile di quella ottenibile con una  serie di if     then     else     annidati e o in cascata  e pi   sono i casi da considerare e pi   conviene usare questa  nuova struttura  Ma vediamone in dettaglio la sintassi     Case eta of  Case mese of 1  11  writeln     sei un poppante        2  If anno mod 4   0 then 12  15   Giorni  29    bisestile    begin  Else writeln    OK  dimmi come ti chiami       Giorni  28  readln  nome     1 3 5 7 8 10 12  Giorni  31  end   lt a i  dee else Non    un errore   Giorni  30  begin  end  writeln    Matusa non ammessi          writeln    Premi invio per continuare       readin  end  end     Dopo la parola riservata case deve essere specificata la variabile da controllare  possiamo usare solo variabili di tipo  integer e char  in realt   tutte le variabili di tipo ordinale         Per ogni caso che si presenta possiamo elencare   e un singolo valore  come il numero 2 che rappresenta febbraio nell esempio   e pi   valori separati da virgola con l 
54.  ad  esempio     trascurare    alcuni messaggi ovvi  che nel programma in Pascal saranno  invece indicati     il caso del messaggio     Inserire l et      che dovrebbe precedere   la sua lettura            eta gt  18          S  minorenne  S  maggiorenne                          e    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  73    SEL2  Inserita un et     dire se siamo in  presenza di un maggiorenne o di un  minorenne  controllare anche eventuali  errori di inserimento da parte dell utente          Prima soluzione  ipotizzando un et    massima di 120 anni  controlliamo che  l   et   inserita non sia al di fuori  dell   intervallo 0  neonato      120     NOTA  siate coerenti con l   utilizzo delle  etichette    V    e    F     io ho scelto di  proseguire per vero  V  sempre a destra e  per falso  F  sempre a sinistra     NOTA     importante differenziare con un  pallino connettore separato le uscite dalle  due strutture selettive  Il seguente flow  chart    quindi sbagliato  Non riusciremmo  infatti a tradurlo nel corrispondente  programma Pascal  si accavallerebbero gli     end    dei blocchi   parti    then    ed    S  minorenne        Gestione Archivi Tradizionali   versione 3 1 Settembre 2004         eta lt 0 or eta gt 120        eta gt  18  S  errore     Y    S  minorenne  S  maggiorenne                          o       begin     end    delle    C     else    dei due    if                eta lt 0 or eta gt 120    S  errore           S
55.  camuso camuso it sito web  www camuso it   Pag  53    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       SECONDA SOLUZIONE     writeln  SECONDA SOLUZIONE          se inizio e fine sono invertiti  li scambio     if inizio gt fine then  begin  temp  inizio   inizio  fine   fine  temp  end        ora inizio e fine sono senza dubbio nell ordine giusto           for i    inizio to fine do  writeln  i       writeln  Programma terminato  Premere INVIO per continuare          readin     per dare il tempo di leggere il messaggio       end              ITES  difficolt    bassa  generazione di numeri casuali          random pas  Con questo esercizio imparerete       l utilizzo della funzione random per generare numeri in modo casuale   utile per simulazioni  giochi ecc       l utilizzo della funzione randomize per avere sequenze di numeri casuali  sempre diverse          program prova_random   uses newdelay crt     var x i num  integer     non hanno un significato particolare      begin  clrscr       ESPERIENZA 1         random N  restituisce un numero casuale compreso tra 0 e N 1     x  random 5      x diventa un numero compreso tra 0 e 4     writeln  Esperienza 1     x        possiamo usare random direttamente  senza memorizzare il risultato in x       writeln  Esperienza 1    random 9       readIn     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  54    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       ESPERIENZA 2     
56.  codice numerico dell istruzione letta nella RAM  che deve essere  eseguita  infatti ogni possibile istruzione    rappresentata da un codice numerico      ALU     l Unit   Aritmetico Logica  Essa svolge le operazioni aritmetiche  matematiche   elementari ed i confronti logici tra due dati  sa dire se sono uguali  se uno    pi   grande o  pi   piccolo dell altro ecc          Control Unit     l unit   di controllo  E    lei che invia a tutti gli altri dispositivi segnali elettrici con  cui comanda tutte le micro operazioni che possono essere svolte  Ad esempio pu   comandare  l invio del contenuto di un registro in un altro registro  oppure la lettura di un byte della RAM ed  il trasferimento del suo contenuto in un registro  o il contrario   il trasferimento alla ALU di due  dati da sommare o da sottrarre  ed il comando che fa eseguire la somma e la sottrazione   Pu    inviare segnali di comando anche a dispositivi esterni alla CPU  ad esempio pu   comandare allo  scanner di inviare il prossimo blocco di dati del documento che sta leggendo  Insomma    il vero regista che regola il  funzionamento di tutti gli altri dispositivi interni od esterni        Bus  si    parlato di invio di comandi dalla control unit  di trasportare byte dalla RAM ai registri e  viceversa  di comunicare indirizzi per usare la RAM  Come viaggiano tutte queste informazioni    Semplice  usano il bus   Battute a parte  il termine indica i canali fisici lungo i quali si spostano i segnali  elettrici che rap
57.  con un sottoprogramma  Poich   non intendiamo avvantaggiarci di un valore  restituito da una funzione  useremo una procedura     Essa ricever   il vettore da caricare per indirizzo  diversamente non potremmo modificare in modo permanente i  valori degli elementi del vettore passato alla procedura  Il secondo parametro corrisponde al numero di elementi da  caricare  chi usa la procedura deve assicurarsi di non passare come numero di elementi un valore superiore alla  capacit   massima del vettore      procedure carica_vettore VAR vet  vettore_interi  N  integer    var i  integer   begin  for i  1 to N do  begin  writeln     Inserire elemento n   lt  i   readIn  vet i     end   end     NOTA   Qualcuno potrebbe obiettare che la procedura risulta costituita da un numero di righe di codice superiore rispetto  alla soluzione che non usa i sottoprogrammi  Ricordiamoci per   che la procedura potr   essere chiamata tutte le volte  che si vuole per caricare vettori dello stesso tipo  ANCHE in programmi diversi  basta copiarla incollarla od  includerla in una libreria   Qualche volta si tratter   di voti  altre volte di temperature  pesi od altezze ecc  La  procedura non conosce il significato degli interi che sta caricando  svolge in modo anonimo il suo compito  riempire  di interi un vettore che riceve come parametro  punto     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  119       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Sugger
58.  dalle tecniche    tradizionali        Y certe elaborazioni sono molto difficili da realizzare con i linguaggi specifici per i data base  questi linguaggi     pagano    la loro indubbia semplicit   che li rende alla portata anche del non programmatore con una minore     potenza     il problema    cos   sentito che in molti linguaggi per data base sono stati reintrodotti costrutti di  programmazione tipici dei linguaggi tradizionali    Y per certe operazioni la velocit   delle tecniche tradizionali    impareggiabile  nessun DBMS supera in velocit    linguaggi come il Pascal o il C per scrivere e leggere file di testo   e non dimenticate che le pagine WEB in HTML    sono file di testo         Y conoscere le tecniche passate aiuta a capire  apprezzare e sfruttare molto meglio ci   che le nuove mettono a  disposizione     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  133    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    TI PI DI FILE    1     File di testo  text file   sono sequenze di bytes con valori numerici nell intervallo valido per la codifica dei  caratteri per un certo sistema operativo  Nel caso di MS DOS   Windows  codifica ASCII  questi file sono  terminati dal carattere con codice 26  CTRL Z   La fine di un file viene indicata con la sigla EOF  End Of File   fine del file   L inizio con BOF  Begin Of File  inizio del file       file di testo sono suddivisi in righe  Ogni riga    terminata dai byte CR  Carriage Return  
59.  della stampante   O quando il disco che tentate di scrivere    protetto   O quando non c    pi    spazio sul disco   L ho indicato nel disegno con le tre linee continue che puntano verso il basso  La control Unit pu    attivare o disattivare anche i componenti interni grazie a delle linee di selezione  le ho indicate con delle linee  continue senza frecce  quando la Control Unit vuole attivare un dispositivo  invia lungo una linea di selezione un  segnale apposito     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  11       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Ora che sono stati descritti tutti i componenti  vediamoli all opera  Immaginiamo che le istruzioni da eseguire siano  contenute nei byte in grigio     Il registro program counter  abbiamo detto  contiene l indirizzo dell istruzione da eseguire  in questo caso l indirizzo  del primo byte in grigio   Per poterla leggere dalla RAM    necessario che tale indirizzo sia contenuto nel registro  indirizzi  L unit   di controllo comanda allora la copia del contenuto del program counter in questo registro     L unit   di controllo comanda quindi al dispositivo di lettura scrittura della RAM  non evidenziato nel disegno per  semplicit    di leggere il byte all indirizzo contenuto ora nel registro indirizzi  il suo valore  il codice dell istruzione   viene trasferito lungo il bus dati esterno e da l   sul bus dati interno  fino a depositarlo nel registro istruzioni     L u
60.  i dati nel vettore di record     for cont  1 to numero_libri do  with biblioteca cont  do  begin  write  I nserire il titolo del libro n    cont          readin titolo    write  I nserire l autore del libro   titolo           readin autore    write    nserire l  editore del libro   titolo           readIn editore    write  l nserire il codice del libro   titolo           readin codice    end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  130    repeat  clrscr     writeln  RICERCA CODICI LIBRI PER               writeln  1   Ricerca per autore     writeln  2   Ricerca per titolo     writeln  3   Ricerca per editore     writeln  4   Fine operazioni     writeln     repeat  write  Scegli un opzione       readin scelta      if  scelta lt 1  or  scelta gt 4  then  writeln  Scelta non corretta       until  scelta gt 0  and  scelta lt 5      if scelta lt  gt 4 then   begin  case scelta of  1  write  Inserire l autore interessato       2  write  Inserire il titolo interessato       3  write  Inserire l editore interessato       end     readin da_cercare      for cont  1 to numero_libri do  with biblioteca cont  do  begin  case scelta of  1  if da_cercare autore then writeln codice    2  if da_cercare titolo then writeln codice    3  if da_cercare  editore then writeln codice    end     writeln  Premere INVIO per continuare         readin  end  until scelta 4  end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Gest
61.  i dispositivi automatici non hanno parti meccaniche movimento ma sono costituiti da circuiti elettrici  si parla di elaborazione elettronica  il microprocessore che somma due numeri               Programmabile  Con le macchinette calcolatrici non potrete fare altro che i calcoli previsti dal costruttore  Non  c    modo infatti di istruire quel piccolo congegno a svolgere calcoli diversi  Allo stesso modo in cui non potete  ottenere altro da una lavatrice che le sequenze  programmi  di lavaggio previste dal costruttore  E cos   come  con una lavatrice potrete lavare solo panni  allo stesso modo con una calcolatrice potrete usare solo numeri        Un computer  invece     dotato di una memoria di lavoro elettronica  RAM  Random Access Memory  Memoria  ad accesso casuale  in cui possono essere rappresentati numeri  lettere  immagini e suoni     Non solo  la memoria contiene anche la sequenza delle istruzioni che il microprocessore deve eseguire per  svolgere un certo compito  il programma      sufficiente caricare  dall nard disk  dal CD  dal DVD ecc   una  diversa sequenza di istruzioni per avere una macchina elettronica in grado di svolgere un compito anche  completamente diverso dal precedente     Tutto sommato  il ciclo di funzionamento di un sistema di elaborazione elettronico programmabile  ehm   computer d ora in avanti e solo per comodit       assai semplice  prelievo dalla RAM dalla prossima istruzione da  eseguire  interpretazione dell istruzione  cosa deve essere fat
62.  il risultato dell esecuzione di quell istruzione ma non viene prodotto in modo permanente  nessun codice binario  se questa istruzione deve essere eseguita di nuovo  anche per 1000 volte  deve essere       reinterpretata                             2  Compilatori  questi sono dei veri traduttori  Come prima  il programmatore scrive le istruzioni usando un    programma di video scrittura leditor   Ma  ogni volta che modifica anche un solo carattere del testo del programma  e ne richiede l esecuzione  il programmatore deve comandare ad uno specifico programma   compilatore  la  traduzione in linguaggio macchina di tutte le istruzioni che compongono il programma  Come approfondiremo meglio  in seguito  il risultato della compilazione prima di poter essere mandato in esecuzione deve essere elaborato anche  da un altro programma  flinken  che  per cos   dire  completa l opera di traduzione iniziata dal compilatore                       Interpreti e compilatori a confronto       I nterpreti    Compilatori       Minori tempi di attesa durante lo sviluppo  per vedere il  risultato in esecuzione di una modifica ad un istruzione o  della giunta di una nuova istruzione  si deve attendere  solo l interpretazione delle istruzioni che portano a quella  che interessa  tutto il resto del programma    come se  venisse ignorato        Maggiori tempi totali nel fornire il risultato  l esecuzione     rallentata dal continuo bisogno di interpretare le righe  del programma  anche se sono gi   sta
63.  il termine    try     tenta  si mettono le istruzioni che potenzialmente potrebbero causare  errori  nella sezione    except     quasi come in un    case    si elencano  usando dei nomi significativi  gli errori che si  intendono    intercettare    ed i relativi sottoprogrammi scritti dal programmatore per gestirli  molti dialetti del Basic   tra cui Visual Basic e Visual Basic for Application  VBA  il linguaggio degli applicativi Office  offrono un costrutto  analogo     on error               Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 6 di 177       Ricorsione     versione 2 02   Febbraio 2005    ESEMPIO COMPLETO 1       L   esempio seguente mostra come procedere alla creazione di un file controllando prima se ne esiste gi   uno    vecchio     Se esiste l    operazione di reset va a buon fine e possiamo accorgercene dal valore 0 restituito dalla funzione  IOResult  in questo caso si chiede conferma a chi sta usando il programma prima di procedere con una rewrite    distruttiva     Se non esiste l    operazione di reset fallisce e possiamo accorgercene dal valore diverso da 0 restituito dalla funzione  IOResult  in questo caso si pu   procedere con una rewrite distruttiva senza chiedere conferma     type  TPersona record    cognome  string 30      e  obbligatorio definire il numero dei caratteri della stringa        codice  integer   end     fpersona file of TPersona     senza il tipo non potremmo passare un file come parametro           Var  elenco  fPersona     
64.  interi  integer    read dato   APERI TE CORTI  totale    totale   dato Il    begin    indica appunto l inizio del programma  Come prima istruzione si  until dato 0  azzera il totale e poi si ripetono  repeat  due istruzioni fino a che  until   non viene introdotto come dato il valore zero  la lettura  read  del dato e la  write totale   sua aggiunta al totale  Terminato il ciclo si provvede alla scrittura del totale  calcolato   end     Siamo chiaramente ad un livello pi   astratto  il programmatore non deve conoscere i meccanismi hardware della  stampante o della CPU  ad esempio  deve solo ricordare che il comando di stampa       write    e che deve specificare tra  parentesi ci   che vuole sia stampato  Cambia la stampante   Il comando rimane sempre questo   Cambia la CPU   Il  comando rimane sempre questo     Cambia addirittura il tipo di computer  Non devo modificare o riscrivere tutti i  programmi  il Pascal rimane Pascal       Ricordiamo qualche nome di linguaggio ad alto livello tra i pi   famosi  Fortran  diffusissimo in ambito scientifico e  storicamente il primo linguaggio ad alto livello   il    C     diffusissimo in molti ambiti  la sua capacit   di interagire ancora  facilmente con l hardware della macchina gli vale la definizione in effetti di linguaggio di medio livello  molti sistemi  operativi  anche per l efficienza dei programmi che i compilatori    C    sono in grado di produrre  sono per questo motivo  in gran parte sviluppati con questo linguaggio   Cob
65.  non  end viene trovato sia corrente che precedente sono messi a nil    end  end     RICERCA IN UNA LISTA ORDINATA    Questa versione della ricerca lavora su una lista ordinata  diciamo in modo crescente   Trovato un elemento il cui  valore supera quello che si sta cercando non ha pi   senso continuare la ricerca     quelli seguenti saranno per forza  tutti maggiori     procedure cerca_ordinata p  puntatore  valore  integer  var corrente  precedente  puntatore    begin precedente  nil  corrente   nil   if p lt  gt nil then  begin  corrente  p   while  corrente    inf lt valore  and  corrente  pun lt  gt nil  do  begin  precedente  corrente   corrente   corrente  pun end   if corrente     inf lt  gt valore then  begin precedente  nil  corrente  nil end end end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  6    I record con il Turbo Pascal versione 1 3 Luglio 2003    ELIMINAZIONE DI UN ELEMENTO    Questa procedura invoca quella di ricerca per ottenere il puntatore al nodo da cancellare ed a quello che lo precede   se esiste   Sono infatti queste le informazioni necessarie per una corretta eliminazione     procedure elimina var p  puntatore  valore  integer    var corrente precedente  puntatore   begin   cerca_non_ordinata p valore corrente  precedente   precedente corrente    if corrente lt  gt nil then ZTN ZT N  da e  L IPL_D    if precedente lt  gt nil then     eliminazione in mezzo o in coda     precedente     pun  corrente  pun   else  
66.  num_alu      Il bello arriva adesso  Poich   non si sta usando una sola variabile  voto  per leggere i voti  non    possibile usare un  ciclo per leggere i voti  E    necessario leggere il primo  Poi se il numero di alunni    maggiore di 1  significa che devo  sicuramente leggerne anche un secondo  poi se il numero di alunni    anche maggiore di due significa che devo  leggerne almeno anche un terzo e cos   via        writeln     Inserisci voto primo alunno           readin votol    somma_voti   somma_voti   votol    if num_alu gt 1 then  begin  writeln     Inserisci voto secondo alunno          readin voto2    somma_voti   somma_voti   voto2  end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  112       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    if num_alu gt 2 then  begin  writeln     Inserisci voto prossimo alunno           readin voto3    somma_voti   somma_voti   voto3  end     e cos   via fino a        if num_alu gt 31 then  begin  writeln     Inserisci voto 32 mo alunno            readin voto32    somma_voti   somma_voti   voto  end     media  somma_voti   num_alu     alleluia         e ora     ripetiamo tutto per contare quelli sopra la media    if voto1 gt media then  quanti_sopra_media   quanti_sopra_media   1     if num_alu gt 1 then  if voto2 gt media then    quanti_sopra_media   quanti_sopra_media   1     ecc  ecc   abbiate piet         Non so voi  ma io ho gi   perso di vista l   obiettivo che ci eravamo p
67.  o fino al 15000      S2    Partendo invece dalla considerazione che si stanno ripetendo istruzioni molto simili  cambia solo                sus in valore da scrivere sul video  si perviene ad una  struttura ciclica che fa ripetere una od un gruppo di      istruzioni fino al raggiungimento di una condizione  in  uesto caso il raggiungimento del 1    n   Ecco lo schema generico  cio   non applicato alla  soluzione di alcun problema particolare  di un flow    chart per la struttura iterativa                 Le istruzioni  questa    vera  si ritorna    sono ripetute una prima volta  Giunti alla condizione  se  allora si esce ed il ciclo termina  Se la condizione    falsa  all   inizio  connettore di ingresso             Se all   interno condizione    condizione    del ciclo  prima o poi  una delle istruzioni far   s   che la  diventer   vera  il ciclo terminer   veramente     Autore  Fabrizio Ca vw camuso it   Pag  77    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Diversamente proceder   all   infinito  come potrebbe servire per il controllo di un processo industriale      Questo tipo di ciclo    detto    con ripetizione per falso     o a    uscita per vero    ed ancora    con controllo in coda     cio      alla fine del ciclo      Notiamo ancora  con questo tipo di ciclo le istruzioni vengono eseguite almeno una volta     Vediamo il flow chart completo per la stampa dei numeri da 1 a 10000    Ma       Num  lt   1             volta stamper   quindi 1         S
68.  pi   volte ribadito che un sottoprogramma non dovrebbe mai tentare di  utilizzare direttamente una variabile esterna  sempre e solo attraverso un parametro      e Le entit   dichiarate nella sezione var del programma principale esistono dal momento in cui inizia il  programma fino al momento in cui termina     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  109    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Le entit   dichiarate a livello di sottoprogramma  parametri e variabili locali  sono visibili     o trail begin e l end di quel sottoprogramma  parametri e variabili locali non possono quindi nessun  modo essere utilizzati all esterno del sottoprogramma in cui sono dichiarati     o inaltri sottoprogrammi ma solo se dichiarati all interno del primo  e a patto che questi ultimi a  loro volta non utilizzino parametri o loro variabili locali con lo stesso nome         e Le entit   dichiarate a livello di sottoprogramma  parametri e variabili locali  vengono create nel momenti in  cui inizia l esecuzione del sottoprogramma e vengono distrutte nel momenti in cui l esecuzione del  sottoprogramma termina  ne deriva che quando un sottoprogramma viene chiamato pi   volte i valori assunti in  precedenza dalle variabili locali non sono pi   disponibili     Applicando queste regole all esempio precedente  la variabile A del programma pu   essere usata nel corpo  principale ma non nella procedura  il parametro A la oscura   stessa sit
69.  procedura append nome file_logico    Quest ultima deve essere usata quando si vogliono fare aggiunte ad un file di testo che contiene gi   alcune righe        Senza l append dovremmo sempre creare da capo i file di testo riscrivendo anche le vecchie righe  vi ricordo che  rewrite    distruttiva       L istruzione che aggiunge le righe al file    una variante dell arcinota writeln  Semplicemente dovremo indicare il nome  del file logico su cui scrivere e la stringa che rappresenta la riga da aggiungere  writeln nome_ file_logico  stringa      Dopo ogni writeln sul file  il punto di inserimento    automaticamente fatto avanzare        Come al solito  gli esempi che seguono fanno riferimento alle dichiarazioni dei paragrafi precedenti     File creato e scritto immediatamente append lettera      VECCHI E RI GHE CONSERVATE      Var riga  string        repeat  begin writeln    lnserire la riga da scrivere sul file       Assign lettera  c          readIn riga    rewrite lettera      FILE AZZERATO      if riga lt  gt  FINE  then  repeat writeln lettera  riga    writeln    lnserire la riga da scrivere sul file       readiIn riga   until riga  FI NE      close lettera    if riga lt  gt  FINE  then end  writeln lettera  riga      until riga  FI NE      close lettera    end     Aggiunga di righe ad un file esistente  Var riga  string  begin       begin  Assign lettera  c               Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  141    Ricorsione     v
70.  program messaggi   uses   newdelay  crt   const    Var  i  integer     contatore ciclo       begin  clrscr     cancello lo schermo          PRIMA SOLUZIONE     writeln  PRIMA SOLUZIONE         for i    1 to QUANTE_VOLTE do  writeln  N  riga     i    come programma mi sento un po  stupido              spesso nelle istruzioni di un ciclo for e  utile usare la variabile di controllo del ciclo stesso  in questo esempio  al   momento di scrivere ogni riga la variabile di controllo i ha proprio il valore che serve stampare come numero   progressivo di riga  infatti quando si stampa per la prima volta il messaggio il suo valore e  uno  quando si stampa  il messaggio per la seconda volta il suo valore e  due ecc           SECONDA SOLUZIONE     writeln  SECONDA SOLUZIONE       for i    1 to QUANTE_ VOLTE do    begin  write  N  riga        non va a capo         write 1      non va a capo         writeln   come programma mi sento un po  stupido         end   writeln                              Di  writeln        commenti  la seconda soluzione e  equivalente alla prima  notate come sia INDISPENSABILE aggiungere un  begin ed un end per racchiudere ed indicare in modo preciso l inizio e la fine del blocco di istruzioni che deve  essere ripetuto  se infatti avessimo scritto     for i    1 to QUANTE_VOLTE do  write  N  riga         write i    writeln   come programma mi sento un po  stupido         writeln                                    il compilatore non potrebbe in alcun modo capire 
71.  proposito di medie        Avete fatto carriera e vi ritrovate prof  Informatica  Avete anche appena terminato di correggere il primo pacco di  compiti  sigh  e vorreste contare quanti alunni hanno preso un voto superiore alla media della classe  che  informatici sareste se non pensaste di utilizzare un programmino per calcolare una volta per tutte questo valore                  Program medie     var  i  voto  integer        i    serve per i cicli     voto    per leggere da tastiera il voto     somma_voti  num_alunni  integer     num_alunni  numero degli alunni     quanti_sopra_media  integer   media  real     begin  somma_voti  0  media  0  quanti_sopra_media  0     writeln    Quanti alunni ci sono          readIn num_alu      for i  1 to num_alu do   begin  writeln     Inserisci voto prossimo alunno         readIn voto    somma_voti  somma_voti   voto   end     media  somma_voti num_alu     Dopo aver impiegato solo pochi millesimi di secondo per scrivere questo codice  vi accorgete di     non sapere  come andare avanti  Infatti ora che avete calcolato la media dovreste contare i voti che la superano  ma non avete  pi   i voti a disposizione per confrontarli   Infatti la variabile voto conterr   solo l   ultimo voto letto  I precedenti sono  stati sommati nella variabile somma_voti e poi soprascritti ciascuno dal successivo  questo ovviamente perch   la  readin utilizza nel ciclo sempre la stessa variabile per leggere i voti         Autore  Fabrizio Camuso  email  camuso cam
72.  pur avendo stabilito l interfaccia di ogni  begin sottoprogramma  il nome ed i parametri che ricever    il codice  isUpCase    true  di ciascuno di essi    ridotto all osso  il minimo indispensabile  end  per poterli richiamare i poter provare il programma principale   function lowCase c  char    char  Ogni funzione non calcola veramente il suo risultato ma  begin restituisce un valore fasullo  per   del tipo giusto   ad esempio  lowCase      a     la funzione maiuscolo restituisce come risultato la stringa fissa  end      STRINGA DI PROVA      function minuscolo s  string   string  Questo permette comunque a programmatore di scrivere nei  begin o x   za Tue i  j NET     minimi dettagli la funzione MiniMaiu che  per cos   dire  non si  minuscolo   stringa di prova     SELE   Si  end accorge di richiamare delle funzioni incomplete  anche se   i naturalmente  i valori che si vede restituire sono sempre quelli e  function maiuscolo s  string   string  fasulli   maiuscolo   STRINGA DI PROVA       7 n   end  Il programmatore pu   anche organizzare il corpo principale del  programma verificando che tutti i sottoprogrammi si richiamino  function MiniMaiu s  string  come  char    correttamente tra loro  Fatto questo pu   procedere a completare  string  veramente ciascun sottoprogramma oppure  e questo    un altro  begin vantaggio dell aver costruito rapidamente lo    scheletro    del  case come of programma  pu   fidare il completamento a pi   programmatori   m   MiniMaiu    minusco
73.  record  Per    grazie alla possibilit   di riscrittura si  pu     contrassegnare    una scheda in qualche modo convenzionale scelto dal programmatore  Ad esempio potrebbe  esserci un campo    codice    e decidere che se contiene zero la scheda    da considerarsi eliminata  Di tanto in tanto  potremmo comandare in momenti di basso utilizzo dell archivio  di notte  ad esempio  una riorganizzazione  ricopiando in un nuovo file le schede non    eliminate        Come controllare gli esiti delle operazioni richieste  GESTIONE DEGLI ERRORI         Il sistema operativo  sollecitato da comandi visti  pu   dare conferma in merito al loro soddisfacimento oppure  segnalare un errore    casi che portano al fallimento possono essere vari  spazio sul supporto esaurito  il supporto  indicato non    scrivibile  CD ROM   il supporto o un altro dispositivo necessario per il suo uso  ad es  il controller  dell hd     in avaria  le risorse di sistema non consentono al momento l operazione  troppi programmi in uso  troppi  utenti collegati  troppi file in uso  collegamento ad Internet al momento interrotto ecc    il programma  e di  conseguenza l utente che lo ha eseguito  non ha l autorizzazione necessaria  il percorso indicato nel nome del file  non esiste o non    corretto  il nome del file indicato non    corretto ecc     La gestione di queste situazioni pu   avvenire fondamentalmente in due modi     y Il sistema operativo rileva le anomalie ed agisce automaticamente  spesso questo significa 
74.  rispetto agli interpreti                 Volendo sintetizzare vantaggi e svantaggi  diciamo che con un interprete risulta velocizzata la fase di sviluppo  non ci  sono i tempi di compilazione e di link che costringono a ritradurre l   intero programma anche se si sbaglia   letteralmente  una virgola  Un compilatore produce un programma autonomo che garantisce il massimo della velocit    in esecuzione  anche decine di volte pi   veloce   mentre un interprete    perfetto per lo sviluppo del programma  il  compilatore serve a generare prodotto finale  Per la verit    queste considerazioni erano molto pi   vere qualche anno  fa  i computer erano molto pi   lenti nel far funzionare i compilatori  CPU meno potenti e dischi molto pi   lenti   era  allora molto conveniente usare un interprete nelle fasi iniziali  in cui si commettono molti errori  ed il compilatore per  i ritocchi finali  Oggi i tempi di compilazione e link sono rapidissimi e l interprete come strumento    molto meno  appetibile     Sviluppare software  oggi sempre pi   complicato     molto costoso  Essere produttivi    indispensabile per avere  successo come sviluppatori di software  Gli odierni compilatori e linker sono integrati in ambienti di sviluppo  sofisticatissimi  dove alcune parti standard di un programma sono scritte automaticamente   Ad esempio  mentre un  tempo  per gestire una finestra come quelle di Windows  era necessario scrivere decine di istruzioni  oggi il  programmatore disegna la finestra con 
75.  si limita a terminare  senza richiamare pi   s   stessa ed  interrompendo la catena delle chiamate  E    molto importante che si raggiunga una situazione di terminazione   diversamente si andrebbe avanti fino all esaurimento della memoria messa a disposizione per la ricorsione  stack   mandando in crash il processo di esecuzione e  forse  causando anche il blocco dell   elaboratore     Un algoritmo ricorsivo corretto prima o poi invece si ferma perch   raggiunge la condizione di terminazione che     chiamata la base della ricorsione  in realt   potrebbe ancora esaurire la memoria se ha bisogno di troppi passi per  essere concluso  ma concettualmente l   algoritmo    corretto   Pensate alla base della ricorsione come al caso che  termina la    catena    delle chiamate  Nel nostro esempio la base    rappresentata da nodo NIL  la condizione dell    if  non    verificata e la procedura non fa nulla  soprattutto termina e non fa altre chiamate a se stessa      E    anche importante notare che ogni chiamata ricorsiva impegna la procedura con un problema pi   semplice  dell   originale  la prima procedura attivata deve stampare l   intero albero  la seconda il sottoalbero di sinistra  la terza  il sottoalbero di sinistra ancora e cos   via fino a che  in profondit    una procedura ricever   un puntatore ad una  foglia  a questo punto avviene l   ultima chiamata alla procedura che ricever   un puntatore NIL  la procedura non fa  nulla e la    catena    si ferma     NOTA  LA PARTE CH
76.  sono      60 60 24 365 100 0     secondi         NOTA  se non moltiplicassimo per 100 0  ci avevate badato   otterremmo un messaggio di errore perch   il risultato    supererebbe il pi   grande numero intero  longint  rappresentabile con il turbo Pascal  Indicando invece un numero  reale il calcolo viene effettuato nel dominio dei numeri reali     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  29    Test maggiore o uguale di    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Il formato del risultato usa la notazione esponenziale  3 1536000000E 09  E    per   possibile indicare degli  indicatori di ampiezza  detto in altre parole possiamo scegliere quante posizioni sul video utilizzare per le cifre  prima e dopo il punto decimale     writeln 60 60 24 365 100 0 10 0    3153600000  10 0 significa 10 posizioni in tutto  di cui  0  nessuna  per le cifre dopo il punto decimale    writeln 60 60 24 365 100 0 13 2    3153600000 00  13 2 significa 13 posizioni in tutto  di cui 2 per le  cifre dopo il punto decimale  bisogna contare  anche quest ultimo     ingresso  lettura   readIn  variabile   il programma si mette in attesa di un valore che deve essere digitato usando la tastiera  il  tipo del dati inserito deve corrispondere a quello della variabile  un quadratino od un trattino lampeggiante  indicano lo stato di attesa  il dato si intende digitato completamente quando viene premuto il tasto invio  enter  sulle tastiere americane   il
77.  sottoalgoritmo   che suddivide il compito in compiti ancora pi   elementari  Facciamo un  esempio  l algoritmo  va dal salotto alla cucina  si compone in realt   delle seguenti istruzioni     eesci dal salotto   ecurva a sinistra   eprosegui per il corridoio fino all ultima porta sulla sinistra  eattraversa la porta a sinistra    Questo    certamente fin troppo esplicito per un operatore umano  al quale gi   il problema originale   va dal salotto alla cucina  sembra probabilmente abbastanza elementare da non richiedere  in  apparenza  suddivisioni   ma nel caso di un robot richiederebbe di specificare i passi con ben altra   minore  complessit       Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  5       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    L algoritmo  attraversa la porta a sinistra  si compone di     econtrolla se la porta    aperta   enel caso che la porta sia aperta salta il passo seguente  eapri la porta   eavanza di un metro    L algoritmo  apri la porta   compreso nel precedente  a sua volta si compone di     eprotendi il braccio   eafferra la maniglia   erotea la mano di 30 gradi in direzione antioraria  eapplica una pressione alla maniglia diretta di fronte a te    x    Un modo dettagliato di rappresentare l algoritmo  attraversa la porta a sinistra     allora il seguente     econtrolla se la porta    aperta   enel caso che la porta sia aperta salta il passo seguente  eapri la porta   eprotendi il braccio   e
78.  staticamente       inadeguata per rappresentare strutture non  lineari     ALLOCAZI ONE DI NAMI CA DELLA MEMORI A    Il programmatore pu   invece scegliere  nei casi in cui risulta conveniente  di gestire la memoria dinamicamente   Significa che avr   a disposizione delle istruzioni con cui comandare durante l esecuzione del programma la  allocazione di altro spazio per le variabili ma anche per restituire lo spazio che non serve pi       UN    APPLICAZIONE CONCRETA   Immaginiamo che ci sia stato commissionato un programma per monitorare in tempo reale gli ingressi allo SMAU   In particolare si vogliono inserire le localit   di provenienza dei visitatori in un elenco che deve essere consultabile  con la massima velocit   per poter effettuare statistiche in tempo reale  Da subito viene scartata l   idea di utilizzare i  file  troppo lenti  Si utilizzer   la RAM cercando comunque di non    sprecarla    per non compromettere le prestazioni  del sistema  Si decide di organizzare le informazioni in questo modo  blocchi  vettori  da 20 stringhe ciascuno fino  ad un massimo di 1000 blocchi  Fissiamo anche la lunghezza di ogni stringa  50 caratteri  All   inizio si comincia con  un solo blocco  vettore   esaurito il primo si chieder   memoria per il secondo e cos   via              Rifletti              Capita la differenza  Non verranno predisposti da subito 1000 vettori da 20 stringhe  Verr   dato spazio ai vettori in  RAM progressivamente  man mano che se ne avvertir   l esigenza
79.  string    End     Var  MioCompleanno  TCompleanno              accesso ai componenti senza with accesso ai componenti con with   MioCompleanno Data gg    30  with MioCompleanno do  MioCompleanno Data mm    10  begin  MioCompleanno Data aa    1963   MioCompleanno Nominativo      Fabrizio Camuso     with Data do   begin   gg  30  mm  10  aa  1963  end    Nominativo    Fabrizio Camuso     end        Attenzione  Sarebbe un errore     with MioCompleanno do  begin   gg  30  mm  10  aa  1963   end    perch   gg  mm ed aa non sono direttamente campi di  MioCompleanno ma del record Data in esso contenuto          Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  129       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ESEMPIO   scrivere un programma per la gestione di una biblioteca che preveda la ricerca dei dati di un libro per  autore  o per titolo o per editore    program libri   uses crt     const  MAX_LIBRI 50     type  TLibro  record  codice  integer   autore  titolo editore  string   end     var  biblioteca  array  1  MAX_ LI BRI   of TLibro   numero_libri cont scelta  integer  da_cercare  string     begin  numero_libri  0 cont  0 scelta  0 da_cercare     clrscr     repeat  write  Quanti sono i libri  Max   MAX_LIBRI           readin numero_libri      if  numero_libri lt 1  or  numero_libri gt MAX_LIBRI  then  writeln  Valore non accettabile  riprova          until  numero_libri gt 0  and  numero_libri lt  MAX_LIBRI         carico
80.  un grosso pregio che potrebbe essere determinante  la rapidit   nel fornire la  risposta  Mancando infatti il microprocessore e non essendoci codici d istruzione da prelevare nella RAM n    decodifiche da effettuare  i dati in input sono trasformati in quelli di output ad una velocit   molto superiore rispetto  ad un programma che compie la stessa elaborazione     Nel nostro corso ci occuperemo di trovare soluzioni software ai problemi che affronteremo  E l attivit   di  programmazione non    l unica da mettere in gioco per risolvere un problema     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  2    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Dal problema al programma   ciclo di sviluppo  semplificato  del software       La scrittura del programma    solo una delle fasi del processo di sviluppo di un applicazione informatica  Tutto inizia  con l esigenza di risolvere un problema con un sistema informatico  La parola problema deve essere intesa in modo  ampio  gestire la contabilit   di un azienda  usare il personal computer per scrivere documenti  per una simulazione di  guida  per svolgere calcoli complessi  controllare un processo industriale  pilotare un robot eccetera     Per quanto ci riguarda  i problemi saranno espressi in forma testuale  Ecco il testo dell esame di Stato del 1998     Una galleria d arte ha deciso di creare un sistema che consenta ai suoi clienti di consultare da  casa il catalogo  dei quadri  trami
81.  una specie di segnalibro per ricordare che in quel punto c    da completare la traduzione     E  compito del programma linker analizzare tutti i collegamenti irrisolti dei programmi oggetto che gli vengono  sottoposti al fine di produrre un unico eseguibile  estensione  exe  e cercare nelle librerie indicate il codice mancante   quest ultimo verr   estratto in copia ed incorporato nei punti richiesti  Ecco uno schema che esemplifica il  meccanismo     Codice Sorgente                       Geometria pas  linker  Geometria exe  Program geometria  Geometria  obj    USES grafica  Programma eseguibile finale  ci compilatore Codice Codice binario  crf  12 61  30       oggetto  e del comando crf     traduzione in linguaggio macchina      delle istruzioni scritte dal             crf  7 49  22      programmatore                              Il codice della crf  viene estratto dalla  libreria ed  incorporato nel quadrato  programma finale   La libreria di  solito contiene il  codice di molti  comandi    codice della crf prelevato dalla  libreria                                  LIBRERIA GRAFICA LIB    Abbiamo ora tutte le nozioni necessarie per esaminare in dettaglio il procedimento di scrittura di un programma     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  21    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Struttura di un programma Pascal       Ogni programma Pascal    costituito da tre sezioni           Intestazione       Progra
82.  utente     writeln    Errore  riprova          until valore gt  10       resto del programma      end     Caratteristiche del ciclo repeat    e il controllo che decide se ripetere o meno il blocco delle istruzioni si trova in fondo al ciclo ed    per questo  che il ciclo repeat viene detto con controllo in coda  questo comporta che almeno una volta le istruzioni del  ciclo vengono eseguite  qualche volta questo    un vantaggio ma altre volte no  quando    necessario controllare  prima una condizione senza la quale potrebbe essere addirittura deleterio eseguire le istruzioni   se c    questa  necessit   probabilmente    meglio utilizzare l altro tipo di struttura iterativa indefinita  il ciclo while  vedi pi    avanti        e il ciclo termina quando la condizione di uscita    vera  per questo motivo si parla anche di ciclo con uscita per  vero    Uscita dal ciclo repeat con contatore        Fondamentalmente si utilizza una variabile per contare quante volte    stato eseguito il ciclo  In pratica possiamo  uno in uno ma possiamo scegliere di quanto aumentare la variabile di controllo ad ogni esecuzione del ciclo  non  siamo neppure costretti ad incrementarla di valori interi  potremmo ad esempio optare per incrementi di millesimi di  unit   per calcoli di tipo scientifico  Vediamo qualche esempio     Questo ciclo stampa sul video i numeri da uno a 10  Tutti d accordo sul fatto che in situazioni di questo tipo sia meglio  utilizzare il ciclo for  con quest ultimo non    il pro
83.  valore inserito viene memorizzato nella variabile indicata  da questo momento in  avanti diventa disponibile nel programma              Comandi per il controllo del flusso di esecuzione       Tutti i comandi visti fino ad ora sono del tutto insufficienti per implementare  realizzare sul computer  algoritmi  anche molto semplici  Immaginiamo ad esempio un programma che chiede a chi lo sta usando di inserire l et    il  programma dovrebbe rispondere con un messaggio appropriato a seconda che ci si trovi di fronte ad un maggiorenne  piuttosto che a un minorenne     Non c    modo scrivendo semplicemente un istruzione dopo l altra di riuscire in questo intento  Per ora  infatti  siamo  solo in grado di indicare in sequenza una serie di comandi  Questo    certamente utile ed individua la prima delle  cosiddette Strutture fondamentali della programmazione   Ne mancano due  la Selezione  e l iterazione  La  selezione corrisponde la possibilit   di far eseguire un blocco di istruzioni piuttosto che un altro a seconda del  risultato di un confronto  L iterazione corrisponde invece la possibilit   di far ripetere un blocco di istruzioni fino al  verificarsi di una certa condizione                             Due studiosi hanno dimostrato che con sequenza  selezione e l iterazione possono essere scritti tutti i possibili  programmi che un microprocessore    in grado di eseguire  Si parla anche di programmazione strutturata                       NOTA  siete caldamente invitati a consulta
84.  vicino alla macchina e lontano dal nostro linguaggio naturale                            primi programmatori non avevano    molta scelta  non esisteva la tastiera  Age Falle    non esistevano i supporti di  memorizzazione di massa     Ogni  istruzione ed ogni dato veniva  comunicato al computer usando le    HW tin LI   ONILELLEDET CELL   LULLLLILLEEIETTEETETITTIT IITE EA UG LIL  I  I   muri J  UOLER    cosiddette schede perforate  ormai s EAA   Th iridati  reperti archeologici     Sono tessere di vai ESTE  carta  dalle dimensioni di una grossa centi  banconota  su cui i numeri binari sono i muga    rappresentati bucando o no piccoli    b930 305330k89 3333351 1553193 ie TETELE  Computer     sesen PERSI    rettangoli disposti in file verticali  un I III III LI III IT OTT TIMO LI LL LILLO    CESEN    buco all interno del rettangolino  significa 1  niente buco 0  Una fila  verticale di rettangolini corrisponde ad un byte  quindi  l uno di fianco all altro  sulla stessa scheda possono stare  anche pi   byte  file di rettangolini   Il programmatore  usando un dispositivo chiamato perforatrice  preparava pacchi  di schede  corrispondenti ai programmi che voleva far eseguire  Le schede perforate venivano poi lette da un lettore  meccanico  questo scandiva ogni scheda rilevando i fori e comunicando 1 o 0 al computer  che a sua volta  memorizzava   byte nella RAM        A parte la scomodit   fisica di questo meccanismo  era facilissimo spiegazzare una scheda  con conseguente  inceppam
85. 0 then  write elenco unaPersona   AGGI UNGE LA SCHEDA IN FONDO AL FILE ED AVANZA    until unaPersona codice 0     close elenco    end     Chi usa il programma comunica che le schede da aggiungere sono terminate digitando come codice il valore zero     Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 1 di 177       Ricorsione     versione 2 02   Febbraio 2005    Aggiunga di righe ad un file esistente   PROCEDURA SEEK E FUNZI ONE FI LESI ZE    L append non esiste ma pu   essere simulata spostandosi in fondo al file con un comando speciale  Un grosso  vantaggio  infatti  dei file tipizzati    la possibilit   di spostarsi su una scheda qualsiasi senza dover leggere quelle che  la precedono  Il comando    seek nome file_logico  posizione   ATTENZIONE  si inizia a contare da zero   Quindi la  posizione del primo record    la zero  quella del secondo record    due e cos   via  Per spostarsi sul primo record allora  si user   seek file   0   per spostarsi invece sul decimo seek file  9      Per simulare l append dovremmo allora spostarci oltre l   ultimo record  Se ci fossero N record l istruzione sarebbe  seek file  N   infatti seek file  N 1  individuerebbe proprio l   N mo record ed indicando N come posizione ci  posizioneremmo sul record N 1  cio   sul nuovo che abbiamo intenzione di inserire   sempre in virt   del fatto che si  conta da 0  Gi    ma come si fa a sapere quanti record ci sono nel file  Un metodo brutale potrebbe essere quello di  leggerli tutti fino a raggiunge
86. 1    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Immaginiamo infatti la situazione in cui la procedura asterischi  una volta sperimentata e considerata    perfetta      venga tolta come codice dal programma visto prima ed inserita in una libreria chiamata stampe  Il programma  apparirebbe allora cos   strutturato                 program esempio  Indico l   uso della libreria  uses stampal  var numero  integer  simboli  string  Come vedete  le istruzioni della procedura  asterischi non sono pi   visibili   begin  numero  5     Il codice corrispondente  gi   compilato in    simboli    PPP o k KK Kk A i           linguaggio macchina  viene incorporato    asterischi  numero  simboli       na Nell eseguibile finale dal linker     Nel programma rimangono solo le righe       end   Il programmatore non ha modo di capire se la procedura asterischi modificher   o meno il valore di uno dei suoi  parametri formali  Ed anche se il codice dal sottoprogramma fosse ancora inserito direttamente nel programma  saremo sempre costretti ad un alto livello di attenzione perdendo molto tempo nel controllare le istruzioni di ogni  sottoprogramma per capire se esiste questa possibilit       Insomma  sarebbe un bel guaio se il sottoprogramma potesse modificare  senza che questo fosse dichiarato in  qualche modo  a piacimento il valore di uno dei parametri attuali  numero  simboli      Invece  grazie ai vincoli imposti dal passaggio dei parametri per valore  by value  il programmator
87. 10  2 in binario  e 0100  4 in binario  oppure intendere che  0010    l indirizzo in RAM in cui trovare il primo numero da sommare e che 0100    l indirizzo dove trovare in RAM il  secondo numero da sommare  A seconda del codice dell istruzione la CPU sa come comportarsi  Se l istruzione  produce un risultato    anche possibile indicare a quale indirizzo in RAM depositare il risultato  Ecco come potrebbe  apparire un istruzione completa     0001  0010  0100  1100    Noterete che sono necessari 16 bit  cio   due byte  per rappresentarla  Infatti  anche se le celle della RAM contengono  un byte  spesso sono considerati a gruppi  II decodificatore riceve proprio la sequenza completa di bit  la scompone  in codice operativo  operandi e indirizzo risultato e comunica alla Control Unit le sequenze  microistruzioni  di  comandi da attivare  Alcune istruzioni  semplici  occupano un solo byte  altre molti  La CPU non fa in questo caso  confusione a causa delle diverse lunghezze  il codice operativo  il primo ad essere letto nella RAM  chiarisce subito di  che tipo di istruzione si tratta e di quanti byte necessita  per ogni sua parte  E    per questo che il program counter pu    essere automaticamente aumentato del giusto numero di byte per    puntare    alla posizione in RAM in cui si trova la  prossima istruzione     OSSERVAZIONE IMPORTANTE  Sembrerebbe che qualsiasi aspetto della realt   sia perfettamente rappresentabile e  trattabile da un elaboratore     ma non    esattamente cos
88. 2004    A titolo di esempio consideriamo un file di dati anagrafici contenenti un milione di record  Una ricerca dicotomica  sul file indice nel caso pi   sfortunato richieder   20 letture  20   circa  log3 1000000  che    il numero di volte  che pu   essere dimezzato un intervallo pari ad un milione  pi   una ventunesima nel file dati vero e proprio   Mediamente  in realt    il numero di letture sar   minore di 20  Paragonate questo numero di letture con il  numero medio di letture nel file dati principale disordinato  500000    per rendervi conto del guadagno     Qualcuno  giustamente  star      storcendo il naso per la puzza di bruciato     non sarebbe meglio tenere ordinato il  file principale e sfruttare la ricerca dicotomica o qualsiasi altro algoritmo pensato per la gestione degli indici   evitando l   uso di questi ultimi   In linea di principio questo sarebbe possibile ma molto pi   lento perch   il file  principale    di solito molto pi   grande dell indice  Tenere aggiornato l indice    invece un compito assai pi    leggero e  grazie a particolari strutturazioni quali quella prevista dalla tecnica    B  tree     pu   essere fatto  praticamente in tempo reale senza rallentamenti avvertibili dall utente  Inoltre    possibile avere pi   indici per  accedere ai dati secondo diverse chiavi di ricerca  per codice  per cognome  per indirizzo ecc    sarebbe  veramente troppo oneroso riordinare il file principale in base al campo che di volta in volta interessa  Oppure  man
89. A  alla  Z  e dalla  a  alla  z   non ci saranno problemi  cambiera   solo la distanza che rimarra  pero  fissa per quel sistema operativo  per gli stessi motivi e  meglio usare la formula  ord  a     ord  A   invece del suo valore 32  valido solo in ambienti windows               Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  99    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       trasformo in minuscolo  al codice ascii del carattere sommo la sfasatura con il set delle minuscole  e ritrasformo il  risultato nel carattere corrispondente     lowCase    chr  ord c    distanza    end  else  lowCase  c  end     begin  clrscr        esempi d uso         writeln  lowCase  A       writeln  lowCase  a       writeln  lowCase  Z       writeln  lowCase  2       writeln  lowCase            inalterato           porte     n    writeln  INVIO per continuare         readin     end        SOT 11  difficolt    alta Data una stringa convertirla in minuscolo o maiuscolo a seconda del valore di un  parametro come  se come  m  converte in minuscolo  se come  M  converte in maiuscolo  se come non ha un  valore valido la stringa viene restituita immodificata   Sfruttare alcune funzioni precedenti  SOT9 e SOT10           program MinuscoloMaiuscolo   uses newdelay  crt        per un commento vedi SOT9     function isUpCase c  char    boolean   begin isUpCase      ord c   gt   ord  A     and   ord c   lt   ord  Z      end       per un commento vedi SOT10 
90. A DEL MINIMO             Questo algoritmo appartiene alla categoria chiamata    per selezione    perch   invece di scambiare in continuazione  celle adiacenti tra loro  cerca il miglior numero da spostare  riducendo di molto il numero degli scambi  In dettaglio     1  Partendo dalla prima posizione  localizza la cella con valore minimo  prendi il minimo e mettilo in prima  posizione  il numero in prima posizione mettilo nella cella in cui hai trovato il minimo     cerca il minimo scambio risultato                                                                I  i  9 8 6 3   38 9 6 3  E RI RA EG  2  Spostati in avanti di una casella ed ignora la prima  gi   in ordine   cerca il minimo nella parte del vettore       avanzata     mettilo in seconda posizione  il numero in seconda posizione mettilo nella cella in cui hai trovato il    minimo  Ripeti il procedimento fino alla penultima posizione  a quel punto il numero in ultima posizione    per  forza in ordine                                                                 mj p e     E oe    Obb k pB  4                                                          i Pe o 3 12 B3  6  9 J8  E    je ji        a i n                                                                S O e               rela ia 4 rocedure selezione_sort VAR vet  vettore_interi  n  integer    ar i j  integer   begin  for i  1 to n 1 do  begin  pos_min  i     for i  1 to n 1 do  begin  pos_min  i        cerco la posizione del minimo  tra i e ultimo elemento     
91. CCO LA SOLUZIONE CON GLI ARRAY       La soluzione che sfrutta gli array prevede invece di passare le opzioni sotto forma di vettore di stringhe   type vettore_stringhe   array 1    20  of string     Function menu titolo  string  num_opzioni  integer  scelte  vettore_stringhe   integer   var i scelta  integer     begin  writeln titolo     for I  1 to num_opzioni do Stampa tutte le opzioni precedute dalla I e da un trattino  1  writeln I              scelteli        opzionel  2     opzione 2 ecc        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  118    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    writeln     Scegli   gt           readin scelta   Per semplicit   non    stato controllato l   input dell   utente  menu  sc   lta  che potrebbe essere  lt 1 o  gt num_opzioni   end        OPERAZIONI TIPICHE CON GLI ARRAY    In tutti gli esempi che seguono si immaginano valere le seguenti dichiarazioni     const   MAX_ELEMENTI 100   type   vettore_interi   array 1    MAX_ELEMENTI  of integer   var    vettore  vettore_interi  N  integer     N    il numero di elementi da usare             1  Caricamento di un vettore di N elementi  con N  lt  MAX ELEMENTI       for i  1 to N do   begin  writeln     Inserire elemento n       i   readIn  vettore i      end     NOTA  caricare un vettore di  stringhe  piuttosto che di reali  comporterebbe solo la modifica  delle dichiarazioni nella sezione    type        Vediamo la stessa operazione fatta
92. Differenza tra interpreti e compilatori Pag  19  La catena della programmazione  editorlDE e programma sorgente  Pag  20  Compilazione e sue fasi  controllo lessicale  controllo sintattico  codice oggetto Pag  21  Il linker e le librerie Pag  21  L eseguibile finale Pag  22  Struttura di un programma pascal  intestazione ed identificatori Pag  23  Sezione dichiarativa  constanti e vantaggi del loro uso Pag  24  Variabili Pag  24  Tipi di dati semplici e loro dominio  forma esponenziale dei floating point  codice Pag  25  ASCII   Sezione esecutiva Pag  26  Assegnamento  compatibilit   di tipo Pag  26  Uso delle parentesi Pag  27  Principali operatori e operatori relazionali utilizzabili suddivisi per tipo di dato  tipi di Pag  27  errore  onverflow  underflow  operazione illegale    Tabella con l ordine di precedenza di tutti gli operatori visti Pag  29  Comandi di ingresso uscita  readin e write In  Pag  29  Comandi per il controllo del flusso di esecuzione  programmazione strutturata Pag  30  Selezione ad una via  if     then  Pag  31  Selezione a due vie  if     then     else  Pag  33  Uso di condizioni composte con i connettivi logici Pag  33  Selezione a molte vie  case     of  Pag  34  Esercizi riepilogativi sulla struttura selettiva Pag  36  Struttura iterativa enumerativa  for     do  Pag  48  Esercizi riepilogativi sul ciclo for Pag  50  Struttura iterativa indefinita repeat     until Pag  61          Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camu
93. E SEGUE  1 PAGINA  E    UN APPROFONDIMENTO PIUTTOSTO DIFFICILE DA  SEGUIRE  E   FACOLTATIVA        ATTENZIONE  DOPO LA PARTE FACOLTATIVA LA DISPENSA PROSEGUE               2 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Approfondimento    Approioncimento    Approioncimento    Allocazione dinamica della memoria versione 2 5 Luglio 2003    Esaminiamo in dettaglio cosa accade  la procedura viene invocata una prima volta e riceve il puntatore al primo  nodo  Se questo    NIL  cio   se l   albero    vuoto  si ferma subito  come deve essere  Altrimenti stampa la parte  informativa del primo nodo  Poi invoca se stessa sul figlio di sinistra con l   istruzione StampaAlbero nodo  sx   A  questo punto le procedure attivate sono due  La prima ad essere cronologicamente chiamata  StampaAlbero inizio    che rimane in attesa alla riga 2 aspettando il termine di StampaAlbero nodo  sx  che rappresenta la seconda  procedura attivata in ordine di tempo  E    molto importante capire che l   istruzione della riga 3   StampaAlbero nodo  dx   della prima procedura attivata non verr   eseguita fino a che non terminer   quella della riga  2     La seconda procedura attivata inizia la sua esecuzione e stampa la parte informativa del nodo puntato dal parametro  che ha ricevuto  se diverso da NIL   Poi effettua a sua volta una chiamata ricorsiva  attivando una terza copia della  procedura StampaAlbero inviando come parametro il puntatore al suo figlio di sinistra  E cos 
94. EsempiDiAssegnamento     X    Y  variabile       var  nl  n2  integer  x  real  s  string   begin  nl    100  nl   n2  nl    3  34      n2    x  2  x  3 14  x  nl  s      ciao  come stai        end   program AssegnamentiCompatibili   var  c  char  x  real  s  string   begin    x    3   7    equivale a 10 0      c      A      s    c     un carattere    sta    in una    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      X    Y 2  4  espressione    Il valore che viene assegnato ad una variabile deve essere di tipo compatibile   Questo  non significa per forza identico ma che  almeno  il risultato dell espressione alla destra  del simbolo di assegnamento sia convertibile nel tipo della variabile indicata alla  sinistra        Come regola pratica ricordate questa  un tipo pi   grande pu   accoglierne uno pi       piccolo    ma non il viceversa           Ad esempio  se X    una variabile reale  x    7 corrisponde a x    7 0 e x  3 7  corrisponde a x    10 0  gli interi 7 e l intero risultato dell espressione 3 7 possono  essere convertiti nel corrispondente numero reale senza problemi   Ma se x fosse una  variabile intera  l assegnamento x    1 5  ammesso che fosse accettato  dovrebbe  trasformare il numero reale 1 5 o nel numero intero uno o nel numero intero due con  una perdita di precisione inaccettabile e tale da richiedere un comando esplicito   x     trunc 1 5  ad esempio tronca il numero reale restituendo un intero     Pag  25    Gestione Archivi 
95. Inserire nuovo cognome       readin unaPersona cognome       per riscrivere devo rimettermi PRIMA del record     seek dati unCodice 1    write dati unaPersona    writeln  Fatto     end  else  writeln  Nominativo cancellato    end  else  writeln  Ci sono solo   ultimo_codice   nominativi     end  else  writeln  File Vuoto       writeln  INVIO per continuare     readin  end   5 begin    cancellazione     if ultimo_codice gt 0 then  begin  write  Inserire il codice che interessa     readIn unCodice    if unCodice lt  ultimo_codice then  begin  reset dati    seek dati unCodice 1      i record sono numerati a partire da 0     read dati  unaPersona       dovrei chiedere conferma  ma per brevit           if unaPersona attivo then    salto i cancellati         begin  seek dati unCodice 1    unaPersona attivo  false   write dati unaPersona    writeln  Fatto     end  else  writeln  Nominativo gia  cancellato    end  else  writeln  Ci sono solo   ultimo_codice   nominativi     end  else  writeln  File Vuoto       writeln  INVIO per continuare     readin  end   6  begin    visualizzazione      if ultimo_codice gt 0 then  visualizza _file dati    else  writeln  File Vuoto       writeln  INVIO per continuare     readin  end  end  until scelta 7     end        Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 11 di 177       Ricorsione     versione 2 02   Febbraio 2005    RI CORSI ONE    Esistono problemi tutto sommato semplici da descrivere che portano ad algoritmi incredibilmente compl
96. Introduzione allo sviluppo del sw e manuale Turbo Pascal versione 1 0 Giugno 2005                                                                                                                                              I NDI CE   Alcune definizioni importanti  calcolatore  sistema di elaborazione elettronico  Pag  1  programmabilit    soluzioni hardware e soluzioni software    Logica cablata e logica programmata  soluzioni hardware e soluzioni software a Pag  2  confronto    Dal problema al programma  ciclo di sviluppo  semplificato  del software Pag  3  Studio della situazione reale  analisi dei requisiti Pag  3  Analisi dei dati Pag  4  Algoritmo risolutivo  definizione  caratteristiche  Pag  5  Definizione di programma  linguaggi di programmazione Pag  6  Fase di codifica Pag  6  Figura dell analista  distinzione tra risolutore ed esecutore Pag  7  Fase di test  alpha  beta e gamma test  Pag  7  Fase di debug Pag  8  Release e manutenzione Pag  8  Dismissione Pag  8  Architettura hardware e software di un sistema di elaborazione  cpu  principali Pag  9  dispositivi interni quali la ALU  i registri  decoder    Ciclo di funzionamento di una CPU  fetch   decode   execute  Pag  11  Rappresentazione interna delle informazioni  giustificazione della scelta digitale Pag  14  Rappresentazione delle istruzioni Pag  15  Evoluzione dei linguaggi di programmazione  codice macchina  assembly  Pag  16  assemblatori  cenni ai diagrammi di flusso    Linguaggi ad alto livello Pag  18  
97. NESSUNO per terminare          readIn nome_cognome      if nome_cognome lt  gt      NESSUNO    then   begin  writeln    Inserire la data di nascita del visitatore         readIn data_nascita      Da notare che il resto dei dati viene chiesto solo se non     stata inserita la parola convenzionale per terminare il  ciclo      lt istruzioni per la stampa del cartellino     gt     end   until nome_cognome   NESSUNO        NOTA  la condizione di uscita da un ciclo repeat pu   essere composta  tipo quelle gi   viste per la struttura selettiva   L esempio seguente richiede all operatore un valore compreso nell intervallo 1 100     repeat  writeln    Inserire un valore compreso tra 1 e 100        readIn valore     until  valore gt  1  and  valore lt  100      NOTA  come avete visto dagli esempi  quando c    pi   di una istruzione nel ciclo non    necessario utilizzare un    blocco begin     end  il compilatore infatti    perfettamente in grado di individuare l inizio e la fine delle istruzioni del  ciclo usando le due parole chiave repeat e until come delimitatori     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  62    STRUTTURA ITERATIVA INDEFINITA   il ciclo while    Si distingue dal repeat per queste caratteristiche     Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    e il controllo che decide la terminazione ciclo    fatto prima delle istruzioni del ciclo stesso  per questo motivo  viene anche indicato come ciclo con controllo in te
98. Tradizionali   versione 3 1 Settembre 2004    SEL 10  difficolt    media  Letti tre numeri da tastiera  determinare se possono appartenere ad una progressione  aritmetica  TRACCIA  in una progressione aritmetica la differenza tra due numeri   consecutivi e  costante  Ad esempio  1 4 7 10 13 16 ecc    la progressione in cui ogni numero si ottiene  sommando 3 al precedente  La differenza tra due numeri consecutivi qualsiasi    pari a 3        program progressione   var a b c temp  integer     begin    write  Inserire il primo numero   gt         readin  a      write  Inserire il secondo numero   gt         readln b      write  Inserire il terzo numero   gt         readln  c         e  necessario prima assicurarsi che i tre numeri siano in ordine          prima ordina a e b tra loro       if b lt a then  begin  temp  a   a  b   b  temp  end        poi metti c al posto giusto        if c lt a then  begin  temp  a   a  C   c  b   b  temp  end  else  if c lt b then  begin  temp  b   b  c   ci temp  end     if  b a     c b  then          writeln  Sono in progressione aritmetica        else    writeln  NON sono in progressione aritmetica       writeln     premere INVIO per continuare       readln   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  45    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SEL 11  difficolt    alta  Verificare se una data inserita da tastiera e  corretta       program dataCorretta   var gg mm aa  in
99. Tradizionali   versione 3 1 Settembre 2004    stringa     end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  26    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    E    anche possibile calcolare espressioni facenti uso di parentesi  Un computer non ha per   necessit   di facilitarsi la  lettura di un espressione utilizzando diversi tipi di parentesi  quadre e graffe non devono essere usate  Bisogna usare    invece pi   livelli di parentesi tonde        Come siamo abituati noi    Come dev essere scritto con un linguaggio di programmazione        5 4      5 4         4  2     23  9      4 2     23  9          4 6  3    23  7        4 6  3    23  7                 4 6  3   23  7     67 9     4 6  3    23  7     67 9        Principali operatori predefiniti ed operatori relazionali utilizzabili per i principali tipi di dato    CHAR       Ord  carattere      Codice ascii corrispondente  ord    A    t 65  ord    a    t 97  ord    1    t 49       Chr  codice ascii     Carattere corrispondente  chr 65        A     chr 097       a             Upcase  carattere        Trasforma il carattere in maiuscolo  upcase    a          A     upcase    A          A          Confronti  predicati       lt   minore    gt   maggiore    lt  gt   diverso    lt    minore od uguale    gt    maggiore od uguale    NOTA  sono tutti da intendersi in senso alfabetico              INTERI       Somma  sottrazione  moltiplicazione  a DIV b Quoziente intero tra a e
100. VE deallocare un puntatore che non punta a niente  NIL   di solito va in crash il programma        Rifletti      Il fatto che la memoria possa essere restituita quando non serve pi   rappresenta gi   un grosso vantaggio rispetto  all uso di un normale vettore di stringhe  Il prezzo da pagare    una certa complicazione delle operazioni e  cosa ben  pi   tangibile  un maggiore rischio di commettere errori gravi           In effetti se la quantit   di memoria non rappresenta un problema conviene sovradimensionare gli array standard ed  evitare complicazioni  D altra parte in molte situazioni la quantit   di memoria    il problema principale  provate a  pensare se un programma di grafica tipo PhotoShop dovesse allocare decine di megabyte di RAM per niente per ogni  immagine ad alta risoluzione che poi non sar   veramente caricata in memoria               ATTENZIONE  SE AVETE CAPITO GLI ARGOMENTI FIN QUI ESPOSTI AVETE RAGGIUNTO COMPLETAMENTE GLI  OBIETTIVI      IL SEGUITO PUO  ESSERE CONSIDERATO UN APPROFONDIMENTO  NON ALLA PORTATA DI TUTTI     11 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it         Allocazione dinamica della memoria versione 2 5 Luglio 2003  Dopo le prime 20 stringhe avremmo esaurito lo spazio  n   pi   n   meno che con un vettore classico  La soluzione  consiste nell usare un vettore di puntatori  di 1000 puntatori per l esattezza     Intanto    necessario dichiarare il vettore di puntatori     type  P1000Blocchi array 1  1000  of blo
101. Word    formato da milioni di istruzioni     Queste indicano ci    che va fatto per consentire all utente di scrivere un documento usando il computer  Ecco  sinteticamente  come  funziona l   intero meccanismo     Usando l interfaccia che il sistema operativo mette a disposizione  l utente comanda il caricamento delle istruzioni  il  programma  dai supporti di memorizzazione di massa  nel caso di Windows si fa doppio click  ad esempio  sull icona  di Word         Le istruzioni  se non tutte almeno quelle che servono in un primo momento  sono trasferite dai lenti supporti di  memorizzazione di massa nella velocissima memoria elettronica  RAM   da quest ultima saranno a disposizione della  CPU in tempi molto brevi     La CPU preleva la prima istruzione del programma dalla RAM  Random Access Memory  memoria ad accesso  casuale      La CPU    capisce    cosa gli chiede l istruzione   LA CPU invia i necessari comandi a tutti i dispositivi interessati da quell   istruzione  eseguendola     Se l istruzione non    quella finale  si ritorna al punto 3 prelevando la successiva istruzione e cos   via        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  9    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Durante l esecuzione delle istruzioni  la CPU pu   usare la parte della RAM rimasta libera per registrare dati intermedi      sempre per motivi di velocit   che si preferisce la memoria elettronica a quella di massa  naturalmente si dovr 
102. X    else  writeln risultato     102     end   readln        proviamo con una schedina piu  realistica che privilegia gli 1 rispetto alle X e le X rispetto ai 2  si estrae un n  da  1al3esee trale6e come se fosse uscito l 1  tra 7 e 101X e tra 11 e 13 il 2       for i  1 to 13 do  begin  risultato   random 13  1   if risultato  lt   6 then  writeln 1   else  if risultato lt  10 then  writeln  X    else  writeln 2   end   readln   end              ITE12  difficolt    bassa  far scrivere sullo schermo 100 volte la frase  come programma mi sento un po  stupido            program messaggi   uses newdelay  crt   const  QUANTE_VOLTE 100     numero dei messaggi che saranno stampati commento  l uso di una costante permette  di cambiare molto facilmente il numero dei messaggi senza fare confusione con altri eventuali numeri 100       var  i  integer     contatore ciclo       begin  clrscr     cancello lo schermo       for i    1 to QUANTE_ VOLTE do    writeln  come programma mi sento un po  stupido           writeln  Programma terminato  Premere INVIO per continuare        readin     per dare il tempo di leggere il messaggio       end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  57    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004              TE13 difficolt    bassa far scrivere sullo schermo 5 volte la frase  come programma mi sento un po  stupido        indicare all inizio di ogni riga il suo numero progressivo  1  2  3           
103. a  P    Nel disegno P rappresenta il puntatore che individua l ingresso alla lista  ogni elemento  nodo  della lista ha una  parte informatica  INFO  che pu   essere qualsiasi cosa  un semplice intero  una stringa  un vettore ecc  ogni nodo     collegato al successivo con un puntatore  Il punto di ingresso individua la testa della lista e all altro capo troviamo  invece la cosiddetta coda della lista     Una lista ha anche altri vantaggi  oltre a quello di poter    crescere    indefinitamente  se gli elementi sono in ordine   alfabetico  per esempio  l aggiunta di un nuovo elemento  mantenendo l ordinamento     questione di pochissime  operazioni  Anche l eliminazione di un elemento ha un costo estremamente inferiore rispetto ai vettori     BASTA ARRAY  II fatto che la lista sia    forte    proprio dove gli array sono    deboli    non significa che debba essere d ora  in poi preferita ad essi  anzi    Le liste hanno purtroppo delle controindicazioni  che sono comuni a tutte le strutture    realizzate con la memoria dinamica    ma    ancora troppo presto per parlarne       Graficamente rappresenteremo le liste come segue     arriva in questa situazione o perch   ancora nessun elemento    stato inserito alla lista o perch      Z  NIL Quando la lista    vuota  P  il puntatore che rappresenta il suo punto di ingresso  vale NIL  Si  LI sono stati tutti eliminati       Quando la lista    formata da un solo elemento  puntato da P  L   elemento    costituito       info 4 NIL logicame
104. a RESET  READLN  file di testo   READ  file tipizzati     Per usare un file gi   creato in precedenza senza distruggerlo lo si deve prima predisporre all uso con la procedura  reset nome_ file_logico         Con reset in pratica si notifica l   uso del file al sistema operativo predispone le risorse necessarie  area di memoria  RAM per i trasferimenti da e verso i dischi  tabelle per tenere traccia delle operazioni ecc    Queste strutture  occupano memoria centrale preziosa  per cui bisognerebbe tenere    aperti    solo i file necessari     Quasi tutti i linguaggi distinguono tra diversi tipi di apertura  Cobol     C     a seconda delle operazioni di I O che si  intendono fare  sola lettura  solo scrittura  lettura   scrittura  aggiunta a fine file  append   E  impossibile in questa  sede discutere tutte le varianti  consultate attentamente il manuale del linguaggio in uso     Anche l apertura pu   fallire     il percorso nome del file non    valido    il supporto di massa non    disponibile  nastro non montato  floppy non inserito  CD non scrivibile     il supporto    in avaria  floppy o hard disk rotti         il file    gi   stato aperto da un utente in modalit   esclusiva  blocca i tentativi di accesso di tutti gli altri     Con il Pascal  dopo l apertura con reset di un file di testo si    pronti per leggere la prima riga  Dopo l apertura di un  file tipizzato si    pronti per leggere il primo record  Una funzione fondamentale per una lettura corretta sia dei file di  te
105. a dell ulteriore lavoro in fase di assemblaggio  un programmatore potrebbe  aver progettato l interfaccia di un suo sottoprogramma in modo non ottimale per un altro      Questa tecnica    chiamata IBOTTOM UP  dal basso verso l alto   si parte dai dettagli e dai componenti pi   semplici  per assemblare via via i componenti di pi   alto livello  quelli pi   complessi        Non si pu   dire che la tecnica sia superiore all altra  tant    che non    infrequente il caso in cui vengano in realt    utilizzate entrambe  il progetto viene fatto magari in modo top down ma lo sviluppo parte in modo dettagliato dei  livelli pi   bassi  La tecnica bottom up si rivela particolarmente efficace quando un progetto viene sviluppato seguendo  la filosofia della OOP  Object Oriented Programmino  che vede programmatore sviluppare componenti autonomi con  l obiettivo di poterli facilmente riutilizzare in progetti diversi  L OOP verr   affrontata in quarta     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  104    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ESERCIZI SVOLTI   secondo blocco             SOT 12  difficolt    bassa Dati due numeri determinare il maggiore        program massimo   var n1l n2 x  real        restituisce il massimo tra due valori comunicati     function max a b  real   real   var risultato  real   begin  if a gt  b then  risultato  a  else  risultato  b   max  risultato  end        prove di utilizzo della funzione massimo 
106. a dopo  l eliminazione di un errore  Purtroppo l esperienza insegna che  non cos   raramente come si potrebbe pensare  le  modifiche apportate per correggere un errore ne introducono altri                 Finalmente il codice pu   essere immesso sul mercato  Si parla di rilascio   release   Ma non    finita qui  Anzi   rapportato a 100  il totale dell impegno rappresentato da queste fasi viene stimato da molti come non superiore al  40     Ed il resto   Siate sinceri  quante volte vi    capitato di acquistare un video game senza essere costretti ad applicare  una cosiddetta patch  letteralmente pezza  correzione   Quante volte come utenti siamo rimasti in attesa  dell ennesimo service pack  un kit che contiene molte patch    in un colpo solo     di Windows o di Office o di altri  software  Ma anche senza errori  ogni anno vengono immesse sul mercato nuove versioni  qualcuno riesce a contare  quelle della serie FIFA  o di Final Fantasy                II 60  che manca di tutto il costo per lo sviluppo del software viene fagocitato dalla cosiddetta manutenzione  Ci  sono tre tipi di manutenzione        e correttiva  anche dopo aver superato tutte le fasi di test     quasi impossibile che un software non contenga  ancora almeno un errore  periodicamente  quindi  vengono rilasciate versioni che si spera siano di volta in volta  meno affette da errori     e perfettiva o migliorativa  indica tutti quegli interventi che non servono a togliere degli errori ma a  migliorare in qualche 
107. a lt b  b lt c  ac gt ab   ecc       ifcl lt  c2 then  writeln  I car  minore uguale II      if s1 lt  gt s2 then  writeln  le stringhe sono diverse       if s1 gt s2 then  writeln  la I stringa viene dopo la II sul dizionario         readin  end     ERRORE COMUNE          NOTA1  all interno della parte then pu   essere  messa una qualsiasi istruzione Pascal  quindi  anche altre strutture di controllo del flusso come  un altro    if     then        in pratica ci si  ritroverebbe con strutture    if    then     else    che  ne contengono delle altre  vedi pi   avanti     NOTA2  dopo un begin  o dopo il then se c       una sola istruzione  abituatevi  andando a capo  a  rientrare di un paio di caratteri e ad allineare di  conseguenza tutto il blocco delle istruzioni  Dopo  l   end ritornerete a scrivere le istruzioni allineate  con l   if  Questa tecnica di scrittura si chiama  indentazione  Indentare il codice aumenta in  modo drastico la leggibilit       Istruzione Istruzione  If x gt 2 then If x gt 2 then  Begin Begin  Istruzione  Istruzione   Istruzione  Istruzione   Istruzione Istruzione  End  End   Istruzione  Istruzione     g    n      Il solo fatto di indentare il codice non    sufficiente ad individuare il blocco delle istruzioni dopo il then   nell esempio che segue anche se dall indentazione    probabile che l intenzione dal programmatore sia quella di  far eseguire le tre istruzioni solo quando il valore della variabile x    maggiore di due  in realt   per il compil
108. a nella dichiarazione per  scegliere l altra modalit          Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  90    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Caratteristiche del passaggio dei parametri per valore    Il passaggio per valore ha una caratteristica decisamente interessante        sicuro    in quanto non consente al  sottoprogramma di modificare  tramite un parametro  una variabile del programma principale  Cerchiamo di capire il  perch   con un esempio     program esempio   var numero  integer  simboli  string     procedure asterischi quanteRighe  integer  riga  string   Questa volta nel sottoprogramma il ciclo     begin i realizzato con la struttura repeat     until  Ma  repea attenzione  quest   ultimo usa come contatore il    i quanteRighe       ____  gt   parametro quanteRighe stesso  diminuendolo di  until quanteRighe 0  uno ad ogni ciclo     end  DI 3  La domanda da un milione di euro     se la  begin variabile numero prima di chiamare la procedura  numero  5  vale 5  dopo aver chiamato la procedura  che         simboli    RARA AE apporta modifiche al suo primo parametro  quale    sar   il suo valore   asterischi  numef    SIT cc  Risposta  lo stesso che aveva prima della  writeln  numero     che valore viene stampato      chiamata  detto in altre parole  il passaggio dei  readin  parametri by value non consente ad un  end  sottoprogramma di modificare il valore di una  variabile esterna utilizzata nel pr
109. a occupa 50 carratteri  il blocco complessivo di byte occupati    20 50 1000 byte     New un_PBlocco   RAM       1434    1435  blocco    1436  1436    Il valore di bocco    l indirizzo del primo  byte allocato  i byte non contengono    ancora niente        N    Ecco quello che accade pi   in dettaglio  il sistema operativo  se la memoria non    esaurita  riserva un blocco di tanti  byte consecutivi quanti sono quelle necessari a memorizzare 20 stringhe da 50 caratteri  circa 1000 byte   Non     dato sapere a priori dove si trover   nella RAM questo blocco ma ci   che conta    sapere l indirizzo del suo primo byte      il suo indirizzo ad essere memorizzato nella variabile puntatore blocco  Considerando la situazione rappresentata  nel disegno soprastante  ho immaginato che il sistema operativo abbia trovato posto a partire dal byte all indirizzo  1436     questo il valore che viene memorizzato nella variabile blocco  Se non c    spazio il sistema operativo  restituisce NIL                                   E  molto importante capire che al momento della scrittura del programma il vettore non esiste ancora  E neppure alla  partenza del programma     necessario il comando esplicito new  NOTA  la new deve essere comandata una sola volta  per tutto il vettore  Nel caso il vettore non servisse pi   sar   possibile restituire la memoria al sistema operativo e  riutilizzare il puntatore blocco per un altro vettore  subito o in un secondo momento      Utilizzo della memoria allocata 
110. a potenza   i    del 2 e     pot    pot  pot 2   i  i 1  until i gt n   readin        VEDIAMO POI LA SOLUZIONE CON IL WHILE        pot  1  i  0     writeln  SOLUZIONE CON IL WHILE     while i lt  n do  begin  writeln  La potenza   i    del 2 e     pot    pot  pot 2   i  i 1  end   readln        VEDIAMO INFINE LA SOLUZIONE CON IL FOR        writeln  SOLUZIONE CON IL FOR     pot  1   for i  0 to n do  begin  writeln  La potenza   i    del 2 e     pot    pot  pot 2  end   readln  end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  65                program mediaNnumeri   var  n  integer     quanti numeri inserire     numero  integer   somma  real      la somma pu   superare 32767         media  real     i  integer     peri cicli     begin   writeln  CALCOLO MEDIA      writeln        continuo a chiedere un N finche  soddisfa         repeat  writeln  quanti numeri vuoi inserire   N gt 0        readIn n      if n lt  0 then  writeln  Valore senza senso  RIPROVA  N gt 0        until n gt 0        VEDIAMO PRIMA LA SOLUZIONE CON IL REPEAT       somma  0   i  1     writeln  SOLUZIONE CON IL REPEAT       repeat    write  Inserire un numero    1      gt       readIn numero    somma  somma numero    i  i       until i gt n     media  somma n   writeln  media    media 6 2      readIn        VEDIAMO POI LA SOLUZIONE CON IL WHILE        somma  0   i  1     writeln  SOLUZIONE CON IL WHILE      while i lt  n do   begin  write  Inserire un numero    1      gt
111. a se vogliamo mantenere ordinato l elenco  Infatti non basta aggiungere in fondo il  nuovo nome  non    detto  infatti  che l elenco rimanga ordinato  E    assai pi   probabile che il giusto posto per il  nuovo nome sia in una posizione intermedia  Sar   allora necessario spostare verso destra di una posizione una parte  degli elementi per fare spazio al nuovo  Come si diceva  l inserimento in queste condizioni    un operazione piuttosto  onerosa ed accettabile solo se gli inserimenti a vettore gi   ordinato sono rari  purtroppo sono molteplici le  applicazioni in cui    vero io il contrario     Non va meglio nel caso si debba eliminare un elemento intermedio   perch         Una struttura allocata staticamente    inefficiente per  frequenti operazioni di inserimento ed eliminazione     7 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso  it      Allocazione dinamica della memoria versione 2 5 Luglio 2003       LIMITE 3             Date un occhiata alla struttura dati disegnata qui a lato  si chiama albero   Essa    adatta per  rappresentare situazioni in cui esiste una gerarchia tra gli elementi da memorizzare  struttura  directory  organigramma aziendale  mosse e contromosse in un gioco ecc    Beh  penso sarete  d accordo nell affermare che non    facile rappresentarla usando gli array  E che dire in merito  alla rappresentazione di una rete stradale  in questo caso non c    addirittura nessun ordine tra  i nodi da collegare     b l Una struttura allocata
112. a virgola     var  base  altezza  integer     Il tipo individua l insieme dei possibili valori che possono essere assunti da una costante o da una variabile  si parla  anche di dominio   Ogni tipo ha infatti i suoi limiti   Ecco la tabella che riassume la situazione per i principali tipi del    Pascal                                                     INTERI   Tipo da a   Byte 0 255  Shortint  128 127  Integer  32768 32767  Word 0 65535  Longint  2147483648 2147483647  REALI   Tip o da a   Real 2 9x10   1 7x10   Single 1 5x10  3 4x10   Double 5 0x10   1 7x105    extended 1 9x10 5 1 1x10 5                Esempi di numeri reali  3 14 4 761E 3           Il secondo numero    espresso in forma esponenziale  la lettera E seguita da un numero  equivale a moltiplicare  o dividere se il numero dopo la E    negativo  per quella potenza del dieci        Quindi 4 761E 3   4 76 x 103   4 76   1000   0 00476   2 45E 4   2 45 x 10     24500    N OTA  ci si riferisce a questo tipo di dato anche con la dicitura  floating point  a virgola mobile        TI PO CARATTERE  char      tipo char si usa per il singolo carattere  lettera alfabetica  cifra numerica da 0 a 9 o  qualsiasi altro simbolo rappresentabile con il P C  come la punteggiatura  ma anche le lettere dell alfabeto greco   alcuni caratteri semigrafici tipo cuoricini o faccine  lettere straniere come    ii o simboli matematici   L elenco  completo forma quella che viene chiamata Ila tabella ASCI I   American Standard Code form Informa
113. afferra la maniglia   erotea la mano di 30 gradi in direzione antioraria  eapplica una pressione alla maniglia diretta di fronte a te    e     eavanza di un metro    Una breve analisi dell esempio sopra  porta a delineare alcune caratteristiche essenziali di un  algoritmo   enon ambiguo  le istruzioni devono essere univocamente interpretabili   eeseguibile  ogni istruzione deve terminare in tempo finito   elnoltre  in informatica  si richiede generalmente che un algoritmo sia finito  ovvero termini per  ogni insieme di dati di ingresso                 Un algoritmo non    tale se risolve in un caso particolare di un problema  deve essere utile per la soluzione di  un intera classe di problemi  Facciamo un esempio  il procedimento che serve a calcolare l area del triangolo  la cui base misura 3 m e l altezza 5 m  e solo l area di questo triangolo  non pu   definirsi un algoritmo  Il  procedimento invece che descrive come calcolare l area di un qualsiasi triangolo nota la misura della base e  dell altezza  risolve un intera classe di problemi     una soluzione generale  e pu   definirsi algoritmo                    Un  programma    la traduzione di un algoritmo in un blocco di istruzioni eseguibili automaticamente da un  sistema di elaborazione elettronico        Arrivati a questo punto dobbiamo confrontarci con l assoluta inadeguatezza del linguaggio parlato  il  cosiddetto linguaggio naturale  per descrivere un algoritmo  Banalizzo con un classico esempio     la vecchia porta 
114. alori che riceve come parametri  Essendo  begin questi ultimi dello stesso tipo     possibile  if a gt  b then dichiararne il tipo insieme  separando per   i loro  max  a nomi con una virgola   else  max  b IMPORTANTE  i nomi delle variabili che  end  eventualmente vengono utilizzate al momento del    richiamo del sottoprogramma non devono chiamarsi  per forza come i parametri  Detto in altre parole  per  il fatto di aver chiamato a e b i parametri della  funzione non siamo assolutamente obbligati a  chiamare allo stesso modo le variabili del    begin  writeln     inserisci un numero       readin   num 1      writeln     inserisci un altro numero         readin   num 2   programma principale usate per chiamare il  sottoprogramma  nell esempio  le variabili dichiarate  writeln     il maggiore dei numeri inseriti           nel programma principale si chiamano infatti num   writeln   max num1  num2      e num2  quello che accade    che il valore contenuto  in num  viene copiato nel parametro a e che il  readin  valore contenuto in num2 viene copiato nel  end  parametro b  Si parla infatti di passaggio dei             parametri per valore  by value        NOTA  Se vi state domandando come si faccia a distinguere la modalit   di passaggio dei parametri by value dall altra  che esamineremo tra poco  considerate questa semplice    regola     quando nella specifica del parametro appare solo il    suo nome ed il suo tipo il passaggio    by value  Dovremo infatti aggiungere qualche cos
115. amuso  email  camuso camuso it sito web  www camuso it   Pag  87    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Come si scrive un sottoprogramma      Iniziano con la parola procedure o function seguita dal nome che il programmatore vuole dare al sottoprogramma  Se  non sono previsti parametri si mette il punto e virgola subito dopo il nome del sottoprogramma  tutti i nostri esempi  iniziali non avranno parametri per semplicit         Poi tra begin e end si mettono le istruzioni che si vogliono far  eseguire quando si richiama il sottoprogramma  Ad esempio  ecco come si scrive una procedure per stampare sullo  schermo un rettangolo fatto da asterischi     program esempio        uses crt   procedure Il sottoprogramma viene dichiarato una volta sola e  disegnaQuadrato  richiamato due volte nel programma principale   begin  writeln          Fosse necessario stampare anche mille rettangoli  le  writeln          istruzioni del sottoprogramma sono state scritte una  writeln          volta sola   writeln           end  Se si vogliono aumentare o diminuire il numero di  righe o colonne degli asterischi    sufficiente farlo  begin solo nel sottoprogramma ed il nuovo funzionamento  disegnaQuadrato  si ripercuoter   automaticamente in TUTTO il  dii DIOR   disegnaQuadrato   writeln   writeln   readin  end     Nel prossimo esempio scriveremo un sottoprogramma che restituisce un numero scelto a caso per il gioco del lotto   un numero da 1 a 90   Poich   restituisce un val
116. ano   x lt 4  or  x gt 12   espressione vera se x ha un valore esterno all   intervallo  4 12   Or bitwise  1001 and 1011   1011    Test di uguaglianza    Test di non uguaglianza  diverso da   x  lt  gt  y  espressione vera se il valore della variabile x    diverso  da quello di y     Test minore di  Test maggiore di  Test minore o uguale di       VIAJLUVIA TAN Q             comandi di ingresso uscita  servono per acquisire dati dalla tastiera o per visualizzare risultati numerici  messaggi  di testo  caratteri semigrafici  primitive geometriche  rette  circonferenze   suoni  stampare ecc        uscita  scrittura   write espressionel  espressione2        mostra sullo schermo la sequenza dei valori delle espressioni indicate tra  parentesi  espressione1 2ecc  pu   essere praticamente qualsiasi cosa  una costante numerica una costante stringa   una variabile di tutti i principali tipi  un espressione che verrebbe prima calcolata ed il cui valore sarebbe quindi  visualizzato  nota  non va a capo automaticamente  per cui il successivo comando di visualizzazione su video  continuer   sulla stessa linea dello schermo  a meno che si sia gi   arrivati all ultima posizione  nel qual caso si va  comunque a capo      writeln espressionel  espressione2        come il comando write ed in pi   si posiziona automaticamente sulla  prossima linea dello schermo     Esempi  write 12   write    a      write    ciao mondo      write    Gianni ha      eta      anni       writeln    In un secolo ci
117. ano fare certe cose ma non altre  solo     pi    semplicemente  Provate a spiegare le equazioni senza usare termini matematici     E  possibile  ma che fatica     Per  lo stesso motivo sarebbe anche possibile scrivere in Cobol un programma per il calcolo dell orbita di un satellite  ma  che fatica     Certo  alcuni linguaggi sono pi   specializzati di altri  Alcuni sono invece ad uso generale  il Basic ed il    C     od il C   non eccellono in nessun campo in particolare ma sono pi   che adeguati per ogni compito  E  il mercato che  decide la fortuna di un linguaggio     Ovviamente anche per i linguaggi a medio alto livello    necessaria una traduzione in linguaggio macchina prima di  poterli mandare in esecuzione        NOTA  tutti i linguaggi diversi dal codice macchina sono chiamati simbolici perch   hanno sostituito dei simboli  O mnemonici alle sequenze di 1 e    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  17    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Esistono due tipi di traduttori per linguaggi a medio alto livello                       1  Interpreti  Il programmatore scrive le istruzioni usando un programma di video scrittura  editorn   Quando si  comanda la partenza del programma  l interprete legge le istruzioni una alla volta  non opera una vera traduzione ma  si limita a riconoscere ci   che le istruzioni vogliono ed a compiere l   azione corrispondente  otteniamo quindi subito   senza attese apprezzabili 
118. anti pu   anche non essere presente     Procedure e Funzioni       Dopo la sezione delle variabili pu   essere presente quella dei cosiddetti sottoprogrammi  Si rimanda la discussione di  questo argomento ad un momento pi   appropriato  molto pi   avanti nella dispensa    Per il momento possiamo  comportarci come se questa sezione non esistesse           Sezione esecutiva  corpo principale del programma           E   la parte veramente operativa del programma  Corrisponde in pratica alla traduzione dell   algoritmo  La parte  dichiarativa    infatti solo preparatoria e serve al compilatore per essere pi   efficiente  ad esempio se conosce in  anticipo i tipi delle variabili pu   organizzarle pi   efficientemente nella RAM  e controllare il resto del programma  per alcuni tipi di errore  ad esempio tentare di modificare una costante  come potrebbe se non avessimo dichiarato in  anticipo quali identificatori considerare associati a valori immutabili       Questa sezione inizia con la parola riservata begin e termina con la parola riservata end seguita da un punto     program Esempio   const    Intestazione       begin    end     x Sezione dichiarativa  var    Sezione esecutiva    TIPI DI ISTRUZIONE CHE SI POSSONO METTERE NELLA SEZIONE ESECUTIVA       lassegnamento   memorizza in una variabile una costante oppure il valore di un altra variabile oppure il risultato di    un calcolo  espressione   in Pascal il simbolo dell assegnamento    questo        X    8  costante    program 
119. aspetto fisico  oltre che a decidere come usare lo spazio messo a  disposizione  aspetto logico   Detto in altre parole doveva occuparsi sia della gestione fisica delle informazioni che di  quella logica  cio   pilotare i dispositivi ed allo stesso tempo gestire i byte in modo da poterli interpretare come  informazioni utili  quali archivi creare  Come strutturarli in campi informativi  Come mettere in relazione i record un  archivio con quelli di un altro    Questa doppia    responsabilit      porta con se parecchi problemi tra cui  mettendo in  evidenza i pi   eclatanti     opportuno citare i seguenti     Necessit   di conoscere in modo approfondito l hardware da controllare    Come conseguenza del punto precedente aumenta la complessit   dell attivit   di programmazione      programmi sono molto legati all hardware  quando quest ultimo cambia essi vanno modificati   L efficienza nella gestione dei supporti dipende dalla competenza del programmatore    Poca uniformit    ogni programmatore adotta tecniche diverse di allocazione gestione dello spazio   Notevole spreco di tempo uomo  ogni programmatore codifica routine gi   codificate da altri  chi meglio  chi  peggio     Y Basso livello di astrazione nella programmazione  lo sviluppatore invece di concentrarsi solo su aspetti logici  legati al problema    costretto a gestire altri dettagli     Wi XX X X Xx x     Ci sono anche i soliti vantaggi di una programmazione a basso livello        controllo accurato dell hardware  Y po
120. assa  Inseriti A  B e C dire se B e  compreso tra A e C  in pratica si controlla se B appartiene  all intervallo  A C        program intervallo   uses  newdelay  crt   var  a  b  c  real      variabili in cui verranno memorizzati i numeri       begin  clrscr     cancello lo schermo       write  Inserisci l estremo sinistro dell intervallo   gt         readin  a    write  Inserisci l estremo destro dell intervallo   gt       readin  c       se i numeri sono stati inseriti nell ordine sbagliato  stop     if a gt c then  writeln  Intervallo impossibile     else  begin  write  Inserisci un numero e ti diro  se appartiene all intervallo   gt       readIn b    if   b gt  a   and   b lt  c   then  writeln  Appartiene    else    writeln  Non appartiene        end       commenti  si e  deciso di comprendere gli estremi   gt   e  lt    nei controlli   notate le parentesi obbligatorie in presenza di piu  di una condizione   convincetevi che OR invece di and sarebbe stato un errore  un numero   per essere nell intervallo  a c  deve essere CONTEMPORANEAMENTE piu   grande  al massimo uguale  di a e piu  piccolo  al massimo uguale  di c     usando l OR la condizione sarebbe stata vera anche quando UNA SOLA delle  condizioni e  vera  ad esempio se l intervallo fosse  5  11   ed il numero   da verificare fosse 13  con   b gt  a   or   b lt  c   andremmo in pratica a  verificare   13 gt  5   or   13 lt  11   che risulterebbe vera grazie 13 gt  5 anche  se e  falso che 13 lt  11  e quindi il pu
121. assolutamente da evitare per tutti i motivi  wo pa visti in precedenza   KES KA Sas P   end     Quello che occorre    un modo    sicuro    per consentire ad un sottoprogramma la modifica di una variabile esterna   sicuro significa che un programmatore che sta per utilizzare un sottoprogramma    in grado  consultando la  documentazione  di capire che la variabile che sta indicando come parametro attuale pu   essere modificata dal  sottoprogramma ed in che modo              Tutto questo accade con l utilizzo dei parametri passati per indirizzo  by reference   A livello sintattico la  modifica    minima  basta aggiungere prima del nome di un parametro formale la parola var        program equazioni  Quando un parametro formale      var soluzione1  soluzione2  real  specificato per indirizzo una modifica ad  esso si ripercuote in modo permanente  sulla variabile utilizzata come parametro             procedure equazione2grado a  b  c  real  var x1 x2  real    begin        lt  Calcoli     attuale al momento della chiamata   xl      j X21  a   Detto in altre parole  nella sezione delle  end  variabili del programma principale sono  begin state dichiarate due variabili  soluzione1 e  equazione2grado 3 4 5  soluf  ne1  soluzione2   soluzione2  per memorizzare i risultati che  writeln    Le soluzione sono      soluzione1  soluzione2   verranno calcolati dalla procedura   readin    end     La procedura viene poi richiamata  indicando proprio queste due variabili  come ultimi due parametr
122. ati dat    reset elenco        ora modifichiamo il secondo record la sequenza standard e      seek alla posizione della scheda da modificare    lettura della scheda con vecchi dati    ATTENZIONE  a questo punto abbiamo superato la scheda da aggiornare      acquisizione nuovi dati che vengono sostituiti a quelli  vecchi nella scheda      torniamo indietro alla posizione giusta per scrittura ripetendo  la seek iniziale  pu   anche essere fatta subito dopo la lettura  per non dimenticarsene           scrittura su file  aggiornamento  della scheda con i dati modificati       seek elenco 1l      seek prima della scheda da modificare      read elenco  unaPersona      lettura scheda con vecchi dati      writeln             VECCHI DATI       9      writeln unaPersona cognome      unaPersona codice      write  I nserire il nuovo cognome       readin unaPersona cognome         riposizionamoci nel posto giusto per la scrittura      seek elenco 1l         ora la variabile record contiene il vecchio codice ed il nuovo cognome  riscriviamola sul file      write elenco unaPersona      Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 5 di 177       Ricorsione     versione 2 02   Febbraio 2005    Eliminazione       FILE DI TESTO  Non    possibile eliminare una riga da un file di testo  L unica possibilit      quella di ricopiare tutte le righe meno quelle  da cancellare in un nuovo file  operazione assai dispendiosa      FILE TIPIZZATI   Di nuovo  non    possibile eliminare fisicamente un
123. ati di    Rossi    sapremmo in modo super rapido che si trovano sul quinto record del file  Rossi    una stringa di 5  caratteri   Ovviamente salta subito all occhio il problema di questa formula troppo semplice  molti cognomi sono  lunghi 5 caratteri e tutti i relativi record dovrebbero essere memorizzati nella stessa posizione     In effetti il  problema dell hashing sta proprio nella difficolt   di trovare una legge di trasformazione appropriata  Un altro  esempio di legge  sommare i valori ASCII delle lettere corrispondenti ai cognomi  Anche questa legge genera  posizioni uguali  sapresti dire perch   e valutare se    migliore rispetto alla precedente       Purtroppo     impossibile trovare una legge di trasformazione perfetta    problemi maggiori sono     conflitti di posizione  quando i valori dei campi di due record diversi generano lo stesso indirizzo  nell esempio di   prima tutti gli anagrammi di un cognome generano lo stesso indirizzo  vista la propriet   commutativa della   somma   due tra le due tecniche pi   usate per aggirare questo problema sono o applicare in successione altre   leggi di trasformazione per generare indirizzi diversi o gestire delle vere e proprie aree di    overflow     come  indicato nello schema          Codice   cognome seguente   ROSSI    Somma dei  codici ASCII          Ipotizziamo di dover inserire  per primo il record di ROSSI   la legge di trasformazione  generebbe l indirizzo 400   usato per questo record   l inserimento di SORSI  ri
124. atore  l istruzione if     then     termina dopo il   di istruzioneI le altre due istruzioni sono sempre e comunque eseguite  indipendentemente dall esito del controllo sulla variabile x   In pratica il primo spezzone di codice    equivalente    a quello centrale  sulla destra  invece  la versione corretta     If x gt 2 then If x gt 2 then  Istruzione   Istruzionel   Istruzione2    Istruzione3  Istruzione2   Istruzione3     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      If x gt 2 then  begin  Istruzione    Istruzione2   Istruzione3  end     Pag  32       SELEZIONE A DUE VIE    Rispetto a quella ad una via viene aggiunta la parte da eseguire quando la condizione falsa     if condizione then    if condizione then    if condizione then    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    if condizione then    istruzioneSeVera begin IstruzioneSeVera begin  else Istruzione 1SeVera   else Istruzione  SeVera   istruzioneSeFalsa  Istruzione2SeVera  begin Istruzione2SeVera   se Istruzione  SeFalsa  le  IstruzioneNSeVera  Istruzione2SeFalsa  IstruzioneNSeVera   end da end  else IstruzioneNSeFalsa  else  istruzioneSeFalsa  end  begin  Istruzione  SeFalsa   Istruzione2SeFalsa   ERRORE COMUNE  mettere il   prima dell else  In pascal l   istruzione if     then     else TA  end            considerata indivisibile e  lo sapete  il   serve a separare due istruzioni     Qui sopra sono stati esemplificati tutti i possibili casi che si possono presenta
125. azione di questa funzione sarebbe un vero    mostro    che potrebbe  assomigliare alla seguente     Function menu titolo  string  num_opzioni  integer   sceltal scelta2 scelta3 scelta4      sceltaN  string   integer     dove N rappresenta il massimo numero di scelte utilizzabile  se le opzioni fossero di pi   la situazione non sarebbe  gestibile a meno di modificare il sottoprogramma     Chiamare questa funzione sarebbe veramente una    pena     Immaginiamo infatti di voler chiedere una conferma  all   utente  in questo caso le opzioni sarebbero solo due  s   o no      VEE ZEZIZZZIZ ZZZ ZIZZZZZ  23     scelta  menul  Sei sicuro    2  Si  No     V      anche se le opzioni sono solo due  TUTTI i parametri devono comunque essere sempre indicati  qui si immagina che  quelli inutili siano indicati come stringa nulla         Anche il codice della funzione sarebbe piuttosto pesante ed intricato     Function menu titolo  string  num_opzioni  integer   sceltal scelta2 scelta3 scelta4      sceltaN  string   integer   begin  writeln titolo      e fino a qui          e qui immaginatevi  un po    come nel caso della media  tutta una serie di if     then che a seconda del  numero di opzioni specificato vanno o non vanno a stampare la variabile stringa che corrisponde a  quell   opzione  per semplicit   mi limito solo ad iniziare        writeln    1      sceltal    if num_opzioni gt 1 then  writeln     2         scelta2    if num_opzioni gt 2 then  writeln    3         scelta3    ecc   ED E
126. b  12 div4t  3  14div4t  3   a MOD b Resto intero della divisione tra a e b       Succ  numero      Successore del numero indicato  succ 4    5       Pred  numero      Predecessore del numero indicato  pred 5    4       Dec  numero      Toglie uno a numero  dec 7    6       Dec numero  quantita     Toglie quantit   a numero  dec 12 5    7       Inc  numero      Aggiunge uno a numero  inc 7    8       Inc numero  quantita     Aggiunge quantit   a numero  inc 12 5    17       Abs  numero      Valore assoluto  o modulo  di numero       Sqr x     Quadrato           X       Opposto di x             Possibili errori  overflow e divisione per zero  division by zero            Confronti  predicati       lt   minore    gt   maggiore    lt  gt   diverso    lt    minore od uguale    gt    maggiore od uguale      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  27    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    REALI   ricordare che sono rappresentati nella forma x   mantissa   10    e come in 5 28   10                                       Somma  sottrazione  moltiplicazione  divisione  Sqrt  x  Radice quadrata   Sqr x  Quadrato   Sin x   cos x   tan x   Seno  coseno  tangente  arcotangente di x  arctan x    Abs  x   Valore assoluto  o modulo  di x    X Opposto di x   Trunc x  Tronca la parte frazionare di x   Round x  Arrotondamento di x          Possibili errori  overflow  caratteristica troppo grande per essere rappresentata   underflow
127. begin       la riga che segue abilita alla gestione degli errori e va inserita cos   com    su una riga isolata   se la vostra tastiera non ha le graffe vi ricordo che potete tenere premuto ALT di sinistra e digitare 123 o 125 sul    tastierino numerico con tasto    Bloc Num    del tastierino attivato        I      assign elenco  c prova dat     reset elenco    risposta   ST        if IOResult 0 then  begin  writeln  Il file esiste gia   procedo   SI NO      readIn risposta    close elenco   end     if risposta  SI    then   begin  rewrite elenco    ecc  ecc    close elenco    end     end     Autore  Fabrizio Camuso  camuso  bigfoot com           NOTA  Nel caso volessimo fare un aggiornamento o una lettura  da un file la logica sarebbe semplicemente invertita  se non si  riesce ad aprire il file ci si ferma  se ci si riesce si procede        IOResult fornisce codici numerici diversi a seconda delle  situazioni e volendo essere pi   precisi potremmo usare un case     case IOResult of    Ecco i codici pi   comuni  sequenza completa nell   help in linea  del turbo pascal cercando    run time error codes      2   File not found  3   Path not found  15   Invalid drive number  100   Disk read error  101   Disk write error  102  File not assigned  103  File not open  104  File not open for input  105  File not open for output  150   Disk is write protected  152   Drive not ready  156   Disk seek error  157   Unknown media type  158   Sector Not Found  162   Hardware failure         
128. camuso it  Pag  82    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    2  Stampa dei numeri da B ad A con B gt A  3  Stampa dei multipli di 7 minori di 1000  Controllare che B sia maggiore di A  prima di iniziare     O    O    L A  c lt   7                                        L B I  S c      C lt  C 7                V                B lt  B 1                F    V        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  83    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    I SOTTOPROGRAMMI   riutilizzare per sopravvivere      Se un programmatore professionista dovesse sempre ricominciare da zero nello scrivere i programmi  diventerebbe  presto un     accattone professionista   K  Ad esempio  se tutte le volte che fosse necessario lo stesso calcolo  complesso dovessimo riscrivere le sue istruzioni  i programmi diventerebbero pi   lunghi del necessario  pi   difficili da  leggere  sprecheremmo pi   tempo e rischieremmo ogni volta di commettere errori diversi  e sempre per risolvere lo  stesso problema      Una pericolosa illusione       L utilizzo del    copia incolla    per ricopiare le righe farebbe risparmiare solo fatica ma ci esporrebbe a gravi rischi     Per  convincercene  immaginiamo che le istruzioni siano una cinquantina e di averle copiate incollate pi   volte in diversi  programmi  Cosa accadrebbe se scoprissimo un errore nelle righe copiate cos   tante volte  Dovremmo modificare  tutte le copie delle cin
129. cando per 3600  il numero delle ore          NOTA  non    raro il caso di alunni in difficolt   al momento di individuare i dati in input  Intanto diciamo che non     necessario avere la certezza di averli individuati proprio tutti per poter proseguire     normale  dopo avere individuato  i pi   importanti ed evidenti  iniziare la fase successiva  trovare un  modo  di utilizzare i dati in input per giungere alla  risultato   si ad un certo punto ci si accorge che manca qualche dato per poter proseguire lo si aggiunger    semplicemente ai dati di input        arrivato il momento di descrivere il modo in cui i dati di input devono essere utilizzati per ottenere i risultati  Questa     descrizione       chiamata  algoritmo                Da    Wikipedia     l enciclopedia libera  http   it wikipedia org   con qualche piccolo adattamento        Il termine  algoritmo  deriva dal nome del  grande  matematico arabo Al Khwarizmi    che pubblic     tra gli altri  il libro dal quale prende le origini la parola Algebra  ora sapete chi odiare   Nei suoi libri  ne scrive anche i procedimenti per portare a termine alcuni tipi di calcolo  questi procedimenti  presero il nome di algoritmi     Nella sua definizione pi   semplice ed intuitiva un algoritmo    una sequenza ordinata di passi  semplici che hanno lo scopo di portare a termine un compito pi   complesso  una ricetta da cucina   ad esempio  pu   essere considerata come un algoritmo che partendo da un insieme di singoli  alimenti di ba
130. cco     var  Localita  P1000Blocchi     Ora abbiamo a disposizione il tipo vettore di 1000 puntatori a blocchi di 20 stringhe ciascuno e relativa variabile      inizializzo il vettore di puntatori       for i  1 to 1000 do NIL  Localita i   nil     approfoncimento    E  utile rappresentare graficamente la situazione  solo con i primi elementi del vettore di puntatori      NIL  NIL  localita NIL  NIL  NIL  NIL       chiediamo spazio per due vettori  il primo ed il quinto  senza un motivo particolare  giusto per prova     new  Localita 1      new  Localita 5           approfondimento    Localita  1    localita 1   NIL  NIL  NIL Localita 5    localita 5  CIT TT TT TTT TTT TTT   NIL    Solo due puntatori hanno a questo punto collegati due blocchi  Tutte le caselle dei vettori contengono valori casuali        inizializzo le stringhe dei vettori  ma solo per i puntatori a blocco diversi da nil  ovviamente     for i  1 to 1000 do  if Localita i  lt  gt nil then  for j  1 to 20 do  Localita i    j         Ora tutte le caselle dei vettori contengono la stringa nulla  Notate il controllo if localita i  lt  gt NIL che seleziona solo gli  elementi del vettore di puntatori che hanno collegato veramente un vettore di stringhe  il primo ed il quinto  elemento  nel nostro caso      approfondimento    12 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso  it      Allocazione dinamica della memoria versione 2 5 Luglio 2003    Localita    il nome di un vettore  Localitali  ac
131. cede all   i mo elemento di quel vettore  un puntatore   Localita i     accede all elemento puntato che    a sua volta un vettore di stringhe  Localita i     j     il j mo elemento di questo  vettore  cio   la j ma delle 20 stringhe di quel vettore  Vi gira la testa        memorizzo una stringa nel quarto elemento del primo vettore     Localita 1     4    le cose si complicano             ed una nel terzo elemento del quinto vettore       Localita 5    3    ma non piu  di tanto      Localita 1     Localita 1 A 4   localita 1        NIL i  niL Localita 5      Localita 5   3         localita 5     writeln                                   writeln  Stringhe nel vettore n  1      writeln                                   for i  1 to 20 do   writeln   Localita 1    i      readin     writeln                                  writeln  Stringhe nel vettore n  5      writeln                                     for i  1 to 20 do  writeln  Localita 5   i        readin      deallochiamo i vettori di stringhe       for i  1 to 1000 do  if localita i  lt  gt nil then       begin  dispose localita i     localita i   nil  end  end     Notate   di nuovo  il controllo sul puntatore a NIL prima di deallocare  Deallocare con dispose un puntatore a NIL     un GRAVE errore e di solito porta al crash del programma           Rifletti              Quanta memoria pu   far risparmiare la gestione dinamica  A volte moltissima   Se ad esempio si scoprisse che  mediamente solo met   delle stringhe sono nec
132. chiederebbe di usare lo  stesso indirizzo  trovandolo gi    occupato si memorizza il                                           Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  137    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    nuovo record in un area speciale  di overflow  cio   di traboccamento  che inizia all indirizzo 1200  valore scelto a  caso   il 1200 viene memorizzato nel record di ROSSI per poter ritrovare in un secondo momento all area di  overflow  Per memorizzare RISSO si trova  ovviamente  gi   occupata la solita posizione 400  Si rileva  grazie al  1200 memorizzato prima  che esiste gi   un area di owerflow  Quest ultima viene fatta scorrere fino a supeare  l ultimo record che condivide con tutti gli altri lo stesso valore generato dalla legge di trasformazione  Se c     ancora spazio viene aggiunto in coda il record di RISSO  Dovendo reperire le informazioni di RISSO sar    necessario scorrere l area di overflow vanificando in parte il vantaggio dell hashing  ma se le aree di overflow  non sono esasperate    possibile ancora un notevole guadagno nei tempi complessivi     distribuzione ottimale dei valori generati  immaginando di non ammettere omonimie  come potrebbe accadere  per la descrizione dei prodotti in un magazzino  non    difficile inventarsi una legge di trasformazione hash che  non causa conflitti  considerate questo algoritmo  facciamo corrispondere ogni lettera del cognome a numeri  primi crescenti 
133. cia  il ciclo termina  e si provvede a scrivere il totale calcolato     Torneremo presto a parlare dei diagrammi di flusso  Infatti questo strumento mantiene  la sua validit   anche quando introdurremo linguaggi di programmazione pi   potenti ed  espressivi dell assembly     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  16    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004      linguaggi assembly sono  infatti  ancora troppo scomodi e soffrono  in fondo  ancora di tutti i problemi elencati per  il linguaggio macchina  hanno reso solo un poco pi   lieve la vita al programmatore  ma sono ancora molto legati alla  CPU usata  Il passaggio successivo    stato lo sviluppo di linguaggi ancora pi   lontani dal linguaggio macchina e  di  conseguenza  pi   vicini al nostro modo di esprimerci  Sono nati i  linguaggi ad alto livello  Questi sono  caratterizzati da istruzioni molto potenti  con descrizioni facili da ricordare  che corrispondono anche a centinaia di  semplici istruzioni in linguaggio macchina o assembly              Program somma  Ed ecco qui a lato la versione dello stesso algoritmo codificata con il    var totale  dato  integer  Lan di programmazione Pascal  per l esattezza il suo     dialetto    Turbo  ascal    begin  gt  DE      totale   0  E molto leggibile  compatto  Dopo un intestazione che assegna un nome al  programma  il programmatore dichiara i simboli che vorr   utilizzare  repeat indicando anche che sono dei numeri
134. cissime  ma lo facesse ad una velocit   incredibile  costruendo palazzi meravigliosi  ma solo se  qualcuno lo guida passo passo  il programma      Qualcuno ha infatti definito il computer uno stupido molto veloce      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  12    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    RAPPRESENTAZIONE INTERNA DELLE INFORMAZIONI    Rimane da sciogliere ancora un nodo importante  come sono rappresentate le informazioni  nella RAM e nei registri   E le istruzioni   Essenzialmente devono essere trattati numeri e  caratteri  Le prime macchine calcolatrici  attenzione  non sto ancora parlando di computer  elettronici   erano grandi grovigli di ingranaggi  pur costruite con una precisione  ammirabile  gli attriti ed i tempi di funzionamento di tutte queste parti meccaniche  costituivano un limite serio per la velocit   di elaborazione     Mentre un ingranaggio impiega un certo tempo per funzionare  un segnale elettrico va alla velocit   della luce   300 000 Km al secondo    Come dire  pi   di sette volte il giro della terra in un secondo   Sono stati ideati dei  dispositivi  circuiti elettronici  in grado sfruttare i segnali elettrici per rappresentare le informazioni ed elaborarle  Si     anche capito che il miglior modo di procedere sarebbe stato quello di rappresentare tutto sotto forma di numeri  binari  Cerchiamo di arrivare a questa conclusione per gradi       segnali elettrici non sono perfetti  
135. co dei dati             NOTA BENE  Tutte le operazioni di lettura  scrittura spostano sempre il puntatore in avanti di una    posizione     una  riga per i file di testo  una scheda per i file tipizzati  verso la fine del file  EOF  End Of File            Dopo la creazione siamo all   inizio  ma anche alla fine  file    vuoto   e quindi pronti per aggiungere  nuovi blocchi di dati  Ad ogni inserimento di una riga  scheda la posizione viene spostata  automaticamente oltre la fine del file e si    pronti per aggiungere un nuovo blocco di dati     Dopo aver letto una riga  scheda  se il file gi   ne contiene  la posizione si sposta automaticamente in  avanti e si    pronti per leggere la successiva     Aggiornamento  QUESTA OPERAZIONE E    POSSI BI LE SOLO PER I FILE TI PIZZATI         Il file deve esistere e deve essere prima aperto con reset  si deve localizzare la scheda  record  da aggiornare cio    posizionarsi in corrispondenza del punto a partire dal quale    necessario sovrascrivere le vecchie informazioni con  quelle nuove     Poi si legge la vecchia scheda  per due motivi     e recuperare quelle informazioni della scheda che non devono cambiare per poterle riscrivere uguali al  momento della riscrittura della scheda  diversamente dovremmo costringere chi usa il programma a  reinserirle  improponibile   ad esempio in una scheda anagrafica potrebbe cambiare solo l indirizzo  la  lettura della vecchia scheda recupera tutte le altre informazioni  cognome  nome  codice  ecc
136. con un end  Un   ultima particolarit    prima dell   else di un case paghetta  20   deve essere messo un punto e virgola perch   altrimenti potrebbe essere confuso con la parte else  else di un if then else inserito nell ultimo caso    Infatti nell esempio qui sulla destra senza il writeln    Vai a lavorare    punto e virgola dopo il 20      else che dovrebbe essere eseguito quando il soggetto ha pi   di 18 end   anni  caso pigliatutto    del case  verrebbe invece erroneamente associato con l   if che controlla    le multe     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  35    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ESERCIZI E RIEPILOGATIVI SULLA SELEZIONE             SELI  difficolt    bassa  Inserita un   et   dire se siamo in presenza di un minorenne o maggiorenne        Program maggiorenni 1   uses  newdelay  crt   var  eta  integer     variabile in cui verra  memorizzata l eta         NOTA  non usare mai le lettere accentate per i  nomi delle variabili         begin  clrscr     cancello lo schermo       write  Quanti hanni hai    gt       readln  eta      if eta gt  18 then  writeln  OK  vedo che sei maggiorenne        else  writeln  Sei ancora un poppante  torna tra    18   eta   anni          writeln  Programma terminato  Premere INVIO per continuare        readin     per dare il tempo di leggere il messaggio          problemi aperti  cosa succede se chi usa il programma sbaglia ed inserisce  un eta  negativa o 
137. conferma  S   then  begin  rewrite dati    ultimo_codice  0  end  end   writeln  Fatto   INVIO per continuare     readin  end   2 begin    inserimento     inc ultimo_codice    with unaPersona do  begin  codice  ultimo_codice   write  Inserire cognome       readin cognome    attivo  true  end   reset dati    seek dati  FileSize dati       append         write dati unaPersona    close dati   end   3 begin    ricerca     if ultimo_codice gt 0 then  begin  write  Inserire il codice che interessa     readIn unCodice    if unCodice lt  ultimo_codice then  begin  reset dati    seek dati unCodice 1      i record sono numerati a partire da 0     read dati unaPersona    if unaPersona attivo then    salto i cancellati         writeln unaPersona codice      unaPersona cognome   else  writeln  Nominativo cancellato    end  else  writeln  Ci sono solo   ultimo_codice   nominativi    end  else  writeln  File Vuoto       writeln  INVIO per continuare    readin     end   4 begin    modifica     if ultimo_codice gt 0 then  begin  write  Inserire il codice che interessa     readIn unCodice    if unCodice lt  ultimo_codice then  begin  reset dati    seek dati unCodice 1      i record sono numerati a partire da 0     read dati  unaPersona    if unaPersona attivo then    salto i cancellati           Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 10 di 177       Ricorsione     versione 2 02   Febbraio 2005    begin  writeln  Vecchi dati    unaPersona codice       unaPersona cognome    write  
138. costruire  digitali  cos   sono chiamati i circuiti in grado di trattare segnali di due tipi  per  confrontarli e combinarli  Purtroppo non    possibile neanche accennare alla realizzazione dei circuiti digitali  Vi basti  sapere che    relativamente semplice costruire circuiti per memorizzare  sommare  sottrarre  moltiplicare  dividere   confrontare ecc  due numeri binari  Questo perch   le regole dell aritmetica binaria  come si fanno le somme   sottrazioni  moltiplicazioni ecc   sono addirittura pi   semplici di quelle che usiamo noi con la nostra aritmetica  decimale  le cifre dallo 0 al 9    Beh  avete un intero corso di elettronica per togliervi certe voglie     Il sistema binario    equivalente a quello decimale  come dire che ogni numero espresso con la nostra  notazione decimale    esprimibile anche in binario ed in modo biunivoco  Il termine significa che  dato  un qualsiasi numero espresso in decimale  lo si pu   convertire ottenendo un numero in forma binaria   viceversa se si parte da questo numero binario e lo si converte in decimale  si ritorna al numero di  partenza  Questo    molto importante  significa poter continuare per noi a fornire dati in decimale  all elaboratore  Questi saranno convertiti in binario ed elaborati  Il risultato sar   di nuovo  per noi   convertito in binario  con la certezza di non commettere equivoci  Equivalentemente  significa che  tutte le operazioni matematiche possibili in decimale lo sono anche in binario e che se una certa  ope
139. descritto nella sezione introdotta dalla parola riservata const  abbreviazione di constant   costante  deve anche essere indicato dopo il simbolo dell uguaglianza     il suo valore che non potr   mai variare  durante l esecuzione del programma  Ad esempio il valore del pi greco pu   essere introdotto in un programma in  questo modo              Nel resto del programma invece di essere costretti a ricordare questa scomoda    Program geometria  sequenza di cifre decimali sar   possibile utilizzare la costante PI_GRECO     const    PI_GRECO   3 14159265  Nota     abitudine dei programmatori usare le maiuscole per gli identificatori che    rappresentano una costante     In un programma possono essere introdotte tutte le costanti che si vogliono  Il tipo del dato  un numero reale  real in  Pascal  per una costante viene dedotto dal valore posto dopo il simbolo dell uguaglianza  Ecco alcuni altri esempi di  costanti     GIORNI_SETTIMANA   7  esempio di costante di tipo intero  integer in Pascal     RISPOSTA_AFFERMATIVA    S   esempio di costante di tipo carattere  gli apici sono obbligatori        MESSAGGIO_ERRORE      Sbagliato         esempio di costante di tipo stringa  sequenza di caratteri racchiusi tra apici   string in Pascal     Vantaggi dell uso delle costanti   e aumentano la leggibilit   di un programma     pi   facile riconoscere nomi simbolici che numeri complessi   e aumentano la flessibilit   di un programma  se vi    la necessit   di cambiare il valore associato ad 
140. e     sicuro che un sottoprogramma neanche per errore potr   modificare il valore di un parametro attuale     Esistono comunque dei vincoli tra i parametri indicati ne la scrittura del codice di un sottoprogramma  chiamati  parametri formali  e quelli che il programmatore utilizza nel programma principale quando intende usare il  sottoprogramma  chiamati parametri attuali      per ogni parametro formale deve essere indicato al momento dell utilizzo del sottoprogramma un corrispondente  parametro attuale  riferendoci all esempio della procedura asterischi  non    ammesso il suo utilizzo specificando solo  il numero delle righe o solo i singoli da utilizzare  non ha ovviamente senso anche cercare di usare pi   parametri  attuali di quelli previsti     il parametro attuale dev essere dello stesso tipo del parametro formale o almeno compatibile  il parametro formale  quanteRighe della procedura asterischi    di tipo integer  per cui  richiamandola  come primo parametro attuale  potremo solo indicare o una costante integer o una variabile integer o una qualsivoglia espressione che restituisca un  valore integer     se un parametro formale fosse di tipo real allora il corrispondente parametro attuale potrebbe essere al limite anche  un integer visto che quest ultimo tipo di dato    compatibile con il real  ad esempio il 5  integer  verrebbe convertito  nel real 5 0   il contrario non sarebbe invece possibile  in quanto il numero di byte necessario a rappresentare un real     maggio
141. e da  l   prelevati man mano che l applicazione ne fa richiesta  in modo da non effettuare inutili letture fisiche dei supporti   in quanto probabilmente a pi   richieste di lettura di dati da parte dell applicazione corrisponder   una sola lettura di  dati dal disco al buffer   Similmente i dati da registrare su file sono prima accumulati in un buffer di scrittura fino al  riempimento di quest ultimo e solo al raggiungimento di questa situazione vengono fisicamente scritti sul disco   evitando in questo modo che ad ogni richiesta di scrittura da parte dell applicazione avvenga una dispendiosa  scrittura fisica sul disco   Ogni dispositivo ha poi particolarit   legate alla sua natura  un hard disk pu   essere formato  da pi   piatti ed il relativo drive avere molte testine di lettura scrittura  un floppy ha invece un solo piatto  un film  flessibile e sottile come un capello a forma di cerchio  ed una sola coppia di testine     Riassumendo  la logica di controllo di questi dispositivi    assai diversificata  sia perch   l accoppiata supporto e relativo  drive    formata da dispositivi elettromeccanici diversi  sia perch   diverse sono le tecniche con cui si pu   decidere di  usarli per disporre dello spazio di memorizzazione  quante tracce gestire sul floppy  come organizzare la spirale di bit  su di un CD       Agli albori dell informatica la gestione dei supporti era sotto la completa responsabilit   dei programmatori  costretti a  confrontarsi direttamente con l hardware  
142. e i dati di cui abbiamo bisogno sono  costo di un litro di carburante  numero  di chilometri tra la casa e la scuola  numero di chilometri che il mezzo utilizzato compie con un litro di carburante   costo di eventuali pedaggi     Per queste semplici situazioni uno schema come quello appena visto    esagerato  Ci accontenteremo di elencare i    cosiddetti dati in ingresso  input   il programma li elabora  processing  per produrre i risultati  i dati in uscita   output      ELABORAZIONE OUTPUT    costo di un litro di carburante    costo di un litro di carburante    hilometri tr     chilometri tra casa e scuola  paee a Elaborazione svolta dal  chilometri   litro del mezzo programma chilometri   litro del mezzo    costo di eventuali pedaggi     costo di eventuali pedaggi        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  4    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Deve essere molto chiara una cosa  per dati in input si intendono quelli indispensabili  quelli cio   che il computer  non pu   calcolare o derivare in altro modo  Facciamo un esempio  se ad un certo punto in un programma abbiamo  disposizione una quantit   espressa in ore e per proseguire    necessario esprimerla i secondi  non cediamo alla  pigrizia chiedendo a chi sta usando il programma di inserire questo valore usando la tastiera  pretendendo che sia lui  a fare la conversione  Sar   invece il programma a calcolare autonomamente il valore richiesto moltipli
143. e modificare il  programma  ad esempio memorizzando i nomi e le posizioni fisiche dei file su un file a parte  questo s   fisso  che  viene letto all   inizio del programma e con il cui contenuto vengono inizializzati tutti i nomi di file logici che si  intendono usare      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  138    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004   Prima di poter usare un nome logico  che poi altro non    che una variabile di tipo speciale     necessario indicare a  quale file fisico lo si vuole far corrispondere   FILE DI TESTO  Seguendo l esempio di prima si vuole fa corrispondere il nome logico lettera al file fisico  C  dati 2002 lettere clienti milano ecc  lettera doc  Si ricorre alla procedura standard Assign    Assign   lt variabile di tipo file gt     lt nome fisico del file gt     Applichiamola al nostro esempio    var lettera  text     lettera    il nome logico  il tipo text indica che si tratta di un file di testo       Assign lettera     C   dati 2002 lettere clienti milano ecc  lettera doc      Ora  e non prima     possibile comandare le altre operazioni           Possiamo rendere il nostro programma in grado di funzionare con diversi file fisici senza essere costretti a modificare  il suo codice     sufficiente indicare nell   assign una variabile stringa come nome fisico del file     var lettera  text  nomerfisico  string   writeln    Con quale file vuoi lavorare        readin nomerisico  
144. e salviamo il risultato in al e a2     al  bl h    a2    b2 h2        poi usiamo al e a2 per i confronti     if al gt a2 then  writeln  Il primo rettangolo ha la superficie maggiore    else  if al lt a2 then  writeln  Il secondo rettangolo ha la superficie maggiore    else  writeln  I due rettangoli hanno la stessa superficie          commenti  questa seconda soluzione usa due variabili in pi   per   ha il  grosso pregio di non far ripetere il calcolo delle aree  inoltre  permetterebbe di usare i valori delle aree anche in una ipotetica  continuazione del programma  rende anche pi   semplice comprendere  quello che si sta facendo       writeln  Programma terminato  Premere INVIO per continuare          readin     per dare il tempo di leggere il messaggio       end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  41    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SEL7  difficolt    media  Inserita un et     dire se siamo in presenza di un maggiorenne o di un  minorenne  controllare anche eventuali errori di inserimento da parte dell utente          program maggiorenni2   uses newdelay  crt   var  eta  integer     variabile in cui verra  memorizzata l eta  NOTA  non usare mai le lettere accentate per i  nomi delle variabili       begin  clrscr     cancello lo schermo          rispetto alla soluzione dell esercizio maggior pas indichiamo nella richiesta dell eta  anche l intervallo accettato  da  0 anni  neonato  a 120  
145. e si tratta della variabile di controllo del  ciclo for           Torneremo presto su questo argomento     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  89    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Parametri per valore  by value     program esempio   var numero  integer  simboli  string     procedure asterischi quanteRighe  integer  riga  string     pap Qui a lato trovate una versione potenziata della  var i  integer     procedura esaminata in precedenza  Chi la usa non       pai to quanteftighe do pi   limitato ad una riga di asterischi ma pu    writeln  a  9 scegliere  specificandolo come secondo parametro   end    la riga di caratteri da usare   r  begin Quando ce n    pi   d uno  i parametri devono essere  writeln     quante righe di   devo stampare  4   separati con un punto e virgola e per ciascuno deve  readin  numero    essere specificato il tipo corrispondente   writeln     che simboli uso per la stampa        NOTATE  mentre quando scriviamo il testo del  readin  simboli   sottoprogramma gli eventuali parametri devono    essere separati con un punto e virgola  quando    qa invece il sottoprogramma viene usato i valori o le  asterischi  numero  Yimboli    variabili che corrispondono ai parametri previsti    readin     d vengono invece separati con una virgola   end     program esempio   var numl  num2  integer   La funzione qui a lato restituisce il pi   grande dei    function max a b  integer    integer  due v
146. e_scelta  end     procedure visualizza_file var f  fDati    var persona  TPersona   begin   reset f      if ioResult 0 then    se riesco ad aprirlo significa che non    vuoto         begin     leggiamo tutti i record fino alla fine     while not eof f  do  begin  read f persona    if persona attivo then    salto i cancellati         writeln persona codice       persona cognome   end   close f   end  end     begin    PROGRAMMA PRINCIPALE        clrscr      nomerFile   c  anagrafe dat    assign dati nomefile    ultimo_codice  0     if esiste dati  then   begin  reset dati    ultimo_codice  filesize dati      filesize restituisce il n  di record      end   else   begin  rewrite dati    ultimo_codice  0   end    close dati         preparo le voci del menu prima di usarlo     menu_database 1    1   Azzera archivio    menu_database 2    2   Inserimento nuovi nominativi    menu_database 3    3   Ricerca dati per codice    menu_database 4    4   Modifica dati    menu_database 5    5   Elimina nominativo    menu_database 6    6   Visualizza Archivio    menu_database  7    7   Fine Operazioni      Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 9 di 177       Ricorsione     versione 2 02   Febbraio 2005    repeat  scelta  menu menu_database 7  Gestione Nominativi     case scelta of  l begin    azzeramento     if ultimo_codice gt 0 then  begin  writeln  Attualmente sono inseriti   ultimo_codice    nominativi  confermi distruzione   s n      readln conferma    if  conferma  s   or  
147. el simbolo di puntatore     con vettori o record  Ecco una rassegna di casi     TYPE  p   string     vett   array 1  10  of p     rec record  codice  integer   pun  p   end     vetRec array 1  10  of rec   recVet record    codice  integer   v  array 1  10  of p    end    VAR  vpun  vett   unRec  rec     vrec  vetRec   unRecVet  recVet     14 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      I record con il Turbo Pascal versione 1 3 Luglio 2003    SI     new  vpun 3     SI   vpun 3      ciao     NO  new vpun   NO  vpun    3    ciao    giusto se vpun fosse un puntatore a vettore di stringhe e non un vettore di puntatori        SI     new unRec pun   Sl     unRec pun     ciao      NO  unRec  pun   ciao      giusto se unRec fosse un puntatore ad un record contenente una stringa pun        SI     new  vrec 2  pun    SI     vrec 2  pun     ciao      SI     new  unRecvVet v 2    SI     unRecVet v 2      ciao      In generale    sufficiente ricordarsi di indicare il simbolo di puntatore     dopo il nome del puntatore  con la    particolarit   che v i  e non v       il nome del puntatore quando    v       un vettore   LI STE SEMPLI CI    Pur con i vantaggi visti  un limite alle stringhe gestibili nell esempio precedente esiste comunque  ventimila  Vediamo  di superarlo  Realizzeremo una concatenazione di elementi  lista  che potr   essere espansa senza limiti  RAM  permettendo      testa della lista       info     info  4 finfo   pinfo  1NIL coda della list
148. ell   array come in voti 1   voti 2  ecc     Ecco come si dichiara in Pascal una variabile array adatta a contenere 32 interi     var    NOTA  sarebbe meglio mettere una costante invece del 32   voti  array 1    32  of integer      array 1    NUM_ALU  of integer       Per poter passare gli array ai sottoprogrammi    per   meglio abituarsi fin da subito a dichiarare prima un nuovo tipo  di dati e solo dopo le variabili di quel tipo     NOTA  la sezione type deve essere scritta prima della sezione var    type  vet_int   array 1    32  of integer     vet_int sta per    vettore di interi          var  voti  vet_int     OSSERVAZIONI    e Quando si dichiara un tipo non si usano i due punti ma l   uguale        array          e Nella sezione var    poi possibile dichiarare tutte le variabili di quel tipo che si vogliono  tutte  corrisponderanno a contenitori per 32 interi    Voti    di tipo vet_int  cio   un array 1I    32  of integer  esattamente come prima  Anche un parametro di un  sottoprogramma potr   essere dichiarato di tipo vet_int  la dicitura array 1   32  of integer non sarebbe infatti  accettata come tipo di un parametro      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  114       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Una volta specificata la posizione tra parentesi quadre la scrittura indica esattamente una variabile del tipo contenuto  nel vettore  Detto con altre parole  vet 7      a tutti gli effetti  una var
149. emere INVIO per continuare        readIn     per dare il tempo di leggere il messaggio       end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  42    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SEL 8  difficolt    media  Letto un carattere  dire se corrisponde ad una lettera maiuscola e se s    dire se e  una consonante od una vocale        program maiuscola    var  c  char    begin  write  Inserire un carattere   gt       readln  c         PRIMA SOLUZIONE  SENZA CASE          se il codice ASCII del carattere letto e  compreso tra quelli di A e Z  allora si tratta di una maiuscola          writeln  SENZA  CASE           if   ord c  gt  ord  A     and   ord c  lt  ord  Z     then    begin  writeln  Hai inserito una maiuscola          vediamo ora se c e  uguale ad una delle vocali     if  c  A     or  c  E   or  c T  or  c  O   or  c  U   then  writeln      ed e  una vocale    else  writeln      ed e  una consonante    end  else  writeln  Non si tratta di una maiuscola          POI SOLUZIONE CON CASE     writeln  CON  CASE               il case piu  esterno ne contiene interamente un altro in un suo caso     case ord c  of  ord  A    ord  Z          significa dal valore    al valore     begin  writeln  Hai inserito una maiuscola          questo case e  contenuto nel primo caso di quello piu  esterno     case c of   A   E  T  O   U   writeln      ed e  una vocale     else  writeln      ed e  una consonante    end     
150. emplice   Si ragiona cos    qual    il caso pi   semplice di calcolo del fattoriale  Quando N    0  infatti  possiamo subito affermare senza bisogno di fare calcoli che il risultato    1  E se dobbiamo calcolare Fatt 4   Il  risultato immediato non lo possiamo calcolare ma possiamo dire che    4   Fatt 3    Infatti Fatt 3  3 2 1 e quindi  4 Fatt 3  equivale a 4   3 2 1  il calcolo di partenza                 Abbiamo allora ricondotto un caso pi   complesso  Fatt 4   al calcolo di un caso pi   semplice  Fatt 3   Come dire   non so calcolare direttamente Fatt 4  ma se riesco a calcolare Fatt 3  risalgo attraverso una moltiplicazione a Fatt 4    Fatt 3     ancora troppo    difficile    da calcolare ma lo si riconduce a Fatt 2   Fatt 3    3   Fatt 2   Fatt 2    2    Fatt 1   Fatt 1    1   Fatt 0   Ma Fatt 0  so che vale uno senza bisogno di ricalcolare nessun altro fattoriale  ho  raggiunto il caso base  la base della ricorsione che termina la catena delle chiamate ricorsive     function Fatt N  integer   real     Schematicamente ui  _ egin  LIENT if N 0 then  Fatt  1  else  Fatt   N   Fatt N 1   Fatt N    end     NOTA  come valore restituito ho scelto un real in quanto il  N   Fatt N 1  se N gt 0 calcolo del fattoriale molto rapidamente porta al  superamento della capacit   di una variabile integer        4 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Allocazione dinamica della memoria versione 2 5 Luglio 2003             Esempio 2  calcolo di x 
151. end   else  writeln  Non si tratta di una maiuscola     end   readin   end     Ricordo che la funzione ord c   dove c    un carattere  restituisce il codice ASCII di quest   ultimo  Controllare che    ord c  sia compreso tra ord    A     e ord    Z     significa controllare che il codice ASCII del carattere c sia compreso tra  quello della prima e dell   ultima lettera maiuscola e  in definitiva  che c contenga una lettere maiuscola     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  43    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SEL 9  difficolt    media  Disegna il diagramma di flusso e scrivi un programma che  letti tre numeri  li metta in  ordine crescente       program ordina_tre   var a b c temp  integer     begin  write  Inserire il primo numero   gt         readin  a      write  Inserire il secondo numero   gt       readln b      write  Inserire il terzo numero   gt       readIn c         e  necessario assicurarsi che tre numeri siano in ordine          prima ordina a e b tra loro    b lt a  if b lt a then  begin  temp  a   a  b   b  temp  end        poi metti c al posto giusto         if c lt a then  begin  temp  a   a  c   c  b   b  temp  end  else KN  if c lt b then    2 DON COD  o a b a b c  c  temp  end     c lt a       writeln  a     b     c   premere INVIO per continuare       readin     end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  44          Gestione Archivi 
152. ent  ambienti integrati di sviluppo      I file dei codici sorgenti vengono registrati sul disco con un estensione  la parte del nome del file dopo il punto  che    aiuta a riconoscere il linguaggio di programmazione utilizzato  Ecco le principali estensioni   pas  Pascal    c  C    cpp   c       asm  assembly    asp  ASP    bas  Basic      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  19    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004                Il  compilatore trasforma il codice sorgente nel cosiddetto codice oggetto   object code   ma questo processo di  traduzione potrebbe interrompersi per vari motivi        e viene scoperto un simbolo che non appartiene al cosiddetto dizionario delle parole chiave  keyword  proprie  del linguaggio e neppure all insieme dei simboli aggiunti dal programmatore  ad esempio se il linguaggio  prevede un comando write per scrivere qualche cosa sullo schermo  il programmatore potrebbe sbagliare e  scrivere wrote  questa parola viene non verrebbe riconosciuta come appartenente al linguaggio  viene allora  cercata nell insieme degli simboli  si parla pi   correttamente di identificatori  introdotti dal programmatore   quest ultimo potrebbe aver dichiarato di voler usare un simbolo chiamato area per memorizzare un valore con  la virgola in cui far calcolare la superficie del cerchio     area    raggio   raggio   3 14  dai al simbolo area il valore della formula indicata    significa moltiplicat
153. enti usati del vettore    sensibilmente inferiore al massimo   Decidere invece di  memorizzare i dati su disco farebbe crollare le prestazioni     Naturalmente non saremo sempre cos      sfortunati     i mesi di un anno sono sempre dodici  ed i giorni al massimo  366  gli alunni di una classe difficilmente supereranno i quaranta  ecc  Diciamo che il problema    particolarmente  evidente in quelle situazioni in cui il programmatore non pu   fare una stima esatta o quasi delle necessit       Pensate  ad esempio  al gioco degli scacchi     impossibile prevedere quante    mosse    durer   la partita  Quanti  elementi dovr   allora avere il vettore che memorizza le mosse  Se poi volessimo impostare un livello di gioco  difficile il computer dovr   allora valutare molte posizioni per ogni mossa  Ma qualcuno preferir   un livello di gioco  per principianti  Alcuni software permettono addirittura di giocare pi   partite in contemporanea  Quanta memoria  RAM serve  quind i per far funzionare il programma  Che cosa dovrebbe dichiarare il programmatore nella sezione  VAR     Lo spazio allocato staticamente in RAM non pu   essere  modificato  aumentato o diminuito  durante l esecuzione del  programma              LIMITE 2       Immaginate ora di avere un elenco di nomi in un vettore e di averlo ordinato alfabeticamente  operazione    costosa       Immaginiamo anche che il vettore abbia dei    posti liberi    in fondo  Ogni ulteriore inserimento rappresenta  un operazione piuttosto oneros
154. ento del perforatore o del lettore  oppure invertire la posizione di due schede ecc    la realizzazione e la  manutenzione di un programma non era pane per i denti di tutti     e bisognava diventare esperti  in materia di programmazione non sono ammesse mezze misure  di quel  particolare linguaggio riconosciuto dalla CPU usata  fatto di intricate sequenze di zeri e di uno  provate ad  immaginare la fatica di trovare un piccolo errore in una lista di centinaia di migliaia di codici binari    e bisognava essere esperti di aritmetica binaria  visto che tutto    espresso in quella forma     e dato che le istruzioni sono cos   a basso livello  vicino all hardware  era necessario conoscere alla perfezione  anche quest ultimo  se cambia l hardware i programmi dovevano essere pesantemente modificati  se cambiava  il microprocessore  la CPU   e con esso l insieme delle istruzioni accettate  l intero programma andava riscritto     Per tutti questi motivi era difficile trovare buoni programmatori e lo sviluppo del software era costoso e lento   Nonostante queste difficolt   i primi abbozzi di sistemi operativi e le prime applicazioni sono stati scritti proprio cos        direttamente linguaggio macchina     Si parla di linguaggio perch   come ogni linguaggio parlato ha un suo vocabolario di    parole     l insieme dei codici delle  istruzioni che si possono usare  ed una sua sintassi  cio   le regole con cui si possono formare le    frasi     le istruzioni e  le sequenze di istruzioni  
155. ento trovato  possiamo procedere  for i  1 to N do     if vettore i    cercato then  posizione  i  Se nel vettore l elemento cercato appare pi   volte  il ciclo for  localizza l   ultimo  comunque la scansione arriva ad N   per  localizzare il primo    necessario controllare    manualmente    la  ricerca usando un ciclo repeat  come mostrato pi   avanti        function cerca_vettore vet  vettore_interi  N  integer  cercato  integer  integer   var posizione  integer   begin   posizione  0     for i  1 to N do  if vet i    cercato then  posizione   i     cerca_vettore  posizione  end     Ed ecco la soluzione con il repeat  nel caso si voglia il primo elemento uguale a quello che si sta cercando  Questa  soluzione pu   essere anche molto pi   efficiente di quella con il for  Ad esempio se gli elementi del vettore fossero  diecimila e quello che si sta cercando fosse nella quarta posizione  il ciclo for andrebbe inutilmente a controllare gli  altri 9996  mentre il ciclo repeat si fermerebbe al quarto     posizione  0  i  0   function cerca_vettore vet  vettore_interi  N  integer  cercato  integer  integer     repeat var posizione i  integer   i i 1  begin  if vettore i    cercato then posizione  0  i  0   posizione  i    until  i N  or  posizione lt  gt 0   repeat  i  1     if vettore i    cercato then  posizione  i  until  i N  or  posizione lt  gt 0      cerca_vettore  posizione  end        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  123    G
156. ersione 2 02   Febbraio 2005    In entrambi gli esempi chi usa il programma comunica che le righe da aggiungere sul file di testo sono terminate  digitando la stringa    FINE        FILE TIPIZZATI    E    molto importante notare che una scheda  record  viene letta scritta tutta insieme  non un campo alla volta  Per le  operazioni deve essere dichiarata una variabile record dello stesso tipo delle schede che si vogliono leggere  scrivere        Per aggiungere una scheda dovremo prima memorizzare i dati nella variabile record e poi comandare la registrazione  di quest ultima nel file tipizzato     L istruzione che materialmente aggiunge la scheda    write nome_file_logico  variabile record_con_dati      Dopo ogni write sul file  il punto di inserimento    automaticamente fatto avanzare        File creato e scritto immediatamente       type    TPersona record  cognome  string 30       30   ricordatevi il numero di caratteri      codice  integer    end     var  elenco  file of TPersona     la variabile file  si sarebbe anche potuto definire prima un tipo    file of TPersona        unaPersona  TPersona     begin  assign elenco  c  prova dat           crea il file azzerandolo  pronto per la prima scheda     rewrite elenco      repeat  writeln  Inserimento da tastiera di un record da trasferire poi sul file       write  Inserire un codice   zero per finire       readin unaPersona codice    write  Inserire un cognome         readin unaPersona cognome      if unaPersona codice lt  gt 
157. essarie  la gestione statica staticamente userebbe sempre e comunque  1 000 000 di byte  20 000 stringhe x 50 caratteri  mentre quella dinamica circa la met    520 000  2 byte a puntatore  x 1000 puntatori   10 000 stringhe x 50 caratteri        Risparmi a parte la gestione dinamica restituisce memoria nei momenti in cui non serve e migliora le prestazioni del  sistema operativo e  quindi  dell elaboratore              QUI TERMI NA L   APPROFONDI MENTO     13 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso  it      approfoncimento    approfondimento    approfondimento    Allocazione dinamica della memoria versione 2 5 Luglio 2003    Gli errori pi   comuni       e Usare un puntatore prima di averlo    agganciato    con l istruzione new ad un blocco di memoria valido    e Usare un puntatore dimenticandosi il simbolo di puntatore       se p    un puntatore ad un intero   new p    SI   p  3  NO  p    3  e Usare un puntatore dopo averlo    sganciato    con l istruzione dispose dal blocco di memoria cui puntava   se p    un puntatore ad un intero   new p    p   3   dispose p   ora p non punta pi   a nulla e non    pi   utilizzabile  writeln  p     NO    p non ha pi   significato  l area di memoria cui puntava    stata restituita con dispose al sistema  operativo che potrebbe utilizzarla per altri scopi  usare l indirizzo non pi   valido contenuto in p potrebbe  portare a conseguenze anche molto gravi per la stabilit   del sistema     e Sbagliare la posizione d
158. estione Archivi Tradizionali   versione 3 1 Settembre 2004    7  Ordinamento dei valori in un vettore di N elementi  con N  lt  MAX_ELEMENTI  METODO PER SCAMBIO   BUBBLE SORT    Quello che sto per presentare    un metodo non molto efficiente quando il numero degli elementi supera il centinaio   ma ha il pregio di essere breve  relativamente semplice ed abbastanza facile da ricordare  Appartiene alla famiglia  degli algoritmi di ordinamento  SORT  detti per scambio perch   adotta una scansione sistematica che confronta     ciecamente    tutti gli elementi e scambia quelli fuori posto tra loro  Lo scambio di elementi    usato in modo pesante   altri algoritmi adottano tecniche che    ragionano    di pi   sulla situazione del vettore od adottano tecniche pi    intelligenti  ripagate solo se il numero degli elementi    sufficientemente elevato  diminuendo il numero di scambi  necessari  Ovviamente questi algoritmi sono pi   difficili        Prima di esaminare il codice Pascal conviene presentare l   algoritmo in modo    informale    aiutandosi anche con una  simulazione grafica  Come punto di partenza consideriamo il seguente vettore disordinato           9 8 2 6 3                                          ordinamento  gt  2 3 6 8 9          L   algoritmo procede in questo modo     1  confronta la prima posizione con la seconda  se il numero contenuto nella prima posizione    maggiore di quello  nella seconda scambia i numeri     confronto scambio risultato          t y  rte s    
159. evitando usi maldestri   procedure P2   var z  real  L ambiente non locale di P2    costituito non solo dalla variabile x del programma  begin principale ma anche dalla variabile y della procedura P1   end   begin  end   begin end     Quando l applicazione    il risultato della compilazione e link di pi   sorgenti la situazione si complica  in generale  bisogna decidere cosa concedere in utilizzo di un certo sorgente quando stiamo scrivendo il codice di un altro  I  linguaggi si differenziano per possibilit   e notazioni sintattiche anche molto diverse  Di solito    comunque possibile  indicare un   entit   dichiarata nella sezione var principale come globale rispetto agli altri file sorgenti  ad esempio   dare la possibilit   dal file sorgente     unit1    di usare una variabile globale  della    Unit     o di richiamare un   sottoprogramma di una qualsiasi altra     y Unit  In alcuni linguaggi  turbo Pascal   UnitN compreso  per accedere all entit   di   un altro file si deve rendere palese la  volont   di usare quest ultimo con una  direttiva al compilatore  uses crt non  vi dice nulla             File principale       Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  110    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    TIPO DI DATO ARRAY    Voglio presentarvi alcune situazioni    problematiche    per evidenziare l   inadeguatezza degli strumenti da  programmatore che sono attualmente in vostro possesso     Caso di studio 1  a
160. forj  i 1 to n do  if vet j   lt  vet pos_min  then  pos_min  j     for j  i 1 to n do    if vet j   lt  vet pos_min  then  pos_min  j     tmp    vet i     vet i     vet pos_min    vet pos_min   tmp  end  end        scambio con il minimo     tmp    vet i     vet i     vet pos_min    vet pos_min   tmp   end        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  126    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    I NTRODUZI ONE ALL USO DEI RECORD    I dati di un vettore o di una matrice devono essere tutti uguali  o tutti integer  o tutti real o string ecc  Questo limite  porta a notevoli complicazioni anche per situazione semplici  Immaginiamo infatti di voler rappresentare la seguente  scheda     Persona  Cognome  Nome       Eta  Fine Persona    Verdi    Bianchi          Giovanni    Sandra                34       15          Usando gli array sono possibili due soluzioni   1  Tre vettori in parallelo  uno per i cognomi  uno per i nomi  ed uno per le et       Soluzione con tre vettori          Verdi Bianchi  Giovanni Sandra          2  Una matrice  di stringhe  a due colonne  la prima per il  cognome e la seconda per il nome  ed un vettore per le  et                      21 34 15  Soluzione con una matrice ed un vettore          Gestire vettori o matrici e vettori in parallelo non    molto agevole     Per fortuna molti linguaggi di programmazione  consentono al programmatore di definire nuovi tipi di dato  strutturati come megli
161. ggetti  OOP   che sar   materia di studio in quarta quinta     Mentre vengono sviluppati e provati i sottoprogrammi vengono di solito scritti direttamente all interno di un  programma che li usa  E solo in un secondo momento  quando il sottoprogramma    stato perfettamente testato  di  quest ultimo viene inserito in una libreria     Qui a lato ho evidenziato come in un programma i sottoprogrammi  vengono scritti dopo la sezione VAR e devono terminare prima del begin  di inizio programma  Non c    limite al numero di sottoprogrammi che si  possono scrivere  se non quelli imposti dall ambiente di sviluppo per la const      scrittura del programma principale   Var       program prova        Come dicevo  questo facilita la scrittura dei sottoprogrammi ma ne riduce sottoprogramma 1  la facilit   di riutilizzo  dovremmo ricorrere ad un copia incolla per usarli in  altri programmi   pur mantenendo inalterati tutti gli altri benefici  Una  volta che il sottoprogramma    stato ben testato lo si pu   togliere dal  programma principale ed includerlo in una libreria  recuperando  tutti  i          sottoprogramma 2             benefici discussi prima  Begin  Anche noi procederemo cos    visto che l   obiettivo    imparare a scrivere i     uso sottoprogrammal  sottoprogrammi         uso sottoprogrammal    NOTA  nel programma principale possiamo sfruttare un qualsiasi     uso sottoprogramma2  sottoprogramma in pi   punti  tutte le volte che ci   si rende necessario        Autore  Fabrizio C
162. gin  writeln                 PREMI INVIO PER CONTINUARE                      readin   end        visualizza la stringa ricevuta ed attende la pressione di INVIO     procedure messaggio mes  string    begin  writeln                                                     writeln mes    writeln                                                     attendi   end     begin   clrscr    messaggio    Ciao  come va        end           SOT 16  difficolt    bassa  Scrivere un sottoprogramma per il calcolo di x    con X e Y interi positivi           program potenze   uses newdelay  crt   var unaBase  unEsponente  integer     function eleva base esponente  integer  real   var risultato  real  i  integer   begin   risultato  1     for i  1 to esponente do  risultato   risultato  base     eleva  risultato  end     begin  clrscr   write  Dimmi la base     readin unaBase    write  Dimmi l esponente     readIn unEsponente      writeln  base    unaBase     esponente    unEsponente    writeln  il risultato e      eleva unaBase  unEsponente  6 0     readin   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  107             program elimina_spazi   uses crt     var stringa  string     function togli spazi s  string   string   var i  integer   inizio  fine  integer   spazio  boolean   risultato  string   begin  inizio  1  fine  length s         cerco il primo carattere diverso da spazio a sinistra       spazio    s inizio           while   inizio lt  fine   and spazi
163. glia    fatta di pi   persone  Una_Famiglia  array 1  3  of TPersona     Ecco come dare un valore al primo record del vettore  Attenzione  Il seguente    un errore piuttosto comune   Una_Famiglia  1  cognome   Giorgio    Una_Famiglia 1  eta   Albenghi     Una_Famiglia eta 3   23  Una_Famiglia  1  eta  43     Sarebbe il field eta ad essere considerato un vettore        Quindi una_famiglia    prima di tutto un vettore  dopo il suo nome    necessario indicare quale elemento si intende  usare  una_famiglia 1    Poi  essendo ogni elemento del vettore un record si continua con la sintassi di questi ultimi   un punto ed il nome del campo da usare      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  128    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Ecco un esempio interessante sul come usare il costrutto with con i vettori di record  Si tratta di un ciclo di  caricamento del vettore della famiglia     For i  1 to num_ componenti do  With Una_Famiglia i  do    con l   i mo componente fai         begin  Readin cognome    ReadiIn nome    ReadIn eta   end       Record di record    Un field di un record pu   tranquillamente essere a sua volta un record  definiamo prima un record per le date e poi  un record per i compleanni  che conterranno il record della data      Type  TData record    un record normale     Gg mm aa  integer   End     TCompleanno record  Data  TData     il record Data    contenuto nel record TCompleanno     Nominativo 
164. grammatore a doversi ricordare che    necessario inizializzare la  variabile di controllo  i  0   incrementarla ad ogni ciclo  i  i 1  e verificare se    arrivato il momento di interrompere il  ciclo  ma    tutto svolto in automatico secondo le indicazioni date dal programmatore sulla prima riga della struttura  for   do     1  0    repeat  i i     writeln  i      until i 10     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  60    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Ma ecco una prima applicazione interessante  vengono stampati tutti i multipli di 3 fino al 21  Non    necessario utilizzare  l operatore MOD per testare la divisibilit   per tre di ogni singolo valore della variabile di controllo come avremmo fatto    con un ciclo for  invece di incrementare la variabile di una unit   alla volta  si aggiunge tre individuando ogni volta a colpo  sicuro un nuovo multiplo     i  0   repeat  i   1 3   writeln  i     until i 21     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  61    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Uscita dal ciclo repeat con domanda all operatore        Da usare in quei casi in cui    necessario far inserire da tastiera una sequenza di dati ed    l operatore che deve  decidere quando sono finiti  Immaginiamo un programma funzionante all ingresso di una mostra che deve servire a  richiedere i dati a grafici di ogni visitatore ed a stampare per cia
165. h      tentare di usare un elemento prima dell   inizio del vettore o dopo la fine    un gravissimo errore che  spesso porta al blocco del programma ed eventualmente del computer stesso       Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  116    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Caso di studio 2  MENU  Attraverso questo esempio imparerete a passare i vettori ai sottoprogrammi   Un menu presenta sullo schermo un elenco di opzioni delle quali una sola sar   quella scelta dall   utente  Un menu    pu   presentarsi a tutto schermo  come nell   esempio qui sotto a sinistra  o sotto forma di barra dei menu  come  nell   esempio qui sotto a destra         Scegli il gioco che preferisci        Tennis  Poker  Scacchi  ESCI    SCEGLI   gt _       Chiunque abbia provato ad usare un programma per computer sa che sono veramente tante le situazioni in cui     necessario dialogare con l   utente presentando uh menu di scelte     Limitandoci alla tipologia rappresentata qui sopra a sinistra  fondamentalmente lo scopo di un menu    sempre lo  stesso  scrivere un titolo  sotto di questo scrivere un certo numero di scelte e leggere la risposta dell   utente   Situazione perfetta per la scrittura di un sottoprogramma  comunico titolo  opzioni  numero di queste ultime e come  valore di ritorno ci si aspetter   il numero della scelta fatta  Naturalmente il sottoprogramma provveder   anche a  rifiutare scelte impossibili  valori minori d
166. i 1 o pi   grandi del numero delle opzioni previste   a visualizzare  messaggi di errore e a far ripetere la scelta fino a che l   utente non indicher   forzatamente una delle opzioni previste     Titolo  n  opzioni  opzione 1  gt  MENU p numero della scelta  opzione 2     otta  opzione 3      opzione 4     d    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  117    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    La chiamata alla funzione menu che corrisponde all   esempio cui ci stiamo riferendo sarebbe allora   scelta  menu     Scegli il gioco che preferisci     4  Tennis     Poker     Scacchi     ESCI      Un   altra situazione tipica    quella in cui  segnalando un errore  si vuole chiedere all   utente come procedere   Immaginiamo che si sia verificato un errore di registrazione di un documento     scelta  menu     Errore di scrittura su disco    3  Riprova     Ignora     annulla        Scusi prof   mi sa che ha dimenticato un parametro nel secondo esempio  lo studente medio finge clamorosamente di  essere disinteressato a quello che scrivi  ma prova a sbagliare una virgola       devono essere sei  il titolo  numero  opzioni e le quattro scelte      E gi    ma se le scelte sono solo 3 come nel secondo esempio  O se ne servissero 12   L   unica soluzione ora alla  vostra portata sarebbe quella di prevedere il massimo numero possibile di scelte  ignorando quelle che di volta in  volta non servono  la dichiarazione dell   intest
167. i attuali     Poich   soluzione1 corrisponde al  parametro formale X1 e poich   X1    stato  dichiarato per indirizzo  ogni modifica fatta       Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  94    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ESERCI ZI SVOLTI   primo blocco       SOT 1  difficolt    bassa Che percentuale rappresenta un numero A rispetto ad un altro numero B  Esempio  100  rispetto a 150   75  100    il 75  di 150            program percentuale   uses newdelay crt        che percentuale    A di B      function perc A  B  real   real   begin   perc     A B    100  end     begin  clrscr        esempi d uso         writeln  perc 1  1  3 2          100      writeln  perc 17  34     2           50      writeln  perc 8  24  3 2           33 33333333         writeln  perc 234 78  fi 87  3 2          echi lo sa             viene calcolato un valore corretto anche quando A  lt  B     writeln  perc 150  100  3 2           150        writeln  INVIO per continuare         readin   end        SOT 2  difficolt    bassal Calcolare una certa percentuale di un numero           program provaPercentuale   uses newdelay  crt     function percentuale perc  real  numero  real   real     begin  percentuale     numero 100    perc    end    begin  clrscr   writeln  percentuale 20  100  2 2      20  di 100   20     writeln  percentuale 20  35  2  2      20  di 35 7    writeln  percentuale 0  47  2 2      0  di qualunque numero   0     w
168. i faccio puntare da precedente     end  end        NIL       info    gt   Il disegno qui a lato fa evidentemente C info       riferimento al caso lista non vuota          2 p  pun  nuovo_nodo    Z 24    nuovo_nodo 1    nuovo nodo  pun  p  pun    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  5    I record con il Turbo Pascal versione 1 3 Luglio 2003    RICERCA IN UNA LISTA NON ORDINATA    La procedura non si limita a restituire un puntatore all elemento eventualmente trovato ma anche il puntatore a  quello che eventualmente lo precede  Ho scelto questo comportamento perch   per alcune operazioni  una volta  trovato un elemento     necessario disporre anche del puntatore all elemento precedente  ad esempio nel caso  volessimo cancellare l elemento trovato     procedure cerca_non_ordinata p  puntatore  valore  integer  var corrente  precedente  puntatore      begin  precedente  nil  corrente  nil   if p lt  gt nil then  begin  corrente  p   while  corrente    inf lt  gt valore  and  corrente  pun lt  gt nil  do  begin    precedente  corrente  precedente corrente    corrente   corrente  pun  end  ZTN ZT N   gt L  H gt L_Tfvalore  p pr    if corrente  inf lt  gt valore then       begin La ricerca    effettuata su una lista non ordinata  Se valore viene trovato  in  precedente   nil  corrente viene restituito il puntatore al nodo cercato  in precedente quello al  corrente  nil nodo che lo precedete  nil se il nodo cercato    il primo   Se il valore
169. iabile integer e pu   essere usata dove siete  abituati ad usare una qualsiasi altra variabile integer     Writeln     Dimmi un valore e lo memorizzer   nella posizione 4 del vettore         readIn  voti 4        writeln    Ora visualizzo il contenuto del sesto elemento del vettore         writeln  voti 6        if vet 2  gt x then       repeat   until x gt vet 5     x  6   vet 3      2 vet 7    writeln   Dimmi una posizione e visualizzer   il contenuto di quell elemento          readin  posizione     writeln   voti posizione       L   ultimo esempio    particolarmente interessante  invece di specificare un numero preciso  come indice    possibile    mettere una variabile integer  Questo d   al programmatore la possibilit   di scandire  passare in rassegna  pi    elementi del vettore cambiando in un ciclo il valore della variabile indice           for i  1 to num_voti do  writeln  voti i           Cercate di capire bene questo spezzone di codice     alla base di tutte le elaborazioni con gli array che vi saranno  spiegate in questo corso     La variabile i  grazie al ciclo  assume tutte le posizioni del vettore e di volta in volta individua nel ciclo elementi  successivi  uno dopo l   altro dal primo all   ultimo  La prima volta che viene eseguito il ciclo la    vale 1 e quindi la    writeln corrisponde a writeln voti 1  e viene quindi visualizzato il contenuto del primo elemento del vettore  Poi la  i diventa 2  e viene elaborato il secondo elemento e cos   via fino all   ul
170. iama funzione  function   Quando non restituisce nulla si chiama procedura  procedure   Un esempio di procedure     rappresentata dal comando clrscr  non restituisce nulla programma principale ma si limita a cancellare il video      parametri   Un sottoprogramma pu   aver bisogno di uno o pi   dati per portare a termine il suo compito  Ad esempio sqrt ha  bisogno del numero di cui si vuole calcolare la radice  Clrscr non ha invece bisogno di alcun dato  Questi dati si  chiamano parametri e vengono indicati tra parentesi dopo il nome del sottoprogramma     Nel comando sqrt  9   il parametro    costituito dalla costante numerica 9  Nel comando sqrt  12 3  il parametro     costituito dal risultato dell espressione 12 3  Nel comando sqrt X  il parametro    il valore contenuto nella variabile X  al momento dell uso del comando     Se i parametri sono pi   d uno vanno separati con la virgola  Ad esempio il comando gotoxy 10  5  sposta il punto di    scrittura sul video alla colonna 10  riga 5  Il primo parametro    il numero della colonna  il secondo il numero della  riga  NOTA  per provare il comando gotoxy dovete indicare uses crt come spiegato alla pagina successiva     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  84    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Interessante    ma quali e quanti sottoprogrammi abbiamo a disposizione    Abbiamo due possibilit       Usare un sottoprogramma scritto da altri    sottoprogrammi ri
171. icati se  trattati con gli strumenti di programmazione visti sino ad ora    Ad esempio  molte situazioni reali sono adatte per  essere rappresentate con una struttura chiamata albero  Un albero    formato da elementi chiamati nodi collegati da  archi     Radice  root     Nel disegno i nodi sono rappresentati dai cerchietti  gli archi dai segmenti  che li congiungono  In realt   si tratta di un caso particolare di albero  chiamato albero binario  in quanto ogni nodo pu   avere al massimo due  figli  ma anche uno o nessuno   Gli alberi pi   complessi  generici  senza  limiti sul numero di figli  possono comunque essere rappresentati con un       figlio albero binario costruito in modo    furbo     scoprirete pi   avanti nel corso  come        Il nodo iniziale  quello in cima per intenderci     chiamato root  radice   I  nodi terminali  quelli senza figli  sono chiamati foglie  I figli diretti di uno    stesso nodo sono fratelli tra loro   foglia       fratelli    Qualche esempio d   uso  in un gioco un albero pu   rappresentare per ogni possibile    mossa    le risposte  dell   avversario e per ciascuna di queste le possibili contromosse e cos   via  i sistemi operativi utilizzano strutture ad  albero per memorizzare la struttura delle cartelle e relative sotto cartelle  un albero genealogico  l    organigramma  delle figure di un   azienda  boss  capi reparto  dipendenti ecc    alcune delle tecniche pi   sofisticate di gestione degli  archivi usano strutture ad albero  B  tree
172. idea che la variabile da controllare pu   assumere uno qualsiasi di questi  valori per ricadere in questo caso  e un intervallo di valori  1  12 significa da la 12     a        z    significa dalla    a    alla    z     e una situazione mista tra le due precedenti come in 1 3 5 12 che verrebbe interpretato come o il valore 1  o il  valore 3  o un valore tra 5 e 12    Dopo l elenco dei valori che individuano un certo caso si deve mettere simbolo     due punti  e poi o l unica  istruzione da eseguire o il blocco delle istruzioni da eseguire racchiuse tra begin e end  Ogni caso deve essere  separato dal successivo con un punto e virgola        possibile  ma non obbligatorio  inserire una parte e se begin     end con l idea di indicare le istruzioni da eseguire  nel caso il valore della variabile di controllo non trovi riscontro in nessuno dei casi primi elencati  Ad esempio nel  controllo del valore della variabile mese se siamo certi che il suo valore    nell intervallo 1  12  dopo aver controllato  che non sia due e tutti i valori che corrispondono a mesi con 31 giorni  la parte else non pu   che corrispondere a casi  in cui il mese    uno di quelli con 30 giorni  Naturalmente avremmo anche potuto usare la forma estesa senza la parte  else     Case mese of  2  If anno mod 4   0 then  Giorni  29    bisestile       Else  Giorni  28    1 3 5 7 8 10 12  Giorni  31    4 6 9 11  Giorni  30  Case eta of   end  1  13  paghetta  5    14 18  if multe 0 then   Il case va sempre concluso 
173. il mouse  come fareste in Paintbrush per un rettangolo  e le istruzioni  corrispondenti sono generate in automatico  Lo stesso per molte finestre di dialogo  i bottoni  i menu  le caselle con    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  18       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    gli elenchi  le schede di inserimento dati  i pannelli di ricerca di un file per l apertura o la registrazione di un archivio  ecc  E    sempre disponibile anche un potente strumento per la ricerca degli errori  debugger   Questi sono solo alcuni  dei moltissimi bonus che un moderno ambiente per lo sviluppo dei programmi    in grado di offire        La catena della programmazione       Il programmatore inizia con lo scrivere le istruzioni  nel linguaggio di programmazione scelto  con un programma  chiamato  editor  Questo termine inglese significa redattore cio   colui che cura la scrittura di un testo  ed ha quindi  un significato abbastanza generico  Molto semplicemente  pensate all editor come ad un programma di videoscrittura  specializzato per la stesura delle istruzioni  Il file scritto con l editor prende il nome di  codice sorgente   source  code     primi editor erano molto semplici e permettevano solo di scrivere il codice  il testo corrispondente alle  istruzioni  e di salvarlo su disco  spettava poi al programmatore mandare in esecuzione  manualmente  il compilatore  ed il linker                          Oggi gli editor son
174. imenti  applica prezzo pieno                                Se  la temperatura supera 37 C jallora  fai suonare l   allarme           Come avrete osservato  si controlla una condizione  anno bisestile    et   minore di 18    temperatura supera 37     che pu   risultare vera o falsa  In qualche caso  primi due esempi  ci sono operazioni  diverse  sia nel caso la  condizione risulti vera sia nel caso risulti falsa  E    per   possibile  terzo esempio  che nel caso la condizione sia falsa  non ci sia nulla da fare     Ecco come si rappresenta in un flow chart la struttura selettiva     ue                   Se l   anno    bisestile  allora                  E   anno bisestile S  prima via seconda via    altrimenti      considera febbraio con 29 giorni                      consideralo con 28 Ea KENN  giorni  lt   29 giorni  lt   28                      questo tipo di selezione     detto a 2 vie             La condizione deve essere scritta all   interno del rombo  Il flusso  di esecuzione si divide a seconda del risultato del controllo  V sta  per Vero e F sta per Falso  e solo la strada    a destra    o    a    sinistra    viene percorsa     Le istruzioni nella sezione    vera     o    falsa     possono essere anche molte e non una sola come nel nostro esempio   Quando le istruzioni da eseguire a condizione vera  o falsa  sono terminate il flusso si ricongiunge usando il simbolo  chiamato connettore  O    Attenzione  nel rombo potete mettere solo condizioni  non NO     Sarebbe qui
175. imento  prova a rendere ancora pi   generale la procedura prevedendo un terzo parametro corrispondente ad  un messaggio personalizzato che solleciti l   utente in modo appropriato  In questo modo invece del generico    Inserire  elemento n      potranno essere usati messaggi tipo    Inserire la temperatura n      o    Inserire il peso dell   oggetto n     ecc              2  Visualizzazione degli elementi di un vettore di N elementi  con N  lt  MAX_ELEMENTI       for i  1 to N do        Procedura per visualizzare gli elementi di un vettore  Riceve il vettore  per  writeln  vettore i        valore  visto che non dobbiamo modificare in alcun modo il suo contenuto    ed il numero di elementi da considerare     NOTA  chi usa la procedura deve assicurarsi di non passare come numero di  elementi un valore superiore alla capacit   massima del vettore     procedure visualizza_vettore vet  vettore_interi  N  integer    var i  integer     begin   for i  1 to N do  writeln  vet i      end        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  120    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          3  Somma dei valori degli elementi di un vettore di N elementi  con N  lt  MAX_ ELEMENTI          somma  0     Funzione per la stessa operazione     for i  1 to N do    i function somma_vettore vet  vettore_interi  N  integer   integer   somma  somma   vettore i       var tot  integer   begin  tot  0   for i  1 to N do  tot  tot   vettore i  
176. in una forma che rende assai veloce trovare i valori che interessano  un certo codice o un  certo cognome ecc    ad esempio potrebbe essere ordinato  per sfruttare una ricerca dicotomica  o strutturato  come un albero binario di ricerca  quest ultima scelta    alla base della fortunatissima tecnica che sfrutta una  forma modificata degli alberi binari  chiamata    B  tree     essa    utilizzata per molte implementazioni del  linguaggio Cobol  di molte librerie per la gestione degli archivi disponibili per gli altri linguaggi  e di alcuni famosi  DBMS     Qualunque sia forma dell indice  l   idea di base    che  grazie alla sua natura ordinata  saranno necessarie poche  letture su di esso per localizzare il valore che interessa ed accedere all indirizzo in cui si trova il resto dei dati nel  file principale           Calcestruzzi Mario V  Milano  Impiegato  Bini Giorgio V  Corta Studente  Bruni Massimo V  Lunga Studente  Arisi Massimo V  Larga Avvocato                                                       Il file dati principale non    ordinato rispetto ad alcun campo  L accesso  L   indice    ordinato    mediato dall   uso dell   indice  Se l   accesso    random  ottenuta  per cognome  I dati dall   indice la posizione dei dati di Arisi sar   sufficiente una sola  di Arisi si trovano lettura   nel quarto record del  file dei dati       Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  136    Gestione Archivi Tradizionali   versione 3 1 Settembre 
177. in una zona della RAM  si comporta esattamente in questo modo  N ellpri 4 chiama proc 5 ante  proc sta per    procedura   Lo stato di proc 4    Proc 3 chiama proc 4 viene salvato sullo Proc 5 termina  Proc 2 chiama proc 3 stack    Lo stato di proc 3 Lo stato di proc 4  Lo stato di proc 2 viene salvato sullo Proc 4    messa in viene tolto dallo stack  viene salvato sullo stack attesa  Proc 1 chiama proc 2 stack Proc 4 riprende dalla  Proc 3    messa in Proc 1 2 e 3 sono riga alla quale si era  Lo stato di proc 1 Proc 2    messa in attesa sempre in attesa interrotta  viene salvato sullo attesa  stack Proc 1 e 2 sono Proc 1 2e3 sono     i i sempre in attesa  i   Proc 1    sempre in sempre in attesa tato proc 4 p  Proc 1    messa in attesa  attesa tato proc 3 tato proc 3 tato proc 3    Stato proc 2 tato proc 2 tato proc 2    tato proc 2    Stato proc   Stato proc 1__ Stato proc 1  p 3 Stato proc 1 tato proc I muso  email  da tato proc L 2d it sito web  wwbtato proc 1       Allocazione dinamica della memoria versione 2 5 Luglio 2003       RIPRENDE LA PARTE NON FACOLTATIVA DELLA DISPENSA               In alcuni problemi    proponibile sia una soluzione iterativa  con i cicli  che ricorsiva  Quest ultima risulter   pi    lenta nell   esecuzione e consumer   pi   memoria  salvare lo stato occupa tempo e spazio  ma pi   naturale se il  problema ha una natura essa stessa ricorsiva  In questi ultimi casi spesso la soluzione ricorsiva    MOLTO pi    semplice da programmare  al punto da r
178. ione Archivi Tradizionali   versione 3 1 Settembre 2004    Pag  131    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004      FILE   GESTIONE TRADI ZI ONALE  non DBMS     Il file  archivio     una collezione di dati registrati su un supporto di massa  floppy disk  hard disk  CD  DVD  nastro  ecc    Da un punto di vista fisico tutti i file sono memorizzati come una sequenza di byte     il modo con cui questi  ultimi sono interpretati che fa la differenza  Ad esempio  i 1000 byte che costituiscono un certo file potrebbero essere  intesi come dieci schede  record  da 100 byte con le informazioni di un cliente della ditta  E di ciascun record i primi  10 byte potrebbero rappresentare il codice del cliente  i successivi 30 il nominativo ecc   i cosiddetti fields     campi    Ma  in un contesto completamente diverso 1000 byte potrebbero rappresentare la codifica binaria di un immagine o  di un suono     Sui supporti  i byte sono di solito trattati a blocchi  cio   non viene mai letto scritto un solo byte alla volta  secondo  una tecnica di suddivisione dello spazio a disposizione che dipende dal supporto  su un floppy disk tracce  concentriche suddivise in    spicchi    ad individuare settori  su un CD un unica traccia a spirale  sul nastro bande  magnetiche perpendicolari o elicoidali ecc    Le letture scritture avvengono in aree di transito in RAM chiamate  buffer s   Quando si leggono dati da un dispositivo  uno o pi   blocchi vengono memorizzati nel buffer di lettura 
179. irizzi di 2 byte  cio   16 bit  memoria di al massimo 2716   1   64Kbyte  sia indirizzi di 4 byte  32bit   memoria segmentata DOS  indicandoli con una coppia numero di segmento  64K possibili segmenti    posizione nel  segmento  da 0 a 64K         Per chiarire in modo inequivocabile che un puntatore non sta individuando nessun oggetto in memoria lo si inizializza  con un valore speciale  NIL  nulla      blocco    NIL     In questo modo il programmatore pu   verificare se il puntatore sta puntando ad un oggetto valido  uno degli errori  pi   pericolosi che si possano commettere    infatti l uso di un puntatore che non sta puntando a nulla      if blocco lt  gt NIL then     uso    sicuro    del puntatore        9 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it         Allocazione dinamica della memoria versione 2 5 Luglio 2003    L    istruzione new  allocazione della memoria          Torniamo all esempio precedente e continuiamo dal punto in cui ci eravamo interrotti    type  vettore   array 1  20  of string 50    pun      vettore     var  blocco  pun       E  arrivato il momento di creare un blocco  vettore  e di memorizzare il suo indirizzo nella variabile blocco     new blocco      Letteralmente  crea un nuovo oggetto del tipo individuato dalla variabile puntatore  Poich   blocco    un puntatore ad  oggetti di tipo vettore e questi ultimi sono array di20 stringhe     appunto un vettore di 20 stringhe che viene creato  in memoria  Poich   ogni string
180. isponde al valore 32 767 ma    meglio usare la    somma  0 numero  1     1 e  il primo n  dispari        costante  perch       for i  1 to quanti do   begin  somma  somma numero   numero  numero 2     individuiamo il n  dispari successivo      end     writeln  Considerati i primi   quanti   numeri dispari     writeln  La loro somma e     somma 10 0         moltiplico per 1 0 per trasformare in real il risultato  altrimenti sarebbe integer e limitato a 32767     writeln  Il quadrato di   quanti    e   quanti 1 0 quanti 10 0      if somma quanti 1 0 quanti then  writeln  Regola verificata      else  writeln  Regola non verificata        readIn   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  67    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004             ITE17  difficolt    media  Un giro turistico e  fatto di N tappe  delle quali si introducono da tastiera  il nome della citta  di arrivo e i km percorsi  Calcolare il percorso totale e il percorso medio delle tappe       program tappe    uses newdelay  crt  var  i quante_tappe  integer   km_tappa somma_km  real   citta  string     begin    clrscr   repeat  writeln  Quante sono le tappe   da 0 a  MAXINT        readIn quante_tappe    if  quante_tappe lt 0  or  quante_tappe gt MAXINT  then  writeln  Errato  ripetere l inserimento      until  quante_tappe gt  0  and  quante_tappe lt  MAXINT      somma_km  0    for i  1 to quante_tappe do   begin  writeln  Prossima destinazione 
181. ispondono a    km_m km  5 2   metri     readin     end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  96    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       SOT 5  difficolt    bassa Convertire un certo numero di secondi nei minuti corrispondenti  Si vogliono anche  sapere i secondi che avanzano           program conversioni   uses newdelay  crt   var ss  avanzano  integer        da secondi a minuti  viene calcolato anche l avanzo     function ss_ mm quantiSecondi  integer  var avanzo  integer   integer   begin  avanzo    quantiSecondi mod 60   ss_mm    quantiSecondi div 60   end     begin  clrscr   writeln  Inserire secondi     readiIn ss    writeln ss   secondi corrispondono a   ss_mm ss avanzano    minuti e    avanzano    secondi       readin     end        SOT 6  difficolt    bassa Convertire un certo numero di minuti nelle ore corrispondenti  Si vogliono anche sapere i  minuti che avanzano           program conversioni   uses newdelay  crt   var mm  avanzano  integer        da secondi a minuti  viene calcolato anche l avanzo     function ss_mm quantiSecondi  integer  var avanzo  integer   integer   begin  avanzo    quantiSecondi mod 60   ss_mm    quantiSecondi div 60   end        da minuti a ore  viene calcolato anche l avanzo     function mm_hh quantiMinuti  integer  var avanzo  integer   integer   begin     sfrutto la precedente  il calcolo da fare e  infatti lo stesso       mm_hh    ss_mm quantiMinuti  avanzo    end
182. isultare l   unica strada percorribile    La ricorsione si    rivelata uno  strumento assai utile nel campo dell   Intelligenza Artificiale  IA  dove strutture complesse come gli alberi sono  all   ordine del giorno per rappresentare la conoscenza ed il percorso decisionale per la soluzione di un problema     QUALCHE ESEMPI O DI SOTTOPROGRAMMA RI CORSIVO  Per definire un algoritmo ricorsivo dobbiamo sempre individuare     La base della ricorsione     il caso pi   semplice  quello per il quale sappiamo subito    calcolare    il  risultato  Quello a cui il meccanismo ricorsivo tenta di ricondursi un poco alla volta  passo dopo  passo     Il passo ricorsivo  quando non siamo di fronte al caso pi   semplice dobbiamo tentare di  esprimerlo attraverso una    formula    che richiama lo stesso sottoprogramma che stiamo scrivendo  ma con argomenti semplificati che ci avvicinano al caso che rappresenta la base della ricorsione             Esempio 1  calcolo del fattoriale        Indichiamo con Fatt N  il fattoriale di un numero intero  gt  0  E  il prodotto di tutti gli interi da 1 a N  Ad esempio  Fatt 6    6   5   4   3   2   1  Per definizione si stabilisce che Fatt 0     1  E    una funzione assai usata in  matematica  ad esempio nel calcolo delle probabilit    combinazioni  disposizioni semplici o con ripetizione   coefficienti binomiali ecc       L   obiettivo    darne una definizione ricorsiva  esprimere un fattoriale usando ancora un fattoriale ma calcolato su un  valore pi   s
183. ito  anche se    difficile che non ci sia spazio almeno per creare il file vuoto     Ma vediamo la sintassi dell istruzione di creazione  identica per file di testo e tipizzati         rewrite nome_file_logico     Quindi  continuando gli esempi dell istruzione precedente  assign  senza ripetere la dichiarazione dei tipi e delle  variabili                    TESTO TIPIZZATI  assign lettera              assign elenco   come gi   detto  la sintassi    identica  rewrite lettera  rewrite elenco    ATTENZI ONE       Se comandate una rewrite su un file gi   presente in quella posizione e con lo stesso nome  quest ultimo verr    eliminato  e si ricomincer   con un file vuoto  Pi   avanti vi verr   spiegata una tecnica per verificare la presenza di un  vecchio file senza distruggerlo e chiedere conferma prima di procedere con la rewrite     Chiusura   procedura CLOSE       Ora il file esiste  vuoto  ed il programmatore potrebbe continuare con le istruzioni che aggiungono righe schede   Oppure terminare subito le operazioni  In ogni caso il termine delle operazioni con un certo file va segnalato con il  comando CLOSE  close nome file_logico   Di nuovo  non ci sono differenze tra file di testo e tipizzati        TESTO TIPIZZATI  assign lettera              assign elenco    rewrite lettera  rewrite elenco    close lettera  close elenco     Questa    ovviamente la sequenza dei comandi nel caso il programmatore decidesse di creare i file senza registrare  alcun dato su di essi  ovviamente 
184. izia  ed    per cui possibile far contare  cio   enumerare  al  programma il numero di volte che deve ripetere le istruzioni  Ecco la sintassi           For variabile_di_controllo    valore_inizio to valore_fine do  Istruzione     Oppure     For variabile_di_controllo    valore_inizio to valore_fine do  begin   Istruzione1    Istruzione2     IstruzioneN   end     La variabile di controllo deve essere di tipo ordinale  integer  longint o char anche se quest ultimo caso    assai raro    Ad essa viene assegnato come valore iniziale quello indicato dopo l operatore di assegnamento  Se il valore iniziale     inferiore a quello indicato come finale dopo la parola chiave to le istruzioni non sono ripetute neppure una volta   Diversamente il ciclo inizia e le istruzioni sono eseguite una prima volta  dopo che    stata eseguita l ultima  istruzione la variabile di controllo viene incrementata di una unit    se il valore    inferiore o uguale a quello indicato  come finale il ciclo viene ripetuto  Il ciclo termina quando il valore della variabile di controllo supera quello indicato  come valore finale     L esempio che segue  stampa per cinque  volte il messaggio     ciao         In questo caso il ciclo  viene ripetuto una    In questo caso il ciclo  non viene ripetuto    volta neanche una volta messaggio sette volte  non    Il valore d inizio non deve essere per  forza 1  Il ciclo che segue stamper   il    program cicli   var i  integer   begin  for i  1 to 5 do  writeln    ciao      
185. l punto di partenza    un normale vettore di stringhe       pun      vettore     il tipo blocco    punta    ad oggetti di tipo vettore  si parla di tipo puntatore        il carattere      fondamentale per indicare che si tratta di un puntatore      var  blocco  pun    variabile puntatore che memorizzer   l indirizzo di un blocco quando sar   creato       La variabile blocco    di tipo pun  cio    risalendo la catena delle dichiarazioni     un puntatore ad oggetti di tipo  vettore  si scrive    vettore   Al momento non sta puntando a nulla perch   il programmatore non ha ancora chiesto  l allocazione di memoria per il blocco di stringhe     NOTA BENE  blocco non pu   essere usata come una variabile qualsiasi  Ad esempio producono un errore le seguenti  istruzioni                    NO    writeln blocco  o readin blocco  o blocco  13  NO                 Un puntatore    una variabile speciale  Serve a contenere indirizzi di oggetti creati nella RAM  Quindi prima deve  essere creato un oggetto e poi si memorizza nel puntatore dove inizia in memoria quell oggetto  Usando poi il  puntatore potremo scrivere dati in quel blocco di memoria  recuperarli  distruggere il blocco di memoria quando non  servir   pi       APPROFONDIMENTO          La dimensione effettiva di un puntatore dipende da come il processore gestisce gli indirizzi di memoria e dalla  capacit   del compilatore di sfruttare appieno le possibilit   offerte da un processore  Il Turbo Pascal    in grado di  gestire sia ind
186. l tipo di file meno sofisticato e meno efficiente per rappresentare situazioni reali di una certa  complessit   ma allo stesso tempo assicurano la massima portabilit   tra elaboratori con diversi sistemi operativi e  tra periferiche altrimenti incompatibili  Qualsiasi linguaggio su qualsiasi piattaforma hardware software    infatti  in grado di gestire file di testo  Nel peggiore dei casi si render   necessaria una  semplice  transcodifica  ad  esempio da ASCII a EBCDIC      Non sono inoltre particolarmente adatti a contenere informazioni non testuali  qualsiasi codifica binaria  la  rappresentazione interna di un numero in virgola mobile  il codice operativo od un operando di un istruzione  assembly  un immagine  un suono un animazione  contenente un byte con valore 26 verrebbe considerato   inesorabilmente  EOF  Naturalmente ci sarebbe sempre il modo di codificare gli stessi dati usando solo byte  diversi da EOF  CR e LF ma la soluzione risulterebbe meno efficiente e poco elegante  Meglio usare i file non    testuali  vedi sotto      Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  134    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    2  File binari     binary file    o non di testo   a livello fisico sono ancora formati da una sequenza di byte il cui  valore non viene per   interpretato come un carattere ASCII  Cos    mentre un byte con valore  decimale  65  viene interpretato come la    A    in un file di testo  lo stesso val
187. la sbarra    Quale significato deve essere dato questa frase  Si tratta forse di un anziana signora china sotto il peso di  una pesante sbarra  O si sta parlando di uscita sbarrata da una vecchia porta  Questa ambiguit       inaccettabile per un computer  esso deve sapere esattamente come comportarsi e deve produrre sempre gli  stessi risultati se gli vengono sottoposti gli stessi dati in input        necessario servirsi di linguaggi formali  cio   rigorosamente definiti  Questi tipi di linguaggio sono di solito  molto meno ricchi di vocaboli e di regole sintattiche ma hanno il grosso pregio di non essere ambigui  ogni  istruzione    chiara  ha un solo significato e produce sempre lo stesso risultato               Questi linguaggi sono chiamati linguaggi di programmazione  La figura professionale che si occupa  della scrittura dei programmi    il programmatore  la fase di scrittura di un programma    detta di  codifica  il programmatore scrive il codice del programma                 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  6    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Non    detto che sia il programmatore a studiare il problema e ad ideare l algoritmo risolutivo  la figura professionale  specializzata in questi compiti preliminari e fondamentali    chiamato  analista  E  certamente vero che il ruolo  dell analista e del programmatore possano essere svolti dalla stessa persona  Per compiere una buona analisi     nece
188. le e tentiamo di assegnare un valore alla variabile S  viene usata  end  quella dichiarata nella sezione var del programma principale oppure quella  dichiarata come variabile locale nella procedura P   begin  A   4  La variabile A usata con l istruzione write nella procedura    il suo parametro  S      ciao     o la variabile A dichiarata nella sezione var del programma principale   end     La variabile S usata con l   assegnamento nella procedura    la sua variabile  locale o  di nuovo  quella della sezione var del programma principale     La variabile A usata nel corpo principale del programma    quella dichiarata  nella sezione var del programma principale o il parametro della procedura     E infine  la variabile S usata nel corpo principale del programma    quella  dichiarata nella sezione var del programma principale o la variabile locale  con lo stesso nome dichiarata nella procedura        Come potete ben capire    essenziale stabilire delle regole  pena il caos totale   e Le entit   dichiarate nella sezione var del programma principale sono visibili   o in un punto qualsiasi tra il begin e l   end  del programma principale  o in un sottoprogramma qualsiasi a patto che nessun parametro o variabile locale abbiano lo stesso  nome  in questo ultimo caso tra il begin e l end hanno il sopravvento i parametri delle variabili  locali  potremmo dire che si fa sempre riferimento alla dichiarazione    pi   vicina    al punto in cui    stiamo scrivendo      NOTA  abbiamo comunque
189. ln  isUpCase    writeln  isUpCase   writeln  isUpCase  z    writeln  isUpCase            writeln  INVIO per continuare         readin     end           SOT 10  difficolt    media  Dato un carattere trasformarlo in minuscolo  se    gi   minuscolo lasciarlo tale  Sfruttare  la funzione precedente  vedi SOT9        program convertilnMinuscolo   uses newdelay crt        restituisce true solo se il carattere e  una lettera maiuscola cioe  solo se il suo codice ascii e  compreso tra quello  della A e quello della Z     function isUpCase c  char    boolean   begin  isUpCase      ord c   gt   ord  A     and   ord c   lt   ord  Z       end        Converte un SINGOLO carattere in minuscolo  se non ha senso la conversione  non e  una lettera maiuscola   restituisce il carattere inalterato    function lowCase c  char    char     var distanza  integer  Una sottoprogramma pu   sfruttarne un altro    begin en ili    if isupCase c  then   begin     che valore separa le lettere minuscole dalle maiuscole nel codice ascii      distanza    ord  a     ord  A       97   65   32             NOTA  e  meglio usare ord  A   invece del valore 65 perche  65 funziona solo con la tabella dei caratteri dei sistemi  operativi Microsoft e altri  ma non tutti  ci sono sistemi operativi con tabelle con valori diversi  ord  A   ha piu   probabilita  di funzionare  e  indipendente dal valore nella tabella  potrebbe essere 65 o 34 o qualsiasi altro valore   ma se le lettere sono codificate sequenzialmente dalla  
190. lo s   in contemporanea e da ciascuno consegnare una copia di questo   M   MiniMaiu    maiuscolo s   scheletro in modo da poter testare il codice senza avere a  else na disposizione la parte che viene sviluppata dagli altri   MiniMaiu    s   ai Il completamento pu   avvenire anche per affinamenti  eng  successivi  si iniziano con l introdurre versioni non perfette ma  bedin via via sempre pi   funzionanti dei vari sottoprogrammi  Questo  n  aiuta a concentrarsi sugli aspetti fondamentali del problema  ad    esempio non    importante all inizio preoccuparsi di tutti i      esempi d uso        possibili errori di inserimento dati che potrebbe commettere  writeln  MiniMaiu  Aazz12   m      l utente  la gestione degli errori    senz altro un aspetto che pu    writeln  MiniMaiu  Aazz12    M      essere introdotto in un secondo momento     writeln  MiniMaiu  AaZz12    t         Naturalmente dopo che ciascun programmatore avr    writeln  INVIO per continuare        completato il test sulla sua parte sar   necessaria una fase di test  readin  conclusiva con tutto il codice al suo posto        end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  103    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    La tecnica del top down presuppone  per    che il programmatore abbia un idea chiara  almeno a grandi linee  del  programma nella sua versione completa  Solo in questo modo potr   infatti prefigurarsi i sottoprogrammi che  dovranno essere s
191. lu che lo caratterizza     Animazioni e filmati     un caso particolare del precedente  Infatti ogni sequenza di animazione o filmato    formata  da tanti fotogrammi  ognuno dei quali pu   essere considerato un disegno statico  ricadendo nel caso precedente  Un  a tecnica molto usata per risparmiare memoria    quella di memorizzare solo alcuni fotogrammi chiave  key frame  e  dire per ogni fotogramma intermedio cosa cambia a livello di pixel  compressioni mpeg   divx      Suoni  ogni suono pu   essere scomposto  determinando le caratteristiche delle onde sonore che lo costituiscono   Questi caratteristiche sono rappresentate da numeri     Esistono dei formati compressi anche per l audio  MP3  WMA      RAPPRESENTAZIONE DELLE ISTRUZIONI     Si adotta anche in questo caso una rappresentazione numerica  Ecco qui sotto il formato di una generica istruzione        codice operazione  operando 1  o suo indirizzo  operando 2  o suo indirizzo  indirizzo risultato    Ogni possibile istruzione    indicata da un codice numerico  Ad esempio la somma potrebbe essere indicata con 001   ricordiamo che i numeri sono binari  ed usano solo lo 0 e l 1   la differenza con 002 ecc  Dopo aver specificato il tipo  di istruzione    necessario indicare gli operandi  ad esempio i numeri da sommare   Qualche volta nell operazione si  mettono direttamente i valori da usare  altre volte si specifica l indirizzo dove trovare in RAM i valori che servono   Cos   si potrebbe chiedere di sommare direttamente 00
192. m  lt nome programma             E    una riga che inizia con la parola riservata   Keyword  program seguita dal nome che si vuol dare al programma    Le parole riservate sono alcune decine ed il programmatore non pu   usare identificatori con lo stesso nome di una di  esse  Ad esempio  non possiamo chiamare un programma proprio program  Il nome da dare al programma    invece   un esempio di identificatore  un nome scelto dal programmatore        Ci sono alcune regole da rispettare quando scegliamo un identificatore     e il suo primo carattere non pu   essere una cifra numerica  il compilatore penserebbe che in quel punto sta  iniziando un numero   ad esempio larrivato non va bene  arrivato1l invece s       e non pu   contenere spazi  totale iva non va bene  totalelva o Totalelva o totale_iva invece s    notate in  particolare l uso del carattere di sottolineatura _ che consente di    staccare    le parole come se avessimo inserito  uno spazio     e non pu   contenere caratteri strani  ad esempio     amp        eccetera  come regola pratica potreste ricordare che  possono essere usate solo lettere  maiuscole e minuscole   cifre numeriche ed il carattere di sottolineatura   alcuni linguaggi fanno differenza tra minuscole e maiuscole  e sono detti case sensitive  per cui gli identificatori  totale e Totale sono considerati diversi  altri linguaggi  tra cui Pascal  non distinguono invece minuscole  maiuscole  e sono detti case insensitive      e hanno una lunghezza massima  di 
193. ma iniziale viene suddiviso in modo molto naturale  nei due sottoproblemi 1  convertire una stringa in minuscolo e 2  convertire una stringa in maiuscolo          Problema originale    Convertire una Stringa sottoproblemi  in Minuscolo Maiuscolo    Convertire una Convertire una  Stringa in Minuscolo Stringa in Maiuscolo    Il sottoproblema    convertire una stringa in minuscolo    pu   essere ulteriormente scomposto in due altri sotto problemi   1  decidere se un carattere    minuscolo e 2  convertire un singolo carattere in minuscolo  pi   semplice rispetto alla  conversione di un intera stringa   Anche per l altro sotto problema viene individuato il sotto problema corrispondente  alla conversione in maiuscolo di un singolo carattere     Top    Convertire una Stringa  in Minuscolo Maiuscolo    Convertire una Convertire una  Stringa in Minuscolo Stringa in Maiuscolo    Il carattere    minuscolo   Converti un singolo carattere in minuscolo Converti un singolo carattere in maiuscolo    NOTA  questa tecnica viene indicata anche come    divide et impera     dividi e mantieni sotto controllo  da un detto  degli antichi romani  per mantenere sotto controllo un vasto territorio appena conquistato vaste fette della popolazione  venivano deportate in aree geografiche lontane  In questo modo quel popolo perdeva la sua unit   e la sua forza ed era  pi   facile dominarlo        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  102    Gestione Archivi Tradizi
194. mai effettuato il controllo sul buon esito delle new     Program liste_semplici   uses crt   type  puntatore     elemento   elemento record    inf  integer     informazione     pun  puntatore    puntatore     end     STAMPA DELLA LISTA  IN EFFETTI E  UNA VISITA COMPLETA DI TUTTI GLI ELEMENTI DI UNA LISTA     procedure stampa_lista p  puntatore     DI    p    il puntatore all   inizio della lista     begin  writelng       p  p  pun   l istruzione classica con cui si passa da un nodo al    successivo  Se infatti p punta ad un certo nodo  la scrittura p   pun  while p lt  gt nil do corrisponde al contenuto della sua casella puntatore  cio   l    indirizzo  begin del nodo successivo     write p   inf          P    end  P  pun  writeln           end  NB  p    passato per valore  possiamo quindi modificarlo senza timore    di perdere l   inizio della lista       INSERIMENTO IN TESTA DI UN NUOVO ELEMENTO  riceve il puntatore  p  ad una lista ed un valore da inserire  procedure inserisci_in_testa var p puntatore  valore integer    var nuovo_nodo  puntatore   begin  new nuovo_nodo   nuovo_nodo  inf  valore   nuovo_nodo  pun   p   p  nuovo_nodo  V   NIL  end  P  E    importante prima salvare il valore di p  nella casella puntatore del nuovo nodo  1  diversamente  invertendo cio   l   ordine dei 2  due assegnamenti  si perderebbe il valore p  nuovo_nodo  originale di p cio   del primo nodo  rendendo    A  irraggiungibile l   intera lista      v    nuovo_nodo       nuovo_nodo  pun  p    
195. me                dl    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      NO     ERRORE        v  1          attiva allarme                   __ S prezzo    Pag  72    Li       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Selezione a molte vie    Esiste anche un   utile variante che prevede molte vie a seconda del valore di una variabile  Immaginiamo che la  variabile mese contenga un valore da 1 a 12 che rappresenta uno dei mesi dell   anno  Di nuovo  vorremmo sapere  quanti giorni considerare  Vi ricordo che i mesi con 31 giorni sono 1  gennaio   3  marzo   5  ecc    7  8  10  12   quelli con 30 giorni sono 4  aprile   6  9  11  immaginiamo per semplicit   che febbraio  2  ne abbia sempre 28           In tutti gli altri casi  1 3 5 7 8  10 12          Scrivi  errore      giorni  lt   30  ail               altre istruzioni altre istruzioni altre istruzioni  per i mesi da 31 per febbraio per i mesi da 30            Il flusso pu   seguire tre vie a seconda agita variabile mese  I tre flussi possibili si ricongiungono poi nel  solito connettore  Anche se non usato in questo esempio     previsto un flusso da seguire quando non si verifica  nessuno dei casi precedenti              Esercizi risolti sulla struttura selettiva C     SELI  Inserita un   et   dire se siamo in presenza di  un minorenne o di un maggiorenne       NOTE  con un flow chart si vogliono di  solito cogliere gli aspetti essenziali di   un algoritmo  questo significa 
196. modo il prodotto  ad esempio a renderlo pi   veloce  a diminuire le sue esigenze di  spazio sul disco  a renderlo capace di riconoscere nuove periferiche  a compiere funzioni prima non  previste eccetera     e adattiva o adattativi  nessun errore da togliere  nessun miglioramento da portare  ma un cambiamento nel  contesto in cui il software deve funzionare costringe ad apportare delle modifiche  il caso classico che si cita in  questa situazione    la modifica di una legge che forza la software house a rispettarla  a costo di pesanti   modifiche del codice     Infine  quando un applicazione non    pi   utile  perch   superata da altre  perch   le modifiche richieste sono  troppe  perch   un evento imprevisto la rende obsoleta eccetera  se ne pu   anche decretare la morte  la    dismissione  E    doveroso sottolineare che questo processo nel quale io ho individuato  otto stadi non    l unico modello riconosciuto per lo sviluppo del software   e a dire la verit   l ho semplificato rispetto quelli che trovate nella  letteratura informatica      per   facile da capire e si adatta bene alla  maggior parte delle stazioni che ci troveremo ad affrontare  Di tanto in  tanto ritorneremo su uno degli stadi per aggiungere maggiore dettaglio     Riassumendo            Studio della  situazione reale  Analisi dei dati   Algoritmo i risolutivo    Codifica        Questo tipo di modello    detto  per debug    evidenti motivi  a cascata     Manutenzione       Dismissione    Autore  Fabrizio Ca
197. muso  email  camuso camuso it sito web  www camuso it   Pag  8    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Architettura hardware e software di un sistema di elaborazione       Per capire cosa sia un linguaggio di programmazione e come utilizzarlo per scrivere programmi     prima necessaria  una panoramica che mostri a grandi linee il funzionamento di un sistema di elaborazione     SCHEMA A BLOCCHI DI UN SISTEMA DI ELABORAZIONE    Periferiche di        Periferiche di  output  monitor        Periferiche di  input   output   modem     LT    Supporti di memorizzazione    Nota  tecnicamente parlando  i supporti di memorizzazione di massa di massa  dischi  nastri  CD   sono ancora periferiche di input output  La loro importanza    per      tale da meritare un trattamento a parte              Il cuore del sistema    la CPU  Central Processing Unit  Unit   centrale di processo   Nei personal computer la CPU     rappresentata da un singolo chip  il microprocessore   Pentium  Celeron  Athlon  Sempron  PowerPC  non vi dicono  nulla questi nomi      La CPU    il    cervello    del sistema  Il software di base  il BIOS che controlla direttamente l hardware  windows linux  cio   i sistemi operativi  gli strumenti di programmazione ed altre utilit   di sistema  ed anche quello applicativo   programmi di video scrittura  contabilit    giochi ecc      formato da istruzioni  molte istruzioni  Per avere un idea della  complessit    pensate che un software applicativo come 
198. n  in questo caso niente dubbi         writeln      meglio scapoli         end   IF nidificati  gli if possono contenere altri if  si parla di if nidificati  IF in cascata      troviamo il massimo tra a bc    if condizionel then  if a gt  b then so  if a gt  c then else  writeln  il max e  a   if condizione2 then  else sis  writeln  il max e  c   else  else if condizione3 then  if b gt  c then sia  writeln  il max e  b   Else  else    writeln  il max e  c       SELEZIONE A MOLTE VIE    Cominciamo con il dire e non    una struttura indispensabile ma solo una comodit       stata introdotta per sostituire la  struttura degli ifin cascata che rischia di diventare poco leggibile  Ecco qui sotto le due strutture a confronto nel  compito di determinare quanti giorni ci sono in un certo mese dell anno  la variabile mese contiene un numero da 1 a  12  la variabile anno il numero che corrisponde all anno di riferimento     Case eta of    If mese 2 then 1  11  writeln     sei un poppante          If anno mod 4   0 then 12  15   Giorni  29    bisestile    begin  Else   writeln    OK  dimmi come ti chiami       Giorni  28 readIn  nome     Else end   If  mese 1  or  mese 3  or  mese 5  else  or  mese 7  or  mese 8  or  mese 10  begin    or  mese 12  then writeln    Matusa non ammessi             EI Giorni  31 writeln    Premi invio per continuare       _ DO readin  Giorni  30 nd    end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  34    Gestione Archivi
199. na delle chiamate     StampaAlbero inizio         StampaAlbero inizio sx  StampaAlbero inizio  dx     StampaAlbero inizioY dx  dx   StampaAlbero inizio  sx  sx     ceo  ceo  Q StampaAlbero nil     StampaAlbero nil  StampaAlbero nil     E    molto importante capire che in un certo istante avremo pi   copie della procedura StampaAlbero attivate  ma una  sola    funzionante       Infatti la prima chiamata   StampaAlbero inizio    chiama s   stessa con il puntatore al suo figlio  di sinistra e deve poi letteralmente rimanere in attesa alla riga n  2 aspettando la fine dell   esecuzione di  StampaAlbero inizio  sx   E quest   ultima dopo aver stampato la parte informativa del suo nodo aspetter   alla stessa  riga per lo stesso motivo e cos   via  Riferendosi al disegno precedente  verranno chiamate in sequenza ben 4  StampaAlbero che esplorano tutto la parte a sinistra dell   abero  fino a raggiungere la prima foglia  l   ultimo nodo in  basso a sinistra   Solo dopo che il meccanismo avr   fatto esplorare tutti i nodi a sinistra della radice  la procedura  che ha ricevuto inizio come puntatore e che    stata fino ad ora in attesa potr   continuare la sua esecuzione e  chiamare s   stessa sul figlio di destra  di nuovo si mette in attesa per la fine dell   esecuzione di questa chiamata che  prima far   esplorare tutti i nodi alla destra della radice  Solo allora la prima procedura terminer      raggiungendo il  suo end        Quando la procedura    chiamata con NIL non fa niente ma
200. nction posizione_min vet  vettore_interi  N  integer  integer   var pos_min integer   begin   pos_min   1     for i  2 to N do  if vet i   lt  vet pos_min  then    trovata posizione i con valore pi   piccolo     pos_min    i     posizione_min    pos_min  end     NOTA  se nel vettore ci sono pi   elementi minimi con lo stesso valore  viene individuato il primo  quello con indice  minore   Infatti quando viene confrontato il primo minimo con gli altri la condizione vet i   lt  vet pos_min  non     verificata e l   aggiornamento della posizione non viene effettuata  Aggiungendo l   uguaglianza al confronto  vet i    lt   vet pos_min   verrebbe invece localizzato l   ultimo minimo  quello con indice superiore            6  Posizione dell   elemento con valore massimo in un vettore di N elementi  con N lt  MAX_ELEMENTI       E    sufficiente cambiare al punto precedente posizione_min con posizione_max   lt  con  gt  e pos_min con pos_max per  ottenere l   algoritmo desiderato     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  122          Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          7  Ricerca della posizione di un valore in un vettore di N elementi  con N  lt  MAX_ELEMENTI          writeln    Quale elemento cerchi        OSSERVAZIONI  readIn cercato    Se l elemento non viene trovato la variabile posizione rimarr    posizione  0  0  E    importante controllarla prima di usarla  Ad esempio  if  posizione gt 0 then       elem
201. ndi un errore grave il seguente  ERRORE        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  71                      Sei l   et      minore di 18 allora          applica sconto             altrimenti    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    eta  lt  18          applica prezzo pieno        sconto  lt    prezzo   100    10                Nota  nel flow chart immaginiamo che  le variabili eta e prezzo abbiano gi   un       sconto  lt   0                ao    valore valido e che i calcoli indicati siano quindi fattibili  Lo sconto  10   viene calcolato dividendo il prezzo pieno  per 100  calcolando cos   l    1   e moltiplicando il risultato per 10  ottenendo il 10                            Se  la temperatura supera 37 C  allora  fai suonare l allarme           Come potete vedere se non c      nulla che deve essere fatto quando la  condizione    falsa  si congiunge la parte    falso    direttamente con il    connettore     questo tipo di selezione       detto a una via    NOTA IMPORTANTE  in ogni diagramma che rappresenta la selezione       ci deve essere sempre jun solo punto di ingresso   la freccia entrante nel rombo  ed                        attiva allarme          ona                lun solo punto di uscita  il       connettore finale   Evitate quindi frecce che dall   interno escono verso altri punti del diagramma o che dall   esterno    giungono in un punto interno     NO     ERRORE        v  1       attiva allar
202. nit   di controllo comanda a questo punto al decodificatore di leggere dal registro istruzioni il codice numerico  dell istruzione e di    capire    che cosa    richiesto     Sulla base della    risposta    del decodificatore l unit   di controllo attiva in sequenza i dispositivi interessati  dall   istruzione  ad esempio  semplificando  se si dovesse calcolare A   B   C    prelevare B dalla RAM  indirizzo di B in registro indirizzi e successiva lettura     prelevare C dalla RAM  indirizzo di C in registro indirizzi e successiva lettura     trasferire alla ALU gli operandi e comandare la somma   copiare il risultato nella posizione dove in RAM si trova    C     indirizzo di C in registro indirizzi e scrittura     Nel frattempo il program counter    stato automaticamente incrementato e indica  l indirizzo della prossima istruzione da eseguire  Si pu   allora ricominciare dal punto 1   fino a che     il computer viene spento   In realt    anche dopo che il programma termina   ad esempio chiudendo Word  un altro rimane in funzione  quello che gi   funzionava  prima di Word  Windows in persona  Infatti il sistema operativo  esso stesso un insieme  di programmi     all opera dal momento dell accensione del computer fino allo  spegnimento  Quando l utente comanda  usando l interfaccia grafica  la partenza di  un applicazione  le istruzioni di quest ultima affiancano in RAM quelle del sistema  operativo ed il program counter viene fatto    puntare    alla prima istruzione  dell   ap
203. nte da due parti  quella informativa ed un puntatore all   elemento che  P    eventualmente segue nella lista  vale NIL se si    alla fine      info      info  4 info    info    NIL Una lista in uno stato intermedio   P    La lista come esempio di ADT       La lista    un esempio di ADT  Abstract Data Type  Tipo di Dato Astratto   nuovi tipi definiti dal programmatore per i  quali    definito un ben preciso insieme di operazioni     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  1       I record con il Turbo Pascal versione 1 3 Luglio 2003    Ai programmatori non interessa come sia realizzato internamente l   ADT  potrebbe essere costruito usando vettori  piuttosto che record per memorizzare i dati  usare un metodo di ordinamento piuttosto che un altro ecc    Al  programmatore interessa solo sapere come ottenere i servizi di un ADT cio   quali comandi pu   inviare ad un  esemplare di un ADT e quali risultati ottiene     Per fare un esempio     come se il Pascal offrisse solo il tipo integer  con le operazioni che tutti conoscete  Il  programmatore potrebbe aggiungere l   ADT real o string con tutte le operazioni note  Chi user   gli ADT non si  preoccuper   di come i real e le string sono memorizzate e gestite  gli basta sapere come creare variabili di quei tipi   come assegnare loro valori  fare operazioni con esse  come visualizzarle sullo schermo ecc  E non sar   possibile  chiedere operazioni non previste per quell ADT  moltiplicare due st
204. nto non appartiene all intervallo     l or  ma con diverse condizioni  e  il connettivo logico giusto quando  si vuole controllare che un punto sia ESTERNO ad un intervallo     if b lt a or b gt c  then  writeln  Non appartiene    else  writeln  Appartiene      infatti un punto NON appartiene se e  piu  piccolo dell estreo inferiore  o piu  grande dell estremo superiore          writeln  Programma terminato  Premere INVIO per continuare        readin     per dare il tempo di leggere il messaggio       end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  39    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SELS  difficolt    bassa  Inserite due misure  una in pollici e l altra in centimetri  dire qual    la maggiore       program centimetriPollici    uses  newdelay  crt    var  cm  real     variabile in cui verra  memorizzate la misura in centimetri     po  real     variabile in cui verra  memorizzate la misura in pollici       begin  clrscr     cancello lo schermo       write  Inserisci la misura in centimetri  gt       readIn cm      write  Inserisci la misura in pollici   gt       readIn po         ricordando che 1 pollice 2 54 cm        if po   2 54  gt  cm then  writeln  La misura in pollici e  maggiore     po 2 54 4 2   cm     else  if po   2 54  lt  cm then  writeln  La misura in centimetri e  maggiore    else  writeln  Le due misure sono equivalenti       writeln  Programma terminato  Premere INVIO per continuare
205. o     naturalmente raggio    un altro simbolo introdotto dal programmatore per memorizzare il dato corrispondente  alla misura del raggio        se un identificatore non viene trovato neppure nell insieme definito dal programmatore  allora il compilatore  decide che ha trovato un errore lessicale  questa fase viene infatti chiamata analisi lessicale e quella parte  del compilatore che la svolge analizzatore lessicale     e Errori sintattici ed analizzatore sintattico  Anche se viene superata la fase di analisi lessicale ci  potrebbero essere ancora errori di tipo sintattico  cio   che violano una regola sintattica di quel linguaggio  le  regole sintattiche servono a costruire frasi corrette  al di l   del fatto di aver usato singoli termini riconosciuti   Nulla di sorprendente  anche con la lingua italiana dovete rispettare delle regole  soggetto  verbo   complemento oggetto ecc  ricordate    solo che quelle di un linguaggio di programmazione sono decisamente  pi   semplici  Ed anche in italiano  pur usando tutte parole presenti sul dizionario     facilissimo scrivere frasi  senza senso     Facciamo un esempio  molti linguaggi hanno la regola che pretende che ogni istruzione sia terminata con un  punto e virgola     write    Questa istruzione contiene un errore         Mentre dal punto di vista dell analizzatore lessicale non ci sono errori  quello sintattico si accorge della  mancanza della virgola alla fine dell istruzione     Controllo lessicale e sintattico non esauriscon
206. o diventati     intelligenti        e colorano  o evidenziano automaticamente in altro modo  usando il grassetto  il corsivo  la sottolineatura ecc  le  diverse parti di un istruzione per facilitare la lettura  si parla di sintax highlightining  cio   evidenziazione della  sintassi  e cos   anche decisamente pi   difficile commettere certi errori  tipo dimenticarsi di chiudere delle  parentesi aperte      e sono in grado di completare automaticamente la scrittura delle istruzioni  code completion   il programmatore  inizia a scrivere un comando e l editor pu   proporre un elenco di tutti i comandi che iniziano con le stesse  lettere  a questo punto programmatore pu   inserire rapidamente il comando che voleva scrivere senza digitare  il resto dei caratteri  pu   anche usare delle abbreviazioni di pochissime lettere per far inserire un istruzione  composta anche da molte righe che poi verr   completata     un altra caratteristica utilissima    rappresentata dai cosiddetti tooltip  suggerimenti   mentre si sta completando  la scrittura di una istruzione complessa sopra il punto di inserimento dei caratteri appare un piccolo riquadro  che contiene informazioni sull istruzione stessa  questo meccanismo consente di risparmiare tantissimo tempo  che una volta venire impiegato per andare a consultare un manuale     e sono integrati con un sistema di aiuto  help in linea  ipertestuale  cio   navigabile facendo clic sui collegamenti  che portano ad approfondimenti  argomenti correlati
207. o do    begin  inc inizio    spazio   s inizio        end        cerco il primo carattere diverso da spazio a destra      spazio    s fine          while   fine gt  inizio   and spazio do    begin  dec fine    spazio   s fine        end     risultato      for i  inizio to fine do  risultato   risultato s i      togli_spazi  risultato  end     begin   clrscr    writeln      togli_spazi            writeln      togli spazil  a              il      il   writeln      togli_spazi  a          writeln      togli_spazil  a           writeln      togli_spazi  ab          writeln      togli_spazi   a          writeln      togli_spazil  a             writeln      togli_spazi   ab          writeln      togli spazi  ab           writeln      togli_spazi   ab             writeln      togli_spazi    readin   end     questa e    una frase              Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    SOT 17  difficolt    media Togliere da una stringa eventuali spazi inutili all inizio o alla fine della stringa stessa     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  108    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    REGOLE DI VISIBILITA     SCOPING RULES  E DURATA DELLE VARIABILI    Scrivendo programmi di una certa complessit      importante capire per ogni entit    variabili  costanti   sottoprogrammi  tipi ecc   dove pu   essere usata e la sua durata  che non    detto che si estenda dal momento in cui il  programma viene fatt
208. o il compito di un compilatore  esiste anche un controllo chiamato  semantico che non    per   il caso di approfondire in questa sede     Nota  i codice oggetto hanno di solito come estensione  obj    Il codice oggetto  risultato della compilazione  non    ancora in una forma del tutto eseguibile dalla CPU  alcune parti  del codice sorgente non possono essere tradotte dal compilatore perch   rappresentano dei riferimenti   link  a dei  comandi esterni che non fanno parte direttamente del linguaggio di programmazione in uso ma sono resi disponibili  in raccolte chiamate librerie   library                  Queste ultime sono un preziosissimo strumento per la programmazione  una volta che un problema    stato risolto il  codice corrispondente  gi   tradotto in linguaggio macchina  pu   essere depositato in una raccolta  la libreria  dalla  quale potr   essere estratto per essere incorporato in altri programmi che ne hanno bisogno     Ad esempio  immaginiamo di avere scritto un comando che disegna sullo schermo una circonferenza note le sue  coordinate sullo schermo del centro e la misura del raggio  il codice sorgente viene compilato e tradotto in codice  oggetto  da notare che anche in questo caso ci potrebbero essere della parti ancora non tradotte     ed aggiunto con  un programma apposito ad una libreria  immaginiamo che si chiami grafica lib  dove  lib    naturalmente l estensione  con cui sono di solito individuate su disco le librerie   Decidiamo di chiamare crf  abbrevia
209. o partire a quello in cui viene terminato      Quando un applicazione    costituita da un unico file sorgente e non si fa uso di sottoprogrammi il problema non  sussiste  in un qualsiasi punto del codice tra il begin di inizio e l   end finale possiamo far riferimento ad una variabile  qualsiasi  ad una costante qualsiasi ecc  queste stesse variabili esistono dal momento in cui il programma inizia la  sua esecuzione fino al momento in cui il programma viene terminato     La situazione si complica quando in un programma si dichiarano dei sottoprogrammi  procedure o funzioni   infatti  possiamo avere parametri con lo stesso nome di variabili o costanti del programma principale  oppure variabili o  costanti dichiarate nelle rispettive sezioni del sottoprogramma e che hanno lo stesso nome di variabili e costanti del  programma principale  Cerchiamo di mettere a fuoco la situazione con un esempio     program principale  In quali punti del codice    visibile la variabile A dichiarata nella sezione var  del programma principale   var A  integer  S  string     X  real  Quando ci troviamo all interno del blocco begin     end  del programma  principale e tentiamo di assegnare un valore alla variabile A  viene usata  procedure P A  integer   quella dichiarata nella sezione var del programma principale oppure quella  var S  real  dichiarata come parametro per la procedura P   begin  write A   E quando ci troviamo all interno del blocco begin     end  del programma  S    3 14 X   principa
210. o si crede  e di dichiarare poi  variabili di quel tipo  Uno di questi tipi di dato    il record     Vediamo l esempio della scheda anagrafica visto poc anzi   program ProvaRecord     Type Una_ Persona  TPersona   record  Cognome  string     f Cognome  Nome  string  L    Eta  integer Nome  End   PE Eta  Var       Una_Persona  TPersona     Il nuovo tipo si chiama TPersona  la T  per nulla obbligatoria  aiuta comunque a ricordare che si tratta di un T ipo      nuovi tipi devono essere definiti in una sezione specifica  dopo le costanti  la sezione type  Potete naturalmente  definire anche pi   di un tipo  Il tipo TPersona contiene tre valori  chiamati campi del record   cognome  nome ed eta   con i nomi delle variabili    sempre meglio evitare gli accenti         Non    possibile lavorare direttamente con i tipi  non potete ad esempio scrivere integer  3    ma    necessario  dichiarare variabili di quel tipo  Nella sezione var trovate quindi la variabile Una_Persona di tipo TPersona     Qui sopra potete vedere  a fianco della definizione del nuovo tipo  una rappresentazione grafica del record  l   intero  rettangolo esterno    il record  all interno i componenti  Ma come si    riempiono    di dati le caselle tratteggiate     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  127    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Ecco il comando per memorizzare la stringa    Rossi    nel campo cognome     I  Cognome  L    Una_ Persona 
211. o web  www camuso it   Pag  93    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Passaggio di parametri per indirizzo  by reference     Come abbiamo visto  il passaggio di parametri per valore non consente la modifica di variabili esterne  Qualche volta  per   questo    proprio ci   di cui abbiamo bisogno    Immaginiamo di volere scrivere un sottoprogramma per il calcolo  delle due radici reali  se esistono  di un equazione di secondo grado     function equazione2grado a  b  c  real    real   begin        Calcoli      end     Gli unici valori di cui questa funzione ha bisogno sono i coefficienti del termine di secondo grado  del termine di        buvb      4ac  2a    giustificata la presenza dei tre parametri chiamati a  b e c  Purtroppo  per    una funzione pu   restituire un solo  valore  impossibile  quindi  far restituire con i meccanismi noti i due valori corrispondenti alle due soluzioni richieste   La situazione parrebbe senza vie d uscita  o si fa restituire la funzione la prima delle due radici  X1  oppure si fa  restituire la seconda  X2         primo grado e del termine noto  per applicare la notissima formula x       Ecco quindi    Qualcuno potrebbe essere tentato dalla seguente strada  ma  come appena visto  assolutamente da evitare         program equazioni   var x1 x2  real   Questa soluzione utilizza direttamente due    function equazione2gradola  b  c  real    real  variabili del programma principale  Si tratta di una    begin Calcoli pratica 
212. o_mm    minuti e    avanzano   secondi     readin    end           SOT 8  difficolt    bassa Estrarre la parte decimale di un numero reale X  quella  dopo la virgola    in pratica simula  la funzione standard frac    Esempio  decimale 13 75     gt  0 75        program parteDecimale   uses newdelay crt      NOTA  Con il Pascal la parte decimale e  separata da quella intera da un punto  non dalla virgola   NOTA  Viene sfruttata la funzione predefinita TRUNC  che elimina la parte decimale da un reale   TRUNC 10 7    gt  10       function decimale x  real   real   begin   decimale    x   trunc x    end     begin  clrscr       esempi d uso         writeln  decimale 0 8917  4 4       0 8917     writeln  decimale 4 8917  4 4       0 8917     writeln  decimale 368 8917  4 4      0 8917       writeln  INVIO per continuare        readin  end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  98    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SOT 9  difficolt    bassa Dato un carattere dire se rappresenta una lettera maiuscola        program controllaMaiuscolo   uses newdelay crt        restituisce true solo se il carattere e    una lettera maiuscola cioe  solo se il suo codice ascii e  compreso tra quello  della A e quello della Z     function isUpCase c  char    boolean   begin  isUpCase      ord c   gt   ord  A     and   ord c   lt   ord  Z       end     begin  clrscr        esempi d uso         writeln  isUpCase   2   i  write
213. ogramma    principale per richiamare la procedura stessa                parametri indicati nella procedura sono chiamati  parametri formali  quelle indicate nel programma al momento  dell utilizzo del sottoprogramma sono invece chiamati parametri attuali     program esempio   var numero  integer  simboli  string           II passaggio    by value  il sottoprogramma       Parametri formali    procedure asterischi quanteRighe  integer  riga  string   non pu   modificare il valore dei parametri  var i  integer  attuali numero e simboli   begin  for i  1 to quanteRighe do   I valore che la variabile del programma  alla Numero ha al momento dell uso del  sottoprogramma viene assegnato alla  begin ariabile parametro formale  writeln     quante righe di   devo stampare        corrispondente  quanteRighe   La stessa  readin  numero    cosa avviene per il secondo parametro  Di    atto il sottoprogramma opera su una  copia dei parametri attuali e della copia  pu   disporre come preferisce senza    Parametri attuali alterare realmente il valore delle variabili  asterischi  numero  siMbOl J     readin   end     writeln     che simboli uso per la stampa         readin  simboli         Se la procedura potesse invece modificare  senza che il suo utilizzatore ne fosse consapevole  le variabili che  corrispondono ai parametri attuali si correrebbe il rischio di incappare in errori molto difficili da scoprire     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  9
214. ol  diffusissimo in ambito gestionale e commerciale   il mitico  Basic  il linguaggio che ha aperto  per la sua semplicit    la porta della programmazione a milioni di utenti anche non  esperti di informatica   il Pascal  usatissimo negli ambienti scolastici   il Lisp ed il Prolog  usati per sviluppare  programmi di intelligenza artificiale   il C    il successore del C   Concludiamo con un linguaggio che sta  rapidissimamente conquistandosi i favori dei programmatori perch   molto adatto a sviluppare programmi funzionanti  su Internet  Java  che molto ha in comune con il C        Ad ognuno il suo  Ma se questa    solo una scelta dei principali linguaggi  quanti sono in tutto   Il numero preciso non     noto  ma    certo che superi qualche centinaio     Come mai   Per lo stesso motivo per cui esistono in fondo tanti  linguaggi anche all   interno del nostro  esiste un linguaggio matematico  osereste negarlo  pensando all algebra  alle  formule matematiche ecc      un linguaggio filosofico  uno giuridico ecc  A seconda dell ambito applicativo pu    convenire usare un linguaggio specializzato  Il Fortran deve il suo nome al termine    Formula Translator     cio    traduttore di formule  il suo dizionario    ricco di comandi per calcoli matematici complessi  Il Cobol l opposto     ricco  per   di comandi per gestire efficientemente archivi sui dischi  che    proprio ci   che occorre per sviluppare programmi  di gestione aziendale  Attenzione  non    che con un linguaggio si poss
215. olari da analizzare attentamente quando la velocit   di  reperimento dei dati    il fattore critico  diversamente l   organizzazione ad indici risulta pi   conveniente e  sufficientemente performante     OPERAZIONI DI BASE PER LA GESTIONE DEI FILE IN PASCAL       Qualunque sia l organizzazione fisica possiamo individuare alcune operazioni di base tipiche  Per ciascuna di queste     importante  oltre al risultato  essere in grado di rilevare i motivi di eventuali errori  fine dello spazio su disco  disco in  avaria  disco non trovato  file non trovato ecc    Il controllo degli errori inevitabilmente rende il codice pi   pesante   pi   difficile da leggere  per questo motivo vedremo solo alcuni esempi seguendo i quali lo studente volenteroso   J    potr   perfezionare tutto il resto del codice     NOTA  le considerazioni che seguono sono specifiche del linguaggio Pascal ma mantengono gran parte della loro  validit   anche per linguaggi diversi  Ogni volta differenzieremo tra file di testo e file tipizzati     Collegamento al file esterno   procedura ASSI GN       Un file viene individuato dal suo nome e dal suo indirizzo fisico  path   Ad esempio  C  dati 2002 lettere clienti milano ecc  lettera doc  In un programma Pascal per comandare le varie operazioni con  un certo file si invece un nome logico scelto dal programmatore  ad esempio lettera   Il nome logico    pi   pratico e  rende anche possibile cambiare il nome e la posizione di un file su disco senza dover necessariament
216. onali   versione 3 1 Settembre 2004    Oltre alla riduzione della complessit   la metodologia top down offre un altra caratteristica  consente di allestire la  struttura portante dell intero programma senza aver completato i singoli componenti  cos   da poterlo provare nei suoi  aspetti macroscopici  Per fare un paragone    come se avessimo a disposizione il prototipo di un automobile con il  telaio  ma non i vetri e le rifiniture   il volante e le ruote  ma un finto servosterzo e niente copertoni   il cruscotto con  i controlli ma senza un vero impianto elettrico  pedali e cambio ma niente sistema di frenatura e solo un abbozzo del  motore  Certamente tutto questo non ci permetterebbe di fare un giro di pista a Monza ma consentirebbe agli  ingegneri ed ai meccanici di salire veramente in macchina e saggiare dal vivo almeno le caratteristiche e economiche   visibilit    comodit   del posto guida  spazi interni  corretta disposizione dei controlli eccetera   insomma non    come  avere singoli pezzi  pur funzionanti ma che non consentono di trovare il tutto almeno in alcuni dei suoi aspetti     Di nuovo  cerchiamo di ritrovare questi concetti nell esempio precedente  Dopo aver individuato i sottoprogrammi da  sviluppare il programmatore pu   rapidamente scrivere solo l intelaiatura di ciascuno di essi ma gi   collegando il tutto  a formare un programma funzionante     program MinuscoloMaiuscolo   uses newdelay  crt     function isupCase c  char    boolean  Ecco il    trucco    
217. ontrollo se il dato letto    0 IND  dalla perifera 1  che potrebbe  ADD RIS somma il dato a RIS essere la tastiera  fino a che non  STA RIS    memorizza la somma in RIS viene i lo y a i   x numero da sommare  Quando viene  JMP START torna a leggere un nuovo dato inserito lo zero si termina il ciclo di    FINE  LDA RIS     il ciclo di lettura e somma    finito lettura e si invia il risultato  istruzione  OUT 2  alla periferica 2  che potrebbe    OUT 2    scrittura del risultato sull unit   2 sl  7  gt  essere il video    HLT    fine elaborazione  RIS  WRD 0    voce per mantenere somma parziale o  END START fi NOTA  non sforzatevi di comprendere  sine programma i dettagli     ancora troppo presto      Beh  certamente meglio di una sfilza di bit  ma ancora piuttosto difficile da leggere  Inoltre questo stesso programma       inservibile con un altra CPU      un altro linguaggio assembly     totale  lt   0                o       falso    leggi dato       totale  lt   totale   dato                 scrivi totale         Non solo  un programmatore abituato a programmare per un altra CPU  e quindi con    potrebbe non capirci nulla     Ci vorrebbe una specie di linguaggio universale comprensibile a tutti i programmatori   Uno strumento assai diffuso    rappresentato dai cosiddetti  flow chart  La traduzione     diagramma di flusso  perch   graficamente descrive la sequenza delle istruzioni che  verranno eseguite dal computer                 L idea alla base dei diagrammi di flusso    
218. ore dobbiamo usare una function  che si differenzia leggermente da  una procedure  ma non di molto     program esempio     function estraiLotto   integer    Ho evidenziato le 2 cose che cambiano rispetto ad  begin una procedure   randomize     estraiLotto    random 90    1 1  Dopo il nome del sottoprogramma  e dopo la  end     parentesi chiusa dell eventuale lista dei parametri  che nell   esempio manca  si mettono i due punti ed il    begin tipo del valore che viene restituito     writeln     primo numero lotto estratto           writeln estrailatta J 2  La function DEVE terminare con l    assegnazione    writeln     secondo numero lotto estratto      al suo nome del valore da restituire a chi usa la    writeln   estraiLotto    function   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  88    Sottoprogrammi con uso di parametri    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    La funzione estraiLotto non pu   essere utilizzata per altre simulazioni  ad esempio per un gioco di dadi  dove   ovviamente  l intervallo di valori e quello che va da uno a sei   Possiamo per   riscrivere la funzione in modo da poter  indicare al momento della chiamata il massimo numero da estrarre  Cambiamo anche il nome della funzione in    quanto sarebbe fuorviante lasciare il riferimento al lotto     program esempio     function estrai Massimo  integer    integer   begin   randomize    estraiLotto    random massimo    1  end     begin  writeln
219. ore potrebbe specificare una tonalit   di colore di  un immagine in un file jpeg  uno dei formati grafici pi   diffusi      La fine di questi file non    segnalata dal carattere CTRL Z ma attraverso altri meccanismi  ad esempio tenendo  traccia della lunghezza in byte del file   Anche i byte con valore numerico 13 e 10  i CR e LF dei file di testo  non  hanno un significato particolare     Le istruzioni di lettura scrittura per questi tipi di file permettono tipicamente di leggere blocchi di byte di  dimensioni specificate dal programmatore     Sono adatti per memorizzare qualsiasi tipo di file  testo compreso  ovviamente non potremo sfruttare le primitive  di lettura e le particolarit   dei file di testo   Sono file binari le traduzioni in linguaggio macchina dei programmi   immagini  suoni  archivi di basi di dati per i quali si    preferito questo formato a quello testuale ecc     3  Filetipizzati  sono file per i quali le unit   informative  chiamate record in Pascal  hanno una struttura  un tipo   ben precisa  Come i record Pascal gestiti in RAM  i record su file sono comodamente suddivisi in campi  fields    Ad esempio     type  TCalciatori Record    matricola  integer   cognome  string   nome  string   ecc    end     var FileCalciatori  file of TCalciatori   Le istruzioni di lettura scrittura sono in grado di leggere scrivere un intero record per volta  di spostarsi per  leggere scrivere in una posizione qualsiasi del file  e  operazione impossibile con i file di testo
220. osti    Immaginate se invece degli  alunni di una sola classe considerassimo quelli dell   intero istituto per una qualche statistica     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  113    I     Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ED ECCOLA SOLUZIONE       Quello che ci serve    un contenitore  si tratter   poi pur sempre di una variabile  anche se di tipo particolare  capace  di contenere non un solo voto ma un insieme di voti  Il nome del contenitore in questo modo sarebbe uno solo   risolvendo l   inconveniente del proliferare selvaggio del numero delle variabili  inoltre  come vi spiegher   tra poco   sar   ancora possibile usare i cicli per elaborare con poche righe di codice tutti i dati     VOTI          7 4 5 6 6 8 8 5                            voti 1  voti 2  voti 3  voti 4  voti 5  voti 6  ecc     e I  nome del contenitore    VOTI  Questo    il nome che il programmatore ha deciso di dare all    ARRAY   Quando l   array    come quello nel disegno soprastante  lineare  monodimensionale     anche chiamato  vettore  Esistono array bidimensionali  pensate ad una griglia tipo battaglia navale  o ad uno schema tipo  parole crociate  chiamati matrici     e Idatinon sono depositati nel vettore alla rinfusa ma tenuti in    scomparti    separati     e Ogni    scomparto    occupa una precisa posizione  1  2  3  4 ecc   specificata tramite un numero detto indice  che va indicato tra parentesi quadrate dopo il nome d
221. ottoprogramma     L   obiettivo    darne una definizione ricorsiva  esprimere un prodotto usando ancora un prodotto ma calcolato su un  valore pi   semplice   Si ragiona cos    qual    il caso pi   semplice   Quando si chiede di moltiplicare un numero per  1  il risultato    il numero stesso  Se invece dobbiamo calcolare un numero per 2 possiamo esprimere il calcolo come  il numero sommato al prodotto del numero per 1  x   2   x    x 1   Di nuovo abbiamo ricondotto un prodotto  complesso al calcolo di un prodotto pi   semplice di cui sappiamo subito il risultato  x 1   E cos   via  x   3   x   x 2   X x x 1 x 4 x x 3ecc     Schematicamente    function XperY x y  integer   real   begin  if y 1 then  XperY  x  else  XperY   x   XperY x y 1   end     xsey l    XperY x y       NOTA  come valore restituito ho scelto un real in quanto il  calcolo di prodotto pu   portare abbastanza facilmente al  superamento della capacit   di una variabile integer     x   XperY x y 1  se y gt 0       Nota  matematicamente un prodotto    in effetti una somma ripetuta     x   4  x   x   x   x che    esattamente  quanto fa la ricorsione     5 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Allocazione dinamica della memoria versione 2 5 Luglio 2003             Esempio 4  calcolo di x y con x ed y interi        Indichiamo con XpiuY x  y  il sottoprogramma     L   obiettivo    darne una definizione ricorsiva  esprimere una somma usando ancora una somma ma calcolata su un  
222. ova        begin traduzione in linguaggio macchina  writeln  sqrt 9    delle istruzioni scritte dal  end  programmatore                                Il codice della sqrt Di codice della sqrt prelevato dalla  viene estratto dalla on libreria                libreria ed  incorporato nel  programma finale                   In commercio sono poi disponibili parecchie librerie per i compiti pi   svariati  Se una libreria    fatta bene vale mille  volte i soldi che costa  sviluppare software costa MOLTO  Su Internet    facile trovare ed acquistare queste librerie     Su internet  soprattutto sui siti dedicati alla programmazione si trovano anche MOLTE librerie gratuite   Scriversi i sottoprogrammi da soli raggruppandoli poi in librerie  che possono essere scambiate  rese disponibili    gratuitamente su Internet o vendute   Un sottoprogramma viene scritto di solito prima all   interno di un programma  normale e solo in un secondo tempo viene aggiunto ad una libreria     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  85    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Come si fa in Turbo Pascal ad usare un sottoprogramma di una libreria   Prima della sezione VAR del programma si mette una sezione intitolata USES e si elencano  separati da virgole  i nomi  delle unit che contengono i sottoprogrammi che si vogliono utilizzare  Come dicevo prima  i sottoprogrammi clrscr e  gotoxy   sono contenuti nella unit crt e quindi per usarli     p
223. per definire elemento dovremmo gi   sapere cosa sia elemento     Il Pascal offre una scappatoia  prima della definizione di elemento possiamo definire un tipo puntatore ad esso  Si    chiama dichiarazione forward  in avanti   E    un eccezione  il compilatore sa che dovrebbe trovare la dichiarazione di  cosa sia elemento dopo     type  puntatore     elemento     OK  il compilatore si aspetta di trovare dopo cosa sia elemento       elemento record    inf  integer     informazione     pun  puntatore    il compilatore sa gi   cos    il tipo puntatore     end     Una volta definiti i tipi    necessario dichiarare una variabile che rappresenta l   inizio della lista     var  InizioLista  puntatore     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  2    InizioLista       I record con il Turbo Pascal versione 1 3 Luglio 2003    Proviamo a creare un nodo isolato di questa lista     begin     creiamo il primo nodo     new InizioLista    InizioLista    un puntatore  InizioLista     l    oggetto puntato  un record   per accedere ai suoi campi informativi si usa la notazione    punto      InizioLista  inf    quindi la sua parte informativa  InizioLista  pun quella  puntatore  Dopo queste istruzioni possiamo rappresentare graficamente  la lista cos       InizioLista   inf  12   InizioLista   pun  nil     ao NIL    Creiamo un secondo elemento  per il momento non collegato al primo      var  InizioLista  puntatore   NuovoNodo  puntatore     nda cz paria NIL 
224. plicazione  che inizia cos   ad essere eseguita  A programma terminato si riprende  ad eseguire il sistema operativo  Durante il suo funzionamento l applicazione pu    richiamare parti del sistema operativo  richiesta di servizi   il punto a cui si era arrivati con l applicazione viene prima  memorizzato  per poter riprendere  dopo che il sistema operativo ha esaudito la richiesta  il programma esattamente  dall istruzione a cui era stato interrotto           La fase in cui si provvede a prelevare il codice numerico dell istruzione da eseguire    chiamata  fase di fetch   prelievo      La fase in cui il decodificatore interpreta l istruzione  determinando le microoperazioni che verranno poi eseguite  dall unit   di controllo    chiamata  fase di decode  decodifica         La fase in cui le microoperazioni sono effettivamente portate a termine  attivando nella giusta sequenza i dispositivi  interessati    chiamata  fase di execute  esecuzione         II ciclo fetch  decode ed execute viene ripetuto a velocit   incredibili  oggi miliardi   gt    di milioni di volte al secondo  1 volta al secondo   1 Hertz   1Hz  un milione di  volte al secondo   1 Mega Hertz   1Mhz  1Ghz  un miliardo   Le fantastiche  capacit   di un sistema di elaborazione sono tutte qui  una velocit   pazzesca ed  ii una memoria perfetta nell eseguire istruzioni semplicissime  sposta un byte di qua  e mettilo di l          E  come se un muratore usasse mattoni grandi come pezzi del  lego  le istruzioni sempli
225. potr   farlo in seguito     riaprendo    i file   Diversamente immaginate tra la rewrite e  la close le istruzioni che aggiungono nuove righe  file di testo  o schede  file tipizzati      N OTA  close restituisce anche al sistema operativo tutte le risorse usate per la gestione del file     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  140    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Scrittura   le procedure APPEND  file di testo   WRI TELN  file di testo  e WRITE  file tipizzati        Le procedure writeln e write permettono rispettivamente di aggiungere una riga ad un file di testo o un record ad un  file tipizzato     Con il Pascal  per i file di testo ed i tipizzati gli inserimenti possono essere effettuati solo in fondo al file  non c     modo di inserire nuove informazioni in mezzo al file senza crearne uno nuovo     L operazione di inserimento potrebbe fallire     lo spazio sull unit      esaurito    l unit   non    disponibile  ad esempio floppy non inserito     l unit      andata in avaria    il file    gi   stato aperto da un utente in modalit   che impedisce gli inserimenti agli altri utenti    FILE DI TESTO   Ad un file di testo possono essere esclusivamente aggiunte righe in fondo al file  Non    possibile  ad esempio   posizionarsi in una posizione intermedia ed inserire una riga  Il file deve essere stato prima predisposto o con rewrite   creando un file vuoto siamo ovviamente in fondo al file      o con la
226. presentano dati  indirizzi e comandi  Ci sono tre tipi di bus     Bus dati  come suggerisce il nome  trasporta dati  il contenuto di una cella di RAM  di un registro o un byte da o  verso una periferica  Esiste un bus dati interno  sul quale viaggiano i dati all   interno della CPU  ed uno esterno che  permette lo scambio dei dati tra la CPU e dispositivi esterni  e viceversa  o tra dispositivi esterni stessi  Ho  rappresentato i bus dati con una linea a tratti piccoli  Per non appesantire il disegno non ho collegato tutti i dispositivi  che si possono scambiare dati grazie al bus interno  Le frecce indicano naturalmente il senso di percorrenza           Nelle moderne architetture esistono bus specializzati per scambiare dati con periferiche che consumano questi ultimi  ad un tasso elevatissimo  Un esempio    rappresentato dalla scheda grafica  essa sfrutta bus dedicati  connessione  AGP  oggi in via di sostituzione con i collegamenti Serial Ata         Bus indirizzi  ogni volta che la CPU legge o scrive un dato dalla RAM deve prima impostare il relativo indirizzo    pensate al bus indirizzi come ad un bus dati specializzato nel trasportare indirizzi  Ho indicato il bus indirizzi con una  linea a tratti larghi     Bus controlli     l insieme delle linee su cui viaggiano i comandi  segnali elettrici  che la Control Unit invia a dispositivi  esterni  serve anche ai dispositivi esterni per segnalare eventi particolari alla CPU  avete presente cosa accade  quando finisce la carta
227. quali sono le istruzioni da ripetere  per quale motivo fermarsi al  primo write piuttosto che al secondo    l aver allineato i comandi write writeln serve solo a rendere piu  leggibile il  codice per noi     ma per il compilatore significa comprendere nel ciclo for SOLO LA RIGA SUCCESSIVA     for i    1 to QUANTE_VOLTE do  write  N  riga         write i    writeln   come programma mi sento un po  stupido         writeln                              DE    prova a togliere il begin end e sperimenta personalmente che il ciclo    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  58    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    stamperebbe per dieci volte la scritta  N  riga   e solo una volta il  resto       A COSA SERVE ALLORA AVER COMPLICATO IL CODICE     RISPOSTA  AD AVER MAGGIOR CONTROLLO  COME MOSTRATO NELLA  TERZA SOLUZIONE           TERZA SOLUZIONE  questa volta si  pretende  che il messaggio che precede il numero di riga  sia scritto in rosso  il numero di riga in giallo e la scritta in verde       writeln  TERZA SOLUZIONE         for i    1 to QUANTE_VOLTE do   begin  textcolor RED   write  N  riga        non va a capo         textcolor YELLOW   write i      non va a capo         textcolor GREEN   writeln   come programma mi sento un po  stupido          end        commenti  solo costruendo il messaggio una porzione alla volta usando il write e  possibile intervallare i comandi  per la selezione del colore       writeln  P
228. quanta istruzioni incriminate     e guai a dimenticarcene una      La soluzione  i sottoprogrammi   Per fortuna una soluzione c    e la sapete gi   usare  Lo avete fatto tutte le volte che avete usato comandi come  sqrt 9  o clrscr  Questi comandi richiamano un programma secondario  si parla infatti di sottoprogrammi  che  svolgono il compito previsto  Nel caso della sqrt il compito    il calcolo della radice quadrata di un numero  quello che  deve essere specificato tra parentesi dopo il nome del comando   nel caso di clrscr non deve essere calcolato nulla  ma semplicemente cancellato il video  Dopo l esecuzione del comando il programma principale continua la sua  elaborazione     ESEMPIO  calcolo della radice quadrata di un numero    Program prova    var  x  real     il numero di cui si vuole la radice quadrata     radice_quadrata  real      il risultato da calcolare       begin  writeln    Inserisci un numero ed io calcolero    la sua radice quadrata         readin x      radice_quadrata  sgrt x      per soddisfare la richiesta della riga precedente il programma principale si    ferma    e  richiama il programma secondario sqrt  quando si riceve il risultato  il programma    principale continua con la riga qui sotto stampando il valore calcolato          writeln    risultato       radice_quadrata     readin   end     Tipi di sottoprogrammi  procedure e funzioni  Quando un sottoprogramma restituisce al programma principale un valore  come sqrt con la radice quadrata  si  ch
229. r i    1 ton do  writeln  i          commenti  e  ancora materia di disputa tra matematici se considerare lo  zero un naturale  se lo si vuole considerare tale il codice diventa     for i    0 to n 1 do  writeln  i      infatti se chiedessimo i primi 5 naturali dovremmo ottenere  0 1 2 3 4  e sarebbe quindi necessario fermare il ciclo a 4  cioe  n 1          writeln  Programma terminato  Premere INVIO per continuare        readin     per dare il tempo di leggere il messaggio     end              ITE2  difficolt    bassa  stampa dei primi N numeri naturali  con N letto da tastiera  la stampa deve avvenire dal  numero piu  grande al piu  piccolo       program numeri   uses newdelay  crt     var  i  integer     contatore ciclo    n  integer     qui viene memorizzato il numero letto da tastiera       begin  clrscr     cancello lo schermo       write  Fino a che numero devo arrivare    gt       readIn  n       for i    n downto 1 do    NOTATE IL DOWNTO INVECE DI TO          writeln  i       writeln  Programma terminato  Premere INVIO per continuare        readin     per dare il tempo di leggere il messaggio       end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  50    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004             ITE3  difficolt    bassa  stampa dei primi N numeri naturali  con N letto da tastiera  a fianco di ciascun numero  indicare se e  pari o dispari       program numeri   uses newdelay  crt     var  i  integer  
230. r i  1 to 20 do  writeln random n  1          CONCLUSIONI    La formula che genera un numero casuale tra 1 e N e    RANDOM N    1      readln     end              ITE10  difficolt    bassa  utilizza la random per estrarre numeri tra A e B       program estrai_AB   uses newdelay  crt   var i a b  integer     begin  clrscr        random N  estrae numeri tra 0 ed N 1  immaginiamo di voler estrarre numeri  tra 5 e 12  e  sufficiente aggiungere a 5 un numero casuale tra 0 e 7  intuitivamente  infatti  5 0 5 e 5 7 12  in generale dovremo aggiungere  al primo estremo  A  un numero casuale tra 0 e B A          write  Che A vuoi usare    gt       readIn a      write  Che B vuoi usare    gt       readIn b         estraiamo 20 numeri da A a B        NOTA  attenzione  random B A  estrarrebbe numeri tra 0 e  B A    1  e  quindi necessario indicare random  B A 1      for i  1 to 20 do  writeln  A   random B A 1        readIn   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  56    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004             ITE11  difficolt    bassa  generazione di una colonna di una schedina del totocalcio  program colonna_totocalcio    uses newdelay  crt    var i  integer  risultato  integer    begin   clrscr        randomize       non potendo estrarre la X  useremo un numero al suo posto  il 3  generiamo  allora 13 numeri da 1a 3        for i  1 to 13 do  begin   risultato   random 3  1   if risultato   3 then  writeln  
231. ra come si rappresentano le strutture    fondamentali della programmazione  sequenza  selezione  iterazione      Sequenza    Per indicare che due istruzioni vanno eseguite una dopo l   altra si mettono i loro simboli uno sotto l   altro    collegandoli con una freccia  Ecco un esempio     Calcoliamo quante settimane ci sono in un anno dividendo il  numero dei giorni per 7     Memorizziamo prima il risultato della divisione nella    variabile quante     Poi scriviamo un messaggio sul video che    annuncia    il  risultato      em               quante  lt   365   7             prima questa istruzione           S  Settimane in un anno     poi questa           Infine scriviamo il risultato  cio   il valore attuale della  variabile quante     ed infine questa       S quante       Il senso della freccia pica il flusso di esecuzione     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Pag  70    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Selezione  decisione  scelta  alternativa     Il solo fatto di poter indicare un   istruzione dopo l   altra  sequenza  non ci consentirebbe di sviluppare programma  interessanti  Ci sono innumerevoli situazioni in cui    necessario fare un    controllo    ed agire di conseguenza     Esempi             Se l   anno    bisestile  allora  considera febbraio con 29 giorni  altrimenti  consideralo con 28                                               Se l   et      minore di 18 lallora  applica sconto  altr
232. ra errore e ha messo il valore zero  se la conversione non riesce 1  errore viene emesso un valore diverso da zero          Str x  s        Converte il numero x nella stringa corrispondente memorizzandola nella variabile stringa s       Incremento decremento del valore di una variabile        x  x  l  x assume il valore attuale incrementato di uno  x diventa x incrementato di uno     ATTENZIONE  non confondetelo con la scrittura x   y   1  test di confronto tra il valore contenuto nella variabile x  e quello della variabile y incrementato di uno     x    X   5 2  x viene incrementata di 5 2  evidentemente il tipo di x    real     x    x 10  x viene incrementata di 10    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  28    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    PRINCIPALI OPERATORI IN ORDINE DECRESCENTE DI PRECEDENZA    Negazione logica  booleana   esempio  not x y  espressione vera se il valore della variabile x     diverso da quello di y    Negazione bit a bit  bitwise   not 10010    01101    Bu   Moltiplicazione aritmetica   i Divisione  tra numeri reali    Divisione intera   Pi Modulo  il resto di una divisione intera  5 mod 2   18 mod 5   3    And booleano   x gt 4  and  x lt 12   espressione vera se x ha un valore compreso tra 4 e 12   And bitwise  1001 and 1011   1101    Somma aritmetica  concatenazione di stringhe     ciao         a tutti         ciao a tutti        not          Sottrazione aritmetica    Or boole
233. ra perch   il codice si appesantirebbe e  diventerebbe molto pi   difficile da seguire     integer     begin   writeln     Inserisci costo prodotto        readIn  costo      writeln     Inserisci eventuale   di sconto         readIn percentualeSconto      writeln     Inserisci il tipo di cliente        readIn   tipoCliente       In riferimento al programma qui a lato  ad esempio  l utente  otrebbe inserire un costo pari a zero o negativo  una  ercentuale di sconto senza senso ed anche una descrizione  er il tipo del cliente che potrebbe     mettere in crisi    il test  fatto con l   if     Abituale    con la A maiuscola non verrebbe  iconosciuto invalido per l applicazione dello sconto           if tipoC  liente    abituale    then  costo    costo      costo 100    percentualeSconto        writeln    Questo cliente paga       costo    readin     un readin senza variabile attende fino a che non viene premuto il tasto INVIO        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  31       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    end     Altri esempi     program selezione   var  a b c  integer   s1 s2  string   c1 c2  char   begin  a  1  b  2  c  1   sl   rossi   s2   mari0    cl   a    c2   b      if a b then  writeln  a uguale b       if a gt 3 then  writeln  a maggiore 3       if b lt 6 then  writeln  b minore 6       if 3 gt  4 then  writeln  I n  maggiore uguale II          il seguente confronto segue l ordine alfabetico  
234. razione in decimale d   un certo risultato  lo stesso verr   fornito in binario dall operazione corrispondente   Potremmo dire  volgarmente  che il sistema binario       potente    quanto quello decimale        Anche le informazioni non numeriche sono comunque rappresentabili sotto forma di numeri  Consideriamo caso per  caso     Alfanumeriche  le singole cifre numeriche  le lettere dell alfabeto ed altri caratteri come la punteggiatura  basta far  corrispondere ad ogni carattere un ben preciso codice numerico  Uno tra i codici pi   diffusi    l   ASCII  secondo  questo codice  ad esempio la lettera    A       codificata con il numero 65  la    B    con 66 e cos   via  i numeri precedenti il  65 sono usati per altri caratteri   Naturalmente l   elaboratore sapr   quando interpretare un numero come tale o come    la rappresentazione di un carattere  Nota  in fondo al libro troverai un appendice con l intera tabella ASCII     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  13    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Grafiche  se il disegno    di tipo tecnico memorizzo le coordinate numeriche di ogni elemento geometrico ed altre  caratteristiche  coordinate del centro di una circonferenza e la misura del raggio  le coordinate degli angoli di un  rettangolo o degli estremi di una retta ecc    Se il disegno    pittorico  cio   fatto per punti  pixel   si memorizza per  ogni pixel il valore dell intensit   di rosso  verde e b
235. re a seconda che sia presente una  sola istruzione da eseguire  nella parte then o nella parte else  piuttosto che un blocco di due o pi   istruzioni che  vanno quindi racchiuse tra un begin ed un end  Nel primo esempio c    una sola istruzione da eseguire sia che la  condizione sia vera sia che sia falsa  Nel secondo esempio ci sono N istruzioni da eseguire quando la condizione  vera ed una sola quando la condizione falsa  Nel terzo esempio c    una sola istruzione da eseguire quando la  condizione vera ed N istruzioni quando la condizione falsa  Nell ultimo esempio pi   di un istruzione da eseguire  sia nel caso la condizione sia vera sia nel caso sia falsa     Se la condizione    vera viene eseguita l istruzione  o il blocco di istruzioni tra begin     end  dopo il then e viene    invece ignorata la parte else  Viceversa  se la condizione    falsa viene ignorata l istruzione  o il blocco di  istruzioni tra begin     end  dopo il then e viene eseguita la parte else     Condizioni composte                Le condizioni usate fino ad ora sono definite semplici  usando i  connettivi logici and  or e not possiamo  comporne di pi   complesse  composte         La condizione composta che usa and    vera quando lo sono CONTEMPORANEAMENTE tutte le condizioni  coinvolte  se ANCHE UNA SOLA di esse e  falsa  la condizione intera risulter   falsa  Ogni condizione deve  essere racchiusa tra parentesi tonde           if  a gt  1  and  a lt  3  then    le parentesi sono OBBLIGATORIE     wri
236. re di quello necessario a rappresentare un integer  ad esempio  il numero real 12 67 non viene  automaticamente troncato al valore integer 12 a causa di una perdita di precisione che potrebbe risultare  inaccettabile  il programmatore pu   per   indicare come parametro attuale l espressione trunc 12 67  che dietro  esplicito comando    tronca    un valore real in un integer  in realt   in un longint  compatibile a sua volta con un integer  a patto che il valore cada nell intervallo previsto per gli integer      i parametri attuali devono essere forniti nello stesso ordine logico previsto per quelli formali  la procedura asterischi  si aspetta il numero delle righe come primo parametro e la stringa dei singoli da usare come secondo  tentare di  invertire l ordine non ha gravi conseguenze  in questo particolare caso  perch   i tipi dei due parametri sono diversi ed  il compilatore si accorgerebbe subito del problema e bloccherebbe la compilazione con un messaggio d errore  ben  diverso    il caso di parametri dello stesso tipo  il compilatore non s accorgerebbe di nulla dal momento che dal suo  punto di vista si tratterebbe comunque di due interi o di due stringhe eccetera    Viva l indipendenza    Quella che sto per enunciare non    una regola sintattica ma una dettata dall esperienza  Idealmente un  sottoprogramma dovrebbe essere strutturato in modo da essere il pi   indipendente possibile dal programma che lo  utilizzer   o da altri sottoprogrammi              Questo obietti
237. re l approfondimento sui diagrammi di flusso per vedere come sono  rappresentate le strutture fondamentali della programmazione        Ci sono tre tipi di struttura selettiva  ad una via  a due vie  detta anche binaria   a molte vie     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  30       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    SELEZIONE AD UNA VIA    Fa eseguire una singola od un blocco di istruzioni  delimitate in questo caso dalla coppia di parole chiave begin      end  solo se la condizione indicata e vera  true   Se la condizione    falsa l   istruzione  o il blocco di  istruzioni  viene semplicemente ignorato  Ecco la sintassi  a sinistra il caso di singola istruzione ed a destra  quello con pi   di una istruzione     if condizione then if condizione then    istruzione  begin  istruzione    ma non sarebbe sbagliato  istruzione2   if condizione then sas  begin istruzioneN  istruzioneSingola end   end    Dopo istruzioneN non    stato dimenticato un punto e virgola  prima di un end pu   essere omessa in quanto il    serve a separare due istruzioni e l   end non pu   essere considerato un   istruzione ma un delimitatore     condizione    un espressione che una volta valutata deve generare un valore booleano  vero falso   le condizioni       si esprimono con gli          operatori relazionali                             OPERATORE ESEMPI   lt  minore X lt  4 X y lt Z a  lt  b c Ord c  lt 67  1  Parolal  lt  Parola2  2
238. re la fine del file  EOF  ma sarebbe molto dispendioso  Per fortuna esiste un comando  specifico  solo per i file tipizzati  secondo voi perch       filesize nome_ file_logico      Inoltre  prima di poter usare seek il file deve essere predisposto all uso  aperto  con la procedura  reset nome_file_logico   da usare ovviamente dopo l   assign     I comandi che portano oltre la fine del file sono allora   reset nome_file_logico   QUESTO COMANDO PREDISPONE IL FILE ALL USO  LO    APRE     seek  nome file_logico  filesize nome_file_logico       Ed ecco un esempio completo     type  TPersona record  cognome  string 30      e  obbligatorio definire il numero dei caratteri della stringa      codice  integer   end     fpersona file of TPersona     senza il tipo non potremmo passare un file come parametro           Var  elenco  fPersona     assign elenco     C  dati dat       reset elenco    seek elenco  filesize elenco    SPOSTATI OLTRE L   ULTI MA SCHEDA PRESENTE NEL FILE    repeat  writeln  Inserimento da tastiera di un record da trasferire poi sul file       write  Inserire un codice   zero per finire       readin unaPersona codice    write  Inserire un cognome         readin unaPersona cognome      if unaPersona codice lt  gt 0 then  write elenco unaPersona   LA SCHEDA IN FONDO AL FILE ED AVANZA    until unaPersona codice 0     close elenco      Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 2 di 177       Ricorsione     versione 2 02   Febbraio 2005    Lettura   la procedur
239. rficie di un piatto di un hard disk  partendo da una posizione  qualsiasi  non    esattamente zero ma    comunque abbastanza piccolo da ritenere  quasi  identico il tempo  necessario a leggere uno qualsiasi dei blocchi che costituiscono un file     NOTA  la distinzione tra organizzazione di un file tra sequenziale e random    indipendente dalle capacit   fisiche del  supporto ed    stabilita dalla modalit   di accesso a quel file  Ad esempio  l hard disk a livello fisico    sicuramente  random ma nulla vieta di organizzare la registrazione di un file in modo che il suo accesso sia comunque sequenziale   pensate ad un file di testo in Pascal      Nella letteratura informatica ci si riferisce alle seguenti come ad organizzazioni a se stanti ma in realt   sono tutte  costruite su quella    random        y    Con indici  quando l   accesso ai dati    velocizzato dalla gestione di strutture  su file separati o nello stesso file  dei dati  che  grazie alla loro organizzazione  consentono di risalire rapidamente alla posizione in cui trovare i  dati  Il modo di realizzare l indice pu   variare grandemente  Individuato un campo informativo in relazione al  quale si vuole velocizzare l   accesso  ricerca per codice o per cognome  ecc   l indice conterr   una copia di tutti i  valori contenuti nel file dati per quel campo  tutti i codici o tutti i cognomi ecc   affiancati dalla posizione in cui  sul file dati completo si trovano gli altri dati per quel record     L indice    mantenuto 
240. ringhe  per esempio      Per l   ADT lista semplice potremmo definire almeno le seguenti operazioni  aggiunta di un elemento all   inizio o alla fine  della lista  o in punto intermedio   aggiunta di un elemento mantenendo la lista in ordine  eliminazione di un  elemento  estrazione  l elemento tolto non viene distrutto ma resta a disposizione del programmatore   ricerca di un  elemento  visita di tutti gli elementi di una lista  controllo per sapere se la lista    vuota  distruzione della lista    Prima di scrivere le operazioni vediamo come rappresentare gli elementi della lista  un elemento deve contenere due  cose  la parte informativa ed il puntatore all elemento che lo segue nella lista  Sono due informazioni completamente  diverse  per cui la struttura dati pi   naturale da usare    il record     Verrebbe spontaneo scrivere la dichiarazione del record nel modo seguente  immaginando che la parte informativa  sia un semplice intero  realizzando cos   una lista di integer          type  elemento record  inf  integer     informazione    NO      pun     elemento    puntatore     end     Da un punto di vista logico    corretto  pun    il puntatore all elemento successivo che    in effetti di tipo elemento  per  cui un puntatore a questo tipo si scrive proprio    elemento  Purtroppo il compilatore non conosce ancora esattamente  cosa sia elemento quando dichiariamo pun perch   stiamo proprio definendo elemento e non abbiamo ancora finito   Capite  Ci stiamo mordendo la coda  
241. riteln  percentuale 20  0  2 2      20  di0 0    readin    end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  95    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SOT 3  difficolt    bassa  Calcolare un prezzo comprensivo d IVA        program provaPercentuale   uses newdelay  crt   var prezzo  iva  real        sfruttiamo la funzione scritta prima         function percentuale perc  real  numero  real   real   begin   percentuale     numero 100    perc   end     function prezzoConIVA prezzoSenzalVA  real  percentualel VA  real   real   begin   prezzoConi VA    prezzoSenzal VA   percentuale prezzoSenzalVA  percentualel VA    end     begin  clrscr   writeln  Inserire prezzo senza IVA     readin prezzo      writeln  Inserire pecentuale IVA da applicare     readin iva      writeln  Ecco il totale IVA compresa     prezzoConlVA prezzo  iva  6 2    readin     end           SOT 4  difficolt    bassa Conversione da metri a chilometri e viceversa        program conversioni   uses newdelay  crt   var metri  km  real        da m a km     function m_km quantiMetri  real   real   begin  m_km    quantiMetri   1000   end        dakmam    function km_m quantiKm  real   real   begin  km_m    quantiKm   1000   end     begin  clrscr   writeln  Inserire metri     readin metri    writeln metri 5 2   metri corrispondono a   m_km metri  5 2   chilometri       writeln  Inserire ora i chilometri      readin km     writeln km 5 2   chilometri corr
242. ritorno carrello  codice  ASCII 13  e LF  Line Feed  avanzamento di riga  codice ASCII 10      Attenzione  le righe sono terminate o solo da CR o solo da LF o da tutti e due a seconda del sistema operativo in  uso  con MS DOS Windows le righe sono terminate da CR seguito da LF      Windows    in grado di trattare anche caratteri UNI CODE  uno standard internazionale che consente  grazie  all uso di due byte per codificare ciascun carattere  di rappresentare set di caratteri molto ricchi  Per lo stesso  motivo i linguaggi pi   recenti  Delphi con il suo Object Pascal ne    un esempio  sono in grado di definire variabili  carattere aderenti a questo standard     Ecco come potremmo rappresentare graficamente un file di testo                                                                                         BOF  questa    la prima riga del file di testo  Pu   contener anche spazi come questi      CR   LF  io sono la seconda RIGA bla bla bla bla bla  CR   LF  io sono la riga pi   corta     CR   LF  CR   LF  CR   LF  CR   LF  CR   LF   EOF  EOF    Le istruzioni per scrivere e leggere dati dai file di testo sono line oriented nel senso che permettono di leggere o  scrivere intere righe del file e non solamente una parte dei caratteri di una certa riga  Abbiamo cos   comandi per  registrare una riga oppure per leggerla da un file  Una grossa limitazione dei file di testo in Pascal    che le righe  gi   inserite non possono essere modificate  riscritte        file testuali sono i
243. rogram prova              uses crt        begin  clrscr   gotoxy 10 5    writeln    sto scrivendo alla colonna 10  quinta riga dello schermo        readin   end     Prima di esaminare in dettaglio come si scrivono i sottoprogrammi con il turbo Pascal dovete essere convinti della  loro utilit       Riassunto dei benefici dell   uso dei sottoprogrammi     Risparmio di tempo e di spazio  le istruzioni che corrispondono al sottoprogramma sono scritte una volta sola   tradotte ed inserite in una libreria  il programmatore non le deve riscrivere  o copiare incollare  ma pu   richiamarle  semplicemente scrivendo il nome del sottoprogramma ed indicando tra parentesi le costanti o le variabili che  contengono i valori necessari al funzionamento del sottoprogramma  i parametri         Non incorre nei rischi del copia incolla        se viene scoperto un errore nel sottoprogramma  si modificano solo le istruzioni di quest ultimo e si aggiorna poi la  libreria con la nuova versione     poi sufficiente ricompilare linkare i programmi che ne facevano uso  questi ultimi  non sono stati modificati       se scritto in modo corretto il sottoprogramma non interferisce con il resto del programma  un sottoprogramma pu    avere le sue variabili per i cicli e per tutto il resto  ha  in definitiva  un suo spazio di lavoro che lo rende indipendente   riceverete maggiori dettagli pi   avanti     Rende il programma pi   comprensibile     palese come il codice sulla destra  a differenza di quello a sinis
244. rogramma terminato  Premere INVIO per continuare          readin     per dare il tempo di leggere il messaggio       end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  59    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    STRUTTURA ITERATIVA INDEFINITA   il ciclo repeat     until    Serve a ripetere una o pi   istruzioni fino al momento in cui la condizione specificata dopo la parola chiave until  diventa vera  Questo momento non    prevedibile da cui la denominazione    indefinita    per questo tipo di ciclo   Ovviamente il ciclo terminer   solo se le istruzioni che vengano ripetute avranno come effetto il raggiungimento  della condizione di uscita  Se questo non dovesse avvenire il ciclo si ripeterebbe all infinito  in gergo si direbbe che  il programma       andato in loop infinito    o  semplicemente     andato in loop        Nell esempio che segue si chiede all utente di inserire un valore maggiore o uguale 10  Se l utente sbaglia  inserendo  un valore minore di 10  riceve un avviso ed il dato viene richiesto  Ecco come viene programmata questa  operativit       program prova   var valore  integer     begin Sarebbe impossibile programmare la stessa operativit    repeat utilizzando il ciclo for   writeln    Inserire un numero maggiore od uguale 10         readin  valore    Chiaramente    impossibile sapere quante volte sar   necessario  ripetere le operazioni a causa di ripetuti errori da parte  if valore lt 10 then dell
245. rollo abbia un valore  diverso dalla parola    NESSUNO     per potere iniziare il  ciclo  siamo costretti ad usare un assegnamento per dare  a questa variabile un valore che soddisfi questo  requisito        una conferma del fatto che il ciclo while sia da  preferire solo in quelle situazioni in cui    importante  controllare che una certa condizione sia soddisfatta  ancor prima di cominciare ad eseguire le istruzioni del  ciclo       Pag  63    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    end   end    del while       Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  64    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ESERCIZI RIEPILOGATIVI SUI CICLI REPEAT E WHILE             ITE14 difficolt    media  Calcolo delle prime N potenze di 2  deve essere 0 lt  N lt  14          DOMANDA  PERCHE  NON SI PU   SUPERARE L   ESPONENTE 14        program potenzeDue   var   n  integer     il numero inserito dall utente       pot  integer     le potenze di volta in volta calcolate     i  integer     peri cicli       begin  writeln  CALCOLO POTENZE DI 2     writeln        continuo a chiedere un N finche  soddisfa         repeat   writeln  Inserisci n  0 lt  n lt  14         readIn n      if  n lt 0  or  n gt 14  then  writeln  Valore errato  RIPROVA  0 lt  n lt  14        until  0 lt  n  and  n lt  14         VEDIAMO PRIMA LA SOLUZIONE CON IL REPEAT        pot  1  i  0     writeln  SOLUZIONE CON IL REPEAT     repeat  writeln  L
246. scuno un cartellino di riconoscimento  Non     ovviamente possibile utilizzare un ciclo for  impossibile  infatti  sapere a priori quanti saranno i visitatori    Per lo  stesso motivo non    possibile utilizzare un ciclo repeat con uscita controllata da un contatore     invece sufficiente  organizzare un ciclo repeat in cui l uscita venga decisa dalla risposta data dall operatore ad una domanda posta dal  computer come ultimo per azione del ciclo     repeat  writeln    Inserire il nominativo del visitatore         readIn nome_cognome      writeln     Inserire la data di nascita del visitatore           readln data_nascita   Si immagina e l operatore debba rispondere digitando la    lettera S    lt istruzioni per la stampa del cartellino     gt   writeln    Sono terminati i visitatori          readIn  risp     until risp    S        Uscita dal ciclo repeat con inserimento di un valore convenzionale           un miglioramento della tecnica precedente  Quest ultima  infatti  costringe l operatore a rispondere anche molte  volte alla stessa domanda per dire quando sono terminati i dati  Il    trucco    consiste nello stabilire che il ciclo deve  terminare quando alla richiesta di uno dei dati previsti viene inserito un valore speciale  Riprendendo l esempio della  mostra potremmo decidere che il ciclo termina quando come nominativo del visitatore viene inserita la parola  NESSUNO  Ecco come potrebbe apparire il codice     repeat  writeln    Inserire il nominativo del visitatore  
247. se ed eseguendo una sequenza di passi  produce come risultato un piatto composto      In un modo pi   formale  possiamo quindi definire l algoritmo come una  sequenza ordinata e finita di istruzioni che  dato uno od una serie di  elementi in input  produce uno od una serie di risultati in output      Sequenza ordinata significa che esiste un ordine preciso in base al quale vengono eseguite le  istruzioni  d altronde sarebbe ben difficile prima sbattere un uovo e poi rompere il guscio       Sequenza finita significa che le istruzioni possono essere anche veramente tante  ma non in  numero limitato  inoltre il numero di volte che globalmente queste istruzioni vengono eseguite non  pu   essere illimitato     La sequenza delle operazioni deve essere chiara  mai ambigua  deve avere un ordine ben preciso  e  deve giungere a termine per ogni input  Tutte le istruzioni devono comportare delle azioni tra  quelle che l esecutore    in grado di svolgere  Il risultato di un algoritmo deve essere sempre uguale  indipendentemente da chi lo esegue     Se  come visto  una ricetta da cucina rappresenta un discreto esempio di algoritmo direttamente  eseguibile da un essere umano  l istruzione  aggiungere sale quanto basta  difficilmente sar    comprensibile per una macchina  ma anche tra gli umani stessi quel     quanto basta    verrebbe  sicuramente interpretato in tanti modi diversi       Un passo di un algoritmo pu   essere definito anche tramite un altro algoritmo  chiamato in questo  caso
248. semplice  invece di usare dei codici letterali  che cambiano da una CPU all altra  usare dei simboli grafici uguali per tutte le CPU   Successivamente il diagramma di flusso guida il programmatore nella scrittura del  programma nel linguaggio assembly per la CPU che deve usare  Se un domani gli si  chiedesse di riscrivere il programma per un altra CPU non dovrebbe cominciare da zero  ma potrebbe sfruttare lo stesso diagramma di flusso  Addirittura il compito potrebbe  essere svolto con la stessa efficienza anche da un altro programmatore     Qui a lato  il diagramma di flusso che descrive lo stesso algoritmo di somma di una  sequenza di numeri terminata da zero vista prima in assembly     Visivamente    semplice seguire il flusso del programma  si parte dall ovale con la  scritta  inizio   si giunge ad un riquadro in cui si associa all identificatore     totale    il  numero zero  ovvio valore di partenza per una somma     Poi si comanda la lettura di un dato  il pallino che precede indica il punto a cui far  ritorno per leggere altri dati   poi si aggiunge al totale il dato letto  nel rombo si decide  se    arrivato il momento di terminare o di chiedere altri dati  se il test  confronto del  dato letto con il numero zero  d   come risultato     falso    si segue il percorso indicato  dalla freccia con l etichetta corrispondente e si risale al punto in cui poi  chiedendo un  nuovo dato  il ciclo si ripete  se invece il test d   come risultato    vero    si segue l altra  frec
249. sere portabile  in altri ambienti hardware software    che grado di robustezza  che grado di sicurezza  che tipo di periferiche deve  supporatare ecc         Devono poi essere individuate tutte le informazioni che    necessario gestire  Queste spesso verranno memorizzate in  una banca dati  data base   Il risultato di questa fase viene di solito sintetizzato con uno schema che evidenzia i  cosiddetti insiemi entit   e le relazioni tra esse     Ad esempio     possibile individuare l insieme entit   dei quadri e quello dei pittori     Data di  nascita quadro Titolo    Codice  pittore          nome    Per ogni insieme entit   vengono anche indicati gli attributi che descrivono un esemplare di quell    insieme  Ad  esempio  per l insieme entit   dei pittori si decide che ogni pittore verr   descritto tramite un codice  un nome ed una  data di nascita  Ogni quadro verr   invece descritto da un codice e da un titolo  La freccia che da pittori e raggiunge  quadri sta ad indicare che per ogni pittore esiste un certo numero di quadri  Nella banca dati verr   creata una tabella     pittori    che conterr   su ogni sua riga i dati di un pittore e similmente per i quadri  Ogni quadro potrebbe essere  associato al suo pittore indicando nel quadro il codice del pittore              Questa fase viene chiamata  analisi dei dati        Anche per questa fase inizieremo con situazioni molto semplici  Proseguendo con l esempio di problema presentato al  punto uno  non    difficile convincersi ch
250. so it      Pag  1       Introduzione allo sviluppo del sw e manuale Turbo Pascal versione 1 0 Giugno 2005                                        Struttura iterativa indefinita while     do Pag  63  Esercizi riepilogativi sul repeat e sul while Pag  64  Approfondimento sui flow chart Pag  68    sottoprogrammi  procedure e funzioni  Pag  83  Regole di visibilit   e durata Pag  108  Gli array Pag  110    record Pag  126  I files Pag  131  La ricorsione Pag  152  Limiti della memoria allocata staticamente Pag  159  Allocazione dinamica della RAM  implementazione completa del tipo di dato astratto Pag  160    lista semplice           Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Pag  2       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Calcolatore  Non solo        Nel nostro corso useremo spesso la parola computer  calcolatore   Ed anche se questa    entrata ormai a far parte del  linguaggio comune     assai riduttiva  Questo termine sarebbe infatti appropriato per quelle  macchinette  che tenete  negli astucci e che sono in grado di svolgere giusto le quattro operazioni elementari  l estrazione di radice e poco pi       sto v    olutamente ignorando le cosiddette calcolatrici programmabili che  di fatto  sono dei personal computer in    miniatura  anche se con funzionalit   limitate      Si dovrebbe infatti parlare di sistema di elaborazione elettronico delle informazioni programmabile     Soffermiamoci su ogni termine            
251. solito piuttosto ampia  quasi sempre almeno 32 caratteri   attenzione  perch      superata la lunghezza massima non    detto che il compilatore segnali errore ma potrebbe  semplicemente considerare uguali due identificatori che iniziano con la stessa sequenza di caratteri pari a  lunghezza massima  se questa fosse otto  ad esempio  i due identificatori costoTotale e costoTot potrebbero  essere considerati lo stesso identificatore  causando situazioni d errore difficili da scoprire     Dopo il nome del programma deve essere messo un punto e virgola  Il punto e virgola    molto usato in Pascal  ed in  genere da molti linguaggi di programmazione   serve a separare due istruzioni  questo significa che se dopo  un istruzione dev essere scritta una parola riservata che di per s   non viene considerata un    istruzione il punto e  virgola pu   anche essere omesso  In ogni caso  almeno all inizio  potreste ricordare come regola semplificata quella  di mettere un punto e virgola alla fine di un istruzione  Ecco allora qualche esempio di intestazione corretta   program prova  program primoProgramma  program primo_programma     program capitolo1     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  22       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          Sezione dichiarativa       Qui il programmatore assegna un nome  identificatore  ai dati che devono essere memorizzati durante  l elaborazione     Costanti   Se un identificatore viene 
252. sono equivalenti  Fine programma  i simboli sono  equivalenti    puoi ricordare solo un simbolo a scelta     puoi ricordare solo un simbolo a  scelta         S    sta per Start     i    sta per Inizio    F   sta per fine     E  sta per End  Assegnamento o altre istruzioni generiche Scrittura di un valore sul video  i simboli  sono equivalenti    esempio  dai ad x il valore 8  puoi ricordare solo un simbolo a  scelta        ala        S    sta per scrivi     W    sta per Write   esempio di istruzione generica     attiva allarme    Lettura di un valore scritto con la tastiera e memorizzato nella variabile indicata   i simboli che seguono sono equivalenti  ricordane uno a tua scelta        Esempio  leggere dove abita una persona e memorizzare l   informazione nella variabile indirizzo    n       L    sta per Leggi     R    sta per Read    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  69    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ALTRIESEMPI    dai ad x lo stesso valore di y dai ad x il valore di y diminuito di 1    xfl  5 2   4 3  dai ad x il valore dell   espressione  5     2     4   3        scrivi sul video prima il valore della  variabile x e poi quello della variabile y    L cognome  nome    accetta dalla tastiera un primo valore che   memorizzerai nella variabile    cognome    e poi un  secondo valore che memorizzerai nella variabile     nome       I simboli visti fino ad ora servono per istruzioni singole  Vediamo o
253. ssaria molta esperienza  ed    per questo che spesso si nasce  semplici  programmatori per poi diventare analisti  o analisti programmatori                 il ruolo del programmatore   puro     quello allora di ricevere dall analista la descrizione dell algoritmo per provvedere  alla codifica  cio   scrittura  di quest ultimo usando un linguaggio di programmazione     Torneremo presto sulla questione della descrizione degli algoritmi     il  tema portante di quest anno scolastico              NOTA     corretto fare distinzione tra il  risolutore  di un problema  colui che ha ideato l algoritmo che lo risolve  e  l  esecutore materiale dei passi dell algoritmo  Nel nostro caso il risolutore    sempre un uomo donna e l   esecutore     il computer              Terminata la scrittura del programma inizia la fase di test  Sottoporre a test un programma significa provarlo   con tutte le configurazioni di dati in input normali e particolari  Di nuovo  facciamo un semplice esempio   immaginando di avere scritto un programma che  forniti due numeri in input  calcola che percentuale    il primo   rispetto al secondo  ad esempio se il primo numero fosse 50 ed il secondo 150  il risultato fornito dovrebbe  essere 33 3   periodico  50    infatti un terzo di 150      Non    difficile convincersi che nel programma la formula  usata            primo numero secondo numero  100    Fare il test di questo programma con configurazioni di dati in input  normali   significa provare il programma con
254. ssibilit    se si    BRAVI programmatori  di ottimizzare il codice per il massimo delle prestazioni    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  132    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Solo con l avvento di sistemi operativi sufficientemente evoluti  DOS  UNIX  windows NT  il programmatore ha  potuto svincolarsi dagli aspetti hardware ed in parte anche da quelli logici  II modulo del sistema operativo chiamato     file system     infatti     Y si occupa della gestione hardware  file system fisico   pilota dispositivi anche molto diversi tra loro  floppy   hard disk  CD ROM  nastri ecc   per la registrazione e la lettura di blocchi di byte        mette a disposizione delle entit   logiche chiamate file  file system logico  gestite tramite un nome ed una  posizione  path  cammino  in una struttura  di solito gerarchica  directory  sotto directory ecc    mette in oltre a  disposizione comandi per creare  eliminare  spostare  rinominare i file  questi comandi possono non solo essere  imparti grazie ad una riga di comando  MS DOS  Unix  Linux  o ad un ambiente a finestre  Windows  Unix   Linux  ma anche in un programma     L esame dettagliato del modulo file system viene svolto nel corso di Sistemi  Nel corso di Informatica interessa invece  cogliere gli aspetti pi   legati allo sviluppo del software  Che dire allora dei linguaggi di programmazione  Come si  sono evoluti in risposta a queste problematiche     A li
255. st ultima che pu   essere  utilizzata come valore terminale della variabile di controllo     writeln    La misura della superficie di questo triangolo          base altezza 2      readIn   end     del for       end     Contare come i gamberi  esiste una forma leggermente modificata del costrutto for che consente di considerare i  valori della variabile di controllo in modo decrescente contando  per cos   dire  all indietro  L esempio seguente       stampa sul video i numeri da 10 a 1     program cicli  Come vedete     sufficiente indicare invece di to la parola chiave downto e come punto di inizio un valore  var i  integer  pi   grande di quello indicato per il punto di fine   begin   for i   10 Questo esempio    molto interessante anche per un altro motivo  dimostra come sia possibile utilizzare  downto 1 do nelle istruzioni del ciclo il valore assunto in quel momento dalla variabile di controllo    writeln  i      readln    end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  49    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    ESERCIZI E RIEPILOGATIVI SUL CICLO FOR       ITEI  difficolt    bassa  stampa dei primi N numeri naturali  con N letto da tastiera             program numeri   uses ewdelay  crt     var  i  integer     contatore ciclo    n  integer     qui viene memorizzato il numero letto da tastiera       begin  clrser     cancello lo schermo       write  Fino a che numero devo arrivare    gt      readIn  n       fo
256. sta  se la condizione non    soddisfatta fin dall inizio il ciclo  potrebbe non cominciare neppure  cio   le sue istruzioni non essere eseguite neanche una volta        e il ciclo termina quando la condizione    falsa  si parla infatti di ciclo con uscita per falso     Ecco la sintassi     while condizione do oppure while condizione do    istruzioneSingola begin  istruzione1   istruzione1     istruzioneN     end       In generale potremmo dire che le tecniche per decidere la terminazione del ciclo viste per il ciclo repeat vanno bene  anche per questo ciclo con i dovuti adattamenti resi necessari dalla differente logica     Stampa dei numeri da 1 a 10  Quando stampa il 10 la condizione diventa falsa  10 non    minore di 10 ma uguale      i  0    while i lt 10 do   begin  ij i     writeln  i      end     Stampa dei multipli di tre fino al 21     i  0   while i lt 21 do  begin  i   1 3   writeln  i     end     nome_cognome             stringa nulla  vuota     while nome_cognome lt  gt      NESSUNO     do  begin  writeln    Inserire il nominativo del visitatore  NESSUNO per  terminare          readIn nome_cognome      if nome_cognome lt  gt      NESSUNO     then   begin  writeln     Inserire la data di nascita del visitatore         readIn data_nascita       lt istruzioni per la stampa del cartellino     gt     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Da notare la goffaggine di questa soluzione  Poich       necessario che la variabile di cont
257. sto che di quelli tipizzati    la funzione EOF nome_file_logico   che restituisce TRUE se siamo alla fine del file  FALSE  altrimenti     Vediamo alcuni esempi concreti di lettura     FILE DI TESTO      dichiarazioni         riapriamo il file per lettura     reset lettera         leggiamo tutte le righe fino alla fine     while not eof lettera  do  begin  readin lettera riga    writeln riga   end   close lettera      FILE TIPIZZATI      dichiarazioni         riapriamo il file per lettura     reset elenco         leggiamo tutte le schede fino alla fine     while not eof elenco  do  begin  readin elenco unaPersona    writeln unaPersona cognome       unaPersona codice   end   close lettera      Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 3 di 177       Ricorsione     versione 2 02   Febbraio 2005    Non perdiamo la bussola   puntatore all area di lavoro  BOF ed EOF       Nell uso di un file    sempre molto importante rendersi conto in che punto dello stesso si sta lavorando  Possiamo  immaginare un    puntatore    che indica la posizione     BOF    BOF  r I  file appena creato     vuoto   rad EOF  EOF    siamo all inizio del file  BOF    Begin Of File  e   contemporaneamente alla fine il file contiene gi   dei dati  siamo posizionati in un siamo alla fine del file  in questa    EOF  End Of File  punto intermedio per leggere un blocco di dati  posizione possiamo aggiungere  nuovi blocchi di dati   solo con i file tipizzati potremmo anche riscrivere    aggiornare  il bloc
258. struzioni prelevate da una memoria si parla di logica  programmata  Spesso la memoria pu   essere riscritta  come avviene in tutti i personal computer  e il programma     cambiato piacere  Ecco allora che il computer pu   di volta in volta diventare l equivalente elettronico di una macchina  da scrivere  Word   di una super calcolatrice  Excel   simulatore di calcio  FIFA e simili   ecc              E le soluzioni che sfruttano una logica cablata vengono dette soluzioni hardware   dove con questo termine si  indicano le parti fisiche di un sistema di elaborazione  in inglese il termine significa letteralmente     ferraglia      Quelle  che sfruttano invece una logica programmata sono dette soluzioni software   i dati e le istruzioni memorizzate  sottoforma di un segnale elettrico chiaramente impalpabile  morbido  soft  che significa appunto     soffice                        La soluzione software    pi   flessibile  se viene trovato un errore    sufficiente cancellare qualche istruzione e la  memoria e sostituirle con quelle corrette  Lo stesso accade nel caso si decida di apportare migliorie o adattare il  programma a causa  per esempio  di una legge cambiata  In un circuito  invece  se viene trovato un errore questo  pu   comportare lo scarto dell intero circuito stesso e la realizzazione di un circuito completamente nuovo     La rigidit   delle soluzioni hardware sembrano relegare queste ultime ad un ruolo di secondo piano rispetto alle  soluzioni software  ma hanno almeno
259. system  della rete ecc    Quando i sistemi operativi non  esistevano ancora od erano molto primitivi  la vita del programmatore era molto pi   dura  doveva programmare  TUTTI i dettagli   Approfondirete questi aspetti nel corso di sistemi              Esaminiamo ora in dettaglio il funzionamento di una CPU  Ecco un ingrandimento     bus dati esterno  prelevo un dato dalla RAM o lo registro dalla RAM    registri    Aritmetic  Logic  Unit    Z  gt w       CU Per comandar la  lettura o la scrittura       Control Unit    Non spaventatevi     pi   semplice di quello che sembra a colpo d occhio  Nella zona in grigio della RAM immaginiamo  essere presenti un blocco di istruzioni da eseguire  potrebbero essere quelle di un programma come Word         La RAM  pensiamola come una sequenza di celle  chiamate byte  In ogni byte pu   essere memorizzato un            dato  come un istruzione od un carattere  vedremo dopo come ed in che forma   Nel disegno qui sopra  a E sono stati evidenziati in grigio quattro byte  Ogni cella  byte  viene indicata con il suo indirizzo  cio   la    posizione a partire dall inizio  Visto che si comincia a contare da zero  quest ultimo    l indirizzo della prima  q cella in alto nella RAM  si parla anche di byte zero   La seconda cella dall alto ha allora indirizzo uno e cos                  via      byte in grigio iniziano all indirizzo cinque e terminano quattro byte pi   avanti  all indirizzo otto   considerando il cinque sono appunto quattro indirizzi   
260. ta  soluzione  ricorsiva      Autore  Fabrizio Camuso  camuso  bigfoot com  Pagina 12 di 177       Allocazione dinamica della memoria versione 2 5 Luglio 2003    procedure StampaAlbero nodo  pun         begin  if nodo lt  gt NIL then  begin NOTA  ho numerato le righe per  1  writeln nodo  ParteInformativa   facilitare il successivo commento  2  StampaAlbero nodo  sx   del codice   3  StampaAlbero nodo  dx   end  end     1 Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it      Allocazione dinamica della memoria versione 2 5 Luglio 2003    Considerando l   if sono solo sei righe     Sembra quasi impossibile    La stampa completa    comandata con  StampaAlbero inizio  dove inizio    il puntatore al primo nodo dell   albero  la radice   La logica di esecuzione    assai  semplice  stampare la parte informativa del nodo di cui si    ricevuto il puntatore e chiamare quindi prima la stampa  pe il figlio di sinistra   StampaAlbero nodo  sx    e poi per quello di destra   StampaAlbero nodo  dx     Il  meccanismo si ripete sui rispettivi figli sinistra destra fino a raggiungere le foglie     La procedura chiama quindi s   stessa  ricorre ai servizi di s   stessa  da cui il termine ricorsione  ma ogni volta  passando un puntatore che la fa avvicinare alle foglie  Con queste ultime verranno chiamate delle    StampaAlbero     con parametro uguale a NIL  le foglie non hanno nodi sotto di esse e quindi hanno il valore NIL nei loro puntatori sx  e dx  terminando la cate
261. te accesso a una pagina web che la galleria pu   creare  presso un fornitore di servizi telematici     Per ogni quadro    compilata una scheda che riporta l autore  il titolo  la tecnica  olio  tempera  ecc    le dimensioni  il prezzo  La consultazione del catalogo  pu   avvenire o semplicemente  scorrendo avanti e indietro le schede in ordine alfabetico oppure cercando uno specifico  autore     Il candidato  fatte le ipotesi aggiuntive che ritiene necessarie     1  proponga una soluzione per la creazione del sistema illustrandone la struttura a blocchi e  indicando una soluzione di principio per ciascun blocco     2  proponga e illustri una struttura per il Data Base dei quadri     3  sviluppi in dettaglio la soluzione per almeno una delle seguenti funzioni  codificandone un  segmento con uno strumento software di sua conoscenza    a  creazione del Data Base    b  creazione di una semplice pagina web della galleria    c  interfaccia per consentire al cliente la consultazione del catalogo  e la visione delle singole  schede     4  facoltativamente proponga una soluzione di principio per realizzare un sistema che  consenta di mostrare al cliente non solo la scheda di catalogo  ma anche una fotografia del  quadro     Il testo va dapprima ha studiato per evidenziare parti poco chiare  sulle quali sar   necessario prendere delle  decisioni  ed eventualmente fare ipotesi aggiuntive su aspetti per i quali il testo non dice come comportarsi     Ad esempio  nel testo si parla di prez
262. te interpretate  molte volte  In certe situazioni il tempo di esecuzione di  un programma interpretato pu   essere anche 100 volte  superiore a quello del corrispondente programma  compilato           Dipendenza del programma dall interprete  l interprete  deve sempre essere gi   pronto e disponibile in memoria        Relativamente semplici da scrivere        Possibili lunghi tempi di attesa durante lo sviluppo   prima di potere e stare un istruzione qualsiasi di un  programma     necessario che tutto il programma venga  tradotto in linguaggio macchina  se le istruzioni sono  poche  qualche centinaio  le potenze elaborative e la  velocit   degli odierni hard disk  che a volte non vengono  addirittura utilizzati perch   sono sufficienti le ormai assai  capienti e molto pi   veloci RAM  la velocit   della  compilazione    tale da sembrare che si stia utilizzando  un interprete  Se il progetto consta invece di migliaia   centinaia di migliaia  di milioni di istruzioni  30 milioni  per Windows 98   prima di veder partire il programma in  seguito ad una modifica potrebbero rendersi necessari  tempi di attesa anche di parecchi minuti          Esecuzione veloce  tempo per la compilazione a parte  il  codice binario prodotto dalla compilazione link pu    essere eseguito a grande velocit   senza bisogno di  ulteriori traduzioni     Indipendenza del programma dal compilatore  una volta  tradotto in binario il programma  il compilatore non  serve pi          Pi   complessi da realizzare
263. teger     gg giorno  mm mese  aa anno     ok_data  boolean     begin  write  Inserire il giorno     readln gg    write  Inserire il mese     readln mm    write  Inserire l anno     readIn aa         PRIMA SOLUZIONE SENZA CASE     ok_data  false     se data supera controlli ok_data verra  messo a true       if  gg gt 0  and  gg lt 32  and  mm gt 0  and  mm lt 13  and  aa gt 0  then    if mm 2 then    febbraio     begin    if aa mod 4   0 then    per semplicita   bisestili se multipli di 4     begin    if gg lt  29 then  ok_data  true    end  else    non bisestile     if gg lt  28 then  ok_data  true    end    else    mese diverso da febbraio         if  mm 1  or  mm 3 or  mm 5  or  mm 7  or   mm 8  or  mm 10  or  mm 12  then    mese con 31 giorni     begin    if gg lt  31 then  ok_data  true    end  else    mese con 30 giorni     if gg lt  30 then  ok_data  true     writeln  Senza case      if ok_data then  writeln  Data corretta         else  writeln  Data errata          readln     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  46    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004       POI SOLUZIONE CON CASE     ok_data  false     if  gg gt 0  and  gg lt 32  and  mm gt 0  and  mm lt 13  and  aa gt 0  then    case mm of  2  if aa mod 4   0 then  begin  if gg lt  29 then  ok_data  true  end    else    non bisestile     if gg lt  28 then  ok_data  true     1 3 5 7 8 10 12  if gg lt  31 then  ok_data  true     else  if ge lt  30 then
264. teln  a e  compreso tra 1 e 3       NOTA  per inserire un apostrofo o un accento in una stringa     necessario raddoppiarlo  altrimenti il compilatore penserebbe  che l   termina la stringa         if  s1  rossi   and  s2  mario   then  writeln  e  la persona cercata         if  s1  rossi   and  eta gt  18  then  writeln  rossi e  maggiorenne  maschio o femmina            le condizioni possono anche essere piu  di 2     devono sempre essere vere  CONTEMPORANEAMENTE     if  s1  rossi   and  eta gt 18  and  s2  femmina   then  writeln  rossi e  maggiorenne  femmina         Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  33    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    La condizione composta che usa or    vera quando lo    ALMENO UNA delle condizioni coinvolte      falsa  quando le condizioni sono false TUTTE CONTEMPORANEAMENTE     If  mese    Gennaio     or  mese   Marzo     or  mese  Luglio     then  Numero_giorni    31     Prestate particolare attenzione al seguente esempio  va letto cos    se  lt bella gt  oppure  lt vecchia e ricca gt  allora     osservate le parentesi  OBBLIGATORIE  if  or   and        if  s1  bella   or    eta gt 60  and  s2  ricca     then  writeln  la sposo in ogni caso           Variante sul tema      pi   di una istruzione da eseguire     if  s1  bella   or    eta gt 60  and  s2  ricca     then  begin  writeln  la sposo in ogni caso         writeln    poi forse mi pentiro     end  else  begin  writel
265. tenere tante copie del file dati quanti sono i criteri di ordinamento desiderati  Naturalmente tutto ha un  limite  troppi indici tenderanno comunque a rallentare le operazioni a causa del sovraccarico necessario alla loro  gestione  per ovviare in parte a questo problema nei moderni DBMS    possibile creare    al volo    degli indici  temporanei che verranno distrutti al termine dell elaborazione al fine di non protrarre inutilmente l aggravio  della loro gestione         Relative  quando le unit   informative  record  sono individuate da un numero che corrisponde alla loro  posizione  E  cos   possibile  ad esempio  chiedere di inserire un record alla posizione 20  anche se non sono  state occupate tutte le precedenti  piuttosto che alla 5  Similmente    possibile chiedere di leggere un record ad  una posizione qualsiasi  Tra i linguaggi che supportano questa organizzazione ricordiamo molti dialetti del BASIC  e del COBOL        Hashing  Non sempre    conveniente applicarla  L idea    che il processore impiega a fare un calcolo molto  meno tempo di quello necessario a leggere dati dai supporti di massa  si tenta allora trovare una formula  legge  di trasformazione  che  partendo da una chiave di accesso  ad esempio il cognome  calcoli la posizione del  resto dei dati  Ad esempio potremmo stabilire che  dato un cognome di una persona  il resto dei dati si trova nel  record alla posizione corrispondente al numero dei caratteri del cognome  In questo modo  volendo trovare i  d
266. timo indicato nel ciclo  Num_voti      E    arrivato il momento di mettere tutto insieme e risolvere elegantemente il problema di partenza        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  115       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Program medie   const  MAX_ALUNNI 32   type  vettore_32_interi   array 1    MAX_ALUNNI  of integer   var  voti  vettore _32_interi   i  somma_voti  num_alunni  quanti_sopra_media  integer   media  real     begin  somma_voti  0  media  0  quanti_sopra_media  0     writeln    Quanti alunni ci sono          readIn num_alu         CARICAMENTO DEI DATI NEL VETTORE     for i  1 to num_alu do  begin  writeln     Inserisci voto prossimo alunno         readIn voti i     somma_voti  somma_voti   voti i   end     media  somma_voti   num_alu        I DATI SONO ANCORA NEL VETTORE  CONTROLLIAMO TUTTI     for i  1 to num_alu do  if voti i  gt media then  quanti_sopra_media   quanti_sopra_media   1     writeln     Risultato      quanti_sopra_media    end     OSSERVAZIONI    Se gli alunni diventassero anche 10000 il codice rimarrebbe identico  Sarebbe sufficiente modificare il  valore della costante MAX_ALUNNI    Non    obbligatorio usare tutte le posizioni del vettore  al massimo ce ne sono disponibili MAX_ALUNNI  ma il valore comunicato al computer  num_alu  potrebbe anche essere inferiore  A dire la verit    il  programma dovrebbe controllare che questo valore sia compreso tra 1 e MAX_ALUNNI perc
267. tion  Interchange  che esiste in forma orginale  128 simboli  o estesa  256 simboli     caratteri vanno racchiusi tra due  apici semplici come in    a        A     T  4                 Attenzione a non confondere una cifra numerica con il carattere corrispondente  1    diverso da    1     Anche se in un  documento di testo i numeri vengono memorizzati con la sequenza dei codici ascii corrispondenti  questo formato  risulta molto inefficiente per svolgere calcoli numerici  Numeri interi e reali vengono rappresentati in modo assai  diverso ma questi argomenti verranno affrontati in parallelo nel corso di sistemi     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  24       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    TI PO BOOLEANO  boolean     dati boolean possono assumere solo due valori  vero  true  e falso  false      TI PO STRI NGA  string  Un dato string    un insieme di caratteri racchiusi tra apici  La lunghezza massima    255    caratteri     Esempi di string     Marco        12 03 1998              Questi appena visti sono dati semplici o non strutturati  non sono ulteriormente scomponibili  Pi   avanti nella  dispensa verr   introdotta la possibilit   di usare dati complessi o strutturati  Vedremo anche come sia possibile per il  programmatore aggiungere nuovi dati  user defined type  tipi definiti dall utente  basandosi su quelli nativi del pascal     standard type  tipi standard            NOTA  la sezione delle cost
268. to  Quali altri componenti devono essere attivati  ed in che modo   esecuzione  attivare nella giusta sequenza i componenti elettronici coinvolti   Si parla di ciclo  di fetch  prelievo   decode  decodifica  ed execute  esecuzione      NOTA  approfondirete questi argomenti nel corso parallelo di    sistemi       Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  1    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Logica cablata e logica programmata       Quando un dispositivo elettronico viene costruito in modo da poter funzionare senza un programma  i circuiti sono  scelti e collegati per dare sempre la stessa gamma di risposte  viene definito in logica cablata  dalla parola inglese  cable  cavo  filo      Un altro esempio  avevamo gi   visto quello della lavatrice     rappresentato da un orologio digitale di prima  generazione  che differenza della lavatrice non presenta parti elettromeccaniche   In un orologio di questo tipo non     presente alcun microprocessore e nessun programma  i circuiti sono stati stampati per reagire in modo prefissato alla  pressione dei tasti  reset  regolazione orario data ecc   e per incrementare l   orario data     O ancora  una PlayStation costruita  per assurdo  in logica cablata vi consentirebbe di giocare a quel solo gioco  corrispondente a quella particolare predisposizione di dispositivi elettronici e relativi collegamenti elettrici     Quando invece    presente un microprocessore che esegue i
269. tra   comunichi al lettore immediatamente lo scopo per cui    stato scritto        const  pi_greco 3 14  writeln  VolumeSfera 12     var  x  real   begin  writeln  4 3   pi greco   12   12   12   end        Infatti pochi sanno riconoscere nella formula a sinistra il calcolo del volume di una sfera di raggio 12     Nel riquadro  a destra    invece palese che si sta invocando una funzione dal nome molto chiaro ed    altrettanto evidente che il  valore comunicato tra parentesi    il raggio della sfera  In ogni caso le modalit   d uso di ogni sottoprogramma sono  documentate nel manuale tecnico che accompagna sempre una libreria     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  86    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Diminuisce la complessit   della scrittura dei programmi  un programma pu   essere assemblato a partire da  sottoprogrammi pi   semplici da trattare  E  anche pi   facile trovare gli errori concentrandosi solo sulle righe di un  sottoprogramma per volta  Inoltre rende possibile sviluppare uno stesso programma insieme ad altri programmatori  senza che questi interferiscano tra loro  ad ogni programmatore viene assegnato lo sviluppo di un certo numero di  sottoprogrammi che vengono poi fusi assieme        Nessun team di sviluppo si sognerebbe oggi di sviluppare un progetto software senza adottare questo tipo di  programmazione detto modulare  Questi concetti sono stati poi ampliati nella programmazione ad o
270. troppo grande per essere vera      modifica il programma per controllare queste possibilita      trovi la soluzione nel sorgente  maggior2 pas      end           SEL2  difficolt    bassa  Inserito un numero  dire se e  pari o dispari       program paridisparil   uses newdelay  crt   var  numero  integer     variabile in cui verra  memorizzata il numero       begin  clrscr     cancello lo schermo       write  Inserisci un numero e ti diro  se e  pari o dispari   gt       readln numero      if numero mod 2   0 then  writeln  e  pari    else  writeln  e  dispari     writeln  Programma terminato  Premere INVIO per continuare          readin     per dare il tempo di leggere il messaggio       end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  36    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          SEL3  difficolt    bassa  Inserito un carattere  dire se e  una vocale od una consonante        program consonanteVocale   uses  newdelay  crt   var  c  char     variabile in cui verra  memorizzata il singolo carattere          commento  il tipo char pu   memorizzare un solo carattere  occupa la  meta  dello spazio di una stringa lunga un solo carattere perch   con le  stringhe un byte supplementare serve a memorizzare la lunghezza della  stringa stessa  questo non e  invece ovviamente necessario per una  variabile carattere  la cui lunghezza e  sempre 1      begin   clrscr     cancello lo schermo       write  Inserisci un carattere
271. trovati gli errori  pi   grossolani     e beta test  quando il software viene ritenuto sufficientemente stabile viene distribuito  di solito gratuitamente   ad un numero ristretto di utenti che  in cambio del beneficio di poter disporre in anteprima del prodotto quasi  finito  comunicheranno secondo protocolli stabiliti una descrizione degli errori che capitano durante l utilizzo  se  il prodotto    particolarmente complesso  il numero dei beta tester  pu   essere elevato  ad esempio  quando la  Microsoft rilascia per il beta test una nuova versione di Windows lo fa anche a decine di migliaia di utenti     e gamma test  a volte viene definito un ulteriore livello che si differenzia dal precedente solo del fatto che  dovrebbe essere quasi esente da errori    Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  7    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    La fase di test ha lo scopo di evidenziare gli errori durante il funzionamento del programma  il che non vuol dire  per   automaticamente sapere quale istruzione ha causato il problema              La fase di debug indica invece l attivit   del programmatore volta ad individuare esattamente la porzione di  codice che contiene l errore in modo da poter eliminare        Ogni volta che si scopre un errore    necessario ritornare alla fase di codifica per modificare il codice        ATTENZIONE   Una delle cattive abitudini pi   comuni    quella di non testare nuovamente il programm
272. uazione per la stringa S del programma  non  pu   essere utilizzata nella procedura perch   oscurata dalla variabile locale S  la variabile X pu   essere utilizzata  invece dappertutto  nel programma e nella procedura  pratica  quest ultima  da sconsigliare   il parametro A e la  variabile locale S della procedura possono essere utilizzati solo in quest ultima     La letteratura informatica indica anche con la dicitura ambiente locale l   insieme delle entit   dichiarate all interno di  una stessa entit   sintattica  programma  sottoprogramma   ad esempio l ambiente locale per una procedura     costituito dai suoi parametri e dalle sue variabili locali  Ci   che    invece dichiarato all esterno di una certa unit    sintattica viene invece indicato come ambiente non locale  Ad esempio  rispetto ad un sottoprogramma le variabili  globali fanno parte dell ambiente non locale  Attenzione per   a non far corrispondere l ambiente non locale con le  variabili globali  se consideriamo infatti il caso di un sottoprogramma dichiarato all interno di un altro per  quest ultimo l ambiente non locale    costituito certamente delle variabili globali ma anche dalle variabili locali alla  sottoprogramma che lo contiene     program prova        var x  real  La procedura P2    dichiarata all interno di P1  Il senso di ci   sta nel fatto che P2  procedure P1  svolge un compito molto particolare che a senso solo nell ambito di P1  Dichiarata  var y  real  in questo modo  solo P1 pu   invocare P2 
273. umero di vocali presenti in una stringa        program prova   uses newdelay crt        conta quante vocali ci sono in una stringa  prima tecnica     function contaVocali s  string    integer   var nv i  integer     begin  nv  0     numero vocali     for i  1 to length s  do  case sli  of   a   A   e   E   i   1   0   0t  u U   nv  nv 1   end     contaVocali  nv  end        conta quante vocali ci sono in una stringa  secondo tecnica        usa la funzione POS invece del case      function contaVocali2 s  string    integer    var nv i  integer     begin  nv  0     numero vocali     for i  1 to length s  do  if pos s i    aAeEiloOuU   lt  gt 0 then  nv  Nv 1   contaVocali2  nv  end     begin  writeln contaVocali  casa dolce casa      readin   end              SOT 14  difficolt    bassa Scrivere un comando che invita l operatore a premere un tasto per continuare           ha bisogno di commenti        procedure attendi    begin  writeln                 PREMI INVIO PER CONTINUARE                     readin   end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it  Pag  106    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004             SOT 15  difficolt    bassa Scrivere un comando per la visualizzazione di un messaggio qualsiasi tra due cornicette  di asterischi  l esecuzione del programma deve anche interrompersi invitando l utente a per un tasto per continuare   sfruttare il comando precedente         Program prova    procedure attendi    be
274. un messaggio sullo  schermo e la terminazione forzata del programma che ha generato l errore  In qualche caso  ma con uno sforzo  notevole  il programmatore pu   sostituire all azione standard del sistema operativo le sue    routines    di gestione  degli    interrupt    relativi  avete imparato a vostre spese come questo sia difficile da realizzare  soprattutto in     assembly         Y Il programma in esecuzione riceve una notifica di errore  dopo un operazione tentata  ed ha la possibilit   di  gestirlo e di ripristinare il funzionamento del programma in modo    accettabile     La notifica pu   avvenire tramite        un valore restituito dalla funzione di I O tentata  ad esempio la    fopen    del    C    dovrebbe restituire un puntatore  ad un file  una struttura a record usata per le operazione di I O con il corrispondente file fisico  ma potrebbe  restituire    null   in caso di insuccesso     un controllo esplicito del programmatore dopo aver tentato un operazione  ad esempio in Pascal    possibile  chiamare la funzione I OResult  se il valore restituito    0 allora l operazione    andata a buon fine  diversamente il  valore indica il tipo di errore  ad esempio 1 file non trovato  2 disco pieno ecc         l uso di una struttura di controllo ad alto livello specifica  gli ambienti di programmazione pi   avanzati prevedono  potenti strutture di programmazione per la gestione degli errori  ad esempio l Object Pascal offre il costrutto    try      except      in cui dopo
275. un segnale elettrico  mentre viaggia su un filo     soggetto a  disturbi ed attenuazioni di vario tipo che tendono a distorcerlo  in partenza  cio    possiede certe  caratteristiche  forma  potenza ecc     all arrivo non sono pi   esattamente le stesse  Per cui se  scelgo due segnali abbastanza simili tra loro e li trasmetto  potrebbe capitare che chi li riceve  scambi l uno per l   altro  errore   Questa possibilit   cresce con il numero dei tipi di segnale usati   Questo spiega perch   i prototipi di calcolatore che cercavano di usare tanti segnali diversi per  rappresentare le cifre numeriche ed i caratteri dell alfabeto non ebbero molto successo   semplicemente la probabilit   di errore era troppo alta   Certo se i tipi di segnale fossero di meno   diminuirebbe la probabilit   di confonderli     Fin dove possiamo arrivare   Un solo segnale non  basta  sarebbe sempre uguale a se stesso e non porterebbe informazione  ma due     Due    proprio  risultato il numero ottimale  usando solo due segnali il pi   possibile diversi tra loro     ben difficile che un segnale  venga distorto al punto tale da confonderlo per l   altro  E    nata la logica digitale  binaria   basata cio   sull uso di due  soli simboli  che possiamo far corrispondere alle cifre 0 ed 1   Tutte le informazioni devono essere codificate   rappresentate  con combinazioni diverse di 0 ed 1  Queste cifre  dette binarie  sono anche chiamate bit  Un bit pu    essere 0 od 1        I circuiti digitali sono facili da 
276. una costante  sar   sufficiente farlo solamente nella sezione const ed automaticamente il nuovo valore verr   utilizzato in ogni    punto del programma in cui    stata usata la costante     e migliorano la sicurezza  il programmatore non potr   neppure per sbaglio cambiare il valore della costante  perch   il compilatore glielo impedir   emettendo un messaggio di errore    NOTA  la sezione delle costanti pu   anche non essere presente     Variabili   Quando invece il valore di un dato pu   cambiare durante l esecuzione deve essere memorizzato in una cosiddetta  variabile  Le variabili devono essere dichiarate in una sezione  individuata dalla parola chiave var  posta dopo la  sezione const        Program geometria   const  PI_GRECO   3 14159265     var  raggio   integer     In Pascal le variabili non possono ricevere un valore di partenza direttamente nella sezione dichiarativa ma dovr    essere usato un apposito comando  assegnamento  nella sezione esecutiva  Come certamente immaginate questo  stesso comando non pu   essere invece utilizzato con le costanti  Dopo l   identificatore del nome di una variabile deve  essere messo il simbolo         due punti  e poi l identificatore di un tipo  ed infine il punto e virgola        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  23       Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Pi   variabili dello stesso tipo possono essere dichiarate insieme separando gli identificatori con un
277. ura  Quello  che accade    che quando un   incarnazione di una procedura ad un qualche passo della ricorsione ha bisogno di  chiamare s   stessa  il suo stato  una sua copia delle variabili locali con i valori fino a quel momento calcolati e un     segnalibro    all   istruzione cui era arrivata     memorizzato in un area di memoria speciale  chiamata stack  Quando  il controllo    restituito  anche molti passi dopo  ad una procedura  il suo stato    ripreso dallo stack ed essa pu    continuare dal punto in cui era stata interrotta  Lo stack    una struttura dinamica LIFO  Last In First Out  in cui  l   ultimo dato inserito    il primo che pu   essere ripreso  Per fare un paragone pensate ad una pila di piatti  l   ultimo  piatto lavato sar   il primo ad essere ripreso per il risciacquo  Questo modo di funzionare    essenziale per poter  accedere nell   ordine giusto agli stati delle diverse procedure  infatti    quella chiamata per ultima che riavr   il  controllo per prima e continuer   dal punto in cui era stata interrotta  Osservando il grafico precedente  la 3 chiama la  4  e lo stato della 3 viene salvato   la 4 chiama la 5  e lo stato della 4 viene salvato   la 5 finisce  deve riprendere la  4     il suo stato che serve  non quello della 3  La 4  chiamata per ultima  ha bisogno prima della 3 del suo stato  gli  stati devono essere ripristinati nell   ordine inverso in cui sono stati salvati  Uno stack  realizzato come un vettore di    j j j a cimulaziana cattact  byte 
278. uso  email  camuso camuso it sito web  www camuso it   Pag  51    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004             ITES  difficolt    bassa  Stampa dei primi N numeri naturali  N letto da tastiera  con a fianco  i rispettivi quadrati e cubi       program potenze   uses  newdelay  crt     var  i  integer     contatore ciclo     n  integer     qui viene memorizzato il numero letto da tastiera       begin  clrscr     cancello lo schermo       write  Fino a che numero devo arrivare    gt       readIn  n          PRIMA SOLUZIONE     writeln  PRIMA SOLUZIONE         for i    1 ton do  writeln  i      1 1      i i i       writeln        SECONDA SOLUZIONE  sfrutta l operatore sqr che calcola il quadrato     writeln  SECONDA SOLUZIONE       for i    1 to n do  writeln  1     sqr i       sqr i  1       writeln        TERZA SOLUZIONE  allinea i numeri usando gotoxy colonna  riga  per posizionare il cursore alla colonna riga dello schermo  desiderata  whereY e  una funzione che restituisce il numero di riga dove si trova il cursore  quindi gotoxy 7   whereY  significa colonna 7  non muoverti dalla riga su cui ti trovi        writeln  TERZA SOLUZIONE         for i   1 tondo  begin  write  i     gotoxy 7 whereY   write  sqr i      gotoxy 14 whereY   writeln  sqr i  1    end     writeln  Programma terminato  Premere INVIO per continuare        readin     per dare il tempo di leggere il messaggio     end     Autore  Fabrizio Camuso  email  camuso camuso it sito web  ww
279. uso it sito web  www camuso it   Pag  111    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004          Una prima orripilante soluzione  sicuri di esservi laureati in Informatica    potrebbe essere quella di chiedere  una seconda volta all   operatore gli stessi voti per contare quelli sopra la media     si immagina di continuare il programma di prima         for i  1 to num_alu do   begin  writeln     Inserisci voto prossimo alunno         readIn voto      if voto gt media then  quanti_sopra_media   quanti_sopra_media   1    end   Stiamo scherzando  A parte le furiose proteste dell   utente che si vede costretto a ripetere l inserimento    dei dati  provate a pensare al rischio di inserire dati diversi dai precedenti con risultati del tutto  falsati             ATTENZIONE  la seconda    soluzione    che viene proposta qui di seguito     come il primo  solo un esempio  Come  tale    NECESSARIO per apprezzare e capire l   uso del nuovo strumento di programmazione che presenter    ma non  deve essere    studiato                 Seconda soluzione  lascio decidere a voi se pi   o meno orripilante della precedente      banale   come ho fatto a non pensarci prima  basta usare una variabile diversa per ogni voto     Program medie     var  i  somma_voti  num_alunni  quanti_sopra_media  integer   media  real     votol  voto2  voto3  voto       voto3 2  aiuto    integer     begin  soma_voti  0  media  0  quanti_sopra_media  0     writeln     Quanti alunni ci sono       readIn
280. utilizzabili sono spesso raccolti in librerie  Una libreria     un file  archivio  normalmente presente sul disco e contiene blocchi di codice gi   tradotto in linguaggio macchina che  possono essere a comando incorporati in un programma  Alcune librerie sono sempre fornite insieme all ambiente di  sviluppo che si decide di usare  sia che si tratti di un prodotto commerciale sia che si tratti di un prodotto gratuito  come accade per l open source      Ad esempio con il Turbo Pascal sono disponibili un buon numero di librerie insieme al prodotto acquistato  Il Turbo  Pascal chiama le librerie unit  unit   di programmazione   NOTA  per un elenco completo di queste librerie consultate  l help in linea del turbo Pascal  lo potete attivare con la combinazione SHIFT F1  cercando poi sotto la lettera S il  paragrafo Standard Unit      La funzione sqrt ed altri sottoprogrammi di uso assai comune sono memorizzate in una libreria  la System  per la  quale non    neppure necessario indicarne l uso  viene automaticamente inclusa con il resto del programma     Il comando clrscr e gotoxy   invece sono due dei sottoprogrammi disponibili nella unit crt  Per questa ed altre unit   ed in particolare per tutte quelle create ed aggiunte dai programmatori     invece necessario indicare il loro nome  nella sezione uses del programma  Esistono unit con sottoprogrammi per fare grafica  graph  e TANTE altre cose che  scopriremo insieme un poco alla volta J      Programma eseguibile finale  program pr
281. valore pi   semplice   Si ragiona cos    qual    il caso pi   semplice   Quando si chiede di sommare zero ad un numero   il risultato    il numero stesso  Se invece dobbiamo sommare 1 possiamo esprimere il calcolo come 1 pi   il risultato  della somma tra il numero e 0  infatti  x  1   1    x 0   Di nuovo abbiamo ricondotto un prodotto complesso al  calcolo di un prodotto pi   semplice di cui sappiamo subito il risultato  x 0   E cos   via  x   4   1    x 3  1 1    x 2  1 1 1  x 1  1 1 1 1  x 0  1 1 1 14 x     Schematicamente    procedure XperY  x y  integer   integer   begin  if y 0 then  XpiuY  x  else  XpiuY x y    a a 1 XpiuY x y 1     xsey 0    1   XpiuY x y 1  se y gt 0                Esempio 5  calcolo della serie di Fibonacci  esempio di doppia chiamata ricorsiva        La serie di Fibonacci    la seguente  0 1 1 2 3 5 8 13 21 34 55     dove ogni elemento    la somma dei due precedenti   ad eccezione del primo e del secondo che sono per definizione 0 ed 1      Indichiamo con Fib N  l   ennesimo numero della sequenza  si parte dalla posizione 0    Ad esempio Fib 0  0   Fib 1  1  2  Fib 7  13     L obiettivo    darne una definizione ricorsiva  un numero verr   appunto espresso come somma dei 2 numeri di  Fibonacci che lo precedono  fino ai primi due che sono fissati per definizione  Fib 4    Fib 3    Fib 2     Fib 2  Fib 1    Fib 1  Fib 0    Fib 1    Fib 0    Fib 1    Fib 1    Fib 0    3     Schematicamente    procedure Fib N  integer   integer   begin  if N 0 then  Fib
282. vello di linguaggi    assembly    il tutto si risolve attraverso chiamate a servizi del sistema operativo  nel caso di MS  DOS attraverso il noto meccanismo degli interrupt software  come dovrebbe esservi chiarito nel corso di sistemi        linguaggi di terza generazione     C     Pascal  Basic  Cobol ecc   offrono istruzioni pi   evolute  apri un file  chiudilo   leggi dal file  scrivi su di esso  spostati ad una certa posizione ecc   che sono poi tradotte dal compilatore negli stessi  meccanismi a basso livello dell assembly     Da alcuni anni la gestione delle informazioni    diventata talmente importante per il successo dei sistemi informativi e  le funzionalit   richieste talmente sofisticate da rendere insufficienti le funzionalit   offerte dai sistemi operativi e  di  conseguenza  dei programmi che vi fanno affidamento  Questo fatto giustifica l esistenza sul mercato di complessi  software dedicati esclusivamente alla gestione delle basi di dati aziendali  i DBMS  data base management system   saranno oggetto di un ampia porzione del corso di Informatica di quinta      Vista l esistenza dei DBMS perch   parlare delle tecniche    tradizionali    in presenza di strumenti talmente avanzati  Ecco  alcuni buoni motivi     Yi requisiti hardware software  microprocessore  RAM  spazio su hard disk  richiesti dai DBMS sono decisamente  elevati  in pi   di una situazione non sono semplicemente disponibili e l   unica alternativa  spesso perfettamente  adeguata     rappresentata
283. viluppati e come questi dovranno interagire tra loro  Diversamente non sarebbe infatti in grado di  abbozzare lo scheletro dell intero programma     Bottom Up   Quando questo non    possibile  per l estrema complessit   del progetto e o per l alto grado di innovazione dello  stesso che non consente di avere le idee chiare su tutto fin dall inizio  pu   essere d aiuto procedere in un altro modo   cominciare a sviluppare piccole porzioni sulle quali si hanno comunque idee chiare senza sapere ancora come si  incastreranno tra loro  almeno nei dettagli   Sar   solo in un secondo momento che ci si preoccuper   di assemblare il  programma con questi componenti  Per fare un paragone     un po  come se si volesse realizzare un veicolo  innovativo per spostarsi sulla sabbia  il progettista potrebbe non aver ancora le idee chiare sulla forma e le  caratteristiche definitive del veicolo  Potrebbe per   decidere di cominciare a realizzare delle ruote speciali  per poi  passare al motore  poi alle singole parti del telaio e cos   via  Infine decider   come assemblare insieme queste parti   certamente potrebbe essere costretto a rifare dei pezzi o a scartarne alcuni o ad adattarne degli altri     il prezzo per  questa modalit   di sviluppo in cui non    possibile progettare nei dettagli fin dall inizio   inoltre  di nuovo non avendo  progettato fin dall inizio le interconnessioni tra le varie parti  sar   pi   difficile affidarne lo sviluppo a diversi  programmatori senza essere costretti 
284. vo viene raggiunto soprattutto con l utilizzo dei parametri  evitando di usare direttamente   eventuali variabili del programma principale  Consideriamo infatti questo esempio  ho ripreso la forma pi    semplice della procedura asterischi                  Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  92    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    SAI La modifica che ho apportato    piccola ma    var    integer  oo    Se i  a sostanziale  ho spostato la dichiarazione della    procedure asterischi quanteRighe  integer   variabile i utilizzata per il ciclo for dall interno della  begin procedura alla sezione var del programma  for i  1 to quanteRighe do principale   writeln  FEAR    end   begin    writeln     quante righe di   devo stampare         readin numero      asterischi  numero     readin   end     Se proviamo a mandare in esecuzione il programma tutto sembra funzionare e  in effetti  funziona veramente    Ma la  procedura    in realt   meno leggibile  meno riutilizzabile e meno sicura     Meno leggibile  non    sufficiente passare in rassegna tutte le istruzioni della procedura per capire tutto della  procedura  infatti per capire cosa sia la i usata dal ciclo for dobbiamo cercare nel programma principale la sua  dichiarazione  e se qualcuno tra voi sta pensando che realt      ovvio che la i sia una variabile di tipo integer  vi invito  a provare il seguente programma     program prova     var i  char   begin  for 
285. w camuso it   Pag  52    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004             ITE6  difficolt    bassa  Stampa dei numeri interi relativi da  N a  N  con N letto da tastiera       program numeri   uses  newdelay  crt     var  i  integer     contatore ciclo       n  integer     qui viene memorizzato il numero letto da tastiera       begin  clrscr     cancello lo schermo       write  Fino a che numero devo arrivare    gt       readIn  n       for i    n tondo  writeln  i       writeln  Programma terminato  Premere INVIO per continuare        readIn     per dare il tempo di leggere il messaggio       end           ITE7  difficolt    bassa  Stampa dei numeri da INIZIO a FINE  con INIZIO e FINE letti da tastiera   Controllare che INIZIO sia  lt   FINE             program numeri   uses newdelay  crt     var  i  integer     contatore ciclo     inizio  fine  integer     temp  integer     variabile di appoggio per scambiare inizio e fine  se inseriti nell ordine sbagliato     begin  clrscr     cancello lo schermo       write  Numero di partenza   gt       readln  inizio       write  Numero finale   gt       readIn  fine          PRIMA SOLUZIONE     writeln  PRIMA SOLUZIONE         if inizio lt  fine then  for i    inizio to fine do  writeln  i    else  for i    fine to inizio do  writeln  i          commenti  se l utente inserisce inizio e fine nell ordine sbagliato   inizio gt fine  si esegue un ciclo con gli estremi invertiti        Autore  Fabrizio Camuso  email 
286. zione di circonferenza  il  comando in questione  le coordinate del centro e la misura del raggio della circonferenza dovranno essere indicate   come in quasi tutti i linguaggi di programmazione  tra parentesi tonde al momento dell uso del comando stesso     Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  20    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004    Immaginiamo ora di scrivere un programma di geometria e di avere la necessit   di disegnare alcune circonferenze   Ecco come richiameremmo il comando        rogramma geometria  SERE     l  prog 9 Il programmatore utilizza in questo esempio due volte il comando per disegnare    USES grafica  una circonferenza  il centro della prima ha come coordinate 12  61 ed un raggio  a pari a 30  similmente per la seconda    CUPA pG Lod E  molto importante che il programmatore specifichi dove    possibile trovare il  codice oggetto che corrisponde al comando crf  Questa informazione viene    crf  7  49   22   fornita con    USES grafica                 Il compilatore non    in grado di tradurre il comando crf  non appartiene a quelli standard del pascal  ed in mancanza  di altre indicazioni dovrebbe interrompersi ed emettere un messaggio di errore  tipo    simbolo non trovato    in  corrispondenza delle righe in cui si richiama il comando crf      Trovando per   l indicazione di utilizzo della libreria grafica  lascia nel codice oggetto un cosiddetto collegamento  link   non risolto  cio  
287. zo del quadro ma non viene indicata la valuta da  utilizzare  Una galleria d arte spesso a clienti stranieri  per cui la soluzione di proporre il  prezzo in lire  siamo nel    98    e l euro non esisteva ancora e neppure l obbligo di esporre il  doppio prezzo in euro ed in lire  forse non    ottimale  Ecco allora la prima ipotesi  aggiuntiva  o  se preferite  un primo chiarimento   i prezzi verranno indicati sia in lire che  in dollari           Questa fase viene chiamata Istudio della situazione reale  La letteratura informatica fa riferimento a questa fase  anche con il nome di analisi  termine per   non corretto da un punto di vista matematico   Naturalmente noi  inizieremo con problemi e testi assai pi   semplici  Ad esempio  calcolare la spesa in euro per una settimana di viaggi  andata e ritorno da casa a scuola  Le uniche cose da chiarire potrebbero essere     necessario percorrere strade con  pedaggi  Il numero di chilometri del percorso in andata    identico a quello del ritorno        Autore  Fabrizio Camuso  email  camuso camuso it sito web  www camuso it   Pag  3    Gestione Archivi Tradizionali   versione 3 1 Settembre 2004             Vengono anche presi in considerazione  i requisiti  cosa deve fare il programma  con quali vincoli di velocit     occupazione di memoria  hardware e software a disposizione  se deve funzionare in rete  se deve sapere interoperare  con altri software magari su piattaforme hardware diverse  se deve funzionare in real time  se deve es
    
Download Pdf Manuals
 
 
    
Related Search
    
Related Contents
  E5 PRO ACETATO DE SILICONA  Heat Pump Controller  syllaprint étudiant mode d`emploi  Zalman Z9 Plus  LITTLE  Baumatic BHC605 Technical Drawing  Télécharger (PDF 0.8 MB)    Copyright © All rights reserved. 
   Failed to retrieve file