Enrere Mòdul 3
Fonaments de Programació. Llenguatge C/C++---
Pràctica  Resum teòric Exercicis
Pràctica d'ampliació

 
Totes les parelles

En molts casos, els bucles es fan servir per recórrer tots els casos possibles d'una situació concreta. En aquesta pràctica veurem com formar totes les parelles possibles de valors de dues variables diferents.

 

Desenvolupament de la pràctica

Creeu un nou arxiu del tipus C anomenat m3p07.c i escriviu el següent codi:

Aquest programa és un exemple típic d'ús de bucles encaixats. Es tracta de formar totes les parelles possibles d'un conjunt de n elements. Farem els tres casos següents:

  • Amb repetició i important l'ordre
  • Sense repetició, però sense importar l'ordre
  • Sense repetició, però important l'ordre

El primer cas correspon al que es coneix com variacions amb repetició d'n elements d'ordre 2 i el nombre total d'aquestes són n2.

El segon cas correspon a les variacions sense repetició d'n elements d'ordre 2 i el nombre total d'aquestes són: n·(n-1).

El tercer cas correspon a les combinacions d'n elements d'ordre 2 i el nombre total d'aquestes és n·(n-1)/2.

Definiu un projecte nou anomenat m3p07 i afegiu-li un arxiu de font C/C++ anomenat m3p07.cpp. Escriviu el següent codi:

//m3p07.c - Totes les parelles. Variacions i combinacions -

#include <stdio.h>

int main(){

  int n; //nombre d'elements
  int vr,va,co; //comptadors de variacions i combinacions
  int ct1,ct2; //comptadors dels bucles

  system("clear");

  printf("introduïu el nombre n d'elements...");
  scanf("%d",&n);

  //variacions amb repetició
  vr=0;printf("\n\nvariacions amb repetició\n");
 
  for (ct1=1;ct1<=n;ct1++){
    for(ct2=1;ct2<=n;ct2++){
      vr++;
      printf("vr%d:(%d, %d)\t",vr,ct1,ct2);

    }
  }

  //variacions sense repetició
  va=0;printf("\n\nvariacions sense repetició\n");
 

  for (ct1=1;ct1<=n;ct1++){
    for(ct2=1;ct2<=n;ct2++){
      if(ct1-ct2){
        va++;
        printf("va%d:(%d, %d)\t",va,ct1,ct2);
      }
    }
  }


//combinacions
  co=0;printf("\n\ncombinacions\n");

  for (ct1=1;ct1<n;ct1++){
    for(ct2=ct1+1;ct2<=n;ct2++){
      co++;
      printf("co%d:(%d, %d)\t",co,ct1,ct2);
    }
  }
return 0;
}

 

 

 

Captura de l'execució del programa.

 

 

 

Explicació del programa

En el primer cas,

    //variacions amb repetició

    vr=0;printf("\n\nvariacions amb repetició\n");

    for (ct1=1;ct1<=n;ct1++){

        for(ct2=1;ct2<=n;ct2++){

            vr++;
            printf("vr%d:(%d, %d)\t",vr,ct1,ct2);

        }

    }

s'ha utilitzat un doble bucle encaixat amb dues variables comptadores (ct1 i ct2) que recorren, cada una de elles i de forma independent, tots els valors des d'1 fins a n .

En el segon cas, 

    //variacions sense repetició

    va=0;printf("\n\nvariacions sense repetició\n");

    for (ct1=1;ct1<=n;ct1++){

        for(ct2=1;ct2<=n;ct2++){

            if(ct1-ct2){

                va++;

                printf("va%d:(%d, %d)\t",va,ct1,ct2);

            }

        }

    }

s'ha afegit en el cos del bucle una sentència condicional if per tal de detectar les repeticions i saltar-les. Si ct1=ct2, la condició ct1-ct2 serà falsa i no entrarà dintre del bloc.

En el tercer cas, 

    //combinacions

    co=0;printf("\n\ncombinacions\n");

    for (ct1=1;ct1<n;ct1++){

        for(ct2=ct1+1;ct2<=n;ct2++){

            co++;

            printf("co%d:(%d, %d)\t",co,ct1,ct2);

        }

    }

com que els elements de la parella no es poden repetir, s'ha triat que el primer element és el més petit, i va des de 1 fins n-1 i el segon element, que serà el més gran, va des de ct1+1 fins a n.