Sie sind auf Seite 1von 47

PARTE I

1. Introduccin
No tiene ejercicios.
2. Conceptos bsicos
2.1) Quedara del siguiente modo:
,
hay otros tipos de comentarios como los de C++:
empezar un comentario tipo C y ahora lo acabo. */
/ * Que comentario ms precioso * /
/ / Este es ms precioso todava.
2.2) Si en un programa no ponemos la funcin main!, el programa no se podra enlazar. Si ponemos
dos funciones main! ocurre lo mismo, el compilador da un error de redefinicin de una funcin.
2.3) l programa puede parecer a primera !ista mu" sencillo. n primer lugar !amos a leer " escri#ir una
cadena. $a primera solucin intuiti!a:
"include #iostream$ // %&'()&: cin, cout
void main! *
char s+,-./ // Cadena de hasta 01 caracteres
cin $$ s/ // 2eer la primera palabra
cout ## endl ## s // Escribir en nueva lnea la cadena
## endl/ // 3 pasar a la lnea si4uiente
5
l pro#lema es %ue esto &nicamente nos lee la primera pala#ra de una cadena 'esto se e(plicar) en el captulo
de entrada*salida). +un%ue no se comprenda de momento, la solucin se encuentra en el fic,ero -.2/.3.011
2.2) +%u est) el programa:
"include #iostream$ // %&'()&: cin, cout
void main! *
double d0, d,/
out ## 67ntroduce dos reales: 6/
cin $$ d0 $$ d,/
cout ## 62a suma es: 6 ## d0 + d, ## endl
5
2.3) l programa correcto es 4ste:
"include #iostream.h$ // %&'()&: cout
void main! *
cout ## 68ola mundo6/
5
2.5) S es correcta.
2.6) ste comentario es errneo. 7emos dic,o %ue los comentarios no se detectan en las cadenas. 1ues no es
completamente cierto. No se detecta su apertura pero s su clausura. 1or ello, las sentencias se con!ertiran en:
6/
*/
$a solucin sera definir de nue!o las sentencias como:
/*
cout ## 6/* (e pillaste *66/6/ // Concatenaci9n de cadenas
*/
3. Tipos de datos
3.1) $a funcin es:
int Conviertechar c! *
return intc : ;-;!/
5
// %sando int! en vez de int! se ahorra un par de par<ntesis
3.2) S %ue es !)lido "a %ue en 088 todos los tipos integrales son compati#les. +un%ue sera muc,o mejor
e(plicitar las con!ersiones:
b= byte!>/
>= >ord!l/
d= d>ord!>/
3.3) Su longitud es 9 tomando sizeo?int! == ,.
3.2) $a primera dar) error "a %ue : no es un dgito octal " por tanto .: es un error. $a segunda dar) 22 por%ue
.12 est) en octal %ue es 12 en decimal.
4. Control de Flujo
2.1) l listado es funcionalmente correcto pero sint)cticamente no. ;altan los puntos " comas de las cuatro
sentencias de asignacin.
i? a # b!
i? a # c!
min= a/
else
min= c/
else
i? b $ c!
min= c/
else
min= b/
2.2) 1rograma %ue cuenta el n&mero de ocurrencias en una cadena de las 3 !ocales en 3 !aria#les diferentes:
a, e, i, o, u. <saremos la funcin $eer/0adena') del ejercicio 2.3. l programa est) en -.2/.2.011
2.3) <na funcin %ue calcule el =.0.>. de dos n&meros:
int (cdint a, int b! *
i? a #= - @@ b #= -!
return :0/ // C9di4o de error
>hile a A= b!
i? a # b!
b= b : a/
// b:= a/ // 74ual Bue la anterior. 3a se ver
else
a= a : b/
// a:= b/ // 74ual Bue la anterior
return a/ // 'l ?inal el mcd est en a y en b a == b!
5
<n ejemplo de uso de la funcin est) en -.2/.3.011
2.2) ;uncin %ue compara dos cadenas:
int &trCmpchar *s0, char *s,! *
int i= -/
>hile s0+i. @@ s,+i.! * // 8asta terminar las dos
i? s0+i. # s,+i.!
return :0/ // 2a cadena 0 es menor Bue la ,
else i? s0+i. $ s,+i.!
return 0/ // 2a cadena 0 es mayor Bue la ,
i++/
5
return -/ // 2as cadenas son i4uales
5
sta funcin es similar a strcmp') de la li#rera est)ndar #cstrin4$ del 088.
<n ejemplo de uso de la funcin est) en -.2/.2.011
2.3) Slo la #) es correcta. ?ecordemos %ue la sentencia:
?ora/ b/ c!/
se con!ierte en:
*
a/
>hileb! *
d/
c/
5
5
1or tanto, las sentencias anteriores son:
a! int i= -, int C= -/ // 7ncorrecto
// Dos declaraciones separadas por una coma
>hile ..
b! int i= -, C= -/ // Correcto
// Dos declaraciones de tipo entero
>hile ..
c! int i= -, lon4 C= -/ // 7ncorrecto
>hile ..
d! int i = -!, lon4 C = -! // 7ncorrecto
// 2stima porBue era una buena idea
2.5) $a solucin se encuentra en el fic,ero -.2/.5.011
2.6) n este ejercicio se ,a pretendido aumentar la atencin del lector en este error com&n " sutil pero difcil
de detectar. $a condicin del #ucle est) formada por el operador de asignacin '@) " no el operador de
comparacin '@@), con lo %ue el resultado del programa es %ue slo muestra un ., "a %ue el resultado de la
asignacin i@1., adem)s de asignar 1. a la !aria#le i, es %ue de!uel!e el !alor 1., %ue es un !alor cierto, al
ser no nulo. Si despu4s lo negamos con el operador A o#tenemos falso, con lo %ue el #ucle sale despu4s de la
primera iteracin.
2.:) $a solucin se encuentra en el fic,ero -.2/.:.011
2.9) $a solucin se encuentra en el fic,ero -.2/.9.011
2.1.) $a solucin se encuentra en el fic,ero -.2/1..011
2.11) $a solucin se encuentra en el fic,ero -.2/11.011
. !peradores
3.1) s simple:
E F E : 0!
3.3) Se supone %ue tenemos dos !alores enteros almacenados en dos !aria#les reales. Bo lo ,ara as:
?loat Gesto?loat a, ?loat b! *
return ?loatlon4!a H lon4!b!/
5
3.2) NC S DE$F>C 1C?Q< $ C1?+>C? 0C=+ NC S 1<> <GF$FH+? N S 1+?G >$
;C?. Si cogemos uno de los dos incementos " lo ponemos al final del #ucle s %ue funciona. n este caso
in!ierte el !ector de caracteres s 'no es una cadena por%ue no aca#a en ;I-;). l resultado en s ser)
+0+I+GC?.
3.3) 0on algo parecido a esto sera suficiente para %ue pareciera aleatorio. Si adem)s ,acemos coincidir la
llamada a Gand! con un factor e(terno 'tiempo, preferi#lemente), esta funcin es casi impredeci#le. l
programa se encuentra en -.3/.3.011
". Funciones
5.1) $a solucin se encuentra en el fic,ero -.5/.1.011
5.2) $a solucin se encuentra en el fic,ero -.5/.2.011
5.3) s sint)cticamente correcto. l compilador crea !aria#les temporales para almacenar estas constantes "
as "a puede tomar la direccin. >e todas formas no es un #uen estilo de programacin pasar constantes por
referencia por%ue aun%ue la funcin modifi%ue su !alor no nos podemos dar cuenta.
5.2) $a llamada ?,J! es am#igua. l compilador no sa#e si llamar a la funcin con un argumento o
llamar a la segunda usando par)metros por defecto. $a llamada ?0K, L,! es completamente
correcta "a %ue no ,a" am#igJedad.
5.3) S %ue es correcto " sera e%ui!alente a:
void ?int a= 0, int b= ,, int c= M! *
// ..
5
5.5) $a solucin se encuentra en el fic,ero -.5/.5.011
#. $ariables
6.1) $as !aria#les est)ticas se inicializan a .. $as !aria#les autom)ticas no. 1or tanto a !aldr) . " # tendr) un
!alor indefinido dependiendo del compilador. No se recomienda usar la declaracin de ;a; de ese modo.
s mejor e(plicitar:
int a= -/
6.2) ste sera un programa %ue !ol!era loco al propio Ijarne Stroustrup:
void Nuncion?loat ?!/ // Decl0. Campo prototipo
?loat ?/
// Decl ,. Campo 4lobal. &e almacena en el se4. de datos. ?
vale -
void Nuncion?loat ?! *
// Decl. ,. Campo local automtico. &e almacena en pila
?loat ?/
// Error: parmetros y var. locales tienen el mismo campo
auto ?loat a/ // Este auto es opcional
// Decl.M.Campo local automtico. &e almacena en pila. a vale
O
static ?loat ?/
// Error: mismo campo.
static ?loat s/
// Decl.L.Campo local esttico. &e almac. en el s. de datos.
s vale -
*
?loat ?/
// Decl. J. Campo de bloBue. &e almacena en la pila
?= ,/ // 'ccedo a la ;?; de la decl. J
::?= M/ // 'ccedo a la ;?; de la decl. 0
s= L/ // 'ccedo a la ;s; de la decl. L
a= J.J/ // 'ccedo a la ;a; de la decl. M
// Po hay ?orma de acceder al parmetro ;?; de la ?unci9n
Decl. ,!
5
5
?loat ?/ // ErrorA Gede?inimos la variable 4lobal.
6.3) 0omo ,emos !isto en el caso anterior, no es correcto "a %ue los dos tienen el mismo campo local
autom)tico.
6.2) >ar) un error en la definicin const int a "a %ue las constantes se de#en inicializar en el
momento de la definicin. $as otras dos tam#i4n daran error.
6.3) No sera e%ui!alente a:
const char * Qar/
sino a:
char * const Qar/
por%ue typede? no es una macro.
6.5) l programa + funciona correctamente. l programa I da error por%ue no sa#emos cmo es la estructura,
por tanto, no podemos definir una !aria#le de ella. l programa 0 funcionara si no se tratara de una
estructura. Ba se !io %ue eEtern slo es aplica#le a !aria#les de tipos no compuestos.
6.6) ste sera un programa %ue !ol!era loco al propio Ijarne Stroustrup:
void Nuncion?loat ?!/ // Decl0. Campo prototipo
?loat ?/
// Decl ,. Campo 4lobal. &e almacena en el se4. de datos. ?
vale -
void Nuncion?loat ?! *
// Decl. ,. Campo local automtico. &e almacena en pila
?loat ?/
// Error: parmetros y var. locales tienen el mismo campo
auto ?loat a/ // Este auto es opcional
// Decl.M.Campo local automtico. &e almacena en pila. a
vale O
static ?loat ?/
// Error: mismo campo.
static ?loat s/
// Decl.L.Campo local esttico.&e almac. en el s. de
datos. s vale -
*
?loat ?/
// Decl. J. Campo de bloBue. &e almacena en la pila
?= ,/ // 'ccedo a la ;?; de la decl. J
::?= M/ // 'ccedo a la ;?; de la decl. 0
s= L/ // 'ccedo a la ;s; de la decl. L
a= J.J/ // 'ccedo a la ;a; de la decl. M
// Po hay ?orma de acceder al parmetro ;?; de la ?unci9n
Decl. ,!
5
5
?loat ?/ // ErrorA Gede?inimos la variable 4lobal.
%. &obrecar'a ( con)ersiones
:.1) n 088, las constantes tienen tipo por lo %ue el compilador asignar):
K la primera es un int . 0oincidencia e(acta con Rrintint !.
K la segunda es un double. No ,a" coincidencia e(acta ni tri!ial. No ,a" promocin. 7a" con!ersin
est)ndar. 1ero las con!ersiones est)ndar de un tipo aritm4tico puede ser a cual%uier otro tipo aritm4tico. 1or
tanto, fallar) por%ue ,a" una am#igJedad. 1odramos ,a#erlo sol!entado poniendo 2.2;.
K la tercera es un char. No ,a" coincidencia e(acta ni tri!ial. 1ero ,a" promocin con intL por tanto,
se llama a Rrintint !.
n general, las posi#les soluciones a los pro#lemas %ue aparecen 'como el de la segunda llamada) son:
a) >eclarar !aria#les au(iliares del tipo %ue se desee.
#) ;orzar %ue las constantes sean del tipo re%uerido.
c) <tilizar con!ersiones e(plcitas 'cast)
:.2) S, no ,a" coincidencia e(acta o tri!ial, no ,a" promociones, pero ,a" con!ersin est)ndar aritm4tica.
1or tanto, se llama sin ning&n pro#lema.
:.3) No por%ue tomar) ?! como ?loat " no como una funcin. 0oncretamente, dar) un error de
llamada a noKfuncin 'Mcall of non-functionM) "a %ue estamos intentando llamar a un ?loat como si
fuera una funcin.
:.2) $a solucin se encuentra en el fic,ero -.:/.2.011
:.3) $a solucin se encuentra en el fic,ero -.:/.3.011
:.5) >ara error al ,a#er con!ersin tri!ial entre const S " S.
:.6) 0omo no ,a" con!ersin tri!ial, se podra definir perfectamente.
:.:) $as dos primeras llamadas in!ocan a sus funciones correspondientes sin ning&n pro#lema. $a tercera
sigue estos pasos: 1rimero: no ,a" coincidencia e(acta. Segundo: no ,a" promocin. Gercero: con!ersin
est)ndar, pero la ,a" a los dos, no le damos preferencia a la %ue no tiene signo. 1or tanto dara error de
am#igJedad.
:.9) $a solucin se encuentra en el fic,ero -.:/.9.011
:.1.) $a solucin se encuentra en el fic,ero -.:/1..011
:.11) Son correctas. Se trata de con!ersiones de lnea.
:.12) n 088, typede? no crea tipos nue!os distintos, slo les da un nom#re diferente.
:.13) 1ara las cinco llamadas, el proceso es #ien diferente:
1.K l literal -.- es un double. 1asos: 1rimero: coincidencia e(acta. 1or tanto se
llama a f'dou#le ).
2.K l literal - es un int. 1asos: 1rimero: no ,a" coincidencia e(acta. Segundo: no
,a" promocin posi#le. Gercero: ,a" con!ersin est)ndar de int a char "
de int a double. +dem)s, dijimos %ue la constante - tiene con!ersin est)ndar
con cual%uier puntero. 1or tanto ,a#r) error de am#igJedad al no poder elegir ninguna de
las tres funciones.
3.K l literal -N da error de sinta(is, "a %ue ; slo se puede aplicar a constantes reales.
2.K l literal -.-N es un ?loat. 1asos: 1rimero: no ,a" coincidencia e(acta.
Segundo: ,a" promocin de ?loat a double. 1or tanto se llama
a ?double !.
3.K l literal cadena es un char *. 1asos: 1rimero: no ,a" coincidencia e(acta.
Segundo: no ,a" promocin. Gercero: ,a" con!ersin est)ndar entre char
* " void *. 1or tanto se llama a ?void *!.

