Está en la página 1de 159

Fundamentos de Informtica

Ejercicios resueltos de Programacin en C.


Dirigido a Ingenieros Tcnicos Industriales y
Grados en Ingeniera
M. Carmen Ocariz Sanz
Montserrat Ferreira
Rosa Arruabarrena Santos
Olatz Ansa Osteriz
www.ehu.es
ISBN: 978-84-9860-438-2
Servicio Editorial de la Universidad del Pas Vasco
Euskal Herriko Unibertsitateko Argitalpen Zerbitzua
ISBN: 978-84-9860-438-2

INDICE
EJERCICIOS CORTOS DE PROGRAMACIN......................1
ENUNCIADOS.......................................................................................................3
SOLUCIONES PROPUESTAS ............................................................................ 11
EJERCICIOS LARGOS............................................................. 17
COMPONENTES ELECTRNICOS................................................................... 19
Anlisis del problema....................................................................................... 21
Cdigo C ......................................................................................................... 23
HBITOS DE CONSUMO: BEBIDAS................................................................. 25
Anlisis del problema....................................................................................... 27
Cdigo C ......................................................................................................... 30
EMISORA DE RADIO......................................................................................... 33
Anlisis del problema....................................................................................... 35
Cdigo C ......................................................................................................... 37
GASOLINERA .................................................................................................... 41
Anlisis del problema....................................................................................... 43
Cdigo C ......................................................................................................... 46
TIENDA.............................................................................................................. 49
Anlisis del problema ..................................................................................... 51
Cdigo C ......................................................................................................... 53
CENTRAL ELCTRICA...................................................................................... 55
Anlisis del problema....................................................................................... 57
Cdigo C ......................................................................................................... 60
LADRN ELCA COMAYOR.............................................................................. 63
Anlisis del problema....................................................................................... 65
Cdigo C ......................................................................................................... 67
CUMBRES DE MONTAA................................................................................. 71
Anlisis del problema....................................................................................... 72
Cdigo C ......................................................................................................... 74
AUTOPISTA........................................................................................................ 77
Anlisis del problema....................................................................................... 79
Cdigo C ......................................................................................................... 82
SALA DE JUEGOS .............................................................................................. 85
Anlisis del problema....................................................................................... 88
Cdigo C ......................................................................................................... 91
ii
FAROLAS ............................................................................................................ 97
Anlisis del problema....................................................................................... 99
Cdigo C ....................................................................................................... 101
PUEBLOS DE GUIPZCOA............................................................................. 105
Anlisis del problema..................................................................................... 107
Cdigo C ....................................................................................................... 109
OLIMPIADAS.................................................................................................... 113
Anlisis del problema..................................................................................... 115
Cdigo C ....................................................................................................... 117
VENTAS S. A.................................................................................................... 120
Anlisis del problema..................................................................................... 122
Cdigo C ....................................................................................................... 124
ACCIDENTES DE CIRCULACIN................................................................... 127
Anlisis del problema..................................................................................... 129
Cdigo C ....................................................................................................... 131
EUSKADI IRRATIA .......................................................................................... 135
Anlisis del problema..................................................................................... 138
Cdigo C ....................................................................................................... 142
SAN SEBASTIAN............................................................................................... 147
Anlisis del problema..................................................................................... 149
Cdigo C ....................................................................................................... 152
1

EJERCICIOS CORTOS DE PROGRAMACIN

A continuacin aparecen ejercicios sencillos de programacin, escritos en
lenguaje C. Al principio aparece una lista de veinte enunciados que puedes
intentar resolverlos antes de consultar las soluciones que te aparecen
despus.
Para la verificacin de las soluciones propuestas se ha empleado la versin
4.9.9.2 de Dev-C++, software libre que se puede descargar desde
http://www.bloodshed.net/ .


