Está en la página 1de 21

EJERCICIOS PARES CAPITULO 7

7.6Complete las siguientes oraciones:



a) Los nombres de los cuatro elementos de un arreglo p (intp[4];) son: tipo, nombre, subndice
(tamao del arreglo)y los corchetes.
b) Al proceso de nombrar un arreglo, declarar su tipo y especificar el nmero de elementos se le
conoce comodeclaracin del arreglo.
c) Por convencin, el primer subndice en un arreglo bidimensional identifica la fila de un
elemento y el segundo ndice indica la columna del elemento.
d)Un arreglo de mpor n contiene m filas, n columnas y m*n elementos.
e) El nombre del elemento en la fila 3 y la columna 5 del arreglo d es: d[2][4]


7.8Escriba instrucciones en C++ que realicen cada una de las siguientes tareas:

a) Mostrar el valor del elemento 6 del arreglo de caracteres f.
char f[];
cout<<f[6]<<'\n';

b) Recibir un valor y colocarlo en el elemento 4 de un arreglo de punto flotante
unidimensional llamado b.
cin>> b[4]=x;

c) Inicializar con 8 cada uno de los 5 elementos del arreglo entero unidimensional g.
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
int g[5];
for(int i=0;i<5;i++)
g[i]=8;
cout<<"Elmento"<<setw(13)<<"Valor"<<endl;
for(int j=0;j<5;j++)
cout<<setw(7)<<j<<setw(13)<<g[j]<<endl;
return 0;
}

O tambin utilizando intg[5]={8,8,8,8,8};
d) Sumar el total e imprimir los elementos del arreglo c de un punto flotante con 100
elementos.
#include<iostream>
#include<iomanip>

using namespace std;
int main()
{
float c[100];
cout<<"Elmento"<<setw(10)<<"Valor"<<endl;
for(int i=0;i<100;i++)
c[i]=8;

int total=0;
for(int i=0;i<100;i++){
total+=c[i];
cout<<setw(4)<<i<<setw(10)<<c[i]<<endl;
}
cout<<"\nSuma total de elementos del arreglo: "<<total<<endl;

return 0;
}
e) Copiar el arreglo a en la primera parte del arreglo b. Suponga que se declara
doublea[11],b[34];
for ( int i = 0; i < 11; ++i )
b[ i ] = a[ i ];

f) Determinar e imprimir los valores menor y mayor contenidos en el arreglo w con 99
elementos de punto flotante.
/ asumiendo que todas las variables han sido declaradas e inicializadas
for ( int j = 0; j < 99; ++j )
if ( w[ j ] <menor )
menor = w[ j ];
else if ( w[ j ] >mayor )
mayor = w[ j ];


7.10

Utilice un arreglo unidimensional para resolver el siguiente problema. Una compaa paga a sus
vendedores por comisin. Los vendedores reciben $200 por semana ms 9% de sus ventas totales
de esa semana. Escriba un programa (utilizando un arreglo de contadores) que determine cuntos
vendedores recibieron salarios en cada uno de los siguientes rangos (suponga que el salario de
cada vendedor se trunca a una cantidad entera):

#include <iostream>
#include <iomanip>
using namespace std;

voidsalario(int[]);
void display(constint[]);

int main()
{
Int salarios[11]={0};

cout<<setiosflags(ios::fixed | ios::showpoint);
salario(salarios);
display(salarios);

return 0;
}

Void salario(intdinero[])
{
doubleventa,i=0.09;

cout<<"Ingresa la venta total del empleado en la semana(-1 para finalizar): ";cin>>venta;

while(venta!= -1) {
double sueldo=200+venta*i;
cout<<setprecision(2)<< "Comision del empleado: $"<<sueldo<<'\n';

int x=static_cast<int>(sueldo)/100;
++dinero[(x<10 ? x:10)];

cout<<"Ingrese la venta total del empleado en la semana(-1 para finalizar): ";
cin>>venta;
}
}

void display(constintdolares[])
{
cout<<"\nNumero de empleados en el rango:\n";
for(int i=2;i<10;++i )
cout<<"\n$"<<i<< "00-$" <<i<<"99 : "<<dolares[i];

cout<< "\n$1000 en adelante: " <<dolares[10]<<endl;
}


7.14 Encuentre los errores en las siguientes instrucciones:

a)
Asuma que:
charstr [5];
cin>>str;// el usuario escribe hola

