La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

LA LIBRERIA STANDARD DEL C  La libreria standarddel C è in realtà un insieme di librerie  Per usare una libreria, non occorre inse- rirla esplicitamente.

Presentazioni simili


Presentazione sul tema: "LA LIBRERIA STANDARD DEL C  La libreria standarddel C è in realtà un insieme di librerie  Per usare una libreria, non occorre inse- rirla esplicitamente."— Transcript della presentazione:

1 LA LIBRERIA STANDARD DEL C  La libreria standarddel C è in realtà un insieme di librerie  Per usare una libreria, non occorre inse- rirla esplicitamente nel progetto: ogni ambiente di sviluppo sa già dove cercarle  Rhide: C:\DJGPP\LIB  Turbo C: vedi Options/Project/Directories  Ogni file sorgente che ne faccia uso deve però includere lo header opportuno, che contiene le dichiarazioni necessarie.

2 LA LIBRERIA STANDARD DEL C Le librerie standard  input/outputstdio.h  funzioni matematiche math.h  gestione di stringhestring.h  operazioni su caratterictype.h  gestione dinamica della memoriastdlib.h  ricerca ed ordinamento stdlib.h  … ... e molte altre.

3 IL MODELLO DI COORDINAZIONE DEL C  Libreria standard stdio  l’input avviene di norma dal canale standard di input (stdin)  l’output avviene di norma sul canale standard di output (stdout)  input e output avvengono sotto forma di una sequenza di caratteri  tale sequenza è terminata dallo speciale carattere EOF (End-Of-File), che varia da una piattaforma all’altra.

4 I CANALI STANDARD Di norma:  il canale standard di input, stdin, coincide con la tastiera  il canale standard di output, stdout, coin- cide con il video Esiste inoltre un altro canale di output, riservato ai messaggi di errore: stderr.  anch’esso di norma coincide con il video Avere un canale separato per i messaggi di errore è utile se stdout viene ridiretto su un altro dispositivo fisico (stampante, modem, etc): così i messaggi d’errore rimangono sul video.

5 IL MODELLO DI COORDINAZIONE DI BASE  Poiché sui canali di I/O fluiscono sequen- ze di caratteri, il modello di coordinazio- ne prevede due operazioni base:  scrivere un carattere sul canale di output putchar(ch);  leggere un carattere dal canale di input ch = getchar();  Ogni altro tipo di I/O può essere costruito a partire da queste operazioni primitive.

6 I/O A CARATTERI  int putchar(int ch);  scrive un carattere sul canale di output  restituisce il carattere scritto, o EOF in caso di errore.  int getchar(void);  legge un carattere dal canale di input  restituisce in carattere letto, o EOF in caso la sequenza di input sia finita, o in caso di errore. Entrambe le funzioni leggono/scrivono un carattere convertito in int (senza estensione di segno): ciò assicura che il valore numerico del carattere non sia mai negativo (escluso, eventualmente, il solo carattere speciale EOF).

7 ESEMPIO Ricopiare l’input standard sull’output standard, carattere per carattere. #include main(){ int c; while(( c=getchar() ) != EOF) putchar(c); } Per chiudere l’input producendo un EOF da tastiera, CTRL+Z in sistemi Windows, CTRL+D in Unix. Attenzione: getchar() inizia a produrre caratteri solo dopo aver premuto INVIO.

8 I/O DI TIPI PRIMITIVI Ogni altro tipo di I/O può essere costruito sulle due primitive putchar() e getchar(). Esempi  scrivere o leggere stringhe di caratteri  scrivere o leggere la rappresentazione di un numero (naturale, intero, reale) sotto forma di stringa, in una base data. Come vedremo, queste funzionalità sono fornite già pronte nella libreria di I/O standard: è però molto istruttivo capire come costruircele da soli.

9 I/O DI STRINGHE DI CARATTERI Scopo:  data una stringa di caratteri (correttamen- te terminata da ‘\0’), scriverla sull’output standard (andando a capo a fine stringa) void printString(char s[]);  dato un array di caratteri vuoto, leggere una stringa da input standard (considerando la stringa finita a fine riga) void readString(char s[]);

