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

 

1. Rotar 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 rotar els valors de les variables enteres a, b, i c, és a dir: el contingut d'a passarà a b, el contingut de b passarà a c i el contingut de c passarà a a. Per exemple, si els valors d'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à de ser:

a=10      b=2      c=3

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

Anomeneu l'arxiu font: m5e1.c.

 

2. La "Coladera de Eratóstenes"

Un nombre enter primer és aquell que només es pot dividir entre 1 i entre ell mateix.

 La “Coladera de Eratóstenes” és un mètode per trobar nombres primers i consisteix en seguir els següents passos:

- Declarem un vector d’enters i posem un 1en totes les seves cel·les. Per donar aquest valors inicials cal que facis un bucle que posi totes les cel·les a 1. Al finalitzar el mètode  aquells elements del vector que tinguin subíndex primers romandran amb el contingut inicial  1. La resta de cel·les en algun moment hi posarem un 0.

 

- Comença pel subíndex 2, ja que el  subíndex 1 és primer, i cada cop que trobis una cel·la que tingui com a contingut 1, fes:

  • Guarda en una variable per exemple “Sindex” el sèu subíndex.

  •  Fes una passada per la resta del vector ( des de aquesta posició fins al final ) i posa a 0 ( zero ) totes aquelles cel·les que el sèu subíndex sigui múltiple de “Sindex”. Per al subíndex 2 posarem a 0 el contingut dels subíndex 4, 6, 8, 10, …. En el cas del subíndex 3 posarem a 0 les cel·les  6, 9, 12, 15, …. i Aixa fins la darrera posició del vector.

Un cop acabat tot el procés fes una passada per totes les posicions del vector i aquelles posicions que tenen com a contingut 1 el sèu subíndex és un nombre primer.

 Escriu un programa que sobre un vector de 1000 posicions mostri per la pantalla els nombres primers que hi ha entre 1 y 999. Ignora la posició 0 del vector.

 Escriu un programa que sobre un vector de 1000 posicions mostri per la pantalla els nombres primers que hi ha entre 1 y 999. Ignora la posició 0 del vector.

Anomeneu l'arxiu font: m5e2.c.

 

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

Anomenarem Punt_Suma d'un vector bidimensional a 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,  tenim 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 ) .

 

Escriu un programa que permeti recollir enters per enmagatzemar dins la matriu A de M per N.

 

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

 

                          #define M 3
                          #define N 4


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

 

          Anomeneu l'arxiu font: m5e3.c.

 

4. Transposada 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 anomenem 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 d’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'ha de fer modificacions a la funció  transposada(a,n), afegint-li un argument que correspongui al nombre de columnes.

Anomeneu l'arxiu font: m5e4.c.

 

Exercicis complementaris

Aquests exercicis serveixen per completar aquest mòdul però suposen una ampliació voluntària. No és necessari lliurar aquests exercicis. 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. Entendrem 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 convertir 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ó veurem 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.c.

 

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 tal de considerar aquesta circumstància. Proveu amb tres partits i quatre escons, i que els vots dels tres partits siguin 40,50 i 120.

Anomeneu l'arxiu font: m5e6.c.

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

 

  7. 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: m5e7.c.