Capítol 4
Estructures de control de flux del programa
-
Els cicles de tipus for.
-
El format més simple del bucle for (i comú
a tots els llenguatges).
-
Variació dels increments en els cicles for.
-
Altres formats per a la instrucció for.
-
Es poden comptar caràcters en lloc de números.
-
La condició de sortida pot ser distinta i no
comprovar el comptador.
-
En la tercera part pot utilitzar-se qualsevol expressió
vàlida.
-
Pot suprimir-se qualsevol de les tres entrades de for.
-
No és necessari que la primera expressió
inicialitzi una variable
-
Bucles en els que és repeteixen varies accions
d'un cop.
-
Els cicles tipus while.
-
Els comptadors i els acumuladors.
-
Els bucles do while <expressió>
-
EXERCICIS
4.1. Els cicles de tipus for.
En aquest tipus de bucles es coneixen el número de vegades que s'han
de repetir algunes accions. En llenguatge C el format d'aquesta instrucció
és bastant lliure encara que en la major part dels llenguatges aquest
format és únic.
4.1.1- El format més simple del bucle for (i comú a tots
els llenguatges).
Observa el següent programa:
Programa |
Sortida per pantalla |
#include <stdio.h>
int main(void)
{
int i;
for (i=1; i<11; i++)
printf("%d.-Vaca s'escriu amb v\n",i);
return 0;
} |
1.-Vaca s'escriu amb v
2.-Vaca s'escriu amb v
3.-Vaca s'escriu amb v
4.-Vaca s'escriu amb v
5.-Vaca s'escriu amb v
6.-Vaca s'escriu amb v
.......................
10.-Vaca s'escriu amb v |
La instrucció for fa que s'executi la instrucció printf
varies vegades. Veiem de quina manera:
La part de control del bucle for és (i=1; i<11; i++) que es
composa de tres parts:
-
La primera, i=1, dona valor inicial a la variable de control.
-
La segona és una condició, i<11, controla la sortida del
bucle, és a dir que quan la condició no es compleix deixarà
d'executar-se la instrucció printf i el programa continuarà
en la següent instrucció, fora del bucle.
-
La tercera, i++, fa que s'incrementi o decrementi la variable de control,
en aquest cas s'incrementa d'un en un.
4.1.2.- Variació dels increments en els cicles for.
En el control dels bucles té molta importància els increments.
Si observes els següents tres programes veuràs que les fórmules
incrementals son distintes:
i=i+2 |
Incrementa de dos en dos i fa que s'escriguin els números senars. |
i-- |
Fa que i decrementi el seu valor d'un en un. S'escriuen els números
en ordre invers. |
i=i*2 |
Fa que l'increment es realitzi en progressió geomètrica. |
int i;
for (i=1; i<6; i=i+2)
printf("Senar: %d\n",i);
return 0; |
int i;
for (i=5; i>0; i--)
printf("Al contrari %i\n",i);
return 0; |
int i;
for (i=1; i<64; i=i*2)
printf("Potència de 2= %i\n",i);
return 0; |
Senar 1
Senar 3
Senar 5
Senar 7
Senar 9 |
Al contrari 5
Al contrari 4
Al contrari 3
Al contrari 2
Al contrari 1 |
Potència de 2 = 2
Potència de 2 = 4
Potència de 2 = 8
Potència de 2 = 16
Potència de 2 = 32 |
4.1.3.- Altres formats per a la instrucció for.
4.1.3.1.- Es poden comptar caràcters en lloc de números.
Observa el programa següent i la seva sortida per pantalla:
Programa |
Sortida per pantalla |
#include <stdio.h>
int main(void)
{
char ch;
for (ch='a'; ch<='z'; ch++)
printf("El codi ASCII de %c és
%d\n",ch,ch);
return 0;
} |
El codi ASCII de a és 97
El codi ASCII de b és 98
El codi ASCII de c és 99
El codi ASCII de d és 100
. . . .
El codi ASCII de x és 120
El codi ASCII de y és 121
El codi ASCII de z és 122 |
4.1.3.2.- La condició de sortida pot ser distinta i no comprovar
el comptador:
Observa els dos següents programes que tenen la mateixa sortida per
pantalla:
Programa |
Sortida per pantalla |
#include <stdio.h>
int main(void)
{
int i;
for (i=1; i<=10; i++)
printf("El quadrat de %d és %d\n",i,i*i);
return 0;
} |
El quadrat de 1 és 1
El quadrat de 2 és 4
El quadrat de 3 és 9
....................
El quadrat de 10 és 100 |
Programa |
Sortida per pantalla |
#include <stdio.h>
int main(void)
{
int i;
for (i=1; i*i<=100; i++)
printf("El quadrat de %d és %d\n",i,i*i);
return 0;
} |
El quadrat de 1 és 1
El quadrat de 2 és 4
El quadrat de 3 és 9
....................
El quadrat de 10 és 100 |
El primer programa utilitza la condició de sortida i<=10,
és a dir com a comptador. El segon utilitza la condició de
sortida i*i<=100 que és totalment diferent.
4.1.3.3.- En la tercera part pot utilitzar-se qualsevol expressió
vàlida.
Programa |
Sortida per pantalla |
#include <stdio.h>
int main(void)
{
int x;
int y = -1;
printf("Punts de la recta y=2x-3\n");
printf("x ¦ y\n");
printf("--+--\n");
for (x=1; x<=5; y=++x*2-3)
printf("%d ¦ %d\n",x,y);
return 0;
} |
x|y
--+--
1|-1
2|1
3|3
4|5
5|7 |
4.1.3.4.- Pot suprimir-se qualsevol de les tres entrades de for
Si posem for( ; ; ) tindrem un cicle infinit. Com veus has de tenir cura
de posar els punts i coma. També has de tenir cura de posar dins
del bucle instruccions que facin que s'acabi.
4.1.3.5.- No és necessari que la primera expressió inicialitzi
una variable
Programa |
Sortida per pantalla |
#include <stdio.h>
int main(void)
{
int numero;
for (printf("Comenci a escriure números\n"); numero
!= 6;)
scanf("%d", &numero);
printf("Aquest és el que volia\n");
return 0;
} |
Comenci a escriure números
2
10
4
8
6
Aquest és el que volia |
4.1.4.- Bucles en els que és repeteixen varies accions d'un cop.
Normalment en un bucle s'han de repetir varies accions. Per exemple si
volem que ens pregunti cinc vegades per un número i ens escrigui
el doble, triple, quadrat i cub del número haurem d'escriure un
programa com el següent:
Programa |
#include stdio.h>
void main(void)
{
int i,j;
for (i=1;i<=5;i++)
{
printf("Entra un nombre sencer ");
scanf("%d",&j);
printf("Nombre Doble Triple Quadrat
Cub\n");
printf("%6d%8d%8d%8d%8d\n",j,j*2,j*3,j*j,j*j*j);
printf("\n");
}
} |
4.2.- Els cicles tipus while.
Aquest tipus de bucles s'utilitzen per repetir accions quan no se sap el
número de iteracions del programa. Suposem que volem un programa
que ens demani un per un la mida d'un radi fins que aquesta sigui negativa.
El programa ens contestarà amb la longitud i superfície de
la circumferència:
Programa |
#include stdio.h>
#define pi 3.1416
void main(void)
{
float radi = 1;
while (radi>0)
{
printf("Entra un la mida del radi ");
scanf("%f",&radi);
printf("Longitud de la circumferència:
%f\n", 2*pi*radi);
printf("Superfície de la circumferència:
%f\n",pi*radi*radi);
}
} |
Com podem veure la sentència és de la forma:
while (expressió certa)
sentència
4.2.1.- Els comptadors i els acumuladors.
Quan un cicle while és realitza pot ser interessant conèixer
el número de vagades que s'executa. Observa el següent programa:
Programa |
#include stdio.h>
void main(void)
{
int comptador = 0;
int aresta = 10;
while (aresta != 0)
{
printf("Introdueix la mida de l'aresta
d'un cub ");
scanf("%d",&aresta);
printf("El volum del cub és %d\n\n",aresta*aresta*aresta);
comptador = comptador +1;
}
printf("Has demanat %d volums\n",comptador);
}
} |
Les accions contingudes dins del bucle while és realitzen mentre
que la variable aresta sigui distinta de 0. Cada vegada que s'executa el
cicle s'afegeix un 1 a la variable comptador.
En el següent programa, a més d'un comptador hi ha un sumador.
El programa demana números i els afegeix a la variable sumador.
El cicle s'atura quan l'usuari vol
Programa |
#include stdio.h>
void main(void)
{
int sumador = 0;
int comptador = 0;
int numero;
char ch='s';
while ((ch != 'n') && (ch != 'N'))
{
printf("Introdueix un numero ");
fflush(stdin);
scanf("%d",&numero);
comptador = comptador + 1; sumador =
sumador + numero;
printf("Has acumulat %d al sumador\n",sumador);
printf("Vols sumar més números?
(s/n) ");
fflush(stdin);
scanf("%c",&ch);
}
printf("Has sumat %d números\n",comptador);
printf("El resultat de la suma és %d\n",sumador);
} |
4.2.2- Els bucles do while <expressió>
Observa l'exemple següent
Programa |
/* Programa que calcula mitjanes aritmŠtiques
de números entrats per teclat */
#include <stdio.h>
main()
{
float NumeroIntroduit;
float Sumador = 0;
float Comptador = 0;
char AltreNumero;
printf("Càlcul de mitjanes aritmètiques\n");
do
{
printf("Dona'm un número ");
fflush(stdin);
scanf("%f",&NumeroIntroduit);
Sumador = Sumador + NumeroIntroduit;
Comptador++;
printf("Vos algun número més? (s/n) ");
fflush(stdin);
scanf("%c",&AltreNumero);
} while (AltreNumero=='s');
printf("La mitjana aritmètica és %f", Sumador/Comptador);
return 0;
} |
Com veuràs la sentencia de control del bucle està al final.
S'executarà fins que la condició de sortida sigui certa.
Aquest bucle és realitza al menys una vegada sempre. L'altre bucle
while pot no realitzar-se cap vegada.
4.3.-EXERCICIS
-
L'ordinador fa el sorteig d'un número entre el 0 i el 10. Després
ens demana quin número ha sortit fins que ho encertem.
-
Millora el programa anterior de manera que ens digui quantes vegades hem
fet per encertar el número.
-
Un programa demana números sencers positius fins que s'escriu el
número 32300. Després de donar-li cada número el programa
ens diu si és parell o senar.
-
En una classe de 20 alumnes fem un programa per sumar els diners de butxaca
de tots els alumnes.
-
El programa anterior el fem ara per a un número indeterminat d'alumnes.
-
Un programa fa el sorteig d'un número N i després escriu
N aes.
-
Un programa fa el sorteig d'un número entre 1 i 1000. Després
ens demana per un número fins que ho encertem. Per facilitar la
recerca dona una pista cada vegada que consisteix en dir a l'usuari si
el número entrat és major o menor que el sortejat.
-
Millora el programa anterior de manera que al final ens informi de quantes
vegades hem fet per encertar el número.
-
Un programa suma els números 1 al 100.
-
Millora el programa anterior per que ens demani en que número volem
acabar la suma.
-
Un programa demana un número petit (1,...,6) i després ens
multiplica els números que és troven entre l'1 i el número
entrat. Després ens informa del resultat.
-
Un programa genera 10 números aleatoris entre 1 i 100. Cadascun
és presentat en pantalla i acumulat de manera que al final ens informa
de la suma total.
-
Millora el programa anterior de manera que després de cada sorteig
el programa demana a l'usuari si vol més números, i així
és l'usuari qui decideix el número de vegades que és
fa el sorteig.
-
Millora el programa anterior de manera que el programa ens digui la mitjana
aritmètica dels números que han sortit.
-
Un programa fa el sorteig de dos números del 0 al 10 i ens demana
pel dos números fins que els encertem. Després ens diu cuantes
vegades hem fet per encertar-ho.