Error: Longitud inadecuada. La cadena de entrada excede el rango de subndice vlido.

b)Asuma que:
int a[3];
cout<<a[1]<< <<a[2]<< <<a[3]<<endl;

Error: a[3] es la ubicacin del cuarto elemento, pero slo existen tres elementos; siendo a[2] la
ltima locacin vlida en la matriz.


c)
double f[3]={1.1,10.01,100.001,1000.001}

Error: Se ha proporcionado ms inicializadores (4) en la lista inicializadora que los elementos (3)
que contiene el arreglo. Slo uno, dos o tres valores pueden ser proporcionados en la lista de
inicializacin.

d) Asuma que:
double d[2][10];
d[1,9]=2.345;

Error: el subndice del arreglo se escribi en forma incorrecta.La sintaxis correcta es: d[1][9]=2.345
7.16 Etiquete los elementos del arreglo bidimensional ventas de 3 por 5, para indicar el orden en
el que se establecen en cero, mediante el siguiente fragmento de programa:

#include <iostream>
using namespace std;

int main()
{
Int fila;
intcolumna;
intventas[3][5];

for(intfila=0;fila<3;fila++){
for(int columna=0;columna<5;columna++){
ventas[fila][columna]=0;
cout<<"ventas["<<fila<<"]["<<columna<<"]="<<ventas[fila][columna]<<" ";}
cout<<endl;}
return 0;
}







7.18 Qu hace el siguiente programa?

#include<iostream>
using namespace std;

intqueEsEsto(int[],int);
int main()
{
constinttamanioArreglo=10;
int a[tamanioArreglo]={1,2,3,4,5,6,7,8,9,10};
int resultado=queEsEsto(a,tamanioArreglo);

cout<<"El resultado es "<<resultado<<endl;
return 0;
}

intqueEsEsto(int b[],inttamanio)
{
if (tamanio==1)
return b[0];
else
return b[tamanio-1]+queEsEsto(b,tamanio-1);
}



El programa suma 10 elementos, que en este caso son:1,2,3,4,5,6,7,8,9,10 entonces:



7.20(Sistema de reservaciones de una aerolnea) Una pequea aerolnea acaba de comprar una
computadora para su nuevo sistema de reservaciones automatizado. Se le ha pedido a usted que
desarrolle el nuevo sistema. Usted va a escribir una aplicacin para asignar asientos en cada vuelo
del nico avin de la aerolnea (capacidad: 10 asientos).
Su programa debe mostrar el siguiente men de alternativas: Por favor escriba 1 para Primera
clase y Por favor escriba 2 para Econmico. Si la persona escribe 1, su programa debe asignarle
un asiento en la seccin de primera clase (asientos 1 a 5). Si la persona escribe 2, su programa
debe asignarle un asiento en la seccin econmica (asientos 6 a 10). Su programa deber entonces
imprimir un pase de abordaje, indicando el nmero de asiento de la persona y si se encuentra en
la seccin de primera clase o econmica del avin.
Use un arreglo unidimensional para representar la tabla de asientos del avin. Inicialice todos los
elementos del arreglo con 0 para indicar que todos los asientos estn vacos. A medida que se
asigne cada asiento, establezca los elementos correspondientes del arreglo en 1 para indicar que
ese asiento ya no est disponible.
Desde luego que su programa nunca deber asignar un asiento que ya haya sido asignado. Cuando
est llena la seccin de primera clase, su programa deber preguntar a la persona si acepta ser
colocada en la seccin econmica (y viceversa). Si la persona acepta, haga la asignacin de asiento
apropiada. Si no acepta imprima el mensaje El prximo vuelo sale en 3 horas.



#include <iostream>
using namespace std;

