Estratto del documento

Introduzione al C1: Mapping problems

Analisi del problema: data una richiesta, cercare delle azioni appropriate per raggiungere uno scopo. Astrazione -> formalizzazione.

Istanze: problemi specifici, casi specifici di un problema generale. L'obiettivo è risolvere il problema generale, comprendendo tutte le possibili variabili.

Algoritmo risolvente: soluzione, anche informale, indipendente dal calcolatore.

Algoritmo implementato: è il programma, ovvero la realizzazione della soluzione, scritta in un determinato linguaggio di programmazione.

  • Scelta della tecnica adatta (identificare l'esecutore dell'algoritmo)
  • Rispetto di tre vincoli:
    • Ogni azione non è ambigua (due esecutori diversi danno lo stesso risultato)
    • Ogni azione è eseguibile in un tempo finito
    • Numero finito di passi (il tempo totale di esecuzione è finito)

Il "se" altera il flusso delle informazioni; eseguo delle operazioni piuttosto che altre, a seconda che sia "vero" o "falso".

La macchina astratta di von Neumann

  • Bus di sistema
  • CPU
  • Interfacce
  • Memoria
  • Periferiche
  • Centrale

CPU (Central Process Unit)

Indirizzo AR: Registro indirizzi

Dato DR: Registro dati

  • Viene letto l'indirizzo AR
  • La parola dell'indirizzo corrispondente nella memoria viene trasferita nella CPU
  • Il dato viene utilizzato e/o modificato

Bus di sistema

  • Bus dati: trasmette valori tra il DR della CPU e la memoria centrale.
  • Bus indirizzi: da AR per indirizzare le informazioni e individuare il componente.
  • Bus controlli: informazioni di controllo.

Fondamenti di C

Linguaggio C

  • Sintassi: descrive le regole per la composizione delle espressioni legali del linguaggio.
  • Semantica: cosa fa il programma, deve verificarla il programmatore.

La notazione Backus Naur Form (BNF)

  • Terminali
    • Parole chiave del linguaggio (if, float, int)
    • Simboli di operazioni (+)
    • Numeri, stringhe e identificatori
    • Punteggiatura
  • Non terminali: identificatori di altre regole Metasimboli
    • Scelta A|B
    • Opzionalità {A} opt
    • Ripetizione {A} 0+

Regole semantiche

  • Lettere maiuscole e minuscole sono diverse
  • Non posso avere due identificatori con lo stesso nome
  • Le parole chiave e gli identificatori sono riservati
  • Non usare diversi identificatori per lo stesso elemento
  • Notazione infissa: (a+b)*(c+d)

Schema base di un programma

Directive_part -> È necessaria per includere le informazioni riguardanti la #include<stdio.h>, libreria standard di I/O (input/output) del C.

Function_definition int main () { executable_part } Il codice eseguibile si trova all'interno della sezione che rappresenta la parte principale del main programma. Contiene le istruzioni usate per manipolare i dati definiti in precedenza -> statement_sequence

Dopo aver scritto il nostro programma in un qualsiasi editor di testo, bisogna convertirlo in una forma che il computer possa eseguire, e questo richiede tre passi:

  • Pre-processamento: il programma viene prima dato in pasto a un preprocessore, il quale obbedisce ai comandi che iniziano con # (le direttive).
  • Compilazione: il programma modificato deve andare a un compilatore, il quale lo traduce in istruzioni macchina (object code).
  • Linker: combina il codice oggetto prodotto dal compilatore con del codice addizionale, necessario per rendere il programma completamente eseguibile.

Printf

Serve per visualizzare il risultato del mio programma.

-> salto riga, vai a capo \n -> formato di stampa e conversione %d

Scanf

Serve per inserire dei dati all'interno di una variabile. Generalmente è preceduto da un messaggio che aiuta l'utilizzatore a capire cosa fare.

If

if (logic_expression) statement_sequence_1 {else statement_sequence_2}

Se la logic_expression è TRUE allora eseguo la statement_sequence_1, se invece la logic_expression è FALSE allora eseguo la statement_sequence_2.