ENUNCIADOS
1. Escribe cul es la salida del siguiente programa:
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{
i nt s, j , k, i , l ;
s=0;
f or ( j =1; j <=5; j ++)
{ pr i nt f ( " %d" , j ) ;
i f ( j %2 ==0) { s=s+j ; }
}
pr i nt f ( " \ n%d" , s) ;
i = 10;
whi l e ( i >0)
i =i - 1;
pr i nt f ( " \ n%d" , i ) ;
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

2. Escribe cul es la salida del siguiente programa:
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{
i nt i , j ;
f or ( i =1; i <=10; i ++)
{ f or ( j =1; j <=10- i +1; j ++)
{ pr i nt f ( " %d" , j ) ; }
pr i nt f ( " \ n" ) ;
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

3. Escribe cul es la salida del siguiente programa:
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{
i nt i , j , sum;
f or ( i =1; i <=3; i ++)
{ sum=0;
f or ( j =1; j <=i ; j ++)
{ sum=sum+j ;
i f ( i ! =j ) {pr i nt f ( " %d/ %d + " , i , sum) ; }
el se {pr i nt f ( " %d/ %d \ n" , i , sum) ; }
}
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}
4 Enunciados
4. Escribe cul es la salida del siguiente programa:
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#def i ne maxFi l a 6
mai n( )
{ i nt f i l a, col umna, numer o;
numer o=0;
f or ( f i l a=1; f i l a<=maxFi l a; f i l a++)
{ col umna=1;
whi l e ( col umna<=f i l a)
{ numer o ++;
pr i nt f ( " %5d" , numer o) ;
col umna ++;
}
pr i nt f ( " \ n" ) ;
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

5. Escribe cul es la salida del siguiente fragmento de programa:
mai n( )
{ i nt Mi ni mo=1, Maxi mo=5, i , dat o=25;

f or ( i =Maxi mo; Mi ni mo<=i ; i - - )
{ pr i nt f ( " \ n el que va el %d es %d \ n" , i , dat o- i ) ; }
pr i nt f ( " Est t er mi nado" ) ;

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

6. Escribe cul es la salida del siguiente programa:
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{ i nt Mi ni mo=1, Maxi mo=3, i , j ;

f or ( i =Mi ni mo; i <=Maxi mo; i ++)
f or ( j =Mi ni mo; j <=Maxi mo; j ++)
pr i nt f ( " i val e %d y j val e %d . \ n" , i , j ) ;
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

7. Escribe cul es la salida del siguiente programa:
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{ i nt i , k;

f or ( i =1; i <=5; i ++)
{ f or ( k=1; k<=i ; k++)
pr i nt f ( " *" ) ;
pr i nt f ( " \ n" ) ;
}
Enunciados

5

f or ( i =4; 1<=i ; i - - )
{ f or ( k=1; k<=i ; k++)
pr i nt f ( " *" ) ;
pr i nt f ( " \ n" ) ;
}

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

8. Escribe cul es la salida del siguiente programa:
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{i nt a, b, n, x, y;
n=6;
x=0;
y=0;
f or ( a=1; a<=n; a++)
{ i f ( a%2== 0)
{ f or ( b=a; b<n; b++) {x=x+1; }
pr i nt f ( " \ n%d >>> %d" , a, x) ;
}
el se
{ f or ( b=1; b<a; b++) {y=y+1; }
pr i nt f ( " \ n%d >>> %d" , a, y) ;
}
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

9. Escribe cul es la salida del siguiente programa:
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
#i ncl ude <st r i ng. h>
mai n( )
{char cadena[ ] =" est e er r or es el gr ave?" ;
i nt cont , i , desde, hast a, i nd, t am;
cont =0;
t am= st r l en( cadena) ; / / t amao de l a cadena
f or ( i nd=0; i nd<t am; i nd++)
{ i f ( cadena[ i nd] ==' e' )
{cont ++; }
}
pr i nt f ( " En l a cadena ' %s' hay %d ' e' \ n" , cadena, cont ) ;
f or ( i =1; i <=cont ; i ++)
{ pr i nt f ( " %d ' e' est : " , i ) ;
desde=0;
hast a=0;
whi l e ( desde<i )
{ i f ( cadena[ hast a] ==' e' )
{desde++; }
hast a++;
}
f or ( i nd=0; i nd<hast a; i nd++)
{pr i nt f ( " %c" , cadena[ i nd] ) ; }
6 Enunciados
pr i nt f ( " \ n" ) ;
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

10. Di si los dos fragmentos de programa que estn a continuacin son
equivalentes. Razona la respuesta.
( Decir que son equivalentes significa que escribir uno u otro fragmento
dentro de un programa da el mismo resultado.)
A. -
i f ( x<10) {x: =x+1; }
i f ( x>=10) {x: =x- 1; }
i f ( x<10) {x: =x+1; }
el se {x: =x- 1; }

B.-
f or ( i =10; i <=25; i ++)
pr i nt f ( " %d \ n" , i ) ;
pr i nt f ( " Ha t er mi nado" ) ;
i =10;
whi l e ( i <=25)
{ pr i nt f ( " %d" , i ) ;
pr i nt f ( " Ha t er mi nado \ n " ) ;
}


11. Los dos fragmentos de programa, hacen lo mismo ?. Si es que si d que
hacen y si es que no porqu no?:

A

est a= 0;
i nd = 0;
whi l e ( ( i nd<N) && ( est a==0) )
{ i f ( x==t abl a[ i nd] )
{est a=1; }
i nd=i nd+1;
}
i f ( est a==1)
{pr i nt f ( " %d est en l a posi ci n %d " , x, i nd- 1) ; }
el se
{pr i nt f ( " %d no est " , x) ; }


B

est a=0;
f or ( i nd=0; i nd<N; i nd++)
{ i f ( x==t abl a[ i nd] )
{est a=1; }
}
i f ( est a==1)
{pr i nt f ( " est en l a posi ci n %d " , x, i nd- 1) ; }
el se
{pr i nt f ( " %d no est " , x) ; }



12. Hacen lo mismo los dos fragmentos de programa?. Si es que si d qu
hacen y si es que no porqu no?:

Enunciados

7

A

pr i nt f ( " Dame un nmer o: " ) ;
scanf ( " %d" , &n) ;
cont =1;
whi l e( cont <=n)
{ pr i nt f ( " %d \ n" , cont ) ;
cont =cont +2;
}


B

pr i nt f ( " Dame un nmer o: " ) ;
scanf ( " %d" , &n) ;
f or ( cont =1; cont <=n; cont ++)
{ i f ( cont %2==0)
{pr i nt f ( " %d \ n" , cont ) ; }
}


13. Escribe qu hace el siguiente programa.
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{ i nt x, y, num;
pr i nt f ( " Dame un nmer o: " ) ;
scanf ( " %d" , &num) ;
x=0;
y=0;
whi l e ( num! =0)
{ i f ( num%2==0)
{y++; }
x++;
scanf ( " %d" , &num) ;
}
pr i nt f ( " \ Tot al de nmer os: %d" , x) ;
pr i nt f ( " \ nTot al de nmer os par es: %d" , y) ;

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

14. El siguiente programa contiene errores, corrgelo:
#def i ne <st di o. h>
#def i ne <st dl i b. h>
#i ncl ude Tope 10;

mai n( )
{i nt t abl a [ t ope] , i , aux;
f or ( i =0; i <Tope; i ++)
{ t abl a[ i ] =i ;
i =i +1;
}
i =0;
whi l e ( i <=Tope)
{ aux=t au[ i ] ;
t abl a[ i ] =t abl a[ i +1] ;
t abl a[ i +1] =aux;
}
8 Enunciados

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

15. Sustituye las sentencias if por un nico switch :
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>

mai n( )
{ i nt n;
pr i nt f ( " Escr i be un nmer o: " ) ;
scanf ( " %d" , &n) ;
i f ( ( n==5) | | ( n==6) ) {n=n+4; }
el se i f ( ( n>7) && ( n<=10) ) { n=n- 5; }
el se i f ( n==7) {n=n+1; }
el se {n=n- 1; }
pr i nt f ( " Nmer o: %d" , n) ;

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

16. D que hace el siguiente diagrama de flujo y a continuacin escribe el
correspondiente programa en C :
INICIO
div<n
d divisible div
FIN
si
no
si
si
no
div
aux
aux1
aux es 0 no
n
NO SI
div div 1


17. Realiza el diagrama de flujo y el programa en C que haga lo siguiente:
a. Se teclearn dos nmeros enteros por pantalla hasta que los dos sean
menores que 50.
Enunciados

9
b. El ms pequeo se ir incrementando de 5 en 5 y el ms grande se
decrementar de 2 en 2, se irn imprimiendo a la vez que se van
generando. El programa terminar cuando los valores se crucen.

18. El siguiente programa intenta contar cuantos carcteres t seguidos de
a hay en una frase que se pedir por pantalla, la frase acabar con un
punto. En el programa hay 5 errores, corrgelos. Ejemplo de ejecucin
(en negrita los datos introducidos por el usuario):
Escr i be un f r ase( par a acabar un punt o) : abba tkktajjtaiitaktaoi.
t a apar ece 4 veces

#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{ i nt ant es, t ot =0;
char ahor a;
ant es=' z' ;
pr i nt f ( " Escr i be una f r ase, par a acabar un punt o ' . ' : \ n" ) ;
scanf ( " %c" , &ahor a) ;
whi l e ( ahor a! =' . ' )
i f ( ahor a==' a' | | ant es==' t ' ) t hen {t ot ++; }
ant es=ahor a;
scanf ( " %c" , &or ai n) ;

pr i nt f ( " apar ece veces ' - t a- ' " , t ot ) ;

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

19. Haz un programa que pida un nmero entero y obtenga la suma de los
cuadrados de los nmeros de 4 en 4 que hay hasta llegar a l. Por
ejemplo, si el dato de entrada es 10, la solucin vendr dada por el
resultado de la siguiente operacin: 1
2
+ 5
2
+ 9
2


20. Qu hace el siguiente programa?
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( )
{ i nt x, n=0;
f or ( x=45; 1<=x; x- - )
i f ( x<30) {n=n- x; }
el se {n=n+x; }
pr i nt f ( " %d" , n) ;
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

11
SOLUCIONES PROPUESTAS
1. 12345
6
0


2. 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7
1 2 3 4 5 6
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1

3. 1/ 1
2/ 1 + 2/ 3
3/ 1 + 3/ 3 + 3/ 6

4. 1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21

5. el que va el 5 es 20.
el que va el 4 es 21.
el que va el 3 es 22.
el que va el 2 es 23.
el que va el 1 es 20.
Est t er mi nado.

6. i val e 1 y j val e 1.
i val e 1 y j val e 2.
i val e 1 y j val e 3.
i val e 2 y j val e 1.
i val e 2 y j val e 2.
i val e 2 y j val e 3.
i val e 3 y j val e 1.
i val e 3 y j val e 2.
i val e 3 y j val e 3.

7. *
**
***
****
*****
****
***
**
*
12 Soluciones propuestas
8. 1 === 1
2 >>> 5
3 === 4
4 >>> 8
5 === 9
6 >>> 9


9. En l a cadena est e er r or es el gr ave? hay 6 e .
1 e est : e
2 e est : est e
3 e est : est e e
4 e est : est e er r or e
5 e est : est e er r or es e
6 e est : est e er r or es el gr ave


10. A) No son equi val ent es, en el pr i mer f r agment o cuando x es 9 a x
se l e suma 1, con l o cual es 10, y al segui r en l a si gui ent e
i nst r ucci n como x es 10 se l e r est a 1 a l a x, en el segundo
f r agment o si x es menor que 10 se l e suma 1 a l a x y en caso
cont r ar i o se l e r est a 1 a l a x.

B) No son equi val ent es, en el pr i mer f r agment o se escr i be l os
nmer os de 1 a 25 y al f i nal Ha t er mi nado, en el segundo
f r agment o como no se i ncr ement a l a i , comi enza con 10 y escr i be
10 Ha t er mi nado de f or ma i ndef i ni da.


11. No t i enen el mi smo ef ect o, en l os dos se i nt ent a ver si un val or
x est en una t abl a de N el ement os, en el pr i mer f r agment o
t er mi na de r ecor r er l a t abl a bi en por que l o ha encont r ado o
por que se han acabado l os el ement os, en el segundo r ecor r e
si empr e t oda l a t abl a y adems si l o ha encont r ado si empr e
i mpr i me que est en l a posi ci n i nd- 1, nmer o de el ement os de l a
t abl a menos 1.


12. No t i enen el mi smo ef ect o, en l os dos se sol i ci t a un nmer o por
pant al l a, i mpr i mi ndose l os nmer os i mpar es hast a l l egar al
nmer o en el pr i mer f r agment o y en el segundo f r agment o l os
par es.


13. Se van pi di endo nmer os por pant al l a hast a que se t ecl ee el
nmer o 0, en y se van sumando el nmer o de par es que se
i nt r oducen y en x el nmer o de nmer os que se i nt r oducen, al
f i nal se i mpr i me x e y.


14. #def i ne <st di o. h> corregido #i ncl ude <st di o. h>
#def i ne <st dl i b. h> corr. #i ncl ude <st di o. h>
#i ncl ude Tope 10; corr. #def i ne Tope 10
mai n ( ) {
i nt t abl a [ Tope] , i , l ag;

f or ( i =1; i <Tope; i ++) corr. f or ( i =0; i <Tope; i ++)
{ t au[ i ] =i ;
Soluciones propuestas 13
i =i +1; sobra
}

i =1; corr. i =0;
whi l e ( i <=Tope) corr. whi l e ( i <Tope)
{ l ag=t au[ i ] ;
t au[ i ] =t au[ i +1] ;
t au[ i +1] =l ag; falta i =i +1;
}

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}


15. swi t ch ( n)
{
case 5: case 6: n=n+4; br eak;
case 7: n=n+1; br eak;
case 8: case 9: case 10: n=n- 5; br eak;
ot her wi se: n=n- 1;
}


16. Se i mpr i me SI si un nmer o t ecl eado pr evi ament e por pant al l a es
pr i mo y NO si no l o es.

#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>

mai n ( )
{ i nt n, di v, aux;
pr i nt f ( " Dame un nmer o: " ) ;
scanf ( " %d" , &n) ;
di v=2;
aux=0;
whi l e ( di v<n)
{ i f ( n%di v==0)
{aux=1; }
di v=di v+1;
}
i f ( aux==0)
{pr i nt f ( " SI " ) ; }
el se
{pr i nt f ( " NO" ) ; }

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}


17. #i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>

mai n ( )
{ i nt a, b, t , h;
pr i nt f ( " Dame dos nmer os menor es que 50 " ) ;
scanf ( " %d %d" , &a, &b) ;
whi l e ( 50<a | | 50<b)
14 Soluciones propuestas
{ pr i nt f ( " Dame dos nmer os menor es que 50 " ) ;
scanf ( " %d %d" , &a, &b) ;
}
i f ( b<a)
{t =b; h=a; }
el se
{t =a; h=b; }
whi l e ( t <=h)
{ pr i nt f ( " El ms pequeo : %5d . El ms gr ande: %5d\ n" , t , h) ;
t =t +5;
h=h- 2;
}

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

Soluciones propuestas 15



18. #i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>

mai n ( )
{ i nt t ot =0;
char ahor a, ant es;
ant es=' z' ;
pr i nt f ( " Escr i be una f r ase, par a acabar un punt o ' . ' : \ n" ) ;
scanf ( " %c" , &ahor a) ;
whi l e ( ahor a! =' . ' )
{ i f ( ahor a==' a' | | ant es==' t ' )
{t ot ++; }
ant es=ahor a;
16 Soluciones propuestas
scanf ( " %c" , &ahor a) ;
}
pr i nt f ( " apar ece %d veces ' - t a- ' " , t ot ) ;

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}


19. #i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n ( )
{ i nt n, z;
l ong sum;
pr i nt f ( " Tecl ea un nmer o: " ) ;
scanf ( " %d" , &n) ;
sum=0;
z=1;
whi l e ( z<=n)
{ sum= sum+ z*z;
z=z+4;
}
pr i nt f ( " Sol uci n: %l d" , sum) ;
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}


20. Empi eza el pr ogr ama dando el val or 45 a l a x, ent r a en un bucl e
mi ent r as x sea mayor o i gual que 1, en el bucl e si x es mayor o
i gual que 30 r eal i za n=n+x y si x es menor que 30 r eal i za n=n-
x, en l os dos r est a 1 a x. Al f i nal se i mpr i me el val or 165.
17

EJERCICIOS LARGOS
A continuacin se presentan 17 ejercicios largos estilo examen para
programarlos en C, puedes intentar hacerlos, consultando a continuacin el
anlisis y programacin propuestos para cada uno de ellos.
Para la verificacin de las soluciones propuestas se ha empleado la versin
4.9.9.2 de Dev-C++, software libre que se puede descargar desde
http://www.bloodshed.net/ .
19
COMPONENTES ELECTRNICOS
En una empresa de montaje de aparatos electrnicos se desea un programa
que calcule ciertas caractersticas de los productos de la empresa. La
empresa monta 10 tipos diferentes de aparatos electrnicos, cada uno de los
cuales incluye un nmero de componentes diferentes. En total la empresa
utiliza 100 componentes electrnicos diferentes. Suponemos que cada
aparato slo tiene una unidad de cada uno de los componentes que lo
forman.
Debes construir un programa que realice las siguientes funciones:
1. En primer lugar se proceder a la lectura de los datos que indican cules
son los componentes de cada aparato electrnico. El usuario
introducir los datos relativos a los 10 aparatos, indicando primero el
nmero de componentes que tiene.
2. A continuacin, el programa deber leer el nmero de unidades que se
montan mensualmente de cada aparato.
3. Para realizar los pedidos correspondientes, se deben contabilizar el
nmero de componentes que se necesitan cada mes y escribirlos en la
pantalla.
4. El programa deber identificar el componente elctrico que ms se
utiliza.
Ejemplo: (en negrita los datos introducidos por el usuario)
Apartado 1)
I nt r oduce l os component es de cada apar at o
Nmer o de component es del apar at o 0: 3
Component e 1: 1
Component e 2: 3
Component e 3: 99
Nmer o de component es del apar at o 1: 20
Component e 1: 1
Component e 2: 3
. . .
Component e 20: 99
. . .
Nmer o de component es del apar at o 9: 1
Component e 1: 65
Apartado 2)
I nt r oduce el nmer o de apar at os mont ados mensual ment e:
Apar at o 0: 100
Apar at o 2: 1000
. . .
Apar at o 9: 300
20 Componentes electrnicos

Apartado 3)
Nmer o de uni dades de cada component e ut i l i zados mensual ment e:
Component e 0: 100
. . .
Component e 99: 100
Apartado 4)
El component e el ect r ni co 7 es el ms ut i l i zado, se necesi t an
10000 uni dades.
Componentes electrnicos 21
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. NumAparatos=10. Es el nmero de aparatos distintos que se montan en
la empresa.
2. NumComponentes =100. Es el nmero de componentes electrnicos que
se utilizan para montar los diferentes aparatos.
Representacin del las variables necesarias para la entrada
3. Necesitaremos una matriz de NumAparatos X NumComponentes
posiciones para almacenar por cada aparato los componentes
electrnicos que contiene; de manera que si desglose[a][c]=1 indica que el
aparato a tiene el componente c, y desglose[a][c]=0 indica que el aparato a
no contiene el componente electrnico c.
desglose 0 2 ... NumComponentes-1
0
2
...
NumAparatos-1

4. Necesitaremos un vector de NumAparatos posiciones para almacenar
por cada aparato el nmero de montajes que se hacen del mismo al mes.
0 2 ... NumAparatos-1
montajesAMes

Representacin de las varables necesarias para los resultados
5. Necesitaremos un vector de NumComponentes posiciones para almacenar
por cada componente el nmero total del citado componente que se
requiere para montar todos los aparatos pedidos de un mes.
0 2 ... NumComponentes-1
totalesComp

Pasos a seguir en la resolucin del problema
1. Inicializar la matriz desglose a 0; ello indicar que cada aparato
inicialmente no tiene componente alguno asociado. Ello se consigue
asignando el valor 0 en cada una de las posiciones de la citada matriz, es
decir, por ejemplo, recorriendo la matriz aparato por aparato y dentro
de cada aparato componente por componente y asignando el valor 0 a
cada par aparato-componente.
2. Leer ordenadamente la composicin de todos los aparatos:
a. Por cada aparato primeramente leer el nmero de componentes que
lo contienen, sea ste aTieneXComp.
22 Componentes electrnicos

b. Y posteriormente uno a uno leer y registrar en la matriz desglose los
aTieneXComp identificadores de los componentes concretos del
aparato. Para registrar que un aparato a tiene un componente yComp
se almacena en la celda desglose[a][yComp] el valor 1.
3. Leer por cada aparato cuntos aparatos de cada tipo se van a montar en
un mes, registrando dichos valores en el vector montajesAMes.
4. Calcular por cada tipo de componente cuntos componentes se van a
emplear entre todos los montajes de aparatos, combinando para ello los
datos de la matriz desglose y el vector montajesAMes.
Para determinar el nmero de componentes de tipo c que se necesitarn
en un mes y registrarlo en totalesComp[c]:
a. Se inicializa a 0 el acumulador totalesComp[c].
b. Por cada tipo de aparato a se calcula el nmero de componentes de
tipo c que se emplearn en un mes para montar todos los aparatos a:
desglose[a][c]* montajesAMes[a], ya que si el aparato a no contiene el
componente c entonces desglose[a][c] tendr el valor 0. El nmero
calculado de componentes c que se emplearn en los montajes de los
aparatos tipos a se acumula en totalesComp[c].
Los dos pasos anteriores se repiten por cada tipo de componente c y se
muestra en pantalla.
5. Para calcular el componente ms empleado, basta con determinar en
qu posicin est el valor mximo del vector totalesComp:
a. Inicialmente considerar que el primer valor de totalesComp es el
mximo hasta el momento (posMaxComp).
b. Con el resto de componentes (sea c el ndice para denotar cada uno
de ellos), se repite una y otra vez:
i. Se comprueba si el nmero de componentes totales de tipo c es
mayor que el mximo hasta el momento:
totalesComp[c]>totalesComp[posMaxComp].
ii. Si es mayor, se actualiza la posicin en la que se ubica el nuevo
mximo; es decir, la variable posMaxComp con el componente
actual c.
c. Se imprime un mensaje en pantalla indicando que el componente
posMaxComp es el componente ms empleado, utilizndose un total
de totalesComp[posMaxComp] unidades.
Componentes electrnicos 23
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define NumApar at os 10
#define NumComponent es 100
main(){
int desgl ose[ NumApar at os] [ NumComponent es] ;
int mont aj esAMes[ NumApar at os] ;
int t ot al esComp[ NumComponent es] ;
int a, c, t ot al Comp, nc, posMaxComp;

// Inicializar desglose: Ningn componente por aparato
for ( a = 0; a< NumApar at os; a++)
{ for( c = 0 ; c< NumComponent es ; c++)
{ desgl ose[ a] [ c] =0; }
}
// Lectura de los componentes de cada uno de los aparatos
pr i nt f ( " I nt r oduce l os component es de cada apar at o" ) ;
for ( a = 0 ; a< NumApar at os; a++)
{ pr i nt f ( " Nmer o de component es del apar at o %d : " , a) ;
scanf ( " %d" , &t ot al Comp) ;
for( nc = 1 ; nc<= t ot al Comp ; nc++)
{ pr i nt f ( " Component e %d: " , nc) ;
scanf ( " %d" , &c) ;
desgl ose[ a] [ c] =1;
/*El aparato a tiene el componente c. Para identificar que a
lo contiene se pone a 1 la celda [a][c] de la matriz
desglose*/
}
}
// Lectura de los aparatos montados mensualmente
pr i nt f ( " I nt r oduce el nmer o de apar at os mont ados mensual ment e: \ n" ) ;
for ( a = 0 ; a< NumApar at os ; a++)
{ pr i nt f ( " Apar at o %d: " , a) ;
scanf ( " %d" , &mont aj esAMes[ a] ) ;
}
pr i nt f ( " Nmer o de component es ut i l i zados mensual ment e: \ n " ) ;

24 Componentes electrnicos

for ( c = 0; c<NumComponent es; c++)
{ t ot al esComp[ c] =0;
for ( a=0 ; a<NumApar at os; a++)
{ t ot al esComp[ c] =desgl ose[ a] [ c] *mont aj esAMes[ a] +t ot al esComp[ c] ; }
pr i nt f ( " Component e %d : %d \ n " , c, t ot al esComp[ c] ) ;
}
// El componente ms empleado entre todos los montajes del mes.
posMaxComp= 0;
for ( c= 1; c< NumComponent es ; c++)
{ if ( t ot al esComp[ c] >t ot al esComp[ posMaxComp] )
{ posMaxComp=c; }
}
pr i nt f ( " El component e el ect r ni co %d es el ms ut i l i zado, se "
" necesi t an %d uni dades. " , posMaxComp, t ot al esComp[ posMaxComp] ) ;
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}
25
HBITOS DE CONSUMO: BEBIDAS
El Gobierno Vasco quiere hacer un estudio de hbitos de consumo de
alcohol y bebida entre la juventud vasca. Para ello, ha escogido 100 pueblos
donde llevar a cabo la consulta. El ayuntamiento de cada uno de estos
pueblos recoger el nmero de litros consumidos durante el pasado ao de
los 8 tipos de bebidas nombrados a continuacin:
Tipos De Bebidas
0. Naturales: agua, leche, zumos, mostos, infusiones, ...
1. Gaseosos: Refrescos
2. Vinos
3. Cervezas
4. Whisky
5. Licores
6. Energticos: Aquarius, Red Bull,...
7. Combinados: Cubatas, GinTonics,..
Mediante un programa en C, se te pide que realices un estudio que estar
compuesto por los siguientes pasos:
1. Recoge y almacena la informacin, para cada pueblo, sobre los litros
consumidos de los tipos de bebidas mencionados. Recuerda que 100
pueblos aportarn informacin a tu estudio. No obstante, la
informacin no te la tienen por qu dar ordenada por tipo de bebida o
nmero de litros y puede que de algn tipo de bebida no se tenga
informacin.
As, ser preciso introducir pares (tipo de bebida, litros) y para indicar
que no hay ms datos de un pueblo, bastar con introducir como tipo
de bebida el valor -1. Ver ejemplo para cada uno de los apartados al
final del enunciado.
2. Determina el tipo de bebida ms consumida entre todos los pueblos;
es decir, el tipo de bebida del que ms litros se hayan bebido entre todos
los pueblos.
3. Recoge y almacena cules de las clases de bebidas tienen alcohol. Para
ello, te dan nicamente la lista de los tipos de bebidas que contienen
alcohol acabada con un -1 para indicar que no hay ms tipos de bebida
que tengan alcohol. Por ejemplo: 7 2 5 4 3 -1
a. De los tipos de bebidas con alcohol, cul es el ms consumido?
26 Hbitos de consumo: bebidas
b. En qu pueblo se bebe ms alcohol en total?
Ejemplo: (En letra normal lo que el programa imprime y en negrita lo que el
usuario teclea)
Par a comenzar el est udi o r ecogemos l os dat os por puebl os:
Por cada puebl o: I nt r oduce par es ( t i poBebi da, l i t r os) . Par a
acabar , el pr i mer component e del l t i mo par t i ene que t ener
val or - 1.
Puebl o 0:
0 8
4 7
2 0
3 50
1 10
-1 0
Puebl o 2:
0 18
1 15
4 0
2 6
3 36
-1 32
Puebl o 3:
5 16
...
Puebl o 99:
3 5
1 12
-1 9
El t i po de bebi da ms consumi da es l a: 3
{Suponi endo que l o que ms se ha bebi do en l i t r os sean cer vezas}
Ahor a necesi t amos que enumer es SLO l os t i pos de bebi da CON
al cohol , - 1 par a acabar : 7 2 5 4 3 -1
El t i po de bebi da con al cohol ms consumi da es l a: 3
( Suponi endo que as sea en l i t r os ent r e: combi nados, vi nos,
l i cor es, whi ski es y cer vezas. En gener al , el t i po de
bebi da y el t i po de bebi da con al cohol ms consumi das no
t i ene por qu coi nci di r ) .
El puebl o con mayor consumo de al cohol : X
( Suponi endo que ent r e combi nados, vi nos, l i cor es,
whi ski es y cer vezas, X sea l a pobl aci n que ms l i t r os haya
vendi do) .

Htibos de consumo: bebidas 27
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. NumPueblos= 100. Es el nmero de pueblos con los que se va a hacer el
estudio de hbitos de consumo.
2. NumTipoBebidas= 8. Es el nmero de tipos de bebidas.
Representacin del las variables necesarias para la entrada
3. Necesitaremos una matriz de NumPueblos X NumTipoBebidas posiciones
para almacenar por cada pueblo y por cada tipo de bebida los litros
consumidos; de manera que si consumpPB[i][j]=z indica que el pueblo i
ha consumido z litros del tipo de bebida j.
conumoPB 0 2 ... NumTipoBebidas-1
0
2
...
NumPueblos-1

4. Necesitaremos un vector de NumTipoBebidas posiciones para almacenar
si el tipo de bebida es o no alcohlica (1 para indicar que tiene alcohol y
0 en caso contrario).
0 2 ... NumTipoBebidas-1
conAlcohol

Representacin de las varables necesarias para los resultados
5. Necesitaremos un vector de NumTipoBebidas posiciones para almacenar
por cada tipo de bebida el nmero total de litros consumidos en los
NumPueblos del Pas Vasco.
0 2 ... NumTipoBebidas-1
consumoXTipo

6. Necesitaremos un vector de NumPueblos posiciones para almacenar por
cada pueblo el nmero total de litros alcohlicos consumidos entre
todos los tipos de bebidas.
0 2 ... NumPueblos-1
consumoP

Pasos a seguir en la resolucin del problema
1. Inicializar la matriz consumoPB a 0; ello indicar que cada pueblo, por
cada tipo de bebida, an no tiene litros consumidos asociados.
2. Leer ordenadamente por pueblos, pares que indican tipo de bebida y
litros de la misma consumidos. En el supuesto de que se repita un par
(pueblo - tipo de bebida), los litros consumidos del ltimo par sern los
28 Hbitos de consumo: bebidas
que prevalezcan (es decir, no se hace acumulacin de litros consumidos
por tipo de bebida).
Para ello, por cada pueblo p:
a. Leer un par de valores de tipo de bebida y litros consumidos (tb,l).
b. Mientras el tipo de bebida no sea -1 (tp!=-1): asignar al pueblo p en el
tipo de bebida tb los l litros consumidos (consumoPb[p][tb]=l ) y leer
otro par de valores de tipo de bebida y litros consumidos.
c. Si el tipo de bebida es -1, indica que los datos de consumo del
pueblo p ya han sido proporcionados.
3. Calcular por cada tipo de bebida los litros consumidos entre todos los
pueblos y determinar, de esta forma, la bebida ms consumida.
Por cada tipo de bebida b:
a. Inicializar a 0 los litros consumidos en su acumulador
(consumoXTipo[b]=0).
b. Incrementar el contador de bebida tipo b con los litros consumidos
en en todos los pueblos (consumoXTipo[b]= consumoPB[p][b] +
consumoXTipo[b], por cada pueblo p).
Una vez que se tienen calculados los litros consumidos por tipos de
bebidas y recogidos en el vector consumoXTipo, se determina la bebida
(ndice del vector) con mayor contenido (mayor consumo de litros) y se
imprime en pantalla. El proceso consiste en:
c. Inicialmente se considera que el mayor consumo de litros lo tiene la
bebida 0 (maxTB).
d. Para el resto de bebidas se comprueba si los litros consumidos de la
bebida actual b, supera los litros consumidos por la bebida lder
hasta el momento maxTB (determinado mediante la comparacin
consumoXTipo[b]>consumoXTipo[maxTB]); en cuyo caso se registra la
nueva bebida lder en consumo. En caso contrario, la bebida lder
hasta el momento sigue mantenindose lder, y no hay que hacer
nada ms.
e. Se imprime en pantalla un mensaje indicando cul es la bebida de
mayor consumo.
4. Leer los tipos de bebidas que tienen alcohol. Las operaciones a realizar
para ello son:
a. Se inicializa a 0 el vector conAlcohol, indicando que inicialmente se
consideran todas las bebidas no alcohlicas.
b. Se lee un tipo de bebida tb.
Htibos de consumo: bebidas 29
c. Mientras que el tipo de bebida no sea -1 (tb!=-1): se actualiza la
bebida tb como alcohlica (conAlcohol[tb]=1) y se lee otro tipo de
bebida.
d. Cuando el tipo de bebida es -1, la identificacin de bebidas
alcohlicas ha finalizado y con ello la lectura de los tipos de bebida
con alcohol.
5. Calcular la bebida alcohlica ms consumida. Ello se hace combinando
los datos de los vectores consumoXTipo y conAlcohol.
a. Se inicializa a 0 los litros mximo de alcohol consumidos
(maxAlcohol)
b. As, por cada bebida b, y slo si sta tiene alcohol (conAlcohol[b]==1)
se comprueba si los litros consumidos de la misma (consumoXTipo[b])
superan el mayor consumo hasta el momento (maxAlcohol) (ambas
condiciones se comprueban mediante la comparacin
(conAlcohol[b]==1and consumoXTipo[b]>=maxAlcohol)); y si la
comparacin es cierta, se actualiza el nuevo mximo: la bebida
alcohlica lder en consumo (identificada por la posicin del vector)
y los litros consumidos de la misma (posMaxAlcohol=b y
maxAlcohol=consumoXTipo[b]).
c. Se imprime en pantalla un mensaje indicando cul es la bebida
alcohlica con mayor consumo (posMaxAlcohol).
6. Calcular el pueblo con mayor consumo de alcohol. Se calcula de forma
anloga pero, en lugar de por tipos de bebidas, por pueblos. Es decir,
Por cada pueblo p:
a. Inicializar a 0 los litros con alcohol consumidos en su acumulador
(consumoP[p]=0).
b. Incrementar dicho contador con los litros consumidos en el pueblo
p de todas los tipos de bebidas alcohlicas (consumoP[p]=
consumoPB[p][b] + consumoP[p], por cada tipo de bebida b siendo b
con alcohol (conAlcohol[b]==1)).
Una vez que se tienen calculados los litros, con alcohol, consumidos por
pueblos y recogidos en el vector consumoP, se determina el pueblo (ndice
del vector) con mayor contenido (mayor consumo de litros alcohlicos)
y se imprime en pantalla. (El clculo es anlogo al recogido en el paso
anterior pero ahora con el vector consumoP, en lugar de consumoXTipo).
30 Hbitos de consumo: bebidas
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define NumPuebl os 100
#define NumTi poBebi das 8
main (){
int consumoPB[ NumPuebl os] [ NumTi poBebi das] , consumoP[ NumPuebl os] ;
int consumoXTi po[ NumTi poBebi das] , conAl cohol [ NumTi poBebi das] ;
int p, b, l , t b, t p, maxP, maxTB, maxAl cohol ;
int posMaxAl cohol , posPMaxAl cohol ;

//Inicializar ConsumoPB a 0 litros por pueblo-tipo bebida.
for ( p = 0 ; p< NumPuebl os ; p++)
for ( b = 0 ; b< NumTi poBebi das ; b++)
consumoPB[ p] [ b] =0;
//Lectura de los litros consumidos, ordenadamente por pueblos.
pr i nt f ( " Recogemos l os dat os por puebl os: \ n" ) ;
pr i nt f ( " Por cada puebl o: I nt r oduce par es ( Ti poBebi da, l i t r os) . \ n"
" Par a acabar , el pr i mer component e del l t i mo par t i ene"
" que t ener val or - 1. \ n" ) ;
for ( p=0 ; p<NumPuebl os; p=p+1)
{ pr i nt f ( " Puebl o %d\ n" , p) ;
scanf ( " %d %d" , &t b, &l ) ; //tipoBebida y litros de la misma en p
while ( t b! =- 1)
{ consumoPB[ p] [ t b] = l ;
//Si el tb se ha repetido, prevalecern los ltimos litros}
scanf ( " %d %d" , &t b, &l ) ;
}
}
//Clculo de la bebida ms consumida entre todos los pueblos
for ( b=0 ; b<NumTi poBebi das; b=b+1)
{ consumoXTi po[ b] =0;
for ( p=0; p<NumPuebl os ; p=p+1)
{ consumoXTi po[ b] =consumoPB[ p] [ b] +consumoXTi po[ b] ; }
}
maxTB=0; / / Bebida tipo 0 inicialmente}
for ( b=1; b< NumTi poBebi das; b=b+1)
{ if ( consumoXTi po[ b] >consumoXTi po[ maxTB] )
Htibos de consumo: bebidas 31
{ maxTB=b; }
}
pr i nt f ( " El t i po de bebi da ms consumi da es l a %d \ n: " , maxTB) ;

/*Bebidas alcohlicas: obtencin y algunas estadsticas.
Iniciar todas las bebidas como NO alcohlicas (conAlcohol[x]=0
Posteriormente, las que sean CON registrarlas a =1*/
for ( b=0 ; b< NumTi poBebi das; b=b+1)
{ conAl cohol [ b] =0; }
pr i nt f ( " Ahor a necesi t amos que enumer es SLO l os t i pos de bebi da "
" CON al cohol , - 1 par a acabar : \ n " ) ;
scanf ( " %d" , &t b) ;
while ( TB! =- 1)
{ conAl cohol [ t b] =1;
scanf ( " %d" , &t b) ;
}
maxAl cohol =0; //0 litros inicialmente
for ( b=0; b< NumTi poBebi das; b=b+1)
{ if ( conAl cohol [ b] ==1 && consumoXTi po[ b] >=MaxAl cohol )
{ posMaxAl cohol =b;
maxAl cohol =consumoXTi po[ b] ;
}
}
pr i nt f ( " El t i po de bebi da con al cohol ms consumi da "
" es %d " , posMaxAl cohol ) ;

//Pueblo con mayor consumo de alcohol
for ( p=0; p< NumPuebl os; p=p+1)
{ consumoP[ p] =0;
for ( b=0; b< NumTi poBebi das; b=b+1)
{ if ( ConAl cohol [ b] ==1)
{ consumoP[ p] =consumoPB[ p] [ b] +consumoP[ p] ; }
//Acumulacin total del alcohol consumido en el pueblo p.
}
}

maxAl cohol =0; //0 litros inicialmente
for ( p=0; p< NumPuebl os; p=p+1)
32 Hbitos de consumo: bebidas
{ if ( consumoP[ p] >maxAl cohol )
{ posPMaxAl cohol =p;
maxAl cohol =consumoP[ p] ;
}
}
pr i nt f ( " El puebl o con mayor consumo de al cohol es: %d "
" \ n " , posPMaxAl cohol ) ;
syst em( " PAUSE" ) ;
}

33
EMISORA DE RADIO
Una emisora de radio quiere hacer un concurso en el que proponen a sus
oyentes los ttulos de 10 canciones, a las que ha numerado del 0 al 9. Cada
participante debe llamar para dar los nmeros de 3 ttulos por orden de
preferencia decreciente.
Se le dan 3 puntos a la cancin que el oyente nombra en 1er lugar, 2 puntos
a la que indica en 2 lugar y 1 punto a la 3.
Se pide hacer un programa que realice las siguientes tareas:
7. Leer y almacenar los votos emitidos por cada oyente, suponemos que
como mximo pueden concursar 100 oyentes. Y a medida que llaman
los concursantes se les asigna un nmero de forma correlativa.
La entrada de datos se realizar en forma de tros, con los nmeros de
las canciones que vota cada oyente. Para finalizar se introducir el valor
-1 en el primer dato del trio, sin importar el valor de los otros dos datos.
Ejemplo:
Oyent e 0: 6 2 1
Oyent e 1: 3 7 5
Oyent e 2: 3 0 1
Oyent e 3: 0 5 2
Oyent e 4: -1 0 0
8. Calcular los votos obtenidos por cada cancin e indicar cules son la 1
y 2 cancin ms votada.
Segn el ejemplo anterior:
Canci n 0: 5 vot os
Canci n 1: 2 vot os
Canci n 2: 3 vot os
Canci n 3: 6 vot os
Canci n 4: 0 vot os
Canci n 5: 3 vot os
Canci n 6: 3 vot os
Canci n 7: 2 vot os
Canci n 8: 0 vot os
Canci n 9: 0 vot os
1 canci n: 3
2 canci n: 0
9. Al final de la emisin se reparten puntos entre los oyentes que han
concursado de la siguiente manera: 30 puntos si entre las 3 canciones
votadas est la 1, 20 puntos si est la 2 y 10 puntos suplementarios si
han acertado los dos ttulos ms votados.
Se desea obtener el nmero del oyente que ms puntos ha obtenido, ya
que se le dar un premio.
En el ejemplo:
34 Emisora de radio
Oyent e 0: 0 punt os
Oyent e 1: 30 punt os
Oyent e 2: 60 punt os
Oyent e 3: 20 punt os
Ganador : el oyent e nmer o 2
Emisora de radio 35
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. NumOyentes = 100. El nmero de mximo de oyentes que van a poder
participar en el consurso.
2. NumCanciones =10. Nmero de canciones que participan en el concurso.
3. NumVotos =3 . Nmero de votos que puede emitir cada participante
Representacin del las variables necesarias para la entrada
4. Necesitaremos una matriz de NumOyentes X NumVotos posiciones para
almacenar, por cada oyente participante, los votos emitidos en el
concurso de canciones; de manera que si votosOyentesC[i][j]=X indica que
el j-simo voto del participante i es a la cancin X.
votosOyentesC 0 2 ... NumVotos-1
0
2
...
NumOyentes-1

Representacin de las varables necesarias para los resultados
5. Necesitaremos un vector de NumCanciones posiciones para acumular por
cada cancin los dados por los oyentes participantes.
0 2 ... NumCanciones-1
votosXCancion

Pasos a seguir en la resolucin del problema
1. Leer los votos de los oyentes:
a. Inicializar a 0 el contador de oyentes participantes en el concurso (p).
b. Leer los tres votos del participante (v1, v2, v3).
c. Mientras la tripleta de votos sea vlida (primer voto distinto de -1)
i. Registrar los votos conservando el orden de emisin
(votosOyentesC[p][0], votosOyentesC[p][1], votosOyentesC[p][2])
ii. Incrementar en 1 el contador p de participantes
iii. Leer otra tripleta (v1, v2, v3) de votos a canciones
d. Determinar el nmero de participantes que ha habido en el concurso
(numParticipantes), siendo ste p-1 (debido a que la ltima tripleta leda
al tener -1 no corresponde a ningn participante).
2. Calcular las dos canciones ms votadas.
36 Emisora de radio
a. Primeramente, se calculan las puntuaciones de las canciones
(votosXCancion). Para ello realizar los siguientes pasos:
i. Inicializar los contadores de votos de las canciones a 0; es decir,
el vector votosXCancion a 0.
ii. Por cada oyente participante p, acumular sus tres votos emitidos
(votosOyentesC[p][j]), sabiendo que a la primera cancin obtiene 3
puntos, la segunda 2 y la tercera 1 punto. Estos incrementos se
acumulan a los puntos que ya tienen registrados en el vector
votosXCancion. Recalcar que han participado los oyentes del 0 a
numParticipantes.
iii. Por lo tanto, numParticipantes NumOyentes.
iv. Imprimir en pantalla la puntuacin de cada una de las canciones.
b. Posteriormente, se calculan las dos canciones con puntuacin ms
elevada.
i. Se comparan los votos obtenidos por las canciones 0 y 1. La que
tiene ms puntos es la primera y la otra la segunda.
ii. Con cada una de las canciones restantes c:
(1) Si c ha obtenido ms puntos que la mxima puntuada hasta
el momento (primera), actualizar los dos mximos del
siguiente orden: segunda con primera y primera con c.
(2) Sino, si c ha obtenido ms puntuacin que segunda, actualizar
slo el segundo mximo (segundo=c).
iii. Escribir en pantalla las dos canciones ms votadas.
3. Calcular el oyente ganador.
a. Se inicializa a 0 los puntos mximos actuales (maxPuntos).
b. Por cada oyente participante
i. Se determina si ha obtenido 0 puntos, 20 puntos, 30 puntos o
bien 60 puntos.
ii. Si la puntuacin supera el mximo de puntos actual, actualizar el
mximo de puntos actual (maxPuntos) y el participante que los ha
obtenido (oyenteGanador).
c. Imprimir en pantalla el oyente que ms puntos ha conseguido.
Emisora de radio 37
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define NumOyent es 100
#define NumCanci ones 10
#define NumVot os 3
main (){
int vot osOyent esC[ NumOyent es] [ NumVot os] ;
int vot osXcanci on[ NumCanci ones] ;
int p, numPar t i ci pant es, c, v, v1, v2, v3, pr i mer a, segunda;
int vot osP, maxPunt os, oyent eGanador ;

/ / Comi enzo del r egi st r o de vot os de l os oyent es par t i ci pant es
pr i nt f ( " Concur so LA CANCI ON DEL VERANO\ n. " ) ;
pr i nt f ( " Cada concur sant e vot ar a t r es canci ones, en or den de\ n
" ) ;
pr i nt f ( " pr ef er enci a de a l o sumo par t i ci par n NumOyent es\ n" ) ;
pr i nt f ( " Par a acabar , i nt r oduci r - 1 en l a pr i mer a canci n vot ada
\ n" ) ;
pr i nt f ( " de l a t r i pl et a. \ n" ) ;
p=0;
pr i nt f ( " Oyent e %d: " , p) ;
scanf ( " %d %d %d" , &v1, &v2, &v3) ;
while ( v1! =- 1)
{ vot osOyent esC[ p] [ 0] =v1;
vot osOyent esC[ p] [ 1] =v2;
vot osOyent esC[ p] [ 2] =v3;
p=p+1; / / Est e ser el si gui ent e par t i ci pant e.
pr i nt f ( " Oyent e %d: " , p) ;
scanf ( " %d %d %d" , &v1, &v2, &v3) ;
}
numPar t i ci pant es=p- 1; / *La l t i ma t r i pl et a t en a - 1 en l a pr i mer a
canci n, l uego su vot aci n no cuent a*/

/ / Det er mi nando l a punt uaci n de cada canci n
for ( c=0 ; c<NumCanci ones; c=c+1)
{ vot osXcanci on[ c] =0; }
38 Emisora de radio

for ( p=0; p<= numPar t i ci pant es; p=p+1)
{ for ( v=0; v< NumVot os; v=v+1)
{ vot osXcanci on[ vot osOyent esC[ p] [ v] ] =
( NumVot os- v) +vot osXcanci on[ vot osOyent esC[ p] [ v] ] ;
/ / l a f r mul a ( NumVot os- v) gener a l os val or es 3, 2 y 1
}
}
for ( c=0; c< NumCanci ones; c=c+1)
{ pr i nt f ( " Canci n %d: %d vot os \ n" , c, vot osXcanci on[ c] ) ; }

/ / Det er mi namosl as dos canci ones ms vot adas.
if ( vot osXcanci on[ 0] >=vot osXcanci on[ 1] )
{ pr i mer a=0; segunda=1; }
el se
{ pr i mer a=1; segunda=0; }
for ( c=2; c< NumCanci ones ; c=c+1)
{ if ( vot osXcanci on[ c] >vot osXcanci on[ pr i mer a] )
{ segunda=pr i mer a;
pr i mer a=c;
}
el se
{ / / Los vot os de c no super an l os de pr i mer a per o
i f ( vot osXcanci on[ c] >vot osXcanci on[ segunda] )
{segunda= c; }
}
} / / f i n del f or
pr i nt f ( " 1 canci n: %d \ n" , pr i mer a) ;
pr i nt f ( " 2 canci n: %d \ n " , segunda) ;

/ / Oyent e par t i ci pant e que ha acer t ado l as canci ones ms vot adas
maxPunt os=0; / *I ni ci al i zaci n de l a punt uaci n ms el evada
consegui da por l os par t i ci pant es*/
for ( p=0; p<=numPar t i ci pant es ; p=p+1)
{ vot osP=0;
f or ( v=0; v< NumVot os; v=v+1)
{ i f ( vot osOyent esC[ p] [ v] = pr i mer a)
Emisora de radio 39
{ vot osP= 30 + vot osP; }
el se
{ if ( vot osOyent esC[ p] [ v] = segunda)
{ vot osP= 20 + vot osP; }
}
if ( vot osP = 50)
{ vot osP=60; / *La punt uaci n debe ser 60 si ha vot ado
a l a Pr i mer a y l a Segunda ms vot adas*/
}
}
pr i nt f ( " Oyent e par t i ci pant e %d: %d punt os " , p, vot osP) ;
if ( vot osP>maxPunt os)
{ / / Se act ual i za el mxi mo con p y con sus r espect i vos punt os
maxPunt os=vot osP;
oyent eGanador =p;
}
}
pr i nt f ( " El ganador es el par t i ci pant e: %d \ n " , oyent eGanador ) ;
syst em( " PAUSE" ) ;
}
41
GASOLINERA
En la gasolinera AMOREBIETA nos han pedido que realicemos un estudio
sobre el uso de los distintos surtidores de combustible a lo largo de una
semana. En la gasolinera hay 12 surtidores que cada noche se rellenan a
5000 litros.
A lo largo de cada da, el operario introduce tuplas de surtidor y litros
solicitados. Si el tanque del que se ha solicitado el combustible tiene
suficientes litros se suministrarn todos ellos, sino tan slo se suministrarn
los existentes emitiendo un mensaje en el que se indique los litros que se
pueden suministrar. Al final de la jornada, el operario introducir un 1,
como nmero de surtidor, indicando el fin de datos de esa jornada laboral
(como litros solicitados cualquier otra cantidad). Este proceso se repetir
para cada da de la semana.
Ejemplo:
D a 0:
Sur t i dor , l i t r os: 7 40
Sur t i dor , l i t r os: 11 300
Sur t i dor , l i t r os: 11 400
Sur t i dor , l i t r os: 0 36
. . .
Sur t i dor , l i t r os: 11 400
Se l l enar con 100 l i t r os
Sur t i dor , l i t r os: 0 27
Sur t i dor , l i t r os: 11 300
Se l l enar con 0 l i t r os
Sur t i dor , l i t r os: 2 57
Sur t i dor , l i t r os: -1 0
D a 1:
. . .
D a 6:
. . .
Adems de los datos recogidos habr que almacenar la siguiente
informacin semanal:
1. Cada surtidor qu tipo de combustible almacena. Sabiendo que hay
cinco tipos distintos de combustible codificados de la siguiente manera:
0) EuroSuper95
1) Extra98
2) Star97
3) ExtraDiesel
4) Gasoleo
42 Gasolinera
Para cada surtidor se pedir el tipo de combustible que almacena.
Ejemplo:
I nt r oduce el t i po de combust i bl e da cada sur t i dor :
Sur t i dor 0: 0
Sur t i dor 1: 1
Sur t i dor 2: 0

Sur t i dor 11: 4
0 1 2 3 4 5 6 7 8 9 10 11
tipoSurtidores 0 1 0 1 2 2 3 0 3 0 4 4

2. La ganancia por litro y tipo de combustible se almacenar en otra tabla
(la ganancia vendr en Euros). Se pedir por cada tipo de combustible la
ganancia por litro.
Ejemplo:
Dame l a gananci a por l i t r o de cada t i po de combust i bl e:
Ti po 0: 0.02
Ti po 1: 0.03

Ti po 4: 0.02
0 1 2 3 4
gananciaTipo 0. 02 0. 03 0. 04 0. 01 0. 02
Se pide calcular lo siguiente:
a) Visualiza qu das y qu surtidores se han vaciado completamente.
b) Independientemente del tipo de combustible, qu da se han vendido
ms litros?
c) Qu tipo de combustible ha dado ms beneficio esta semana? Y,
cunto ha sido este beneficio?

Gasolinera 43
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. NumSurtidores = 12. Nmero de surtidores que tiene la gasolinera.
2. DiasSemana= 7. Nmero de das para los que se va ha realizar el estudio.
3. NumCombustibles=5. Nmero de diferentes combustibles que vende la
gasolinera.
Representacin del las variables necesarias para la entrada
4. Necesitaremos una matriz de DiasSemana x NumSurtidores posiciones,
dnde se almacenara la cantidad de litros que le quedan por vender a
cada surtidor. Al inicio de cada jornada laboral todos los surtidores
tendrn 5000 litros por vender.
amorebieta 0 1 ... NumSurtidores-1
0
1
...
DiasSemana-1

5. Necesitaremos un vector de NumSurtidores posiciones para almacenar el
tipo de combustible que vende cada surtidor.
0 1 ... NumSurtidores-1
tipoSurtidor

6. Necesitaremos un vector de NumCombustibles posiciones para almacenar
la ganancia por litro de cada tipo de combustible.
0 1 ... NumCombustibles-1
tipoGanancias

Representacin de las varables necesarias para los resultados
7. Necesitaremos un vector de DiasSemana posiciones para almacenar los
litros vendidos cada da de la semana, teniendo en cuenta todos los tipos
de combustible.
0 1 . . . Di asSemana- 1
ventasDia

8. Necesitamos un vector de NumCombustibles posiciones para almacenar
los litros de cada tipo de combustible vendidos. Finalmente utilizaremos
esta informacin para calcular las ganancias de cada tipo de
combustible.
0 1 ... NumCombustibles-1
ganancias


44 Gasolinera
Pasos a seguir en la resolucin del problema
1. Inicializar la matriz amorebieta a 5000.
2. Para cada da:
a. Leer la primera venta (sur, lit).
b. Mientras el surtidor sea distinto de 1 hacer:
i. Si tenemos suficientes litros en el surtidor entonces restar los
litros que han pedido si no escribir un mensaje con los litros que
se le dan y dejar a 0 el surtidor para ese da.
ii. Leer siguiente venta (sur, lit).
3. Para cada surtidor leer el tipo de combustible que vende y almacenarlo
en el vector tipoSurtidor.
4. Para cada tipo de combustible leer la ganancia que nos da cada litro
vendido y almacenarlo en el vector tipoGanancias.
5. Recorrer la matriz amorebieta y escribir las posiciones dnde
encontramos un 0, ya que esto indicar el da y el surtidor que ha
vendido todo el combustible.
6. Para cada da, sumar lo que se ha vendido entre todos los surtidores.
Para calcular lo que ha vendido un surtidor habr que restarle a 5000 el
valor almacenado en la matriz para ese da y surtidor. Los valores
obtenidos se almacenarn en la vector ventasDia.
a. Buscar y escribir la posicin del mximo en el vector ventasDia.
7. Para cada surtidor:
a. Contar cuantos litros ha vendido entre todos los das (recordad que
para calcular los litros vendidos hay que restarle a 5000 el valor de la
matriz) y almacenarlo en la variable surtidor.
b. Mirar el tipo de combustible que vende el surtidor, en el vector
tipoSurtidor, y almacenarlo en la variable combustible.
c. Acumular los litros vendidos (calculados en el paso 7-a, surtidor) en el
vector ganancias en la posicin que corresponda al tipo de
combustible vendido (calculado en el paso 7-b, combustible).
(ganancias[combustible]=curtidor+ganancias[combustible])
8. Para cada tipo de combustible:
a. Multiplicar el valor almacenado en el vector ganancias con el valor
acumulador en el vector tipoGanancias y dejarlo en el vector ganancias.
Gasolinera 45
9. Calcular el combustible que ha dado mayor ganancia, es decir, calcular la
posicin del mximo en el vector ganancias.
46 Gasolinera
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define Di asSemana 7
#define NumSur t i dor es 12
#define NumCombust i bl es 5
main(){
int amor ebi et a[ Di asSemana] [ NumSur t i dor es] ;
int t i poSur t i dor [ NumSur t i dor es] ;
float t i poGananci as[ NumCombust i bl es] , gananci as[ NumCombust i bl es] ;
int vent asDi a[ Di asSemana] ;
int g, s, sur , l i t , d, dMax, dMaxLi t r os, gMax, combust i bl e;
int di ar i o, sur t i dor ;

/ / I ni ci al i zar t odos l os sur t i dor es de t odos l os d as a 5000 l i t r os
for ( d=0; d < Di asSemana; d=d+1)
{ for ( s=0; s< NumSur t i dor es; s=s+1)
{ amor ebi et a[ d] [ s] =5000; }
}
/ / Par a cada d a de l a semana vamos a l eer sus vent as
for ( d=0 ; d< Di asSemana; d=d+1)
{ / / Leer vent as del d a d.
pr i nt f ( " Di a %d: \ n " , d) ;
pr i nt f ( " Sur t i dor , l i t r os: " ) ;
scanf ( " %d %d" , &sur , &l i t ) ;
while ( sur ! =- 1) / / Mi ent r as no sea el f i n de l a j or nada l abor al
{ / / Compr obar si el sur t i dor t i ene suf i ci ent es l i t r os
if ( amor ebi et a[ d] [ sur ] >=l i t )
{ amor ebi et a[ d] [ sur ] =amor ebi et a[ d] [ sur ] - l i t ; }
else
{ / / No hay suf i ci ent es l i t r os, se dan l os que hay
pr i nt f ( " \ t Se l l enar con %d l i t r os. \ n" , amor ebi et a[ d] [ sur ] ) ;
amor ebi et a[ d] [ sur ] =0 ;
}
pr i nt f ( " Sur t i dor , l i t r os: " ) ;
scanf ( " %d %d" , &sur , &l i t ) ;
Gasolinera 47
} / / f i n del whi l e
} / / f i n del f or

/ / Lect ur a del t i po de combust i bl e que t i ene cada sur t i dor
pr i nt f ( " I nt r oduce el t i po de combust i bl e que t i ene cada "
" sur t i dor : \ n " ) ;
for ( s=0; s< NumSur t i dor es; s=s+1)
{ pr i nt f ( " Sur t i dor %d: " , s) ;
scanf ( " %d" , &t i poSur t i dor [ s] ) ;
}

/ / Gananci as por cada l i t r o de combust i bl e vendi do
pr i nt f ( " Dame or denadament e l a gananci a que supone l a vent a\ n " ) ;
pr i nt f ( " de cada l i t r o de combust i bl e: \ n " ) ;
for ( g=0; g< NumCombust i bl es; g=g+1)
{ pr i nt f ( " Ti po %d: " , g) ;
scanf ( " %f " , &t i poGananci as[ g] ) ;
}

/ / a) I ndi ca qu d as y qu sur t i dor es se han vaci ado compl et ament e
for ( d=0; d< Di asSemana; d=d+1)
{ for ( s=0; s< NumSur t i dor es; s=s+1)
{ if ( amor ebi et a[ d] [ s] ==0)
{ pr i nt f ( " El di a %d el sur t i dor %d se ha quedado si n "
" combust i bl e. \ n " , d, s) ;
}
}
}

/ *b) qu d a se han vendi do ms l i t r os
Cal cul ar par a cada d a l os l i t r os vendi dos*/
for ( d=0; d < Di asSemana; d=d+1)
{ vent asDi a[ d] =0;
/ *Los l i t r os vendi dos el d a d son l a suma de l o vendi do por
t odos l os sur t i dor es}
for ( s=0; s< NumSur t i dor es: s=s+1)
{ vent asDi a[ d] = vent asDi a[ d] + ( 5000- amor ebi et a[ d] [ s] ) ; }
48 Gasolinera
}

/ / Cal cul ar el d a que se ha vendi do ms
dMax=0;
for ( d=0 ; d< Di asSemana; d=d+1)
{ if ( vent asDi a[ d] > vent asDi a[ dMax] )
{ dMax=d; }
}
pr i nt f ( " El d a de l a semana que se han vendi do ms l i t r os es "
" %d con %d l i t r os \ n' , dmax, vent asDi a[ dMax] ) ;

/ *c) Qu t i po de gasol i na ha dado ms benef i ci o est a semana?
Cunt o? */
for ( s=0; s< NumSur t i dor es; s=s+1)
{ / / Cal cul ar l os l i t r os que ha vendi do el sur t i dor s.
sur t i dor =0;
for ( d=0 ; d< Di asSemana; d=d+1)
{ sur t i dor = sur t i dor + ( 5000- amor ebi et a[ d] [ s] ) ; }
/ / Cal cul ar el t i po de gasol i na que vende el sur t i dor s.
combust i bl e=t i poSur t i dor [ s] ;
/ / Acumul ar l i t r os vendi dos por t i po de combust i bl e.
gananci as[ combust i bl e] =gananci as[ combust i bl e] + sur t i dor ;
}
/ / Cal cul ar gananci as de cada t i po de combust i bl e.
for ( g=0; g< NumCombust i bl es; g=g+1)
{ gananci as[ g] = t i poGananci as[ g] * gananci as[ g] ; }

/ / Cal cul ar el combust i bl e que ha dado mayor gananci a.
gMax=0;
for ( g=0 ; g< NumCombust i bl es; g=g+1)
if ( gananci as[ g] >gananci as[ gMax] )
{ gMax=g; }
}
pr i nt f ( " El t i po de combust i bl e que ha dado mayor gananci as es "
" %d con una gananci a de %7. 2f eur os\ n" , gMax, gananci as[ gMax] ) ;
syst em( " PAUSE" ) ;
}
49
TIENDA
Una pequea tienda guarda informacin de las ventas de sus artculos a lo
largo del ao 2009. La tienda dispone de 100 artculos diferentes.
Se pide escribir un programa que realice las siguientes tareas:
1. Leer las ventas de los artculos (en unidades) a lo largo de los 12 meses
del ao.
2. Leer la lista de precios por artculo y obtener el mes que ms ganancias
ha tenido.
3. Por cada artculo leer el total de ganancias del periodo comprendido
entre los meses de julio y diciembre del ao 2008. A continuacin
comparar estos datos con los del mismo periodo del 2009 (ledos en el
apartado 1). Indicar cuntos artculos han superado las ganancias en el
ao 2009 y cuales son estos artculos.
Ejemplo de ejecucin:
Para el apartado 1)
Introduce las ventas de los artculos de la siguiente forma (en negrita los
datos tecleados por el usuario):
Ar t cul o, mes , vent as : 1 5 800 (son unidades)
Ar t cul o, mes , vent as : 0 4 700
Ar t cul o, mes , vent as : 4 5 100
Ar t cul o, mes , vent as : 6 5 800
Ar t cul o, mes , vent as : 6 11 800
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
Ar t cul o, mes , vent as : 1 0 800
Ar t cul o, mes , vent as : -1 0 0
Tal y como se indica, los datos se introducen a travs de tros
desordenados (Artculo, mes , ventas), adems, slo se introducen los
datos de los meses y artculos que han tenido ventas. Las ventas
indicarn el total de unidades vendidas de ese artculo en ese mes.
Ejemplo del resultado a obtener en pantalla para el apartado 2)
El mes 3 es el mes que ms gananci as ha t eni do: 1000, 50 eur os.
Para realizar esto previamente se leer un array con los precios, en euros,
de cada artculo, de la siguiente forma (en negrita los datos tecleados por
el usuario):
Pr eci o del ar t cul o 0: 123,50
Pr eci o del ar t cul o 1: 12,03
Pr eci o del ar t cul o 2: 1,73
. . . . . . . . . . . .
50 Tienda
. . . . . . . . . . .
Pr eci o del ar t cul o 99: 129
Ejemplo del resultado, para el apartado 3)
Los ar t cul os que han super ado l as gananci as, en el per i odo
compr endi do ent r e l os meses de J ul i o y Di ci embr e, r espect o al
ao 2008 son: 2, 5, 44, 99
Tot al ar t cul os: 4
Previamente a esto se introducir en un array las ganancias, en euros,
realizadas de cada artculo en el ao 2008, de la forma (en negrita los
datos tecleados por el usuario):
Gananci as obt eni das ent r e l os meses de J ul i o y Di ci embr e del
2008: ( en euros)
Vent as del ar t cul o 0: 970,52
Vent as del ar t cul o 1: 8870,75
Vent as del ar t cul o 2: 1170
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
Vent as del ar t cul o 99: 909870