#include <cctype>
int main()
{
constint asientos=11;
int avion[asientos]={0},personas=0,primeraClase=1,economico=6,eleccion;
char respuesta;
while (personas<10) {
cout<< "\nIngrese 1 para \"Primera Clase\"\n"<< "Ingrese 2 para \"Economico\"\n";
cin>>eleccion;
if (eleccion==2 ) {
if ( !avion[ economico ] &&economico<= 10 ) {
cout<<"Su numero de asiento es: "<<economico<< ' ';
avion[economico++ ] = 1;
++personas;
}
elseif ( economico> 10 &&primeraClase<= 5 ) {
cout<< "La seccionEconomicoesta lleno.\n"
<< "Le gustaria viajar en Primera Clase? (S o N) ";
cin>> respuesta;
if ( toupper(respuesta)=='S' ) {
cout<<"Su numero de asiento es: "<<primeraClase<< ' ';
avion[ primeraClase++ ] = 1;
++personas;
}
else
cout<<"El proximo vuelo sale en 3 horas.\n";
}
else
cout<<"El proximo vuelo sale en 3 horas.\n";
}
else {
if ( !avion[ primeraClase ] &&primeraClase<= 5 ) {
cout<<"Su numero de asiento es: "<<primeraClase<< '\n';
avion[ primeraClase++ ] = 1;
++personas;
}
elseif ( primeraClase> 5 &&economico<= 10 ) {
cout<< "La seccion Primera Clase esta llena.\n"
<< "Acepta viajar en la seccionEconomico? (S o N) ";
cin>> respuesta;
if ( toupper(respuesta) == 'S' ) {
cout<<"Su numero de asiento es: "<<economico<< '\n';
avion[ economico++ ] = 1;
++personas;
}
else
cout<<"\n\nElproximo vuelo sale en 3 horas.\n";
}
else
cout<<"\n\nElproximo vuelo sale en 3 horas.\n";
}
}
cout<< "\n\nTodos los asientos de este vuelo estan vendidos!" <<endl;

return 0;
}





7.22Use un arreglo bidimensional para resolver el siguiente problema: Una compaa tiene cuatro
vendedores (1 a 4) que venden cinco productos distintos (1 a 5). Una vez al da, cada vendedor
pasa una nota por cada tipo de producto vendido. Cada nota contiene lo siguiente:
a) El nmero del vendedor.
b) El nmero del producto.
c) El valor total en dlares de ese producto vendido en ese da.
As, cada vendedor pasa entre 0 y 5 notas de venta por da. Suponga que est disponible la
informacin sobre todas las notas del mes pasado. Escriba un programa que lea toda esta
informacin para las ventas del ltimo mes y que resuma las ventas totales por vendedor, por
producto. Todos los totales deben guardarse en el arreglo bidimensional ventas. Despus de
procesar toda la informacin del mes pasado, muestre los resultados en formato tabular, donde
cada columna represente a un vendedor especfico y cada fila represente a un producto. Saque el
total de cada fila para obtener las ventas totales de cada producto durante el ltimo mes. Saque
el total de cada columna para obtener las ventas totales por vendedor correspondiente al ltimo
mes. Su impresin tabular debe incluir estos totales cruzados a la derecha de las filas totalizadas, y
en la parte inferior de las columnas totalizadas.
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
constint PERSONAS= 5,PRODUCTOS = 6;
doubleventas[PERSONAS][PRODUCTOS ] = { 0.0 }, valor,totalVentas,
productoVentas[ PRODUCTOS ] = { 0.0 };
intvendedor,producto;

cout<<"Ingresa:\n\n#VENDEDOR (1-4) #PRODUCTO (1-5) $TOTAL VENDIDO de ese producto (-1
finaliza)\n";
cin>>vendedor;

while ( vendedor != -1 ) {
cin>> producto >> valor;
ventas[vendedor][ producto ] += valor;
cin>> vendedor;
}

cout<< "\n\nEl total vendido por cada vendedor esta al final de cada fila, y el total de\n"
<<"ventas para cada producto esta en la parte inferior de cada columna:\n\n"
<<setw(12)<<1<<setw(12)<< 2
<<setw(12)<<3<<setw(12)<<4<<setw(12)<<5<<setw(14)
<< "Total\n" <<setiosflags(ios::fixed | ios::showpoint );

for (int i = 1; i < PERSONAS; ++i ) {
totalVentas=0.0;
cout<<i;

for(int j=1; j<PRODUCTOS; ++j ) {
totalVentas += ventas[i][j];
cout<<setw( 12 ) <<setprecision( 2 ) <<ventas[ i ][ j ];
productoVentas[ j ] += ventas[i][j];
}

cout<<setw(12)<<setprecision(2)<<totalVentas<< '\n';
}

cout<< "\nTotal"<<setw(8)<<setprecision(2)<<productoVentas[1];

for(int j=2;j<PRODUCTOS; ++j)
cout<<setw(12)<<setprecision(2)<<productoVentas[j];
cout<<endl;

return 0;
}