10 SCRITTURA DI STRINGHE SU stdout Data una stringa di caratteri (terminata da ‘\0’), scriverla sull’output standard, andando a capo a fine stringa. #include void printString(char s[]){ while(*s) putchar(*s++); putchar('\n'); }

11 LETTURA DI STRINGHE DA stdin Dato un array di caratteri vuoto e lungo a suffi- cienza, leggere una stringa da input standard, considerando la stringa finita a fine riga. #include void readString(char s[]){ int c; while((c=getchar())!=EOF && c!='\n') *s++ = c; *s = '\0'; }

12 I/O A STRINGHE La libreria standard offre le seguenti funzioni:  int puts(char s[]);  scrive la stringa sul canale di output, omettendo il terminatore ‘\0’, e aggiungendo un newline in fondo  restituisce EOF in caso di errore, o un valore non negativo altrimenti.  char* gets(char s[]);  legge dal canale di input una stringa terminata dal carattere newline (‘\n’), che però viene omesso; al suo posto introduce in fondo il terminatore ‘\0’  restituisce l’indirizzo della stringa letta, o NULL (un valore zero) in caso di fine sequenza o di errore.

13 ESEMPIO Ricopiare l’input standard sull’output standard, riga per riga. #include main(){ char s[81]; /* lung. max riga */ while(gets(s)) != NULL) puts(s); } Per chiudere l’input, premere CTRL+Z in sistemi Win- dows (CTRL+D in Unix) su una riga vuota, poi INVIO. Attenzione: gets() fornisce la stringa solo dopo aver premuto INVIO.

14 ESERCIZIO Costruire puts() e gets() da putchar() e getchar() int puts(char s[]) { int j; for (j = 0; s[j] != '\0'; j++) if ( putchar(s[j]) == EOF) return EOF; if ( putchar('\n') == EOF) return EOF; return 0; } int puts(char s[]) { int j = 0; do if(putchar(s[j] ? s[j] : '\n') == EOF) return EOF; while (s[j++]); return 0; }

15 I/O DI VALORI NUMERICI Scopo:  dato un numero calcolare la stringa di caratteri che lo rappresenta in una data base, e scrivere tale stringa sull’output void printInteger(int n); void printDouble(double f);  leggere da input una stringa di caratteri che rappresenta un numero in una data base, e calcolare il valore del numero int readInteger(void); double readDouble(void);

16 SCRITTURA DI NUMERI SU stdout Dato un numero intero, calcolare la stringa di caratteri che lo rappresenta in una data base, e scrivere tale stringa sull’output standard. #include #include "myNumbers.h" void printInteger(int x){ char s[20]; intToS(10,x,s); puts(s); } In alternativa si può usare la funzione (non standard) itoa(int x, char* s, int base) che si trova in stdlib.h.

17 SCRITTURA DI NUMERI SU stdout Dato un numero reale, calcolare la stringa che lo rappresenta e scriverla sull’output standard. #include #include void printDouble(double x){ char *p; int i=0, point, sign; p = fcvt(x,14,&point, &sign); if (sign!=0) putchar('-'); while(point>i) putchar(p[i++]); putchar('.'); puts(p+i); } Funzione di libreria (non standard)

18 FUNZIONI DI CONVERSIONE STANDARD La libreria standard stdlib fornisce quasi tutte le funzioni di conversione già pronte  da stringa a numero  atoi() da stringa a intero  atol()da stringa a long  atof() da stringa a double  da numero a stringa (solo Turbo C)  itoa() da intero a stringa  ltoa()da long a stringa  fcvt() da double a stringa Il C standard usa sprintf(), che vedremo più avanti.

19 LETTURA DI NUMERI DA stdin Leggere da input una stringa che rappresenti un numero intero in base dieci, e calcolarne il valore corrispondente. #include #include "myNumbers.h" int readInteger(void){ char s[20]; gets(s); return sToInt(10,s,strlen(s)); } Si può usare la funzione di libreria int atoi(char* s) Ipotesi: la stringa sta su una riga a sé stante.

