Anteprima
Vedrai una selezione di 13 pagine su 60
Informatica e laboratorio di programmazione I 1 Pag. 1 Informatica e laboratorio di programmazione I 1 Pag. 2
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 6
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 11
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 16
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 21
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 26
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 31
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 36
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 41
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 46
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 51
Anteprima di 13 pagg. su 60.
Scarica il documento per vederlo tutto.
Informatica e laboratorio di programmazione I 1 Pag. 56
1 su 60
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

Formattazione del testo

FAILURE)e x i t (EXIT}free (p) // v i e n e l i b e r a t a q u e l l ’ a r e a// d i memoria27 →void *calloc(”numero elementi”,”dimensione elementi”) questafunzione è come la malloc(), ma inizializza tutto l’array con degli zeri.void *realloc(”puntatore dell’area di memoria già allocata”,”nuova→dimensione”) con questa funzione si può variare la dimensione diun array già allocato: se viene aumentata la dimensione ciò che eragià dentro all’array rimane invariato, mentre se si riduce la dimensionevengono eliminati gli ultimi elementi. La funzione restituisce NULLse non riesce ad eseguire l’operazione.→(con int *a=NULL viene allocata la memoria per 1 intero) tvoid *memcpy (void *destination, const void *source, size→num); destination: array di destinazione dove copiare ilcontenuto; source: puntatore al dato da copiare; num: numerodi byte da copiare.Questa funzione permette

appunto di copiare un’area di memoria in un’altra.

5.14.1 Aree di memoria→STACK area di memoria temporanea, qui ci vanno le variabili a durata temporanea, ovvero le variabili delle funzioni, dei blocchi di codice, etc...→ Questa memoria ha una dimensione predefinita e si ha un ERRORE stack overflow quando si finisce quell’area di memoria.→HEAP area di memoria utilizzata per l’allocazione dinamica, quest’area dipende dalla memoria fisica del computer.→DATA area di memoria per variabili globali, costanti e codice.

5.14.2 Errori →BUFFER OVERRUN si ha quando si prova ad accedere ad un’area di memoria fuori dall’array, oppure quando si prova a scrivere all’indirizzo di un puntatore che non è stato inizializzato.→MEMORY LEAK allocando dinamicamente la memoria ci si può accedere soltanto tramite il puntatore, quindi quando si perde questo puntatore quell’area di memoria rimane riservata, senza però poterci più accedere.

→LINGERING POINTER si ha quando si fa riferimento ad un puntatore che punta ad un'area di memoria non più allocata.

295.15 Stringhe

Una stringa è di fatto un array di char che viene terminato dal carattere nullo '\0'.

Quando vengono utilizzate le doppie virgolette ” ”, viene incluso anche il carattere nullo:

char stringa[4] = ” ciao ”;
char stringa2[] = ” ciao parte due ”;
char noStringa[] = ’ c’, ’i’, ’a’, ’o’;
char stringaStandoLarghi[100] = ” pippo ”;

Quando si legge una stringa con scanf(”%s”, str), la lettura termina alla prima spaziatura; per evitare ciò si usa scanf(”%[^\n]”, str), che permette di leggere tutto sino al carattere 'a capo'.

Per la gestione delle stringhe si utilizza la libreria ”string.h”, che fornisce diverse funzioni utili.

Figura 7:

Funzioni string.h

strlen(str)

Questa funzione restituisce il numero di caratteri della stringa, meno il carattere di terminazione.

strcmp(str1,str2)

Questa funzione confronta due stringhe: restituisce 0 se le stringhe sono uguali (fa la differenza tra carattere per carattere); restituisce un numero positivo o negativo, a seconda di come i caratteri sono in ordine nella tabella ASCII, se invece le due stringhe sono diverse.

strcpy(str2,str1)

→str2 'destinazione': deve essere almeno un array di char.

→str1 'sorgente': deve essere una stringa.

Questa funzione copia la stringa sorgente (str1) nella destinazione (str2).

strcat(str2,str1)

→str2 'destinazione': deve essere una stringa.

→str1 'sorgente': deve essere una stringa.

Questa funzione concatena le due stringhe: accoda il contenuto della sorgente (str1) a quello della destinazione (str2), quindi la destinazione deve essere larga abbastanza da contenere

Anche il contenuto della sorgente.

5.15.5 strncpy(str2,str1,int)

Questa funzione esegue la stessa cosa di strcpy(), ma con l'intero viene limitato il numero di caratteri che vengono copiati; se però la stringa da copiare è più lunga, il carattere di terminazione NON viene copiato.

La si può usare per passare la dimensione dell'array di destinazione ed evitare un buffer overrun.

5.15.6 strchr(str,char)

Questa funzione cerca nella stringa il carattere desiderato, fermandosi al primo che trova. La funzione restituisce l'indirizzo in memoria di dove si trova il carattere, mentre restituisce NULL se non lo trova.

