Dispensa Laboratorio di Programmazione
CORSO DI LABORATORIO DI PROGRAMMAZIONE ANNO 2005 - 2006
CORSO DEL LINGUAGGIO C Sviluppato con SO SUN OS 5.8 – compilatore unix sun – gcc version 3.2.2
Con note di utilizzo programmi con DEV++
Docente prof. Valter Cavecchia
Appunti dalle lezioni a cura di Jyothi Zontini – Giovanni Sosi
1
Dispensa Laboratorio di Programmazione
2
Dispensa Laboratorio di Programmazione
IL PRIMO PROGRAMMA IN C ................................................................................................................................... 5 COMPILAZIONE DEL PROGRAMMA .................................................................................................................................. 5
Esempio: stampare i numeri pari < 30 ..................................................................................................................... 6 Esempio: stampare le potenze del 2 con n < 30 ........................................................................................................ 6 Esempio: stampare un triangolo di * (asterischi) del tipo: ....................................................................................... 6 Esempio: stampare lo stesso triangolo di * però rovescio: ...................................................................................... 7 Esempio: dato un numero vedere la sua rappresentazione binaria: ......................................................................... 8 VARIABILI A BASSO LIVELLO – VARIABILI INTERE ........................................................................................ 9 Esempio: visualizzare l’aspetto binario di un numero: (binari1.c) .......................................................................... 9 OPERATORI BIT A BIT .............................................................................................................................................. 10 NUMERI PSEUDO CASUALI / RANDOM ............................................................................................................... 12
Teorema del limite centrale: ................................................................................................................................... 12 Distribuzione di Poisson ......................................................................................................................................... 13 Media – Varianza – Scarto quadratico medio ........................................................................................................ 14 Esempio con range da 0 a 5: (random3.c) .............................................................................................................. 15 NUMERI REALI AL CALCOLATORE ..................................................................................................................... 17 Esercizio: (float1.c) ................................................................................................................................................. 18 Esercizio: (radice2.c) .............................................................................................................................................. 18 Per vedere gli errori (o avvisi di warning) do il comando di compilazione: .......................................................... 19 Tipi di formato: ....................................................................................................................................................... 19 Prefissi tipi di formato: ........................................................................................................................................... 19 Calcolo valore di PiGreco col metodo di Montecarlo ............................................................................................ 20 Come è il costrutto if ? ............................................................................................................................................ 22 Esercizio: creare una tabellina numerica (tabella.c) .............................................................................................. 22 Esercizio: fare una matrice di int a[10][10] con i valori che vanno da 0 a 9 (array2.c) ....................................... 22 FUNZIONI E ARRAY ................................................................................................................................................... 23 Esempio: somma di due numeri .............................................................................................................................. 24 Esempi su puntatori e array .................................................................................................................................... 25 Esempio: (array2.c) creare un array e riempirlo di zeri ........................................................................................ 25 Consiglio di come usare i nomi da assegnare: ....................................................................................................... 25 Esercizio : fare un programma che inverte il contenuto di un array (arrayinverti.c) ............................................. 27 Esempio: fare la media dei valori di un vettore: ..................................................................................................... 28 Esercizio: generare un mazzo di carte .................................................................................................................... 28 Esercizio: fare un istogramma visivo del lancio di un dado (istogramma.c) .......................................................... 30 ESEMPI VARI DI PROGRAMMAZIONE ................................................................................................................. 31 Variabili statiche ..................................................................................................................................................... 32 compilazione e link di più oggetti ........................................................................................................................... 32 Costruiamo un contatore ......................................................................................................................................... 34 Variabili pubbliche e private ................................................................................................................................... 35 PUNTATORI .................................................................................................................................................................. 37 casting ..................................................................................................................................................................... 38 Esempio (puntatatori2.c) ......................................................................................................................................... 38 Mi da errore , allora eseguo il programma scritto così (puntatori4.c) ................................................................... 39 Esempio (puntatori5.c) ............................................................................................................................................ 39 Esempio: (puntatore7.c) provo lo stesso esempio assegnando a[]= 0x44ef1aF0,2} .............................................. 41 Vediamo ora l’esempio asegnando a[]={0x41424344,2};(puntatori8.c) ............................................................... 42 MANIPOLAZIONE DI STRINGHE ............................................................................................................................ 43 Esempi di stringhe e relativa gestione .................................................................................................................... 43 ESEMPIO DI APPLICAZIONE: UNA CALCOLATRICE ....................................................................................... 46 STACK ............................................................................................................................................................................ 47 3
Dispensa Laboratorio di Programmazione
LIFO ........................................................................................................................................................................ 47 Coda ........................................................................................................................................................................ 47 FIFO ....................................................................................................................................................................... 47 RPN = notazione inversa polacca ........................................................................................................................... 47 NOTAZIONE POLACCA INVERSA .......................................................................................................................... 48 COME FARE UNA CALCOLATRICE ....................................................................................................................... 53 Regole per l’input, controllo degli errori ................................................................................................................ 53 Funzione init() ......................................................................................................................................................... 53 Funzione sPush() ..................................................................................................................................................... 54 Funzione sPop() ...................................................................................................................................................... 54 Funzione sCheckerror ............................................................................................................................................. 55 Funzione sCalc() ..................................................................................................................................................... 55 Funzione sPrint() .................................................................................................................................................... 56 Stackmain.c – è la funzione main della mia applicazione ....................................................................................... 57 Stack.c ..................................................................................................................................................................... 58 Esempio: stack.h ..................................................................................................................................................... 60 Funzione stackmain ................................................................................................................................................. 60 RIEPILOGO - CORSO LABORATORIO DI PROGRAMMAZIONE .................................................................... 62 USO DI UNIX – NOTE PRELIMINARI ..................................................................................................................... 62
I PROGRAMMI IN C ........................................................................................................................................................ 63
TABELLA CODICE ASCII ........................................................................................................................................ 64
USO PROGRAMMI IN C SU DEV++ (WINDOWS) ..................................................................................................... 65
4
Dispensa Laboratorio di Programmazione
Il primo programma in C
Il primo programma classico in C è quello che stampa “hello world!”
Lo chiameremo hello.c. Dovremo inserirci la libreria <stdio.h> tramite il preprocessore #include.
Devo scrivere almeno una funzione , la “main”; questa deve sempre essere presente in un
programma in c (seguita poi eventualmente da molte altre).
Voglio scrivere “hello world!” sullo schermo; questo è complicato e devo delegare qualcuno a farlo,
ovvero il SO con la funzione “printf”.
#include <stdio.h> // questa libreria va SEMPRE inclusa, in ogni programma!
int main(void) {
(void)printf("hello world!\n"); /* il comando \n serve per andare a capo (n
di newline ) */
return
0;
}
/* Si raccomanda sempre l’indentazione (rientro), in quanto con un programma ben indentato
risulterà molto piu facile scovare gli errori.*/
Per vedere il contenuto del file basta digitare >cat hello.c
Si usa >cat “hell .c” se uno mette spazi nel nome // rispetto al precedente ci sono le “”. La
mancanza della “o” è voluta.
>mv mi permette di cambiare il nome del file
Compilazione del programma
Utilizzo il comando
gcc –o hello hello.c
Dove gcc –o è il comando al compilatore , seguito dal nome del file in uscita compilato (hello) e poi
dal nome utilizzato come codice sorgente (hello.c). In unix i file eseguibili non hanno estensione .
Infatti con il comando gcc hello si ottiene in output un file eseguibile di nome a.out ; nel momento
in cui ci si trovasse a compilare cosi due programmi diversi , avremmo due file di output con il
medesimo nome, che quindi andrebbero a sovrapporsi. Utilizzando invece il comando –o, è
possibile rinominare i file di output in fase di compilazione,in modo tale da evitare spiacevoli
inconvenienti.
Stringhe di commento:
Ci sono due tipi di stringhe:
se commento su un’unica riga, digito
//commento su una riga
Se invece desidero commentare su piu righe, la stringa è la seguente:
/* qui inserisco il commento
su piu righe */
5
Dispensa Laboratorio di Programmazione
Esempio: stampare i numeri pari < 30
Per poter stampare i numeri pari < 30 utilizzo la formula che i numeri pari sono divisibili per 2
senza resto.
Il programma sarà dunque:
#include <stdio.h>
#include <stdlib.h> // per chi usa windows questa libreria va sempre inclusa
int main(void) {
unsigned int i; // intero che mi designa il contatore
for (i=0;i<30;i++) // per i che va da 0 a 30, incrementa i di uno ogni volta
{
if (i%2==0) // se i è uguale a 0
printf("%2u\n",i);} // allora stampalo con formattazione unsigned
return 0; // il main non ha argomenti, quindi non ritorna nulla
}
Esempio: stampare le potenze del 2 con n < 30
#include <stdio.h>
int main(void) {
unsigned short int i;
p=1; // potenza del numero
for (i=0;i<30;i++){ // per i che va da 0 a 30, ogni volta stampa p
printf("%d\n",p);
p*=2;
}
return 0;
}
Esempio: stampare un triangolo di * (asterischi) del tipo:
*
**
***
****
*****
******
ecc ecc ecc
6
Dispensa Laboratorio di Programmazione
#include <stdio.h>
int main(void) {
unsigned int i,j;
for (i=0;i<30;i++){ // per i che va da 0 a 30
for (j=0;j<=i;j++){ // per j che va da 0 ad i
printf("*"); // stampami un asterisco
} // quando j è = ad i
printf("\n"); // vai a capo
} // quando i = 30
return 0; // termina il main
}
Esempio: stampare lo stesso triangolo di * però rovescio:
******************
*****************
****************
***************
**************
ecc
#include <stdio.h>
int main(void) {
unsigned int i,j;
for (i=0;i<10;i++){
for (j=10;j>i;j--){
printf("*");
}
printf("\n");
}
return 0;
}
7
Dispensa Laboratorio di Programmazione
Esempio: dato un numero vedere la sua rappresentazione binaria:
#include <stdio.h>
int main(void) {
int x=20;
while(x>0) // finchè x è > 0; termina quando x non è + maggiore di 0
{
printf("%d",(x%2));
x=x/2;
}
printf("\n");
return 0;
}
8
Dispensa Laboratorio di Programmazione
VARIABILI A BASSO LIVELLO – VARIABILI INTERE
Affrontiamo la gestione delle variabili a basso livello (parleremo solo di variabili intere)
Sono : char 1 byte
Int
che può essere di tipo short – long – longlong
La parola , word = dipende dalla lunghezza dell’architettura del calcolatore
Long >= int >= short
Le architetture delle macchine moderne hanno un calcolo a virgola mobile. Normalmente non uso
Floating Point, ma uniformo tutto a un valore: per esempio se devo fare una lista del peso delle
persone di un’aula userò come unità di misura etti e non Kg.
Useremo nozioni di ottimizzazione, concetti per avere prestazioni migliori di un codice.
Per sapere come è lungo un intero in C c’è l’operatore:
sizeof(tipo) unsigned
int
Esempio: visualizzare l’aspetto binario di un numero: (binari1.c)
#include <stdio.h>
int main(void) {
int i,n,m,x=8;
n=sizeof(unsigned int)*8;
for (i=n-1;i>0;i--)
{
m=1<<i;
(x&m)==m?printf("1"):printf("0");
/* equivale a scrivere:
if ((x&m)==m)
printf(“1”);
else
printf(“0”)
*/
}
printf("\n");
return 0;
}
9
Dispensa Laboratorio di Programmazione
Operatori bit a bit
In C e` possibile manipolare i valori di un byte agendo a livello dei singoli bit. Si tratta di
costrutti usati raramente, sono però introdotti per completezza. Gli operatori bit a bit (anche
detti
Bitwise Operator) definiti in C sono:
Simbolo Operazione realizzata
<<
Shift a sinistra
>>
Shift a destra
&
And bit a bit
|
Or bit a bit
ˆ
Or esclusivo bit a bit
˜
Complemento ad uno (Unario)
L’operatore << esegue lo
shift a sinistra del suo operando di sinistra per il numero di
posizioni specificate dal suo operando destro. I bit eccedenti (a sinistra) sono persi, i bit
aggiunti (a destra) sono zero. Ad esempio:
7 << 1
3
00000111
00000011
7 << 3
0
00000111
00000000
L’operatore >> esegue lo
shift a destra del suo operando di sinistra per il numero di
posizioni specificate dal suo operando destro. I bit eccedenti (a destra) sono persi, i bit
aggiunti (a sinistra) sono zero. Ad esempio:
7 >> 1
3
00000111
00000011
7 >> 3
0
00000111
00000000
L’operatore | esegue l’
or bit a bit fra i suoi due operandi. Questo significa che il bit i-
esimo risulter`a uguale ad uno se e soltanto se almeno uno dei bit i-esimi negli operandi e`
uguale ad uno. Ad esempio:
7 | 12
15
00000111 00001100 00001111
L’operatore & esegue l’
and bit a bit fra i suoi due operandi. Questo significa che il bit i-
esimo risulter`a uguale ad uno se e soltanto se ambedue i bit i-esimi negli operandi sono
uguali ad uno. Ad esempio:
7 & 12
4
00000111 00001100 00000100
10
Document Outline
Add New Comment