Tienda 51
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. NumMeses = 12. Nmero de meses para los que se va ha realizar el
estudio.
2. NumArticulos = 100. Nmero de artculos que vende la tienda.
3. Julio = 7. Es el mes a partir del cual nos piden que comparemos con las
ventas del ao 2008.
Representacin del las variables necesarias para la entrada
4. Necesitaremos una matriz de NumArticulos x NumMeses posiciones,
dnde se almacenarn las unidades de cada artculo vendidas cada mes.
ventas 0 1 ... NumMeses-1
0
1
...
NumArticulos-1

5. Necesitaremos un vector de NumArticulos posiciones dnde
almacenaremos el precio de cada artculo.
0 1 ... NumArticulos-1
precio

6. Necesitaremos un vector de NumArticulos posiciones dnde
almacenaremos las ganancias de cada artculo correspondientes a los
meses de Julio Diciembre del ao 2008.
0 1 ... NumArticulos-1
ventas2008

Representacin de las varables necesarias para los resultados
7. Necesitamos un vector de NumMeses posiciones, dnde almacenaremos
las ganancias obtenidas cada mes teniendo en cuenta todos los artculos.
0 1 ... NumMeses-1
ventasMes

8. Necesitaremos un vector de NumArticulos posiciones, dnde
almacenaremos las ganancias de cada artculo correspondientes a los
meses de Junio Diciembre del ao 2009.
0 1 ... NumArticulos-1
ventas2009


52 Tienda
Pasos a seguir en la resolucin del problema
1. Inicializar la matriz ventas a 0.
2. Leer primera tripleta (art, mes, vent).
3. Mientras el primer valor de la tripleta sea distinta de -1, hacer:
a. Almacenar las ventas en la matriz ventas, en la fila art y columna mes.
b. Leer siguiente tripleta (art, mes, vent).
4. Para cada artculo leer su precio y almacenarlo en el vector precio.
5. Para cada mes:
a. Inicializar las ganancias del mes a 0 (ventasMes).
b. Para cada artculo (art) sumar a las ganancias del mes (mes). Para
calcular las ganancias del mes, multiplicar las ventas del artculo en
ese mes (almacenado en la matriz ventas[art][ mes]) con el precio del
artculo (almacenado en el vector precio[art]).
6. Calcular y escribir el mes de mayor ganancia, es decir, calcular la
posicin del mximo del vector ventasMes (calculado en el apartado 5).
7. Leer las ganancias de cada artculo correspondiente a los meses de Julio-
Diciembre del ao 2008 y almacenarlo en el vector ventas2008.
8. Vamos a calcular las ganancias de cada artculo correspondientes a los
meses de Julio-diciembre del ao 2009, para ello realizaremos los
siguientes pasos:
Para cada artculo:
a. Inicializar ventas del artculo a 0 (ventas2009)
b. Para cada mes entre los meses de Julio a Diciembre sumar la
cantidad de artculos vendidos ese mes (almacenado en la matriz
ventas) a los ya acumulados.
c. Multiplicar la cantidad de artculos vendidos por el precio del
artculo (almacenado en el vector precio).
9. Inicializar contador de artculos con mayor venta en 2009 a 0 (num).
10. Para cada artculo (art):
a. Si las ventas del ao 2009 (ventas2009[art]) son mayores que las
ventas del ao 2008 (ventas2008[art]) entonces escribir el nmero del
artculo e incrementar contador (num) en 1.
11. Escribir contador (num) de artculos con mayor venta en 2009.
Tienda 53
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define NumAr t i cul os 100
#define NumMeses 12
#define J ul i o 7
main(){
int vent as[ NumAr t i cul os] [ NumMeses] ;
int pr eci o[ NumAr t i cul os] , vent as2008[ NumAr t i cul os] ;
int vent as2009[ NumAr t i cul os] , vent asMes[ NumMeses] ;
int mVent aMax, ar t , mes, vent , num;

/*Inicializar a 0 la matriz Ventas para que todas las posiciones
tengan valores vlidos tras la lectura*/
for ( ar t =0; ar t < NumAr t i cul os; ar t =ar t +1)
{ for ( mes=0; mes< NumMeses; mes=mes+1)
{ vent as[ ar t ] [ mes] =0; }
}

//Introduccin de los datos.
pr i nt f ( " Vent a de l os ar t i cul os: \ n " ) ;
pr i nt f ( " Ar t i cul o, Mes, Vent as: " ) ;
scanf ( " %d %d %d" , &ar t , &mes, &vent ) ;
while ( ar t ! =- 1)
{ vent as[ ar t ] [ mes] =vent ;
pr i nt f ( " Ar t i cul o, Mes, Vent as: " ) ;
scanf ( " %d %d %d" , &ar t , &mes, &vent ) ;
}

//Lectura de los precios de los artculos.
pr i nt f ( " Dame l os pr eci os de l os ar t cul os: \ n" ) ;
for ( ar t =0; ar t < NumAr t i cul os; ar t =ar t +1)
{ pr i nt f ( " Pr eci o del ar t i cul o %d: " , ar t ) ;
scanf ( " %d" , &pr eci o[ ar t ] ) ;
}

//Clculo de la ganancia mensual por producto.
for ( mes=0; mes< NumMeses; mes=mes+1)
{ vent asMes[ mes] =0;
for ( ar t =0; ar t < NumAr t i cul os; ar t =ar t +1)
54 Tienda
{vent asMes[ mes] = vent asMes[ mes] +( vent as[ ar t ] [ mes] *pr eci o[ ar t ] ) ; }
}

//Posicin del vector con mximo valor.
mVent aMax=0;
for ( mes=0; mes< NumMeses; mes=mes+1)
{ if ( vent asMes[ mVent aMax] <vent asMes[ mes] )
{ mVent aMax = mes; }
}
pr i nt f ( " El mes con mayor gananci a es %d, con unas vent as"
" de %d eur os. \ n" , mVent aMax, vent asMes[ mVent aMax] ) ;

//Lectura de ganancias por artculo entre Julio-Diciembre del 2008.
pr i nt f ( " Gananci as obt eni das ent r e l os meses de J ul i o y Di ci embr e"
" del 2008: \ n " ) ;
for ( ar t =0; ar t < NumAr t i cul os; ar t =ar t +1)
{ pr i nt f ( " Vent as del ar t i cul o %d: " , ar t ) ;
scanf ( " %d" , &vent as2008[ ar t ] ) ;
}

//Clculo de las ganancias por artculo entre Julio-Dic. del 2009.
for ( ar t =0; ar t < NumAr t i cul os; ar t =ar t +1)
{ vent as2009[ ar t ] =0;
for ( mes=J ul i o; mes< NumMeses; mes=mes+1)
{ vent as2009[ ar t ] = vent as2009[ ar t ] + vent as[ ar t ] [ mes] ; }
vent as2009[ ar t ] = vent as2009[ ar t ] *pr eci o[ ar t ] ;
}

/*Comparar las ganancias del periodo de Julio-Diciembre del ao
2008 y 2009 */
pr i nt f ( " Los ar t cul os que han super ado l as gananci as, en el "
" per i odo compr endi do ent r e l os meses de J ul i o y "
" Di ci embr e, r espect o al ao 2008 son: " ) ;
num=0;
for ( ar t =0; ar t < NumAr t i cul os; ar t =ar t +1)
{ if ( vent as2008[ ar t ] <vent as2009[ ar t ] )
{ pr i nt f ( " %d, " , ar t ) ;
num=num+1;
}
}
pr i nt f ( " \ n Tot al ar t cul os : %d \ n " , num) ;
syst em( " PAUSE" ) ;
}
55
CENTRAL ELCTRICA
Una central elctrica desea realizar un estudio sobre la cantidad de energa
que suministra diariamente. Para ello, el programa informtico que se ha de
desarrollar deber permitir recoger los datos de las potencias tpicas, en
megavatios, suministradas diariamente durante un perodo mximo de 52
semanas (1 ao).
1. La entrada de datos se deber programar de forma que, para cada
semana, se introduzcan las potencias suministradas durante los 7 das.
Cuando se desee finalizar la entrada de datos (por ejemplo, en el caso de
realizar el estudio para un periodo inferior a las 52 semanas) se deber
introducir un 1, como dato de la potencia, en el primer da de la
semana.
Ejemplo de entrada de datos:
Semana 0
Pot enci a sumi ni st r ada del d a 0: 207
Pot enci a sumi ni st r ada del d a 1: 301
Pot enci a sumi ni st r ada del d a 2: 222
Pot enci a sumi ni st r ada del d a 3: 302
Pot enci a sumi ni st r ada del d a 4: 22
Pot enci a sumi ni st r ada del d a 5: 167
Pot enci a sumi ni st r ada del d a 6: 125
Semana 1
Pot enci a sumi ni st r ada del d a 0: 367
Pot enci a sumi ni st r ada del d a 1: 60
Pot enci a sumi ni st r ada del d a 2: 120
Pot enci a sumi ni st r ada del d a 3: 111
Pot enci a sumi ni st r ada del d a 4: 301
Pot enci a sumi ni st r ada del d a 5: 400
Pot enci a sumi ni st r ada del d a 6: 434
Semana 2
Pot enci a sumi ni st r ada del d a 0: 211
Pot enci a sumi ni st r ada del d a 1: 72
Pot enci a sumi ni st r ada del d a 2: 441
Pot enci a sumi ni st r ada del d a 3: 102
Pot enci a sumi ni st r ada del d a 4: 21
Pot enci a sumi ni st r ada del d a 5: 203
Pot enci a sumi ni st r ada del d a 6: 317
Semana 3
Pot enci a sumi ni st r ada del d a 0: 401
Pot enci a sumi ni st r ada del d a 1: 340
Pot enci a sumi ni st r ada del d a 2: 161
Pot enci a sumi ni st r ada del d a 3: 297
Pot enci a sumi ni st r ada del d a 4: 441
Pot enci a sumi ni st r ada del d a 5: 117
Pot enci a sumi ni st r ada del d a 6: 206
Semana 4
Pot enci a sumi ni st r ada del d a 0: -1
56 Central elctrica
2. Para cada da de la semana calcular y escribir la potencia media e indicar
cul ha sido el da de mayor potencia media.
3. Calcular y escribir la potencia media de todo el periodo sometido a
estudio.
4. Calcular y escribir el nmero de das, en los que la potencia suministrada
ha sido superior a la potencia media de todo el periodo (calculado en el
apartado anterior).
5. Debido al libre mercado, semanalmente se establecen los precios de
ganancia por megavatio. Introducir en un array la ganancia
(/megavatio) para cada semana del periodo estudiado, y calcular y
escribir la ganancia semanal y total de la central.

Central elctrica 57
ANLISIS DEL PROBLEMA
Constantes del enunciado
6. NumDias = 7. Nmero de das para los que se va ha realizar el estudio.
7. NumSemanas= 52. Nmero de semanas para las que se va ha realizar el
estudio.
Representacin del las variables necesarias para la entrada
8. Necesitaremos una matriz de NumSemanas X NumDias posiciones para
almacenar las potencias consumidas cada da de la semana.
potencias 0 1 ... NumDias-1
0
1
...
NumSemana-1s

9. Necesitamos un vector de NumSemanas posiciones para almacenar el
precio en euros de cada megavatio.
0 1 ... NumSemanas-1
gananciaPS

Representacin de las varables necesarias para los resultados
10. Necesitaremos un vector de NumDias posiciones para almacenar la
potencia media consumida cada da de la semana.
0 1 ... NumDias-1
mediaD

Pasos a seguir en la resolucin del problema
1. Inicializar contador semanas a 0 (semanas)
2. Leer la potencia correspondiente al primer da de la primera semana
(valorLunes)
3. Mientras potencia leda (valorLunes) sea distinta de 1 y el contador de
semanas (semanas) sea menor a numSemanas hacer:
a) Almacenar la potencia leda en la matriz potencias, fila semana y
columna 0 (lunes).
b) Para el resto de los das de la semana (dia) leer la potencia y
almacenarla en la matriz potencias fila semana y columna dia.
c) Incrementar contador semanas
d) Leer la potencia correspondiente al primer da de la semana
(valorLunes)
58 Central elctrica
4. Decrementar en 1 el contador semanas, para que indique el nmero de la
ltima semana hasta la que se han introducido datos.
5. Calcular la potencia media de la semana y para cada da la potencia
media consumida y almacenarlo en el vector mediaD, de la siguiente
forma:
a. Inicializar la potencia media de la semana a 0 (potMedia)
b. Para cada da de la semana:
i) Inicializar suma potencias del da a 0 (mediaD[dia]=0).
ii) Para cada semana tratada acumular la potencia gastada ese da
esa semana en la suma de potencias (mediaD).
iii) Dividir la suma de las potencias consumidas entre las semanas
tratadas.
iv) Acumular la potencia del da a la potencia media de la semana.
6. Calcular la potencia media de la semana, para ello dividir la suma de las
potencias medias diarias (potMedia) entre el nmero de das. Escribir el
resultado por pantalla.
7. Calcular el da de mayor consumo de la semana. Para ello hay que
buscar la posicin del valor mximo en el vector mediaD.
8. Inicializar contador de das que superan la potencia media a 0 (diasPM)
9. Para cada da de la semana:
a) Para cada semana tratada:
i. Si la potencia consumida esa semana y ese da (potencias[sem][dia])
es mayor a la potencia media (potMedia) entonces incrementar
contador (diasPM).
10. Escribir por pantalla el valor del contador diasPM.
11. Calcular la ganancia semanal y la ganancia de todo el periodo, para ello:
Inicializar a 0 la ganancia total (gananciaTotal).
Para cada semana:
a. Ganancia semana es igual a 0 (gananciaSemanal)
b. Para cada da acumular la potencia consumida y almacenarlo en la
variable gananciaSemanal
c. Multiplicar la ganancia semanal (gananciaSemanal) con el precio del
megavatio por cada semana (almacenado en el vector gananciaPS), y
escribir por pantalla el resultado obtenido.
Central elctrica 59
d. Acumular la ganancia semanal (gananciaSemanal) a la ganancia total
(gananciaTotal)
12. Escribir por pantalla la ganancia total (gananciaTotal) de la central.

