Programació en C/Entrada i sortida simple

Jump to navigation Jump to search

Entrada i sortida simple[modifica]

Quan ho penses una mica, un ordinador seria força inútil sense alguna manera de parlar amb la gent que l'utilitza. Igual com nosaltres necessitem informació per acomplir tasques, també els ordinadors. I de la mateixa manera que donem informació als altres perquè puguin fer tasques, també els ordinadors.

Aquests subministraments i retorns d'informació a un ordinador s'anomenen entrada i sortida. 'Entrada' és informació donada a un ordinador o a un programa. 'Sortida' és informació proporcionada per un ordinador o programa. Freqüentment, els programadors informàtics parlen amb el terme més general entrada/sortida, o simplement, I/O.

A C, hi ha moltes maneres diferents per a un programa de comunicar-se amb l'usuari. Sorprenentment, els mètodes més simples normalment ensenyats als programadors principiants també poden ser els més poderosos. En l'exemple "Hola, Món" al començament d'aquest text, se'ns introduïa a un arxiu de Biblioteca Estàndard stdio.h, i una de les seves funcions, printf(). Aquí parlem de més de les funcions que stdio.h ens dóna.

Sortida emprant printf()[modifica]

Tornant al començament d'aquest text, el programa de demostració duplicat mes avall:

#include <stdio.h>

int main(void)
{
  printf("Hola,món!\n");
  return 0;
}

Si compiles i executes aquest programa, vorà la sentència d'avall aparèixer a la seva pantalla:

Hola,món!

Aquest acompliment sorprenent s'ha aconseguit utilitzant la funció printf(). Una funció és com una "caixa negra" que li fa alguna cosa sense exposar el que hi ha al seu interior. Podem escriure funcions nosaltres mateixos a C, però això ho cobrirem més tard.

Ha vist que per utilitzar printf() es posa text, envoltat per cometes, entre els parèntesis. Anomenem el text envoltat per cometes un string (en Anglès, "cadena") literal (o només un string), i anomenem aquesta string un argument a printf.

Com a nota d'explicació, és a vegades convenient incloure parèntesis de obertura i tancament després d'un nom de funció per recordar-nos que és, en efecte, una funció. Tanmateix normalment quan el nom de la funció de què estem parlant s'entén, no és necessari.

Com pot veure en l'exemple a dalt, utilitzanr printf() és tan simple com el teclejar una mica de text, envoltat per cometes (fixi's que aquests són cometes i no dues cometes senzilles). Així, per exemple, pot imprimir qualsevol string posant-lo com a argument a la funció de printf():

printf("Aquesta sentència es mostrarà exactament com la veu...");

I una vegada es posi en una funció main(), es mostrarà:

Aquesta sentència es mostrarà exactament com la veu...


Mostrant nombres i seqüències d'escapada[modifica]

Codis amb marcadors de posició[modifica]

La funció printf és una funció poderosa, i és probablement la funció més utilitzada en programes C.

Per exemple, anem a mirar un problema. Diguem que no sabem quant son 1905 + 31214. Utilitzem C per aconseguir la resposta.

Comencem a escriure:


#include <stdio.h> /* this is important, since printf 
                    * can not be used without this line */

(Per a més informació sobre la recta de dalt, vegeu El Preprocessador).


int main(void)
{
   printf("1905+31214 són: ");
   return 0;
}

però aquí ens quedam travats! printf només imprimeix strings! Afortunadament, printf té mètodes per mostrar nombres. El que fem es posa un codi amb un format especial, anomenat marca de posició, dins la string. Escrivim:

printf("1905+31214 són %d", 1905+31214);

El marcador de posició, literalment "marca la posició" de a on es posará el nombre que és el resultat de 1905+31214.

Aquests marcadors de posició s'anomenen especificadors de format. Molts altres especificadors de format s'empren amb printf. Si tenim un nombre en punt flotant, podem utilitzar %f per imprimir un nombre de punt flotant, en punt decimal i més. Aquí hi ha una llista incompleta:

  • %i and %d - int
  • %f - float
  • %lf - double
  • %s - string
  • %x - hexadecimal

Una llista més completa és en la secció E/S d'arxius.

Tabuladors i nova línea[modifica]

