Il 0% ha trovato utile questo documento (0 voti)
105 visualizzazioni

Programmare

Il documento descrive come creare un programma in C++ utilizzando tipi di dati semplici e strutturati. Vengono introdotti tipi di dati come interi, float, stringhe e booleani e viene spiegato come dichiarare e utilizzare variabili, array e operatori.
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
105 visualizzazioni

Programmare

Il documento descrive come creare un programma in C++ utilizzando tipi di dati semplici e strutturati. Vengono introdotti tipi di dati come interi, float, stringhe e booleani e viene spiegato come dichiarare e utilizzare variabili, array e operatori.
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 16

Fare un programma con tipi semplici

Bisogna risolvere il problema in generale e non una particolare istanza.


1
Usare le librerie attraverso il comando #include <…> e using namespace std;
- iostream (input output stream: flusso di ingresso e uscita)
2
Inserire i dati (di ingresso e di uscita) su cui si deve operare.
Ad ogni entità che viene introdotta all’interno del programma viene assegnato un tipo e un nome.
<tipo> nome_variabile
Il tipo può essere:
- int (32 bit) per numeri interi o naturali
- float (32 bit) per numeri in virgola mobile
- double (64 bit) per numeri in virgola mobile
- char (8 bit) per un carattere ASCII
- bool (2 bit) per esprimere un valore booleano, vero 1 o falso 0
Si utilizza const se il valore espresso non deve essere modificato durante il programma.
Il nome è scelto dal programmatore e può essere formato da una qualunque sequenza di lettere (maiuscole o
minuscole) e di cifre numeriche, senza altri caratteri o spazi bianchi a parte l’underscore _.
3

Istruzione di input
cin >> variabile

Istruzione di output
cout << espressione
Se l’espressione è una frase, essa si inserisce tra i doppi apici: cout << “espressione”;
Se l’espressione è una variabile, essa si inserisce singolarmente: cout << espressione;

// e /* */ per fare un commento che non viene considerato.


Alla fine di ogni istruzione c’è bisogno di un punto e virgola ;
Per indicare un blocco di istruzioni si usano le parentesi graffe {}
endl (endline) e \n per far andare a capo l’operatore
(tipo)dato CONVERSIONE DI TIPO (CASTING) viene valutato e viene convertito il valore della variabile.
Tra parentesi tonde viene indicato il tipo a cui la variabile deve essere convertita.
sizeof(tipo) restituisce il numero di byte usati per un tipo.
Dice su quanti byte è memorizzato il tipo, cioè quanto spazio in memoria sta occupando il dato di quel tipo.
typedef (tipo) (nome) per rendere il programma più generale e flessibile.
Operazioni applicabili al tipo intero e al tipo reale
Operatori aritmetici Operatori relazionali
Addizione A+B Uguale A==B
Sottrazione A-B Diverso A!=B
Moltiplicazione A*B Maggiore A>B
Divisione A/B Minore A<B
Modulo A%B Maggiore o uguale A>=B
Assegnazione A=B Minore o uguale A<=B

ATTENZIONE!
A = B ASSEGNAZIONE
Si assegna ad A il valore di B: nel valore di A viene copiato il valore di B.
A = = B OPERATORE RELAZIONALE DI CONFRONTO
Non si modifica né A né B: si confrontano i due valori.
Il risultato dell’espressione relazionale logica è:
- vero se A e B sono uguali
- falso se A e B sono diversi

Operazioni applicabili al tipo carattere


Sul tipo carattere è definito un ordinamento.
Operatori relazionali
Uguale A==B
Diverso A!=B
Maggiore A>B
Minore A<B
Maggiore o uguale A>=B
Minore o uguale A<=B

Operazioni applicabili al tipo booleano


La congiunzione AND &&
La disgiunzione OR ||
La negazione NOT !

Operatori di incremento e di decremento (operatori unari, con un solo operando)


i=i+1 i++ Notazione postfissa
i=i+1 ++i Notazione prefissa
i=i-1 i-- Notazione postfissa
i=i–1 --i Notazione prefissa

Operatori di assegnazione composta


A = A <op> B diventa A <op> = B
Programmazione strutturata
Istruzione di selezione IF THEN
Permette di decidere quale azione eseguire tra varie alternative.

Viene valutata una condizione espressa da un’espressione logica.


Il risultato della valutazione è un valore dell’insieme booleano:
- se è vero, si entra nel costrutto (THEN)
- se è falso, non vengono eseguite le istruzioni del blocco

Istruzione di selezione IF THEN ELSE


Fornisce un’azione alternativa se la condizione dell’if non è vera.

Viene valutata una condizione espressa da un’espressione logica.


Il risultato della valutazione è un valore dell’insieme booleano:
- se è vero, si eseguono determinate istruzioni (THEN)
- se è falso, vengono eseguite altre istruzioni (ELSE)