60 Central elctrica
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define NumDi as 7
#define NumSemanas 52
main(){
int pot enci as[ NumSemanas] [ NumDi as] ;
float medi aD[ NumDi as] , gananci aPS[ NumSemanas] ;
float pot Medi a, gananci aTot al , gananci aSemanal ;
int semanas, di asPM, val or Lunes, di a, sem, dMax;

//Lectura de los datos.
semanas=0;
pr i nt f ( " Semana %d \ n " , semanas) ;
pr i nt f ( " Pot enci a sumi ni st r ada del di a 0: " ) ;
scanf ( " %d" , &val or Lunes) ;
while ( ( val or Lunes! =- 1) && ( semanas<NumSemanas) )
{ pot enci as[ semanas] [ 0] =val or Lunes;
/ / Segui mos en el di a 1( mar t es) .
for ( di a=1 ; di a< NumDi as; di a=di a+1)
{ pr i nt f ( " Pot enci a sumi ni st r ada del di a %d: " , di a) ;
scanf ( " %d" , &pot enci as[ semanas] [ di a] ) ;
}
semanas=semanas+1;
pr i nt f ( " Semana %d \ n " , semanas) ;
pr i nt f ( " Pot enci a sumi ni st r ada del di a 0: " ) ;
scanf ( " %d" , &val or Lunes) ;
}
semanas=semanas- 1; //ltima semana que se ha completado.
pr i nt f ( " \ n" ) ;

//Media de los lunes, de los martes,... y la media de la semana.
pot Medi a=0;
for ( di a=0 ; di a< NumDi as; di a=di a+1)
{ medi aD[ di a] =0;
for ( sem=0; sem<=semanas; sem=sem+1)
{ medi aD[ di a] =medi aD[ di a] +pot enci as[ sem] [ di a] ; }
Central elctrica 61
medi aD[ di a] =medi aD[ di a] / ( semanas+1) ;
pr i nt f ( " La medi a del di a %d es %6. 2f \ n" , di a, medi aD[ di a] ) ;
pot Medi a=pot Medi a+medi aD[ di a] ;
}
pot Medi a=pot Medi a/ NumDi as;
pr i nt f ( " Pot enci a medi a de t odo el per i odo: %6. 2f \ n " , pot Medi a) ;

// Calcular el da con mayor potencia.
dMax=0;
for ( di a=1 ; di a< NumDi as; di a=di a+1)
{ if ( medi aD[ dMax] <medi aD[ di a] )
{ dMax=di a; }
}
pr i nt f ( " D a de l a semana con medi a mayor : %d \ n " , dMax) ;

// Numero de das que superan la potencia media.
di asPM=0;
for ( di a=0 ; di a< NumDi as; di a=di a+1)
{ for ( sem=0; sem<=semanas; sem=sem+1)
{ if ( pot enci as[ sem] [ di a] >pot Medi a)
{ di asPM=di asPM+1; }
}
}
pr i nt f ( " Nmer o de d as que super an l a pot enci a medi a: %d\ n, di asPM) ;

pr i nt f ( " I nt r oduce en una l nea y separ ados por bl ancos l a "
" gananci a semanal por KWconsumi do: " ) ;
for ( sem=0; sem<=semanas; sem=sem+1)
{ scanf ( " %f " , &gananci aPS[ sem] ) ; }

gananci aTot al =0;
for ( sem=0; sem<=semanas; sem=sem+1)
{ gananci aSemanal =0;
for ( di a=0 ; di a< NumDi as; di a=di a+1)
{ gananci aSemanal =gananci aSemanal +pot enci as[ sem] [ di a] ; }
gananci aSemanal =gananci aSemanal *gananci aPS[ sem] ;
pr i nt f ( " Semana: %d gananci a : %6. 2f \ n" , sem, gananci aSemanal ) ;
gananci aTot al =gananci aTot al +gananci aSemanal ;
62 Central elctrica
}
pr i nt f ( " La gananci a t ot al consegui da es: %6. 2f \ n" , gananci aTot al ) ;
syst em( " PAUSE" ) ;
}

63
LADRN ELCA COMAYOR
El seor Elca Comayor ha decidido hacer un programa para ver como va su
negocio. El negocio de nuestro amigo es un tanto curioso, pues se dedica al
mundo del robo y est sumamente interesado en desarrollar un programa
que le ayude a llevar sus cuentas.
l quiere guardar los datos de las ltimas 8 semanas. Hay que tener en
cuenta que l puede trabajar todos los das de la semana, pues no cierra
nunca su negocio. De esta manera, a medida que va haciendo las cuentas
introduce tres datos en el programa: la semana (del 0 al 7), el da (del 0 al 6)
y la cantidad que ha robado ese da. Cuando introduzca un -1 en el lugar que
le corresponde a la semana el programa entender que la entrada de datos ha
finalizado.
Ejemplo: (en negrita los datos tecleados por el usuario)
I nt r oduce l os dat os ( semana, d a, cant i dad) : 3 5 300
I nt r oduce l os dat os ( semana, d a, cant i dad) : 0 1 50
I nt r oduce l os dat os ( semana, d a, cant i dad) : 5 6 179
I nt r oduce l os dat os ( semana, d a, cant i dad) : 1 2 22
I nt r oduce l os dat os ( semana, d a, cant i dad) : -1 0 0
Adems de estos datos, nuestro amigo Elca Comayor introduce los datos de
sus gastos de las ltimas 8 semanas, esto es, cunto ha gastado cada una de
las semanas.
Ejemplo:
Dat o de l a semana 0: 77
Dat o de l a semana 1: 60
. . . . . . . . . . .
. . . . . . . . . . .
Dat o de l a semana 7: 99
Tras introducir todos estos datos, nuestro amigo el empresario quiere
conocer los siguientes datos:
1. Cunto ha robado cada semana y cul ha sido la semana en la que ms
ha robado.
2. Cunto ha robado por cada uno de los das de la semana, esto es, cunto
los lunes, martes, ... y cul es el da de la semana que ms roba, para
poder dedicarle ms tiempo a su negocio ese da.
3. Cunto ha ganado cada semana y el total ganado en las 8 semanas,
teniendo en cuenta los gastos.
4. Cul ha sido el primer da en el que no ha cometido ningn robo.
Adems, l sabe que si la polica le detiene, recibir el castigo dependiendo
de lo que ha robado:
64 Ladrn Elca Comayor
Menos de 5. 000 Real i zar obr as en l a comuni dad
Menos de 10. 000 3 meses en pr i si n
Menos de 20. 000 6 meses en pr i si n
Ms de 20. 000 Un ao en pr i si n
A nuestro amigo Elca Comayor no le agrada nada la idea de tener que ir a
prisin, por lo que le interesan mucho las consecuencias de su negocio. Por
lo tanto, haz que el programa le diga a nuestro amigo cul es la sancin que
se le aplicar si le detienen.
Ladrn Elca Comayor 65
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. DiasSemana = 7. Es el nmero de das que tiene una semana.
2. NumSemanas = 8. Es el nmero de semanas que va a analizar el ladrn.
Representacin de las variables necesarias para la entrada
3. Necesitaremos una matriz de NumSemanas x DiasSemana posiciones, a la
que llamaremos cuentas dnde se guarden los euros robados cada da de
la semana a lo largo de las 8 semanas.
cuentas 0 1 ... DiasSemana-1
0
1
...
NumSemanas-1

4. Necesitaremos un vector Gastos, de NumSemanas posiciones, para
almacenar los euros que gasta el ladrn cada una de las semanas.
0 1 ... NumSemanas-1
gastos

Representacin de las variables necesarias para los resultados
5. Necesitaremos un vector al que llamaremos robosSem, de NumSemanas
posiciones, para almacenar la cantidad de dinero que roba cada una de
las semanas.
0 1 ... NumSemanas-1
robosSem

6. Necesitaremos un vector robosDias, de DiasSemana posiciones, para
almacenar la cantidad de dinero que roba cada uno de los tipos de da.
0 1 ... DiasSemana-1
robosDias

7. Necesitaremos un vector ganancias, de NumSemanas posiciones, para
almacenar la cantidad de dinero que gana por semana, esto es, despus
de hacer la diferencia entre lo que roba y lo que gasta.
0 1 ... NumSemanas-1
ganancias

Pasos a seguir en la resolucin del problema
1. Inicializar la matriz cuentas a 0.
2. Leer la primera tripleta correspondiente al robo (s, d, c).
3. Mientras la semana sea distinta de -1:
66 Ladrn Elca Comayor
a. Aadir los datos en la matriz cuentas.
b. Leer siguiente tripleta de robo (s, d, c).
4. Para cada semana:
a. Leer y guardar el dato correspondiente al gasto de dicha semana.
5. Inicializar el vector robosSem.
6. Para cada semana:
a. Calcular cunto ha robado.
7. Para cada semana:
a. Escribir por pantalla cunto ha robado.
8. Calcular y escribir cul de las semanas ha robado mayor cantidad.
9. Inicializar el vector robosDias.
10. Para cada da de la semana:
a. Calcular cunto ha robado.
11. Calcular y escribir cul es el da que ms roba.
12. Para cada semana:
a. Calcular cunto ha ganado, restando lo que ha robado menos lo que
ha gastado.
13. Escribir cunto ha ganado cada semana.
14. Calcular y escribir lo que ha ganado en total.
15. Inicializar la variable terminar a 0 (falso).
16. Mientras terminar sea 0 y no hayamos ledo toda la matriz
a. Leer la matriz por filas y buscar la primera posicin que haya un 0.
b. Si encontramos la posicin en la que hay un 0 poner la variable
terminar a 1 (verdad).
17. Escribir la primera posicin (semana y da) que hay un 0.
18. Sumar la cantidad que ha robado.
19. Escribir el castigo que le impondrn si le detienen.
Ladrn Elca Comayor 67
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define Di asSemana 7
#define NumSemanas 8
main(){
int cuent as[ NumSemanas] [ Di asSemana] ;
int r obosSem[ NumSemanas] , gast os[ NumSemanas] ;
int gananci as [ NumSemanas] , r obosDi as[ Di asSemana] ;
int s, d, c, semMax, di aMax, gananci aTot al ;
int t ot al Robado, sem0, di a0, t er mi nar ;

/ / I ni ci al i zamos l a mat r i z a 0.
for ( s= 0; s< NumSemanas; s=s+1)
{ for ( d = 0; d< Di asSemana; d=d+1)
{ cuent as[ s] [ d] = 0; }
}
/ / Vamos i nt r oduci endo l o que ha r obado cada d a.
pr i nt f ( " I nt r oduce l os dat os ( semana, d a, cant i dad) : " ) ;
scanf ( " %d %d %d" , &s, &d, &c) ;
while ( s! = - 1)
{ cuent as[ s] [ d] =cuent as[ s] [ d] +c;
pr i nt f ( " I nt r oduce l os dat os ( semana, d a, cant i dad) : " ) ;
scanf ( " %d %d %d" , &s, &d, &c) ;
}

/ / I nt r oduci mos l os gast os de cada semana.
for ( s= 0; s< NumSemanas; s=s+1)
{ pr i nt f ( " Gast os de l a semana %d: " , s) ;
scanf ( " %d" , &gast os[ s] ) ;
}

/ *Cunt o ha r obado cada semana y cul ha si do l a semana en l a que
ms ha r obado. */
/ / I ni ci al i zamos el vect or RoboSem.
for ( s= 0; s< NumSemanas; s=s+1)
r obosSem[ s] =0;
68 Ladrn Elca Comayor

/ / Cal cul amos cunt o ha r obado cada semana.
for ( s= 0; s< NumSemanas; s=s+1)
{ for ( d = 0; d< Di asSemana; d=d+1)
{ r obosSem[ s] =r obosSem[ s] +cuent as[ s] [ d] ; }
/ / Escr i bi mos cunt o ha r obado cada semana}
pr i nt f ( " La semana %d ha r obado %d eur os. " , s, r obosSem[ s] ) ;
}

/ / Cal cul amos qu semana ha r obado ms.
semMax=0;
for ( s=1; s< NumSemanas; s=s+1)
{ if ( r obosSem[ s] > r obosSem[ semMax] )
{ semMax= s; }
}
/ / Escr i bi mos en qu semana ha r obado ms.
pr i nt f ( " La semana que ms ha r obado ha si do l a semana %d"
" con %d \ n " , semMax, r obosSem[ semMax] ) ;

/ *Cunt o ha r obado por cada uno de l os d as de l a semana, y cul es
el d a de l a semana que ms r oba*/
for ( d = 0; d< Di asSemana; d=d+1)
{ r obosDi as[ d] =0; }
/ / Cal cul amos cunt o ha r obado por d as de l a semana.
for ( d = 0; d< Di asSemana; d=d+1)
{ r obosDi as[ d] =0; / / I ni ci al i zamos el vect or r obosDi as.
f or ( s=0; s< NumSemanas; s=s+1)
{ r obosDi as[ d] = r obosDi as[ d] + cuent as[ s] [ d] ; }
}
/ / Cal cul amos cul es el d a de l a semana que ms r oba.
di aMax=0;
for ( d = 1; d< Di asSemana; d=d+1)
{ if ( r obosDi as[ d] > r obosDi as[ di aMax] )
{ di aMax = d; }
}
/ / Escr i bi mos cul es el d a de l a semana que ms r oba.
pr i nt f ( " El d a de l a semana que ms r oba es el " , di aMax) ;
Ladrn Elca Comayor 69
/ *Cunt o ha ganado cada semana y el t ot al ganado en l as 8 semanas,
t eni endo en cuent a l os gast os*/
/ / Cal cul amos cunt o ha ganado cada semana.
for ( s=0; s< NumSemanas; s=s+1)
{ gananci as[ s] =r obosSem[ s] - gast os[ s] ;
pr i nt f ( " La semana %d ha ganado %d eur os. \ n" , s , gananci as[ s] ) ;
}
/ / Sumamos l o que ha ganado en t ot al .
gananci aTot al = 0;
for ( s=0; s< NumSemanas; s=s+1)
gananci aTot al = gananci aTot al + gananci as[ s] ;
/ / Escr i bi mos l o que ha ganado en l as 8 semanas.
pr i nt f ( " En t ot al ha ganado %d eur os. \ n " , gananci aTot al ) ;

/ / Cul ha si do el pr i mer d a en el que no ha comet i do ni ngn r obo.
t er mi nar = 0;
s=0;
while ( t er mi nar ==0 && s< NumSemanas)
{ d=0;
while ( t er mi nar ==0 && d<Di asSemana)
{ if ( cuent as[ s] [ d] ==0 )
{ sem0=s;
di a0=d;
t er mi nar = 1;
}
d= d + 1;
}
s= s + 1;
}
pr i nt f ( " El pr i mer d a en no comet er un r obo ha si do el %d"
" en l a semana %d. \ n " , di a0, sem0) ;

/ / Cal cul amos el cast i go dependi endo de l o que haya r obado.
/ / Cal cul amos l o que ha r obado en t ot al .
t ot al Robado=0;
for ( s=0; s< NumSemanas; s=s+1)
t ot al Robado= t ot al Robado + r obosSem[ s] ;
70 Ladrn Elca Comayor
/ / Qu cast i go r eci bi r si l e det i ene l a pol i c a.
if ( t ot al Robado< 5000 )
{ pr i nt f ( " Tendr as que hacer obr as en l a comuni dad. " ) ; }
else if ( t ot al Robado<10000 )
{ pr i nt f ( " Tendr as que i r 3 meses a pr i si n. " ) ; }
else if ( t ot al Robado<20000 )
{ pr i nt f ( " Tendr as que i r 6 meses a pr i si n. " ) ; }
else { pr i nt f ( " Tendr as que i r 1 ao a pr i si n. " ) ; }
syst em( " PAUSE" ) ;
}
71
CUMBRES DE MONTAA
Tenemos como datos de entrada una lista de 10 valores enteros que nos
indican los metros correspondientes a la altura de 10 cumbres de montaa.
A continuacin nos dan una lista de pares de datos, donde cada par est
compuesto por dos valores enteros (el primero es un valor entre 0 y 6 y el
segundo un valor entre 0 y 9). Dichos valores representan el n del
montaero y n de cumbre que dicho montaero ha conseguido subir
alguna vez. Tener en cuenta que un montaero podr repetir la ascensin de
una cumbre de montaa y que la entrada de datos terminar al introducise
un -1 en el primer valor del par sin importar el valor del segundo dato.
Se pide:
1. Programar la entrada de datos (altura de las cumbres y la lista de pares
terminada en -1) en los vectores y/o matrices que necesites para
resolver el problema.
2. Devolver por pantalla la cumbre que menos montaeros hayan subido.
3. Devolver por pantalla el montaero que haya subido ms metros.
4. Devolver por pantalla por cada montaero cual es la cumbre ms alta
que ha subido.
72 Cumbres de montaa
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. NumCumbres=10. Nmero de cumbres que puden subir los montaeros.
2. NumMont = 7. Nmero de montaeros que forman parte del anlisis.
Representacin de las variables necesarias para la entrada
3. Necesitamos una matriz de NumMont x NumCumbres posiciones, dnde
se almacenar el nmero de veces que ha subido cada montaero a cada
una de las cumbres.
cumbres 0 1 ... NumCumbres-1
0
1
...
NumMont-1

4. Necesitaremos un vector de NumCumbres posiciones donde
almacenaremos la altura de cada una de las cumbres.
0 1 ... NumCumbres-1
alturas

Representacin de las variables necesarias para los resultados
5. Necesitaremos un vector de NumCumbres posiciones, donde
almacenaremos el nmero de veces que ha sido subida cada una de las
cumbres.
0 1 ... NumCumbres-1
ascensiones

6. Necesitamos un vector de NumMont posiciones, donde almacenaremos
los metros que ha subido cada uno de los montaeros.
0 1 ... NumMont-1
metSubidos

Pasos a seguir en la resolucin del problema
1. Para cada una de las cumbres:
a. Leer y guardar la altura que tiene.
2. Inicializar la matriz cumbres a 0.
3. Leer el primer par (m, c).
4. Mientras el nmero de montaero sea distinto de -1, hacer :
a. Almacenar la subida a la cumbre en la matriz cumbres.
b. Leer siguiente par (m, c).
Cumbres de montaa 73
5. Inicializar el vector ascensiones.
6. Para cada cumbre:
a. Sumar las ascensiones que han hecho todos los montaeros.
7. Calcular el mnimo nmero de ascensiones que ha tenido una cumbre.
8. Escribir las cumbres que hayan tenido el nmero mnimo de
ascensiones.
9. Inicializar el vector metSubidos.
10. Para cada montaero:
a. Calcular los metros que ha subido, para ello sumar al nmero de
metros que ha subido el valor de multiplicar el nmero de
ascensiones a la cumbre por la altura a dicha cumbre.
11. Calcular el mximo de metros que haya ascendido un montaero.
12. Escribir el montaero que haya subido el mximo de metros.
13. Para cada montaero :
a. Calcular la cumbre ms alta que ha subido.
b. Si ha subido alguna montaa, escribir la cumbre ms alta que ha
subido, de lo contrario decir que no ha subido ninguna cumbre.
74 Cumbres de montaa
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define NumCumbr es 10
#define NumMont 7
main(){
int cumbr es[ NumMont ] [ NumCumbr es] ;
int al t ur as[ NumCumbr es] , ascensi ones[ NumCumbr es] ;
int met Subi dos[ NumMont ] ;
int m, c, mi n, max, cum;

/ / I nt r oduci mos l as al t ur as de l as cumbr es.
pr i nt f ( " I nt r oduce l as al t ur as de l as cumbr es: " ) ;
for ( c=0; c< NumCumbr es; c=c+1)
{ pr i nt f ( " Mont aa %d: " , c) ;
scanf ( " %d" , &al t ur as[ c] ) ;
}
/ / I ni ci al i zamos l a mat r i z cumbr es.
for ( m=0; m< NumMont ; m=m+1)
{ for ( c=0 ; c<NumCumbr es; c=c+1)
{ cumbr es[ m] [ c] = 0; }
}
/ / I nt r oduci r cumbr es que han subi do l os mont aer os.
pr i nt f ( " I nt r oduce mont aer o y cumbr e: " ) ;
scanf ( " %d %d" , &m, &c) ;
while ( m! =- 1)
{ cumbr es[ m] [ c] = cumbr es[ m] [ c] + 1;
pr i nt f ( " I nt r oduce mont aer o y cumbr e: " ) ;
scanf ( " %d %d" , &m, &c) ;
}
/ / Escr i bi r l as cumbr es menos vi si t adas.
/ / Cal cul amos cunt as veces ha si do vi si t ada cada cumbr e.
for ( c=0 ; c<NumCumbr es; c=c+1)
{ ascensi ones[ c] =0; / / I ni ci al i zar el vect or ascensi ones.
for ( m=0; m< NumMont ; m=m+1)
{ ascensi ones[ c] =ascensi ones[ c] +cumbr es[ m] [ c] ; }
Cumbres de montaa 75
}
/ / Buscamos el nmer o m ni mo de ascensi ones.
mi n=0;
for ( c=1 ; c<NumCumbr es; c=c+1)
{ if ( ascensi ones[ c] < ascensi ones[ mi n] )
{ mi n= c; }
}
/ *Escr i bi mos t odas l as cumbr es que hayan t eni do el nmer o m ni mo de
ascensi ones. */
pr i nt f ( " Las cumbr es a l as que menos mont aer os han subi do son: \ n" ) ;
for ( c=0 ; c<NumCumbr es; c=c+1)
{ if ( ascensi ones[ c] == ascensi ones[ mi n] )
{ pr i nt f ( " %d\ n" , c) ; }
}
/ / Escr i bi r el mont aer o que haya subi do ms met r os.
/ / Cal cul amos cunt os met r os ha subi do cada mont aer o.
for ( m=0; m< NumMont ; m=m+1)
{ met Subi dos[ m] =0; / / I ni ci al i zamos el vect or met Subi dos}
for ( c=0 ; c<NumCumbr es; c=c+1)
{ met Subi dos[ m] =met Subi dos[ m] + al t ur as[ c] *cumbr es[ m] [ c] ; }
}
/ / Cal cul ar el mxi mo de met r os que han subi do l os mont aer os.
max=0;
for ( m=1; m< NumMont ; m=m+1)
{ if ( met Subi dos[ m] > met Subi dos[ max] )
{ max=m; }
}
/ / Escr i bi mos l os mont aer os que hayan subi do el mxi mo de met r os.
pr i nt f ( " El mont aer o que ms met r os ha subi do es el : " ) ;
for ( m=0; m< NumMont ; m=m+1)
{ if ( met Subi dos[ max] ==met Subi dos[ m] )
{ pr i nt f ( " %d " , m) ; }
}
pr i nt f ( " \ n" ) ;
/ *Escr i bi r cul es l a cumbr e ms al t a que ha subi do cada
mont aer o*/
pr i nt f ( " La cumbr e ms al t a que ha subi do cada mont aer o es: \ n " ) ;
76 Cumbres de montaa
for ( m=0; m< NumMont ; m=m+1)
{ max=0; / / Mxi ma al t ur a subi da por el mont aer o m.
for ( c=0 ; c<NumCumbr es; c=c+1)
{ if ( cumbr es[ m] [ c] >0 && al t ur as[ c] > max )
{ max=al t ur as[ c] ;
cum=c;
}
}
if ( max == 0 )
{ pr i nt f ( " El mont aer o %d no ha subi do ni nguna cumbr e. \ n" , m) ; }
else
{ pr i nt f ( " La cumbr e mas al t a subi da por el mont aer o %d es %d"
" con una al t ur a de %d. \ n" , m, cum, max) ; }
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}
77
AUTOPISTA
La autopista Bilbao-Behobia desea que realices un programa informtico
que recoja mensualmente datos sobre los consumos de sus clientes
habituales y realice los clculos que abajo se te enumeran. El programa
recoger el nmero de veces que pasan los clientes habituales por los
distintos peajes de la autopista, todo ello con vistas a poder realizarles una
serie de descuentos y poder realizar tambin un estudio estadstico.
Esta autopista tiene actualmente 1000 clientes reconocidos como habituales
a travs de un contrato, y el nmero de peajes en este trayecto es de 15.
a) En un array tendremos que introducir los precios de cada uno de los 15
peajes. Para ello el programa le pedir al usuario el precio de cada peaje
de forma secuencial. Y despus, se introducirn los datos de los clientes.
b) La forma de introducir los datos ser mediante pares de datos que
indiquen: nmero de cliente y nmero de peaje por el que ha pasado.
Tenemos que tener en cuenta, que puede haber ms de una entrada para
el mismo cliente y nmero de peaje, con lo que habr que acumular el
nmero de veces que ha pasado por el mismo peaje.
Adems, a la vez que introducimos estos datos, habr que calcular en dos
vectores, el nmero total de viajes que lleva realizados el cliente y el importe
que va acumulando por todos sus trnsitos, teniendo en cuenta que al precio
del peaje se le aplica un descuento en funcin del siguiente criterio:
a los 8 primeros viajes un 25% sobre el precio del peaje
del 9 al 20 viaje un 55% sobre el precio del peaje
a partir del 20 un 75% sobre el precio del peaje
Ejemplo: (en negrita los datos introducidos por el usuario)
I nt r oduci r cdi go de cl i ent e y cdi go de peaj e ( f i n con - 1 - 1) :
Cl i ent e, peaj e: 1 2
Cl i ent e, peaj e: 8 4
Cl i ent e, peaj e: 1 2
. . .
Cl i ent e, peaj e: - 1 -1
1. Obtener cul es el peaje ms transitado por los clientes habituales.
2. Para cada cliente obtener el nmero de peaje que ms utiliza.
3. Calcular para cada cliente el ahorro que ha obtenido este mes, por ser
cliente habitual.
4. Listar por pantalla para cada cliente, el nmero total de viajes que ha
realizado este mes, el importe total a pagar y el ahorro que ha obtenido.
El listado tendr que presentar el siguiente formato, ejemplo:
78 Autopista
Numer o cl i ent e Tot al vi aj es I mpor t e Ahor r o
0 20 120 30
1 10 79 15
Autopista 79
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. NumPeajes = 15. Nmero de peajes que se van a controlar en el
programa.
2. NumClientes = 10. Nmero de clientes habituales.
Representacin de las variables necesarias para la entrada
3. Necesitaremos una matriz de NumClientes x NumPeajes posiciones para
almacenar los peajes por los que pasa cada uno de los clientes
habituales.
viajes 0 1 ... NumPeajes-1
0
1
...
NumClientes-1

4. Necesitaremos un vector de NumPeajes posiciones para almacenar el
precio en euros de cada peaje.
0 1 ... NumPeajes-1
precioPeajes

Representacin de las variables necesarias para los resultados
5. Necesitamos un vector de NumClientes posiciones para almacenar el
nmero total de pasos por los peajes que tiene un cliente habitual.
0 1 ... NumClientes-1
viajesTotales

6. Necesitaremos un vector de NumClientes posiciones para almacenar los
euros que tiene que pagar cada uno de los clientes habituales.
0 1 ... NumClientes-1
debePagar

7. Necesitamos un vector de NumPeajes posiciones para almacenar el
nmero de veces que se ha pasado por cada uno de los peajes.
0 1 ... NumPeajes-1
pasoPeajes

8. Necesitaremos un vector de NumClientes posiciones para almacenar la
cantidad de euros que debera pagar cada cliente habitual si no se le
aplica ningn descuesto.
0 1 ... NumClientes-1
deberiaHaberPagado

80 Autopista
9. Necesitamos un vector de NumClientes posiciones para almacenar la
cantidad de euros que ahorra cada uno de los clientes habituales.
0 1 ... NumClientes-1
ahorro