(char *p) printf("%ld",p-str(indice dell'array))

5.15.7 strrchr(str,char)

Questa funzione esegue la stessa cosa della funzione precedente, ma partendo dalla fine.

5.15.8 strstr(str,"stringa")

Questa funzione cerca una sottostringa; restituisce il puntatore alla sottostringa, se non la trova restituisce NULL.

5.15.9 Esempi

Per cercare tutti

gli spazi in una stringa:
p=s t r c h r ( s t r , ’ ’ ) ;
w h i l e ( p!=NULL){
    printf ( . . . ) ;
    p=s t r c h r ( p +1 , ’ ’); // q u e s t o perche ’ p punta
}
// g i a ’ ad uno s p a z i o

Oppure anche cosı̀:
f o r ( p=s t r c h r ( s t r , ’ ’ ) ; p!=NULL;++p ){
    printf ( . . . ) ;
}
32

Per avere un array di stringhe bisogna utilizzare un array bidimen-sionale:
// nuovi e l e m e n t i a r r a y d i s t r i n g h e ,
// uso d i una s o l a d i m e n s i o n e i n a r r a y
// b i d i m e n s i o n a l e
#include <s t d i o . h>
#include <s t d l i b . h>

i n t main ( i n t argc , char argv ){
    cha r s s [ 5 ] [ 1 0 0 ] = ;
    int i ;
    f o r ( i =0; i < 5 ; ++i ){
        p r i n t f ( ” I n s e r i s c i una p a r o l a : ” ) ;
        s c a n f (”% s ” , s s [ i ] ) ;
    }
    f o r ( i =0; i < 5 ; ++i ){
        p r i n t f ( ” s s [%d ] = ’%s ’ n ” , i , s s [ i ] ) ;
    }
    return 0;
}
5.16 I

parametri della main

int main(int argc , char **argv)

Questi argomenti vengono presi dalla riga di comando all'avvio del programma.

Il primo argomento indica quante "parole" ci sono nella riga di comando (separate da uno o più spazi), il secondo argomento è invece un array di stringhe che contiene le "parole" inserite nella riga di comando.

335.17 Funzioni

Una funzione è un insieme di istruzioni del linguaggio che permette di aggiungere operazioni più complesse di quelle fornite dal linguaggio stesso.

Le funzioni si utilizzano per: la fattorizzazione, ovvero una funzione può essere definita una sola volta, ma utilizzata quanto si vuole; la facilità di modifica, se c'è bisogno di modificare una cosa basta farlo una sola volta; una maggiore leggibilità, vengono isolati i dettagli del codice potendo capire prima e meglio il funzionamento del programma senza dover entrare nello specifico.

Il C mette a disposizione già numerose funzioni, che per

Per poter utilizzare le librerie, bisogna includere le loro rispettive librerie (tramite #include):

  • stdlib.h: I/O
  • string.h: funzioni per le stringhe
  • math.h: funzioni matematiche
  • time.h: funzioni per la gestione del tempo
  • ctype.h: funzioni per la gestione dei caratteri

Per definire una funzione si usa la seguente struttura:

tipo_di_ritorno nome_funzione(lista_argomenti);

La funzione viene poi richiamata con:

nome_funzione(lista_argomenti);

Le funzioni possono restituire direttamente un solo valore (tramite l'istruzione return). Se c'è bisogno di restituire più valori, bisogna utilizzare gli argomenti.

Gli argomenti di una funzione consentono il passaggio dei dati alla funzione stessa.

Gli argomenti possono essere passati in due modi differenti: passaggio per valore e passaggio per indirizzo.

Nel passaggio per valore viene creata una copia di ciò che viene passato alla funzione, quindi la funzione lavora su queste copie senza modificare il dato originale.

Nel passaggio per indirizzo invece viene...

passato l'indirizzo in me-moria della variabile (questo è di default per gli array) permettendo dunque anche alla funzione stessa di modificare quel dato in modo permanente. Questo tipo di passaggio permette anche di ottimizzare il passaggio di dati "pesanti" (tipo le struct).

5.17.1 Ricorsione

Una funzione che richiama se stessa si definisce ricorsiva. Grazie a questa tecnica è possibile semplificare la struttura di alcuni programmi, ma non necessariamente questo implica che il programma sia più efficiente. Nell'uso di funzioni ricorsive è fondamentale prevedere una condizione di uscita.

5.17.2 rand() → int rand(void) questa funzione restituisce un numero pseudoMAX, una costante definita), casuale (numero tra 0 e RANDquesto perché per dare quel numero il computer esegue una serie di operazioni su un numero già esistente e restituisce il risultato.

5.17.3 srand() → void srand(int) con questa funzione viene inizializzata la sequenza, ma comunque ogni

Una volta che viene lanciato il programma la sequenza è la stessa (questa funzione può essere utilizzata una sola volta).

5.17.4 time(0) → time(0) questa funzione (inclusa nella libreria time.h) restituisce il tempo attuale in secondi. Utilizzandola con srand(time(0)) si potrà avere sempre numeri pseudo casuali differenti.

Per generare numeri tra un preciso intervallo si può utilizzare l'operatore % ottenendo il resto della divisione con il numero generato: -%N → [0, N-1] → R = MAX - MIN + 1; MIN + rand()%R; → [MIN, MAX]

5.18 INPUT/OUTPUT

Per quanto riguarda le operazioni di input e output si distinguono due classi:

  • console: è l'insieme tastiera-schermo. Le principali funzioni sono quelle già viste come printf() e scanf(), c = getchar() legge un carattere da tastiera.
  • file: file che possono essere testuali oppure binari. Nel caso dei file esistono altrettante funzioni per poterli utilizzare.

5.18.1 fopen() → FILE

fopen("percorso","modalità") questa funzione permette di aprire un file. entrambi gli argomenti da passare sono delle stringhe; nel 'percorso file' bisogna mettere il nome del file con relativa estensione (.txt per esempio) e quel file deve essere nella stessa cartella del progetto. La 'modalità' invece è il modo in cui aprire il file [Figura 9].

Dettagli
Publisher
A.A. 2021-2022
60 pagine
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Uba_ di informazioni apprese con la frequenza delle lezioni di Fondamenti di informatica e laboratorio di programmazione e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Parma o del prof Bertozzi Matteo.