While

while (logic_expression) { statement_sequence }

Se la logic_expression è TRUE allora eseguo la statement_sequence. Continuo ad eseguire le istruzioni fino a quando l'espressione logica sarà FALSE.

  • La logic_expression deve essere calcolabile prima del ciclo
  • 0 ≤ numero di iterazioni ≤ ∞

Switch

switch (expression) { case valore 1: statement_sequence … case valore n: statement_sequence }

Variabili e assegnamenti

In C, è necessario un modo per memorizzare temporaneamente i dati durante l'esecuzione del programma; questi luoghi di memorizzazione vengono chiamati variabili.

Tipo

Ogni variabile deve avere un tipo che specifichi la tipologia di dati che dovrà contenere. È importante scegliere il tipo appropriato, in quanto da esso dipende il modo in cui la variabile viene memorizzata e le operazioni che si possono compiere su di essa.

  • int: memorizza un numero intero.
  • float: memorizza numeri con cifre dopo la virgola.

Tipi composti: definizione della struttura (tipi semplici + costruttori) e implementazione operazioni.

Costruttori di tipo

  • ARRAY: Aggregato ordinato di elementi dello stesso tipo
    • Dimensione fissata (statico); memoria centrale
    • Accesso agli elementi per posizione
  • RECORD: Aggregato di elementi che possono essere di tipo diverso
    • Dimensione fissata (statico); memoria centrale
    • Accesso agli elementi per nome
  • RICORSIVO: Aggregato di elementi dello stesso tipo costruito ammettendo che un tipo possa contenere riferimenti a componenti dello stesso tipo
    • Dimensione arbitraria; memoria centrale
    • Accesso sequenziale agli elementi

Dichiarazioni

Le variabili devono essere dichiarate, cioè descritte a beneficio del compilatore, prima di poter essere utilizzate. Per dichiarare una variabile dobbiamo prima specificare il tipo e successivamente il nome.

Assegnamenti

Si può conferire un valore ad una variabile tramite un assegnamento. Prima che a una variabile possa essere assegnato un valore, o possa essere utilizzata in qualsiasi altra maniera, questa deve essere prima dichiarata.

Inizializzazione

Alcune delle variabili vengono automaticamente impostate a zero quando un programma inizia l'esecuzione, anche se per la maggior parte non è così. Una variabile che non ha un valore di default e alla quale il programma non ha ancora assegnato un valore è detta non inizializzata. Possiamo sempre dare un valore iniziale a una variabile attraverso il suo assegnamento; in alternativa possiamo mettere il valore iniziale della variabile nella sua dichiarazione.

Input/Output

La funzione printf

La funzione è progettata per visualizzare il contenuto di una stringa, conosciuta come stringa di formato, assieme a valori inseriti in specifici punti della stringa stessa. I valori visualizzati possono essere costanti, variabili oppure espressioni più complicate. La stringa di formato può contenere sia caratteri ordinari che specifiche di conversione che iniziano con il carattere %. Una specifica di conversione è un segnaposto rappresentante un valore che deve essere inserito durante la stampa.

L'informazione che segue il carattere % specifica come il valore debba essere convertito dalla sua forma binaria alla forma da stampare (caratteri). Nelle stringhe di formato, i caratteri ordinari vengono stampati esattamente come appaiono, mentre le specifiche di conversione vengono rimpiazzate dal valore che deve essere stampato. Ai compilatori C non viene richiesto di controllare se il numero di specifiche di conversione presenti in una stringa di formato corrisponda al numero di oggetti di output.

printf("%d %d", i); // errato

Specifiche di conversione

Le specifiche di conversione forniscono al programmatore grandi potenzialità di controllo sull'aspetto dell'output. Più in generale una specifica di conversione può avere la forma %m.pX, dove m e p sono delle costanti intere e X una lettera. Sia m che p sono opzionali. Il campo di minimo, m, specifica il numero minimo di caratteri che deve essere stampato. Se il valore che deve essere stampato richiede più di m caratteri il campo si espande automaticamente fino a raggiungere la grandezza necessaria.