Pasos a seguir en la resolucin del problema
1. Inicializar la matriz viajes a 0
2. Para cada peaje:
a. Leer y guardar el precio
3. Inicializar el vector viajesTotales a 0
4. Inicializar el vector debePagar
5. Leer el primer par de cliente y peaje (c, p)
6. Mientras el cliente y el peaje sean distinto de cero hacer:
a. Guardar el viaje ledo.
b. Sumar al cliente el viaje ledo.
c. Calcular el precio que tiene que pagar el cliente teniendo en cuenta
los datos introducidos hasta el momento.
d. Leer el par (c, p)
7. Inicializar el vector pasoPeajes.
8. Para cada peaje:
a. Calcular el nmero de veces que han pasado el conjunto de los
clientes habituales por l.
9. Calcular el mayor valor del vector pasoPeajes para saber cul ha sido el
peaje por el que han pasado ms clientes habituales.
10. Para cada cliente:
a. Buscar cul es el peaje por donde ha pasado ms veces.
11. Inicializar el vector deberiaHaberPagado.
12. Para cada cliente:
a. Calcular cunto deberan haber pagado sin descuentos.
13. Para cada cliente :
a. Calcular cunto ha ahorrado.
14. Escribir cunto ha ahorrado cada cliente.
15. Para cada cliente:
Autopista 81
a. Escribir los viajes realizados.
b. Escribir lo que debe pagar.
c. Escribir lo que ha ahorrado.
82 Autopista
CODIGO C
#include <st di o. h>
#include <st dl i b. h>
#define NumPeaj es 15
#define NumCl i ent es 10
main(){
int vi aj es[ NumCl i ent es] [ NumPeaj es] ;
float pr eci oPeaj es[ NumPeaj es] , debePagar [ NumCl i ent es] ;
int vi aj esTot al es[ NumCl i ent es] , pasoPeaj es[ NumPeaj es] ;
float deber i aHaber Pagado[ NumCl i ent es] , ahor r o[ NumCl i ent es] ;
int c, p, maxPeaj e;

/ / I ni ci al i zamos l a mat r i z vi aj es a 0.
for ( c=0; c<NumCl i ent es; c=c+1)
{ f or ( p=0; p<NumPeaj es; p=p+1)
{ vi aj es[ c] [ p] =0; }
}
/ / Leer el pr eci o de cada uno de l os peaj es.
for ( p=0; p<NumPeaj es; p=p+1)
{ pr i nt f ( " I nt r oduce el pr eci o del peaj e %d: " , p) ;
scanf ( " %f " , &pr eci oPeaj es[ p] ) ;
}
/ / I nt r oducci n de dat os.
/ / I ni ci al i zamos el vect or vi aj esTot al es y el vect or debePagar a 0.
for ( c=0; c<NumCl i ent es; c=c+1)
{ vi aj esTot al es[ c] =0;
debePagar [ c] =0;
}
/ / Leemos y guar damos l os vi aj es que ha hecho cada cl i ent e.
pr i nt f ( " I nt r oduce el cdi go del cl i ent e y el peaj e. "
" ( par a t er mi nar - 1 - 1) : \ n " ) ;
pr i nt f ( " Cl i ent e, Peaj e: " ) ;
scanf ( " %d %d" , &c, &p) ;
while ( c >= 0 && p >= 0)
{ vi aj es[ c] [ p] =vi aj es[ c] [ p] +1;
vi aj esTot al es[ c] =vi aj esTot al es[ c] +1;
Autopista 83
if ( vi aj esTot al es[ c] <= 8 )
{ debePagar [ c] =debePagar [ c] +pr eci oPeaj es[ p] *0. 75; }
else
{ if ( vi aj esTot al es[ c] <=20 )
{ debePagar [ c] =debePagar [ c] +pr eci oPeaj es[ p] *0. 45; }
else
{ debePagar [ c] =debePagar [ c] +pr eci oPeaj es[ p] *0. 25; }
}
pr i nt f ( " Cl i ent e, Peaj e: " ) ;
scanf ( " %d %d" , &c, &p) ;
}
/ / Peaj e ms t r ansi t ado.
/ / 1 cal cul amos el nmer o de veces que se ha pasado por cada peaj e
for ( p=0; p<NumPeaj es; p=p+1)
{ pasoPeaj es[ p] =0; / / I ni ci al i zamos l a posi ci n a 0.
f or ( c=0; c<NumCl i ent es; c=c+1)
{ pasoPeaj es[ p] = pasoPeaj es[ p] + vi aj es[ c] [ p] ; }
}
/ / Cal cul amos el peaj e por el que ms han pasado l os cl i ent es.
maxPeaj e=0;
for ( p=1; p<NumPeaj es; p=p+1)
{ if ( pasoPeaj es[ p] > pasoPeaj es[ maxPeaj e] )
{ maxPeaj e=p; }
}
pr i nt f ( " El peaj e ms ut i l i zado es el %d: \ n" , maxPeaj e) ;

/ / Escr i bi r el peaj e que ms ut i l i za cada uno de l os cl i ent es.
for ( c=0; c<NumCl i ent es; c=c+1)
{ maxPeaj e=0;
for ( p=1; p<NumPeaj es; p=p+1)
{ if ( vi aj es[ c] [ p] > vi aj es[ c] [ maxPeaj e] )
{ maxPeaj e=p; }
}
pr i nt f ( " El peaj e que ms ut i l i za el cl i ent e %d es "
" el %d. \ n " , c, maxPeaj e) ;
}

84 Autopista
/ *Cal cul ar el ahor r o de est e mes por ser cl i ent e habi t ual .
Pr i mer o cal cul amos par a cada cl i ent e, cunt o deber a haber pagado*/
for ( c=0; c<NumCl i ent es; c=c+1)
{ deber i aHaber Pagado[ c] =0; / / I ni ci al i zamos a 0.
for ( p=0; p<NumPeaj es; p=p+1)
{ deber i aHaber Pagado[ c] =deber i aHaber Pagado[ c] +
pr eci oPeaj es[ p] *vi aj es[ c] [ p] ;
}
}
/ / Rest amos l o que deber an haber pagado con l o que han pagado.
for ( c=0; c<NumCl i ent es; c=c+1)
{ ahor r o[ c] = deber i aHaber Pagado[ c] - debePagar [ c] ;
/ / Escr i bi mos cunt o ha ahor r ado cada cl i ent e}
pr i nt f ( " El cl i ent e %d ha ahor r ado %5. 2f eur os. \ n " , c, ahor r o[ c] ) ;
}
/ / Escr i bi r r esul t ados.
pr i nt f ( " Cl i ent e Tot al Vi aj es I mpor t e Ahor r o \ n" ) ;
for ( c=0; c<NumCl i ent es; c=c+1)
{ pr i nt f ( " %5d %10d %10. 2f %8. 2f \ n" , c, pasoPeaj es[ c] ,
debePagar [ c] , ahor r o[ c] ) ;
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}
85
SALA DE JUEGOS
Una Sala de Juegos quiere que le realicemos un programa informtico que le
permita conocer en todo momento, cul es la situacin de los jugadores que
tiene en la sala.
Para poder elaborar el programa nos informan de que, en un da pasan por
la Sala de Juegos como mximo 1000 jugadores, y que en la sala hay 80
juegos.
El programa lo ejecutarn diariamente y, lo primero que le tiene que pedir el
programa al usuario es, que introduzca para cada juego la cantidad, en euros,
que se gana por cada punto, y estos datos se guardarn en un array que
llamaremos eurosJuego. Despus, aparecer un men que permitir al usuario
ir introduciendo para cada jugador los puntos que va obteniendo en cada
juego en el que participa, as como calcular determinadas opciones que se
detallan a continuacin. Para ello a los jugadores cuando entran en la Sala de
Juegos se les asigna un nmero del 0 al 999, y los juegos tambin estn
numerados del 0 al 79.
Ejemplo de lectura del array eurosJuego (datos introducidos por el usuario
en negrita):
Dame l a gananci a por punt os obt eni do de cada j uego:
J uego n0 : 6
J uego n1 : 1
J uego n3 : 4
J uego n3 : 6
.............
J uego n29 : 15
.............
J uego n79: 2
Ejemplo:
0 1 2 3 ....... 29 .......... 79
eurosJuego 6 1 4 6 . . . . . . . . 15 . . . . . . . . 2
Al finalizar la entrada de estos datos el programa presentar en pantalla el
siguiente men. Al seleccionar una opcin del men, sta se ejecutar
dndonos el resultado y despus volver a aparecer el men en pantalla,
excepto al seleccionar la opcin 5 ya que el programa terminar.
Ejemplo:
Menu sal a de j uegos:
1. I nt r oduci r punt os de un j ugador .
2. Conocer l os punt os que un j ugador l l eva consegui dos en
un j uego.
3. Most r ar par a un j ugador l os punt os consegui dos en cada
j uego que ha par t i ci pado.
86 Sala de Juegos
4. Cal cul ar l os eur os ganados por un j ugador .
5. Ter mi nar .
Dame t u opci n:
Al introducir cada una de las opciones se realizar lo indicado a
continuacin:
1. Introducir puntos de un jugador.
El programa deber pedir el n del jugador y, despus para cada juego
en el que participe se introducir el n de juego y el n de puntos
obtenidos. Tener en cuenta al programar la entrada de datos que, un
jugador puede sacar 0 puntos en un juego, y que si repite el juego los
puntos se le tienen que acumular. Para finalizar la entrada de datos de
un jugador se introducir el par -1 -1. Hay que poder distinguir los
juegos que no ha jugado un jugador y en los que ha conseguido 0
puntos.
Programarlo de forma que en cualquier momento del da se puedan
volver a introducir ms datos para un mismo jugador.
Ejemplo de ejecucin:
N de j ugador : 10
J uego y punt os: 4 35
J uego y punt os: 1 0
J uego y punt os: 4 10
J uego y punt os: 30 10
J uego y punt os: -1 -1
2. Conocer los puntos que un jugador lleva conseguidos en un juego.
Ejemplo de ejecucin:
N de j ugador : 10
N de j uego: 4
Tot al punt os obt eni dos en est e j uego: 45
3. Mostrar para un jugador los puntos conseguidos en cada juego que ha
participado.
Ejemplo de ejecucin:
N del j ugador : 10
J uego 1 Punt os : 0
J uego 4 Punt os : 45
J uego 30 Punt os : 10
4. Calcular los euros ganados por un jugador.
Para poder calcularlo, se utilizar el array eurosJuego que se ha llenado al
principio del da.
Ejemplo de ejecucin:
N de j ugador : 10
Tot al eur os ganados: 420
Sala de Juegos 87
5. Terminar.
Al finalizar el da, el usuario elegir esta opcin, que le permitir
terminar la ejecucin del programa y adems, el programa le deber
indicar la cantidad total de euros que la Sala de Juegos ha entregado ese
da y nmero del juego que ms euros ha entregado ese da.
88 Sala de Juegos
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. MaxJugadores = 1000. Es el nmero mximo de jugadores que pasan por
la sala en un da.
2. MaxJuegos = 80. Es el nmero de juegos que hay en la sala.
Representacin de las variables necesarias para la entrada
3. Necesitaremos una matriz de MaxJugadores x MaxJuegos posiciones,
donde se almacenarn los puntos obtenidos por cada jugador en cada
uno de los juegos en los que ha participado.
puntuacion 0 1 ... MaxJuegos-1
0
1
...
MaxJugadores-1
4. Necesitaremos un vector eurosJuego, de MaxJuegos posiciones, para
guardar en cada juego la cantidad, en euros, que se gana por cada punto
que se obtenga en dicho juego.
0 1 ... MaxJuegos-1
eurosJuego
Representacin de las variables necesarias para los resultados
5. Necesitamos un vector entregadoJuego, con MaxJuegos posiciones, para
almacenar la cantidad total de euros que ha entregado la sala en cada
uno de los juegos al finalizar el da.
0 1 ... MaxJuegos-1
entregadoJuego
Pasos a seguir en la resolucin del problema
1. Llenar el vector eurosJuego.
2. Inicializar la matriz puntuacin a 1, para poder distinguir los juegos no
jugados de aquellos en los que si se ha jugado, pero que se ha obtenido
0 puntos.
3. Utilizar un bucle do-while para presentar en pantalla el menu con las 5
opciones que ofrece el programa, cada vez que se ejecute una de las
opciones ( de la 1 a la 4 ) se volver a presentar el men en pantalla y as
sucesivamente hasta pulsar la opcin 5. Terminar.
4. Para seleccionar la opcin elegida por el usuario utilizar el switch.
Opcin 1. Introducir puntos de un jugador.
a. Leer el nmero del jugador.
Sala de Juegos 89
b. Leer un juego y sus puntos.
c. Mientras el juego y los puntos sean distintos de -1 hacer:
i. Si ya ha participado en ese juego entonces acumular los
puntos en la matriz puntuacion sino introducir directamente
los puntos en la matriz puntuacion.
ii. Leer siguiente juego y puntos de ese jugador.
Opcin 2. Conocer los puntos que un jugador lleva conseguidos en un
juego.
a. Leer nmero de jugador y de juego.
b. Si el valor que tiene la matriz puntuacion, en esta posicin de
jugador y juego, es distinto de 1 entonces indicar los puntos
conseguidos, sino decir que no ha participado en el juego.
Opcin 3. Mostrar para un jugador los puntos conseguidos en cada
juego que ha participado.
a. Leer el nmero de jugador.
b. Para cada juego:
i. Si la puntuacin del jugador en ese juego es distinta de 1
(ha jugado) entonces escribir la puntuacin.
Opcin 4. Calcular los euros ganados por un jugador.
a. Leer el nmero del jugador.
b. Para cada juego:
i. Si la puntuacin es distinta de 0 entonces multiplicar los
puntos, obtenidos en el juego, por los euros del vector
eurosJuego y acumular el resultado en la variable ganancia.
c. Escribir el total ganado .
5. Al salir del men (Opcin 5), calcular los euros que ha entregado la sala
en cada juego y el total de euros entregados ese da.
a. Para cada juego.
b. Recorrer todos los jugadores.
i. Si la puntuacin es mayor que 0 entonces multiplicar la
puntuacin por los eurosJuego y acumular el resultado en el
vector entregadoJuego.
c. Antes de cambiar de juego acumular en la variable entregado el total
entregado en cada juego.
90 Sala de Juegos
6. Obtener el juego que ha entregado ms dinero, para ello hay que buscar
la posicin del mximo en el vector entregadoJuego.

Sala de Juegos 91
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define MaxJ ugador es 1000
#define MaxJ uegos 80
main(){
int punt uaci on[ MaxJ ugador es] [ MaxJ uegos] ;
float eur osJ uego[ MaxJ uegos] , ent r egadoJ uego[ MaxJ uegos] ;
int j ugador , punt os, j uego, opci on, j Ent r egaMax ;
char cont i nuar ;
float gananci a, ent r egado;

/ * Leer gananci a por punt o en cada j uego y guar dar l o en el vect or
eur osJ uego. */
pr i nt f ( " Dame l a gananci a por punt o obt eni do de cada j uego: \ n" ) ;
for ( j uego=0 ; j uego< MaxJ uegos; j uego=j uego+1)
{ pr i nt f ( " J uego n %d: " , j uego) ;
scanf ( " %f " , &eur osJ uego[ j uego] ) ;
}
/ * I ni ci al i zar l a mat r i z Punt uaci n a - 1 par a poder di st i ngui r
aquel l os j uegos j ugados, y en l os cual es se ha l ogr ado 0 punt os, de
l os que no se han j ugado. */
for ( j ugador =0; j ugador <MaxJ ugador es; j ugador =j ugador +1)
{ for ( j uego=0 ; j uego< MaxJ uegos; j uego=j uego+1)
{ punt uaci on[ j ugador ] [ j uego] =- 1; }
}
/ / Pr esent amos en pant al l a el men con l as opci ones.
do{
syst em( " CLS" ) ; / / l i mpi amos pant al l a
pr i nt f ( " Las opci ones del men son: \ n " ) ;
pr i nt f ( " 1. I nt r oduci r punt os de un j ugador . \ n " ) ;
pr i nt f ( " 2. Conocer l os punt os que un j ugador l l eva "
" consegui dos en un j uego. \ n " ) ;
pr i nt f ( " 3. Most r ar par a un j ugador l os punt os consegui dos en "
" cada j uego que ha par t i ci pado. \ n " ) ;
pr i nt f ( " 4. Cal cul ar l os eur os ganados por un j ugador . \ n " ) ;
pr i nt f ( " 5. Ter mi nar . \ n " ) ;
pr i nt f ( " Dame t u opci n: " ) ;
92 Sala de Juegos
scanf ( " %d" , &opci on) ;
/ / Ej ecut a l a opci n el egi da.
switch ( opci on )
{ case 1:
/ * I nt r oduci r punt os de un j ugador en cada uno de l os j uegos en l os
que par t i ci pa. */
pr i nt f ( " N de j ugador : " ) ;
scanf ( " %d" , &j ugador ) ;
pr i nt f ( " J uego y punt os: " ) ;
scanf ( " %d %d" , &j uego, &punt os) ;
/ / Si el par l ei do es di st i nt o de - 1 - 1 ent r a en el bucl e.
whi l e ( j uego! =- 1 && punt os! =- 1)
{
/ * Si ya ha par t i ci pado en est e j uego acumul amos l os punt os. Si no,
si es l a pr i mer a vez que par t i ci pamos, i nt r oduci mos di r ect ament e
l os punt os*/
if ( punt uaci on[ j ugador ] [ j uego] >=0 )
{ punt uaci on[ j ugador ] [ j uego] =
punt uaci on[ j ugador ] [ j uego] +punt os;
}
else { punt uaci on[ j ugador ] [ j uego] =punt os; }
pr i nt f ( " J uego y punt os: " ) ;
scanf ( " %d %d" , &j uego, &punt os) ;
} / / f i n del whi l e
break; / / f i n de l a opci n 1.
case 2:
/ * Conocer l os punt os que un j ugador l l eva consegui dos en un j uego.
*/
pr i nt f ( " N de j ugador : " ) ;
scanf ( " %d" , &j ugador ) ;
pr i nt f ( " N de j uego: " ) ;
scanf ( " %d" , &j uego) ;
/ * Mi r amos el val or que t i ene l a t abl a punt uaci n en est a posi ci n
de j ugador y j uego. Si el val or es di st i nt o de - 1 i ndi camos l os
punt os consegui dos si no, i ndi camos que no ha par t i ci pado en ese
j uego. */
if ( punt uaci on[ j ugador ] [ j uego] ! = - 1)
{ pr i nt f ( " Tot al punt os obt eni dos en est e j uego %d \ n: " ,
punt uaci on[ j ugador ] [ j uego] ) ;
Sala de Juegos 93
}
else
{ pr i nt f ( " El j ugador %d no ha j ugado al j uego %d \ n" ,
j ugador , j uego) ;
}
pr i nt f ( " \ n" ) ;
f f l ush( st di n) ; / / l i mpi a el buf f er de memor i a
pr i nt f ( " Pul se cual qui er t ecl a par a cont i nuar . . . \ n" ) ;
scanf ( " %c" , &cont i nuar ) ;
br eak; / / f i n de l a opci n 2.
case 3:
/ * Most r ar par a un j ugador l os punt os consegui dos en cada j uego que
ha par t i ci pado. */
pr i nt f ( " N de j ugador : " ) ;
scanf ( " %d" , &j ugador ) ;
/ * Par a est e j ugador r ecor r emos, en l a mat r i z punt uaci n, t odos l os
j uegos, y most r amos l os punt os sl o si el val or es di st i nt o de - 1,
es deci r , si ha j ugado. */
for ( j uego=0; j uego<MaxJ uegos; j uego=j uego+1)
{ if ( punt uaci on[ j ugador ] [ j uego] ! =- 1 )
{ pr i nt f ( " J uego: %d punt os: %d \ n" , j uego,
punt uaci on[ j ugador ] [ j uego] ) ;
}
} / / f i n del f or
pr i nt f ( " \ n" ) ;
f f l ush( st di n) ; / / l i mpi a el buf f er de memor i a
pr i nt f ( " Pul se cual qui er t ecl a par a cont i nuar . . . \ n" ) ;
scanf ( " %c" , &cont i nuar ) ;
break; / / f i n de l a opci n 3
case 4:
/ / Cal cul ar l os eur os ganados por un j ugador .
pr i nt f ( " N de j ugador : " ) ;
scanf ( " %d" , &j ugador ) ;
gananci a=0;
for ( j uego=0; j uego<MaxJ uegos; j uego=j uego+1)
{ if ( punt uaci on[ j ugador ] [ j uego] >=0 )
{ gananci a=gananci a+punt uaci on[ j ugador ] [ j uego] *
eur osJ uego[ j uego] ;
94 Sala de Juegos
}
} / / f i n del f or .
pr i nt f ( " Tot al eur os ganandos: %5. 2f \ n " , gananci a) ;
pr i nt f ( " \ n" ) ;
f f l ush( st di n) ; / / l i mpi a el buf f er de memor i a
pr i nt f ( " Pul se cual qui er t ecl a par a cont i nuar . . . \ n" ) ;
scanf ( " %c" , &cont i nuar ) ;
break; / / f i n de l a opci n 4
case 5: br eak; / / f i n de l a opci n 4
default: pr i nt f ( " Opci n i ncor r ect a " ) ;
pr i nt f ( " \ n" ) ;
f f l ush( st di n) ; / / l i mpi a el buf f er de memor i a
pr i nt f ( " Pul se cual qui er t ecl a par a cont i nuar . . . \ n" ) ;
scanf ( " %c" , &cont i nuar ) ;
} / / f i n del swi t ch
}while ( opci on! =5) ;

/ * Sal i mos del men al f i nal i zar el d a. Cal cul amos l a cant i dad
t ot al de eur os ent r egados por l a sal a y el j uego que mayor cant i dad
de eur os ha ent r egado est e d a. */
ent r egado=0; / * en est a var i abl e se acumul an el t ot al de eur os
obt eni dos en l os j uego, dur ant e est e d a */
for ( j uego=0; j uego<MaxJ uegos; j uego=j uego+1)
{ ent r egadoJ uego[ j uego] =0;
for ( j ugador =0; j ugador <MaxJ ugador es; j ugador =j ugador +1)
{ if ( punt uaci on[ j ugador ] [ j uego] >0 )
{ ent r egadoJ uego[ j uego] =ent r egadoJ uego[ j uego] +
punt uaci on[ j ugador ] [ j uego] *eur osJ uego[ j uego] ;
}
} / / f or ani dado
ent r egado=ent r egado+ent r egadoJ uego[ j uego] ;
} / / f or pr i nci pal
pr i nt f ( " \ n" ) ;
pr i nt f ( " Tot al di ner o ent r egado : %8. 2f eur os \ n " , ent r egado) ;
pr i nt f ( " \ n" ) ;

/ * Cal cul amos el j uego que ha ent r egado ms di ner o, par a el l o hay
que buscar l a posi ci n del mxi mo en el vect or ent r egadoJ uego */
Sala de Juegos 95
j Ent r egaMax=0;
for ( j uego=1; j uego<MaxJ uegos; j uego=j uego+1)
{ if ( ent r egadoJ uego[ j Ent r egaMax] <ent r egadoJ uego[ j uego] )
{ j Ent r egaMax=j uego; }
}
pr i nt f ( " El j uego que ha ent r egado mas di ner o es el : %d con: %8. 2f "
" eur os. \ n" , j Ent r egaMax, ent r egadoJ uego[ j Ent r egaMax] ) ;
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}
97
FAROLAS
Desde el ayuntamiento nos han pedido que hagamos un programa que les
ayude a gestionar las farolas de cierta zona de la ciudad. Esta zona de la
ciudad tiene 5 calles, y en cada una de ellas hay 15 farolas, numeradas del 0
al 14.
Con el fin de ahorrar, el ayuntamiento ha decidido que no se van a encender
todas las farolas de cada calle, sino que en cada calle habr un nmero
mximo de farolas que pueden estar encendidas simultneamente.
(Nosotros almacenaremos estos mximos en un array llamado maximoCalle)
El programa que nos piden debe realizar las siguientes tareas:
1. Leer el n mximo de farolas que pueden estar encendidas
simultneamente en cada calle. Ejemplo: (en negrita los datos
introducidos por el usuario):
I nt r oduce el n mxi mo de f ar ol as a encender de l a cal l e 0: 2
I nt r oduce el n mxi mo de f ar ol as a encender de l a cal l e 1: 3
. . .
I nt r oduce el n mxi mo de f ar ol as a encender de l a cal l e 4: 15

2. Encender farolas. Avisar en caso de que se intente exceder el mximo
permitido para esa calle. Ejemplo:
I nt r oduce cal l e y f ar ol a ( - 1 - 1 par a t er mi nar ) : 0 4
I nt r oduce cal l e y f ar ol a ( - 1 - 1 par a t er mi nar ) : 0 3
I nt r oduce cal l e y f ar ol a ( - 1 - 1 par a t er mi nar ) : 0 14
Er r or ! En l a cal l e 0 no puede haber ms de 2 f ar ol as encendi das.
I nt r oduce cal l e y f ar ol a ( - 1 - 1 par a t er mi nar ) : 2 4
I nt r oduce cal l e y f ar ol a ( - 1 - 1 par a t er mi nar ) : 4 11
I nt r oduce cal l e y f ar ol a ( - 1 - 1 par a t er mi nar ) : -1 -1

3. Obtener el n de farolas encendidas en cada calle y el mximo para esa
calle. Ejemplo:
En l a cal l e 0 hay 2 f ar ol as encendi das de un mxi mo de 2.
En l a cal l e 1 hay 0 f ar ol as encendi das de un mxi mo de 3.
. . .
En l a cal l e 4 hay 1 f ar ol as encendi das de un mxi mo de 15.

4. Para cada calle indica si es ms seguro ir por el lado de la derecha o el de
la izquierda. Para ello, consideraremos ms seguro aquel lado que tenga
ms farolas encendidas. En caso de que el nmero de farolas encendidas
en cada lado coincida, o estn todas apagadas, diremos que los dos lados
son igual de seguros. Supn que las farolas con nmero par estn en el
lado derecho y las de nmero impar en el izquierdo. Ejemplo:
En l a cal l e 0 da i gual i r por l a der echa o por l a i zqui er da.
En l a cal l e 1 da i gual i r por l a der echa o por l a i zqui er da.
En l a cal l e 2 es ms segur o i r por l a der echa.
98 Farolas
. . .

5. Obtener el nmero de calles que tienen todas las farolas apagadas.
Ejemplo:
El nmer o de cal l es con t odas l as f ar ol as apagadas es 2.
6. Clasificar las calles segn los siguientes criterios:
Todas las farolas apagadas: 'A oscuras'.
Si hay encendidas tantas como indica su mximo de calle y hay
ms encendidas que apagadas: 'Muy Luminosa'.
Si hay encendidas tantas como indica su mximo de calle, pero
hay ms o igual n de apagadas que encendidas: 'Luminosa'.
En cualquier otro caso: 'Tenebrosa'.
Ejemplo:
La cal l e 0 es l umi nosa.
La cal l e 1 est a oscur as.
La cal l e 2 es t enebr osa.
. . .

