Gli elementi più importanti di un programma sono le variabili. Influenzano il corso degli eventi nel programma durante la sua esecuzione. Ad esempio, se non specificassimo il valore della variabile Name in , a chi verrebbe indirizzato l'output di saluto del programma?
Le variabili possono contenere dati completamente diversi. Ad esempio, una variabile potrebbe memorizzare il nome di qualcuno, un'altra variabile potrebbe memorizzare il suo anno di nascita, una terza variabile potrebbe memorizzare la sua altezza e così via. Dati così diversi sono rappresentati da un computer in modi diversi. Il nome è una stringa di caratteri, l'anno di nascita è un numero intero, l'altezza è un numero reale (ad esempio, l'altezza è 1,72 m).
Il modo in cui i dati sono rappresentati da un computer è determinato dal loro genere. Inoltre, il tipo di dati determina quali azioni possono essere eseguite su tali dati.
I principali tipi di dati standard di Turbo Pascal sono elencati di seguito:
- NUMERO INTERO– dati interi nell'intervallo da –32768 a 32767, occupano due byte in memoria;
- VERO– numeri reali nell'intervallo da 2.9´10 -39 (2.9E-39) a 1.7´10 38 (1.7E38), occupano sei byte;
- CAR– un singolo carattere, un byte;
- CORDA– una stringa di caratteri, il numero di caratteri in una stringa (lunghezza della stringa) è limitato dal numero N tra parentesi quadre, occupa N + 1 byte (se non viene specificato il numero N, la lunghezza massima della stringa è 255 caratteri );
- BOOLEANO– tipo logico, ha due valori: FALSE (false) e TRUE (true), un byte.
Si noti che i tipi INTEGER, CHAR e BOOLEAN fanno riferimento ordinale tipi (tipi ordinali).
Come probabilmente ricorderete, quando si dichiara una variabile, dopo il suo nome vengono inseriti i due punti e quindi viene indicato il tipo. Se più variabili hanno lo stesso tipo, i loro nomi possono essere elencati separati da virgole.
Un esempio di descrizione di variabili di vario tipo:
Delfi/Pascal
var a, b, c: intero; somma: reale; Alfa, Beta: carattere; S:stringa S_1:stringa t: booleano;
a, b, c: intero; somma: reale; Alfa, Beta: carattere; S: stringa [25]; S_1 : stringa t: booleano; |
Si noti che la variabile S_1 è una stringa di caratteri, ma la sua descrizione non specifica una lunghezza. In questo caso, il compilatore stesso imposta la lunghezza massima possibile - 255 caratteri.
Esistono altri tipi di dati predefiniti per la memorizzazione di numeri interi e reali. Le loro caratteristiche sono riportate nelle tabelle seguenti. Confronta questi tipi con i tipi INTEGER e REAL elencati anche nelle tabelle.
Gamma |
Dimensione in byte |
|
CORTO | ||
NUMERO INTERO | ||
LONGINT |
2147483648 .. 2147483647 |
|
BYTE | ||
PAROLA |
Tipi di dati reali
Gamma |
Numero di cifre significative |
Dimensione in byte |
|
VERO |
2.9´10 -39 .. 1.7´10 3 8 |
||
SEPARARE |
1.5´10 – 45 .. 3.4´10 3 8 |
||
DOPPIO |
5.0´10 -3 24 .. 1.7´10 3 08 |
||
ESTESO |
3.4´10 -4932 .. 1.1´10 49 32 |
||
COMP |
2 63 +1 .. 2 63 -1 |
Quale tipo di dati utilizzare
Così tanti tipi diversi, dici, e quale usare?
Dipende dal compito che ti è stato assegnato. Ad esempio vi serve una variabile in cui memorizzerete l'altezza di una certa persona (un valore reale): in questo caso è sufficiente utilizzare il tipo SINGLE. Se una variabile viene utilizzata da te per contare il numero di determinati oggetti (un valore intero positivo), considera se questo numero può essere maggiore di 255, in caso contrario, usa BYTE, se può, non puoi fare a meno di WORD e in in alcuni casi potrebbe essere necessario anche LONGINT.
Per saperne di più sui diversi tipi, premi Maiusc+F1 nell'ambiente Turbo Pascal (apparirà una finestra di indice della guida) e quindi seleziona l'oggetto che ti interessa (ad esempio, digita 'tipo' o 'reale').
Agenzia federale per l'istruzione
astratto
"TIPI DI DATI IN PASCAL"
1. Tipi di dati
Qualsiasi dato, ad es. costanti, variabili, proprietà, valori di funzione o espressioni sono caratterizzati dai loro tipi. Un tipo definisce l'insieme di valori validi che può avere un oggetto, nonché l'insieme di operazioni valide che possono essere applicate ad esso. Inoltre, il tipo determina anche il formato della rappresentazione interna dei dati nella memoria del PC.
In generale, il linguaggio Object Pascal è caratterizzato da una struttura ramificata di tipi di dati (Fig. 1.1). Il linguaggio fornisce un meccanismo per creare nuovi tipi, in modo che il numero totale di tipi utilizzati nel programma possa essere arbitrariamente grande.
I dati elaborati nel programma sono suddivisi in variabili, costanti e letterali:
Costanti sono dati i cui valori sono impostati nella sezione di dichiarazione delle costanti e non cambiano durante l'esecuzione del programma.
Variabili sono dichiarati nella sezione di dichiarazione delle variabili, ma a differenza delle costanti, ottengono i loro valori già durante l'esecuzione del programma e questi valori possono essere modificati. È possibile fare riferimento a costanti e variabili per nome.
Letterale non ha identificatore ed è rappresentato direttamente dal valore nel testo del programma.
Tipo di definisce l'insieme di valori che gli elementi di dati possono assumere e l'insieme di operazioni consentite su di essi.
Questo e i quattro capitoli seguenti forniscono una descrizione dettagliata di ciascun tipo.
1.1 Tipi semplici
I tipi semplici includono i tipi ordinali, reali e data-ora.
Tipi ordinali differiscono in quanto ciascuno di essi ha un numero finito di valori possibili. Questi valori possono essere ordinati in un certo modo (da cui il nome dei tipi) e, quindi, ciascuno di essi può essere associato a un numero intero: il numero ordinale del valore.
Tipi reali, in senso stretto, hanno anche un numero finito di valori, che è determinato dal formato della rappresentazione interna di un numero reale. Tuttavia, il numero di possibili valori dei tipi reali è così grande che non è possibile associare un intero (il suo numero) a ciascuno di essi.
tipo data-ora progettato per memorizzare data e ora. In effetti, utilizza il formato reale per questi scopi.
1.1.1 Tipi ordinali
I tipi ordinali includono (vedi Figura 1.1) intero, booleano, carattere, enum e intervallo. Per ognuno di essi è applicabile la funzione Ord(x), che restituisce il numero ordinale del valore dell'espressione X.
Riso. 1.1 - Struttura dei tipi di dati
Per totale tipi, la funzione ord(x) restituisce il valore di x stesso, ovvero Ord(X) = x per x appartenente a qualsiasi totale genere. Applicare Ord(x) a logico , simbolico ed enumerato tipi fornisce un numero intero positivo compreso tra 0 e 1 ( tipo booleano), da 0 a 255 ( simbolico), da 0 a 65535 ( enumerabile). Tipo-intervallo conserva tutte le proprietà del tipo ordinale sottostante, quindi il risultato dell'applicazione della funzione ord(x) dipende dalle proprietà di quel tipo.
Le funzioni possono essere applicate anche ai tipi ordinali:
prevedere(x)- restituisce il valore precedente del tipo ordinale (il valore che corrisponde all'ordinale ord (x) -1, ovvero ord(pred(x)) = ord(x) - 1;
succ(x)- restituisce il valore successivo del tipo ordinale che corrisponde all'ordinale ord(x) + 1, ovvero ord(Succ(x)) = ord(x) + 1.
Ad esempio, se il programma definisce una variabile
quindi la funzione PRED(c) restituirà il carattere "4" e la funzione SUCC(c) restituirà il carattere "6".
Se immaginiamo qualsiasi tipo ordinale come un insieme ordinato di valori che aumentano da sinistra a destra e occupano un determinato segmento sull'asse dei numeri, la funzione pred (x) non è definita per l'estremità sinistra e succ (x) - per l'estremità destra di questo segmento.
Tipi interi . L'intervallo di valori possibili per i tipi interi dipende dalla loro rappresentazione interna, che può essere uno, due, quattro o otto byte. In tavola. 1.1 elenca i nomi dei tipi interi, la lunghezza della loro rappresentazione interna in byte e l'intervallo di valori possibili.
Tabella 1.1 - Tipi interi
Nome | Lunghezza, byte | Intervallo di valori |
cardinale | 4 | 0. .. 2 147 483 647 |
byte | 1 | 0...255 |
Abbreviazione | 1 | -128...+127 |
Smallint | 2 | -32 768...+32 767 |
Parola | 2 | 0...65 535 |
Numero intero | 4 | |
Longint | 4 | -2 147 483 648...+2 147 483 647 |
int64 | 8 | -9*1018...+9*1018 |
parola lunga | 4 | 0. . .4 294 967 295 |
Tipi parola lunga e int64 introdotto per la prima volta nella versione 4 e tipi Smallint e cardinale mancante in Delphi 1. Digitare numero intero per questa versione ci vogliono 2 byte e ha un range di valori da -32768 a +32767, cioè lo stesso di Smallint .
Quando si utilizzano procedure e funzioni con parametri interi, è necessario essere guidati dal "nidificazione" dei tipi, ad es. ovunque possa essere utilizzato parola, è consentito l'uso byte(ma non viceversa) Longint“entra” Smallint, che a sua volta include Abbreviazione .
L'elenco delle procedure e delle funzioni applicabili ai tipi interi è riportato nella tabella. 1.2. Le lettere b, s, w, i, l denotano rispettivamente espressioni del tipo byte , Abbreviazione, Parola, Intero e Longint ,
x è un'espressione di uno qualsiasi di questi tipi; le lettere vb, vs, vw, vi, vl, vx denotano variabili dei rispettivi tipi. Un parametro opzionale è indicato tra parentesi quadre.
Tabella 1.2 - Procedure e funzioni standard applicabili ai tipi interi
Appello | Tipo di risultato | Azione |
addominali(x) | X | Restituisce il modulo x |
chr(b) | Char | Restituisce un carattere in base al suo codice |
dec(vx[, i]) | - | Diminuisce il valore di vx di i e, in assenza di i, di 1 |
inc(vx[,i]) | - | Aumenta il valore di vx di i, e in assenza di i - di 1 |
Ciao (w) | byte | Restituisce l'arco più alto dell'argomento |
Ciao (io) | Stesso | Restituisce il terzo byte |
Lo(i) | “ | Restituisce il byte basso dell'argomento |
Basso) | “ | Stesso |
dispari(l) | booleano | Restituisce True se l'argomento è un numero dispari |
Casuale(w) | Come parametro | Restituisce un numero pseudocasuale distribuito uniformemente nell'intervallo 0...(w-l) |
sqr(x) | X | Restituisce il quadrato dell'argomento |
scambiare(i) | Numero intero | Scambia i byte in una parola |
scambiare(w) | Parola | Anche |
Quando si opera su numeri interi, il tipo del risultato corrisponderà al tipo degli operandi e, se gli operandi sono di tipi interi diversi, a un tipo comune che include entrambi gli operandi. Ad esempio, quando si agisce con corto e parola comune sarà il tipo numero intero. Per impostazione predefinita, il compilatore Delphi non genera codice che controlla se un valore è fuori intervallo, il che può creare confusione.
Tipi booleani . I tipi booleani lo sono Booleano, ByteBool, Bool, wordBool e bollo lungo. Nel Pascal standard viene definito solo il tipo booleano, altri tipi booleani vengono introdotti in Object Pascal per compatibilità con Windows: tipi booleano e ByteBool occupano un byte ciascuno, Bollo e vocabolo- 2 byte, bollo lungo- 4 byte. I valori booleani possono essere una delle costanti predichiarate False (false) o True (true).
Poiché il tipo booleano è un tipo ordinale, può essere utilizzato in un'istruzione di ciclo del tipo di conteggio. In Delfi 32 per booleano significato
Ord (True) = +1, mentre per altri tipi ( bool, wordbool eccetera.)
Ord (True) = -1, quindi questi tipi di operatori dovrebbero essere usati con cautela! Ad esempio, per la versione Delphi 6, l'eseguibile showMessage (" ---") nel ciclo seguente per non verrà mai eseguito:
for L:= Da Falso a Vero do
ShowMessage("--);
Se sostituiamo il tipo di parametro loop L nell'esempio precedente con booleano, il ciclo verrà eseguito e il messaggio apparirà due volte sullo schermo. [Per Delphi versione 1 e 2 ord (True) =+1 per qualsiasi tipo booleano.]
Tipo di carattere . I valori del tipo di carattere sono l'insieme di tutti i caratteri PK. Ad ogni carattere viene assegnato un numero intero compreso tra 0 e 255. Questo numero funge da codice per la rappresentazione interna del carattere e viene restituito dalla funzione ord.
La codifica di Windows utilizza il codice ANSI (chiamato per l'American National Standard Institute, l'istituto di standard americano che ha proposto questo codice). La prima metà dei caratteri del PC con i codici 0...127 corrisponde alla Tabella 1.3. La seconda metà dei caratteri con i codici 128...255 cambia per i diversi tipi di carattere. I font standard di Windows Arial Cyr, Courier New Cyr e Times New Roman per rappresentare i caratteri cirillici (senza le lettere “ё” e “Ё”) utilizzano gli ultimi 64 codici (da 192 a 256): “А”... “ß ” sono valori codificati 192..223, “a”... “i” - 224...255. I caratteri "Ё" e "ё" hanno rispettivamente i codici 168 e 184.
Tabella 1.3 - Codifica dei caratteri secondo lo standard ANSI
Il codice | Simbolo | Il codice. | Simbolo | Il codice. | Simbolo | Il codice | Simbolo |
0 | NULLA | 32 | BL | 64 | @ | 96 | " |
1 | ZON | 33 | ! | 65 | MA | 97 | un |
2 | STX | 34 | “ | 66 | A | 98 | b |
3 | ETX | 35 | # | 67 | DA | 99 | Insieme a |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | e | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | " | 71 | G | 103 | d |
8" | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | io | 105 | io |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | Per | 107 | K |
12 | FF | 44 | F | 76 | l | 108 | 1 |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | COSÌ | 46 | 78 | N | 110 | n | |
15 | SI | 47 | / | 79 | 0 | 111 | di |
16 | DEL | 48 | 0 | 80 | R | 112 | P |
17 | DC1 | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | S |
20 | CD 4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | u | 117 | tu |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | ETB | 55 | 7 | 87 | w | 119 | w |
24 | POTERE | 56 | 8 | 88 | X | 120 | X |
25 | EM | 57 | 9 | 89 | Y | 121 | In |
26 | SUB | 58 | : | 90 | Z | .122 | z |
27 | ESC | 59 | ; | 91 | t | 123 | { |
28 | FS | 60 | < | 92 | \ | 124 | 1 |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | l | 126 | ~ |
31 | NOI | 63 | F | 95 | 127 | r |
I simboli con i codici 0...31 si riferiscono ai codici di servizio. Se questi codici vengono utilizzati nel testo simbolico di un programma, vengono considerati spazi.
Digitare car sono applicabili le operazioni relazionali, così come le funzioni integrate:
Char (dentro)- tipo funzione car; converte l'espressione in tipo byte in un simbolo e lo restituisce con il suo valore;
UpCase(CH)- tipo funzione car; restituisce una lettera maiuscola se сн è una lettera latina minuscola, altrimenti restituisce il carattere stesso сн (per il cirillico restituisce il carattere originale).
Tipo enumerato . Un tipo enumerato è definito enumerando i valori che può ricevere. Ogni valore è denominato da un identificatore e si trova in un elenco racchiuso tra parentesi, ad esempio:
colori = (rosso, bianco, blu);
L'uso di tipi enumerati rende i programmi più leggibili.
La corrispondenza tra i valori di un tipo enumerato e i numeri ordinali di questi valori è stabilita dall'ordine di enumerazione: il primo valore nell'elenco ottiene il numero ordinale 0, il secondo - 1 e così via. parola e può essere visto come una dichiarazione compatta di un gruppo di costanti intere con valori 0, 1, ecc. Contemporaneamente.
L'uso di tipi enumerati aumenta l'affidabilità dei programmi potendo controllare i valori che ricevono le variabili corrispondenti. In Object Pascal è consentita la conversione inversa: qualsiasi espressione di tipo Parola può essere convertito in un valore di un tipo enumerato, purché il valore dell'espressione intera non superi la cardinalità di quel tipo. Questa conversione si ottiene usando una funzione dichiarata automaticamente con un nome di tipo enumerato.
Tipo-intervallo . Un tipo di intervallo è un sottoinsieme del relativo tipo di base, che può essere qualsiasi tipo ordinale ad eccezione del tipo di intervallo.
Un tipo di intervallo è definito dai limiti dei suoi valori all'interno del tipo di base:
<мин.знач.>..<макс.знач.>
Qui<мин. знач. >- valore minimo di tipo range;<макс. знач. >- il suo valore massimo.
Il tipo di intervallo non deve essere descritto nella sezione del tipo, ma può essere specificato direttamente quando si dichiara una variabile.
Quando si definisce un tipo di intervallo, è necessario seguire le seguenti regole:
due caratteri ".." sono trattati come un carattere, quindi non sono consentiti spazi tra di loro; l'estremità sinistra dell'intervallo non deve superare la sua estremità destra.
Un tipo di intervallo eredita tutte le proprietà del tipo di base, ma con limitazioni dovute alla cardinalità inferiore. In particolare, se è definita una variabile.
La libreria standard Object Pascal include due funzioni che supportano il lavoro con i tipi di intervallo:
Alto(x)- restituisce il valore massimo dell'intervallo di tipi a cui appartiene la variabile x;
Basso(x)- restituisce il valore minimo del tipo-intervallo.
1.1.2 Tipi reali
A differenza dei tipi ordinali, i cui valori sono sempre confrontati con una serie di interi e, quindi, sono rappresentati nel PC in modo assolutamente esatto, i valori dei tipi reali definiscono un numero arbitrario solo con una certa precisione finita, a seconda del formato interno del numero reale.
Tabella 1.4 - Tipi reali
Nelle versioni precedenti del tipo Delphi 1...3 Vero occupava 6 byte e aveva un intervallo di valori da 2,9*10-39 a 1,7*1038. Nelle versioni 4 e 5, questo tipo è equivalente al tipo Doppio. Se necessario (per motivi di compatibilità) utilizzare 6 byte Vero, è necessario specificare una direttiva del compilatore (SREALCOMPATIBILITY ON).
Come si può vedere dalla Tabella. 1.4, un numero reale in Object Pascal occupa da 4 a 10 byte contigui e ha la seguente struttura nella memoria del PC.
Qui s è il bit di segno del numero; e è la parte esponenziale; contiene ordine binario; m è la mantissa del numero.
Mantissa m ha lunghezza da 23 (per separare) a 63 (per Esteso) cifre binarie, che fornisce una precisione di 7...8 per separare e 19...20 per Esteso cifre decimali. Il punto decimale (virgola) è implicito prima della cifra sinistra (più significativa) della mantissa, ma quando si opera con un numero, la sua posizione viene spostata a sinistra oa destra secondo l'ordine binario del numero memorizzato nella parte esponenziale , quindi le operazioni sui numeri reali sono chiamate aritmetica in virgola mobile (virgola).
Si noti che il coprocessore aritmetico elabora sempre i numeri nel formato Esteso, e gli altri tre tipi reali in questo caso si ottengono semplicemente troncando i risultati alla dimensione desiderata e vengono utilizzati principalmente per risparmiare memoria.
I tipi occupano una posizione speciale in Object Pascal comp e Moneta, che sono trattati come numeri reali con parti frazionarie di lunghezza fissa: in comp la parte frazionaria ha una lunghezza di 0 cifre, cioè è semplicemente assente, in moneta lunghezza della frazione -4 cifre decimali. In effetti, entrambi i tipi definiscono un intero grande con segno che memorizza 19...20 cifre decimali significative (occupano internamente 8 byte contigui). Allo stesso tempo, nelle espressioni comp e moneta sono pienamente compatibili con qualsiasi altro tipo reale: tutte le operazioni reali sono definite su di esso, possono essere utilizzate come argomenti di funzioni matematiche, ecc. Lo scopo più adatto di questi tipi è il calcolo contabile.
1.1.3 Tipo data-ora
Il tipo data-ora è definito da un identificatore standard TDateTime ed è progettato per memorizzare sia la data che l'ora contemporaneamente. Nella rappresentazione interna, occupa 8 byte e simili monetaè un numero reale con una parte frazionaria fissa: la parte intera del numero memorizza la data, la parte frazionaria l'ora. La data è definita come il numero di giorni trascorsi dal 30 dicembre 1899 e l'ora è definita come la frazione di giorno dalle 00:00, quindi il valore 36444.837 corrisponde alla data 11/10/1999 e all'ora 20:05. Il numero di giorni può anche essere negativo, ma i valori inferiori a -693594 (corrispondente alla data 00.00.0000 d.C.) vengono ignorati dalle funzioni di conversione da data a stringa.
Dati di tipo superiore TDateTime le stesse operazioni sono definite come sui numeri reali, ed espressioni di questo tipo possono coinvolgere costanti e variabili di tipo intero e reale.
Dal tipo TDateTime compatibile con il formato dei numeri reali, si può facilmente determinare la data che è di qualche giorno avanti o indietro rispetto a quella data: per fare ciò è sufficiente sommare o sottrarre rispettivamente l'intero desiderato dalla data data.
1.2 Tipi strutturati
Qualsiasi tipo strutturato (e ce ne sono quattro in Object Pascal: array, record, set e file) è caratterizzato dalla molteplicità degli elementi che formano questo tipo. Ogni elemento, a sua volta, può appartenere a un tipo strutturato, che ci permette di parlare del possibile annidamento dei tipi. Object Pascal consente una profondità arbitraria di annidamento dei tipi, tuttavia, la lunghezza totale di ciascuno di essi nella rappresentazione interna non deve superare i 2 GB.
Per compatibilità con Pascal standard, Object Pascal consente a una parola riservata di precedere una dichiarazione di tipo strutturato. confezionato, indicando al compilatore, se possibile, di risparmiare memoria allocata per oggetti di tipo strutturato; ma il compilatore in realtà ignora questa indicazione: il "packaging" dei dati in Object Pascal viene eseguito automaticamente ove possibile.
1.2.1 Matrici
Gli array in Object Pascal sono simili in molti modi a tipi di dati simili in altri linguaggi di programmazione. Una caratteristica distintiva degli array è che tutti i loro componenti sono dati dello stesso tipo (possibilmente strutturati). Questi componenti possono essere facilmente ordinati e ad ognuno di essi è possibile accedere semplicemente specificandone il numero ordinale.
Una descrizione del tipo di matrice è data come segue:
<имя типа>= matrice[<сп.инд.типов>] di<тип>;
Qui<имя типа>- identificatore corretto; matrice, di- parole riservate (array, from);<сп.инд.типов>- un elenco di uno o più tipi di indice separati da virgole; le parentesi quadre che circondano l'elenco sono un requisito di sintassi;<тип>- qualsiasi tipo di Object Pascal.
Come tipi di indice in Object Pascal, puoi utilizzare qualsiasi tipo ordinale che abbia una capacità non superiore a 2 GB (cioè, ad eccezione di parola lunga e int64)
La profondità di annidamento dei tipi strutturati in generale e, di conseguenza, degli array, è arbitraria, quindi il numero di elementi nell'elenco dei tipi di indice (dimensione dell'array) non è limitato, tuttavia, la lunghezza totale della rappresentazione interna di qualsiasi l'array non può superare i 2 GB. Nella memoria di un PC, gli elementi di un array si susseguono in modo che quando ci si sposta da indirizzi inferiori a indirizzi superiori, l'indice di array più a destra cambia più rapidamente.
In Object Pascal, puoi trasferire tutti gli elementi di un array in un altro array dello stesso tipo con un operatore di assegnazione.
1.2.2 Voci
Registrazione è una struttura dati costituita da un numero fisso di componenti chiamati campi record. A differenza di un array, i componenti (campi) di un record possono essere di diversi tipi. Per poter fare riferimento all'uno o all'altro componente del record, i campi sono denominati.
La struttura di una dichiarazione del tipo di record è la seguente:
<имятипа>= registrare<сп.полей>fine;
Qui<имя типа>- identificatore corretto; registrare/ terminare- parole riservate (record, fine);<сп.полей>- elenco dei campi; è una sequenza di sezioni di un record separate da un punto e virgola.
Ciascuna sezione di un record è costituita da uno o più identificatori di campo separati da virgole.
Frase caso di, che apre la parte variante, esternamente assomiglia al corrispondente operatore di selezione, ma in realtà svolge solo il ruolo di una sorta di parola ausiliaria che denota l'inizio della parte variante. Ecco perché alla fine della parte variante non si dovrebbe mettere fine come coppia a caso di. (Dato che la parte variante è sempre l'ultima nel record, ha ancora una fine dopo di essa, ma solo come coppia da registrare). Tasto di selezione in una frase caso di viene effettivamente ignorato dal compilatore: l'unico requisito in Object Pascal è che la chiave definisca un tipo ordinale standard o pre-dichiarato.
I nomi dei campi devono essere univoci all'interno del record in cui sono dichiarati, tuttavia, se i record contengono campi del record, ovvero nidificati uno dentro l'altro, i nomi possono essere ripetuti a diversi livelli di nidificazione.
1.2.3 Insiemi
Imposta - si tratta di insiemi di oggetti dello stesso tipo logicamente correlati tra loro. La natura delle relazioni tra oggetti è solo implicita dal programmatore e non è controllata in alcun modo da Object Pascal. Il numero di elementi inclusi nell'insieme può variare da 0 a 256 (un insieme che non contiene elementi si dice vuoto). È la variabilità nel numero dei loro elementi che distingue dagli array e dai record.
Due insiemi sono considerati equivalenti se e solo se tutti i loro elementi sono uguali e l'ordine degli elementi nell'insieme è indifferente. Se tutti gli elementi di un insieme sono inclusi anche in un altro, diciamo che il primo insieme è compreso nel secondo. Il set vuoto è incluso in qualsiasi altro set.
La descrizione di un tipo di set è:
<имя типа>= insieme di<базовый тип>;
Qui<имя типа>- identificatore corretto; set, di- parole riservate (impostate, da);<базовый тип>- il tipo base degli elementi dell'insieme, che può essere qualsiasi tipo ordinale, eccetto Parola, Intero, Longint, Int64 .
Per specificare un insieme, viene utilizzato il cosiddetto costruttore di insiemi: un elenco di specificazioni di elementi di insiemi, separati tra loro da virgole; l'elenco è racchiuso tra parentesi quadre. Le specifiche degli elementi possono essere costanti o espressioni di un tipo di base o un tipo di intervallo dello stesso tipo di base.
La struttura interna dell'insieme è tale che a ciascuno dei suoi elementi viene assegnata una cifra binaria (un bit); se l'elemento è compreso nel set, il bit corrispondente è 1, altrimenti è 0. Allo stesso tempo, l'unità di memoria minima è un byte contenente 8 bit, quindi il compilatore ha assegnato un byte ai set, e come risultato, la potenza di ciascuno di essi è diventata pari a 8 elementi. La cardinalità massima dell'insieme è di 256 elementi. Per tali set, il compilatore alloca 16 byte contigui.
E un altro esperimento: cambia l'intervallo del tipo di base in 1..256. Sebbene la cardinalità di questo tipo sia 256 elementi, quando si tenta di compilare il programma, il compilatore segnalerà un errore: gli insiemi possono avere al massimo 256 elementi (gli insiemi possono avere al massimo 256 elementi) poiché la numerazione degli elementi degli insiemi parte da zero, indipendentemente dal limite inferiore dichiarato nel programma. Il compilatore consente al tipo di base di essere un tipo di intervallo intero con un limite minimo di 0 e un massimo di 255 o qualsiasi tipo enumerato con non più di 256 elementi (la cardinalità massima di un tipo enumerato è 65536 elementi).
1.3 Linee
I seguenti tipi vengono utilizzati per l'elaborazione del testo in Object Pascal:
stringa corta shortString o stringa[n], dove n<= 255;
stringa lunga corda ;
corda larga Stringa larga ;
stringa null-terminale pchar .
Ciò che questi tipi hanno in comune è che ogni stringa viene trattata come un array unidimensionale di caratteri, il numero di caratteri in cui può cambiare nel programma in esecuzione: per string [n], la lunghezza della stringa varia da 0 a n , per corda e pchar- da 0 a 2 GB.
Standard Pascal utilizza solo stringhe corte Stringa[n]. In memoria, tale stringa è allocata n + i byte, il primo byte contiene la lunghezza corrente della stringa e i caratteri stessi si trovano a partire dal 2° byte. Poiché la lunghezza della stringa in questo caso è di un byte, la lunghezza massima di una stringa corta non può superare i 255 caratteri. Il tipo standard viene utilizzato per dichiarare una breve stringa di lunghezza massima. Corta(equivalente Corda).
Windows fa ampio uso di stringhe null-terminal, che sono stringhe di caratteri delimitate da #o. La lunghezza massima di tale stringa è limitata solo dalla memoria disponibile e può essere molto grande.
Nuovo tipo introdotto nelle versioni a 32 bit di Delphi corda, combinando la comodità di entrambi i tipi. Quando si lavora con questo tipo, la memoria viene allocata secondo necessità (dinamicamente) ed è limitata dalla memoria disponibile disponibile per il programma.
1.4 Puntatori e memoria dinamica
1.4.1 Memoria dinamica
memoria dinamica- questa è la RAM del PC fornita al programma durante il suo funzionamento. L'allocazione dinamica dei dati significa l'uso della memoria dinamica direttamente quando il programma è in esecuzione. Al contrario, l'allocazione statica viene eseguita dal compilatore Object Pascal durante la compilazione del programma. Con l'allocazione dinamica non si conosce in anticipo né il tipo né la quantità di dati da allocare.
1.4.2 Puntatori
La RAM del PC è una raccolta di celle per la memorizzazione di informazioni: byte, ognuno dei quali ha il proprio numero. Questi numeri sono chiamati indirizzi, ti permettono di accedere a qualsiasi byte di memoria. Object Pascal fornisce al programmatore un mezzo flessibile per gestire la memoria dinamica: i cosiddetti puntatori. Un puntatore è una variabile che ha come valore l'indirizzo di un byte di memoria. Utilizzando i puntatori, puoi allocare qualsiasi tipo di dati noto in Object Pascal nella memoria dinamica. Solo alcuni di loro ( Byte, Char, ShortInt, Booleano) occupano un byte nella rappresentazione interna, il resto - diversi adiacenti. Quindi il puntatore in realtà indirizza solo il primo byte di dati.
In genere, un puntatore è associato a un tipo di dati. Tali puntatori verranno chiamati digitati. Per dichiarare un puntatore digitato, utilizzare il segno ^, che viene posizionato prima del tipo corrispondente.
In Object Pascal, puoi dichiarare un puntatore senza associarlo a un particolare tipo di dati. Questo è il tipo standard puntatore, Per esempio:
I puntatori di questo tipo saranno chiamati non tipizzati. Poiché i puntatori non tipizzati non sono associati a un tipo specifico, sono utili per l'allocazione dinamica dei dati la cui struttura e tipo cambiano durante l'esecuzione del programma.
Come già accennato, i valori dei puntatori sono gli indirizzi delle variabili in memoria, quindi ti aspetteresti che il valore di un puntatore venga passato a un altro. In realtà questo non è vero. In Object Pascal, puoi passare valori solo tra puntatori associati allo stesso tipo di dati.
1.4.3 Allocazione e deallocazione della memoria dinamica
Tutta la memoria dinamica in Object Pascal viene trattata come una matrice contigua di byte, chiamata heap.
La memoria per qualsiasi variabile allocata dinamicamente viene allocata dalla procedura New. Il parametro di chiamata a questa procedura è un puntatore tipizzato. A seguito dell'accesso, il puntatore acquisisce un valore corrispondente all'indirizzo da cui possono essere collocati i dati. Il valore indicato dal puntatore, ovvero i dati effettivi allocati sull'heap, è indicato dal segno ^, che viene posizionato subito dopo il puntatore. Se non c'è il segno ^ dietro il puntatore, allora si intende l'indirizzo in cui si trovano i dati. Ha senso ripensare a quanto appena detto: il valore di qualsiasi puntatore è un indirizzo, e per indicare che non si tratta di un indirizzo, ma dei dati che si trovano a questo indirizzo, dopo il puntatore (a volte lo dicono come un puntatore di dereferenziazione).
I dati allocati dinamicamente possono essere utilizzati ovunque nel programma, dove è consentito per costanti e variabili del tipo corrispondente
La memoria dinamica non solo può essere prelevata dall'heap, ma anche restituita. Questo viene fatto usando la procedura Smaltimento. Ad esempio, gli operatori
Smaltire(pJ);
Smaltire(pR);
restituirà nell'heap la memoria che era stata precedentemente assegnata ai puntatori pJ e pR (vedi sopra).
Si noti che la procedura Dispose (pPtr) non modifica il valore del puntatore pPtr, ma riporta solo nell'heap la memoria precedentemente associata a questo puntatore. Tuttavia, la riapplicazione della procedura a un puntatore libero comporterà un errore di runtime. Il programmatore può contrassegnare il puntatore liberato con la parola riservata nil.
1.5 Digitare alias
Puoi dichiarare tutti gli alias che desideri per qualsiasi tipo. Per esempio:
TMyIntero = Intero;
L'alias può quindi essere utilizzato allo stesso modo del tipo base:
Mylnt: TMyInteger;
MyInt:= 2*Round(pi);
Questi tipi di alias vengono solitamente utilizzati per aumentare la visibilità del codice del programma. Tuttavia, in Object Pascal, puoi dichiarare alias fortemente tipizzati aggiungendo il tipo di parola riservato davanti al nome del tipo di base:
TMyIntegerType = tipo intero;
MylntVar: TMyIntegerType;
Dal punto di vista del compilatore, gli alias tipizzati sono compatibili con il tipo base in vari tipi di espressioni, ma in realtà dichiarano un nuovo tipo di dati, quindi non possono essere usati come parametri formali per chiamare subroutine al posto del tipo base. Se, ad esempio, la procedura è dichiarata
funzione MyIntFunc(APar: intero): intero;
poi un tale appello a lei
MylntFunc(MylntVar)
sarà considerato dal compilatore come un errore.
Gli alias fortemente tipizzati fanno sì che il compilatore generi informazioni sul tipo in fase di esecuzione (RTTI). Queste informazioni vengono solitamente utilizzate dall'ambiente Delphi per fornire vari tipi di editor.
Quando si dichiara una variabile, è necessario specificarne il tipo. Il tipo di una variabile descrive l'insieme di valori che può assumere e le azioni che possono essere eseguite su di essa. La dichiarazione di tipo definisce un identificatore che denota il tipo.
I tipi semplici sono divisi in standard (ordinali) ed enumerati (limitati).
Tipi standard
Turbo Pascal ha quattro tipi standard incorporati: intero (intero), reale (reale), booleano (booleano) e carattere (carattere).
Tipo intero (intero)
Turbo Pascal ha cinque tipi di interi incorporati: shortint (numero intero corto), intero (numero intero), longint (numero intero lungo), byte (byte lungo) e parola (parola lunga). Ciascun tipo denota un sottoinsieme specifico di numeri interi, come mostrato nella tabella seguente.
Tipi interi incorporati.
Gamma |
Formato |
|
8 bit con segno |
||
16 bit con segno |
||
2147483648 +2147483647 |
32 bit con segno |
|
8 bit senza segno |
||
16 bit senza segno |
Le operazioni aritmetiche su operandi di tipo intero vengono eseguite secondo le seguenti regole:
- Il tipo di una costante intera è il tipo intero integrato con l'intervallo più piccolo che include il valore di quella costante intera.
- Nel caso di un'operazione binaria (un'operazione che utilizza due operandi), entrambi gli operandi vengono convertiti nel tipo comune prima che venga eseguita l'operazione su di essi. Il tipo generico è il tipo integrale integrato con l'intervallo più piccolo che include tutti i valori possibili di entrambi i tipi. Ad esempio, il tipo comune per integer e integer a lunghezza di byte è integer e il tipo comune per integer e integer a lunghezza di parola è long integer. L'azione viene eseguita in base alla precisione del tipo generico e il tipo di risultato è il tipo generico.
- L'espressione a destra in un'istruzione di assegnazione viene valutata indipendentemente dalla dimensione della variabile a sinistra.
Operazioni eseguite su numeri interi:
“+” - aggiunta
“-“ - sottrazione
"*" - moltiplicazione
SQR - squadratura
DIV - scarta la parte frazionaria dopo la divisione
MOD - ottiene il resto intero dopo la divisione
ABS - modulo numerico
RANDOM(X) - ottenere un numero casuale da 0 a X
R:=100 ; b:=60 ; un risultato DIV b è 1 e il risultato MOD b è 40
Le variabili intere sono dichiarate come segue:
var elenco di variabili: tipo;
Ad esempio: var a,p,n:intero;
Tipo reale (reale)
Il tipo reale si riferisce al sottoinsieme di numeri reali che possono essere rappresentati in formato a virgola mobile con un numero fisso di cifre. Un valore a virgola mobile di solito include tre valori - m, b ed e - tali che m*b e, dove b è sempre 10, e m ed e sono valori interi nell'intervallo di tipo reale. Questi valori m ed e definiscono ulteriormente l'intervallo e la precisione del tipo reale.
Esistono cinque tipi di tipi reali: real, single, duble, exnende, comp. I tipi reali differiscono per l'intervallo e la precisione dei valori associati
Intervallo e cifre decimali per i tipi reali
Gamma |
Numeri |
|
da 2,9x10E-39 a 1,7x10E 38 da 1,5x10E-45 a 3,4x10E 38 da 5,0x10E-324 a 1,7x10E 308 3.4x10E-493 a 1.1x10E 403 da 2E 63 a 2E 63 |
Operazioni eseguite su numeri reali:
- Tutte le operazioni sono valide per numeri interi.
- SQRT(x) è la radice quadrata di x.
- SIN(X), COS(X), ARCTAN(X).
- LN(X)-logaritmo naturale.
- EXP(X)-esponente X (ex).
- EXP (X * LN (A)) - esponenziazione (A x).
- Digitare le funzioni di conversione:
- TRUNC(X) - scarta la parte frazionaria;
- ROUND(X) - arrotondamento.
- Alcune regole per le operazioni aritmetiche:
- Se in un'operazione aritmetica sono presenti numeri di tipo reale e intero, il risultato sarà di tipo reale.
- Tutti i componenti dell'espressione sono scritti in una riga.
- Vengono utilizzate solo le parentesi.
- Non puoi mettere due segni aritmetici in fila.
Le variabili di tipo reale sono descritte come segue:
var elenco di variabili: tipo;Per esempio:
var d,g,k:reale ;Tipo di carattere (carattere)
Il tipo char è qualsiasi carattere racchiuso tra apostrofi. Per rappresentare un apostrofo come variabile carattere, racchiuderlo in un apostrofo: ''''.
Ogni carattere ha il proprio codice e numero. I numeri ordinali di cifre 0,1..9 sono ordinati in ordine crescente. Anche i numeri ordinali delle lettere sono in ordine crescente, ma non necessariamente si susseguono.
I segni di confronto si applicano ai dati sui personaggi:
> , < , >=, <=, <> .
Ad esempio: 'A'< ‘W’
Funzioni che si applicano alle variabili carattere:
- ORD(X) - determina il numero ordinale del carattere X. ord ('a') =97 ;
- CHR(X) - determina il carattere in base al numero. chr (97 ) ='a';
- PRED(X) - stampa il carattere che precede il carattere X. pred('B') ='A';
- SUCC(X) - restituisce il carattere che segue il carattere X. succ('A') ='B';
tipo enumerato
Un tipo di dati enumerato è così chiamato perché è specificato come un'enumerazione di costanti in un ordine rigorosamente definito e in un numero rigorosamente definito. Un tipo enumerato è costituito da un elenco di costanti. Le variabili di questo tipo possono assumere il valore di una qualsiasi di queste costanti. La dichiarazione del tipo enumerato si presenta così:
genere<имя типа>=(lista di costanti) ; Var<имя переменной>:<имя типа>;dove<список констант>- questo è un tipo speciale di costanti, separate da virgole e dotate di un proprio numero di serie, a partire da 0.
Per esempio:
digitare direction=(nord, sud, ovest, est) ; mese=(giugno, luglio, agosto, gennaio) ; capacità = (secchio, fusto, tanica, serbatoio) ; var rotazione:direzione; partenza: mese; volume:capacità; var turn:(nord, sud, ovest, est) ; partenza: (giugno, luglio, agosto, gennaio) ; volume: (secchio, canna, tanica, serbatoio) ;È possibile eseguire i seguenti operatori di assegnazione:
Svolta:=sud; partenza:=agosto; volume:=serbatoio;
ma non puoi fare incarichi misti:
Partenza:=sud; volume:=agosto;
Le seguenti funzioni si applicano alle variabili di tipo enumerato:
1. ORD - numero di serie
2. PRED - l'elemento precedente
3. SUCC è l'elemento successivo.
PRED (barile) = secchio; SUCC (sud) = ovest; ORD (luglio) =1 ;Le variabili di tipo enumerato possono essere confrontate perché sono ordinate e numerate. Quindi espressioni: nord< юг, июнь < январь имеют значения TRUE, а юг>ovest e serbatoio<бочка значение FАLSE.
tipo limitato
Se una variabile non assume tutti i valori del suo tipo, ma solo in un determinato intervallo, può essere considerata come una variabile di tipo limitato. Ogni tipo vincolato viene definito imponendo un vincolo sui tipi di base.
È descritto così:
GENERE<имя типа>=costante1 ..costante2In questo caso, devono essere seguite le seguenti regole:
- Entrambe le costanti limitate devono essere dello stesso tipo.
- Qualsiasi tipo semplice, eccetto quello reale, può essere utilizzato come tipo base.
- Il valore iniziale quando si definisce un tipo limitato non deve essere maggiore del valore finale.
Puoi descriverlo subito nella sezione relativa alla dichiarazione delle variabili:
var a,g:0 ..63 ; char1,char2:'a'..'z'.Ogni professionista una volta era una teiera. Sicuramente hai familiarità con lo stato quando “non sai come iniziare a pensare per pensare a questo”. Sicuramente ti sei imbattuto in una situazione in cui semplicemente non sai da dove cominciare. Questo libro è rivolto proprio a queste persone che vorrebbero diventare programmatori, ma non sanno affatto come iniziare questo percorso. ...
Quasi tutti i tipi di dati interi sono . Questi tipi di dati rappresentano numeri interi all'interno di un intervallo specifico. I nomi specifici dei tipi interi e degli intervalli di valori dipendono dal linguaggio di programmazione specifico, dal compilatore e dalla modalità di compilazione. Per ulteriori informazioni su questo, vedere la documentazione per il compilatore.
Ad esempio, il tipo di dati Numero intero in Delphi ha il range -2147483648…2147483647, mentre in Turbo Pascal il tipo di dati è Numero intero rappresenta i numeri nell'intervallo -35768…32767. In Free Pascal, l'intervallo di valori di un tipo Numero intero determinato dalla modalità selezionata.
Poiché Lazarus utilizza il compilatore Free Pascal, tutto ciò che viene detto sui tipi di dati in relazione a Free Pascal vale anche per Lazarus.
Quindi i tipi di dati interi Free Pascal sono elencati nella Tabella 13.1.
Tabella 13.1. Tipi di dati interi Pascal libero (Lazarus).
Tipo di | Dimensioni, byte | Intervallo di valori |
byte | 1 | 0…255 |
Abbreviazione | 1 | -128…127 |
Smallint | 2 | -35768…32767 |
Parola | 2 | 0…65535 |
Numero intero | 2 o 4 | Dipende dalla modalità di compilazione |
cardinale | 4 | 0…4294967295 |
Longint | 4 | -2147483648…2147483647 |
parola lunga | 4 | 0...4294967295 |
int64 | 8 | -9223372036854775808...9223372036854775807 |
QWord | 8 | 0...18446744073709551615 |
NOTA
Tipi di Pascal gratuiti int64 e QWord non sono ! Ciò significa che non è possibile utilizzarli, ad esempio, per le variabili di indice nei loop. Tuttavia, li ho inclusi qui per non descriverli separatamente in futuro e per raccogliere tutti i tipi interi di Free Pascal in un unico posto. Se non capisci alcune parole, non preoccuparti. A tempo debito, ti dirò di più su tutto.
E ora alcune spiegazioni per la tavola.
In una colonna TIPO DI vengono forniti gli identificatori del tipo di dati (parole chiave che indicano al compilatore a quale tipo appartengono questo o quel dato). Imparerai come utilizzare questi identificatori nelle lezioni seguenti.
In una colonna LA DIMENSIONE specifica la dimensione che il tipo di dati occupa nella memoria del computer. Ad esempio, un intero positivo può essere rappresentato da diversi tipi: byte, Parola, cardinale ecc. Tuttavia, un certo numero di tipo cardinale occuperà 4 byte in memoria, mentre un numero di tipo byte- solo 1 byte. Pertanto, se sai per certo che il numero con cui stai lavorando non assumerà mai un valore maggiore di 255, allora è meglio definirlo come tipo byte, in quanto ciò farà risparmiare spazio nella memoria del tuo computer. Sebbene non tutto sia così semplice qui (le sfumature dell'allocazione della memoria e di altre risorse del computer vanno oltre lo scopo).
In una colonna GAMMA viene specificato l'intervallo di valori su cui opera il tipo di dati. Ad esempio, un numero come byte può assumere valori da 0 a 255.
E ora pratica. Scriviamo un programma che visualizzi gli intervalli di valori di tutti i tipi di dati interi. Il codice sorgente per questo programma è mostrato di seguito:
Listato 13.1. Programma per la visualizzazione di intervalli di numeri interi. programma td; ($mode objfpc)($H+) usa ($IFDEF UNIX)($IFDEF UseCThreads) cthreads, ($ENDIF)($ENDIF) Classi (è possibile aggiungere unità dopo questo); begin Writeln("Byte: ", Basso(Byte), "..", Alto(Byte)); Writeln("Shortint: ", Low(Shortint), "..", High(Shortint)); Writeln("Smallint: ", Low(Smallint), "..", High(Smallint)); Writeln("Parola: ", Basso(Parola), "..", Alto(Parola)); Writeln("Intero: ", Basso(Intero), "..", Alto(Intero)); Writeln("Cardinale: ", Basso(Cardinale), "..", Alto(Cardinale)); Writeln("Longint: ", Low(Longint), "..", High(Longint)); Writeln("Parola lunga: ", Basso(Parola lunga), "..", Alto(Parola lunga)); Writeln("Int64: ", Basso(Int64), "..", Alto(Int64)); Writeln("Parola Q: ", Basso(Parola Q), "..", Alto(Parola Q)); leggilo; fine.
Funzione standard basso definisce il valore minimo del tipo di dati. funskyia alto definisce il valore massimo. Con caratteristiche ScriviLn e Leggi Ln ne sai già un po'. Parleremo più in dettaglio delle subroutine (procedure e funzioni) nella sezione corrispondente.
Infine, ti dirò come vengono scritti i dati interi nel programma. Sì, proprio come ovunque: scrivi semplicemente il numero, senza virgolette e caratteri aggiuntivi. Ad esempio, così
10
178
35278
È vero, questo si applica ai numeri nel sistema numerico decimale. Probabilmente sai già che ci sono altri sistemi. I più utilizzati sono i sistemi numerici binari, decimali ed esadecimali.
Free Pascal supporta quattro formati interi:
- Notazione decimale. Solo un numero come 10.
- Notazione esadecimale. Numero preceduto da $. Ad esempio, $10 in esadecimale è uguale a 16 in decimale.
- Notazione ottale. Numero preceduto da &. Ad esempio, &10 in ottale è uguale a 8 in decimale.
- Notazione binaria. Numero preceduto da %. Ad esempio, il numero binario %10 è uguale al numero decimale 2.
Compiti a casa:
Creare un programma che visualizzi intervalli di valori interi (Listato 13.1). Compila il programma ed eseguilo. Assicurati che questi valori corrispondano a quelli nella Tabella 13.1.
Nel codice sorgente del programma, trova la riga che imposta la modalità di compilazione:
($modalità objfpc)($H+)
In questa riga, al posto della parola objfpc scrivi una parola tp. Cioè, la riga finale dovrebbe assomigliare a questa:
($modalità tp)($H+)
Esegui il programma. Visualizza l'intervallo di valori di tipo Numero intero. Trai le tue conclusioni.
Impara a pensare come un programmatore, cioè logicamente. Nessuno masticherà tutto per te fino alla pensione, come faccio ora. Devi abituarti a pensare da solo. Altrimenti, cadrai nel "principio scimmia dell'apprendimento" e quindi le tue possibilità di diventare un grande programmatore si avvicineranno a zero. Per aiutarti a non cadere nel livello di "stimolazione", lascerò periodicamente delle lacune nel tuo apprendimento in modo che tu provi a pensare ad alcune cose da solo.
Molto meglio se te ne rendi conto tu stesso decisione sbagliata, tu stesso troverai l'errore e lo correggerai da solo, quindi utilizzerai sempre le soluzioni corrette di altre persone e le copierai stupidamente.
CONFERENZA 2
Nozioni di base di programmazione.
Introduzione a Pasquale. Tipi di dati. Operazioni.
Alfabeto linguisticoPasquale
Qualsiasi linguaggio naturale è costituito da elementi come simboli, parole, frasi, frasi. Anche il linguaggio di programmazione ha elementi simili: simboli, parole, espressioni (frasi), operatori (frasi).
Le parole sono formate da una raccolta di caratteri. Espressioni - sono gruppi di parole e operatori - Queste sono combinazioni di parole ed espressioni. Simboli della lingua - ci sono segni elementari (lettere) che vengono utilizzati per comporre alcuni testi. Quindi, l'insieme di questi caratteri forma l'alfabeto della lingua.
L'alfabeto della lingua Pascal è composto da:
1.lettere maiuscole e minuscole dell'alfabeto latino, che comprende i seguenti caratteri:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - lettere maiuscole;
A b c d e f g h i j k l m n o p q r s t u v w x y z - lettere minuscole;
2. numeri arabi decimali: 0 1 2 3 4 5 6 7 8 9;
3. cifre esadecimali (costituite da cifre decimali e lettere dalla A alla F);
4. 32 lettere maiuscole e minuscole dell'alfabeto russo;
5. caratteri speciali:
Combinazioni di caratteri speciali possono formare caratteri composti:
:= incarico;
< >non uguale;
>= maggiore o uguale;
<= меньше или равно;
Intervallo di valori;
(*) o ( ) - commento.
Struttura di un programma Pascal
Affinché il compilatore Pascal capisca esattamente quali azioni ci si aspetta da esso, il tuo programma deve essere formattato in piena conformità con la sintassi (regole per la costruzione dei programmi) di questo linguaggio.
Qualsiasi programma Pascal può essere costituito dai seguenti blocchi (le parentesi quadre qui e sotto indicano le parti opzionali):
programma<имя_программы>;
[ utilizza<имена_подключаемых_модулей>;]
[ etichetta<список_меток>;]
[ cost<имя_константы> = <значение_константы>;]
[ genere<имя_типа> = <определение_типа>;]
[var<имя_переменной> : <тип_переменной>;]
[procedura<имя_процедуры> <описание_процедуры>;]
[ funzione<имя_функции> <описание_функции>;]
inizio (inizio del corpo principale del programma)
<операторы>
fine. (* fine del corpo del programma principale *)
Le versioni successive dei compilatori Pascal non richiedono più che venga specificato il nome del programma, ovvero il programma di stringa<имя_программы>; può essere omesso. Ma questo è possibile solo se l'intero programma è contenuto in un unico file di modulo. Se il programma è composto da più pezzi indipendenti - moduli, ognuno di essi deve avere un'intestazione (programma o unità).
Qualsiasi delle sezioni opzionali elencate può comparire più di una volta nel testo del programma, anche la loro sequenza generale può cambiare, ma la regola principale del linguaggio Pascal deve essere sempre rispettata: prima di utilizzare un oggetto, deve essere dichiarato e descritto.
I compilatori Pascal non distinguono tra lettere minuscole e maiuscole e gli spazi bianchi vengono ignorati, quindi il testo del programma può essere strutturato in modo tale che sia più comodo leggerlo ed eseguirne il debug.
Direttive del compilatore
La riga che inizia con i simboli ($) non è un commento, ma una direttiva del compilatore - un comando speciale da cui dipende il processo di compilazione ed esecuzione di un programma Considereremo le direttive in quelle sezioni a cui si riferiscono "per significato" .
Ad esempio, la riga ($I-,Q+) disabilita la convalida I/O, ma abilita l'overflow durante il calcolo.
Identificatori
I nomi dati agli oggetti del programma (costanti, tipi, variabili, funzioni e procedure e l'intero programma nel suo insieme) sono chiamati identificatori. Possono essere costituiti solo da numeri, lettere latine e il segno "_" (trattino basso). Tuttavia, un numero non può iniziare un nome. Gli identificatori possono essere di qualsiasi lunghezza, ma se due nomi hanno gli stessi primi 63 caratteri, tali nomi sono considerati identici.
È possibile assegnare agli oggetti programma qualsiasi nome, ma è necessario che differiscano dalle parole riservate utilizzate dal linguaggio Pascal, poiché il compilatore non accetterà comunque variabili con nomi "stranieri".
Ecco un elenco delle parole riservate più comuni:
implementazione dell'array shl
stringa dell'interfaccia del caso
etichetta const allora
utilizza il puntatore di file
procedura lontana var
per programmare mentre
record in avanti con
ripetizione della funzione xor
Variabili e tipi di dati
Una variabile è un oggetto programma il cui valore può cambiare nel corso del programma.
Un tipo di dati è una caratteristica dell'intervallo di valori che possono assumere le variabili di quel tipo di dati.
Tutte le variabili utilizzate nel programma devono essere dichiarate in una speciale sezione var secondo il seguente schema:
var<имя_переменной_1> [, <имя_переменной_2, _>] : <имя_типа_1>;
<имя_переменной_3> [, <имя_переменной_4, _>] : <имя_типа_2>;
Il linguaggio Pascal ha un ampio set di vari tipi di dati, ma per ora ne indicheremo solo alcuni. Parleremo ulteriormente di tutti i tipi di dati.
Costanti
Una costante è un oggetto il cui valore è noto prima dell'avvio del programma.
Le costanti sono necessarie per la progettazione di programmi visivi, sono indispensabili quando si utilizzano valori ripetuti ripetutamente nel testo del programma e sono utili se è necessario modificare questi valori contemporaneamente nell'intero programma.
Ci sono tre tipi di costanti in Pascal:
Costanti senza nome (numeri e numeri, caratteri e stringhe, set);
Costanti non tipizzate denominate;
Costanti digitate con nome.
Costanti senza nome
Le costanti senza nome non hanno nomi e quindi non devono essere dichiarate.
Il tipo di una costante senza nome viene determinato automaticamente, per impostazione predefinita:
Qualsiasi sequenza di cifre (forse preceduta da un segno "-" o "+" o separata da un singolo punto) viene percepita dal compilatore come una costante senza nome: un numero (intero o reale);
Qualsiasi sequenza di caratteri racchiusa tra apostrofi viene trattata come una costante senza nome: una stringa;
Qualsiasi sequenza di numeri interi o caratteri separati da virgole, racchiusa tra parentesi quadre, è percepita come una costante senza nome: un insieme.
Inoltre, esistono due costanti speciali true e false che fanno riferimento al tipo di dati booleano.
Esempi di utilizzo di costanti senza nome sono i seguenti operatori:
reale2:= 12.075 + x;
stringa4:= "abc" + stringa44;
set5:=*set55;
booleano6:=vero;
Costanti non tipizzate
Le costanti con nome, come suggerisce il nome, devono avere un nome. Pertanto, questi nomi devono essere segnalati al compilatore, ovvero descritti in un'apposita sezione const.
Se non si specifica il tipo della costante, dal suo aspetto il compilatore determinerà a quale tipo (base) appartiene. Qualsiasi costante già descritta può essere utilizzata quando si dichiarano altre costanti, variabili e tipi di dati. Ecco alcuni esempi di dichiarazione di costanti denominate non tipizzate:
Costanti tipizzate
Le costanti con nome digitate sono variabili (!) con un valore iniziale già noto all'avvio del programma. Pertanto, in primo luogo, le costanti digitate non possono essere utilizzate per definire altre costanti, tipi di dati e variabili e, in secondo luogo, i loro valori possono essere modificati durante il funzionamento del programma.
Le costanti tipizzate sono descritte secondo il seguente schema:
cost<имя_константы> : <тип_константы> = <начальное_значение>;
Gli esempi seguenti mostrano come farlo:
cost n: intero = -10;
b:booleano=vero;
Daremo esempi di costanti tipizzate di altri tipi mentre studiamo i tipi di dati corrispondenti.
Tipi di dati Pascal
I compilatori Pascal richiedono che le informazioni sulla quantità di memoria richiesta per l'esecuzione di un programma siano fornite prima che il programma possa essere eseguito. Per fare ciò, nella sezione di dichiarazione delle variabili (var), è necessario elencare tutte le variabili utilizzate nel programma. Inoltre, devi anche dire al compilatore quanta memoria occuperà ciascuna di queste variabili.
Tutto questo può essere raccontato al programma semplicemente specificando il tipo della variabile futura. Avendo informazioni sul tipo di una variabile, il compilatore "capisce" quanti byte dovrebbero essere allocati per essa, quali azioni possono essere eseguite con essa e in quali costruzioni può partecipare.
Per comodità dei programmatori nel linguaggio Pascal, ci sono molti tipi di dati standard e, inoltre, la possibilità di creare nuovi tipi di dati basati su quelli esistenti (standard o ancora definiti dal programmatore), che vengono chiamati costruiti.
La suddivisione in tipi di dati di base e costruiti nel linguaggio Pascal è mostrata nella tabella:
Tipi di dati ordinali (discreti). |
Tipi di dati degli indirizzi |
Tipi di dati strutturati |
||||
Tipi di dati aritmetici |
||||||
Tipi di dati di base |
Logico |
Simbolico |
Vero |
Netipizi puntatore fisso | ||
Tipi costruiti |
enumerabile settimana = (su, mo, tu, noi, th, fr, sa); |
Puntatore digitato |
Vettore corda disco Procedurale Oggetto |
|||
Intervallo (intervallo) |
||||||
Tipi di dati costruiti dal programmatore |
Tipi di dati ordinali
I tipi ordinali si distinguono tra i tipi di dati di base. Questo nome può essere giustificato in due modi:
1. Ciascun elemento di un tipo ordinale può essere associato a un numero (ordinale) univoco. La numerazione dei valori parte da zero. L'eccezione sono i tipi di dati shortint, integer e longint. La loro numerazione coincide con i valori degli elementi.
2. Inoltre, su elementi di qualsiasi tipo ordinale, viene definito un ordine (nel senso matematico della parola), che dipende direttamente dalla numerazione. Pertanto, per due elementi qualsiasi di un tipo ordinale, è possibile dire esattamente quale di essi è minore e quale maggiore.
Routine che gestiscono tipi di dati ordinali
Le seguenti funzioni e procedure sono definite solo per valori di tipo ordinale:
1. La funzione ord(x) restituisce il numero ordinale del valore della variabile x (relativo al tipo a cui appartiene la variabile x).
2. La funzione pred(x) restituisce il valore che precede x (non applicabile al primo elemento del tipo).
3. La funzione succ(x) restituisce il valore dopo x (non applicabile all'ultimo elemento del tipo).
4. La procedura inc(x) restituisce il valore dopo x (per i tipi di dati aritmetici, equivale all'operatore x:=x+1).
5.La procedura inc(x,k) restituisce il k-esimo valore dopo x (per i tipi di dati aritmetici, è equivalente all'operatore x:=x+k).
6. La procedura dec(x) restituisce il valore che precede x (per i tipi di dati aritmetici, è equivalente all'operatore x:=x-1).
7. La procedura dec(x,k) restituisce il k-esimo valore che precede x (per i tipi di dati aritmetici, è equivalente all'operatore x:=x-k).
A prima vista, sembra che il risultato dell'applicazione della procedura inc(x) sia esattamente lo stesso del risultato dell'utilizzo della funzione succ(x). Tuttavia, la differenza tra loro appare ai confini dell'intervallo accettabile. La funzione succ(x) non è applicabile all'elemento massimo del tipo, ma la procedura inc(x) non darà alcun errore, ma, agendo secondo le regole dell'addizione macchina, aggiungerà il successivo al numero dell'elemento . Il numero, ovviamente, andrà fuori intervallo e, a causa del troncamento, si trasformerà nel numero del valore minimo dell'intervallo. Si scopre che le procedure inc() e dec() percepiscono qualsiasi tipo ordinale come "chiuso in un anello": subito dopo l'ultimo, torna il primo valore.
Spieghiamo tutto ciò che è stato detto con un esempio. Per tipo di dati
digitare sedici = 0..15;
provando ad aggiungere 1 al numero 15 si otterrà il seguente risultato:
L'unità iniziale verrà tagliata e quindi risulterà che inc(15)=0.
Una situazione simile al limite inferiore dell'intervallo consentito di un tipo di dati ordinale arbitrario si osserva per la procedura dec(x) e la funzione pred(x):
dec(elemento_min)=elemento_max
Tipi di dati ordinali
1. Il tipo logico boolean ha due valori: false e true, e per essi valgono le seguenti uguaglianze:
ord(false)=0, ord(true)=1, false predict(true)=false, succ(false)=true, inc(vero)=falso, inc(falso)=vero, dec(vero)=falso, dec(falso)=vero. 2. Il tipo di carattere char include 256 caratteri ASCII estesi (ad esempio, "a", "b", "i", "7", "#"). Il numero di carattere restituito dalla funzione ord() è lo stesso del numero di quel carattere nella tabella ASCII. 3. I tipi di dati interi sono riepilogati in una tabella: Tipo di dati Numero di byte Gamma 2147483648..2147483647 4. I tipi di dati enumerati sono specificati nella sezione del tipo mediante un'enumerazione esplicita dei loro elementi. Per esempio: tipo settimana =(dom,lun,mar,mer,gio,ven,sab) Ricordiamo che per questo tipo di dati: inc(sab) = dom, dic(dom) = sab. 5. I tipi di dati di intervallo sono impostati solo dai limiti del loro intervallo. Per esempio: digitare mese = 1..12; giorno feriale = lun..ven; 6. I tipi di dati costruiti dal programmatore sono descritti nella sezione del tipo secondo il seguente modello: genere<имя_типа> =
<описание_типа>; Per esempio: digita lat_bukvy = "a".."z","A".."Z"; I tipi di dati di base sono standard, quindi non è necessario descriverli nella sezione dei tipi. Tuttavia, questo può essere fatto anche se lo si desidera, ad esempio fornendo definizioni lunghe nomi brevi. Diciamo introducendo un nuovo tipo di dati digita int = intero; puoi abbreviare un po' il testo del programma. Tipi di dati reali
Ricordiamo che questi tipi di dati sono aritmetici, non ordinali. Tipo di dati Numero di byte Intervallo (valore assoluto) 1.5*10-45..3.4*1038 2.9*10-39..1.7*1038 5.0*10-324..1.7*10308 3.4*10-4932..1.1*104932 Tipi di dati costruiti
Questi tipi di dati (insieme alle operazioni definite per essi) saranno discussi più avanti in diverse lezioni. Operazioni ed espressioni Operazioni aritmetiche
Parliamo di operazioni: azioni standard consentite per variabili dell'uno o dell'altro tipo di dati di base. Le basi saranno operazioni aritmetiche e logiche. Nota: tutte le seguenti operazioni (ad eccezione di "-" unario e non) richiedono due operandi. 1. Le operazioni logiche (e - AND logico, o - OR logico, non - NOT logico, xor - OR esclusivo) sono applicabili solo ai valori booleani. Risultano anche valori booleani. Ecco le tabelle dei valori per queste operazioni: vero falso vero falso falso falso vero falso falso 2. Operazioni di confronto (=,<>, >, <, <=, >=) si applica a tutti i tipi di base. I loro risultati sono anche valori booleani. 3. Le operazioni aritmetiche sugli interi sono applicabili solo ai tipi interi. Il loro risultato è un numero intero il cui tipo dipende dai tipi degli operandi. a div b - divisione intera di a per b (probabilmente non c'è bisogno di ricordare che la divisione per 0 è vietata, quindi l'operazione genera un errore in questi casi). Il risultato sarà di un tipo di dati comune ai tipi a cui appartengono gli operandi. Ad esempio, (shortint div byte = intero). Questo può essere spiegato come segue: intero è il tipo minimo, di cui sia byte che shortint sono sottoinsiemi. a mod b - prendendo il resto quando si divide a per b nel suo insieme. Il tipo del risultato, come nel caso precedente, è determinato dai tipi degli operandi e 0 è un valore proibito per b. A differenza dell'operazione matematica mod, che risulta sempre in un numero non negativo, il segno del risultato dell'operazione di "programmazione" mod è determinato dal segno del suo primo operando. Quindi, se in matematica (-2 mod 5) = 3, allora abbiamo (-2 mod 5) = -2. a shl k - sposta il valore di a per k bit a sinistra (questo equivale a moltiplicare il valore della variabile a per 2k). Il risultato dell'operazione sarà dello stesso tipo dei suoi primi operandi. a shr k - sposta il valore di a per k bit a destra (questo equivale a dividere il valore della variabile a per 2k per 2k). Il risultato dell'operazione sarà dello stesso tipo dei suoi primi operandi. e,o,non,xor - operazioni aritmetiche binarie che funzionano con i bit della rappresentazione binaria di interi, secondo le stesse regole delle loro corrispondenti operazioni logiche. 4. Le operazioni aritmetiche generali (+, -, *, /) sono applicabili a tutti i tipi aritmetici. Il loro risultato appartiene al tipo di dati comune a entrambi gli operandi (l'unica eccezione è l'operazione di divisione frazionaria /, il cui risultato è sempre del tipo di dati reale). Altre operazioni
Esistono altre operazioni specifiche per i valori di alcuni tipi di dati Pascal standard. Queste operazioni saranno discusse nelle sezioni pertinenti: #, in, +, *, : vedi lezione 5 “Simboli. Stringhe. Imposta" @, ^ : vedi Lezione 7 "Indirizzi e indicazioni" Funzioni aritmetiche standard
Le funzioni aritmetiche standard sono anche adiacenti alle operazioni aritmetiche. Il loro elenco con una breve descrizione è riportato nella tabella. Funzione Descrizione Tipo di argomento Tipo di risultato Valore assoluto (modulo) di un numero Aritmetica Corrisponde al tipo di argomento Arcotangente (in radianti) Aritmetica Vero Coseno (in radianti) Aritmetica Vero Espositore (ex) Aritmetica Vero Prendere la parte frazionaria di un numero Aritmetica Vero Prendendo la parte intera di un numero Aritmetica Vero Logaritmo naturale (base e) Aritmetica Vero Controllo del numero dispari Valore numerico Vero Arrotondamento al numero intero più vicino Aritmetica Arrotondamento "per difetto" - all'intero più piccolo più vicino Aritmetica Seno (in radianti) Aritmetica Vero Squadratura Aritmetica Vero Estrazione della radice quadrata Aritmetica Vero Espressioni aritmetiche
Tutte le operazioni aritmetiche possono essere combinate tra loro, ovviamente tenendo conto dei tipi di dati consentiti per i loro operandi. Gli operandi di qualsiasi operazione possono essere variabili, costanti, chiamate di funzione o espressioni costruite sulla base di altre operazioni. Tutti insieme è chiamato un'espressione. Esempi di espressioni aritmetiche: (X<0) and (y>0) - un'espressione il cui risultato è di tipo booleano; z shl abs(k) - il secondo operando è una chiamata di funzione standard; (x mod k) + min(a,b) + trunc(z) - combinazione di operazioni aritmetiche e chiamate di funzioni; dispari(round(x/abs(x))) - espressione "a più piani". Ordine di calcolo
Se le parentesi vengono inserite nell'espressione, i calcoli vengono eseguiti nell'ordine: minore è la profondità di annidamento delle parentesi, più tardi viene calcolata l'operazione racchiusa in esse. Se non ci sono parentesi, vengono calcolati prima i valori delle operazioni con una priorità più alta, quindi quelle con una priorità più bassa. Più operazioni consecutive della stessa priorità vengono calcolate in sequenza "da sinistra a destra". Tabella 2.1. Priorità (per tutte) Operazioni Pascal