Il significato della precisione, p, dipende dalla scelta di X, lo specificatore di conversione. X indica quale conversione deve essere applicata al valore prima di stamparlo:

  • %d: stampa gli interi nella forma decimale (base 10). Il valore p indica il numero minimo di cifre da stampare (se necessario vengono posti degli zero aggiuntivi).
  • %e: stampa un numero a virgola mobile nel formato esponenziale (notazione scientifica). Il valore p indica quante cifre devono apparire dopo il separatore decimale.
  • %f: stampa un valore a virgola mobile nel formato a "virgola fissa" senza esponente.
  • %g: stampa un valore a virgola mobile sia nel formato esponenziale che in quello decimale a seconda delle dimensioni del numero. Il valore p specifica il numero di cifre significative. È utile per visualizzare numeri la cui dimensione non può essere predetta durante la scrittura del programma, oppure tende a variare per dimensione.

Sequenze di escape

Le sequenze di escape permettono alle stringhe di contenere dei caratteri che altrimenti causerebbero dei problemi al compilatore, inclusi i caratteri di controllo non stampabili.

  • Backspace \b
  • New line \n
  • Tab \t

La funzione scanf

La scanf legge l'input secondo un particolare formato. Una stringa di formato della scanf può contenere sia caratteri ordinari che specifiche di conversione. Le conversioni ammesse per la scanf sono essenzialmente le stesse che vengono utilizzate dalla printf. Quando viene utilizzata la scanf, il programmatore deve controllare che il numero di conversioni di formato combaci esattamente con il numero di variabili in ingresso e che la conversione sia appropriata per la variabile corrispondente. Il simbolo & precede le variabili nella scanf.

Come funziona la scanf

La funzione scanf cerca di combinare gruppi di caratteri di input con le specifiche di conversione.

scanf("%d %f", &x, &y)

Anche la scanf è controllata da una stringa di formato; per ogni specifica di conversione della stringa di formato, la scanf cerca di localizzare nei dati di input un oggetto del tipo appropriato. La scanf quindi, legge l'oggetto fermandosi non appena incontra un carattere che non può appartenere all'oggetto. Se un qualsiasi oggetto non viene letto con successo, la scanf termina immediatamente senza esaminare la parte rimanente della stringa di formato.

Espressioni

Una delle caratteristiche del C è la sua enfasi sulle espressioni (formule che mostrano come calcolare un valore) piuttosto che sulle istruzioni. Le espressioni più semplici sono le variabili e le costanti; una variabile rappresenta un valore che deve essere calcolato mentre il programma è in esecuzione, mentre una costante rappresenta un valore che non verrà modificato.

Gli operatori sono gli strumenti base per costruire le espressioni e il C ne possiede molti:

  • Operatori aritmetici, come addizione, sottrazione, moltiplicazione e divisione.
  • Operatori relazionali per eseguire confronti, come maggiore e minore.
  • Operatori logici per costruire condizioni, come and (&&) e or (||)

Operatori aritmetici

  • Additivo
    • Somma: +
    • Sottrazione: -
  • Moltiplicativo
    • Moltiplicazione: *
    • Divisione: /
    • Resto: %

Gli operatori "/" e "%" richiedono un'attenzione particolare:

  • L'operatore "/" può produrre risultati inattesi. Quando entrambi gli operandi sono interi l'operatore "/" tronca il risultato omettendo la parte frazionaria.
  • L'operatore "%" richiede operandi interi. Se anche solo uno degli operandi non è un intero, allora il programma non verrà compilato.
  • Utilizzare lo zero come operando destro di uno dei due operatori provoca un comportamento non definito.

Operatori di assegnamento

Di solito, una volta che un'espressione è stata calcolata, abbiamo bisogno di memorizzare il suo valore all'interno di una variabile per poterlo utilizzare successivamente. L'operatore "=" del C è chiamato assegnamento semplice e viene utilizzato per questo scopo. Per aggiornare il valore già memorizzato all'interno di una variabile, invece, il C fornisce diversi operatori di assegnamento secondari.