7.24 Uno de los enigmas ms interesantes para los entusiastas del ajedrez es el problema del
Paseo del caballo. La pregunta es: Puede la pieza de ajedrez, conocida como caballo, moverse
alrededor de un tablero de ajedrez vaco y tocar cada una de las 64 posiciones una y slo una vez?
A continuacin estudiaremos detalladamente este intrigante problema.
El caballo realiza solamente movimientos en forma de L (dos espacios en una direccin y un
espacio en una direccin perpendicular). Por tanto desde una posicin cerca del centro de un
tablero de ajedrez vaco, el caballo puede hacer ocho movimientos distintos (numerados del 0 al
7).
a) Dibuje un tablero de ajedrez de 8 por 8 en una hoja de papel, e intente realizar un Paseo
del caballo en forma manual. Ponga un 1 en la posicin inicial, un 2 en la segunda posicin,
un 3 en la tercera, etc. Antes de empezar el paseo, estime qu tan lejos podr avanzar,
recordando que un paseo completo consta de 64 movimientos. Qu tan lejos
lleg?Estuvo esto cerca de su estimacin?
Haciendo el paseo slo se pudo llegar a hacer 47 movimientos, luego ya no haba lugar
donde pudiera moverse el caballo. Faltaron 16 movimientos.

b) Ahora desarrollaremos un programa para mover el caballo alrededor de un tablero de
ajedrez. El tablero estar representado por un tablero bidimensional llamado tablero, de
ocho por ocho. Cada posicin se inicializar con cero. Describiremos cada uno de los ocho
posibles movimientos en trminos de sus componentes horizontales y verticales. Por
ejemplo, un movimiento de tipo 0, consiste en mover dos posiciones horizontalmente a la
derecha y una posicin verticalmente hacia arriba. Un movimiento de tipo 2 consiste en
mover una posicin horizontalmente a la izquierda y dos posiciones verticalmente hacia
arriba. Los movimientos horizontal a la izquierda y vertical hacia arriba se indican con
nmeros negativos. Los ocho movimientos pueden describirse mediante dos arreglos
unidimensionales llamados horizontal y vertical, de la siguiente manera.
horizontal[0]=2 vertical[0]=-1
horizontal[1]= 1 vertical[0]=-2
horizontal[2]= -1 vertical[0]=-2
horizontal[3]= -2 vertical[0]=-1
horizontal[4]= -2 vertical[0]=1
horizontal[5]= -1 vertical[0]=2
horizontal[6]= 1 vertical[0]=2
horizontal[7]=2 vertical[0]=1

Haga que las variables filaActual y columnaActual indiquen la fila y columna,
respectivamente, de la posicin actual del caballo. Para hacer un movimiento de
tiponumeroMovimiento, donde numeroMovimiento puede estar entre 0 y 7, su programa debe
utilizar las instrucciones:
filaActual+=vertical[numeroMovimiento];
columnaActual+=horizontal[numeroMovimiento];
Utilice un contador que vare de 1 a 64. Registre la ltima cuenta en cada posicin a la que se
mueva el caballo. Evale cada movimiento potencial para ver si el caballo ya visit esa posicin y,
desde luego, pruebe cada movimiento potencial para asegurarse que el caballo no se salga del
tablero de ajedrez. Ahora escriba un programa para desplazar el caballo por el tablero.
Ejecute el programa. Cuantos movimientos hizo el caballo?

c) Despus de intentar escribir y ejecutar un programa de Paseo del Caballo, probablemente
haya desarrollado algunas ideas valiosas. Utilizaremos estas ideas para desarrollar una
heurstica (o estrategia) para mover el caballo. La heurstica no garantiza el xito, pero una
heurstica cuidadosamente desarrollada mejora considerablemente la probabilidad de
tener xito. Probablemente usted ya observ que las posiciones externas son ms difciles
que las posiciones cercanas al centro del tablero. De hecho las posiciones ms difciles o
inaccesibles son las cuatro esquinas.
La intuicin sugiere que usted debe intentar mover primero el caballo a las posiciones ms
problemticas y dejar pendientes aquellas a las que se ms fcil llegar, de manera que
cuando el tablero se congestione cerca del final del paseo, habr una mayor probabilidad
de xito.
Podramos desarrollar una heurstica de accesibilidad clasificando cada una de las
posiciones de acuerdo a qu tan accesibles son y luego mover siempre el caballo (usando
los movimientos en L del caballo) a la posicin ms inaccesible. Etiquetaremos un arreglo
bidimensional llamado accesibilidadcon nmeros que indiquen desde cuntas posiciones
es accesible una posicin determinada. En un tablero de ajedrez en blanco, cada una de
las 16 posiciones ms cercanas al centro se clasifican con 8; cada posicin en la esquina se
clasifica con 2; y las dems posiciones tienen nmeros de accesibilidad 3,4 o 6 de la
siguiente manera:

