Índex

 
Capítol03.zip Exrcicis03.zip
Capítol 3

Les funcions d'entrada i sortida per pantalla.

  1. La funció printf.
    1. Les flags.
    2. L'especificador de llarg.
    3. L'especificador de precisió .prec
    4. L'especificador modificador del mida de la variable d'entrada.
    5. Especificadors de conversió
    6. Seqüència d'escapada
    7. Alguns exemples
  2. La funció scanf
    1. Exemples.
  3. La funció getchar
  4. Les funcions gets i puts
  5. Exercicis.

 

3.1. La funció printf.

Serveix com ja s'ha vist per treure dades per pantalla. Més endavant veurem que també serveix per escriure dades a disc o a altres perifèrics.

Ja hem vist que hi ha dades de diferents tipus i que la funció printf necessita saber el tipus de dades que ha d'escriure per saber com les ha d'escriure. En la següent taula veiem els diferents tipus i els seus especificadors de conversió.

El següent programa produeix la sortida per pantalla de la dreta:
 

Programa Sortida per pantalla
#include <stdio.h>
int main(void)
{
     double dia = 23.457;
     printf("|%+15.9f|",dia);
     return 0;
}

 
 

    |  +23.457000000|

L'especificador de format és %+15.9f que es composa de 6 parts: % [flags] [llarg] [.prec] [F|N|h|l|L] tipus

Tot el que és entre claudàtors pot ometre-se ometre. No més és obligatori el signe de %, de principi de l'especificador, i el tipus de dades que vol imprimir-se imprimir; de fet, a l'exemple no s'ha utilitzat la cinquena part. Així printf("|%23.475|",dia) produiria la sortida |23.457000|.

¿Que fan les quatre parts que resten?
 

Parts de l'especificador  El que fa
flags 
Justificació de sortida, signes numèrics, punts decimals, zeros de sortida, octal i hexadecimal prefix. 
llarg
Mínim de caràcters a imprimir, amb replè d'espais o zeros. 
.prec
Màxim de caràcters a imprimir. Per als enters és el mínim de dígits a imprimir. 
mida
Número de decimals que ha d'escriure. Sobre-escriu el mida del tipus de variable per defecte i són F, N, h, l, L. 1.1.

3.1.1 Les flags.

Els caràcters per a les flags són -,+,blank,#.
 
Flag  El que fa
Justifica a esquerra i omple el resta de la dreta amb blancs.
Si el signe és positiu posa un + i si és negatiu posa un -.
blank
 En les dades numèriques fa que si són positives deixi un blanc a l'esquerra i si són negatives posi el signe menys
 Especifica que l'argument ha de convertir-se amb la forma alternativa (veure pàgina 402, primera taula, del Borland C++ library reference).

3.1.2. L'especificador de llarg.

L'especificador de llarg indica el mínim número de caràcters que ocuparà la dada a imprimir.
 
Especificador de llarg   El que fa
 n
 S'imprimeixen els n caràcters següents a la posició actual del cursor. Si la dada conté menys de n caràcters la sortida s'omple amb blancs. 
 0n
El mateix però els caràcters s'omplen amb zeros i no amb blancs. 
*
 El llarg del camp s'ha de especificar en la llista d'argumentes en la dada d'una variable, y l'asterisc es substituït per la dada.

3.1.3 L'especificador de precisió .prec

L'especificador de precisió .prec indica el número de decimals que s'escriuran de un número. S'escriu o bé amb un punt seguit del número de dígits a escriure o bé amb un asteriscs com en el darrer cas del llarg.
 
Especificador de precisió  El que fa
 No escrit Precisió per defecte segons el tipus de dades: 
    default = 1 per als tipus d,i,o,u,x,X 
    default = 6 per als tipus e,E,f 
    default = tots els dígits significatius per als tipus g,G 
.0
Per als tipus d,i,o,u,x és la precisió per defecte; per als tipus e,E,f no s'imprimeix el punt decimal.
.n
s'imprimeixen n caràcters o n xifres decimals. Si el valor de sortida té més xifres significatives o bé són truncades o bé son arrodonides. 
*
El llarg de la precisió s'ha de especificar en la llista d'argumentes en la dada d'una variable, y l'asterisc es substituït per la dada.

3.1.4. L'especificador modificador del mida de la variable d'entrada.

S'utilitza en combinació amb un dels especificadors de conversió, per exemple:

%d        per al tipus int
%ld       per al tipus long int


Modificador de mida de la va-riable.  El que fa
 F
El tipus és llegit com a punter llunyà.
 N
El tipus és llegit com a punter proper.
h
El tipus és interpretat com a short int per a d, i, o, u, x, X. 
l
El tipus és interpretat com a long int per a d, i, o, u, x, X.
És interpretat com a double per a e, E, f, g, G.
L
El tipus és interpretat com a long double per a e, E, f, g, G. 

3.1.5 Especificadors de conversió

Indiquen a la funció printf de que tipus de variable es tracta:
 