Nesting degli IF THEN ELSE


La parte THEN e la parte ELSE possono a loro volta contenere delle istruzioni di selezione.
Struttura di selezione a più vie SWITCH CASE
Consente di implementare una selezione a più vie.

Il costrutto valuta la condizione intera passata a SWITCH.


Poi, rimanda lo svolgimento del programma al
blocco in cui il parametro di CASE ha lo stesso
valore di quello dell’istruzione SWITCH.
Se il blocco termina con break; allora il programma
esce dallo SWITCH, altrimenti vengono eseguiti anche
i blocchi seguenti fino ad un break o fino alla fine.
Il break forza l’uscita dal costrutto: consente di
interrompere il flusso di esecuzione all’interno
del costrutto per far tornare il flusso di esecuzione
al livello superiore.

Se nessun blocco corrisponde ad un valore uguale


a quello dell’istruzione dello SWITCH,
viene eseguito il blocco in default.

Ciclo a conteggio FOR


Il ciclo FOR opera con una iterazione della sequenza che continua per un numero di volte predeterminato.

inizializzazione c è il contatore che deve essere inizializzato


(deve essere specificato il numero di cicli che deve essere fatto):
si conta dal valore iniziale vi al valore finale vf.
condizione Il FOR è un ciclo a condizione iniziale.
Si controlla di non avere già eseguito il numero di iterazioni
richieste (si controlla che il contatore non sia già maggiore del
valore finale; se lo è, si esce dal costrutto altrimenti la sequenza
viene ripetuta). Quindi, la sequenza del blocco viene eseguita
solo se il valore del contatore è minore del valore finale.
variazioni dopo aver eseguito la sequenza, il contatore viene
modificato (viene incrementato o decrementato) e, a seconda
della condizione, se rispettata, la sequenza viene ripetuta.
Ciclo a condizione iniziale WHILE
Il ciclo WHILE esegue un blocco di istruzioni fin quando la condizione risulta vera.

Inizialmente, viene valutata la condizione R:


- se risulta falsa, la sequenza S non viene eseguita
- se risulta vera, la sequenza S viene eseguita
Al termine dell’esecuzione del blocco, si rivaluta la condizione.
Non si sa a priori quante iterazioni verranno fatte.

Ciclo a condizione finale DO WHILE


Il ciclo DO WHILE esegue un blocco di istruzioni
almeno una volta per poi valutare la condizione.

Viene prima eseguita la sequenza.


Sicuramente la sequenza viene eseguita almeno una volta.
Dopo aver eseguito la sequenza, si controlla la condizione:
- se risulta falsa, la sequenza S non viene eseguita
- se risulta vera, la sequenza S viene nuovamente eseguita
Fare un programma con tipi strutturati
Array
Operazioni
Dichiarazione di array
<tipo> nome_array [dimensione] per VETTORE
<tipo> nome_array [dimensione][dimensione] per MATRICE
Ci sono tante coppie di parentesi quadre quante sono le dimensioni.
Inizializzazione di array
<tipo> nome_array [dimensione] = {…, …}
<tipo> nome_array [dimensione][dimensione] = {…, …}
(gli elementi della matrice si inseriscono riga dopo riga)

Per le operazioni sugli elementi degli array si utilizzano gli indici.


Si hanno tanti indici quante sono le dimensioni dell’array (i per i vettori, i e j per le matrici).
Gli indici indicano la posizione dell’elemento nell’array perché la funzione d’accesso è per posizione.
Gli operatori di flusso di ingresso e di uscita possono essere utilizzati solo sui singoli elementi.
Ingresso
cin >> vettore[i]
cin >> matrice[i][j]
Uscita
cout << vettore[i]
cout << matrice[i][j]
Scansione di array

Vettore

Matrice
Stringhe
La stringa è una sequenza di caratteri dotata di tappo (termina con il carattere speciale \0).
Usare le librerie attraverso il comando #include <…> e using namespace std;
- cstring (libreria che fornisce le funzioni per lavorare sulle stringhe)

In libreria si hanno a disposizione gli operatori di ingresso e di uscita del tipo strutturato della stringa.
L’operatore di flusso può lavorare sulla stringa ma ha due limiti fondamentali:
- considera il blank (spazio) come fine della stringa
- non può controllare se la dimensione della stringa immessa supera il limite massimo consentito
Quindi si utilizza la funzione di libreria cin.getline (stringa, dimensione massima) che:
- consente di inserire una stringa contenente il blank (spazio)
- consente di controllare l’ingresso limitandolo al numero massimo di caratteri possibile
se vengono introdotti più caratteri di quelli possibili, la stringa viene interrotta