7. Apagar todas las farolas.
Farolas 99
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. TopeCalles = 5. Nmero de calles que hay en la zona a estudiar.
2. TopeFarolas =15. Nmero de farolas que hay en cada calle.
Representacin de las variables necesarias para la entrada
3. Necesitaremos la matriz farolasEn, de TopeCalles x TopeFarolas posiciones,
donde se guardar un 0 para las farolas que estan apagadas y un 1 para
las que estn encendidas.
farolasEn 0 1 ... TopeFarolas-1
0
1
...
TopeCalles-1
4. Necesitaremos el vector maxEncen, de TopeCalles posiciones, para
guardar el nmero mximo de farolas que pueden estar encendidas
simultaneamente en cada calle.
0 1 ... TopeCalles-1
maxEncend
Representacin de las variables necesarias para los resultados
5. Necesitamos el vector encend, de TopeCalles posiciones, para ir contando
las farolas que se van encendiendo en cada calle y as no pasarnos del
mximo permitido.
0 1 ... TopeCalles-1
encend
Pasos a seguir en la resolucin del problema
1. Llenar el vector maxEncend.
2. Poner la matriz farolasEn a 0 (todas apagadas).
3. Poner a 0 el vector de farolas encendidas en cada calle (encend).
4. Encender farolas. Pedir la calle y la farola.
5. Mientras el par sea distinto de -1 hacer :
a. Si el nmero de farolas encendidas en esa calle es menor que el
mximo permitido entonces, encender la farola (un 1 en la matriz) y
contarla como encendida, sino dar un mensaje de error (no se
puede encender).
b. Leer el siguiente par calle y farola.
6. Para cada calle indicar, el nmero de farolas encendidas y el mximo de
esa calle.
100 Farolas
7. Seguridad en las calles. Para cada calle hacer :
a. Inicializar los contadores de farolas encendidas a la derecha y a la
izquierda a 0.
b. Para cada farola de esa calle hacer:
i. Si el nmero de farola es impar y est encendida incrementar el
contador de farolas a la izquierda , sino, si el nmero de farola
es par y est encendida incrementar el contador de farolas a la
derecha.
c. Una vez recorridas todas las farolas de esa calle, comparar los
contadores e indicar cmo es la calle.
8. Nmero de calles con todas las farolas apagadas. Inicializar el contador
todas a 0. Para cada calle hacer:
a. Si en el vector encend para esa calle el valor es 0, entonces
incrementar el contador todas.
9. Clasificar las calles. Para cada calle hacer:
a. Si el nmero de farolas encendidas es igual al mximo del la calle y
el nmero de encendidas es mayor que el de apagadas entonces
indicar que es muy luminosa.
b. Si no, si el nmero de farolas encendidas es igual al mximo de la
calle pero el nmero de encendidas es menor que el de apagadas
entonces indicar que es luminosa.
c. Si no, si estn todas apagadas entonces indicar que est a oscuras.
d. Y si no, indicar que es tenebrosa.
10. Apagar las farolas, es decir, poner la matriz farolasEn a 0.

Farolas 101
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define TopeFar ol as 15
#define TopeCal l es 5
main (){
int f ar ol asEn[ TopeCal l es] [ TopeFar ol as] ;
int maxEncend[ TopeCal l es] , encend[ TopeCal l es] ;
int f , c, i zqui er da, der echa, t odas;

/ * 1. Leemos el mxi mo nmer o de f ar ol as que se pueden encender en
cada cal l e. */
for ( c=0; c<TopeCal l es; c=c+1)
{ pr i nt f ( " I nt r oduzca el mxi mo posi bl es de f ar ol as encendi das "
" de l a cal l e %d: " , c) ;
scanf ( " %d" , &maxEncend[ c] ) ;
}
/ * 2. Encender f ar ol as. Par t i mos de que t odas l as f ar ol as est n
apagadas, es deci r , ponemos l a mat r i z f ar ol asEn a 0. */
for ( c=0; c<TopeCal l es; c=c+1)
{ for ( f =0; f <TopeFar ol as; f =f +1)
{ f ar ol asEn[ c] [ f ] =0; }
}
/ * I ni ci al i zamos a 0 el cont ador de f ar ol as encendi das en cada
cal l e. */
for ( c=0; c<TopeCal l es; c=c+1)
{ encend[ c] =0; }
/ * Encendemos l as f ar ol as deseadas, cont ando en el vect or encend
l as f ar ol as que se van encendi endo en cada cal l e, par a as poder
avi sar si se pasan del mxi mo per mi t i do. */
pr i nt f ( " I nt r oduzca cal l e y f ar ol a ( - 1 - 1 par a t er mi nar ) : " ) ;
scanf ( " %d %d" , &c, &f ) ;
while ( c! =- 1 && f ! =- 1)
{ if ( encend[ c] <maxEncend[ c] )
{ f ar ol asEn[ c] [ f ] =1; / / encendemos l a f ar ol a
encend[ c] = encend[ c] +1;
}
else
102 Farolas
{ pr i nt f ( " Er r or ! ! En l a cal l e %d no puede haber ms de %d
\ n" ) ;
pr i nt f ( " f ar ol as encendi das. \ n" , c, maxEncend[ c] ) ;
}
pr i nt f ( " I nt r oduzca cal l e y f ar ol a ( - 1 - 1 par a t er mi nar ) : " ) ;
scanf ( " %d %d" , &c, &f ) ;
} / / f i n del whi l e

/ * 3. N de f ar ol as encendi das en cada cal l e y el mxi mo par a esa
cal l e. */
for ( c=0; c<TopeCal l es; c=c+1)
{ pr i nt f ( " En l a cal l e %d hay %d f ar ol as endendi das de un mxi mo"
" de %d. \ n" , c, encend[ c] , maxEncend[ c] ) ;
}

/ / 4. Segur i dad en l as cal l es.
for ( c=0; c<TopeCal l es; c=c+1)
{ i zqui er da=0; der echa=0;
for ( f =0; f <TopeFar ol as; f =f +1)
{ i f ( f %2! =0 && f ar ol asEn[ c] [ f ] ==1)
{ i zqui er da=i zqui er da+1; }
else
{ if ( f %2==0 && f ar ol asEn[ c] [ f ] ==1)
{ der echa=der echa+1; }
}
} / / f or ani dado
if ( i zqui er da==der echa )
{ pr i nt f ( " En l a cal l e %d da i gual i r por l a der echa o"
" por l a i zqui er da. \ n" , c) ;
}
else
{ if ( i zqui er da > der echa )
{ pr i nt f ( " En l a cal l e %d es ms segur o i r por l a "
" i zqui er da. \ n" , c) ;
}
else
{ pr i nt f ( " en l a cal l e %d es ms segur o i r por l a "
Farolas 103
" der echa. \ n" , c) ;
}
}
} / / f or pr i nci pal
/ / 5. Nmer o de cal l es con t odas l as f ar ol as apagadas.
t odas=0;
for ( c=0; c<TopeCal l es; c=c+1)
{ if ( encend[ c] ==0 )
{ t odas=t odas+1; }
}
pr i nt f ( " El nmer o de cal l es con t odas l as f ar ol as apagadas "
" es %d. \ n" , t odas) ;
/ / 6. Cl asi f i car l as cal l es.
for ( c=0; c<TopeCal l es; c=c+1)
{ if ( encend[ c] ==maxEncend[ c] && encend[ c] >TopeFar ol as- encend[ c] )
{ pr i nt f ( " La cal l e %d es muy l umi nosa. \ n" , c) ; }
else
{ if ( encend[ c] ==maxEncend[ c] &&
encend[ c] <TopeFar ol as- encend[ c] )
{ pr i nt f ( " La cal l e %d es l umi nosa. \ n" ) ; }
else
{ if ( encend[ c] ==0)
{ pr i nt f ( " La cal l e %d est a oscur as. \ n" , c) ; }
else
{ pr i nt f ( " La cal l e %d es t enebr osa. \ n" , c) ; }
}
}
} / / f i n del f or
/ / 7- Apagar l as f ar ol as.
for ( c=0; c<TopeCal l es; c=c+1)
{ for ( f =0; f <TopeFar ol as; f =f +1)
{ f ar ol asEn[ c] [ f ] =0; }
}
syst em( " PAUSE" ) ;
}
105
PUEBLOS DE GUIPZCOA
La Diputacin nos ha dicho que en Guipzcoa hay 85 pueblos y que nos va
a proporcionar las distancias en kilmetros, que hay entre cada uno de los
pueblos. Tambin nos ha especificado cmo va a ser la entrada de datos de
nuestro programa. El formato ser el siguiente:
El programa solicitar al usuario la distancia desde un pueblo a todos los
dems. Hay que tener en cuenta, que cada una de las combinaciones se
pedir una sola vez y que no se pedir la distancia de un pueblo consigo
mismo. Esto es, el programa no pedir datos como estos:
Si ha preguntado la distancia del pueblo 0 al pueblo 2, no se va a
preguntar la distancia del pueblo 2 al pueblo 0.
Tampoco se va a pedir, la distancia desde el pueblo 1 al pueblo 1.
Tenidas en cuenta estas restricciones la entrada de datos ser as :
Ejemplo: (en negrita los datos introducidos por el usuario)
Lect ur a de l a di st anci a ent r e l os puebl os de Gui pzcoa:
I nt r oduce l a di st anci a desde el puebl o 0 a l os si gui ent es
puebl os ( en km) :
Puebl o 1: 25
Puebl o 2: 68
. . . .
Puebl o 84: 12
I nt r oduce l a di st anci a desde el puebl o 1 a l os si gui ent es
puebl os ( en km) ) :
Puebl o 2: 105
. . . .
Puebl o 84: 26
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Una vez hecha la lectura de datos, se presentar al usuario el siguiente Men.
Ejemplo:
Men del anl i si s de puebl os:
1. Ver t abl a de di st anci as ent r e puebl os.
2. Most r ar qu 2 puebl os son l os ms al ej ados ent r e s .
3. Dado un puebl o, most r ar cul es el ms l ej ano.
4. Most r ar el puebl o ms cnt r i co.
5. Cal cul ar el nmer o de ki l met r os que hace el car t er o.
6. Sal i r .
El i ge una opci n:
Y una vez realizados los clculos correspondientes a la opcin elegida por el
usuario, se volver a presentar el Men, excepto con la opcin 6.
106 Pueblos de Guipzcoa
A continuacin se explica qu es lo que hay que realizar en cada una de las
opciones del Men.
1. Escribir por pantalla los datos en forma de tabla. Ejemplo:
0 1 2 3 ... 83 84
0 25 68 134 12.3
1 25 105.5 26.5
2 68 105.5

3


...
83 134


84 12.3 26.5

2. Cules son los pueblos ms alejados el uno del otro?. Ejemplo:
Los dos puebl os ms al ej ados ent r e s son el 0 y el 83.

3. Dado un pueblo, qu pueblo es el ms lejano?. Ejemplo:
I nt r oduce el nmer o de un puebl o: 18
El puebl o ms al ej ado del 18 es el 7.

4. Cul es el pueblo ms cntrico?. (El pueblo ms cntrico ser aquel que
sumadas las distancias desde ese pueblo a todos los dems, presente un
valor ms pequeo). Ejemplo:
El puebl o ms cnt r i co es el 27.

5. Calcular los kilmetros que hace el cartero. Para ello, el usuario
introducir el pueblo en el que se encuentra, y luego la secuencia de los
pueblos que recorre (terminando la secuencia con un -1) y el programa
calcular el total de kilmetros. Suponemos que los pueblos se visitan
en el orden en el que son introducidos. Ejemplo:
I nt r oduce el puebl o en el que se encuent r a el car t er o: 25
I nt r oduce l os puebl os que r ecor r e el car t er o: 12 34 2 11 -1
El car t er o r eal i za 356 km.
Pueblos de Guipzcoa 107
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. TopePueblos = 85. Nmero de pueblos que hay en Guipzcoa.
Representacin de las variables necesarias para la entrada
2. Necesitaremos la matriz distancia, de TopePueblos X TopePueblos
posiciones, donde se guardarn las distancias, en kilmetros, que hay
entre cada uno de los pueblos.
distancia 0 1 ... TopePueblos-1
0
1
...
TopePueblos-1
Representacin de las variables necesarias para los resultados
3. Necesitaremos el vector sumaDistancias, de TopePueblos posiciones, para
guardar en l la suma de distancias de cada pueblo al resto de pueblos y
as poder determinar cul es el pueblo ms cntrico.
0 1 ... TopePueblos-1
sumaDistancias
Pasos a seguir en la resolucin del problema
1. Inicializar la diagonal de la matriz distancia a 0.
2. Llenar la matriz distancia, para ello solo es necesario pedir al usuario que
introduzca los datos correspondientes a las celdas que estn por encima
de la diagonal y las celdas que estn debajo de la diagonal se llenarn
mediante programa. As por ejemplo, al leer la distancia del pueblo 1 al
2 el programa deber llenar tanto la celda [1], [2] como la [2],[1], al leer
la distancia del pueblo 1 al 3 se llenarn las celdas [1],[3] y [3],[1] y as
sucesivamente.
3. Utilizar un bucle do- while para presentar en pantalla el men con las 6
opciones que ofrece el programa, cada vez que se ejecute una de las
opciones (de la 1 a la 5 ) se volver a presentarse el men en pantalla y
as sucesivamente hasta pulsar la opcin 6. Salir.
4. Para seleccionar la opcin elegida por el usuario utilizar el switch.
Opcin 1. Ver la tabla de distancias entre pueblos.
a. Recorrer la matriz distancia con dos bucles for anidados. Si el
pueblo origen y el destino son el mismo entonces escribir un
guin, si no escribir la distancia.
Opcin 2. Mostrar los dos pueblos ms alejados entre si.
108 Pueblos de Guipzcoa
a. Recorrer la matriz distancia buscando la distancia mxima e
indicar a qu dos pueblos pertenece.
Opcin 3. Dado un pueblo buscar el ms alejado.
a. Pedir el pueblo origen.
b. Buscar, en la fila correspondiente a ese pueblo origen, la
distancia mxima. De esta forma obtenemos el pueblo ms
alejado.
Opcin 4. Buscar el pueblo ms cntrico.
a. Crear el vector sumaDistancias en el que se suma la distancia de
cada pueblo al resto de pueblos.
b. Buscar en el vector sumaDistancia la distancia ms pequea, que
ser la correspondiente al pueblo ms cntrico.
Opcin 5. Kilmetros que hace el cartero.
a. Leer el pueblo en el que est el cartero (pO)
b. Leer el pueblo destino (pD), e inicializar a 0 la variable sumaKm.
c. Mientras el pueblo destino sea distinto de -1 acumular la
distancia recorrida en sumaKm, hacer que el pueblo origen sea el
pueblo en el que est actualmente el cartero y leer el siguiente
pueblo destino.
Pueblos de Guipzcoa 109
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define TopePuebl os 85
main(){
int di st anci a[ TopePuebl os] [ TopePuebl os] ;
int sumaDi st anci as[ TopePuebl os] ;
int d, po, pd, opc;
int masLej osO, masLej osD, cent r i co, sumaKm;
/ *d= di st anci a, pO= puebl o or i gen, pD= puebl o dest i no,
opc= opci n del men */
/ / I ni ci al i zar l a di agonal de l a mat r i z di st anci as a 0.
for ( po=0; po<TopePuebl os ; po=po+1)
{ di st anci a[ po] [ po] =0; }
/ / Ent r ada de dat os.
pr i nt f ( " Lect ur a de l a di st anci a ent r e l os puebl os de "
" Gui pzcoa: \ n" ) ;
for ( po=0; po<TopePuebl os- 1 ; po=po+1)
{ pr i nt f ( " I nt r oduce l a di st anci a desde el puebl o %d \ n" , po) ;
pr i nt f ( " a l os si gui ent es puebl os ( en km) : \ n " ) ;
for ( pd=po+1; po<TopePuebl os ; po=po+1)
{ pr i nt f ( " Puebl o %d : " , pd) ;
scanf ( " %d" , &d) ;
di st anci a[ po] [ pd] =d;
di st anci a[ pd] [ po] =d;
}
}
do{
pr i nt f ( " Men del anl i si s de puebl os. \ n" ) ;
pr i nt f ( " 1. Ver t abl a de di st anci as ent r e puebl os. \ n" ) ;
pr i nt f ( " 2. Most r ar l os 2 puebl os ms al ej ados ent r e s . \ n" ) ;
pr i nt f ( " 3. Dado un puebl o, most r ar cul es el ms l ej ano. \ n" ) ;
pr i nt f ( " 4. Most r ar el puebl o ms cnt r i co. \ n" ) ;
pr i nt f ( " 5. Cal cul ar el n de ki l met r os que hace el car t er o. \ n" ) ;
pr i nt f ( " 6. Sal i r \ n" ) ;
pr i nt f ( " El i ge una opci n : " ) ;
scanf ( " %d" , &opc) ;
110 Pueblos de Guipzcoa
switch ( opc )
{ case 1:
/ / Sal i da por pant al l a de l a t abl a de di st anci as ent r e puebl os.
pr i nt f ( " | " ) ;
for ( pd=0 ; pd < TopePuebl os; pd=pd+1)
{ pr i nt f ( " %4d" , pd) ; }
pr i nt f ( " \ n" ) ; / / sal t o de l nea
pr i nt f ( " | " ) ;
for ( pd=0 ; pd< TopePuebl os ; pd=pd+1)
{ pr i nt f ( " - - - - " ) ; }
pr i nt f ( " \ n" ) ; / / sal t o de l nea
for ( po=0 ; po< TopePuebl os ; po=po+1)
{ pr i nt f ( " %3d| " , pd) ;
for ( pd=0 ; pd< TopePuebl os ; pd=pd+1)
{ if ( po==pd)
{ pr i nt f ( " %4s" , " - " ) ; }
else
{ pr i nt f ( " %4d " , di st anci a[ po] [ pd] ) ; }
} / / f or ani dado
pr i nt f ( " \ n" ) ; / / sal t o de l nea
} / / f or pr i nci pal
break; / / opci n 1
case 2: / / Los dos puebl os ms al ej ados el uno del ot r o.
masLej osO=0; masLej osD=1;
for ( po=0; po < TopePuebl os- 1 ; po=po+1)
{ for ( pd=po+1 ; pd< TopePuebl os ; pd=pd+1)
{ if ( di st anci a[ po] [ pd] >di st anci a[ masLej osO] [ masLej osD] )
{ masLej osO=po;
masLej osD=pd;
} / / f i n del i f
} / / f i n del f or ani dado
} / / f i n del f or pr i nci pal
pr i nt f ( " Los dos puebl os ms al ej ados ent r e s son "
" el %d y el %d\ n" , masLej osO, masLej osD) ;
break; / / opci n 2
case 3:
Pueblos de Guipzcoa 111
/ * El puebl o dest i no ms al ej ado del puebl o or i gen i nt r oduci do
por el usuar i o. */
pr i nt f ( " I nt r oduce el nmer o de un puebl o: " ) ;
scanf ( " %d" , &po) ;
masLej osD=0;
for ( pd=1 ; pd< TopePuebl os ; pd=pd+1)
{ if ( di st anci a[ po] [ pd] >di st anci a[ po] [ masLej osD] )
{ masLej osD =pd; }
}
pr i nt f ( " El puebl o ms al aj ado del %d es %d\ n" , po, masLej osD) ;
break; / / opci n 3
case 4:
/ * Buscamos el puebl o ms cnt r i co. Pr i mer o sumamos l a
di st anci a de cada puebl o al r est o de puebl os */
for ( po=0; po< TopePuebl os ; po=po+1)
{ sumaDi st anci as[ po] =0;
for ( pd=0 ; pd< TopePuebl os ; pd=pd+1)
{ sumaDi st anci as[ po] =sumaDi st anci as[ po] +di st anci a[ po] [ pd] ; }
}
/ * Buscamos el puebl o ms cnt r i co, que ser el que t enga l a
suma de di st anci as ms pequea. */
cent r i co=0;
for ( po=1; po< TopePuebl os ; po=po+1)
{ if ( sumaDi st anci as[ po] <sumaDi st anci as[ cent r i co] )
{ cent r i co=po; }
}
pr i nt f ( " El puebl o ms cnt r i co es el %d\ n" , cent r i co) ;
break; / / opci n 4
case 5: / / ki l met r os que hace el car t er o
pr i nt f ( " I nt r oduce el puebl o en el que est el car t er o : " ) ;
scanf ( " %d" , &po) ;
pr i nt f ( " I nt r oduce l os puebl os que r ecor r e el car t er o : " ) ;
scanf ( " %d" , &pd) ;
sumaKm=0;
while ( pd! =- 1)
{ sumaKm= sumaKm+ di st anci a[ po] [ pd] ;
po=pd;
scanf ( " %d" , &pd) ;
112 Pueblos de Guipzcoa
}
pr i nt f ( " El car t er o r eal i za %d km. \ n" , sumaKm) ;
} / / f i n del swi t ch
syst em( " PAUSE" ) ; / / pausa hast a pul sar una t ecl a
syst em( " CLS" ) ; / / l i mpi ar pant al l a
}while ( opc! =6) ; / / f i n del bucl e

pr i nt f ( " Fi n del pr ogr ama " ) ;
syst em( " PAUSE" ) ; / / pausa hast a pul sar una t ecl a
}

113
OLIMPIADAS
El Comit Olmpico Internacional nos ha solicitado que le realicemos un
programa informtico. Dicho programa, debe efectuar ciertos clculos
manipulando datos del volumen de participantes por pas en diversas
disciplinas olmpicas, de las olimpiadas Beijing08, as como con los datos de
la anterior edicin, Atenas04.
Olimpiadas Beijing08 (Juegos Olmpicos de Pekn, China)
El subcomit de Pekn nos ha indicado que han intervenido deportistas de
203 pases. Y aunque el nmero de disciplinas olmpicas reconocidas es de
37, no todos los pases han tenido representacin en todas y cada una de las
mismas. Por lo tanto, el subcomit de Pekn nicamente nos va a
proporcionar los datos de aquellas disciplinas deportivas, ordenados por
pases, en las que ha habido representacin. El programa a elaborar deber
registrar los datos tal y como se muestra en el ejemplo siguiente.
Ejemplo de la entrada de datos de Pekin (en negrita los datos introducidos por el
usuario):
I nt r oduce l os par t i ci pant es de cada pa s en cada di sci pl i na:
Pa s 0:
Di sci pl i na y par t i ci pant es: 3 100
Di sci pl i na y par t i ci pant es: 6 23
Di sci pl i na y par t i ci pant es: -1 1

Pa s 1:
Di sci pl i na y par t i ci pant es: 1 13
Di sci pl i na y par t i ci pant es: 6 24
Di sci pl i na y par t i ci pant es: -1 0
.
..
Pa s 202:
Di sci pl i na y par t i ci pant es: 12 13
Di sci pl i na y par t i ci pant es: 34 24
Di sci pl i na y par t i ci pant es: -1 3

Para indicar la finalizacin de la entrada de datos de un pas se teclear un -1
como nmero de disciplina sin importar el nmero de participantes.
Olimpiadas Atenas2004 (Juegos Olmpicos de Atenas, Grecia)
El subcomit de Atenas nos ha indicado que igualmente en la edicin del
2004 participaron 203 pases, aunque no disponen de la distribucin de los
participantes por disciplinas sino nicamente disponen del volumen total de
participantes por pas. Eso s, nos pueden suministrar dichas cifras siguiendo
el mismo orden de pases que nos ha proporcionado el subcomit olmpico
de Pekn. Siguiendo las especificaciones indicadas, los datos de participacin
114 Olimpiadas
en los juegos olmpicos de Atenas se solicitarn y almacenarn de la
siguiente forma:
Ejemplo de la entrada de datos de Atenas: (en negrita los datos introducidos por
el usuario):
I nt r oducci n dat os At enas 2004:
Par t i ci pant es del pa s 0: 240
Par t i ci pant es del pa s 1: 2402

Par t i ci pant es del pa s 202: 3500

Una vez solicitados y almacenados los datos de participacin por pases de
las ltimas dos ediciones, el comit olmpico nos solicita que nuestro
programa calcule:

Respecto a las Olimpiadas 2008 en Pekn:
1. Indicar cul es, a nivel mundial, la disciplina deportiva con menor
nmero de participantes y cuntos son. Ejemplo:
La di sci pl i na con menor nmer o de par t i ci pant es de est as
Ol i mpi adas ha si do l a 25, concr et ament e con 2 par t i ci pant es.

2. Por cada pas especificado (tecleado) por el usuario, se calcular la
disciplina deportiva con mayor nmero de participantes. La solicitud del
pas y el consecuente cmputo se realizar hasta que el usuario
introduzca un -1 como pas. Adems se controlar que el cdigo del
pas pertenezca al rango [0 .. 202]. Ejemplo:

Pa s: 2
Ms depor t i st as en el depor t e 19
Pa s: 302
Cdi go de pa s i ncor r ect o. Especi f i que val or ent r e 0
y 202 - 1 par a f i nal i zar .
Pa s: 5
Ms depor t i st as en el depor t e 1
Pa s: -1

En comparacin con las Olimpiadas de Atenas 2004:
3. Listados de los pases que han aumentado el volumen de participantes
desde la edicin anterior. Ejemplo:
3 4 14 son l os pa ses con i ncr ement o en el vol umen de
par t i ci pant es.
En t ot al , son 3 pa ses.

Si no hay ningn pas que haya incrementado su nmero de
participantes en Beijing08 con respecto a Atenas04, el mensaje a
presentar en pantalla deber adecuarse al siguiente:
Ni ngn pa s ha i ncr ement ado su vol umen de par t i ci pant es
desde l a edi ci n del 2004.
Olimpiadas 115
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. TopeDiscip = 37. Nmero de disciplinas olmpicas reconocidas.
2. TopePaises = 203. Nmero total de paises que intervienen en las
olimpiadas .
Representacin de las variables necesarias para la entrada
3. Necesitamos la matriz pekin08 que tiene TopeDiscip X Tope Paises
posiciones, donde se guardar por cada disciplina y pas el nmero de
participantes.
pekin08 0 1 TopePaises -1
0
1

TopeDiscip-1

4. Necesitaremos un vector que le llamaremos atenas04h con TopePaises
posiciones donde almacenaremos por cada pas el nmero de
participantes en los Juegos Olmpicas de Atenas de 2004.
0 1 TopePaises -1
atenas04h

Representacin de las variables necesarias para los resultados
5. Necesitamos un vector que le llamaremos pekin08h de TopePaises
posiciones. En l guardaremos por cada pas el total de participantes
0 1 TopePaises -1
pekin08h

6. Necesitaremos un vector que le llamaremos parPaisPek con TopeDiscip
posiciones donde se guardar por cada disciplina el nmero de
participantes.
0 1 TopeDiscip -1
parPaisPek

