Anteprima
Vedrai una selezione di 8 pagine su 34
Programmazione C Pag. 1 Programmazione C Pag. 2
Anteprima di 8 pagg. su 34.
Scarica il documento per vederlo tutto.
Programmazione C Pag. 6
Anteprima di 8 pagg. su 34.
Scarica il documento per vederlo tutto.
Programmazione C Pag. 11
Anteprima di 8 pagg. su 34.
Scarica il documento per vederlo tutto.
Programmazione C Pag. 16
Anteprima di 8 pagg. su 34.
Scarica il documento per vederlo tutto.
Programmazione C Pag. 21
Anteprima di 8 pagg. su 34.
Scarica il documento per vederlo tutto.
Programmazione C Pag. 26
Anteprima di 8 pagg. su 34.
Scarica il documento per vederlo tutto.
Programmazione C Pag. 31
1 su 34
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

5. ORGANIZZARE UN PROGRAMMA C

Visti gli elementi principali che costituiscono un programma C, è il momento di sviluppare una strategia per la loro disposizione.

  1. Direttive #include
  2. Direttive #define
  3. Definizioni di tipo
  4. Dichiarazioni di variabili esterne
  5. Prototipi delle funzioni
  6. Definizione del main
  7. 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
Dettagli
A.A. 2021-2022
34 pagine
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher edoCappelletti99 di informazioni apprese con la frequenza delle lezioni di Fondamenti di Informatica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Politecnico di Milano o del prof Negri Mauro.