Especificació de conversió Argument d'entrada  Sortida per pantalla
Numèrics
   
d
sencer Sencer decimal amb signe.
i
sencer Sencer decimal amb signe.
sencer Sencer octal sense signe.
u
sencer Sencer decimal sense signe.
x
sencer Sencer hexadecimal sens signe (amb a, b, c, d ,e, f).
X
sencer Sencer hexadecimal sens signe (amb A, B, C, D, E, F).
Coma flotant Valor amb signe de la forma [-]dddd.dddd. 
e
Coma flotant Valor amb signe de la forma [-d.dddd] o e [+/-]ddd.
g
Coma flotant Valor amb signe en format e o f, amb un número donat de decimals de precisió. Els zeros i punts decimal surten si és necesari. 
E
Coma flotant  El mateix que e però amb format exponencial amb E.
G
Coma flotant El mateix que g però amb exponent E si s'utilitza el format e. 
Caràcters
   
 c
caràcter Caràcter simple.
s
punter a string Imprimeix caràcters fins que un caràcter de terminació (\0) es detectat.
%
res
Punters
   
n
punter a int  
p
punter  
Hi ha molt més precisions a dir que es troben a les pàgines 401 del llibre Borland C++ Library reference.

3.1.6 Seqüència d'escapada

 
Seqüència
Valor Nom La funció imprimeix printf
\a
07 BEL Pita
\b
08 BS Espai darrera
\n
0A LF Nova línia
\r
0D CR Principi de línia
\t
09 HT Tabulador horitzontal
\\
5C \ Barra invertida
\'
27 ' Cometa Doble
\"
22 " Cometa
\?
3F ? Interrogant
\O
    0= tres dígits octals, imprimeix el caràcter corresponent.
\xH
    H= dos dígits hexadecimals, imprimeix el caràcter corresponent.

3.1.7 Alguns exemples

 
#include <stdio.h>
#include <math.h>

int main(void)
{
    clrscr();
    float i = 2.0,  j = 3.0;
    printf("%f %f %f %f\n\n", i, j, i+j, sqrt(i + j));

    double dia = 23.457;
    printf("|%f|\n",dia);
    printf("|% f|\n",dia);
    printf("|%+15.9f|\n",dia);
    printf("|%-15.9f|\n",dia);

    double x = 5000.0, y = 0.0025;
    printf("%f %f %f %f\n\n",x ,y, x*y, x/y);
    printf("%e %e %e %e\n\n",x ,y, x*y, x/y);

    char linia[80];
    scanf("%[^\n]",linia);
    printf("%s\n",linia);

    short int a=127;
    long c=55547;
    printf("%5hd %5hx %8lo %8lu\n", a, a, c, c);

    char letra='A';
    printf("%d %c\n",letra,letra);

    return 0;
}


 
 
 
 
 

2.000000  3.000000  5.000000  2.236068
 

|23.457000|
| 23.457000|
|  +23.457000000|
|23.457000000    |
 

5000.000000  0.002500  12.500000  2000000.000000
5.00000e+03 2.50000e-003 1.250000e+001  2.000000e+006

Hola que tal
Hola que tal
 
 

127    7f        154373        55547
 

65  A

3.2. La funció scanf

Serveis per llegir caràcters del dispositiu d'entrada estàndard, com el teclat. La funció transforma les dades que li arriben d'acord amb els especificadors i tipus d'arguments que s'escriuen.

Els especificadors de formats per a la funció scanf són:

% [*] [llarg] [F|N] [h|l|L] tipus_de_dades


Parts de l'especificador  El que fa
 *
Suprimeix l'assignació del següent camp d'entrada
llarg
Màxim número de caràcters a llegir. Alguns caràcters han de ser llegits si la funció scanf troba espais en blanc o caràcters no convertibles. 
mida
Ignora la mida per defecte de la direcció de l'argument e indica la nova mida. 
  • N = punter proper 
  • F = Punter llunyà 
