(Molt) Breu resum de C


Toni Baeza

darrera modificació: 5 de maig de 2003

Índex

Introducció
Estructura d'un programa en C
Tipus de dades
Ús de les funcions printf i scanf
Operadors aritmètics, relacionals i lògics
Condicionals (if)
Bucles while i do/while
Bucles for
Ús de fitxers
Funcions
Bibliografia

Introducció

En aquesta pàgina trobareu un breu resum de les coses més importants que estudiem a les classes de pràctiques. L'objectiu és que pugueu trobar la informació que necessiteu de forma ràpida. Per supost és recomanable tindre a la mà un bon manual de C, per exemple els que he posat a la bibliografia. El que pose al manual sempre preval sobre el que pose a aquestes notes. El que recomane és que mireu primer aquí, i si no trobeu el que busqueu, mireu el manual.

Estructura d'un programa en C


De forma genèrica un programa en C senzill té l'estructura següent:


#include<stdio.h>
#include<stdlib.h>

main()
{

    cos del programa

}



Les sentències

#include<stdio.h>
#include<stdlib.h>

són imprescindibles si volem que el programa escriga algo per pantalla o siga capaç de llegir dades. Com que sempre necessitarem això, doncs no li peguem més voltes, cal ficar-les sempre.

main és el nom de la funció principal de qualsevol programa en C. El que fiquem entre les claus d'obrir i tancar serà el que faça el programa quan l'executem.

De fet ja us haureu adonat de que el compilador ja posa un codi semblant a eixe quan obrim un fitxer nou ... quina intel·ligència!

Com a exemple podeu mirar (i executar) el programa hola.c, un dels més senzills que es podem imaginar.


Tipus de dades

Els tipus de dades simples que ens interessen de moment són:

TIPUS                              EN C ES DIU ...

número enter                         int
número real                           float

Per a declarar una variable d'un cert tipus posarem primer el tipus i després el nom que volem donar-li a la variable, per exemple:

int a;
float x;


Una variable es un troç de memoria al qual li donem un nom i dins del qual podem ficar un numero del tipus especificat. Els numeros que fiquem dins poden canviar al llarg de l'execucio del programa.

Podem asignar valors a les variables amb el signe =. Per exemple

a=3;
x=1.2;


Si posem eixes línies dins d'un programa tindriem el programa següent, que és perfectament inútil:

#include<stdio.h>

main()
{
 int a;
 float x;


 a=3;
 x=1.2;

}


El que fa el programa anterior es declarar dues variables, un enter (a) i un real (x) i ficar els valors 3 i 1.2 dins d'elles.

Vectors

Un vector (de números) és una renglera de números a la qual ens podem referir amb un sol nom. Per a declarar-lo s'utilitza la sintaxi:

tipus nom[dim];

Tipus pot ser int o float, el nom és el que volem que tinga al programa, i dim és el nombre d'elements que volem que tinga el vector.


Si declarem, per exemple

int a[3];

significa que al nostre programa tenim un vector de 3 elements. Cada element és un número enter al qual ens podem referir de la següent manera:

a[0] és el primer element
a[1] és el segon element
a[2] és el tercer element

Noteu que no existeix un element a[3]. Els índex van des de zero fins a dim-1.


Ús de les funcions printf i scanf


Normalment voldrem fer alguna cosa amb les dades que tinguem, i després voldrem que el programa ens torne per pantalla el resultat de les operacions que hem fet. A més a més voldríem que el programa ens demanara les dades que necessita per a treballar. Comencem amb un programa conegut: hola.c

#include<stdio.h>

main()
{
 printf("\nHola mundo\n");
}


El resultat de l'execució del programa és que apareix a la pantalla la frase Hola Mundo. Vegem que apareixen dos "\n". Això són comandaments que seveixen per a donar forma al text que volem mostrar. els més importants són "\n" que fica un salt de lìnia i "\t", que fica un tabulador (desplaça el text cap a la dreta).

Mireu i executeu els programes ex_printf1.c i ex_printf2.c. No us espanteu amb tant de "\n" i "\t". si enteneu eixos dos programes ja sabeu el 50% del que cal saber de printf.

Quin és l'altre 50%?. Suposeu que volem escriure coses més sofisticades, com ara "el resultat de la suma és 12". Volem imprimir resultats de l'execució del programa, així que no podem ficar un text entre cometes i ja està.

La funció printf permet imprimir variables. L'únic que hem de fer és dir-li el lloc on volem que apareguen (dins d'una frase, per exemple) i el tipus de dades de la variable. Per als tipus que ens interessen hem de ficar, al lloc on volem que aparega la variable, el modificador que toque, segons la taula següent:

TIPUS                 HEM DE FICAR

int             %d
float           %f