20 LETTURA DI NUMERI DA stdin Leggere da input una stringa che rappresenti un numero reale in base 10, e calcolarne il valore corrispondente. #include #include double readDouble(void){ char s[20]; gets(s); return atof(s); } Ipotesi: la stringa sta su una riga a sé stante.

21 I/O FORMATTATO La libreria standard offre due funzioni di I/O di uso generale, che compendiano tutte le necessità precedenti: printf() e scanf()  int printf(...);  scrive sul canale di output una serie di valori, effettuando le conversioni richieste ove necessario  restituisce il numero di caratteri emessi  int scanf(...);  legge dal canale di input una serie di campi, effettuando le conversioni richieste ove necessario  restituisce il numero di campi letti.

22 I/O FORMATTATO Le funzioni printf() e scanf() :  possono avere un numero variabile di parametri  possono scrivere/leggere  singoli caratteri  stringhe di caratteri formattate nel modo indicato dall’utente  interi, con o senza segno, in base 8, 10, 16  reali (float o double) in vari formati

23 OUTPUT FORMATTATO: printf() Sintassi: int printf(char frm[], e1,…, eN)  la funzione scrive sul canale di output i risultati delle espressioni e1, …, eN nel formato specificato dalla stringa frm[]  restituisce il numero di caratteri scritti, o EOF in caso di errore.

24 OUTPUT FORMATTATO: printf() La stringa di formato frm[] int printf(char frm[], e1,…, eN) è una stringa che può contenere specifiche di formato, del tipo % carattere Formati per caratteri e stringhe:

25 OUTPUT FORMATTATO: printf() Formati per numeri:

26 ESEMPIO 1 #include main() { float z = ; int ret = 5; char msg[50] = "Finalmente si stampa!"; printf("Valori: ret=%d, z=%f, msg=%s\n", ret, z, msg); } stringa float int (decimale)

27 ESEMPIO 2 #include main() { int a; printf("Immettere un carattere: "); a = getchar(); printf("\n%c rappresenta %d come intero" "decimale, %o in ottale e %x in hex", a, a, a, a); } La stringa di formato può essere per comodità spezzata in più stringhe, che vengono concatenate automaticamente. int (esadecimale) int (decimale) int (ottale) char

28 INPUT FORMATTATO: scanf() Sintassi: int scanf(char frm[], add1,…, addN)  la funzione legge dal canale di input tanti campi quanti ne specifica la stringa di formato frm[], e li pone in memoria agli indirizzi denotati da add1, …, addN  restituisce il numero di campi letti (0 se non ha letto nulla), o EOF in caso di errore.

29 INPUT FORMATTATO: scanf() La stringa di formato frm[] int scanf(char frm[], add1,…, addN) specifica esattamente ciò che ci si aspetta in input, tramite specifiche % carattere Formati per caratteri e stringhe: NB: scanf considera finita la stringa al primo spazio o se- paratore che incontra. Quindi non si può usare scanf per leggere una stringa contenente spazi.

30 INPUT FORMATTATO: scanf() Formati per numeri:

31 ESEMPIO 3 #include main() { float x; int ret, i; char name[50]; printf("Inserisci un numero decimale, "); printf("un float ed una stringa con meno"); printf("di 50 caratteri e senza spazi: "); ret = scanf("%d%f%s", &i, &x, name); printf("%d valori letti: %d, %f, %s", ret, i, x, name); } stringa float int (decimale) ?

32 ESEMPIO 3 #include main() { float x; int ret, i; char name[50]; printf("Inserisci un numero decimale, "); printf("un float ed una stringa con meno"); printf("di 50 caratteri e senza spazi: "); ret = scanf("%d%f%s", &i, &x, name); printf("%d valori letti: %d, %f, %s", ret, i, x, name); } nome di una stringa (è già un indirizzo) indirizzo di una variabile float Indirizzi di variabili per tipi semplici, occorre ricavare sempre l’indirizzo con l’operatore & per le stringhe, il nome è già un indirizzo, quindi & non va mai usato. indirizzo di una variabile int