Operazioni
- strcmp (stringa, stringa): confronta due stringhe
viene fatto il confronto in maniera lessicografica

- strcpy (stringa che si vuole modificare, stringa che viene copiata): copia due stringhe
la stringa di sinistra contiene la copia (destinazione), la stringa di destra viene copiata (origine)
questa funzione non controlla se la stringa riesce a contenere la copia

- strlen (stringa): restituisce la lunghezza della stringa escluso il terminatore


tra parentesi si inserisce la stringa di cui si vuole conoscere la dimensione

- strcat (stringa concatenata, stringa che viene unita): concatena due stringhe
tra parentesi vengono inserite le due stringhe che devono essere concatenate
la stringa concatenata viene copiata nella stringa di sinistra
questa funzione non controlla se la stringa riesce a contenere la stringa concatenata

Record
I record sono implementati mediante il costrutto STRUCT.

Gli elementi del record si chiamano campi; ogni campo deve essere univocamente identificato con un nome.
La funzione d’accesso è per nome e richiede due operandi:
- a sinistra del punto, deve esserci il nome del record di cui si vuole richiamare il campo
- a destra del punto, deve esserci il nome del campo a cui si vuole accedere
Sottoprogrammi
Per gestire un problema complesso, bisogna ridurne la complessità dividendolo in problemi.
Bisogna prima capire quali problemi dipendono da altri per risolverli nel giusto ordine.
1
Dichiarazione della funzione: prototipo nel file di libreria (file.h)
- il tipo del valore ritornato
- nome della funzione
- il numero e il tipo dei parametri formali (i nomi non sono necessari)
Si mette & se lo scambio dei parametri è per indirizzo (si lavora nell’area di memoria del chiamante)
Si può usare const che trasforma una variabile in una costante in modo che non venga modificata

2
Implementazione della funzione nel sottoprogramma (file.cpp)
- INTESTAZIONE (INTERFACCIA)
- Tipo del risultato (funzioni) o void se non c’è risultato (procedure)
- Nome della funzione
- Lista parametri formali (informazioni generali) o void se non ci sono parametri
- BLOCCO
- Delimitato da parentesi graffe {}
- Dichiarazione di variabili e istruzioni che devono essere eseguite
- return (<espressione>) solo se la funzione ritorna un risultato (non serve nel caso di void)

3
I sottoprogrammi sono sezioni di codice che vengono eseguiti dopo essere stati chiamati.
Il sottoprogramma può essere chiamato sia dal programma principale sia da un altro sottoprogramma.
Istruzione di chiamata al sottoprogramma
Usare le file.h attraverso il comando #include “…” e using namespace std;
Chiamare il sottoprogramma
Si chiama il sottoprogramma con un’istruzione semplice.
Una chiamata di funzione è costituita dal nome della funzione e dalla lista dei parametri effettivi
(informazioni specifiche al programma che si sta eseguendo separate da virgola).
File
FILE DI TIPO TESTO
1
Definizione di variabili
Usare le librerie attraverso il comando #include <…> e using namespace std;
- fstream (libreria che fornisce le funzioni per lavorare sui file)
ifstream in_file per file in lettura (input file)
ofstream out_file per file in scrittura (output file)
2
Apertura dei file
variabilefile.open (“nome del file”) apre di default un file testo in lettura o in scrittura
La funzione open invocata su uno stream di tipo:
- ifstream, fallisce se il file specificato non esiste
- ofstream
- crea il file specificato se il file non esiste
- cancella il contenuto del file se è già esistente
Per evitare che il contenuto di un file venga cancellato, si usa open(“nomefile”, ios::app)
Questa istruzione consente di scrivere appendendo il nuovo contenuto a quello già esistente
3
Un file può essere letto o scritto come uno stream tramite gli operatori << e >>
Lettura
in_file>>x;
Scrittura
out_file<<x;
4
Chiusura dei file
file.close ()
5
Controllo fine file
!file.eof()
Schemi algoritmici
Acquisizione di una lista

Scansione di una lista

Operazione associativa su una lista (accumulatore)

Somma degli elementi dell’array

Ricerca del minimo tra gli elementi dell’array


Ricerca incerta su una lista

Ricerca di un elemento pari a x


Compattamento di un array

Scompattamento di un array
eliminazione di un elemento fornito dall’utente con sottoprogramma che
- fa una ricerca incerta per trovare la posizione dell’elemento
- se trova l’elemento, sfruttando la posizione dell’elemento, lo elimina dal vettore
Inversione

Concatenamento
Bubblesort
Acquisizione di una lista con informazione tappo

Scansione di una lista con informazione tappo

Operazione associativa su una lista (accumulatore)


Somma degli elementi dell’array

Ricerca del minimo tra gli elementi dell’array

Potrebbero piacerti anche