2 34 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 64
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

Escriba una nueva versin del Paseo del Caballo utilizando la heurstica de accesibilidad. El
caballo deber moverse siempre a la posicin con el nmero de accesibilidad ms bajo. En
caso de un empate, el caballo podr moverse a cualquiera de las posiciones empatadas.
Por tanto, el paseo puede empezar en cualquiera de las cuatro esquinas. [Nota: al ir
moviendo el caballo alrededor del tablero, su aplicacin deber reducir los nmeros de
accesibilidad a medida que se vayan ocupando ms posiciones. De esta manera y en
cualquier momento dado durante el paseo, el nmero de accesibilidad de cada una de las
posiciones disponibles seguir siendo igual al nmero preciso de posiciones desde las que
se puede llegar a esa posicin]. Ejecute esta versin de su programa Logr completar el
paseo? Ahora modifique el programa para realizar 64 paseos, donde cada uno empiece
desde una posicin distinta en el tablero. Cuntos paseos completos logro realizar?

#include<iostream>
#include<iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;

constinttamanio=8;

voidtableroLimpio( int [][tamanio] );
voidtableroImpreso( constint [][tamanio] );
boolmovValido( int, int, constint [][tamanio] );

intmain()
{
int tablero[tamanio][tamanio],filaActual,columnaActual,numeroMovimiento=0,
accesibilidad[tamanio][tamanio] =
{ 2, 3, 4, 4, 4, 4, 3, 2,
3, 4, 6, 6, 6, 6, 4, 3,
4, 6, 8, 8, 8, 8, 6, 4,
4, 6, 8, 8, 8, 8, 6, 4,
4, 6, 8, 8, 8, 8, 6, 4,
4, 6, 8, 8, 8, 8, 6, 4,
3, 4, 6, 6, 6, 6, 4, 3,
2, 3, 4, 4, 4, 4, 3, 2 },

filaPrueba,columnaPrueba,minFila,minColumna,minAccesibilidad=9,numeroAccesibilidad,
horizontal[tamanio] = { 2, 1, -1, -2, -2, -1, 1, 2 },
vertical[tamanio] = { -1, -2, -2, -1, 1, 2, 2, 1 };
bool done;

srand( time( 0 ) );

tableroLimpio( tablero );
filaActual = rand() % 8;
columnaActual = rand() % 8;
tablero[filaActual][columnaActual] = ++numeroMovimiento;
done = false;

while ( !done ) {
numeroAccesibilidad = minAccesibilidad;

for ( inttipoMov = 0;tipoMov<tamanio; ++tipoMov ) {
filaPrueba = filaActual + vertical[tipoMov];
columnaPrueba = columnaActual + horizontal[tipoMov];

if ( movValido( filaPrueba, columnaPrueba, tablero ) ) {
if ( accesibilidad[ filaPrueba ][ columnaPrueba ] <numeroAccesibilidad ) {
numeroAccesibilidad = accesibilidad[ filaPrueba ][ columnaPrueba ];
minFila = filaPrueba;
minColumna = columnaPrueba;
}

--accesibilidad[filaPrueba ][ columnaPrueba ];
}
}

if ( numeroAccesibilidad == minAccesibilidad )
done = true;
else {
filaActual = minFila;
columnaActual = minColumna;
tablero[filaActual][columnaActual] = ++numeroMovimiento;
}
}

cout<< "El caballo hizo "<<numeroMovimiento<< " movimientos.\n";

if(numeroMovimiento==64)
cout<< "Fue un paseo completo!!\n\n";
else
cout<< "No fue un paseo completo!\n\n";

cout<< "El tablero para esta prueba es:\n\n";
tableroImpreso( tablero );

return 0;
}

voidtableroLimpio( int TABLERO[][tamanio] )
{
for ( int fila = 0; fila <tamanio; ++fila )
for ( int col = 0; col <tamanio; ++col )
TABLERO[ fila ][ col ] = 0;
}