tipus d'argument
Ignora el tipus d'argument defecte de la direcció de l'argument e indica el nou tipus. 
  • h = short int 
  • l = long int (en cas de que l'especificador de conversió indiqui un integer). 
  • l = double (en cas de que l'especificador de conversió indiqui un float). 
  • L = long double (Vàlid solament amb especificador de conversió de tipus float.)

Els  especificadors de conversió só els següents:
 

Especificació de conversió Entrada esperada  Tipus d'argument 
Numèrics    
d
Sencer base deu  Punter a int (int *arg)
D
Sencer base deu  Punter a long (long *arg)
o
Sencer octal  Punter a int (int *arg)
O
Sencer octal  Punter a long (long *arg)
i
Sencer decimal, octal o hexadecimal Punter a int (int *arg)
  Punter a long (long *arg)
u
Sencer decimal sense signe  Punter a unsigned int unsigned long *arg)
U
  Punter a unsigned long (unsigned long *arg) 
x,X 
Sencer hexadecimal  Punter a int (int *arg)
 e, E 
 Coma flotant Punter a float (float *arg)
 f
 Coma flotant Punter a float (float *arg) 
  g,G
 Coma flotant Punter a float (float *arg)
 Caràcters    
 s
 Cadena de caràcters  Punter a matriu de caràcters (char arg[]) 
 c
 Caràcter Punter a caràcter (char *arg)
 %
 % caràcter  
 Punters    
  Veure Library Reference pag. 446.  

3.2.1 Exemples.

  1. Un 1er exemple d'utilització de scanf. Només s'ha utilitzat l'especificador de tipus d'argument.

  2.  
    #include <stdio.h>
    void main(void)
    {
         int a;
         float r1, r2;
         printf("Introdueix un número sencer ");
         scanf("%d",&a);
         printf("Introdueix dos números reals separats per un espai en blanc ");
         scanf("%f %f", &r1, &r2);
         printf("Has introduït el número enter %d i els números reals %f i %f\n", a, r1, r2);
    }
  3. Les cadenes de caràcters s'enmagatzemen en matrius i es poden llegir del dispositiu d'entrada estàndard mitjançant scanf. Heu de pensar que l'especificador %s no més llegeix caràcters imprimibles i fa que scanf s'aturi quan troba un espai en blanc.

  4.  
    #include <stdio.h>
    void main(void)
    {
         char nom[45];

         printf("Escriu solament el teu nom ");
         scanf("%s",nom);
         printf("Mol de gust de conèixer-te %s \n",nom);
    }

  5. A més es poden utilitzar els especificadors de la forma %[caràcter]. En la instrucció scanf("%[aeiou]",tecles) l'especificador indica que s'han de llegir només les vocals i quan es trobi qualsevol altre caràcter s'aturarà de llegir.

  6.  
    #include <stdio.h>
    void main(void)
    {
         char tecles[100];
         clrscr();
         printf("Escriu coses en el teclat, i agafaré només les tecles a, e, i,o, u ");
         scanf("%[aeiou]", tecles);
         printf("has escrit %s\n",tecles);
    }
  7. En la instrucció scanf("%[^aeiou]",tecles) l'especificador indica que s'han de llegir tots els caràcters excepte les vocals i quan es trobi una d'elles s'aturarà de llegir. Així podem posar l'especificador %[^\n] per llegir tots els caràcters excepte el caràcter nova línia

  8.  
    #include <stdio.h>
    void main(void)
    {
         char nom1[45];
         clrscr();
         printf("Ara pots escriure el teu nom i dos cognoms, agafaré les tres paraules ");
         scanf("%[^\n]", nom);
         printf("Mol de gust de conèixer-te %s\n",nom);
    }
  9. Es poden utilitzar rangs de caràcters consecutius. Per exemple l'especificador "%[ 0-9A-Za-z]" permet incloure els dígits, les lletres de la A a la Z i les lletres a a z.

  10.  
    include <stdio.h>
    void main(void)
    {
         char tecles[100];
         clrscr();

         printf("Escriu coses en el teclat, i agafaré només les tecles ");
         printf("0 a 9, A a Z, a a z i espai en blanc\n");
         scanf("%[ 0-9A-Za-z]", tecles);
         printf("Has escrit %s\n",tecles);
    }

3.3. La funció getchar

Serveix per a captar o posar un sol caràcter del, o en el dispositiu de sortida estàndard. Més endavant veurem com s'utilitzen, encara que ja hem vist la funció getchar al capítol 1 pregunta 3.1.3.
 

3.4. Les funcions gets i puts

Aquestes funcions serveixen per llegir i escriure cadenes de caràcters en el dispositiu estàndard. Només accepten un argument (una cadena de caràcters) i són una bona alternativa a scanf i printf per la lectura i escriptura de cadenes.
 
#include <stdio.h>

int main(void)
{
     char linia[80];

     printf("Escriu una línia de text\n");
     gets(linia);
     puts(linia);

     return 0;
}

3.5. Exercicis.

  1. Fes un programa que ens demani l'edat i que ens digui per pantalla quants anys tindrem l'any 2.000.
  2. Fes un programa que ens demani el radi d'una circumferència i ens digui qual és la seva longitud i superfície.
  3. Fes un programa que ens demani el nom l'edat i l'alçada i ens contesti amb una frase "Et dius", nom, "tens ",edat,"anys i "la teva alçada és "alcada.
  4. Un programa ens demana un número sencer i ens diu qual és la seva representació en base 8 i després en base 16.
  5. Un programa ens demana un número sencer en base 16 i el converteix per panta-lla en un número en base 10 i en base 8.
  6. Un programa ens demana els diners de tres persones i després ens contesta amb una frase que diu "Entre tots tres teniu ",Pts,"Pts". ' Fes un programa que demani el nom però que solament admeti lletres majúscu-les. "
  7. Fes un programa de la teva invenció però has d'utilitzar les funcions gets i puts per fer l'entrada de variables de tipus cadena de caràcters.