33 ESEMPIO 3 (variante) #include main() { float x; int ret, i; char name[50]; int *pi = &i; float *px = &x; printf("Inserisci un numero decimale, "); printf("un float ed una stringa con meno"); printf("di 50 caratteri e senza spazi: "); ret = scanf("%d%f%s", pi, px, name); printf("%d valori letti: %d, %f, %s", ret, i, x, name); } Gli indirizzi possono essere passati a scanf() anche attraverso idonei puntatori.

34 scanf() : PRECISAZIONI  In scanf(), la stringa di formato frm[] è tipicamente una sequenza di specifiche % carattere senza spazi o altri caratteri intermedi. Ad esempio: scanf("%d%d%f",...)  non deve contenere messaggi! scanf("inserire un int: d%", …) Infatti, la stringa di formato descrive esattamente quello che ci deve essere in input, non ha nulla a che fare con i messaggi che si vogliono in output!!

35 scanf() : PRECISAZIONI  Inserire spazi o altri caratteri nella stringa di formato di scanf() è quindi possibile, ma ha il significato di richiedere che tali caratteri siano obbligatoriamente presenti in input: se mancano, scanf() dà errore.  Ad esempio: Nella prima forma, i caratteri devono essere separati da uno spazio, altrimenti...

36 scanf() : PRECISAZIONI  Questa caratteristica può essere sfruttata per leggere dati formattati in modo partico- lare, come ad esempio una data (gg/mm/aa) scanf("%d/%d/%d", &g, &m, &a);  In questo modo, scanf() filtra automatica- mente i dati, eliminando le barre e “cattu- rando al volo” gli interi che interessano. Se anche solo una barra manca  errore  Dulcis in fundo, scanf() elimina automatica- mente gli spazi di separazione fra i campi.

37 ESEMPIO 4 Leggere (e poi riscrivere) nome, cognome, e data di nascita di una persona. #include main() { struct { char cognome[20], nome[20]; int g, m, a; } p; printf("Cognome, nome e data di nascita: "); scanf("%s%s%d/%d/%d", p.cognome, p.nome, &p.g, &p.m, &p.a); printf("%s %s è nato il %d/%d/%d\n", p.cognome, p.nome, p.g, p.m, p.a); } Gli spazi di separazione sono eliminati automaticamente

38 DUE VARIANTI: sprintf() e sscanf()  printf() e scanf() operano su console  sprintf() e sscanf() operano su una stringa char os[DIM], is[DIM]; sprintf(os,...); sscanf(is,...);  sprintf() scrive il risultato sulla stringa os invece che sull’output standard  sscanf() legge i campi dalla stringa is invece che dall’input standard

39 DUE VARIANTI: sprintf() e sscanf()  printf() e scanf() operano su console  sprintf() e sscanf() operano su una stringa char os[DIM], is[DIM]; sprintf(os,...); sscanf(is,...);  sprintf() scrive il risultato sulla stringa os invece che sull’output standard  sscanf() legge i campi dalla stringa is invece che dall’input standard Adattissime per fare conversioni numero / stringa ( sprintf ) e stringa / numero ( sscanf )

40 DUE VARIANTI: sprintf() e sscanf() Conversione stringa (s) / numero (n) sscanf(s,"%d", &n);  sscanf() legge un intero decimale dalla stringa s, lo converte, e lo pone in n Conversione numero (n) / stringa (s) sprintf(s,"%d", n);  sprintf() converte l’intero n in stringa (rappr. decimale) e lo scrive sulla stringa s

41 DUE VARIANTI: sprintf() e sscanf() Conversione stringa (s) / numero (n) sscanf(s,"%d", &n);  sscanf() legge un intero decimale dalla stringa s, lo converte, e lo pone in n Conversione numero (n) / stringa (s) sprintf(s,"%d", n);  sprintf() converte l’intero n in stringa (rappr. decimale) e lo scrive sulla stringa s Equivale a scrivere n = atoi(s); ma è più flessibile

42 ALTRE LIBRERIE STANDARD Le seguenti librerie forniscono funzioni utili: Elenchiamo ora le funzioni più importanti che esse mettono a disposizione.

43 ALTRE LIBRERIE STANDARD ctype.h (funzioni sui caratteri) conio.h (funzioni di I/O diretto da console) string.h (funzioni sulle stringhe)

