Índex

 
Capítol04.zip Exerxicis04.zip
Capítol 4

Estructures de control de flux del programa

  1. Els cicles de tipus for.
    1. El format més simple del bucle for (i comú a tots els llenguatges).
    2. Variació dels increments en els cicles for.
    3. Altres formats per a la instrucció for.
      1. Es poden comptar caràcters en lloc de números.
      2. La condició de sortida pot ser distinta i no comprovar el comptador.
      3. En la tercera part pot utilitzar-se qualsevol expressió vàlida.
      4. Pot suprimir-se qualsevol de les tres entrades de for.
      5. No és necessari que la primera expressió inicialitzi una variable
    4. Bucles en els que és repeteixen varies accions d'un cop.
  2. Els cicles tipus while.
    1. Els comptadors i els acumuladors.
    2. Els bucles do while <expressió>
  3. 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:

  1. La primera, i=1, dona valor inicial a la variable de control.
  2. 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.
  3. 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

  1. 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.

  2.  
  3. Millora el programa anterior de manera que ens digui quantes vegades hem fet per encertar el número.

  4.  
  5. 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.

  6.  
  7. En una classe de 20 alumnes fem un programa per sumar els diners de butxaca de tots els alumnes.

  8.  
  9. El programa anterior el fem ara per a un número indeterminat d'alumnes.

  10.  
  11. Un programa fa el sorteig d'un número N i després escriu N aes.

  12.  
  13. 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.

  14.  
  15. Millora el programa anterior de manera que al final ens informi de quantes vegades hem fet per encertar el número.

  16.  
  17. Un programa suma els números 1 al 100.

  18.  
  19. Millora el programa anterior per que ens demani en que número volem acabar la suma.

  20.  
  21. 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.

  22.  
  23. 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.

  24.  
  25. 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.

  26.  
  27. Millora el programa anterior de manera que el programa ens digui la mitjana aritmètica dels números que han sortit.

  28.  
  29. 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.