Category Archives: Pascal

Funzioni mancanti

A partire dalle funzioni matematiche già esistenti nel linguaggio di programmazione

Pascal
Esponenziale Esponenziale Exp(x)
Logaritmo naturale Logaritmo Ln(x)
Arcotangente Arcotangente ArcTan(x)

possono essere ricavate eventuali funzioni mancanti

Pascal
Radice ennesima Radice ennesima Exp(Ln(x)/n)
Elevamento a potenza Potenza Exp(y*Ln(x))
Esponenziale con base 10 Esponenziale con base 10 Exp(x*Ln(10))
Esponenziale con base 2 Esponenziale con base 2 Exp(x*Ln(2))
Logaritmo in base 10 Logaritmo in base 10 Ln(x)/Ln(10)
Logaritmo in base 2 Logaritmo in base 2 Ln(x)/Ln(2)
Tangente Tangente Sin(x)/Cos(x)
Cotangente Cotangente Cos(x)/Sin(x)
Arcoseno Arcoseno ArcTan(x/Sqrt(1-Sqr(x)))
Arcocoseno Arcocoseno ArcTan(Sqrt(1-Sqr(x))/x)

Problemi con matrici

Problemi con una matrice

  1. Riempirla di zeri
  2. Riempirla con i numeri consecutivi, per riga, da 1 a …
  3. Riempirla di numeri casuali da 0.0 a 99.9…
  4. Calcolare il minimo dei valori contenuti
  5. … massimo
  6. Calcolare il totale dei valori contenuti
  7. … media
  8. Realizzare la tavola pitagorica
  9. … la matrice identità
  10. … la matrice triangolare superiore
  11. Quante volte compare un certo valore?
  12. Sostituire con 0.0 tutte le occorrenze di un certo valore
  13. Quanto vale la somma dei valori contenuti in una certa riga
  14. … colonna?

Problemi con più matrici

  1. Realizzare la copia
  2. … trasposta
  3. Sono uguali, elemento per elemento?
  4. Calcolare la somma matriciale
  5. Calcolare un certo prodotto scalare (tra una riga della prima e una colonna della seconda…)
  6. Calcolare il prodotto matriciale, se possibile

Problemi con array 2

Con le seguenti dichiarazioni

completa gli esercizi seguenti

Copia il contenuto di un array sorgente in un array destinazione

Produce 2 risultati quindi non è una funzione…

Somma posizione per posizione i primi 2 array e salva nel terzo

Moltiplica posizione per posizione i primi 2 array e salva nel terzo

Problemi con array

Con le seguenti dichiarazioni

completa gli esercizi seguenti

Copia il contenuto di un array sorgente in un array destinazione

Produce 2 risultati quindi non è una funzione…

Somma posizione per posizione i primi 2 array e salva nel terzo

Moltiplica posizione per posizione i primi 2 array e salva nel terzo

Problemi con array

Problemi che richiedono un vettore

  1. Estrarre le cifre da un numero minore di 1.000.000
    n=187

    1 2 3 4 5 6
    0 0 0 1 8 7
  2. Convertire da base 10 a base 2 un numero minore di 256
    n=13

    1 2 3 4 5 6 7 8
    0 0 0 0 1 1 0 1
  3. I numeri da 1 a 999 hanno come somma delle cifre un numero
    • 1 (1-10-100)
    • 2 (2-11-20-101-110-200)
    • 3 (3-12-21-30-102-111-120-201-210-300)
    • 27 (999).
Quanti numeri ci sono per ogni possibile somma?

1 2 3 27
3 6 10 1

Dato un vettore di numeri…

  1. Calcolare il totale dei valori contenuti
  2. Calcolare la media dei valori contenuti
  3. Calcolare minimo, media e massimo (3 risposte…)
  4. Quanti numeri dispari contiene?
  5. Quante volte compare un certo valore k?
  6. Calcolare il totale dei valori alle posizioni pari
  7. Calcolare il totale dei valori positivi
  8. Calcolare il totale dei primi p elementi
  9. È ordinato in modo crescente?
    1 2 3 ?
    10 15 12 No
    10 12 15
  10. Contare le occorrenze di valori positivi, di valori negativi e del valore nullo (3 risposte…)
  11. Spostare il contenuto in modo da rovesciarlo
    1 2 3
    Prima 10 15 12
    Dopo 12 15 10
  12. Ordinarlo
    1 2 3
    Prima 10 15 12
    Dopo 10 12 15

Dati due vettori di numeri…

  1. Sono uguali? (i contenuti posizione per posizione…)
  2. Hanno lo stesso totale dei valori contenuti? (risultato True/False…)
  3. Realizzare una copia, dal primo al secondo
  4. Realizzare una copia, dal primo al secondo, alla rovescia
  5. Copiare dal primo al secondo gli elementi che vanno dalla posizione a alla posizione b