Pasos a seguir en la resolucin del problema
1. Pondremos a 0 la matriz pekin08, ya que puede haber paises y disciplinas
en las que no hay participantes.
2. Rellenaremos la matriz pekin08 con los datos que iremos pidiendo por
pantalla. Se ir solicitando pas a pas de manera ordenada y por cada
pas la disciplina y el nmero de participantes, este par de datos no
vendr ordenado y para saber cuando se terminar de introducir datos
de un pas se introducir un -1 en la disciplina
116 Olimpiadas
3. Para cada pas se leer el nmero de participantes que ha ha bido y se
rellenar el vector atenas04h.
4. Para cada disciplina:
a. Se pondr una variable sum a 0 .
b. Se acumular recorriendo todos los pases en sum el nmero de
participantes.
c. Cada vez que cambie de disciplina se almacenar en la posicin
correspondiente del vector parPaisPek.
5. Se calcular que valor es el mnimo del vector parDisPek (posicin).
6. Se pedir un nmero de pas.
7. Y hasta que se teclee un -1 en el nmero de pas,
a. Se comprobar que el nmero de pas est en el rango (0 pas
203)
b. Para ese pas se buscar en la columna correspondiente de la
matriz pekin08 la disciplina con menor nmero de participantes.
8. Se calcular en el vector pekin08h el nmero de participantes por cada
pas y se ir comparando cada elemento del vector con cada elemento
del vector atenas04h para ir obteniendo los paises en los que ha
aumentado el nmero de participantes. Utilizaremos una variable de
nombre tot que la iniciaremos a 0, cada vez que encontremos un pas
que supera en el nmero de participantes sumaremos 1, de esta manera
al final se podr saber si no ha habido paises que han superado en el
nmero de participantes.
Olimpiadas 117
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define TopeDi sci p 37
#define TopePai ses 203
main(){
int peki n08[ TopeDi sci p] [ TopePai ses] ;
int peki n08h[ TopePai ses] , at enas04h[ TopePai ses] ;
int par Pai sPek [ TopeDi sci p] ;
int pai s, dep, pa, mi n, mej or , sum, t ot ;

/ * Poner l a mat r i z a o*/
for ( pai s =0; pai s < TopePai ses; pai s++)
for ( dep =0; dep < TopeDi sci p; dep ++)
peki n08[ dep] [ pai s] =0;

/ * Regi st r ar l os dat os de Peki n*/
pr i nt f ( " I nt r oduce l os dat os de cada pa s en cada di sci pl i na: \ n" ) ;

for ( pai s =0; pai s < TopePai ses; pai s ++)
{ pr i nt f ( " Pa s %d: \ n" , pai s) ;
pr i nt f ( " Di sci pl i na y par t i ci pant e : " ) ;
scanf ( " %d %d" , & dep, &pa) ;
while ( dep! =- 1)
{ peki n08[ dep] [ pai s] =pa;
pr i nt f ( " Di sci pl i na y par t i ci pant e: " ) ;
scanf ( " %d %d" , & dep, &pa) ;
}
}

pr i nt f ( " I nt r oducci n dat os At enas 2004: \ n" ) ;
for ( pai s =0; pai s < TopePai ses; pai s ++)
{ pr i nt f ( " Par t i ci pant es del pa s %d : " , pai s) ;
scanf ( " %d" , &at enas04h[ pai s] ) ;
/ / o scanf ( " %d" , &pa) ; at enas04h[ pai s] =pa;
}
118 Olimpiadas

/ * Cl cul o de l a di sci pl i na con menor nmer o de par t i ci pant es*/
for ( dep =0; dep < TopePai ses; dep ++)
{ sum=0;
f or ( pai s =0; pai s <TopePai ses; pai s ++) {sum=sum+ peki n08[ dep] [
pai s] ; }
par Pai sPek [ dep] = sum;
}
mi n=0;
for ( dep =1; dep < TopeDi sci p; dep ++)
{ if ( par Pai sPek [ dep] <
par Pai sPek [ mi n] )
{ mi n= dep; }
}

pr i nt f ( " La di sci pl i na con menor nmer o de par t i ci pant es de\ n" ) ;
pr i nt f ( " est as Ol i mpi adas ha si do l a %d concr et ament e con \ n" , mi n) ;
pr i nt f ( " %d par t i ci pant es \ n" , par Pai sPek [ mi n] ) ;

/ * Por cada pa s especi f i cado ( t ecl eado) por el usuar i o, se
cal cul ar l a di sci pl i na depor t i va con mayor nmer o de
par t i ci pant es, par a f i nal i zar pul sar - 1 en el pa s */
pr i nt f ( " Pa s: " ) ; scanf ( " %d" , & pai s) ;
while ( pai s! =- 1)
{ if ( ( 0<= pai s) && ( pai s <= TopePai ses) ) / *Di sci pl i na mej or ?*/
{ mej or =0; / *En pr i nci pi o l a 0. a */
for ( pai s=1; pai s< TopeDi sci p; pai s++)
{ if ( peki n08[ dep] [ pai s] >
peki n08[ mej or ] [ pai s] ) {mej or = dep; } }
pr i nt f ( " Ms depor t i st as en el depor t e: %d\ n" , mej or ) ;
}
else / *ent r ada er r nea*/
{ pr i nt f ( " Cdi go de pa s er r neo. Especi f i que val or ent r e 0 "
" y 202 - 1 par a f i nal i zar . \ n" ) ;
}

pr i nt f ( " Pa s: " ) ;
scanf ( " %d" , & pai s) ;
Olimpiadas 119
}
pr i nt f ( " \ n\ n" ) ;

/ * Peki n vs At enas*/
for ( pai s =0; pai s < TopePai ses; pai s++)
{ sum=0;
f or ( dep =1; dep< TopeDi sci p; dep ++) {sum=sum+ peki n08[ dep] [
pai s] ; }
peki n08h[ pai s] = sum;
}

/ * pa ses que han aument ado el vol umen de par t i ci pant es desde l a
edi ci n ant er i or */
t ot =0;
for ( pai s =0; pai s < TopePai ses; pai s ++)
{ if ( peki n08h[ pai s] > at enas04h[ pai s] ) { pr i nt f ( " %5d" , pai s) ;
t ot ++; } }
if ( t ot >0)
{ pr i nt f ( " son l os pa ses con i ncr ement o en el vol umen de"
" par t i ci pant es . \ n" ) ;
pr i nt f ( " En t ot al son %d pai ses\ n" , t ot ) ;
}
else
{ pr i nt f ( " Ni ngn pa s ha i ncr ement ado su vol umen de
par t i ci pant es\ n" ) ;
pr i nt f ( " desde l a edi ci n del 2004 . \ n" ) ;
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}
120
VENTAS S. A.
La empresa Ventas S.A. quiere analizar cul es su mejor zona de ventas. Para
ello, nos pide un programa informtico que le permita recoger y analizar los
datos de las ventas que hacen sus 10 vendedores en las 20 zonas en las que
trabajan.
La empresa vende 5 productos que tienen diferentes precios. Se deber
declarar en el programa un array constante, que contenga los precios de
dichos productos, para poder calcular posteriormente el importe de las
ventas. El array ser el siguiente:

0 1 2 3 4
precioProducto 20.5 50 15 5.25 150
En la entrada de datos el usuario introducir para cada vendedor y zona lo
siguiente: qu productos ha vendido y cuntas unidades de cada uno de
ellos. De la siguiente forma:

I nt r oduce n de vendedor y n de zona : 2 4
I nt r oduce el n del pr oduct o vendi do y n de uni dades: 2 10
I nt r oduce el n del pr oduct o vendi do y n de uni dades: 1 5
I nt r oduce el n del pr oduct o vendi do y n de uni dades: 3 20
I nt r oduce el n del pr oduct o vendi do y n de uni dades: -1 -1
I nt r oduce n de vendedor y n de zona: 1 3
I nt r oduce el n del pr oduct o vendi do y n de uni dades: 5 50
I nt r oduce el n del pr oduct o vendi do y n de uni dades: 3 10
I nt r oduce el n del pr oduct o vendi do y n de uni dades:-1 -1
I nt r oduce n de vendedor y n de zona: -1 -1
La entrada de datos finalizar cuando se introduzca un -1 en el nmero de
vendedor, sin importar el nmero que nos den en la zona. Y se cambiar de
vendedor y zona cuando se introduzca un -1 en el n de producto, sin
importar el n de unidades. Con esta entrada de datos lo que nos interesa
guardar en memoria, para hacer el estudio, es para cada vendedor y zona, el
importe total de las ventas. Tener en cuenta que, puede ocurrir que algn
vendedor no realice ninguna venta en alguna de las zonas.
El programa deber realizar lo siguiente:
1. Mostrar en pantalla el importe total de las ventas realizadas por cada
vendedor en cada zona, tal y como se indica en el ejemplo. Ejemplo:

Vendedor Zona0 Zona1 Zona2 Zona19
0 200. 5 150. 00 567. 00 7584. 00
1 560. 25 486. 00 968. 00 238. 00

9 458. 75 158. 00 445. 00 868. 00

Ventas 121
2. Dada una zona, indicar cul ha sido el mejor vendedor de esa zona.
Ejemplo:
Dame zona: 3
El mej or vendedor de l a zona 3 ha si do el vendedor nmer o 2.
3. Indicar, qu vendedor y en qu zona ha obtenido el mayor importe de
ventas. Ejemplo:
El mayor i mpor t e de vent as l o ha obt eni do el vendedor 1 en l a
zona 19.
4. Indicar para cada zona, qu vendedores no han conseguido realizar
ninguna venta y cuntos son en total. Ejemplo:

Zona 0: 3 8 9
Tot al 3 vendedor es no han consegui do vent as.
Zona 1: Todos l os vendedor es han r eal i zado al guna vent a.


Zona 19: 3 4 5 7 8 9
Tot al 6 vendedor es no han consegui do vent as.

122 Ventas
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. TopeVendedor = 10. Nmero de vendedores de la empresa.
2. TopeZonas = 20. Nmero de zonas en las que trabajan los vendedores.
Representacin de las variables necesarias para la entrada
3. Necesitaremos una matriz que le llamaremos ventas, de TopeVendedor X
TopeZonas posiciones, para almacenar lo que ha vendido cada vendedor
en cada zona.
ventas 0 1 TopeZonas -1
0
1

TopeVendedor -1

4. Necesitaremos un vector que le llamaremos prodPrecio, de 5 posiciones
para almacenar en cada posicin el precio de cada producto.
0 1 4
prodPrecio 20.5 50 150

Pasos a seguir en la resolucin del problema
1. Inicializar la matriz ventas a 0.
2. Leer el primer par vendedor, zona (v,z)
a) Mientras el vendedor sea distinto de -1 hacer:
a. Leer el par (p,u)
i. Iniciar sum a 0
b. Mientras el producto sea distinto de -1,
i. Acumular en sum las unidades (u) por el precio del
producto que est en el vector prodPrecio
ii. Leer siguiente par (p,u)
c. Almacenar las unidades acumuladas en la matriz ventas
3. Leer el siguiente par (v,z)
4. Mostrar en pantalla la matriz tal y cmo se indica en el enunciado
5. Por cada vendedor:
a. Recorrer cada fila y mostrar las ventas en cada zona, que sern
cada una de las posiciones de cada fila
6. Leer una zona :
Ventas 123
a. Recorrer en la matriz ventas la columna correspondiente a esa
zona y buscar el elemento mayor
7. Suponer que el elemento que est en la primera posicin de la matriz
ventas es el mayor, para ello poner la posicin de la fila y de la columna a
0, vmax=0 y zmax=0
a. Recorrer toda la matriz y comparar siempre si ventas[v][z]
<ventas[vmax][zmax],si ocurre tal condicin se almacenan en
vmax y zmax los nuevos valores de v y z, al finalizar en vmax y
zmax estarn las posiciones del mejor vendedor y zona
8. Por cada zona:
a. Inicializar cont a 0 para acumular el nmero de vendedores que no
han conseguido ventas
b. Recorrer en la matriz ventas cada columna para ver por cada
vendedor en esa zona si no ha tenido ventas, si es as acumular en
cont el nmero de vendedores que no han tenido ventas en esa zona.
c. Si cont es 0 al terminar con la zona es que todos los vendedores han
tenido ventas
124 Ventas
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define TopeVendedor 10
#define TopeZonas 20

main(){
float vent as [ TopeVendedor ] [ TopeZonas] ;
float pr odPr eci o [ 5] = {20. 5, 50, 15, 5. 25, 150};
float sum;
int v, z, p, u, vmax, zmax, cont ;
for( v=0 ; v<TopeVendedor ; v++) / / I ni ci al i zar l a mat r i z a 0
{ for( z=0 ; z<TopeZonas ; z++)
{vent as[ v] [ z] =0; } / /
}
/ * I nt r oducci n de l os dat os */
pr i nt f ( " I nt r oduce el n de vendedor y n de zona: " ) ;
scanf ( " %d %d" , &v, &z) ;
while ( v! =- 1)
{ pr i nt f ( " I nt r oduce el n del pr oduct o vendi do y n de uni dades:
" ) ;
scanf ( " %d %d" , &p, &u) ;
sum=0;
while ( p! =- 1) / / r epet i r par a cada pr oduct o y uni dades
{ sum=sum+ u * pr odPr eci o[ p] ;
pr i nt f ( " I nt r oduce el n del pr oduct o vendi do y n de
uni dades: " ) ;
scanf ( " %d %d" , &p, &u) ;
}
vent as[ v] [ z] = vent as[ v] [ z] + sum;
pr i nt f ( " I nt r oduce el n de vendedor y n de zona: " ) ;
scanf ( " %d %d" , &v, &z) ;
}

/ * Most r ar en pant al a */
pr i nt f ( " Vendedor / " ) ;
for( z=0 ; z<TopeZonas; z++)
Ventas 125
{ pr i nt f ( " Zona%d\ t " , z) ;
}
pr i nt f ( " \ n\ n" ) ;

for( v=0 ; v<TopeVendedor ; v++)
{ pr i nt f ( " %d\ t " , v) ;
for( z=0 ; z<TopeZonas ; z++)
{ pr i nt f ( " \ t %5. 2f " , vent as[ v] [ z] ) ; }
pr i nt f ( " \ n" ) ;
}

/ * Mej or vendedor */
pr i nt f ( " \ nDame zona: " ) ; scanf ( " %d" , &z) ;
vmax=0; / / suponemos que el de l a pr i mer a posi ci n es el
mej or
for( v=0 ; v<TopeVendedor ; v++)
if ( vent as[ vmax] [ z] <vent as[ v] [ z] ) {vmax=v; }
/ / si se encuent r a uno mej or se sust i t uye

pr i nt f ( " El mej or vendedor de l a zona %d ha si do el vendedor
nmer o %d . \ n\ n" , z, vmax) ;

/ * Buscar cul ha si do el mej or vendedor y en que zona */
vmax=0; / / Por def ect o el que ocupa l a pr i mer a
posi ci n el mayor
zmax=0;
for ( v=0 ; v<TopeVendedor ; v++)
for( z=0 ; z<TopeZonas ; z++)
{ if ( vent as[ vmax] [ zmax] <vent as[ v] [ z] )
{ vmax=v; zmax=z; } / / si se encuent r a al guno mayor se
al macena en vmax y zmax l as nuevas posi ci ones
}
pr i nt f ( " El mayor i mpor t e de vent as l o ha obt eni do el vendedor %d
en l a zona %d . \ n\ n" , vmax, zmax) ;

/ * Vendedor es si n vent as */
for( z=0 ; z<TopeZonas ; z++)
{cont =0;
pr i nt f ( " \ nZona %d: " , z) ;
126 Ventas
for ( v=0 ; v<TopeVendedor ; v++)
{ if ( vent as[ v] [ z] ==0) { pr i nt f ( " %d" , v) ; cont ++; }
}
if ( cont ! =0)
{pr i nt f ( " \ nTot al %d vendedor es no han consegui do vent as. " ,
cont ) ; }
else {pr i nt f ( " \ nTodos l os vendedor es han consegui do al guna
vent a" ) ;
}
pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}
127
ACCIDENTES DE CIRCULACIN
Tras las ltimas vacaciones el nmero de accidentes de circulacin ha sido
tan elevado, que un total de 50 diputaciones forales han decido compartir
los datos de los siniestros mortales sucedidos en dicho periodo, para extraer
algunos resultados estadsticos.
Las 4 causas de siniestros mortales consideradas son: velocidad, alcohol,
drogas y otros.
Una empresa teleoperadora registrar durante unos das las cifras que le irn
suministrando los responsables de las distintas prosincias. La introduccin
de los datos se realizar mediante tripletas (prosincia, causa, nm. muertos).
Puesto que puede suceder que alguno de los heridos muera, ser necesario
introducir en ms de una ocasin tripletas con la misma prosincia y misma
causa; en cuyo caso, habr que incrementar con el nueso nmero
suministrado la cifra ya almacenada. Para finalizar la introduccin de los
siniestros mortales, bastar con indicar -1 en alguno de los valores del
triplete de entrada.
Ejemplo: (en negrita los datos de la teleoperadora)
I nt r oducci n de si ni est r os mor t al es ( uno del t r i pl e - 1 par a
f i nal i zar ) .
Pr ovi nci a causa n. muer t os: 0 1 2
Pr ovi nci a causa n. muer t os: 0 0 11
Pr ovi nci a causa n. muer t os: 3 0 5
Pr ovi nci a causa n. muer t os: 0 0 2

Pr ovi nci a causa n. muer t os: 0 -1 0

Una vez finalizado el registro del nmero de fallecidos, se registrar tambin
por provincias el nmero total de kilmetros recorridos por bomberos y
sanitarios en los siniestros considerados.
Ejemplo: (en negrita los datos de la teleoperadora)
Regi st r o de l os kmr ecor r i dos en t ot al por pr osi nci a:
Pr ovi nci a 0: 340
Pr ovi nci a 1: 124
Pr ovi nci a 2: 678
. . . . . . . .
Pr ovi nci a 49: 210
Con los datos almacenados se pide:
1) Calcular el nmero de muertos por provincia, y el nmero total de
muertos tras las ltimas vacaciones.
2) Determinar si la provincia con ms vctimas mortales es la provincia
con mayor kilometraje en asistencias. Ejemplo:
La pr ovi nci a con ms v ct i mas mor t al es es l a 35.
128 Accidentes de circulacin
La pr ovi nci a con mayor ki l omet r aj e en asi st enci as es 2 .
No coi nci den l as pr ovi nci as.
3) Por provincia estudiada, determinar el promedio de kilmetros
recorridos por cada vctima mortal. Ejemplo:
Pr ovi nci a 0: 23. 2kmr ecor r i dos por v ct i ma mor t al .
Pr ovi nci a 1: 12. 7kmr ecor r i dos por v ct i ma mor t al .
. . . . . . . . . . . . . .

4) Solicitar una de las causas de accidentes estudiadas y determinar el
nmero de vctimas mortales originadas por la misma. Repetir el
proceso en tanto en cuanto la causa indicada sea una de las
estudiadas. Ejemplo:
I ndi que una causa de acci dent e: 1
En t ot al hay r egi st r ados 57 muer t os por l a causa 1.

I ndi que una causa de acci dent e: 0
En t ot al hay r egi st r ados 89 muer t os por l a causa 0.

I ndi que una causa de acci dent e: -7
Accidentes de circulacin 129
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. TopeProv = Nmero de provincias que intervienen en el estudio.
2. Causas = 4. Nmero de causas de siniestros mortales.
Representacin de las variables necesarias para la entrada
3. Necesitamos una matriz de TopeProv X Causas posiciones que le
llamaremos muertosAccidentes donde se almacenar el nmero de muertos
que ha habido en cada provincia por cada una de las causas.
muertosAccidentes 0 1 Causas-1
0
1

TopeProv -1

4. Necesitaremos un vector de TopeProv -1 posiciones que le llamaremos
ayudaKm donde almacenaremos el nmero total de kilmetros recorridos
por bomberos y sanitarios en los siniestros considerados por provincia.
0 1 TopeProv -1
ayudaKm

Representacin de las variables necesarias para los resultados
5. Necesitamos un vector de TopeProv posiciones que le llamaremos
muertosP donde almacenaremos el nmero total de muertos habidos por
provincia.
0 1 TopeProv -1
muertosP

6. Necesitaremos un vector de Causas posiciones que le llamaremos
muertosC donde almacenaremos el nmero total de muertos que ha
habido por cada una de las causas entre todas las provincias.
0 1 Causas -1
muertosC

Pasos a seguir en la resolucin del problema
1. Inicializar la matriz muertosAccidentes a 0.
2. Leer la primera tripleta (p,c,m)
3. Mientras los tres valores sean distintos de -1
a. Acumularel nmero de muertos en la matriz muertosAccidentes
b. Leer la siguiente tripleta (p,c,m)
130 Accidentes de circulacin
4. Almacenar en el vector ayudaKm el nmero total de kilmetros
recorridos por bomberos y sanitarios en los siniestros considerados por
provincia.
5. Inicializar a 0 tot para calcular el total de muertos entre todas las
provincias.
6. Por cada provincia:
a. Calcular y almacenar en el vector muertosP el nmero de muertos
habidos entre todas las causas, recorriendo la matriz
muertosAccidentes
b. Acumular en tot el total de muertos de la provincia
7. Calcular la provincia con ms vctimas mortales, es decir, calcular la
posicin del mximo del vector muertosP, dejando la posicin del
mximo en maxP.
8. Calcular la provincia con ms kilometraje en asistencias, es decir,
calcular la posicin del mximo del vector ayudasKm, dejando la posicin
del mximo en KmmaxP.
9. Comparar MaxP y kmMaxP , para determinar si la provincia con ms
vctimas mortales coincide caon la provincia con mayor kilometraje en
asistencias.
10. Por cada provincia dividir cada elemento del vector muertosP por el
elemento de la misma posicin del vector ayudasKm para obtener el
promedio de kilmetros recorridos por vctima mortal.
11. Por cada causa (c)
a. Calcular y almacenar en el vector muertosC el nmero de muertos
habidos entre todas las provincias, recorriendo la matriz
muertosAccidentes
12. Leer un causa c
13. Mientras la causa (0c<4), repetir:
a. Mostrar el nmero de muertos registrados en el vector muertosC por
esa causa
b. Leer otra causa c
Accidentes de circulacin 131
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define TopePr ov 50
#define Causas 4
main (){
int muer t osAcci dent es[ TopePr ov] [ Causas] ;
int ayudaKm[ TopePr ov] , muer t osP[ TopePr ov] ;
int muer t osC[ Causas] ;
int pr o, c, m, t ot , maxP, kmMaxP;
float bb;

/ / Mat r i z a 0
for ( pr o=0; pr o<TopePr ov; pr o++)
for ( c=0; c<Causas; c++)
muer t osAcci dent es[ pr o] [ c] =0;

/ / Regi st r ar muer t os por pr ovi nci a y causa
pr i nt f ( " I nt r oducci n de si ni est r os mor t al es\ n" ) ;
pr i nt f ( " ( uno del t r i pl e - 1 par a f i nal i zar ) \ n" ) ;
pr i nt f ( " Pr ovi nci a Causa n. muer t os: " ) ;
scanf ( " %d %d %d" , &pr o, &c, &m) ;
while ( pr o! =- 1 &&c! =- 1 && m! =- 1)
{ muer t osAcci dent es[ pr o] [ c] =muer t osAcci dent es[ pr o] [ c] +m;
pr i nt f ( " Pr ovi nci a Causa n. muer t os: " ) ;
scanf ( " %d %d %d" , &pr o, &c, &m) ;
}

/ / Regi st r ar l os kms r ecor r i dos por pr ovi nci a
for ( pr o=0; pr o<TopePr ov; pr o++)
{ pr i nt f ( " %d Pr ovi nci a: " , pr o) ;
scanf ( " %d" , &ayudaKm[ pr o] ) ;
}

/ / 1. Muer t os por pr ovi nci a y t ot al
t ot =0;
132 Accidentes de circulacin
for ( pr o=0; pr o<TopePr ov; pr o++)
{ muer t osP[ pr o] =0;
for ( c=0; c<Causas; c++)
muer t osP[ pr o] =muer t osP[ pr o] +
muer t osAcci dent es[ pr o] [ c] ;
pr i nt f ( " El t ot al de muer t os de l a pr ovi nci a %d son %d. \ n" , pr o,
muer t osP[ pr o] ) ,
t ot =t ot +muer t osP[ pr o] ;
}
pr i nt f ( " El t ot al de muer t os %d. \ n\ n" , t ot ) ;


/ * 2. Coi nci den l a pr ovi nci a de ms muer t os con l a de mayor km.
de asi st enci a?
La pr ovi nci a de ms muer t os */
maxP=0;
for ( pr o=1; pr o<TopePr ov; pr o++)
if ( muer t osP[ maxP] < muer t osP[ pr o] ) {maxP=pr o; }
pr i nt f ( " La pr ovi nci a con ms v ct i mas mor t al es es %d . \ n" ,
maxP) ;

/ / La pr ovi nci a con ms ki l omet r aj e
kmMaxP=0;
for ( pr o=1; pr o<TopePr ov; pr o++)
if ( ayudaKm[ kmMaxP] < ayudaKm[ pr o] ) {kmMaxP=pr o; }
pr i nt f ( " La pr ovi nci as con mayor ki l omet r aj e es"
" %d . \ n" , kmMaxP) ;

if ( maxP==kmMaxP)
{pr i nt f ( " Coi nci den l as pr ovi nci as. \ n\ n" ) ; }
el se {pr i nt f ( " No coi nci den l as pr ovi nci as. \ n\ n" ) ; }

/ / 3. Det er mi nar el pr omedi o de kms. r ecor r i dos en cada
pr ovi nci a por cada v ct i ma mor t al
for ( pr o=0; pr o<TopePr ov; pr o++)
{ bb=float( muer t osP[ pr o] ) / ayudaKm[ pr o] ;
Accidentes de circulacin 133
pr i nt f ( " Pr ovi nci a %d: %. 1f kmr ecor r i dos por v ct i ma mor t al "
" . \ n" , pr o, bb) ;
}
pr i nt f ( " \ n\ n" ) ;

/ / 4. Cal cul ar por cada causa nmer o de v ct i mas mor t al es ent r e
t odas l as pr ovi nci as
for (c=0;c<Causas;c++)
{ muer t osC[ c] =0;
for ( pr o=0; pr o<TopePr ov; pr o++)
muer t osC[ c] =muer t osC[ c] +
muer t osAcci dent es[ pr o] [ c] ;
}

pr i nt f ( " I ndi que una causa de acci dent e: " ) ;
scanf ( " %d" , &c) ;
while ( 0<=c &&c<Causas)
{ pr i nt f ( " En t ot al hay %d muer t os por l a causa %d. \ n\ n" ,
muer t osC[ c] , c) ;
pr i nt f ( " I ndi que una causa de acci dent e: " ) ;
scanf ( " %d" , &c) ;
}

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}
135
EUSKADI IRRATIA
Desde Euskadi Irratia nos han llamado para realizar un programa
informtico que les permita gestionar la informacin sobre los
colaboradores de los distintos programas de Radio. Analizando la
informacin que tienen de las ltimas temporadas radiofnicas, se han dado
cuenta de que como mximo tienen 100 colaboradores por temporada y la
programacin de una temporada tiene como mximo 50 programas
distintos. Tambin es sabido que los colaboradores participan en ms de un
programa y puede ocurrir que alguno no participe en ninguno (por temas de
enfermedad, porque se pensaba abrir una nueva seccin en un programa que
al final no ha salido, ...).
Para ello, hemos hablado con el responsable de la programacin de
Euskadi Irratia y nos ha pedido que el programa tenga una interfaz como
la siguiente.
Inicialmente saldr un men con las siguientes opciones:
A) I nt r oduci r pr ogr amaci n.
B) Aadi r pr ogr ama.
C) Aadi r col abor ador es.
D) I nt r oduci r l a par t i ci paci n de l os col abor ador es en l os
di st i nt os pr ogr amas
E) Cal cul ar l o que cobr ar cada col abor ador y l o que t i ene que
pagar Euskadi Irratia en t ot al a t odos l os col abor ador es
F) Qu pr ogr ama gast a ms en col abor ador es.
G) En qu pr ogr amas no ha par t i ci pado ni ngn col abor ador y
cuant os son.
H) Ter mi nar
Por cada una de las opciones el programa tendr que hacer lo siguiente:

A) Introducir programacin.
Cuando se elija esta opcin ser cuando se cambie de temporada, es
decir la informacin que tenamos hasta ahora no sirve y nos van a dar
otra (cambio de invierno a verano, por ejemplo). Los datos se
introducirn en el siguiente formato (En negrita los datos introducidos
por el usuario):
Dame l a l i st a de pr ogr amas de est a t empor ada ( par a t er mi nar
t ecl ear Fi n) :
Pr ogr ama 0: Goiz kronika
Pr ogr ama 1: Faktoria
Pr ogr ama 2: Aperitifa
Pr ogr ama 3: Goizak Gaur