Assegnamento semplice

L'effetto dell'assegnamento semplice v=e è quello di calcolare l'espressione "e" e di copiarne il valore all'interno della di v. Se v ed e non sono dello stesso tipo, allora il valore di e viene convertito nel tipo di v appena viene effettuato l'assegnamento.

Assegnamento composto

Gli assegnamenti che utilizzano il vecchio valore di una variabile per calcolare quello nuovo sono molto comuni; i=i+2. Gli operatori di assegnamento composto del C ci permettono di abbreviare istruzioni simili alla precedente; Gli operatori composti sono: -=, +=, *=, /=, %=.

i += 2.

Operatori di incremento e decremento

Due delle più comuni operazioni su una variabile sono l'incremento (sommare 1 alla variabile) e il decremento (sottrarre 1 alla variabile). Possiamo effettuare queste operazioni in due modi:

  • i=i+1, j=j-1
  • i += 1, j -= 1

Tuttavia, il C permette di abbreviare maggiormente incrementi e decrementi utilizzando gli operatori (incremento) ++ e (decremento) --. Una complicazione è data dal fatto che ++ e -- possono essere usati sia come operatori prefissi (++i e j--) che come operatori suffissi (i++ e --i).

  • Calcolare il valore dell'espressione (pre-incremento) restituisce i+1 e, come side effect, incrementa i.
    i=1
    printf("i vale %d", ++i); //stampa "i vale 2"
    printf("i vale %d", i); //stampa "i vale 2"
  • Calcolare l'espressione (post-incremento) produce il risultato ma causa il successivo incremento di i.
    i=1
    printf("i vale %d", i++); //stampa "i vale 1"
    printf("i vale %d", i); //stampa "i vale 2"

Istruzioni di selezione

La maggior parte delle istruzioni ricadono all'interno di tre categorie, a seconda di come influiscono sull'ordine di esecuzione delle istruzioni.

  • Istruzioni di selezione: le istruzioni if e switch permettono al programma di selezionare un particolare percorso di esecuzione fra un insieme di alternative.
  • Istruzioni di iterazione: le istruzioni while, do, for permettono le iterazioni (loop).
  • Istruzioni di salto: le istruzioni break, continue, goto provocano un salto incondizionato in un altro punto del programma.

Espressioni logiche

Diverse istruzioni C devono verificare il valore di un'espressione per dire se è "vera" o "falsa". Espressioni come i<j possiedono uno speciale tipo di valore detto "Booleano" o "logico". Questo particolare tipo può assumere solamente due valori: vero o falso. Nel linguaggio C un confronto come i<j restituisce un valore intero: 0 (falso) oppure 1 (vero).

Operatori relazionali e logici

  • Operatori relazionali
    • <: minore di
    • >: maggiore di
    • <=: minore o uguale a
    • >=: maggiore o uguale a
  • Operatori di uguaglianza
    • !: negazione logica
    • ==: uguale a
    • !=: diverso da
  • Operatori logici
    • &&: and logico
    • ||: or logico

L'istruzione if

L'istruzione if permette al programma di scegliere tra due alternative sulla base del valore di un'espressione. Nella sua forma più semplice l'istruzione if ha la struttura:

if (espressione) { istruzioni; }

Quando un'istruzione if viene eseguita, l'espressione all'interno delle parentesi viene calcolata. Se il valore dell'espressione è diverso da zero (valore che il C interpreta come "vero") allora l'istruzione dopo le parentesi viene eseguita.

La clausola else

if (espressione) { istruzioni; }
else { istruzioni; }

Le istruzioni che seguono la parola else vengono eseguite se l'espressione contenuta tra le parentesi ha valore 0 ("falso").

L'operatore ternario

espr1 ? espr2 : espr3

espr1, espr2, espr3 possono essere espressioni di qualunque tipo, mentre e sono detti...

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
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
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.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community