Scrittura formattata

Transcript

Scrittura formattata
Esercizi su Input/Output con formato
LLCaponetti
Caponetti
FormattedIO
1
Scrittura formattata - printf
Funzione printf
int printf ( <stringa di controllo>,
<variabili>)
La funzione restituisce un valore intero
uguale ai caratteri effettivamente stampati
Oppure un valore negativo in caso di
errore
LLCaponetti
Caponetti
FormattedIO
2
1
Scrittura formattata - printf
Formattazione
La stringa di controllo descrive il formato di
output- contiene delle specifiche di conversione:
dimensioni del campo, precisione, ..
• Ogni specifica inizia con il simbolo di percentuale (%),
e termina con l'indicatore di conversione
LLCaponetti
Caponetti
FormattedIO
3
Stampa di interi
Conversion Specifier
Description
d
i
Visualizza un intero decimale con segno
Visualizza un intero decimale con segno. (Gli
indicatori i e d si comportano differentemente
con la scanf.)
Visualizza un intero ottale senza segno
Visualizza un intero decimale senza segno
Visualizza un intero esadecimale senza segno.
X per visualizzare le cifre 0-9 e le lettere A-F
x per visualizzare le cifre 0-9 e le lettere a-f
Modificatori di lunghezza. Indicano che il numero
da visualizzare è rispettivamente short oppure
long
o
u
x or X
h or l (letter l)
LLCaponetti
Caponetti
FormattedIO
4
2
3
#include <stdio.h>
stdio.h>
4
5
int main()
6
{
7
printf(
printf( "%d
"%d\n", 455 );
8
printf(
printf( "%i
"%i\n", 455 );
9
printf(
printf( "%d
"%d\n", +455 );
10
printf(
printf( "%d
"%d\n", -455 );
11
printf(
printf( "%hd
"%hd\
hd\n", 32000 );
12
printf(
printf( "%ld\
"%ld\n",
n", 2000000000 );
13
printf(
printf( "%o
"%o\n", 455 );
14
printf(
printf( "%u
"%u\n", 455 );
15
printf(
printf( "%u
"%u\n", -455 );
16
printf(
printf( "%x
"%x\n", 455 );
17
printf(
printf( "%X\
"%X\n",
n", 455 );
/* i same as d in printf */
20
21
} /* end main */
LLCaponetti
Caponetti
FormattedIO
5
Program
Ouptut
455
455
455
-455
32000
2000000000
707
455
4294966841
1c7
1C7
LLCaponetti
Caponetti
FormattedIO
6
3
Stampa di numeri Floating-Point
Conversion specifier
Description
e or E
Visualizza un valore floating-point value in
notazione esponenziale
Visualizza un valore floating-point nella
notazione con virgola
Visualizza un valore floating-point nella
forma f o esponenziale in base alla
grandezza del numero
Modificatore di lunghezza. Specifica che il
numero da visualozzare è un valore long
double floating-point
f
g or G
L
LLCaponetti
Caponetti
2
FormattedIO
7
/* Printing floatingfloating-point numbers with
floatingfloating-point conversion specifiers */
3
4
5
#include <stdio.h>
6
7
int main()
8
{
9
printf( "%e\
"%e\n",
n", 1234567.89 );
10
printf( "%e\
"%e\n",
n", +1234567.89 );
11
printf( "%e\
"%e\n",
n", -1234567.89 );
12
printf( "%E\
"%E\n",
n", 1234567.89 );
13
printf( "%f\
"%f\n",
n", 1234567.89 );
14
printf( "%g\
"%g\n",
n", 1234567.89 );
15
printf( "%G\
"%G\n",
n", 1234567.89 );
16
17
return 0; /* indicates successful termination */
18
19 } /* end main */
1.234568e+006
1.234568e+006
-1.234568e+006
1.234568E+006
1234567.890000
1.23457e+006
1.23457E+006
LLCaponetti
Caponetti
Program
Output
FormattedIO
8
4
Lettura formattata - scanf
Funzione scanf
int scanf ( <stringa di controllo>,
<indirizzo delle variabili>)
La funzione restituisce un valore intero
uguale ai campi effettivamente letti
Oppure un valore negativo in caso di
errore (oppure la costante EOF)
LLCaponetti
Caponetti
FormattedIO
9
Lettura formattata - scanf
scanf
Consente
• Di leggere tutti i tipi di dati
• Saltare specifici caratteri
Stringa di controllo
• Descrive il formato di input
Indirizzo delle variabili
• Puntatore alle variabili dove memorizzare l’ input
Può includere dimensioni di campo per leggere
uno specifico numero di caratteri dallo stream
LLCaponetti
Caponetti
FormattedIO
10
5
Esercizio 1
Risolvere il seguente problema: si vuole
creare una rubrica telefonica costituita da
componenti aventi ciascuna i seguenti
campi
cognome, nome, numero di telefono
In particolare si vogliono leggere i diversi record
dal file standard di input –stdin- e memorizzare
in un file di testo di nome elenco
LLCaponetti
Caponetti
FormattedIO
11
Struttura dati
Ogni utente può essere rappresentato mediante una
struttura avente 3 campi: cognome, nome,
numero-telefono
L’insieme degli utenti può essere memorizzato su un
file costituito da una sequenza di strutture. Scegliamo
di scrivere e leggere il file in modo formattato
Dichiarazioni globali
typedef char STRING[20];
typedef struct { STRING cognome; STRING nome;
int num; } UTENTE;
LLCaponetti
Caponetti
FormattedIO
12
6
Main
int main()
{ FILE *out; /* dichiarazione puntatore a FILE */
UTENTE rec; /*dichiarazione della struttura */
/* apri file out in scrittura */
if ( (out = fopen ( "elenco.txt", "w" )) ==NULL)
{ printf ( "errore nell'apertura del file\n") ;
exit (1);}
LLCaponetti
Caponetti
FormattedIO
13
Main
/* crea file */
int risposta = 1;
while (risposta )
{
/* legge un elmento dal file stdin */
printf ("inserisci cognome\n"); scanf ("%s", &rec.cognome);
printf ("inserisci nome\n"); scanf ("%s", &rec.nome);
printf ("inserisci numero di telefono\n"); scanf ("%d", &rec.num);
/* scrive i campi di rec nel file out in modo formattato*//* tra il formato
di 2 campi adiacenti vi deve essere almeno uno spazio */
fprintf (out, "%s %s %d\n", rec.cognome, rec.nome, rec.num);
printf ("vuoi continuare? (1 oppure 0) \n");
scanf("%d", &risposta);
Nel formato di scrittura i dati
sono separati da un blank
printf ("\n");
}
LLCaponetti
Caponetti
FormattedIO
14
7
Main
/* chiude il file out */
fclose (out);
/* apre file out in lettura */
if ((out = fopen ("elenco.txt", "r"))
==NULL)
{ printf ("errore nell'apertura del file\n") ;
exit (1);}
LLCaponetti
Caponetti
FormattedIO
15
Main
/* visualizza il file out */
while (!feof(out) )
{
/* leggi i campi dal file out con il formato*/
fscanf (out, "%s%s%d\n", &rec.cognome,
&rec.nome, &rec.num);
Il formato di lettura è uguale a
quello con cui i dati sono stati
scritti con fprintf – escluso i
blank
/* visualizza rec */
printf ("%20s%20s%10d", rec.cognome, rec.nome,
rec.num);
printf ("\n");
}
LLCaponetti
Caponetti
FormattedIO
16
8
Modifiche
Modificare il programma introducendo
2 procedure:
Creafile --- per memorizzare il file
void creafile (FILE *out)
Visualizzafile ---- per visualizzare il file
void visualizzafile (FILE *out);
LLCaponetti
Caponetti
FormattedIO
17
Memorizzazione sul file – procedura creafile
void creafile (FILE *out)
{ UTENTE st;
int risposta = 1;
COMPLETARE
while (risposta )
{ “ leggi dal file stdin i campi cognome, nome, num
della struttura st
scrivi sul file out i campi letti in modo formattato */
scanf("%d", &risposta);
printf ("\n");
LLCaponetti
Caponetti
}
}
FormattedIO
18
9
Visualizzazione del file – procedura visualizzafile
void visualizzafile (FILE *out)
{ UTENTE st;
while (!feof(out) )
COMPLETARE
“ leggi dal file out i campi
cognome, nome, num
con lo stesso formato usato per scriverli
{
visualizza sul file stdout i campi letti */
}
LLCaponetti
Caponetti
FormattedIO
19
Formato per la visualizzazione
/* visualizza un elemento su file stdout */
printf ("%20s%20s%10d", st.cognome, st.nome,
st.num);
Nell’esempio il formato di stampa è costituito da 3 campi:
- 20 caratteri per la prima stringa
20 caratteri per la stringa successiva
-- 10 caratteri per un intero
LLCaponetti
Caponetti
FormattedIO
20
10
Esercizio 2
Risolvere il seguente problema: si vuole visualizzare
l’elenco degli studenti caratterizzati dal nome,
cognome e matricola ordinato secondo il campo
matricola.
a. Descrivere la struttura dati scelta per memorizzare i dati
b. Descrivere l’algoritmo di ordinamento mediante diagramma di
c.
d.
flusso o pseudocodifica
Descrivere l’algoritmo con cui memorizzare i dati su un file
Scrivere il programma che risolva il problema, organizzato in
funzioni o procedure per
Leggere i dati e memorizzarli su un file
Caricare i dati in un vettore
Ordinare il vettore secondo il campo matricola
Visualizzare i dati ordinati
LLCaponetti
Caponetti
FormattedIO
21
11