voidtableroImpreso( constint TABLERO[][tamanio] )
{
cout<< " 0 1 2 3 4 5 6 7\n";

for ( intfila = 0; fila<tamanio; ++fila ) {
cout<<fila;

for ( int col = 0; col <tamanio; ++col )
cout<<setw( 3 ) << TABLERO[ fila ][ col ];

cout<< '\n';
}

cout<<endl;
}

boolmovValido( int fila, int columna, constint TABLERO[][tamanio] )
{
return(fila>=0&&fila<tamanio&&columna>=0&&columna<tamanio&&TABLERO[fila][colu
mna]==0);
}



7.26


7.28
(Paseo del caballo: prueba del paseo cerrado) En el paseo del caballo se lleva a cabo un
paseo completo cuando el caballo hace 64 movimientos, en los que toca cada esquina del
tablero una sola vez. Un paseo cerrado ocurre cuando el movimiento 64 se encuentra a un
movimiento de distancia de la posicin en la que el caballo empez el paseo. Modifique el
programa del Paseo del caballo del 7.24 para probar si el paseoha sido completo, y si se
trat de un paseo cerrado.


#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;

constinttamanio = 8;

voidtableroLimpio( int [][ tamanio ] );
voidtableroImpreso( constint [][ tamanio ] );
boolmovValido( int, int, constint [][ tamanio ] );

intmain()

{
int tablero[ tamanio ][ tamanio ], primerMovFila, primerMovColumna,
accesibilidad[ tamanio][ tamanio ] = { 2, 3, 4, 4, 4, 4, 3, 2,
3, 4, 6, 6, 6, 6, 4, 3,
4, 6, 8, 8, 8, 8, 6, 4,
4, 6, 8, 8, 8, 8, 6, 4,
4, 6, 8, 8, 8, 8, 6, 4,
4, 6, 8, 8, 8, 8, 6, 4,
3, 4, 6, 6, 6, 6, 4, 3,
2, 3, 4, 4, 4, 4, 3, 2 },
filaActual, columnaActual, numeroMovimiento = 0, filaPrueba, columnaPrueba,
minFila, minColumna, minAccesibilidad = 9, numeroAccesibilidad,
horizontal[tamanio] = { 2, 1, -1, -2, -2, -1, 1, 2 },
vertical[tamanio] = { -1, -2, -2, -1, 1, 2, 2, 1 };
booldone,paseoCerrado= false;

srand( time( 0 ) );

tableroLimpio( tablero );
filaActual = rand() % tamanio;
columnaActual = rand() % tamanio;
primerMovFila = filaActual; // store first moves row
primerMovColumna = columnaActual; // storefirstmoves col

tablero[ filaActual ][ columnaActual ] = ++numeroMovimiento;
done = false;

while ( !done ) {
numeroAccesibilidad = minAccesibilidad;

for ( inttipoMov = 0;tipoMov<tamanio; ++tipoMov ) {
filaPrueba = filaActual + vertical[ tipoMov ];
columnaPrueba = columnaActual + horizontal[ tipoMov ];

if ( movValido( filaPrueba, columnaPrueba, tablero ) ) {
if ( accesibilidad[ filaPrueba ][ columnaPrueba ] <numeroAccesibilidad ) {
numeroAccesibilidad = accesibilidad[ filaPrueba ][ columnaPrueba ];
minFila = filaPrueba;
minColumna = columnaPrueba;
}

--accesibilidad[filaPrueba ][ columnaPrueba ];
}
}

if ( numeroAccesibilidad == minAccesibilidad )
done = true;
else {
filaActual = minFila;
columnaActual = minColumna;
tablero[filaActual ][ columnaActual ] = ++numeroMovimiento;

// check for closed tour
if ( numeroMovimiento == 64 )
for ( int m = 0; m <tamanio; ++m ) {
filaPrueba = filaActual + vertical[ m ];
columnaPrueba = columnaActual + horizontal[ m ];

if ( filaPrueba == primerMovFila&&columnaPrueba == primerMovColumna)
paseoCerrado = true;
}
}
}

cout<< "El paseo termino con " <<numeroMovimiento<< " movimientos.\n";

if ( numeroMovimiento == 64 &&paseoCerrado == true )
cout<< "Fue un paseo CERRADO!\n\n";
elseif ( numeroMovimiento == 64 )
cout<< "Fue un paseo COMPLETO, pero no cerrado!\n\n";
else
cout<< "No es un paseo.\n\n";

cout<< "El tablero para este paseo es:\n\n";
tableroImpreso( tablero );

return 0;
}

