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