Mireu per exemple el programa ex_printf3.c.


Operadors aritmètics, relacionals i lògics

Operador d'assignació

La forma general d'aquest operador és:

variable=expressió

on expressió pot ser un valor o el resultat de fer una certa operació.  El resultat és que la variable de l'esquerra pren el valor de la dreta, o el resultat que done el que es pose a la dreta.

Quan hem parlat de tipus de dades ja hem fet un programa que utilitzava aquest operador. El programa era el següent:

#include<stdio.h>

main()
{
 int a;
 float x;


 a=3;
 x=1.2;

}


Recordeu, el procés és ficar a l'esquerra el de la dreta. Els dos programes següents són semblants, però al final les variables tenen valors diferents:

#include<stdio.h>

main()
{
 
float x,y;

  x=3.5;
 y=1.2;
 x=y;
}

En acabar el programa les dues variables x,y tindran el valor 1.2

#include<stdio.h>

main()
{
 
float x,y;

  x=3.5;
 y=1.2;
 y=x;
}

en aquest cas les dues variables tindran el valor 3.5

Operadors aritmètics

Serveixen per a fer operacions amb variable i números. Els que ens interessen són la suma (+), la resta (-), el producte (*) i la divisió (/).

Si a és una variable entera es poden fer coses com ara:

a=a+3;

El resultat és que al valor que tenia la variable a se li suma 3. Mireu com a exemple el programa operacions.c

Operadors relacionals i lògics

El terme relacional es refereix a les relacions que es poden establir entre valors. el terme lògic es refereix a la forma en què eixes relacions es poden conectar per a crear relacions més complicades. A nosaltres estos operadors ens serviran per a crear condicions que utilitzarem a l'apartat següent (condicionals). El  que ens interessa és saber en quins casos una condició serà certa o falsa.

els operadors relacionals que existeixen en C són:

OPERADOR
ACCIÓ
>
major
<
menor
>=
major o igual
<=
menor o igual
==
igual
!=
distint

alguns exemples trivials podrien ser:

2<3      cert
3>2      cert  (és el mateix :-))
2==3    fals
2!=3     cert

Els operadors lògics serveixen com hen dit per a conectar varies condicions. En C tenim tres:
OPERADOR
ACCIÓ
&&
'i' lògic
|| (AltGr+1)
'o' lògic
!
'no' lògic

Una condició del tipus (cond1 && cond2) serà certe sempre que ho siguen tant cond1 com cond2.
Una condició del tipus (cond1 || cond2) serà certa sempre que ho siga almenys una de les condicions cond1/cond2
Una condició del tipus (! cond) serà certa quan no ho siga cond.

Exemples

2>3 && 5>4        fals
2<3 && 5>4        cert

2>3 || 5>4            cert
2<3 || 5>4            cert

!(2>3)                 cert


Condicionals (if)

Fins ara tots els programes que hem fet s'executaven de forma linial. El programa comença a executar-se per la primera línia de codi cap avall i sempre fa el mateix. El condicionals serveixen per a prendre decisions sobre l'execució del programa. Bàsicament l'objectiu és que un cert troç de codi s'execute sols si es verifica una certa condició. Les condicions que posarem seran del tipus de les estudiades en la secció anterior.

La sintaxi d'un condicional simple és la següent:

if (condicio)
{
  // codi que s'executa si la cndició és certa
}
else
{
 // codi que s'executa si la condició no és certa
}

Un exemple senzill és el programa condic.c

Els condicionals poden arar uns dins d'altres. És a dir, el codi que s'executa al bloc if o al bloc else pot contindre un altre condicional. Mireu per exemlpe el programa condic2.c.


Bucles while i do/while

Els bucles serveixen per a repetir un cert fragment de codi varies vegades escrivint el codi una sola vegada. Els bucles while ens permeten executar un fragment de codi mentre siga certa una condició. La sintaxi és:

while (condició)
{
 // codi a executar mentre siga certa la condició
}

Una cosa important a tindre en compte és que si el codi que está entre les claus no permet que la condició puga canviar el bucle s'executarà fins que aturem l'execució del programa (sempre que inicialment la condició fora certa, clar). Un exemple podria ser el següent, en elcas que ficarem un número negatiu.

#include<stdio.h>
#include<stdlib.h>

int main()
{
 int x;
 printf("\nFica un numero positiu: ");
 scanf("%d",&x);   // llig un numero i el fica a la variable x
 while(x < 0) {
  printf("\nHe dit POSITIU\n");
 }
 system(PAUSE)
 return 0;
}

