Programació en C del PIC 16F690 amb PICkit 2

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Sentències

A continuació tenim un resum de les sentències disponibles. Per a informació completa, podeu consultar qualsevol manual de llenguatge C; per exemple aquest.

Les sentències permeten variar el que fa el programa depenent d'unes condicions. Hi ha sentències que permeten triar entre una acció o una altra i sentències que permeten repetir les accions.

Sentència if

Permet fer una acció només si es cumpleix una condició. Per exemple el tros següent:

	if (a == b)
		m = 10;
	k = 1;

El valor de m només variarà si a és igual a b, en cas contrari es saltarà la línia i m no canviarà. En qualsevol cas, k serà modificat sempre.

És important veure que després de cada acció sempre hi va un punt i coma, però no després de les sentències.

És possible fer diverses accions en una mateixa sentència if, però llavors cal emprar els agrupadors { i }, com en el cas següent:

	if (a == b)
		{
		m = 10;
		n = 2;
		}
	k = 1;

En aquest cas els valors de m i n només canviaran si la condició es cumpleix.

Fixem-nos que hem fet un indentat en les línies que estan dins de la sentència if. Això ho fem per ajudar-nos a seguir el programa però el compilador no es fixa en aquests indentats.

Sentència if ... else

Permet fer una acció si es cumpleix una condició i una altra acció si la condició no és certa. Per exemple el tros següent:

	if (a == b)
		m = 10;
	else
		m = 5;
	k = 1;

En aquest cas el valor de m passarà a ser 10 si la condició es cumpleix i 5 si no es cumpleix. k sempre passarà a valer 1.

Encadenament de sentències if ... else

Les sentències if ... else es poden encadenar, com en el cas següent:

	if (a == b)
		m = 10;
	else if (j != h)
			m = 5;
		else
			m = 0;
	k = 1;

En aquest cas el valor de m passarà a ser 10 si la condició a == b es cumpleix. Si no es complís, s'avaluaria la segona comparació j != k i si el resultat fos cert m passaria a ser 5 i si no fos cert passaria a ser 0.

Si en un if ... else hi ha una part en la que no s'ha de fer res, podem deixar una acció buida.

	if (a == b)
		;
	else if (j != h)
			m = 5;
		else
			m = 0;
	k = 1;

En el cas que això correspongui a un else, podem suprimir-lo:

	if (a == b)
		m = 10;
	else if (j != h)
			m = 5;
	k = 1;

Sentències if dins de sentències if

Hi pot haver sentències if (o sentències if ... else) dins d'altres sentències if. Per exemple:

	if (a == b)
		if (j != 0)
			m = 10;
	k = 1;

O també:

	if (a == b)
		if (j != 0)
			m = 10;
		else
			m = 5;
	else
		m = 0;
	k = 1;

Fixem-nos que si no hem posat tots els else, podem dubtar si un d'ells correspon a un if o a un altre. Recordem que al compilador els indentats no li diuen res. Sempre l'else correspondrà a l'if més proper però potser és millor fer servir { } per evitar equivocar-nos nosaltres en casos com aquest:

	if (a == b)
		{
		if (j != 0)
			m = 10;
		}
	else
		m = 0;
	k = 1;

O aquest:

	if (a == b)
		{
		if (j != 0)
			m = 10;
		else
			m = 5;
		}
	k = 1;

Operador condicional

És una manera molt compacta de fer una bifurcació. Per exemple, la línia següent:

	a == b ? m = 10 : m = 5;

S'avalua el que hi ha a l'esquerra de l'interrogant, si el resultat és cert (diferent de 0) es fa el que hi ha entre l'interrogant i els dos punts i si és fals es fa el que hi ha a la dreta dels dos punts. En l'exemple, si a i b són iguals m passarà a valer 10; en cas contrari passarà a valer 5.

Bucle while

Fa una acció mentre es cumpleixi una condició. Per exemple:

	while ( a != 0 )
		a--;
	k = 0;

En aquest cas s'avalua el que hi ha al parèntesi, si es cumpleix (a no és 0) es fa l'acció (decrementar a) i es torna a mirar la condició. Quan no es cumpleixi (a és 0) es passa a la instrucció següent (es modifica k).

Fixem-nos que si la condició ja és falsa d'entrada, l'acció no es farà cap vegada.

Fent servir { } podem fer accions complexes. Si durant l'execució del bucle la condició no canvia, el programa no sortirà del bucle. Un cas particular d'això és el programa principal dels microcontroladors que normalment és de l'estil:

	while (1)
	{
	...
	}

I com la condició sempre val 1, el bucle es repeteix indefinidament.

Bucle for

L'estructura for repeteix un conjunt d'instruccions un nombre predeterminat de vegades. Cal una variable que compti les iteracions. La forma de l'estructura for és la següent:

for (inicialització; condició; modificació){
	// Instruccions que es fan tants cops com es repeteix el bucle
}

A la inicialització declarem una variable que sol ser entera i la inicialitzem a un cert valor. La condició indica què s'ha de complir per tal que el bucle es repeteixi. Si la condició no és compleix el bucle es deixa d'executar i el programa segueix a continuació. La modificació sol ser un increment o un decrement de la variable. Una forma típica seria la següent:

for (int k = 1; k < 11; k++){
	// Instruccions que es fan tants cops com es repeteix el bucle
}
// Instruccions que es fan quan la condició del for ja no és certa

Aquest bucle es repetirà deu cops. En el primer cop k valdrà 1 i en el darrer valdrà 10. Podem fer servir la variable k dins el bucle.

Està pensat per repetir una acció (o més d'una) un nombre determinat de cops. Per exemple, el següent programa calcula el factorial del número guardat a la variable n i el deixa a f:

	for (f = 1, j = n; j > 0; j--) {
		f *= j;
	}

Inicialment f val 1. Mentre j sigui diferent de 0, anirà multiplicant f per j i decrementarà j. Aquest bucle seria equivalent a:

	f = 1;
	j = n;
	while ( j > 0 )
	{
		f *= j;
		j--;
	}

En els tres termes hi podem posar el que vulguem,per exemple:

	for (f = 1; j > 0; a--) 

Però llavors nosaltres serem responsables de que la relació entre les variables f, j i a sigui raonable i el bucle funcioni i tingui sentit.

Bucle do ... while

És similar al bucle while però ara la condició es comprova al final i, per tant, l'acció es fa, com a mínim, una vegada. Per exemple:

	do
		a--;
	while ( a != 0 );

Fixem-nos que en aquest cas cal posar un punt i coma en la línia del while. El motiu és que si no hi fos es podria confondre amb una sentència while normal.

Modificació del flux normal d'un bucle

Dins un bucle podem fer servir les sentències break i continue per trencar el funcionament del bucle.

La sentència break interromp el funcionament del bucle (encara que no s'hagi acabat) i salta a la primera instrucció després del bucle.

La sentència continue surt de la iteració actual del bucle i passa a l'inici de la següent.

Sentència goto

En principi, quan es fa programació estructurada no es fa servir la sentència goto ja que dificulta seguir el funcionament del programa. Però la sentència existeix i es pot fer servir. Per exemple:

	f = 1;
	j = n;
	if ( m > 0 )
		goto Lloc
	f = j +1;
	a += 6;
Lloc:
	w = 3;

En aquest cas, si es cumpleix la condició (m > 0) es salten dues línies i es segueix a partir de l'etiqueta Lloc. Fixem-nos que després de l'etiqueta hi van dos punts.

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.