voidtableroLimpio( int TABLERO[][ tamanio ] )
{
for ( int fila = 0; fila <tamanio; ++fila )
for ( int col = 0; col <tamanio; ++col )
TABLERO[ fila ][ col ] = 0;
}

voidtableroImpreso( constint TABLERO[][ tamanio ] )
{
cout<< " 0 1 2 3 4 5 6 7\n";

for ( intfila = 0; fila<tamanio; ++fila ) {
cout<<fila;

for ( int col = 0; col <tamanio; ++col )
cout<<setw( 3 ) << TABLERO[ fila ][ col ];

cout<< '\n';
}

cout<<endl;
}

boolmovValido( int fila, intcolumn, constint TABLERO[][ tamanio ] )
{
return ( fila >= 0 && fila <tamanio&&column>= 0 &&column<tamanio
&&TABLERO[ fila ][ column ] == 0 );
}




7.30

(Ordenamiento de cubeta) Un ordenamiento de cubeta empieza con un arreglo
unidimensional de enteros positivos que se deben ordenar, y un arreglo bidimensional de
enteros, en el que las filas estn indexadas de 0 a 9 y las columnas de 0 a n-1, donde n es
el nmero de valores a ordenar. Cada fila del arreglo bidimensional se conoce como una
cubeta. Escriba una funcin llamada ordenamientoCubeta, que reciba un arreglo de
enteros y el tamao del arreglo como argumentos, y que adems opere de la siguiente
manera:
a) Coloque cada valor del arreglo unidimensional en la fila del arreglo de cubeta, con
base en el dgito de las unidades del valor. Por ejemplo el nmero 97 se coloca en la
fila 7, el 3 se coloca en la fila 3 y el 100 se coloca en la fila 0. A este procedimiento se
llama Pasada de distribucin.
b) Itere a travs del arreglo de cubeta fila por fila, y copie los valores de vuelta al arreglo
original. A este procedimiento se le llama Pasada de recopilacin. El nuevo orden de
los valores anteriores en el arreglo unidimensional es 100,3 y 97.
c) Repita este proceso para cada posicin de dgito subsiguiente (decenas, centenas,
miles, etc.)
En la segunda pasada se coloca al 100 en la fila 0, el 3 en la fila 0 y el 97 en la fila 9. Despus de la
pasada de recopilacin, el orden de los valores en el arreglo unidimensional es 100,3 y 97. En la
tercera pasada (digito de las centenas) el 100 se coloca en la fila 1, el 3 en la fila 0 y el 97 en la fila
0. Despus de esta ltima pasada de recopilacin, el arreglo original se encuentra en orden.
Observe que el arreglo bidimensional de cubetas es 10 veces el tamao del arreglo entero que se
est ordenando. Esta tcnica de ordenamiento proporciona un mejor rendimiento que el
ordenamiento por insercin, pero requiere mucha ms memoria. El ordenamiento por insercin
requiere espacio slo para un elemento adicional de datos. Este es un ejemplo de la concesin de
espacio y tiempo: el ordenamiento de cubeta utiliza ms memoria que el ordenamiento por
insercin, pero su rendimiento es mejor. Esta versin del ordenamiento de cubeta requiere copiar
todos los datos de vuelta al arreglo original en cada pasada. Otra posibilidad es crear un segundo
arreglo de cubeta bidimensional, e intercambiar en forma repetida los datos entre los dos arreglos
de cubeta.

#include <iostream>
#include <iomanip>
using namespace std;

constinttamanio = 15;

voidordenamientoCubeta( int [] );
voiddistribucionElementos( int [], int [][ tamanio ], int );
voidrecopilacionElementos( int [], int [][ tamanio ] );
intnumeroDeDigitos( int [], int );
voidcubetaCero( int [][ tamanio ] );

intmain()
{
int vector[ tamanio ] = {16,85,17,20,25,2,44,65,32,7,11,29,9,96,13};

cout<< "Elementos del arreglo en su orden original:\n\n";

for ( int i = 0; i <tamanio; ++i )
cout<<setw( 3 ) << vector[ i ];

cout<< '\n';
ordenamientoCubeta( vector );

cout<< "\nElementos del arreglo de forma ordenada:\n\n";

for ( int j = 0; j <tamanio; ++j )
cout<<setw( 3 ) << vector[ j ];

cout<<endl;

return 0;
}

