Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
5. ORGANIZZARE UN PROGRAMMA C
Visti gli elementi principali che costituiscono un programma C, è il momento di sviluppare una strategia per la loro disposizione.
- Direttive #include
- Direttive #define
- Definizioni di tipo
- Dichiarazioni di variabili esterne
- Prototipi delle funzioni
- Definizione del main
- Definizione delle altre funzioni
È buona norma far precedere ogni definizione di funzione da un commento che fornisca il nome della funzione stessa, ne spieghi lo scopo ed elenchi il significato di ogni suo parametro, descriva il valore restituito (se presente) ed elenchi tutti gli effetti secondari (come le modifiche alle variabili esterne).
11. PUNTATORI
Nei computer la memoria è suddivisa in byte, ognuno dei quali è in grado di memorizzare otto bit di informazione. Ogni byte possiede un indirizzo univoco che lo distingue dagli altri presenti in memoria. Se ci sono n byte, possiamo pensare che gli indirizzi vadano da 0 a n-1. Un programma eseguibile è costituito dal...
codice (le istruzioni macchina) e dai dati (variabili del programma originale). Ogni variabile presente nel programma occupa uno o più byte della memoria. L'indirizzo del suo primo byte viene considerato l'indirizzo della variabile stessa. Sebbene gli indirizzi siano rappresentati da numeri, il loro intervallo di valori può differire da quello degli interi, di conseguenza non possiamo salvarli nelle variabili ordinarie. Possiamo rappresentarli all'interno di variabili speciali, dette variabili puntatori. Quando memorizziamo l'indirizzo di una variabile in una variabile puntatore diciamo che punta ai p p i. Un puntatore non è altro che un indirizzo, e una variabile puntatore è una variabile che può memorizzare quell'indirizzo. 1. DICHIARARE UNA VARIABILE PUNTATORE Una variabile puntatore viene dichiarata praticamente allo stesso modo in cui viene dichiarata una variabile normale. L'unica differenza è che il nome deve essere preceduto dal tag*
.essere preceduto da un *int *p;
Stabilisce che è una variabile puntatore in grado di puntare a oggetti di tipo int
.
L'OPERATORE INDIRIZZO E L'OPERATORE ASTERISCO
Il C fornisce una coppia di operatori che sono pensati per l'utilizzo con i puntatori.
- Per trovare l'indirizzo di una variabile useremo l'operatore
&
. Se è una variabile, allora è il suo indirizzo di memoria.x &x
- Per guadagnare accesso all'oggetto puntato da un puntatore useremo l'operatore
*
. Se è un puntatore, allora rappresenta l'oggetto al quale sta puntando.p *p p2
L'operatore indirizzo
Dichiarare una variabile puntatore prepara lo spazio per un puntatore ma non la fa puntare ad alcun oggetto. Bisogna quindi provvedere all'inizializzazione della variabile prima di usarla. pint i,*p;p=&i;
L'operatore asterisco
Una volta che una variabile punta a un oggetto, possiamo usare l'operatore *
per accedere all'oggetto puntato.
per accedere aquello che è il contenuto dell'oggetto stesso. 111. PUNTATORIFino a quando punta a è un alias per Questo significa che non ha solamente lop i, *p i. *pstesso valore di ma che cambiando il valore di si modica anche il valore dii, *p i.p=&i; p ? ii=1; p 1 iprintf('i = %d', i); //stampa i=1printf('%d', *p); //stampa 1*p=2; p 2 iprintf('i = %d', i); //stampa i=2printf('%d', *p); //stampa 23. PUNTATORI USATI COME ARGOMENTINell'utilizzo delle funzioni, abbiamo visto che una variabile passata come argomento nellachiamata viene protetta da ogni modifica, perché il C passa gli argomenti per valore. Sevolessimo modificare una variabile, invece di passare la variabile x come argomento dellafunzione, passeremo &x, ovvero un puntatore a x. Dichiareremo come puntatore il parametro p.Quando la funzione verrà invocata, p avrà il valore &x, e quindi *p (l'oggetto al quale
punta p) sarà un alias per x. Questo permetterà alla funzione sia di leggere che modificare x.
Esempio: trovare il massimo e il minimo in un vettore
Void max_min (int a[], int n, int *max, int *min);
int main(){
int b[N], i, big, small;
printf("Inserisci %d numeri: ", N);
for(i=0; i<N; i++)
scanf("%d", &b[i]);
max_min(b, N, &big, &small);
printf("Massimo: %d", big);
printf("Minimo: %d", small);
}
void max_min (int a[], int n, int *max, int *min) {
int i;
*max=*min=a[0];
for(i=1; i<n; i++){
if(a[i]>*max)
*max=a[i];
else if (a[i]<*min)
*min=a[i];
}
}
Quando trova l'elemento più grande presente in lo salva nella variabile grazie a max_min(b, big) un assegnamento a (*max punta a big). Allo stesso modo punta a *min small.
213. STRINGHE
1. STRINGHE COSTANTI
Una stringa costante o letterale è una sequenza di caratteri racchiusa tra doppi apici "“".
1.1. Come vengono memorizzate
Sostanzialmente il C tratta
Le stringhe letterali come vettori di caratteri. Quando il compilatore C in un programma incontra una stringa letterale di lunghezza n, questo alloca per la stringa n+1 byte di memoria. Quest'area di memoria conterrà i caratteri della stringa con l'aggiunta del carattere null (\0) per segnare la fine della stringa. Ex: la stringa letterale "abc" viene memorizzata come un vettore di quattro caratteri (a,b,c,\0) Dato che la stringa letterale viene memorizzata come un vettore, il compilatore la tratta come un puntatore di tipo char *. Ex. Quando la viene invocata, le viene passato l'indirizzo di ove printf("abc");. printf "abc", un puntatore alla locazione di memoria che contiene la lettera a.
1.2. Stringhe letterali e costanti carattere a confronto. Una stringa letterale contenente un singolo carattere non è uguale a una costante carattere. La stringa letterale è rappresentata da un puntatore alla locazione di memoria che
contiene“a”il carattere (seguito dal carattere null). La costante carattere è rappresentata da un interoa ‘a’(il codice numerico del carattere nella tabella ASCII).
2. VARIABILI STRINGA
Un vettore unidimensionale di caratteri può essere utilizzato per memorizzare una stringa a patto che questa termini con il carattere null.
Per determinare la lunghezza di una stringa non c’è un metodo più rapido che quello di controllare ogni carattere in modo da trovare \0.
Quando dichiariamo un vettore di caratteri che verrà utilizzato per contenere una stringa, dobbiamo far sì che il vettore sia più lungo di un carattere rispetto alla stringa che deve contenere, in modo da non sfondare il vettore con l’inserimento del carattere null.
Diciamo che abbiamo bisogno di una variabile che sia capace di contenere una stringa lunga fino a 80 caratteri. Dato che la stringa deve terminare con il carattere null, dichiareremo la
variabile come un vettore di 81 caratteri:
#define STR_LEN 80 //per enfatizzare il fatto che la str non può contenere più di 80 caratteri…
char str[STR_LEN +1];
Dichiarare un vettore di caratteri in modo che abbia una lunghezza pari a non significa STR_LEN+1 che questo conterrà sempre una stringa di caratteri. La lunghezza di una stringa dipende STR_LEN dalla posizione del carattere di termine e non dalla lunghezza del vettore nel quale è contenuta.
113. STRINGHE
3. SCRIVERE UNA STRINGA
3.1. printf
La specifica di conversione permette alla funzione di scrivere una stringa. La %s
printf printf scrive i caratteri di una stringa uno alla volta, fino a quando non incontra il carattere null.
printf(“&s”, str); //stampa la stringa “str”
printf(“%.ps”, str); //stampa i primi p caratteri della stringa “str”
printf(“%ms”, str); //stampa la stringa “str” in un campo di dimensione m
3.2. puts
La libreria C
4. LEGGERE UNA STRINGA
4.1. scanf
La specifica di conversione permette alla scanf di leggere una stringa e di memorizzarla%s all'interno di un vettore di caratteri.
scanf("%s", str); //non è necessario l'operatore &, in quanto è come un puntatore
Quando viene invocata, la scanf salta gli spazi bianchi e successivamente legge tutti i caratteri salvandoli in str fino a quando non incontra un carattere che rappresenta uno spazio bianco. Per questo, la scanf non leggerà mai un'intera riga di input, in quanto i caratteri bianchi come new-line, spazio e tabulazione interrompono la lettura.
4.2. gets
Anche la funzione gets legge i caratteri di input, li immagazzina in un vettore e alla fine aggiunge un carattere null.
A differenza della scanf, gets non salta gli spazi bianchi che precedono l'inizio della stringa e legge fino quando non viene inserito un carattere new-line.
5. ACCEDERE AI CARATTERI DI UNA
Considerato il fatto che le stringhe vengono memorizzate come dei vettori, possiamo utilizzare l'indicizzazione per accedere ai caratteri contenuti all'interno di queste ultime.
Es. contare il numero di spazi presenti in una stringa
int count_spaces(const char *s) {
int count = 0;
for(int i = 0; s[i] != '\0'; i++) {
if(s[i] == ' ') {
count++;
}
}
return count;
}
6. STRINGHE
6.1. FUNZIONI
La libreria del C fornisce un ricco insieme di funzioni adatte a eseguire operazioni sulle stringhe.
I prototipi di queste funzioni risiedono nell'header <string.h>.
6.1.1. strcpy
strcpy(str2, str1) //copia la stringa str1 in str2
6.1.2. strlen
La funzione strlen restituisce la lunghezza della stringa "str1", ovvero il numero di caratteri presenti in str1 fino al carattere terminatore (quest'ultimo escluso).
int len = strlen(str1);
strlen("abc") // len=3. (string concatenation)strcatLa aggiunge il contenuto della stringa alla fine della stringastrcat str2 str1.strcpy(str1, "abc"); //"abc" copiata all'interno della stringa str1strcpy(str2, "def"); //"def" copiata all'interno della stringa str2strcat(str1, str2); //adesso str1 contiene "abcdef"6.4. (string comparison)strcmpLa confronta le due stringhe e restituendo un valore minore, uguale ostrcmp str1 str2maggiore a 0 a seconda che sia minore, uguale o maggiore di