




































































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Corso completo Programmazione in C: dai concetti base( variabili, operatori, input ed output con file, cicli,array,matrici) a concetti più avanzati (puntatori,funzioni,passaggio di parametri a funzione,pila e coda,strutture)
Tipologia: Appunti
1 / 76
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





































































Commenti: Utilizzare i simboli /* */ oppure se di una sola riga // Nomi: Un nome DEVE INIZIARE NECESSARIAMENTE CON UNA LETTERA e poi proseguire con numeri, lettere e simbolo di sottolineatura. NON può superare i 32 caratteri. Struttura a blocchi:
Viene utilizzato il punto non la virgola e in presenza di esponenziale il numero deve essere in forma razionale. Es: 3.e2 (equivale a 3e^2 ) oppure 4.2e-0.5 (equivale a 4.2e(-1/2)) Operatori
La funzione printf permette di stampare su schermo. Serve per rendere più chiaro le informazioni da inserire una volta che viene compilato il programma e per stampare i risultati. Descrittore : Serve a descrivere il formato della variabile ed informa il compilatore sul tipo di variabile che verrà inserita in modo da stamparla correttamente. Esso nel printf viene sempre seguito dal nome della variabile a cui fa riferimento. “Il descrittore stampa il valore della variabile associato alla locazione di memoria che segue la virgola.Se presenti più descrittori ognuno di essi deve essere seguito dalla virgola.”
/Stampa due valori inseriti da tastiera e li assegna esattamente il primo alla variabile_1 che sarà di tipo float e il secondo sarà assegnato alla variabile_ che sarà di tipo intero/ %f /float/ %d /int/ %c /char/ %s /string/
Cicli iterativi
CICLO FOR: Si utilizza quando è noto a priori il numero delle volte che il ciclo viene iterato. for(inizializzazione;condizione;incremento) { Istruzione1; istruzione2; . . . Istruzione_n; }
messaggio di errore*/
Serve per effettuare una ricerca. Il flag viene di solito inizializzato a 0 (se la condizione è falsa) a 1 (se la condizione è vera).Può essere utilizzato anche per uscire dal ciclo una volta che si verifica una condizione. Es. trovato=0; for(i=0;i<N;i++) { Blocco di istruzioni; if (condizione_particolare) { Trovato=1; } } If (trovato==1) printf(“TROVATO”); else printf(“NON TROVATO”);
CICLO DO-WHILE: Il ciclo Do-While viene sempre eseguito almeno una volta perché il controllo della condizione avviene alla fine. Si utilizza di solito per verificare dati inseriti da tastiera. La condizione di uscita è la stessa che si trova nell’if. Es: /Conversione da C-F o F-C/ do { printf("Inserisci 1 se vuoi convertire da Fahrenheit a Celsius\n Inserisci 2 se vuoi convertire da Celsius a Fahrenheit\n"); scanf("%d",&option); if ((option!=1)&&(option!=2)) { printf("Digizazione errata.\n Riprova\n "); } } while((option!=1)&&(option!=2));
Un array può essere inizializzato essenzialmente il tre modi.
1. In fase di dichiarazione Tipo nome_array[]={“elementi dell’array”} ;/Elementi separati dalla virgola/ ES:int pari[]={ 2 , 4 , 6 , 8 , 10 } 2. Tramite indicizzazione diretta quando occorre int pari[5]; … pari[0]=2; pari[1]=4; pari[2]=6; pari[3]=8; pari[4]=10; 3. Riempimento tramite ciclo for. Lo stesso metodo va utilizzato se si intende assegnare gli elementi di un array ad un altro. for(i=0;i<=N;i++) { pari[i]=2*i; } for(i=0;i<=N;i++) { a[i]=b[i]; }
Si definisce stringa un array di tipo char. La lunghezza di una stringa, come succedeva per gli array, può essere definita in modo esplicito durante la definizione o in maniera implicita nel momento in cui inizializzazione e definizione avvengono contemporaneamente. In questo secondo caso la lunghezza della stringa viene “dedotta” dal compilatore ed è uguale al numero di caratteri compresi tra doppi apici inclusi gli spazi bianchi. /ATTENZIONE/ Una stringa termina sempre con un carattere speciale(/0) che non appare esplicitamente ma che serve a terminare la stringa e che viene aggiunto dal compilatore. INIZIALIZZAZIONE DI UNA STRINGA RICORDA!
Un array di dimensione M è un insieme di variabili tutte dello stesso tipo a cui si fa riferimento usando lo stesso nome e alle quali si accede mediante M indici. Consideriamo il caso bidimensionale. INIZIALIZZAZIONE: L’inizializzazione di un array bidimensionale (più in generale a più dimensioni) avviene allo stesso modo in cui avviene l’inizializzazione di un array unidimensionale. Anche in questo caso è di fondamentale importanza inserire il numero delle righe ed il numero delle colonne oppure stabilire in fase di dichiarazione quali sono gli elementi della matrice. In ogni caso il compilatore deve sapere quanto spazio dedicare alla matrice.
L’operatore di indirezione restituisce il valore contenuto nella locazione di memoria puntata dal puntatore. Essa consente di accedere e modificare il valore della variabile puntata. In questo secondo caso il puntatore pd si trova a sinistra dell’operatore di assegnazione. ANCORA SULL’INIZIALIZZAZIONE Un puntatore per poter essere utilizzato deve essere innanzitutto dichiarato e poi inizializzato. INIZIALIZZARE UN PUNTATORE SIGNIFICA FARLO PUNTARE A QUALCOSA. Nel caso in cui mancasse l’inizializzazione e si facesse un accesso al contenuto della variabile puntata dal puntatore facendo magari anche modifiche di fatto si potrebbe verificare un cash del sistema nel senso che poiché il puntatore non punta a nulla la locazione di memoria che si va a modificare potrebbe trovarsi anche dove è memorizzato il sistema operativo. Es: int p; /Dichiarazione di un puntatore p ad intero/ int a; p=&a; p=2;/L’istruzione sappiamo che significa”poni il contenuto della locazione di memoria puntata da p =2/ Tuttavia p non è stato inzializzato perciò DI FATTO NON PUNTA A NULLA. /ISTRUZIONE ILLEGALE/ Aggiungendo le due righe di codice sottolineate… si ha che p punta ad a perciò in p è memorizzato l’indirizzo di a e di conseguenza l’istruzione p=2 significa di fatto poni a= SERIE DI ESEMPI La scrittura b=*pd serve per assegnare a b il valore contenuto in a ossia 3.14. L’assegnazione alla terza riga poteva essere fatta tramite puntatore. *pd=3. La schermata di esecuzione rimane la stessa. Gli operatori di indirezione indirizzamento sono complementari tra loro. Definiamo un puntatore p ad una variabile **var. double p, var; p=&var; Allora p e &var riguardano l’indirizzo di var cioè il contenuto di p. p e var riguardano il contenuto della variabile
In generale abbiamo visto che la funzione scanf legge da tastiera caratteri o numeri e li scrive nelle locazioni di memoria associate a tali variabili. Per poter fare ciò ha bisogno degli indirizzi e quindi dei puntatori a tali variabili. La funzione printf stampa i valori assunti dalle variabili che compaiono nella lista degli argomenti per questo non ha bisogno di accedere alle locazioni di memoria. PRINTF Per poter stampare l’indirizzo di una variabile puntata, ossia il contenuto del puntatore che punta a quella variabile si utilizza il descrittore %p. Le ultime due istruzioni stampano rispettivamente il puntatore e il valore della variabile cioè nel primo caso visualizzeremo sullo schermo l’indirizzo della locazione di memoria a. Nel secondo caso avremo a=30 perché dalla terza riga di codice abbiamo che il contenuto della variabile puntata a p deve essere pari a 30
INCOERENZA TRA PUNTATORE E VARIABILE PUNTATA Errore in compilazione: la variabile a è di tipo intero mentre la variabile pd è un double nonché un puntatore. VERSIONE CORRETTA CONVERSIONE NON CORRETTA Errore in compilazione: Impossibile convertire double in *double. RICORDA che &b riguarda l’indirizzo di b mentre *pd riguarda il contenuto della variabile puntata. UNA VERSIONE CORRETTA Stampa… c=3.14; Esercizio : definire una variabile alpha di tipo intero; dichiarare un puntatore p_alpha che punta alla variabile alpha; assegnare il valore 100 alla variabile alpha mediante puntatore; stampare il valore del puntatore e della variabile a cui punta.
Il nome di un array nel linguaggio C costituisce un puntatore alla locazione di memoria che contiene il primo elemento dell’array. Il puntatore alla locazione di memoria che contiene il primo elemento si può definire allo stesso modo in cui si definisce un puntatore ad una variabile. Nelle seguenti righe di codice viene dichiarato un array di nome data[] contenente 10 elementi e un puntatore pd. Il puntatore pd punta al primo elemento dell’array data[10] e contiene esattamente l’indirizzo della locazione di memoria dove è contenuto il primo elemento dell’array. Allo stesso modo l’espressione *pd equivale a data[0] inteso come contenuto della locazione data[0]. I due programmi sono esattamente identici.
Poiché pd è un puntatore al primo elemento dell’array e poiché in memoria gli elementi di un array sono memorizzati in spazi contigui la scrittura pd+1 esprime l’indirizzo dell’elemento data[1] pd+2 esprime l’indirizzo dell’elemento data[2] . . . pd+9 esprime l’indirizzo dell’elemento data[9] Allo stesso modo per accedere gli elementi data[1],data[2]…data[9] si utilizza l’operatore di indirezione: *(pd+1) accede al contenuto della locazione data[1] (pd+2) accede al contenuto della locazione data[2] . . . (pd+9) accede al contenuto della locazione data[9] le tre scritture presenti all’interno dell’istruzione printf consentono di esprimere gli indirizzi delle locazioni di memoria degli elementi dell’array. Perciò per esprimere un indirizzo si possono sfruttare le seguenti scritture: supponiamo di dichiarare un array chiamato Array e un puntatore P_ARRAY. Per accedere agli indirizzi: _P_array &ArraY[Elemento al quale si vuole accedere] Array+i /i=Indice di incremento/_ Ricorda! Un array è un vettore di elementi tutti dello stesso tipo a cui si fa riferimento con lo stesso nome. Durante la fase di dichiarazione deve essere nota al compilatore la quantità di memoria da riservare per memorizzare tale array.
Per accedere al contenuto le scritture che possono essere usate sono le seguenti: Array[i] *(P_array+i) *(Array+i)
Abbiamo detto che il nome di un array può essere utilizzato come puntatore nel senso che il nome dell’array è un puntatore al primo elemento dell’array stesso. Si potrebbe pensare perciò che Array e Puntatori siano la stessa cosa o meglio che siano interscambiabili.
Puntatori ed array sono interscambiabili se il risultato di un’operazione non modifica il puntatore. Es. Incrementare un array intendendolo come puntatore è un’istruzione sbagliata. Se si vuole riempire un array con i valore i=1,2,3… Fare ben attenzione alla differenza tra ARRAY e PUNTATORI. Quando vengono utilizzati insieme per riempire un array conviene sempre dichiarare un puntatore con un nome diverso rispetto a quello dell’array. In questo modo il puntatore in quanto variabile può essere soggetto alle operazioni di incremento, decremento. Mentre un array non essendo una variabile non può essere incrementato o decrementato. Si ha un errore in compilazione.