44 ALTRE LIBRERIE STANDARD math.h (funzioni matematiche) stdlib.h (funzioni varie)

45 ESEMPIO 5 Lettura diretta da tastiera con getch() e ungetch(). #include main() { int val=0; char ch; puts("Inserire un intero e un char: "); while((ch = getche()) != EOF && isdigit(ch)) val = 10 * val + ch - '0'; if (ch != EOF) ungetch(ch); printf("\nValore = %d, prossimo = %c\n", val, getch()); } Se il carattere letto non è una cifra, lo “rimanda indietro” getch() preleva il carattere e non lo mostra a video getche() invece lo mostra

46 ESERCIZIO: CODICE FISCALE Problema (non banale!): Scrivere un programma che, a partire dai dati anagrafici, calcoli il codice fiscale di una persona. Il C.F. è composto di 5 parti: tre lettere identificative del cognome; tre lettere identificative del nome; due cifre, una lettera e altre due cifre, indicanti sesso e data di nascita; una lettera e tre cifre, indicanti il Comune di nascita; una lettera di controllo, calcolata sulla base delle lettere e delle cifre precedenti.

47 ESERCIZIO: CODICE FISCALE Problema: Scrivere un programma che, a partire dai dati anagrafici, calcoli il codice fiscale di una persona. Il C.F. è composto di 5 parti: tre lettere identificative del cognome; tre lettere identificative del nome; due cifre, una lettera e altre due cifre, indicanti sesso e data di nascita; una lettera e tre cifre, indicanti il Comune di nascita; una lettera di controllo, calcolata sulla base delle lettere e delle cifre precedenti. Le prime tre consonanti (se non bastano, le vocali; se non bastano ancora, una X) La prima, la terza e la quarta consonante (se non ci sono quattro consonanti, si usano le prime tre; se non bastano, si usano le vocali; se non bastano ancora, una X) Esempi: ROSSI MARIO  RSS MRA ROSSI GASTONE  RSS GTN

48 ESERCIZIO: CODICE FISCALE Problema: Scrivere un programma che, a partire dai dati anagrafici, calcoli il codice fiscale di una persona. Il C.F. è composto di 5 parti: tre lettere identificative del cognome; tre lettere identificative del nome; due cifre, una lettera e altre due cifre, indicanti sesso e data di nascita; una lettera e tre cifre, indicanti il Comune di nascita; una lettera di controllo, calcolata sulla base delle lettere e delle cifre precedenti. Anno, mese e giorno di nascita Per le donne, giorno aumentato di 40 Mese = A, B, C, D, E, H, L, M, P, R, S, T Sigla che si trova su apposite tabelle Bologna = A944, Reggio Emilia = H223, etc Esempi: 01/02/1978 (maschio)  78B01 25/12/1969 (femmina)  69T65

49 ESERCIZIO: CODICE FISCALE Problema: Scrivere un programma che, a partire dai dati anagrafici, calcoli il codice fiscale di una persona. Il C.F. è composto di 5 parti: tre lettere identificative del cognome; tre lettere identificative del nome; due cifre, una lettera e altre due cifre, indicanti sesso e data di nascita; una lettera e tre cifre, indicanti il Comune di nascita; una lettera di controllo, calcolata sulla base delle lettere e delle cifre precedenti. Cifre 0  9  Lettere A  J Lettere di posto pari (2,4,..)  0-25 Lettere di posto dispari (1,3,…)  vedi tabella: BAKPLCQDREVO S F T G U H M I N J WZ Y X Alla fine, si somma tutto e si prende il risul- tato modulo 26.

50 ESERCIZIO: CODICE FISCALE Problema: Scrivere un programma che, a partire dai dati anagrafici, calcoli il codice fiscale di una persona. Il C.F. è composto di 5 parti: tre lettere identificative del cognome; tre lettere identificative del nome; due cifre, una lettera e altre due cifre, indicanti sesso e data di nascita; una lettera e tre cifre, indicanti il Comune di nascita; una lettera di controllo, calcolata sulla base delle lettere e delle cifre precedenti. Esempio: Rossi Mario, 12/6/76, Bologna R S S M R A 7 6 H 1 2 A ? R S S M R A H G H B C A J E E ? (pari) (dispari) Totale: 129 mod 26 = 25  Z R S S M R A H G H B C A J E E Z