:.12) 1ara la primera com#inacin, la segunda llamda es correcta 'mismo tipo), pero la primera no, por%ue no
,a" con!ersin est)ndar desde int a enum. 0omo si est) permitido lo contrario, la com#inacin dos
es perfectamente correcta. $a com#inacin tercera tam#i4n lo es, llamando cada una a su correspondiente
funcin.
:.13) l compilador da un error de am#igJedad, "a %ue no sa#e si llamar a ???c! sin signo
o ???c! con signo. NQu4 complicados son los complicadoresA
*. Punteros
9.1) l primero carga en p la direccin de la !aria#le a p= Fa!, pero al cerrarse el #lo%ue la
!aria#le a se destru"e con lo %ue el acceso posterior de '*p= 0-) puede ser catastrfico.
l segundo programa, en cam#io, funciona correctamente "a %ue el car)cter a tratar se almacena en el 'heap' "
no en la pila, as al cerrar el #lo%ue no destruimos ninguna !aria#le "a %ue no ,emos definido ninguna
tampoco. l acceso '*p= 0-) ser) !)lido ,asta %ue pongamos 'delete p/).
<na mejor solucin sera:
void main! *
char *p/
int a/
*
p= Fa/
5
*p= 0-/
5
9.2) Fn!ierte una cadena. $a solucin se encuentra en el fic,ero -.9/.2.011
9.3) $a solucin se encuentra en el fic,ero -.9/.3.011
9.2) $a solucin se encuentra en el fic,ero -.9/.2.011
9.3) $a solucin se encuentra en el fic,ero -.9/.3.011
9.5) se programa es mu" peligroso. $eemos una cadena en s, pero s apunta a una direccin indefinidaL
por ello, podemos estar estropeando cdigo, datos de nuestro o de otro programa. +dem)s no se puede
asegurar %ue la salida sea igual %ue la entrada. n fin, %ue este es uno de los errores m)s gra!es " tpicos del
088. +dem)s, puede %ue en un primer momento funcione. =)s tarde el error aparecer) inesperadamente de
forma catastrfica. $a solucin es reser!ar la memoria %ue !amos a usar:
"include #iostream.h$
void main! *
char s+0--./
// &uponemos Bue con 0-- caracteres es su?iciente
cin $$ s/
cout ## s/
5
Gam#i4n podramos ,a#er usado:
"include #iostream.h$
void main! *
char *s/
s= ne> int+0--./
cin $$ s/
cout ## s/
delete +.s/
5
9.6) No ocurre nada, al final del programa el compilador se encarga de ,acer todos los delete %ue falten. >e
todas formas, es mu" recomenda#le no ol!idarse de ponerlo por%ue si es en una funcin %ue se llama 1...
!eces aca#aremos con el 'heap' llenoA. Gampoco es mu" recomenda#le ,acer lo %ue se ,a ,ec,o en el
ejercicio 1, pero a !eces como en ese ejercicio, es necesario.
9.:) 1ara ,acer lo %ue se nos pide en el ejercicio ,a#ra %ue ,acer uso de punteros:
?loat ?/
int *pi= int *!F?/
char *pc= char *!F?/
B con ?, *pi, *pc accederamos a lo mismo %ue con la unin: ?, i, c. 0laramente, usar una
unin annima es m)s limpio aun%ue con punteros se !e fsicamente %ue comparten la misma memoria. n
este caso, tra#ajar con punteros puede ser peligroso, "a %ue si tenemos:
char c/
int *pi= int *!Fc/
?loat *p?= ?loat *!Fc/
un acceso a *pi) a '*p?) e(cedera del tamaOo del car)cter, estropeando lo %ue ,a" despu4s en
memoria, %ue en este caso es el puntero %ue accede. +%u, se puede decir, %ue est) casi asegurado %ue el
sistema se %uede #lo%ueado o lo %ue en el argot se conoce como McolgadoM.
9.9) l programa compara los punteros, no donde apuntan. Si lo sustitu"4ramos por*s == *t)
tampoco "a %ue slo comparara el primer elemento. Queda como ejercicio ,acer una funcin %ue compare
cadenas. n el siguiente captulo tam#i4n se !er)n algunas funciones de comparacin.
9.1.) No es correcto por%ue ,emos definido p como un puntero a enteros constantes so#re los cuales nos
podemos ,acer un delete. +dem)s, delete p slo #orrara el primer elemento, en el caso de
%ue no fuera const.
9.11) $os dos son, o#!iamente, e%ui!alentes " ninguno de ellos da error. l puntero retornado en p es
indefinido " la direccin a la %ue apunte no est) reser!ada. No retorna P%22 como podramos imaginar en
un principio, del mismo modo %ue delete no modifica el puntero, sino simplemente li#era la memoria.
9.12) Fntentar #orrar slo una parte del !ector reser!ado es una #ar#aridad, no por%ue sea ilgico pensarlo,
sino por%ue el 088 no lo detecta como error " dependiendo de la implementacin, puede ser %ue no ocurra
nada o se con!ierta en un desastre. $o &nico %ue sa#emos con seguridad es %ue si ,acemos lo correcto, no
tendremos ning&n pro#lema.
1+. E,iciencia ( !pti-i.acin
1..1) $a solucin se encuentra en el fic,ero -1./.1.011
1..2) $a solucin se encuentra en el fic,ero -1./.2.011
1..3) Genemos un tipo reloC " tres funciones:
reloC &tartTSimer!/
// Crea un reloC y lo pone en marcha
double UetTSimerreloC F!/
// Getorna el tiempo en se4undos desde Bue se creo este reloC
double &topTSimerreloC F!/
// 74ual Bue UetTSimer! pero adems destruye el reloC
+dem)s se ,a implementado una funcin de retardo Delayunsi4ned lon4 ! %ue tarda
tantos milisegundos como se le pasen en su par)metro. +dem)s tenemos una
funcin Calibrarint ! para cali#rar durante unos segundos la funcin Delay!. l
listado de la implementacin es -1./.3.011
1..2) <sando las funciones necesarias del ejercicio anterior !eamos -1./.2.011. n muc,as m)%uinas
saldr) NactM! la m)s r)pida " Nact,! la m)s lenta, completamente al contrario de lo %ue
podramos pensar en un principio. sto depende de cmo est4n orientados los procesadores, si tienen
antememorias 'cachs), si son m)%uinas RISC o CISC, etc.
1..3) Se prue#a en el siguiente ejercicio.
1..5) $a solucin se encuentra en el fic,ero -1./.5.011
1..6) $a funcin al ser inline ,ara %ue cual%uier aparicin de aliasi! fuera e%ui!alente en
sentido " eficiencia a i.
1..:) $a solucin se encuentra en el fic,ero -1./.:.011
1..9) <na forma de implementar el algoritmo quicksort() est) en -1./.9.011
1..1.) $a multiplicacin por potencias de dos se puede realizar por medio de desplazamientos de #it.
jemplos para 2, 2 " : seran:
inline
int (ult,int a! *
return a ## 0/
5
inline
int (ultLint a! *
return a ## ,/
5
inline
int (ultVint a! *
return a ## M
5
%ue por las prue#as %ue se ,an realizado son ligeramente m)s r)pidas %ue la multiplicacin normal. sto
depende muc,o de la m)%uina.
$as funciones para la di!isiones son similares pero utilizando el operador PP.
1..11) Se tratara de lo siguiente:
inline
int (ultMint a! *
return (ult,a! + a/
5
inline
int (ultJint a! *
return (ultLa! + a/
5
inline
int (ultWint a! *
return (ultLa! + (ult,a!/
5
inline
int (ultKint a! *
return (ultW! + a/
5
inline
int (ult1int a! *
return (ultVa! + a/
5
Seg&n !amos aumentando iremos perdiendo en eficiencia. $a reutilizacin de unas funciones en otras no
ralentiza "a %ue son inline. n general:
int (ultint a, int b! *
int r= -/
>hile b! *
i? b @ 0! == b! // bit es 0
r+= a/
b $$= 0/
a ##= 0/
5
return r/
5
%ue "a no es eficiente.
sta solucin " medidas de tiempo se encuentran en el fic,ero -1./11.011
1..12) s correcto "a %ue en los macros los comentarios no son e(pandidos. sto se !er) mejor cuando se !ea
preprocesamiento.
1..13) l algoritmo se encuentra en -1./13.011.
1..12) $a solucin se encuentra en el fic,ero -1./12.011

PARTE II
11. Clases
11.1) +l ,acer delete this estamos li#erando la memoria %ue ocupa el o#jeto actual por lo %ue el
siguiente this= %ltimo "a no es !)lido por%ue el %ltimo puede ,a#er perdido su !alor.
1ara la gente %ue empieza puede %uedar m)s claro poniendo:
delete this/
this= this:$%ltimo/
%ue es lo mismo %ue antes pero a,ora se !e %ue el puntero this al %ue ,emos ,ec,o un delete, lo
utilizamos como fuente en la siguiente sentencia. 1or ello, se suele utilizar el puntero t,is para acceder a los
atri#utos de una clase cuando %ueda comprometida la claridad.
n segundo lugar como this es un puntero constante ni se puede ,acer un delete so#re 4l ni se puede
poner como destino en una asignacin.
11.2) l programa es completamente correcto. l primer o#jeto )bC0 llama al Ron de la
clase c0 con el par)metro 3. 1or tanto )bC0.Qalor se pone a 3. l segundo o#jeto )bC, llama
al Ron de la clase c, sin par)metros por lo %ue se toma el par)metro 1 por defecto %ue es lo %ue se
almacena en )bC,.Qalor. +l ,acer )bCM.Qalor= 0- no modificamos ning&n otro
o#jeto ni de c0 " muc,o menos de c, %ue no tiene nada %ue !er.
11.3) $as dos son inline.
11.3) $a solucin se encuentra en el fic,ero -11/.3.011
11.5) $a solucin se encuentra en el fic,ero -11/.5.011
11.6) $a solucin se encuentra en el fic,ero -11/.6.011
11.9) n primer lugar no funcionara por%ue ,emos definido los m4todos pri!ados. Sol!entando este
pro#lema no funcionara tampoco por%ue cuando se llama a una funcin inline de#e tener su implementacin
"a definida. n este caso la solucin sera cam#iar de orden ?0! " ?,!.
class clase *
..
public:
void ?0!/
void ?,!/
..
5/
inline void clase::?,! *
..
5
void clase::?0! *
..
?,!/
..
5
void main! *
clase o/
o.?0!/
5
<na curiosa solucin es poner las dos funciones inline, as las funciones no son e!aluadas ,asta %ue se
e(panden, %ue en este caso ocurrir) cuando lleguemos a main!, pasadas "a las definiciones
de ?0! " ?,!. Ctra solucin, e!identemente, es no definir ninguna inline.
11.1.) $a solucin se encuentra en el fic,ero -11/1..011
11.11) Si ,acemos la implementacin de los complejos en forma polar, no %uita para %ue definamos
e(actamente los mismos m4todos, incluso los constructores. 1or tanto, si slo !i4semos las declaraciones de
los m4todos, no podemos sa#er si est)n implementados en forma rectangular o en forma polar.
11.12) $a primera sentencia modifica el par)metro c0. $a segunda modifica el miem#ro c,. $a tercera
modifica la !aria#le glo#al cM. $a cuarta sentencia, modifica el miem#ro c1 al usar this. $a %uinta
sentencia tam#i4n al utilizar el operador de campo de clase.
11.13) No se puede. >e#eremos ,acer:
class clase *
static int Estatuto/
..
5/
int clase::Estatuto= ,M/
o definir un m4todo est)tico para acceder a Estatuto. >e todas formas la sentencia:
int clase::Estatuto/
se de#e seguir poniendo.
11.12) 1erfectamente. +un%ue no tiene muc,o sentido.
11.13) No podemos acceder a a por%ue ?! es una funcin est)tica " por tanto no tenemos el par)metro
implcito this para poder acceder a los miem#ros.
11.15) $a solucin se encuentra en el fic,ero -11/15.011
12. Creacin de objetos
12.1) $os m4todos son:
a! constructor normal
b! constructor por de?ecto
c! eEactamente i4ual a lo anterior
d! constructor copia
e! constructor por de?ecto todos los ar4umentos por de?ecto! y
constructor de conversi9n de int *! a c0
?! constructor de conversi9n de ?loat a cl si se toma el Xltimo
ar4umento por de?ecto, si no, constructor normal
4! operador suma
h! operador de conversi9n de cl a int. Po se pone retorno
i! operador de asi4naci9n
C! destructor
Y! ErrorA 2os destructores no tienen parmetros
12.2) No es correcta "a %ue puntoc.GE!, c.7(!! crea un o#jeto temporal en el cuerpo
de la funcin puntocompleCo c! " no modifica ;E; e ;y;. $a solucin sera:
class punto *
private:
double E, y/
public:
void Rondouble EE, double yy! *
E= EE/ y= yy/
5
puntodouble EE, double yy! *
RonEE, yy!/
5
puntoconst compleCo F c! *
Ronc.GE!, c.7(!!/
5
5/
12.3) Giene dos pro#lemas, el primero es %ue como no ,emos puesto ning&n modificador de acceso " se trata
de ;class;, el m4todo ?! ser) pri!ado con lo %ue no lo podremos llamar. n segundo lugar, no
podemos llamar a funciones no constantes desde o#jetos constantes. n este caso, esta &ltima restriccin es
una garanta de seguridad de %ue el o#jeto si es constante no !a a ser modificado.
12.2) >epender) del orden en %ue est)n definidos dentro de una clase. $o &nico %ue sa#emos con seguridad es
%ue E pasar) a !aler a antes de %ue ( pase a !aler b. sto es de#ido a %ue los dos se constru"en en la
lista de inicializacin, como ;E; si %ue est) en la lista se constru"e " toma su !alor a la !ez mientras
%ue ;y; tiene %ue esperar a !aler ;b; al cuerpo de la funcin.
12.3) 1ara la primera no, "a %ue al ,a#er otro constructor, "a no est) definido el constructor por defecto. n la
segunda s ser) posi#le 'en la !ersin 2.. no). $as dos &ltimas son perfectamente !)lidas.
12.5) Se crear) un o#jeto temporal por lo %ue el o#jeto constante no puede ser modificado por muc,a
referencia de %ue se trate.
12.:) Der -12/.:.011
12.1.) S se pueden definir miem#ros 'atri#utos " m4todos) volatile.
12.11) l operador sizeo? no puede so#recargarse.
12.12) n primer lugar, falta el punto " coma final de la clase. n segundo lugar, nunca de#eremos ,acer una
asignacin a this " muc,o menos un delete.
12.13) s correcto aun%ue es m)s recomenda#le definir la unin dentro de una clase.
12.12) Qenera am#igJedad. No sa#emos si llamar a
?')bCeto!!/
o a:
?)bCeto.operator ' !!/
12.13) No funcionara por%ue en 088 no se #uscan con!ersiones multini!el. B no ,a" ninguna con!ersin en
un solo paso para ,acer coincidir los par)metros.
12.15) +l llamarse a la funcin Nada') %ue parece %ue no ,ace nada, se crea un o#jeto temporal usando el
constructor copia. l constructor copia %ue tenemos definido slo copia los atri#utos. +l llegar al final del
cuerpo de la funcin 'en seguida por%ue no ,ace nada), se retornara llamando al destructor del o#jeto
temporal, %ue de la forma %ue tenemos definida la cadena ,ara un delete sL li#erando la memoria.
0uando ,ici4ramos cout ## c0L pro#a#lemente salga la cadena por pantalla, pero no se puede
asegurar, "a %ue ,emos li#erado la memoria %ue ocupa " puede ser utilizada por cual%uier otro. $o peor no es
esto, sino %ue al llegar al final de la funcin se destruira c0 !ol!iendo a llamar a delete s %ue "a
est) #orrado. sto lo suele a!isar el compilador por medio de un error al final del programa del tipo "Null
pointer assignment"
12.16) $a solucin se encuentra en el fic,ero -12/16.011
13. /erencia ( Poli-or,is-o
13.1) $a asignacin e) es incorrecta "a %ue no podemos asignar un clase deri!ada con una clase #ase. $a
asignacin f) nos muestra %ue esto es imposi#le incluso utilizando casts. $a asignacin ,) es incorrecta por el
mismo moti!o %ue la e). 1ero la i) es correcta por%ue siempre podemos pasar de un puntero de un tipo a un
puntero de otro tipo utilizando casts.
13.2) No, no tiene sentido ,eredar dos !eces "a se !irtual o no !irtual. Si se %uiere incluir dos !eces una clase
se ,ace precisamente eso, incluir 'composicin).
13.3) $a primera crea un o#jeto din)mico de la clase cuadrado " toma su direccin en c0 %ue es un puntero
a cuadrilatero. $a segunda sentencia es incorrecta "a %ue no se puede asignar un puntero a un
cuadrilatero a un puntero a un cuadrado. n el segundo lugar podramos usar un cast pero si los
m4todos no son !irtuales puede ser peligroso.
cuadrado *c,= cuadrado *!ne> cuadrilatero/
13.2) $a longitud es 2 8 2 8 2 @ 12 suponiendo 2 la longitud de int, 2 la longitud de float " 2 la longitud del
puntero a la ta#la de m4todos !irtuales 'suponiendo punteros de 32 #its).
13.3) $as funciones ?! dar)n error "a %ue tienen los mismos par)metros " distinto tipo de retorno. n
cam#io las funciones 4! son funciones totalmente diferentes "a %ue tienen par)metros distintos. 1or tanto
I ,eredar) 4int, double! " tendr) adem)s 4double, int!.
13.5) Son los dos !irtuales "a %ue si definimos un destructor como !irtual en una clase #ase, los destructores
en las clases ,eredadas tam#i4n ser)n !irtuales. n estos casos se recomienda poner la pala#ra !irtual para
dejarlo m)s claro. Se deja como ejercicio a!eriguar si teniendo dos clases + " I, una con destructor !irtual "
la otra normal, si ,eredamos las dos en una clase 0, Rel destructor de 0 ser) !irtualS
13.6) $a solucin se encuentra en el fic,ero -13/.6.011
14. Plantillas
12.1) S %ue podemos compilar ese programa, pero en el momento %ue usemos la funcin ?! dar) error.
$a solucin es simplemente #orrar la primera declaracin "a %ue la segunda la inclu"e.
12.2) 1or%ue el tipo + no est) incluido en los par)metros de la funcin. Ba sa#emos %ue el retorno no cuenta.
12.3) Der -12/.3.011. Se ,an definido algunos m4todos internos " otros e(ternos para mostrar el acceso a
!ector. Sera preferi#le todos e(ternos.
12.2) Que no se puede ,acer coincidir 'C *) con 'int). Si ,u#iera sido 'C) no ,a#ra pro#lema, 0
!aldra int.
12.3) $a solucin !ale para cual%uier tipo:
template #class S$
int &ize)?TEnZitsS v! *
return sizeo?S! * V/
//return sizeo? v * V/ // Sambi<n vlido
5
12.5) No, pero la solucin es simple:
typede? clase0#int$ clase0Tint/
clase, #clase0Tint$ a/
1. Errores ( E0cepciones
1". 1odularidad
15.1) 1or%ue "a !ienen pro!istas del m4todo de proteccin contra redefiniciones %ue ,emos e(plicado.
15.2) ;uncionara mu" mal "a %ue no ,emos definido el constructor copia " el operador de asignacin. +l
tratarse de una estructura din)mica, cada !ez %ue llamemos implcitamente al constructor copia 'por ejemplo
con o#jetos temporales), de#eramos copiar toda la estructura " slo copiamos la direccin. 1ero cuando
destruimos los o#jetos temporales, s %ue destruimos toda la estructura. n resumidas cuentas, %ue !amos a
destruir m)s !eces %ue a construir.
15.3) +%u !iene la solucin al ejercicio anterior. Se compone de tres
fic,eros E[0WT-M.8, E[0WT-M.80, E[0WT-M.8,. +dem)s tenemos un
fic,ero E[0WT-M.CRR %ue nos lo prue#a todo.
l fic,ero -15/.3.7 como !emos, %ueda limpio de toda implementacin. n primer lugar inclu"e
-15/.3.71 en la parte pri!ada de la clase " despu4s inclu"e fuera a E[0WT-M.8,. 0omo se o#ser!a
lo &nico %ue !e el usuario son los m4todos de la lista. No se puede sa#er si est) implementada din)mica o
est)ticamente, no se sa#e nada de sus miem#ros pri!ados, ni est)ticos, slo lo imprescindi#le %ue de#e
conocer el %ue usa esta clase. $a parte pri!ada de la clase 'los atri#utos) est) en el fic,ero E[0WT-M.80.
+%u se definen los miem#ros pri!ados. s de resaltar la presencia interna de nodo. Se podra ,a#er
definido como clase amiga de clista, pero como en este caso slo la utilizamos a%u, la incluimos
dentro del campo de la funcin. 1asemos a,ora a la implementacin de los m4todos. st)n en el
fic,ero E[0WT-M.8,.
l &ltimo m4todo '+lias) se suele incluir para ,acer referencias. sto sir!e para %ue tengamos !arias listas
operando so#re los mismos datos. sto suele ser peligroso por los o#jetos temporales " por%ue la destruccin
de uno implica %ue se ,a li#erado el espacio al %ue apuntan todos. 1or eso no lo !amos a usar. 1or &ltimo, ,a"
un fic,ero %ue lo prue#a todoL este fic,ero slo de#e incluir la especificacin. s el
fic,ero E[0WT-M.CRR.
0C=NG+?FCS: $os operadores de postincremento " postdecremento retornan por !alor. +s, operaciones
como la siguiente, estaran permitidas pero no funcionaran de manera correcta:
88l188L
Slo incrementara una !ez l1, el otro operador actuara so#re un o#jeto temporal retornado por el primero.
n resumen, este artificio de estructura modular es un poco largo de realizar " difcil de entender para el %ue
lo desarrolla. 1ero nadie puede dudar %ue el fic,ero E[0WT-M.8 est) claro como el agua.
15.3) S %ue compilara " enlazara. +l tener los dos el atri#uto const tienen acceso pri!ado al mdulo,
por lo %ue no son !isi#les e(ternamente " no ,a#ra conflicto entre ellas. >e todas formas, sera muc,o m)s
con!eniente, poner una sola declaracin en una ca#ecera e incluirla en los dos mdulos.


PARTE III
1#. Introduccin a las 2ibrer3as Estndar
No tiene ejercicios.
1%. Entrada ( salida
1:.1) $a solucin se encuentra en el fic,ero -1:/.1.011
1:.2) n cada caso saldra:
a! --0-M
b! 0- // Sodava no haba hecho e?ecto
c! a
1:.3) l programa de#e incluir algunos manipuladores " flags para %ue no se ignoren los caracteres #lancos.
"include #iostream.h$
"include #iomanip.h$
void main! *
cin $$ resetios?la4sios::sYip>s!/
>hile 0! *
char c/
cin $$ c/
i? Acin!
breaY/
cout ## c/
5
5
Gam#i4n se poda ,a#er ,ec,o as:
>hile 0! *
char c/
cin.4etc!/
i? cin.eo?!!
breaY/ // Nin copia
cout.putc!/
5
%ue no utiliza manipuladores.
1:.2) No "a %ue el set>0--! act&a so#re un stream 'cin) " el set>J! act&a so#re otro
'cout). +dem)s, la salida sera:
---W1
1:.3) No "a %ue "a est) so#recargado en #iostream.h$ en las
clases istream " ostream.
1:.5) Genemos a%u un programa %ue produce un !olcado ,e(adecimal de un fic,ero de entrada a otro de
salida. Si se omiten estos fic,eros se coger)n por defecto la entrada " salida por pantalla est)ndar.
Der -1:/.5.011
1:.6) $a solucin es:
int i= L,/
const char *?n= 6test.dat6
const int 2ar4o = K/
*
?stream ??n, ios::out @ ios::binary!/
?.seeYp2ar4o, ios::be4!/
?.>riteconst char *!Fi, ,!/
5 // 'l destruirse se cierra
*
?stream ??n, ios::in @ ios::binary!/
?.seeY42ar4o, ios::be4!/
?.readchar *!Fi, ,!/
5 // 'l destruirse se cierra
Gam#i4n podamos ,a#er llamado a los destructores e(plcitamente. Ba %ue estamos con la programacin
orientada a o#jetos, es m)s lgico utilizar constructores " destructores. 1rincipalmente, lo %ue no ,a" %ue
,acer es mezclar los dos m4todos.
1:.:) Simplemente ,a" %ue sa#er el cdigo del descriptor de la impresora '%ue suele ser 2). <tilizamos
entonces el constructor o?streamint ?h!:
?stream &treamTdeTlaTimpresoraL!/
Si %ueremos utilizar #uffer:
char *Zu??er= ne> char +0-,L./
o?stream &trTdeTlaTimprL, Zu??er, 0-,L!/
1:.9) $a funcin 2eerTCadena! la definimos as:
"include #iomanip.h$ // resetios?la4s
void 2eerTCadenachar *s! *
cin $$ resetios?la4sios::sYip>s!/
// Po pasar los caracteres blancos
?orint i= -/ cin $$ s+i./ i++! // 2eer hasta ;I-;
i? s+i. == ;In;! // &e ha pulsado 7PSG)
breaY/
s+i.= ;I-;/ // Roner caracter nulo de terminaci9n de cadena
5
n primer lugar ,acemos %ue no se %uiten los caracteres #lancos. $uego leemos ,asta encontrar uno de estos
dos caracteres TU.T, TUnT. Vste &ltimo se producir) cuando pulsemos la tecla de retorno. +l final de#eremos
poner el car)cter nulo "a %ue el stream no lo inserta.
1- Impresion de asteriscos
#include <iostream>
using namespace std;
void impresion(int);
int main(){
int p,n=0;
impresion(1);
for(p=1;p<=12;p++){
n+=2;
impresion(n);
}
system("pause" ;
r
rn 0;}void impres
n(int x){
ut<<endl;for(int i=
i<=x;i++)
o
<"*";}2- Num
s primos#include <
stream.h>bool
imo(int);
t main
{int
cin>>x;i
primo(x))cout<<"n
s pr
o";elsecout<<"n No
s primo";
e
n 0;}bool pr
o(int x){if(
=1||x==2)r
urn t
e;el
{int i;for(i=
i<x;i++){
f(x%i==0)re
r
f
se;}}r
u
true;}otro de num
primos#includ
iostream>using nam
ace std;
main(){unsigned int numero, n, p, nu
columnas;cout <<"Introduzca hasta que numero quier
llegar ";cin
> numero;cout <<'
<< endl;num_col
nas
0 ;
n=2;
while (n <= numero){
for ( p = 2; n % p!= 0; p++);
if ( p == n){
cout << n <<", ";
if(++num_columnas % 10 == 0)// controla el numero de elementos en una fila
cout <<"n" << endl;
}
n++;
}
cout <<"Fin de Programa. n" << endl;
system ("pause" ;
r
rn 0;}3- Numer
actorial#include <
stream.h>using nam
pace std;unsigned int fact
ial(int);int permut
ion(int);int combin
ion(int);
t main()
int x,
cin>>x;y=fa
orial(x);cout<<"n El factorial de "<<x<<
: "<<y;
e
rn 0;}unsigned int factor
(int n){if(
=0||n==1)
return 1;return n*fact
i
n-1);}int permutacion(int
, int r){return factorial(n)/fact
i
n-1);}int combinacion(int
, int r){return factorial(n)/(factorial(n-1)*fac
r
(r));}4
ibonacci#include
iostream>using nam
ace std;long fibona
(long);
t main(){l
g resu
;int i;for (i=0;
=10; i++)result = fi
nacci(i);cout <<
<< endl;
system ("pause" ;
r
rn 0;}long fibonac
long i){if(i == 0 || i == 1)
caso base
etur
i;elsereturn fibonacci(i-1)+fibo
c
i-2);}5- Productos p
o y cruz#include
iostream>using nam
ace std;v
d menu();void productoCruz(int [], int []
int,int);void productoPunto(int [], int [],
t, int);
t main(){int op, m, n, V1[100],
100], i
menu();
n >> op;s
tch (op
case 1:cout << "Ingrece tamao del primer vector: "
cin >> n;cout << "Ingrece componentes del
ctor: n";for (i=0;
<n; i++){cout << "A[" <<
<< "]= ";
i
> V1;}cout << "nnIngrece tamao del segundo vector: "
cin >> m;cout << "Ingrece componentes del
ctor: n";for (i=0;
<m; i++){cout << "A[" <<
<< "]= ";
i
>> V2;}productoCruz(V1,
, n, m
break
case 2:int i, V1[100], V2[
0], n, m;cout << "Ingrece tamao del primer vector: "
cin >> n;cout << "Ingrece componentes del
ctor: n";for (i=0;
<n; i++){cout << "A[" <<
<< "]= ";
cin >> V1;
}
cout << "nnIngrece tamao del segundo vector: "; cin >> m;
cout << "Ingrece componentes del vector: n";
for (i=0; i<m; i++){
cout << "A[" << i << "]= ";
cin >> V2;
}
productoPunto(V1, V2, n, m);
break;
default:
cout << "";
break;
}
system ("pause" ;
r
urn 0;}//*********************************************************************
*********v
d menu(){cout << " MENUnn1 producto cruz.n2 producto
u
o.nn";}//*********************************************************************
*********void productoCruz(int a[], int b[], int
, int d){int p
d, p, p1;
f (c==d){
f (c==3){prod = a[1]*b[2]
[1]*a[2];p = a[2]*b[0]
[2]*a[0];p1 = a[0]*b[1]
[1]*a[1];cout << "i " << prod << ",j " << p << ",k " <<

end
}elsecout << "Solo vector

R3n
}elsecout << "Solo vectores
g
lesn";}//********************************************************************
*********void productoPunto(int a[], int b[], int
, int d){int pu
o = 0, k;
f (c==d){for (k=0
k<c; k++)punto +=
[k]*b[k];cou
<
punt
}elsecout << "Tienen que ser vectores
g
esn";}6- Calificaciones
escuela#include
iostream>#includ
iomanip>using nam
pace std;#
ine N 10float promedio(i
[],int);int mayor(i
[],int);int menor(i
[],int);
main(){int X[N][N], F,C,i,j,suma=0,promedios[N], mayores[N],
ores[N];cout<<"Ingrese numero de est
iantes:

cin>>F;
cout<<"n Ingrese numero de calificaciones: ";
cin>>C;
for(i=0;i<F;i++){
cout<<"n Notas: ";
for(j=0;j<C;j++)
cin>>X[j];
}
cout<<"n Datos por Estudiante: ";
for(i=0;i<F;i++){
promedios=promedio(X,C);
mayores=mayor(X,C);
menores=menor(X,C);
cout<<"n Promedio: "<<promedio(X,C)
<<"n Menor calificacion: "<<menor(X,C)
<<"n Mayor calificacion: "<<mayor(X,C);
}
cout<<"nn DATOS GLOBALES: ";
cout<<"n Promedio global: "<<promedio( promedios, F);
cout<<"n Mayor global: "<<mayor( mayores, F );
cout<<"n Menor global: "<<menor( menores, F);
cout<<"n";
system ("pause" ;
r
rn 0;}float promedio(int
],int n){
suma=0;for(int i
;i<n;i++
uma+=A;return (flo
)
ma/n;}int mayor(int
],int n){int
mp=A[0];for(int i=
i<n;i++){
f(temp<

p=A;}r
u
temp;}int menor(int
],int n){int
mp=A[0];for(int i=
i<n;i++){
f(temp>

p=A;}r
u
temp;}7- La tortuga
la liebre
Este es uno de los que mas me costo hacer, espero
que le sirva a alguien
#include "iostream
#include "ctime
using namespace std
int main ()
int t=1, l=1, i, *tp = &t, *lp = &l
srand(time(0))
cout << "BANG!!!nY ARRANCAN!!!n"
if(*lp==*tp)
cout << "nnLa tortuga esta en la posicion "<< *tp
cout << "nLa liebre esta en la posicion "<< *lp
cout << "nOUCH!!!"

while (t < 70 && l < 70)
i = 1 + rand() % 10
if(i<=5)
*tp += 3
cout << "nnLa tortuga esta en la posicion "<< *tp
if (i<=2
cout << "nLa liebre esta en la posicion "<< *lp
if (i>2 && i <=4)
*lp += 9
cout << "nLa liebre esta en la posicion "<< *lp

if (i==5)
*lp -= 12
if(*lp < 1
*lp = 1
cout << "nLa liebre esta en la posicion "<< *lp
}//***
if(*lp==*tp
cout << "nOUCH!!!"

if (i>5 && i<=8)
*lp+=1
cout << "nnLa liebre esta en la posicion "<< *lp
if (i<=7)
*tp -= 6
if(*tp < 1
*tp = 1
cout << "nLa tortuga esta en la posicion "<< *tp
}//*****
if(*lp==*tp
cout << "nOUCH!!!"

if (i >= 8 && i <= 10)
*tp+=1
cout << "nnLa tortuga esta en la posicion "<< *tp
if (i>=9){
*lp -=2;
if(*lp < 1)
*lp = 1;
cout << "nLa liebre esta en la posicion "<< *lp;
}
if(*lp==*tp)
cout << "nOUCH!!!";
}
}
if (t>=70)
cout << "nnLA TORTUGA GANA!!! BRABO!!!n";
if (l>=70)
cout << "nnLa liebre gana. Ni hablar.n";
if (l>=70 && t>=70)
cout << "nnEs un empaten";
system("pause" ;
r

Das könnte Ihnen auch gefallen