Pr ogr ama 38: Fin
B) Aadir programa.
136 Euskadi Irratia
Esta opcin aade un nuevo programa a la programacin, si no se ha
llegado al mximo de programas posibles. Si se llega al mximo de
programas el programa escribir el siguiente mensaje:
La lista de posibles programas est llena, pngase en
contacto con el servicio de informtica.
En caso contrario, se aadir el nuevo programa:
I nt r oduce pr ogr ama 38: Esaidazu
C) Aadir colaboradores.
Cuando se elija esta opcin se aadirn colaboradores, si no se ha
llegado al mximo. En caso de que lleguemos al mximo daremos un
mensaje de error diciendo que no podemos aadir ms colaboradores,
como por ejemplo:
La lista de posibles colaboradores est llena, pngase en
contacto con el servicio de informtica.
Si se pueden aadir ms colaboradores la comunicacin seria de la
siguiente manera (En negrita los datos introducidos por el usuario):
I nt r oduce l os col abor ador es ( par a t er mi nar t ecl ea Fi n) :
Col abor ador : Iigo Segurola
Cobr a por mi nut o ( en eur os) : 5
Col abor ador : Andoni Egaa
Cobr a por mi nut o ( en eur os) : 3.75
Col abor ador : Jess Torquemada
Cobr a por mi nut o ( en eur os) : 6.5

Col abor ador : Fin


D) Introducir la participacin de los colaboradores en los distintos
programas.
Cada vez que se elija esta opcin se aadir a los colaboradores las
nuevas participaciones que hayan tenido en los distintos programas. Se
pedir para cada programa la lista de colaboradores con el tiempo de
intervencin, como se ve en el siguiente ejemplo (En negrita los datos
introducidos por el usuario):
Pr ogr ama Goi z kr oni ka:
Dame col abor ador y t i empo ( en mi nut os) : 2 150
Dame col abor ador y t i empo ( en mi nut os) : 1 120
Dame col abor ador y t i empo ( en mi nut os) : 25 150
El col abor ador 25 no exi st e.
Dame col abor ador y t i empo ( en mi nut os) : 2 150
. . .
Dame col abor ador y t i empo ( en mi nut os) : -1 0
Pr ogr ama Fact or i a:
Dame col abor ador y t i empo ( en mi nut os) : 2 150
. . .
Dame col abor ador y t i empo ( en mi nut os) : -1 0
. . .
E) Calcular lo que cobrar cada colaborador y lo que tiene que pagar
Euskadi Irratia en total a todos los colaboradores.
Euskadi Irratia 137
Teniendo en cuenta las participaciones realizadas hasta el momento
calcular cuanto hay que pagar a cada colaborador y en gasto total de la
radio en colaboradores. Si un colaborador no ha participado en ningn
programa no aparecer en la lista.
Andoni Egaa ha par t i ci pado 120 mi nut os: 450 eur os
J esus Tor quemada ha par t i ci pado 450 mi nut os: 2925 eur os
En t ot al Euskadi I r r at i a gast ar en col abor ador es 3375
eur os.

F) Qu programa gasta ms en colaboradores.
Calcular, con los datos que tenemos hasta el momento, el programa que
mas dinero ha gastado en colaboradores.
El pr ogr ama que ms gast a en col abor ador es es Goi z Kr oni ka
con 2400 .

G) En qu programas no ha participado ningn colaborador y cuntos son.
Indicar el nombre de los programas en los que no ha participado
ningn colaborador y indica en cuntos casos ha pasado esto.
No ha par t i ci pado ni ngn col abor ador en l os pr ogr amas:
Goi zak Gaur
Kl asi koak EI TBn
En t ot al son 2 pr ogr amas.

H) Terminar.
Al teclear esta opcin el programa terminar.

138 Euskadi Irratia
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. TopeColab = 100. Mmero mximo de colaboradores por programa.
2. TopeProg = 50. Nmero mximo de programas distintos en una misma
temporada.
3. TopeLong = 70. Nmero mximo de caracteres que puede tener el
nombre de un programa o de un colaborador.
Representacin de las variables necesarias para la entrada
4. Necesitamos la matriz nomProg, de tipo caracter, para guardar los
nombres de los programas. La matriz tiene TopeProg filas y TopeLong
columnas, para poder guardar los nombre de los programa en cada una
de las fila.
nomProg 0 1 ... TopeLong-1
0
1
...
TopeProg-1

5. Para guardar los nombres de los colaboradores utilizamos la matriz de
caracteres nomColab. La matrz tiene TopeColab filas y TopeLong columnas.
nomColab 0 1 ... TopeLong-1
0
1
...
TopeColab-1

6. Para guardar los euros por minuto que cobra cada colaborador,
utilizamos el vector colabMin con TopeColab posiciones.
0 1 ... TopeColab-1
colabMin

7. Utilizamos la matriz tiempo de TopeProg X TopeColab posiciones, para
guardar el tiempo (en minutos) de intervencin de los colaboradores en
los diferentes programas.
tiempo 0 1 ... TopeColab-1
0
1
...
TopeProg-1

Representacin de las variables necesarias para los resultados
8. En el vector progGasto se guarda el gasto total que tiene cada programa
en colaboradores.
Euskadi Irratia 139
0 1 ... TopeProg-1
progGasto

Pasos a seguir en la resolucin del problema.
1. Inicializamos en contador de colaboradores a 0 (contColab).
2. Repetir:
a. Escribir el menu en pantalla.
b. Leer la opcin elegida.
c. Si se elige la opcin A, entonces:
i. Inicializamos el contador de programa a 0 (contProg).
ii. Se inicializa la matriz tiempo a 0.
iii. Se lee el nombre del programa.
iv. Mientras no se introduzca el nombre Fin, se guarda el
nombre del programa en la matriz nomProg, se incrementa el
contador de programa y se lee el siguiente nombre.
d. Si se elige la opcin B, entonces:
i. Si el contador de programas contProg ha alcanzado el valor
mximo TopeProg, entoneces damos un mensaje indicando que la
lista est llena.
ii. En caso contrario:
1. se pide el nombre del programa y se guarda en el vector
nomProg.
2. se incrementa el contador de programas contProg.
e. Si se elige la opcin C, podemos aadir colaboradores.
i. Si la lista de colaboradores est llena damos un mensaje
indicandolo.
ii. En caso contrario:
1. Leemos el nombre del colaborador. Mientras no nos den el
nombre Fin y mientras haya sitio en la lista de
colaboradores guardamos el nombre del colaborador en la
matriz nomColab y leemos en el vector colabMin, lo que cobra
este colaborador por minuto. Incrementamos el contador
de colaboradores y pedimos el siguiente nombre.
f. Si se elige la opcin D, se pueden aadir colaboradores en los
distintos programas:
140 Euskadi Irratia
iii. Recorremos secuencialmente todos los programas.
1. Leemos el colaborador y el tiempo
2. Mientras no nos den el colaborador -1, y si adems el
colaborador existe, entonces acumulamos el tiempo del
colaborador en ese programa, si no existe damos un
mensaje indicandolo.
3. Leemos el siguiente colaborador y tiempo.
g. Si se elige la opcin E, calculamos lo que cobra cada colaborador
por el total de minutos trabajados y lo que gasta en total la radio en
colaboradores:
i. Inicializamos a 0 lo que paga en total la radio.
ii. Recorremos secuencialmente todos los colaboradores,
1. Para cada colaborador recorremos todos los programas
acumulando en la variable min el tiempo que ha participado.
2. Cuando teminamos de recorrer todos los programas,
calculamos lo que gana en total el colaborador ganancia,
multiplicando los minutos por lo que cobra por minuto.
3. Acumulamos la ganancia del colaborador al total que paga la
radio.
h. Si se elige la opcin F, calculamos cul es el programa que mas ha
gastado en colaboradores:
i. Para calcular el gasto total por programa progGasto, recorremos
secuencialmente la matriz tiempo de la siguiente forma:
a. El bucle principal nos mueve por las filas que en este
caso son los programas.
b. Para cada programa inicializamos el vector progGasto a 0
y recorremos todo las columnas o colaboradores,
multiplicando el tiempo por lo que cobra el colaborador
colabMin y acumulando el resustado en el vector
progGasto.
ii. Buscamos el programa que mas ha gastado en el vector
progGasto.
i. Si se elige la opcin G, buscamos los programas en los que no ha
tomado parte ningn colaborador:
i. Inicializamos a 0 el contador de programas pCont, el los que no
ha participado ningn colaborador.
Euskadi Irratia 141
ii. Para cada programa contamos en cCont, cuntos colaboradores
han participado mas de 0 minutos .
iii. Si el contador cCont se queda a 0, indica que en este programa
no ha participado ningn colaborador, y por lo tanto mostramos
por pantalla el nombre del programa y lo contamos en pCont.
j. Si se elige la opcin H se da un mensaje de FIN y se termina el
programa.
k. Si la opcin elegida no es ninguna de las anteriores se indicar que la
opcin es erronea y se mostrar otra ves el menu .

142 Euskadi Irratia
CDIGO C
#include <st di o. h>
#include <st dl i b. h>
#define TopeCol ab 100
#define TopePr og 50
#define TopeLong 70
main (){
//Matriz que guarda los nombres de los diferentes programas
char nomPr og[ TopePr og] [ TopeLong] ;
//Matriz que guarda los nombres de los diferentes colaboradores
char nomCol ab[ TopeCol ab] [ TopeLong] ;
float pr ogGast o[ TopePr og] , col abMi n[ TopeCol ab] ;
int t i empo[ TopePr og] [ TopeCol ab] ;
int p, c, mi n, cont Pr og, cont Col ab, pmax, pCont , cCont ;
char opci on, nombr e[ TopeLong] ;
float t ot al Radi o, gananci a;
cont Col ab=0; //inicializamos el contador de colaboradores
do {
pr i nt f ( A) I nt r oduci r pr ogr amaci n. \ n) ;
pr i nt f ( B) Aadi r pr ogr ama. \ n) ;
pr i nt f ( D) Aadi r col abor ador es en l os di st i nt os pr ogr amas. \ n) ;
pr i nt f ( D)
pr i nt f ( H) Ter mi nar . \ n) ;
pr i nt f ( El i ge una opci n : ) ;
f f l ush( st di n) ;
scanf ( %c, &opci on) ;
switch( opci on) {
case A :
//Introducir nueva programacin.
//Inicializamos la matriz de tiempo a 0
for ( p=0; p< TopePr og ; p++)
{ for ( c=0; c< TopeCol ab; c++)
{ t i empo[ p] [ c] =0; }
{
//Inicializamos el contador de programas a 0
Euskadi Irratia 143
cont Pr og=0;
//Leer la nueva programacin
pr i nt f ( Dame l a l i st a de pr ogr amas de est a t empor ada.
( par a t emi nar t ecl ear Fi n) : \ n) ;
pr i nt f ( Pr ogr ama %d, cont Pr og) ;
f f l ush( st di n) ;
get s( nombr e) ;
while ( st r cmp( nombr e, Fi n) ! =0 && cont Pr og<TopePr og)
{ st r cpy( nomPr og[ cont Pr og] , nombr e) ;
cont Pr og=cont Pr og+1;
pr i nt f ( Pr ogr ama %d, cont Pr og) ;
f f l ush( st di n) ;
get s( nombr e) ;
}
br eak;
case B : //Aadir un programa nuevo
if ( cont Pr og== TopePr og)
{pr i nt f ( La l i st a de posi bl es pr ogr amas est l l ena, pngase
en cont act o con el ser vi ci o de i nf or mt i ca. ) ;
}
else
{ pr i nt f ( Pr ogr ama %d, cont Pr og) ;
f f l ush( st di n) ;
get s( nomPr og[ nombr e] ) ;
cont Pr og =cont Pr og+1;
}
br eak;
case C : // Aadir colaboradores
if ( cont Col ab == TopeCol ab)
{pr i nt f ( La l i st a de posi bl es pr ogr amas est l l ena,
pngase en cont act o con el ser vi ci o de i nf or mt i ca. ) ;
}
else
{pr i nt f ( Dame el col abor ador ( par a t emi nar t ecl ear Fi n) : ) ;
f f l ush( st di n) ;
get s( nombr e) ;
while ( st r cmp( nombr e, Fi n) ! =0 && cont Col ab<TopeCol ab)
144 Euskadi Irratia
{ st r cpy( nomCol ab[ cont Col ab] , nombr e) ;
pr i nt f ( Pr eci o mi nut o ( en eur os) : ) ;
scanf ( %f , &col abMi n[ cont Col ab] ) ;
cont Col ab=cont Col ab+1;
pr i nt f ( Dame el col abor ador ) ;
f f l ush( st di n) ;
get s( nombr e) ;
} // fin del while
} // fin del else
br eak;
case D : // Aadir colaboradores en los distintos programas
for ( p=0; p<cont Pr og ; p=p+1)
{ pr i nt f ( Pr ogr ama %s: \ n, nomPr og[ p] ) ;
pr i nt f ( \ t Dame col abor ador y t i empo ( en mi nut es) : ) ;
scanf ( %d %d, &c, &mi n) ;
while ( c! = - 1)
{ if ( c<cont Col ab)
{t i empo[ p] [ c] = t i empo[ p] [ c] +mi n; }
else
{ pr i nt f ( El col abor ador %d no esi st e , c) ; }
pr i nt f ( \ t Dame col abor ador y t i empo ( en mi nut es) : ) ;
scanf ( %d %d, &c, &mi n) ;
} // fin del while
} //fin del for
br eak;
case E : /* Calculamos lo que cobra cada colaborador por el
total de minutos trabajados y lo que gasta en total la
radio*/
totalRadio=0;
for ( c=0; c<cont Col ab; c=c+1)
{ mi n=0;
for ( p=0; p < cont Pr og; p=p+1)
{ mi n= mi n+t i empo[ p] [ c]
}
gananci a= mi n*col abMi n[ c] ;
Euskadi Irratia 145
t ot al Radi o=t ot al Radi o + gananci a;
if ( gananci a>0)
{ pr i nt f ( El col abor ador %s ha par t i ci pado %d mi nut os y
ha ganado %8. 2f eur os. \ n, nomCol ab[ c] , mi n, ganaci a) ;
} // fin del if
} // fin del for principal
pr i nt f ( Gast o t ot al del l os col abor ador es de Euskadi
r r adi a: %8. 2f eur os\ n. , t ot al Radi o) ;
br eak;
case F :
//Cal es el programa que ms ha gastado en colaboradores.
//Calculamos lo que ha gastado cada programa.
for ( p=0; p < cont Pr og; p=p+1)
{ pr ogGast o[ p] =0;
for ( c=0; c<cont Col ab; c=c+1)
{ pr ogGast o[ p] =pr ogGast o[ p] + t i empo[ p] [ c] *col abMi n[ c] ; }
}
/ / Buscamos el pr ogr ama que mas ha gast ado.
pmax=0;
for ( p=1; p < cont Pr og; p=p+1)
{ if ( pr ogGast o[ pmax] <pr ogGast o[ p] )
{ pmax=p; }
}
pr i nt f ( El pr ogr ama que mas ha gast ado en col abor ador es es
%s con %8. 2f eur os\ n, nomPr og[ pmax] , pr ogGast o[ pmax] ) ;
br eak;
case G :
/ * En qu pr ogr amas no ha t omado par t e ni ngn col abor ador y
cunt os son. */
pr i nt f ( Pr ogr amas en l os que no ha t omado par t e ni ngn
col abor ador : \ n) ;
pCont =0;
for ( p=0; p < cont Pr og; p=p+1)
{ cCont =0;
for ( c=0; c<cont Col ab; c=c+1)
146 Euskadi Irratia
{ i f ( t i empo[ p] [ c] >0)
{cCont =cCont +1; }
}
if ( cCont ==0)
{ pr i nt f ( %s \ n, nomPr og[ p] ) ;
pCont =pCont +1;
}
} // fin del for principal
pr i nt f ( Tot al de pr ogr amas %d, pCont ) ;
br eak;
case H : // fin de programa
pr i nt f ( FI N) ;
br eak;
default:
pr i nt f ( Opci n er r onea. \ n) ;
}
} while( opci on! = H ) ;
pr i nt f ( \ n\ n) ;
syst em( PAUSE) ;
}
147
SAN SEBASTIAN
El Ayuntamiento de San Sebastin nos ha pedido que le realicemos un
programa para conocer ciertos datos sobre la tamborrada infantil del da de
San Sebastin. Dicho programa pedir informacin sobre las diferentes
compaas existentes, ao de creacin y puesto en el que ha salido cada ao.
Todas las compaas a partir de su ao de creacin han salido todos los
aos.
Nos ha comunicado que actualmente participan 50 compaas en el desfile y
que tenemos los datos a partir del ao 1980 hasta el 2006.
Al inicio, el programa deber pedir los nombres y ao de creacin de las
distintas compaas, de la siguiente forma (en negrita los datos introducidos
por el usuario):

Introduccin de los datos de las diferentes compaas infantiles:
Nombre: Mundaiz
Ao: 1980
Nombre: Santo Tomas Lizeoa
Ao: 1984
...

Posteriormente nos pedir, para cada compaa, el puesto en el que ha
salido cada uno de los aos. Tened en cuenta que hay que pedir los datos de
cada compaa a partir de su ao de creacin (en negrita los datos
introducidos por el usuario):

Dame los puestos de la compaa Mundaiz:
Ao 1980: 3
Ao 1981: 7
...
Ao 2006: 1
Dame los puestos de la compaa Santo Tomas Lizeoa:
Ao 1984: 13
Ao 1985: 21
...
Ao 2006: 2
.............
El programa despus de realizar la lectura de datos le presentar al usuario
las siguientes opciones en un men, hasta que el usuario elija Salir. Si la
opcin dada por el usuario no es vlida el programa dar el siguiente
mensaje Opcin incorrecta y volver a presentar el men.
Este es el men que deber escribir el programa:
Men:
1.- Ver informacin
2.- Para los aos dados por el usuario calcular cuantas
compaas han salido en el desfile
148 San Sebastin
3.- Decir cuntas compaas han salido en ltimo lugar el ao de
su creacin
4.- Salir
Dame tu opcin: 2

Para cada opcin el programa calcular lo siguiente:
1. Ver informacin. Como se muestra en el ejemplo, se escribir en formato
tabla las compaas y los puestos en los que ha salido cada una de ellas.
Si una compaa no ha salido algn ao escribir un guin. Ejemplo:

1980 1981 1982 1983 1984 .... 2006
Mundaiz 3 7 1 3 5 .... 1
S.T. Lizeoa - - - - 13 .... 2
............

2. Para los aos dados por el usuario calcular cuantas compaas han salido en el
desfile. Al usuario se le pedir una secuencia de aos y para cada ao el
programa le dir cuntas compaas han desfilado. La secuencia de aos
terminar cuando el usuario teclee un 1 como ao. Ejemplo:

Para cada ao que me des te escribir las compaas que han
salido (para terminar teclea 1):
Dame ao: 1997
Las compaas que han salido son 23
Dame ao: 2001
Las compaas que han salido son 4
Dame ao: 1991
Las compaas que han salido son 16
Dame ao: -1

3. Decir cuntas compaas han salido en ltimo lugar el ao de su creacin. Es decir,
cuenta cuntas compaas han salido el ao de su creacin en el ltimo
puesto.

4. Salir. Terminar el programa

Nota:
Para relacionar un ao con la posicin que ocupa en el array, se puede restar al ao
correspondiente el ao inicial, Ej: 1991- 1980 = 11 en este ejemplo vemos que 1991
ocupara la posicin 11 y 1980 que es el primer ao ocupara la posicin 0.
San Sebastin 149
ANLISIS DEL PROBLEMA
Constantes del enunciado
1. TopeCompanas = 50. Nmero de compaias que participan en el desfile.
3. AnoInicio = 1980. Ao de inicio de la tamborrada infantil
4. UltimoAno = 2006. ltimo ao de la tamborrada infantil
5. TopeAnos = UltimoAno - AnoInicio +1
6. Tamano = 40. Mximo tamao del nombre de las compaas
Representacin de las variables necesarias para la entrada
7. Necesitaremos una matriz de caracteres donde se almacenarn los
nombres de las distintas compaas .
nombres 0 1 ... Tamano-1
0
1
...
TopeCompanias-
1


8. Necesitamos un vector donde se almacenarn los aos de creacin de
las distintas compaas.
0 1 ... TopeCompanias-1
anoCreacion

9. Necesitamos una matriz donde se almacenarn para cada compaa el
puesto en el que ha salido cada uno de los aos. Para relacionar un ao
con la posicin que ocupa en el array, restaremos al ao
correspondiente el ao inicial. Ej: 1991-1980 = 11, 1991 ocupara la
posicin 11.

puestos 0 1 ... TopeAnos-1
0
1
...
TopeCompanias-
1


Pasos a seguir en la resolucin del problema
1. Inicializar a 0 la matriz puestos
2. Leer datos:
a. Leer ao de comienzo y nombre de la compaa y guardarlos en los
vectores correspondientes: nombres y anoCreacion
150 San Sebastin
b. Leer los puestos en los que ha salido cada compaia desde su ao
de creacin y almacenarlos en la matriz puestos
3. Repetir
a. Escribir men
b. Elegir opcin
c. Segn la opcin elegida:
i. Ver informacin
(1) Escribir los aos (De inicio a fin)
(2) Por cada compaa
(a) Escribir el nombre de la compaia
(b) Por cada ao
(i) Leer de la matriz puestos el puesto en el que ha
salido cada ao, si en una posicin hay un 0 se
escribir un - .
ii. Para cada ao dado por el usuario calcular cuantas compaas
han salido en el desfile
(1) Leer ao (a)
(2) Mientras a es distinto de -1
(a) cont=0
(b) Leer la columna de ese ao
(i) Ver para cada compaa si tiene algn valor en ese
ao
(c) Escribir el valor de cont
(d) Leer ao (a)
iii. Calcular cuntas compaas han salido en ltimo lugar el ao de
su creacin
(1) ultimoPuesto=0
(2) Para cada compaa
(a) Obtener el ao de su creacin del vector anoCreacion
(b) Obtener la posicin del ao (columna) en la matriz a
travs de la frmula: ao inicio de la compaa-ao
inicial
(c) Calcular el elemento mayor de esa columna
San Sebastin 151
(d) Si la ltima compaa coincide coincide con la que
estamos tratando es que es la ltima en su ao de
creacin
(e) Sumamos 1 a ultimoPuesto
(3) Escribir el valor de ultimoPuesto
iv. Elegir opcin
v. Si la opcin no est entre 1 y 4 volver a escribir la opcin hasta
que la opcin sea 4.
152 San Sebastin
CDIGO C
#include <st dl i b. h>
#include <st di o. h>
#include <st r i ng. h>

#define AnoI ni ci o 1980
#define AnoFi n 2006
#define TopeCompani as 50
#define TopeAnos 27
#define Tamano 40

main(){
int puest os[ TopeCompani as] [ TopeAnos] ;
int anoCr eaci on[ TopeCompani as] ;
char nombr es[ TopeCompani as] [ Tamano] ;
int p, a, c, cont , opci on, puest oUl t i mo, cUl t i ma, ul t i maCom;

/ * I ni ci al i zamos a 0 l a mat r i z */
for ( c=0; c< TopeCompani as; c=c+1) {
for( a=0; a< TopeAnos; a=a+1) {
puest os[ c] [ a] =0;
}
}

/ * Leer ao de comi enzo y nombr e de l a compa a */
pr i nt f ( " I nt r oducci n de l os dat os de l as di f er ent es compa as
i nf ant i l es: \ n" ) ;
pr i nt f ( " : \ n" ) ;
for ( c=0; c< TopeCompani as; c=c+1) {
pr i nt f ( " Nombr e: " ) ;
f f l ush( st di n) ;
get s( nombr es[ c] ) ;
pr i nt f ( " Ao: " ) ;
scanf ( " %d" , &anoCr eaci on[ c] ) ;
}

San Sebastin 153
/ * Leer l os puest os en l os que ha sal i do cada compai a desde su
ao de cr eaci n*/
for ( c=0; c< TopeCompani as; c=c+1) {
pr i nt f ( " Dame l os puest os de l a compa a %s : \ n" , nombr es[ c] ) ;
for( a=anoCr eaci on[ c] ; a<=AnoFi n; a=a +1) {
pr i nt f ( " Ao %d: " , a) ;
scanf ( " %d" , &puest os[ c] [ a- AnoI ni ci o] ) ;
}
}

do {
/ * Escr i bi r men */
pr i nt f ( " Men: \ n" ) ;
pr i nt f ( " \ t 1. - Ver i nf or maci n \ n" ) ;
pr i nt f ( " \ t 2. - Par a l os aos dados por el usuar i o cal cul ar "
" cuant as compa as han sal i do en el desf i l e\ n" ) ;
pr i nt f ( " \ t 3. - Deci r cunt as compa as han sal i do en l t i mo"
" l ugar el ao de su cr eaci n\ n" ) ;
pr i nt f ( " \ t 4. - Sal i r \ n" ) ;
pr i nt f ( " \ nDame t u opci n: " ) ;
/ * El egi r opci n */
scanf ( " %d" , &opci on) ;
/ * Tr at ar opci n*/
switch ( opci on) {
case 1:
/ * Most r ar mat r i z en pant al l a */
/ * Escr i bi r aos */
pr i nt f ( " \ t \ t " ) ;
for ( a=AnoI ni ci o; a<=AnoFi n; a=a+1) {
pr i nt f ( " %d\ t " , a) ;
}
pr i nt f ( " \ n" ) ;
/ * Escr i bi r l os dat os de cada compai a*/
for ( c=0; c<TopeCompani as; c=c+1) {
pr i nt f ( " %- 30s" , nombr es[ c] ) ;
for( a=0; a<TopeAnos; a=a+1) {
if ( puest os[ c] [ a] ==0) {
154 San Sebastin
pr i nt f ( " - \ t " ) ;
}
else {
pr i nt f ( " %d\ t " , puest os[ c] [ a] ) ;
}
}
pr i nt f ( " \ n" ) ;
}
break;

case 2:
/ * Cal cul ar par a cada ao cuant as compai as han sal i do en
el desf i l e*/
pr i nt f ( " Par a cada ao que me des t e escr i bi r l as "
" compa as que han sal i do\ n" ) ;
pr i nt f ( " ( par a t er mi nar t ecl ea - 1) : \ n" ) ;
pr i nt f ( " Dame ao: " ) ;
scanf ( " %d" , &a) ;
while ( a ! = - 1) {
cont =0;
for ( c=0; c<TopeCompani as; c=c+1) {
if ( puest os[ c] [ a- AnoI ni ci o] ! =0) {
cont =cont +1;
}
}
pr i nt f ( " Las compa as que han sal i do son %d\ n\ n" , cont ) ;
pr i nt f ( " Dame ao: " ) ;
scanf ( " %d" , &a) ;
}
break;
case 3:
/ * Cal cul ar cuant as compa as han sal i do en l t i mo l ugar
en su ao de cr eaci n*/
puest oUl t i mo=0;
for ( cUl t i ma=0; cUl t i ma<TopeCompani as; cUl t i ma=cUl t i ma+1) {
a = anoCr eaci on [ cUl t i ma] - AnoI ni ci o;
ul t i maCom=0;
San Sebastin 155
for ( c=0; c<TopeCompani as; c=c+1) {
if ( puest os[ c] [ a] >puest os[ ul t i maCom] [ a] ) {
ul t i maCom= c;
}
}
if ( ul t i maCom== cUl t i ma) {
puest oUl t i mo = puest oUl t i mo +1;
}
}
pr i nt f ( " Nmer o de compa as que han sal i do en l t i mo "
" l ugar el ao de su cr eaci n t ot al %d da\ n" , puest oUl t i mo) ;
break;
case 4:
pr i nt f ( " \ n\ nTer mi nar el pr ogr ama . . . \ n\ n" ) ;
break;
default:
pr i nt f ( " \ n\ nEscr i be bi en l a opci n. \ n\ n" ) ;
}
} while ( opci on! =4) ;

pr i nt f ( " \ n\ n" ) ;
syst em( " PAUSE" ) ;
}

También podría gustarte