Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2004/05 Laboratorio di Linguaggi lezione VI Marco Tarini Laboratorio di Linguaggi • docente: Marco Tarini e-mail: [email protected] • ricevimento: Martedì 14:30 - 17:30 o anche su appuntamento • libro di testo consigliato: Kelley Al, Pohl Ira: "C Didattica e Programmazione" ("A Book on C") quarta edizione - anche la terza va bene Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Puntatori: operazioni a basso livello Esercizio: un numero in virgola mobile a doppia precisione di solito, ma dipende dall'implementazione • Sappiamo che un double occupa 8 bytes. • Dato un double, quale è il valore di questi 8 bytes? • Per esempio, quali 8 bytes compongono il valore 3.14159256 ? Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Puntatori: operazioni a basso livello • A casa, provate questo programma, e scopriamo: – quali sono gli 8 bytes che compongono il double 3.14159256 – quali sono gli 8 bytes che compongono il double 6.022 x 1023 • e, adattando il programma agli interi: – quali sono i 4 bytes che compongono l'int +1000000 – quali sono i 4 bytes che compongono l'int +1 – quali sono i 4 bytes che compongono l'int -1 • a seconda di quale architettura viene usata, potremmo trovare risposte diverse! – domanda: sarebbe potuto succedere in Java? Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Nota per i prossimi progetti • Usare l'opzione da riga di comanda per il compilatore –ansi – Cosi facendo, il compilatore diventa più restrittivo In Dev-C++ : Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Nota per i prossimi progetti • Usare l'opzione da riga di comanda per il compilatore –ansi – Cosi facendo, il compilatore diventa più restrittivo In Dev-C++ : scrivere: " -ansi " ...e magari anche " -pedant " Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Input / Output Input / Output Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Printf • Scrittura formattata int printf( const char* formato [, lista parametri...] ) Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Input / Output • Scrittura formattata carattere '\n': End Of Line (accapo) int x=10; ... printf("Il valore di x e' %d \n", x); %d è un format tag : • Scrive sullo schermo: significa, scrivi il valore di un parametro intero Il valore di x e' 10 Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Input / Output • Scrittura formattata int x=10, y=0; ... printf("Posizione [%d,%d] ! ", x, y); • Scrive sullo schermo: Posizione [10,0] ! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Vi ricordate che 'A' e 65 sono entrambi costanti (literals) di tipo char? • Usando il format tag appropriato, posso far scrivere uno o l'altro: char ch='A'; ... printf("Posso scrivere %c o %d a piacare ! ", ch, ch); • Scrive sullo schermo: Posso scrivere A o 65 a piacere ! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Il format tag definisce – come interpretare – con che formato scrivere il parametro corrispondente format tag: interpreta il parametro come: un intero con segno %d %i %u %x %X %f %e %E %o un intero senza segno un numero in virgola mobile %c un carattere %s una stringa %p un puntatore Marco Tarini ‧ Laboratorio di Linguaggi ‧ un array di caratteri terminato da '\0' 2004/05 ‧ Università dell’Insubria Format Tags • Il format tag definisce – come interpretare – con che formato scrivere il parametro corrispondente format tag: un intero con segno %d %i %u %x %X %f %e %E %c %s %p interpreta il parametro come: %o un intero senza segno un numero in virgola mobile in base otto (es. 16473 ) un carattere in esadecimale (es. 12AC3A ) stringa inuna esadecimale (es. 12ac3a ) puntatore inun decimale Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Il format tag definisce – come interpretare – con che formato scrivere il parametro corrispondente format tag: un intero con segno %d %i %#u %#x %#X %f %e %E %c %s %p interpreta il parametro come: %#o un intero senza segno un numero in virgola mobile in base otto (es. 016473 ) un carattere in esadecimale (es. 0X12AC3A ) stringa inuna esadecimale (es. 0x12ac3a ) puntatore inun decimale Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Il format tag definisce – come interpretare – con che formato scrivere il parametro corrispondente format tag: %d %i %f %e %c %s %p interpreta il parametro come: un intero con segno %E un numero in virgola mobile in notazione esponenziale un carattere (es. 1.2E12 ) una1.2e12 stringa ) (es. puntatorecomune inun notazione Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Esempio printf("Scrivo %d %d e %d !\n\nah!\n", 1, 2, 3); • Risultato: Scrivo 1 2 e 3 ah! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Esempio printf("Scrivo %-5d %5d e %5d !\n\nah!\n", 1, 2, 3); "5 caratteri di lunghezza" • Risultato: Scrivo 1 2 e 3 ah! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • etc... +: specifica il segno l: è un "float lungo", cioè un double anche se pos printf("Scrivo: %+6.3lf 6 cifre prima della virgola e anche %+.0e\n", 1.1, 1.2 ); 3 cifre dopo virgola • Risultato: Scrivo: +1.100 e anche +1e+000 Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • etc... char* stringa= "Totale (in euro): "; int res; ... printf("%s%d\n", stringa , res ); • Risultato: Totale (in euro): 130 Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Attenzione ai tipi printf("Torna %f euro\n", 150 ); • Sullo schermo: Torna 0 euro • Errore! Ha interpretato un valore intero come un float! Se i due tipi hanno dimensione diversa, può anche causare un crash (errore di accesso in lettura). Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Attenzione ai tipi printf("Torna %f euro\n", 150.0f ); • Sullo schermo: Torna 0 euro Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Format Tags • Attenzione ai tipi int x=150; printf("Torna %f euro\n", x ); float int • Sullo schermo: Torna 0 euro Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Funzionamento di printf • Come si scrive un programma che ci dice quale e' il codice ascii del simbolo '!'? printf( "%d", '!' ); • E se lo vogliamo in esadecimale? printf( "%X", '!' ); Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Funzionamento di printf • Come si scrive un programma che risolve il quiz del banner misterioso? char msg[]= {78,111,119,32,72,105,110,103,0}; printf(“%s”,msg); Marco Tarini ‧ Laboratorio di Linguaggi ‧ testo del quiz 2004/05 ‧ Università dell’Insubria Dove scrive printf? • sull' output standard • di solito, significa: sul monitor • ma, ad esempio... – al momento di eseguire il programma posso utilizzare la sintassi: programma >> file Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Scrivere non solo sullo schermo int printf( const char* format [, lista param...] printf: scrive sull'output standard ) int fprintf( FILE* stream, const char* format [, lista param...] ) int sprintf( char* output, const char* format [, lista param...] ) fprintf: scrive su un File sprintf: scrive su un'altra Stringa Marco Tarini ‧ Laboratorio di Linguaggi ‧ (che deve essere già allocata) 2004/05 ‧ Università dell’Insubria Esempio con sprintf • concatenazione di stringhe char[] stringa1 = "cacio"; char[] stringa2 = "cavallo"; char *concat; sprintf(concat,"%s%s",stringa1, stringa2); NON vi siete ancora accorti dell'errore?! Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Esempio con fprintf • scrittura in un file FILE* : il puntatore a una struttura che contiene tutto quello che c'è da sapere su un file aperto. Cosa contiene questa struttura? Non importa! (è platform dependent) Gestiamo i file utilizzando solo puntatori a questa struttura... fopen : apri un file. • resitutisce un FILE* • (alloca la struttura & apre il file) • Primo parametro: nome del file • Secondo parametro: stringa con 1- read o write o append , 2- modo testo o binario • Restituisce NULL se non è riusicto ad aprire il file float x,y,z; FILE* file_di_output= fopen ("ciao.txt", "wt"); fprintf( file_di_output,"(%f %f %f)",x,y,z ); fclose(file_di_output); fclose : chiudi un file. • (chiude il file & disalloca la struttura) • solo un certo numero di files può essere aperto in un dato momento • consente ad altre applicazioni di usare il file Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Input / Output Input / Output Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria scanf • da printf a scanf – per leggere dalla tastiera invece che scrivere sul monitor int x; ... printf("%d", scanf & x); ora vuole un puntatore! (perchè?) deve essere un puntatore a qualcosa di allocato (in questo esempio, è allocato automaticamente) e' ancora + importante che il tipo del puntatore corrisponda al format tag! (errori in scrittura invece che lettura, fa più male) Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria scanf • Tutto il resto come printf • Restituisce il numero di target tag che è stato corettamente assegnato int x,y, n; unsigned int z; ... n = scanf("%d-%d:%X", n n n &x, &y, &z); sarà uguale a 3 se l'utente avrà digitato, ad esempio: 5-5:A0A111 sarà uguale a 2 se l'utente avrà digitato, ad esempio: 5-5pippo sarà uguale a 0 se l'utente avrà digitato, ad esempio: >:-P Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria scanf • Tutto il resto come printf • Restituisce il numero di target tags che sono stati corettamente assegnati int g,m,a; do { printf(“\nInserisci giorno/mese/anno: " ); } while ( scanf("%u/%u/%u", &g, &m, &a)!=3 ); Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Leggere non solo dalla tastiera int scanf( const char* format [, lista punt.] scanf: legge dall'input standard ) int fscanf( FILE* stream, const char* format [, lista punt.] ) int sscanf( char* input, const char* format [, lista punt.] ) fscanf: legge da un File sscanf: legge da una Stringa Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Esempio di fscanf float x,y,z; FILE* file_di_output= fopen ("ciao.txt", "wt"); sprintf( file_di_output,"(%f %f %f)",x,y,z ); fclose(file_di_output); FILE* file_di_output= fopen ("ciao.txt", "rt"); sscanf( file_di_output,"(%f %f %f)",&x,&y,&z ); fclose(file_di_output); Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Uso tipico di sscanf : • Lettura degli argomenti da riga di comando di un programma. numero di argomenti + 1 argv[0] : nome del programma argv[1] : primo argomento ... argv[argc-1] : ultimo argomento int main(int argc, char *argv[]) argv[1] argv[0] argv[2] C:> pippo.exe –a –o:zap Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Uso tipico di sscanf (compito per casa): /* mostra le istruzioni di uso da riga di comando */ void show_usage(){ ... } int main(int argc, char *argv[]) { int x; if (argc<2) { /* nessun argomento: mostra l'aiuto e esci */ show_usage(); return 0; } if (sprintf("%d", argv[1], &x) != 1) { /* il primo argomento non e' un numero: mostra l'aiuto e esci */ show_usage(); return 0; } /* mostra i byte che compongono il numero... in base 16. Due cifre a byte, separate da uno spazio es: 00 00 00 01 */ ... return 1; } Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Per provare il programma su Dev-C++ • Impostare gli argomenti su Dev-C++ 21| Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria Definizione del C sul dizionario degli hacker tra " bytesexual " e " calculator " C: (noun). 1. ASCII 1000011 2. A language that combines all the elegance and the power of the assembly language with all the readability and the maintanability of the assembly language Marco Tarini ‧ Laboratorio di Linguaggi ‧ 2004/05 ‧ Università dell’Insubria