You are on page 1of 23

Programa

i
on Orientada
a Objetos en C++
Arreglos

Amparo Lopez Gaona


Mexi o, D.F. Abril 1999
Programa ion Orientada a Objetos en C++ Arreglos

Datos ompuestos o derivados

Arreglos. Permiten agrupar datos de un mismo tipo en una unidad on eptual.


Un arreglo es una ole ion indexada de datos del mismo tipo.
De lara ion. tipo nombre variable[tama~no℄
Ejemplos:
int numeros[2℄; // Dos enteros
har letras[5℄; // 5 ara teres
fra ra ionales[8℄; // 8 fra iones

numeros
0 1

letras
0 1 2 3 4

racionales

0 1 2 3 4 5 6 7

Amparo Lopez Gaona, 2000 Transparen ia No. 1


Programa ion Orientada a Objetos en C++ Arreglos

De ni ion int numeros[2℄ = {30,85};


har letras[5℄ = {'M','a','r','i','a'};
har nombre[6℄ = "Maria";
fra ion ra ionales[8℄; // 8 fra iones
numeros 30 85
0 1

letras Ma r i a
0 1 2 3 4

nombre Ma r i a \0
0 1 2 3 4 5

racionales

0 1 2 3 4 5 6 7

Amparo Lopez Gaona, 2000 Transparen ia No. 2


Programa ion Orientada a Objetos en C++ Arreglos

Uso. Si el arreglo se de nio omo tipo nombre variable[tama~no℄, para a eder al


elemento en la posi ion i se ha e nombre variable[i℄.
 En este momento es omo ualquier otra variable entera y puede em-
plearse en ualquier lugar que esta.
 Para el ndi e puede emplearse ualquier expresi
on que devuelva entero.
 El ompilador no veri a los ndi es:
in >> i;
out << "El elemento " << i << " tiene valor " << numero[i℄ << endl;
Mejor poner una ondi ional antes:
if ((0 <= i) && ( i <= n)) ...
 El for esta ntimamente ligado a los arreglos
mayor = A[0℄;
for (i = 1; i < n; i++)
if (A[i℄ > mayor)
mayor = A[i℄;

Amparo Lopez Gaona, 2000 Transparen ia No. 3


Programa ion Orientada a Objetos en C++ Arreglos

Ejemplos
 Leer 25 numeros e imprimir los que aparez an mas de una vez.
for (i = 1; i < 24; i++) {
x = A[i℄;
for (j = i+ 1; j < 25; j++)
if (x == A[j℄)
repetido = 1;
if (repetido) {
out << x;
repetido = 0;
}
}

 Bus ar el primer ero en un arreglo A de 10 enteros


int i = 0;
while (( i < 10) && ( A[i℄ != 0)) i++;
if (i == 10)
out << "No hay eros en el arreglo ";
else
out << "El primer ero esta en la posi ion " << i;

Amparo Lopez Gaona, 2000 Transparen ia No. 4


Programa ion Orientada a Objetos en C++ Arreglos

Restri iones
 No pueden ser devueltos omo resultado de una fun ion.
 La asigna ion entre arreglos no esta permitida, debe ha erse elemento por
elemento.
typedef int Nums[4℄;
void Muestra (Nums x) { //Bien
out << x[0℄ << '\t' << x[1℄ << '\t' << x[2℄ << '\t' << x[3℄ << endl;
}
Nums AsignaCero() { //Mal
Nums r;
r[0℄ = r[1℄ = r[2℄ = r[3℄ = 0;
return r;
}
void main () {
int a[5℄ = {23, 45, -45, 87, 9};
int b[5℄;
b = a;
Muestra (a);
}

Amparo Lopez Gaona, 2000 Transparen ia No. 5


Programa ion Orientada a Objetos en C++ Arreglos

Arreglos de ara teres ( adenas)

No hay un tipo prede nido para ellas.


Una adena es un arreglo de ara teres que termina on un ara ter espe ial,
denominado nulo y es rito omo 0n00.
 Asigna ion.
{ En la de lara ion. ( har s[℄ = "Hola"; )
{ Leyendo la adena:
 in >> s;
 int getline( har s[℄ adena, int limite);
{ Copiando una adena en otra: void str py(str1, str2)
 Compara ion de adenas: int str mp(str1, str2)
 Longitud de una adena: int strlen(str)

Amparo Lopez Gaona, 2000 Transparen ia No. 6


Programa ion Orientada a Objetos en C++ Arreglos

Arreglos de objetos

fra ion ra ionales[3℄;

es equivalente a

fra ion ra ionales[3℄ = {fra ion(), fra ion(), fra ion()};

Es de ir, impl itamente se llama al onstru tor que no tiene parametros. Sin
embargo, podramos llamar a otro onstru tor. Por ejemplo:

fra ion ra ionales[3℄ = {fra ion(),


fra ion(2,3),
fra ion(4)};

Amparo Lopez Gaona, 2000 Transparen ia No. 7


Programa ion Orientada a Objetos en C++ Arreglos

Ejemplo

De ni ion Programa que juegue bla kja k (\21") ontra el usuario. La maquina
es el repartidor. El objeto del juego es onseguir que el valor de las artas
sume 21 o lo mas er ano a 21. En este aso el as vale 11, y las guras 10.
El juego empieza repartiendo dos artas a ada jugador in luyendo la asa.
Siempre debe haber una arta \tapada".
El jugador va a eptando artas hasta a er arse e in luso tener 21 puntos.
Despues la asa toma artas (una a la vez) hasta tener al menos 17 puntos.
Si el jugador tiene mas puntos que la asa sin pasarse de 21 puntos gana.

Amparo Lopez Gaona, 2000 Transparen ia No. 8


Programa ion Orientada a Objetos en C++ Arreglos

Dise~no
 Identi a ion de lases.
{ Cartas. Des ritas por un valor y un palo.
{ Baraja. Un onjunto de artas. Capaz de ini ializarse en orden (jugar on
baraja nueva).
{ Jugador. Con una mano. Capaz de ini ializarse, mostrar y evaluar su
mano.
{ Repartidor. Controla la a ion del juego. Tiene memoria del estado del
juego, ademas es tambien un jugador. Sus responsabilidades son: revolver
la baraja, repartir artas, determinar el ganador de ada mano, pagar o
obrar, darse uenta que se a abo la baraja, jugar.

Amparo Lopez Gaona, 2000 Transparen ia No. 9


Programa ion Orientada a Objetos en C++ Arreglos

Implementa ion
De lara ion .
 De lara ion de las artas:
enum Palo {treboles, diamantes, orazones, pi as};

lass Carta{
publi :
void Muestra();
int ObtenValor();
void PonValor(int);
Palo ObtenPalo();
void PonPalo(Palo);

private:
Palo p;
int valor;
};

Amparo Lopez Gaona, 2000 Transparen ia No. 10


Programa ion Orientada a Objetos en C++ Arreglos

 De lara ion de la baraja omo 52 artas


lass Baraja {
friend lass Repartidor; // Debido a que el Repartidor tiene ontrol omple

publi :
Baraja();

private:
int artaEn ima;
Carta artas[52℄;
};

Amparo Lopez Gaona, 2000 Transparen ia No. 11


Programa ion Orientada a Objetos en C++ Arreglos

 De lara ion de la lase jugador


lass Jugador {
friend lass Repartidor;

publi :
Jugador();

private:
Carta mano[5℄;
int dinero;
int numCartas;
int ValorMano();
void MuestraMano();
};

Amparo Lopez Gaona, 2000 Transparen ia No. 12


Programa ion Orientada a Objetos en C++ Arreglos

 De lara ion de la lase Repartidor


lass Repartidor {
publi :
Repartidor();
void Juega();
void DeterminaResultados();
private:
Jugador jugadorx;
Baraja barajita;
Carta mano[5℄;
int numCartas;
int ValorMano(int);
void MuestraMano(int);
void Revuelve();
void ReparteMano();
void Ini iaMano();
void DaUnaCartaAlJugador();
void DaUnaCartaAlRepartidor();
void DaCartasAlJugador();
void DaCartasAlRepartidor();
void DeterminaLaMejorMano();
int FinDeBaraja(); };

Amparo Lopez Gaona, 2000 Transparen ia No. 13


Programa ion Orientada a Objetos en C++ Arreglos

De ni ion void Carta::Muestra() {


int v = ObtenValor();
if ((2 <= v) && (v <= 10))
out << v;
else {
swit h (v) {
ase 1: out << 'A'; break;
ase 11: out << 'J'; break;
ase 12: out << 'Q'; break;
ase 13: out << 'K'; break;
}
}

swit h (ObtenPalo()) {
ase treboles: out << " de treboles"; break;
ase diamantes: out << " de diamantes"; break;
ase orazones: out << " de orazones"; break;
ase pi as: out << " de pi as"; break;
};
out << '\n';
}

Amparo Lopez Gaona, 2000 Transparen ia No. 14


Programa ion Orientada a Objetos en C++ Arreglos

Constru tor para ini ializar una nueva baraja de 52 artas


Baraja::Baraja() {
artaEn ima = 0;

for (int i = 0; i < 52; i++) {


artas[i℄.PonValor((i % 13) + 1);
swit h (i / 13) {
ase 0: artas[i℄.PonPalo(treboles); break;
ase 1: artas[i℄.PonPalo(diamantes); break;
ase 2: artas[i℄.PonPalo( orazones); break;
ase 3: artas[i℄.PonPalo(pi as); break;
}
}
}

Amparo Lopez Gaona, 2000 Transparen ia No. 15


Programa ion Orientada a Objetos en C++ Arreglos

Jugador::Jugador() {
dinero = 10;
numCartas = 0;
}

int Jugador::ValorMano() {
int v;
int total = 0;
for (int i = 0; i < numCartas; i++) {
v = mano[i℄.ObtenValor();
if ( v == 1)
total += 11;
else if (v <= 10)
total += v;
else // if (v <= 13)
total += 10;
}
return (total);
}

Amparo Lopez Gaona, 2000 Transparen ia No. 16


Programa ion Orientada a Objetos en C++ Arreglos

Repartidor::Repartidor() {
Revuelve();
numCartas = 0;
}

void Repartidor::Juega() {
out << "\n\nJugando....\n\n";
do
{
ReparteMano();
DeterminaLaMejorMano();
}
while (!FinDeBaraja());
}

Amparo Lopez Gaona, 2000 Transparen ia No. 17


Programa ion Orientada a Objetos en C++ Arreglos

void Repartidor::Revuelve() {
int r;
Carta ;
unsigned int seed = unsigned( lo k()); //Fun ion dependiente del ompilado

srand(seed);
for (int i = 0; i < 3; i++) { // Revuelve 3 ve es
for (int j = 0; j < 52; j++) {
r = rand() % 52;
= barajita. artas[j℄;
barajita. artas[j℄ = barajita. artas[r℄;
barajita. artas[r℄ = ;
}
}
barajita. artaEn ima = 0;
}

void Repartidor::ReparteMano() {
Ini iaMano();
DaCartasAlJugador();
DaCartasAlRepartidor();
}

Amparo Lopez Gaona, 2000 Transparen ia No. 18


Programa ion Orientada a Objetos en C++ Arreglos

void Repartidor::Ini iaMano() { // Da 2 artas a ada jugador y a si mismo


jugadorx.numCartas = 0;
numCartas = 0;
DaUnaCartaAlJugador();
DaUnaCartaAlRepartidor();
DaUnaCartaAlJugador();
DaUnaCartaAlRepartidor();
jugadorx.MuestraMano(); // Muestra las artas del jugador
MuestraMano(1); // Muestra una arta del Repartidor
}

Amparo Lopez Gaona, 2000 Transparen ia No. 19


Programa ion Orientada a Objetos en C++ Arreglos

void Repartidor::DaCartasAlJugador() {
har ans;
do
{
out << "\nQuieres otra arta? (S/N) ";
in >> ans;
ans = toupper(ans);
if (ans == 'S') {
DaUnaCartaAlJugador();
jugadorx.MuestraMano();
}
} while ((ans == 'S') && (jugadorx.ValorMano() < 21)
&& (jugadorx.numCartas <= 5));
}

Amparo Lopez Gaona, 2000 Transparen ia No. 20


Programa ion Orientada a Objetos en C++ Arreglos

void Repartidor::DeterminaLaMejorMano() {
int pVal = jugadorx.ValorMano();
int dVal = ValorMano(0);

if (((pVal > 21) && (dVal > 21)) || (pVal == dVal))


out << "Empate \n";
else if (((pVal <= 21) && (pVal > dVal)) || (dVal > 21)) {
out << "Jugador #1 gano\n";
jugadorx.dinero++;
}
else if (((dVal <= 21) && (dVal > pVal)) || (pVal > 21)) {
out << "Computadora gano\n";
jugadorx.dinero--;
};
}

Amparo Lopez Gaona, 2000 Transparen ia No. 21


Programa ion Orientada a Objetos en C++ Arreglos

Uso void main() {


Repartidor asa;

asa.Juega();
asa.DeterminaResultados();
}

Amparo Lopez Gaona, 2000 Transparen ia No. 22

You might also like