Enrere Mòdul 5
Fonaments de programació. Llenguatge C/C++---
Exercicis

 

1. Girar tres variables

Feu un programa en el qual es faci servir la funció:

void rota(int *a, int *b, int *c)

Aquesta funció ha de girar els valors de les variables enteres a, b, i c, és a dir: el contingut de a passarà a b, el contingut de b passarà a c i el contingut de c passarà a a. Per exemple, si els valors de a, b i c abans de la crida a la funció són: 

a = 2        b = 3      c = 10

després de la crida haur ande ser:

a = 10      b = 2      c = 3

Evidentment, com que voleu que la funció modifiqui els seus arguments, aquests han de ser punters.

Anomeneu l'arxiu font m5e1.cpp.

 

2. Valor màxim d'un vector

Feu un programa en el qual es faci servir la funció:

 double maxim(double * vector, int grand)

Aquesta funció ha de tornar el màxim del vector de nombres reals (vector) que té (grand) elements del tipus double.

Anomeneu l'arxiu font m5e2.cpp.

 

3. Cercar el Punt_Suma d'un vector de dimensió M per N

S'anomena Punt_Suma d'un vector bidimensional l'element que coincideix amb la suma de la resta d'elements del vector.

 

Per exemple:

 Donada la matriu d'enters A de 3 per 4 (int A[3][4])

5

2

6 7

0

197

1 8

1

7

10 150

en la posició [1][1], que conté l'enter 197, teniu el Punt_Suma que és el que coincideix amb la suma de la resta de cel·les (5 + 2 + 6 + 7 + 0 +  1 + 8 + 1 + 7 + 10 + 150=197).

 

Escriviu un programa que permeti recollir enters per emmagatzemar dins la matriu A de M per N.

 

El programa treballa utilitzant les directives #define per donar la grandària del vector en temps de disseny. Més endavant veureu, amb l'assignació dinàmica de memòria, com donar la mida del vector en temps d'execució:

 

                          #define M 3
                          #define N 4


Escriviu una funció amb el prototipus int Punt_Suma(int B[][N]); que recollirà el vector i retornarà, si existeix, el Punt_Suma.

 

          Anomeneu l'arxiu font m5e3.cpp.

 

4. Transposició d'una matriu nxm

Un dels problemes que es pot plantejar després de fer la pràctica 7 és què passa si la matriu no és quadrada. Això suposa un problema pel fet que no es pot convertir una matriu de dimensió nxm en una matriu de dimensió mxn. Una forma de resoldre aquest problema és fer servir una única dimensió, és a dir, declarar la matriu com:

double a[MAX_FILES*MAX_FILES];

Ara, si anomeneu n al nombre de files i m al nombre de columnes, tot el codi és semblant al de la pràctica canviant: a[i][j]  per a[i*n+j], i canviant n per m a la comprovació del segon bucle. Per exemple, la part del codi que demana els elements de la matriu seria:

  //introducció dels elements de A

    for (i=0;i<n;i++){
        for(j=0;j<m;j++){
            printf("\na[%d,%d]=",i,j);
            scanf("%lf",&a[i*m+j]);
        }
    }

També s'han de fer modificacions a la funció transposada(a,n), afegint-hi un argument que correspongui al nombre de columnes.

Anomeneu l'arxiu font m5e4.cpp.

 

Exercicis complementaris

Aquests exercicis serveixen per completar aquest mòdul, però suposen una ampliació voluntària. No és necessari entregar-los. No obstant això, és convenient fer-los i lliurar-los.

5. Suavització d'un vector

Feu un programa que "suavitzi" un vector introduït per l'usuari/ària. S'entén per suavitzar substituir cada element per la mitjana aritmètica dels elements més propers, és a dir:

 

uS[i]->(u[i-1]+u[i]+u[i+1])/3       si i diferent de 0 i n-1

uS[0]->(u[0]+u[1])/2

uS[n-1]=(u[n-2]+u[n-1])/2

 

Per exemple, el vector u de la primera columna d'aquesta taula s'ha convertit en el vector uS de la segona columna.

u uS

14

9,5

5

6,666666667

1

5,333333333

10

7,666666667

12

7,666666667

1

6,333333333

6

2,666666667

1

2,666666667

1

5,333333333

14

7,333333333

7

10,5

Per entendre bé el significat d'aquesta suavització, veureu dos diagrames de barres corresponents als vectors u i uS on es pot observar com en el segon vector les diferències entre elements contigus són més petites:

          Anomeneu l'arxiu font m5e5.cpp.

 

 

6. La llei d'Hondt

Modifiqueu el programa de la pràctica 8 perquè el nombre d'escons i de partits es pugui entrar per teclat. Feu també aquesta important modificació per perfeccionar el programa:
En el programa de la pràctica 8 hi ha un cas que no s'ha tingut en compte, i és que quan s'avalua la funció nou_esc per assignar un nou escó, en el cas que dos partits tinguin el mateix valor de vots[]/(esc[]+1), l'escó s'hauria d'assignar al partit més votat. Modifiqueu el que sigui necessari del programa de la pràctica 7 per considerar aquesta circumstància. Proveu-ho amb tres partits i quatre escons, i que els vots dels tres partits siguin 40, 50 i 120.

Anomeneu l'arxiu font m5e6.cpp.

 

 

(En el cas que els partits que tenen el mateix valor de vots[]/(esc[]+1) tinguin també el mateix nombre de vots (cosa molt poc probable), l'assignació es fa per sorteig la primera vegada que hi hagi l'empat, i la resta de cops que es produeixi l'empat s'assigna alternativament.)