voidordenamientoCubeta( int a[] )
{
intdigitosTotales,cubeta[ 10 ][ tamanio ] = { 0 };

digitosTotales = numeroDeDigitos( a, tamanio );

for ( int i = 1; i <= digitosTotales; ++i ) {
distribucionElementos( a, cubeta, i );
recopilacionElementos( a, cubeta );

if ( i != digitosTotales )
cubetaCero( cubeta );
}
}

intnumeroDeDigitos( int b[], inttamanioVector )
{
int mayor=b[0], digitos = 0;

for ( int i = 1; i <tamanioVector; ++i )
if ( b[ i ] > mayor )
mayor = b[ i ];

while ( mayor != 0 ) {
++digitos;
mayor /= 10;
}
returndigitos;
}

voiddistribucionElementos( int a[], int cubetas[][tamanio ], int digito )
{
int divisor = 10,numeroCubeta,numeroElemento;

for ( int i = 1; i <digito; ++i )
divisor *= 10;

for (int k = 0; k<tamanio; ++k ) {

numeroCubeta = ( a[ k ] % divisor - a[ k ] %
( divisor / 10 ) ) / ( divisor / 10 );

numeroElemento = ++cubetas[ numeroCubeta ][ 0 ];
cubetas[ numeroCubeta ][ numeroElemento ] = a[ k ];
}
}

voidrecopilacionElementos( int a[], int cubetas[][ tamanio ])
{
intsubindice = 0;

for ( int i = 0; i < 10; ++i )
for ( int j = 1; j <= cubetas[ i ][ 0 ]; ++j )
a[ subindice++ ] = cubetas[ i ][ j ];
}

voidcubetaCero( int cubetas[][ tamanio ] )
{
for ( int i = 0; i < 10; ++i )
for ( int j = 0; j <tamanio; ++j )
cubetas[ i ][ j ] = 0;
}
7.32
(Palndromos) Un palndromo es una cadena que se escribe de la misma forma tanto al
derecho como al revs. Algunos ejemplos de palndromos son radar, reconocer y (si se
ignoran los espacios) anita lava la tina. Escriba una funcin recursiva llamada
probarPalindromo, que devuelva true si la cadena almacenada en el arreglo es un
palndromo, y false en caso contrario. El mtodo debe ignorar espacios y puntuacin en la
cadena.


#include <iostream>
using namespace std;

boolprobarPalindromo(const char [],int,int);

int main()
{
constinttamanio = 80;
char c, cadena[tamanio], copia[ tamanio ];
int contador=0,copiaContador, i;

cout<< "Ingrese una oracion:\n";

while ( ( c = cin.get() ) != '\n' && contador <tamanio )
cadena[ contador++ ] = c;

cadena[ contador ] = '\0';

for ( copiaContador = 0, i = 0; cadena[ i ] != '\0'; ++i )
if ( cadena[ i ] != ' ' )
copia[ copiaContador++ ] = cadena[ i ];

if ( probarPalindromo( copia,0,copiaContador - 1 ) )
cout<< '\"' << cadena << "\" SI es un palindromo!" <<endl;
else
cout<< '\"' << cadena << "\" NO es un palindromo!" <<endl;

return 0;
}

boolprobarPalindromo( constchar arreglo[], int izquierda, int derecha )
{
if ( izquierda == derecha || izquierda>derecha )
return true;
elseif ( arreglo[izquierda] != arreglo[derecha] )
return false;
else
returnprobarPalindromo(arreglo,izquierda+1,derecha- 1 );
}
7.34





7.36
(Imprimir una cadena en forma inversa) Escriba una funcin recursiva llamada
cadenaInversa, que reciba un arreglo de caracteres que contengan una cadena y un
subndice inicial como argumentos. Imprima la cadena en forma inversa y no devuelva
nada. La funcin dejar de procesar y deber regresar al encontrar la cadena nula de
terminacin.


#include <iostream>
using namespace std;

voidcadenaInversa(const char []);

int main()
{
constinttamanio=30;
charcadenaArreglo[tamanio] = "Imprime esta oracion al reves";

for (int loop = 0;loop<tamanio;++loop )
cout<<cadenaArreglo[loop];
cout<<'\n';
cadenaInversa(cadenaArreglo );
cout<<endl;

return 0;
}

voidcadenaInversa(constcharcadenaArreglo[])
{
if (cadenaArreglo[0] == '\0' )
return;

cadenaInversa(&cadenaArreglo[1]);
cout<<cadenaArreglo[0];
}