Si executem el programa i fiquem un numero negatiu, el bucle while s'executarà infinitament, perquè el valor de x no pot canviar, i per tant la condició x < 0 serà certa sempre. El que hem de fer és permetre que el valor de x puga canviar. Per exemple, podem sustituir el bucle while d'abans per el bucle següent:

 while(x < 0) {
  printf("\nHe dit POSITIU\n");
  scanf("%d",&x);  // torna a llegir el valor de x
 }

Un programa semblant el podeu trobar a bucle_while.c

si el que volem és que el codi que hem posat entre claus s'execute un cert numero de vegades podem utilitzar un contador, que no és més que una variable de tipus enter a la qual li donem la funció d'anar contant el numero de vegades que s'executa el bucle. Els programes bucle_while2.c i bucle_while3.c són exemples d'ús de contadors.

Els bucles do/while són semblants als bucles while. La seua sintaxi és:

do
{
 // codi a executar
}while(condicio);

El codi entre claus s'executarà mentre siga certa la condició. Notar que el codi entre claus s'executarà alnenys una volta, donat que la comprovació de la condició es fa al final. El programa bucle_do.c és un exemple que fa el mateix que bucle_while2.c. El programa bucle_do2.c és un exemple en el qual es veu que el codi entre claus s'executa una volta, encara que la condició és falsa.

Bucles for

El bucle for està especialment indicat per a treballar amb contadors. La sintaxi d'un bucle for és la següent:

for(valor_inicial_contador ; condició ; increment)
{
 // codi a executar
}

Per exemple:

for(i=1;i<=10;i=i+1) 

Eixe bucle s'executaria 10 voltes: des de i=1 fins a i=10 anant d'un en un. Mireu el programa bucle_for.c

Un altre exemple senzill de bucle for és el programa suma_10.c


Funcions


Una funció és un troç de codi que realitza una certa funció dins el programa. Un exemple conegut és la funció printf. Quan volem escriure aklguna cosa a la pantalla el que fem és invocar la funció printf, que és la que fa eixa feina.

en general una funció té el format:

tipus nom_funció(arguments)
{
 // instruccions
}

De la mateixa manera que declarem les variables a l'inici del programa hem de declarar les funcions. Les declaracions de funcions van després dels includes i abans del main()

Per exemple, la següent funció admet com a arguments dos números i torna la suma d'eixos números:

float suma(float a, float b)
{
  float c;
  c=a+b;      // calcula la suma d'a i b
 return c;    // la funció retorna (return) e, valor c, que és la suma.
}

Un programa que utilitza la funció anterior podria ser el següent:

#include<stdio.h>
#include<stdlib.h>

float suma(float a, float b);  // declaracio de la funcio. Noteu que acaba en punt i coma

int main()
{
 float s;
 s=suma(2,3);
 printf("La suma de 2 i 3 es: %f",s);
 system("PAUSE");
 return 0
}

float suma(float a, float b)  // definicio de la funcio. Normalment es posa despres de main
{
  float c;
  c=a+b;      // calcula la suma d'a i b
 return c;    // la funció retorna (return) e, valor c, que es la suma.
}

Mireu el programa suma_vec.c, que calcula la suma dels números que hi ha a un vector.


Ús de fitxers


De la mateixa manera que podemm esciure coses a la pantalla i llegir números del teclat podem fer-ho sobre un fitxer que estiga al nostre disc dur o disquet. Per a fer-ho utilitzarem funcions semblants a printf i scanf.

La forma en la qual utilitzarem els fitxers és:

1.- Obrir el fitxer per a llegir o escriure
2.- Llegir o escriure dades
3.- Tancar el fitxer

Bàsicament, el procés és semblant al que s'utilitza per a llegir un llibre

En C els fitxers es gestionen mitjançant variables de tipus FILE. Tot seguit teniu una "recepta" per a utilitzar fitxers.

#include<stdio.h>
#include<stdlib.h>

int main()
{
 FILE *f;
 int x;

 f=fopen("toni.txt","r+");          // per a llegir
 fscanf(f,"%d",&x);
 fclose(f);
}



#include<stdio.h>
#include<stdlib.h>

int main()
{
 FILE *f;
 int x=10;

 f=fopen("toni.txt","w+");          // per a llegir
 fprintf(f,"%d",x);
 fclose(f);
}

Les funcions fscanf i fprintf són iguals a printf i scanf, sols que hem d'inficar el fitxer on s'ha de llegir o escriure, (f als exemples anteriors)

El  fitxer (toni.txt als exemples) deu existir a la mateixa carpeta del disc dur on es trobe el nostre programa

En el cas que s'obriga un fitxer pe a escriure s'esborra el fitxer, si existia i es crea un nou buit.

Mireu per exemple el fitxer suma_vecf.c.


Bibliografia


Si trobeu algun error a estes notes informeu-me al meu e-mail antonio.baeza@uv.es