Più di 2 vettori

  1. Sommare posizione per posizione i numeri contenuti in due vettori caricando i risultati in un terzo vettore
  2. Confrontare posizione per posizione i numeri contenuti in due vettori caricando i risultati in un terzo vettore
  3. Realizzare un terzo vettore copiando il contenuto del primo e del secondo consecutivamente (concatenazione)

Array

La notazione funzionale si è rivelata molto flessibile per il riutilizzo del codice della funzione Max2(X, Y), infatti

ma non comoda se bisogna riscrivere l’espressione a seconda del numero di variabili.

L’algoritmo sottostante è invece

(X1, X2)? --> M --> (M, X2)? --> M --> (M, X3)? --> M --> (M, X4)? --> M ...

cioè iterativo…

Un altro esempio è

Sarebbe utile poter realizzare del codice che lavorasse con un pacchetto, di dimensione a piacere ma ragionevole, di variabili:

Il Pascal permette di dichiarare vettori di dimensione costante, cioè la memoria allocata rimane costante anche se si utilizza solo una parte della capacità del vettore.

Una dichiarazione di vettore è la seguente

dove

  • V, il nome della variabile definita subito dopo i due punti
  • Array, indica che si tratta di un vettore (sequenza, pacchetto, raggruppamento, blocco) di elementi più semplici
  • [ ], le parentesi quadre indicano l’elenco dei soprannomi per ciascun elemento nel vettore, in modo da poterli distinguere univocamente
  • 1..10, il primo e l’ultimo soprannome e tutti quelli compresi nell’intervallo da 1 a 10 (..)
  • of, (seguito da un tipo: real, integer, boolean, …) indica il tipo comune degli elementi raggruppati nel vettore

Il primo indice (soprannome) è, quasi sempre, 1 mentre l’ultimo indice è un intero qualsiasi maggiore del primo (10), di conseguenza da quest’ultimo dipende la dimensione del vettore.

Conviene dichiarare la dimensione, una volta per tutte, all’inizio del programma con

rendendo più semplice la modificabilità del codice.

I singoli elementi del vettore sono raggiungibili per operazioni di lettura o scrittura con una scrittura del tipo V[E] dove E è una espressione che dà come risultato un valore compreso nell’intervallo di definizione del vettore.

Esempi

i e 3*i sono espressioni intere con valore nell’intervallo [1..DIM].

I vettori diventano a tutti gli effetti delle risorse (come variabili, costanti) e quindi compariranno anche come parametri per eventuali sottoprogrammi, allora la dichiarazione di funzione precedente potrebbe essere del tipo

ma il TurboPascal non accetta dichiarazioni di tipo complesso nell’elenco dei parametri quindi dobbiamo riassumere con una dichiarazione di tipo

(il nome scelto è libero…) e la dichiarazione del vettore diventa

e la funzione diventa

 

Prova i file di testo

File di testo

Dichiarazione del file di testo

Comandi

Assign(T, s); Assegna al file logico FT il file fisico di nome s
Reset(T); Apre il file in lettura
Rewrite(T); Apre/crea il file in scrittura
Append(T); Apre/crea il file in scrittura, se esiste già del testo si posiziona alla fine
Close(T); Chiude il file
Read(T, x); Legge una stringa/carattere dal file
ReadLn(T, x); Legge una stringa/carattere dal file, e passa alla prossima riga
ReadLn(T); Passa alla prossima riga
Write(T, x); Scrive una stringa/carattere sul file
WriteLn(T, x); Scrive una stringa/carattere sul file, e va a capo
WriteLn(T); Passa alla prossima riga

Funzioni

Eof(T) End of file?
EoLn(T) End of line?

 

File ad accesso casuale

Dichiarazione per operare con un file ad accesso casuale, per esempio di interi

Comandi

Assign(FI, s); Assegna al file logico FI il file fisico di nome s
Reset(FI); Apre il file in lettura
Rewrite(FI); Apre/crea il file in scrittura
Append(FI); Apre/crea il file in scrittura, se esiste già si posiziona alla fine
Close(FI); Chiude il file
Read(FI, x); Legge un intero dal file
Write(FI, x); Scrive un intero sul file
Seek(FI, p); Posiziona il puntatore del file alla posizione specificata
Truncate(FI); Taglia dalla posizione del puntatore in poi

Funzioni

Eof(FI) End of file?
FilePos(FI) File Position?
FileSize(FI) File Size?

 

File ad accesso sequenziale

Dichiarazione per operare con un file ad accesso sequenziale, per esempio di interi

Comandi

Assign(FI, s); Assegna al file logico FI il file fisico di nome s
Reset(FI); Apre il file in lettura
Rewrite(FI); Apre/crea il file in scrittura
Append(FT); Apre/crea il file in scrittura, se esiste già si posiziona alla fine
Close(FI); Chiude il file
Read(FI, x); Legge un intero dal file
Write(FI, x); Scrive un intero sul file

Funzioni

Eof(FI) End of file?