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;
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];
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; }
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;
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;
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:
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;
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; }
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.
// check for closed tour if ( numeroMovimiento == 64 ) for ( int m = 0; m <tamanio; ++m ) { filaPrueba = filaActual + vertical[ m ]; columnaPrueba = columnaActual + horizontal[ m ];
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; }
(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 ];
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;
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";