Si volem aconseguir una sortida que sembli com:

1905 
31214 +
-----

printf no farà el retorn de carro per anar a la següent línea al final de cada sentència: ho hem de fer nosaltres. Com?

El que podem fer és usar el caràcter d'escapada de línea nova. Un caràcter d'escapada és un caràcter especial que podem escriure però farem alguna cosa especial a la pantalla, com fer un soroll, escriu un tabulador, etcètera. Per escriure una nova línea escrivim \n. Tots els caràcters d'escapada comencen amb una barra invertida.

Per aconseguir la sortida de dalt, escrivim:

printf(" 1905\n31214 +\n-----\n%d", 33119);

o per estar una mica més segurs, podem trencar aquesta declaració de printf llarga sobre unes quantes línies. Així el nostre programa serà:

#include <stdio.h>

int main(void)
{
   printf(" 1905\n");
   printf("31214 +\n");
   printf("-----\n");
   printf("%d", 33119);
   return 0;
}

Hi ha uns altres caràcters d'escapada que podem utilitzar. Un altre de comú és utilitzar \t per escriure un tabulador. Pot utilitzar \a per fer sonar el timbre de l'ordinador, però no hauria d'utilitzar aquest molt molt en els seus programes, ja que l'ús excessiu de so no és gaire amistós per l'usuari.

Altres mètodes de sortida[modifica]

puts()[modifica]

La funció de puts() és una manera molt simple d'enviar una string a la pantalla quan no té hi ha cap marcador de posició pel qual preocupar-se. Funciona de forma molt parescuda a com ho fa la funció printf() que vam veure a l'exemple de "Hola, món!":

puts("Mostra aquesta string.");

mostrarà en pantalla:

Mostra aquesta string.

seguit pel caràcter de nova línea (de la manera que hem dit a dalt). (La funció puts afegeix un caràcter de newline a la seva sortida.) La funció fputs és similar:

fputs("Print this string via fputs", stdout);

ho posara al arxiu stdout (normalment la pantalla):

Print this string via fputs

sense un caràcter de nova línea afegit al final.

Ja que el puts() i fputs() no permeten els marcadors de posició i la formatació associada que printf() permet, per la majoria dels programadors aprendre printf() és suficient per les seves necessitats.

Entrada emprant scanf()[modifica]

La funció scanf() és el métode d'entrada equivalent a la funció de sortida printf() - simple però eficaç. En la seva invocació més simple, la string de format de scanf() té un únic marcador de posició que representa el tipus de valor que s'introduirà per l'usuari. Aquests marcadors de posició són exactament els mateixos que la funció de printf() - %d per a ints, %f per a floats, i %lf per a dobles.

Hi ha, tanmateix, una diferència a scanf() en comparació amb printf(). La funció de scanf() exigeix l'adreça de memòria de la variable a la qual vol salvar el valor d'entrada. Mentre que els punters són possibles aquí, això és un concepte que no s'enfocarà fins a més tard en el text. En canvi, la tècnica simple és utilitzar l'operador "adreça de", &. Per ara pot ser millor considerar això "màgia" abans que parlem de punters.

Una aplicació típica podria ser aquesta:

#include <stdio.h>
   
int main(void) 
{
  int a;

  printf("Please input an integer value: ");
  scanf("%d", &a);
  return 0;
}

Si està provant a introduir una string utilitzant scanf, no hauria d'incloure l'operador &.

Si hagués de descriure l'efecte de la crida de la funció scanf a dalt, es podria llegir com: "Llegeixi un enter des de l'usuari i emmagatzemi'l en l'adreça de variable a ".

Nota de precaució en entrades: Quan les dades s'escriuen en un teclat, la informació no se'n va directament al programa que s'està executant. S'emmagatzema primer en el que es coneix com a buffer quantitat petita de memòria intermèdia reservada per a la font d'entrada. A vegades hi haurà dades deixades en la memòria intermèdia quan vol el programa llegir des de la font d'entrada, i la funció scanf() llegirà aquestes dades en comptes d'esperar que l'usuari escrigui alguna cosa. Per evitar això, és possible escriure la declaració fflush(stdin), que netejarà la memòria intermèdia, abans d'emprar scanf.