51 ESERCIZIO: CODICE FISCALE Specifica: convertire in maiuscolo tutti i dati forniti (per comodità) una funzione calcolaCognome che calcola le prime tre lettere una funzione calcolaNome che calcola le seconde tre lettere una funzione calcolaData che calcola il blocco centrale (data di nascita e sesso) (la sigla del comune di nascita si assume data) una funzione calcolaUltima che calcola la lettera finale una funzione che unisce tutti i pezzi precedenti.

52 ESERCIZIO: CODICE FISCALE Esempio: la funzione calcolaCognome Interfaccia void calcolaCognome(char s[], char c[]); s rappresenta la stringa contenente il cognome (ingresso) c rappresenta il codice da calcolare (uscita) Specifica di I°livello –finché in s ci sono consonanti, e purché non ne abbiamo già trovate tre, copiare la consonante k-esima in c[k-1] (1  k  3) –se dopo questa operazione non vi sono ancora tre conso- nanti (k<3), ripartire dall’inizio cercando le vocali: finché in s ci sono vocali, e fintanto che k<3, copiare la vocale i-esima in c[k-1] (1  k  3) –se dopo di ciò manca ancora una lettera (cosa possibile solo con i cognomi di due sole lettere), porre c[2] = ‘X’

53 ESERCIZIO: CODICE FISCALE Esempio: la funzione calcolaCognome Interfaccia void calcolaCognome(char s[], char c[]); s rappresenta la stringa contenente il cognome (ingresso) c rappresenta il codice da calcolare (uscita) Specifica di I°livello –finché in s ci sono consonanti, e purché non ne abbiamo già trovate tre, copiare la consonante k-esima in c[k-1] (1  k  3) –se dopo questa operazione non vi sono ancora tre conso- nanti (k<3), ripartire dall’inizio cercando le vocali: finché in s ci sono vocali, e fintanto che k<3, copiare la vocale i-esima in c[k-1] (1  k  3) –se dopo di ciò manca ancora una lettera (cosa possibile solo con i cognomi di due sole lettere), porre c[2] = ‘X’ Per semplificare i punti (1) e (2), conviene scandire la stringa carattere per carattere, e porre in c[k] le consonanti, accantonando in un array voc[nv] le vocali.

54 ESERCIZIO: CODICE FISCALE Esempio: la funzione calcolaCognome void calcolaCognome(char s[], char c[]) { int i, j=0, nv=0, k=0, len=strlen(s); char voc[3]; /* 1) Separo consonanti da vocali, */ /* prendendo le prime */ for(i=0; i

55 ESERCIZIO: CODICE FISCALE Finire l’esercizio: definire le altre funzioni definire il main che le usa leggere i dati della persona dagli argomenti della linea di comando C:> cf Rossi Mario M A944 NB: attenzione ai caratteri numerici: non sono numeri..!! cognome nome giorno mese anno sesso sigla Comune di nascita nome del programma

56 CODICE FISCALE: VARIANTI Variante A (interattiva) leggere i dati della persona da console Cognome?Rossi Nome?Mario Nato il?01/02/78 Sesso(M/F)? M Comune(sigla)? A944 stampare il codice calcolato a video RSS.MRA.78B01.A944.Z

57 CODICE FISCALE: VARIANTI Variante B (elaborazione da stringa) leggere i dati della persona da una stringa data, nell’ipotesi che essa sia così strutturata: Cognome=Rossi&Nome=Mario&... in pratica: –la stringa contiene un’unica riga, che consiste in una sequenza di “coppie” del tipo NomeCampo= valorecampo –le coppie sono concatenate una all’altra dal carattere speciale &, senza spazi Questo formato “a coppie”, che può sembrare assai strano, risulterà utile fra non molto.


Scaricare ppt "LA LIBRERIA STANDARD DEL C  La libreria standarddel C è in realtà un insieme di librerie  Per usare una libreria, non occorre inse- rirla esplicitamente."

Presentazioni simili


Annunci Google