Clases Iniciales para Concurso - 240923 - 091614

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 90

────────────────────────────────────────────────────────

_/_/_/ _/_/_/
_/ _/
_/_/ _/
_/ _/ IPVCE "Ernesto Guevara"
_/_/_/ _/_/_/ Concurso Central de Computación 2014 - 2015
────────────────────────────────────────────────────────

Fundamentos de la Programación
en C/C++
para Concursantes de Computación
(Actualizado: Lunes 26 de Agosto del 2014)

Frank Hernández González

Concurso de Computación “IPVCE Ernesto Guevara”


Temas para el entrenamiento.

1. Introducción a la programación en C/C++.


1.1. Estructura de un programa.
1.1.1. Entrada y Salida.
1.1.2. Uso de bibliotecas.
1.1.3. Función principal.
1.2. Operadores Aritméticos.
1.3. Sentencia de asignación.
1.4. Funciones Matemáticas.

2. Diseño de algoritmos utilizando condiciones.


2.1. Sentencia condicional
2.2. Expresiones lógicas
2.3. Operadores de relación
2.4. Operadores Lógicos
2.5. Sentencia Compuesta

3. Ciclo for.
3.1. Sintaxis.
3.2. Generación de números con la variable de control de ciclo.
3.3. Verificar propiedades dentro de un rango de números.
3.4. Tratamiento de listas de datos.
3.5. Utilización de elementos acumuladores.
3.6. Algoritmos para calcular el promedio y el mayor.
3.7. Uso del break y continue.

4. Ciclos indeterminados.
4.1. Sintaxis del while.
4.2. Principales características.

5. Ciclos anidados.
5.1. Anidamiento del ciclo for.
5.2. Anidamiento de diferentes tipos de ciclos.

6. Arreglos unidimensionales.
6.1. Declaración de arreglos de datos
6.2. Comprender la necesidad de su uso.
6.3. Búsqueda secuencial de un elemento.
6.4. Creación de sublistas.
6.5. Encontrar el mayor de una lista
6.6. Ordenar una lista.

7. Arreglos bidimensionales, matrices o tablas.


7.1. Declaración de arreglos bidimensionales.
7.2. Acceso a los elementos.
7.3. Operaciones con matrices.
7.4. Arreglos de movimientos.

Concurso de Computación “IPVCE Ernesto Guevara”


8. Entrada y salida por ficheros textos.
8.1. Otras maneras de realizar la entrada y salida.
8.2. Forma más sencilla de realizar la entrada y salida

9. Tratamiento de cadenas de caracteres.


9.1. Declaración usando el tipo char.
9.2. Principales funciones.
9.3. El tipo string.
9.4. Métodos para utilizar string.

10. Subprogramas. Soluciones reusables.


10.1. Declaraciones de funciones.
10.2. Transferencia de parámetros por valor
10.3. Transferencia de parámetros por referencia.

11. Recursividad lineal.


11.1.Definiciones.
11.2.Recursividad lineal.
11.3.Definición de pila.

12. Recursividad ramificada.


12.1. Árbol de la recursividad.
12.2. Ciclos anidados vs Recursividad.

13. Estructuras.
13.1. Declaración y uso de las estructuras.
13.2. Funciones en el interior de estructuras.

14. Uso de la STL.


14.1. Los Vectores.
14.2. Los contenedores.
14.2.1. Las pilas.
14.2.2. Las colas.
14.2.3. Las colas de prioridad.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 1: Introducción a la Programación.

Sumario:
- Estructura de un programa.
- Tipos de datos (enteros y reales).
- Entrada y salida (cin, cout).
- Sentencia de asignación (=).
- Expresiones aritméticas.
- Funciones matemáticas.
- División entera y resto de la división (%).

Análisis de problema
1) Análisis literal del texto del problema.
2) Definir datos de entrada y resultados.
3) Buscar el algoritmo o modelo de solución.
4) Escritura del Código asociado.
5) Ejecución y puesta a punto del programa.

1.1 Estructura de un programa.

#include < nombre de la biblioteca >


int main (){
// Declarar las variables
// Leer datos
// Algoritmo
// Escribir resultados
return 0;
}

Tipos de datos numéricos

Tipo Tamaño Rango unsigned


char 1 bytes -128 a 127 0 a 255
short 2 bytes -32768 a 32767 0 a 65535
int 4 bytes -2147483648 a 2147483647 0 a 4294967295
long 4 bytes -2147483648 a 2147483647 0 a 4294967295
float 4 bytes +/- 3.4e +/- 38 (~7 digits)
double 8 bytes +/- 1.7e +/- 308 (~15 digits)
long long 8 bytes

El alcance de las variables puede ser local al bloque donde ellas están declaradas o puede
ser globales cuando son declaradas antes de la función main () lo que implica que pueden
ser utilizadas en todo el programa. El espacio asignado a las variables se libera al salir del
bloque donde fueron declaradas.

Concurso de Computación “IPVCE Ernesto Guevara”


Ejemplo # 1
Calcular el por ciento de asistencia de un grupo.

#include <iostream>
#include <cstdlib>
using namespace std;
int main (){
// Declaración de variables
float Matricula, Presentes, Pto;
// Solución
cout << "Matricula: ";
cin >> Matricula;
cout << "Presentes: ";
cin >> Presentes;
Pto = Presentes / Matricula * 100;
// Escribir resultados
cout << "El por ciento de asistencia es " << Pto;
system("pause > nul");
return 0;
}

Ejemplo # 2
Calcular el área de un triángulo conocida la base y la altura.

#include <iostream>
using namespace std;
int main (){
// declarando variables:
float Base, Altura;
float Area;
// proceso:
cout << "Base: ";
cin >> Base;
cout << "Altura: ";
cin >> Altura;
Area = Base * Altura / 2;
// Escribir resultados:
cout << "El área del triángulo es " << Area;
return 0;
}

1.2 Funciones Matemáticas.

Ejemplos que utilizan las funciones matemáticas que aparecen en la librería <cmath>.
Consultar la tabla de funciones al final del documento.

Concurso de Computación “IPVCE Ernesto Guevara”


Ejemplo # 1
Calcular la distancia entre dos puntos en el plano conocidas sus coordenadas..

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int main (){
float x1, y1, x2, y2;
float Dist;
cout << "Punto 1: ";
cin >> x1 >> y1;
cout << "Punto 2:";
cin >> x2 >> y2;
Dist = sqrt (pow(x1 – x2, 2) + pow(y1 - y2, 2));
cout << "La distancia entre los dos puntos es " << Dist;
system ("pause > nul");
return 0;
}

Ejemplo # 2
Para el cálculo de la parte entera inferior y superior de un número decimal.

#include <iostream>
#include <cstdlib>
#include <cstdlib>
#include <cmath>
using namespace std;
int main (){
int A,B;
float d;
cout << "Número: ";
cin >> d;
A = (int) floor(d);
B = (int) ceil(d);
cout << "floor: " << A << "\n";
cout << "ceil: " << B << "\n";
system ("pause > nul");
return 0; }

Ejemplo # 3
Determine la cantidad de dígitos que tiene un número.

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int main (){
int C;

Concurso de Computación “IPVCE Ernesto Guevara”


long long N;
cout << "Numero : ";
cin >> N;
C = (int) (log10(N)) + 1;
cout << "Cantidad de Dígitos: " << C;
system ("pause > nul");
return 0;
}

Ejercicios Propuestos

1) Dada una distancia expresada en kilómetros convertirla a metros.

2) Dada una cantidad de dinero en CUP convertirla a CUC entrando además como dato la
tasa de cambio actual.

3) La duración de una actividad viene dada en horas y minutos y queremos expresarla en


minutos solamente.

4) Convertir una temperatura expresada en grados centígrados a grados Fahrenheit usando


la fórmula: C = 5/9 (F – 32).

5) Diseña un programa que, a partir del valor de los dos lados de un rectángulo, muestre el
valor de su perímetro y el de su área.

6) Una familia en su casa gasta entre 100 y 150 kw al mes. Conocida la cantidad de kw
gastados por dicha familia, qué cantidad de dinero deben pagar. Con la tarifa se pagan
nueve pesos por los 100 primeros Kw. consumidos y 20 centavos por cada uno de los
restantes kw.

7) Para la preparación de las pruebas de ingreso un alumno debe resolver N problemas de


un determinado tema. Si el estudiante resolvió el 40% de los mismos y de los restantes,
P/Q (fracción propia) de los mismos. Cuántos ejercicios resolvió en total.

8) Tenemos un rectángulo dentro de otro. Calcular el área del rectángulo mayor no


comprendida dentro del rectángulo más pequeño.

9) Intercambiar el contenido de dos variables utilizando:


a) Una variable temporal.
b) Solamente esas dos variables.

10) La distancia entre dos puntos con coordenadas enteras en una grilla rectangular se
calcula por la fórmula de la distancia Manhatan (Dm = |x1-x2| + |y1-y2|).

11) Calcular el área de un triangulo conociendo las longitudes de sus lados. Para ello se debe
auxiliar de las respectivas fórmulas para el semiperímetro y el área triángulo
abc
P= A = P (P - a) (P - b) (P - c)
2

Concurso de Computación “IPVCE Ernesto Guevara”


1.3 División entera y resto de la división.

Ejemplo ·# 1: Calcular el producto de los dígitos de un número de tres cifras

#include <iostream>
using namespace std;
int main (){
int X;
cout << "Número: ";
cin >> X;
int d1, d2, d3, s;
d1 = X / 100;
s = X % 100;
d2 = s / 10;
d3 = s % 10;
int P = d1 * d2 * d3;
cout << "Producto de los dígitos " << P;
return 0;
}

Ejercicios Propuestos

1) Dado un número de tres cifras, queremos hallar la suma del número formado con los dos
dígitos de los extremos más el número de centro.

2) Dada la medición de una actividad deportiva en segundos queremos expresarla en


horas, minutos y segundos.

3) Dado un número de cuatro cifras queremos hallar la diferencia del número original menos
el número formado con las cifras tomadas en orden inverso.

4) Se llama incluido al número que se obtiene sumando las cifras que forman un número
dado. Por ejemplo el incluido de 124 es 7 puesto que 1+2+4=7. Dado un número de
tres cifras determine cuál es su número incluido.

5) Dada una cantidad de dinero necesitamos pagarle a una persona con la menor cantidad
de billetes posible.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 2: Diseño de algoritmos utilizando condiciones.

Sumario
- Utilizar la sintaxis más general de la instrucción If.
- Operadores de relación (==, <, >, >=, <=, !=).
- Operadores lógicos (&&,|| ,^).

2.1 La Instrucción If. Sus características.

If (condición)
Instrucción o bloque de instrucciones;
[else
Instrucciones o bloque de instrucciones;]

Un bloque de instrucciones lo conforman varias instrucciones separadas entre si por punto y


coma, las cuales están agrupadas por llaves {}.

Ejemplo # 1:
Calcular el módulo o valor absoluto de un número.

#include <iostream>
using namespace std;
int main (){
int Numero, Modulo;
cout << "Numero: ";
cin >> Numero;
if (Numero < 0 )
Modulo = -1 * Numero;
else
Modulo = Numero;
cout << "El modulo es " << Modulo;
return 0;
}

Ejemplo # 2:
Dado dos números enteros mostrar un mensaje indicando si se encuentran ordenados o
desordenados. En casos de estar desordenados intercambiarlos. Imprimir las variables al
final de cada paso.

#include <iostream>
using namespace std;
int main(){
int X, Y, t;
cout << "Entrar dos números: ";
cin >> X;
cin >> Y;
if (X > Y) {
cout << "Desordenados \n";
t = X;

Concurso de Computación “IPVCE Ernesto Guevara”


X = Y;
Y = t;
cout << X << " " << Y;
}
else {
cout << "Ordenados \n";
cout << X << " " << Y;
}
return 0;
}

Ejercicios con una condición simple

1) Conocido el plan de energía y el consumo de una empresa determinar si cumplió o no. En


caso de incumplir de cuánto fue el incumplimiento.
2) Calcule el mayor de dos números. Debe utilizar una sola instrucción de impresión.
3) Dado tres ángulos determinar si corresponden con ángulos interiores de un triángulo.
4) Compara dos fracciones y escriba que relación existe entre ellas.
5) Dado cinco números decimales determine cuál de los cuatro últimos números entrados
está más cerca del primero.
6) Dada la hora y minutos de comienzo y terminación de una actividad en una misma sesión
del día determinar cuánto duró.
7) Un número es divisible por cinco si su última cifra es cinco o cero. Dado un número
imprima si es o no divisible por 5.
8) Dados dos números enteros a, b y un operador, realice la operación aritmética indicada
por medio del operador a los números dados. Por ejemplo, si los datos son: 8 4 +, el
algoritmo debe calcular la suma de 8 + 4. Los operadores válidas son: + - * /.
9) Dada una hora expresada en horario militar convertirla a hora normal. Tenga en cuenta
que la hora militar está comprendida entre 0 y 23.
10) Tenemos el día y el mes de una fecha entre septiembre y octubre y queremos imprimir la
fecha del día siguiente.

2.2 Los operadores lógicos.

Los operadores lógicos && (and) y || (or) son utilizados cuando evaluamos expresiones que
poseen varios operandos relacionales para obtener un resultado simple (verdadero o falso)
que las relaciona. El operador && es el operador and de la lógica booleana. Esta operación
resulta verdadera si todos los operandos son verdaderos y falsos en caso contrario mientras
que el operador || es el operador or de la lógica booleana y resulta verdadera si al menos
uno de los operandos es verdadero.

Ejemplo # 1:
Dada las coordenadas de un punto en el plano determinar si este se encuentra en el primer
cuadrante o en otro cuadrante. (Utilización de operadores lógicos)

#include <iostream>
using namespace std;
int main (){

Concurso de Computación “IPVCE Ernesto Guevara”


int X, Y;
cout << "Coordenadas: ";
cin >> X;
cin >> Y;
if (X > 0 && Y > 0)
cout << "Esta en el Primer Cuadrante";
if (X < 0 && Y > 0)
cout << "Esta en el Segundo Cuadrante";
if (X < 0 && Y < 0)
cout << "Esta en el Tercer Cuadrante";
if (X > 0 && Y < 0)
cout << "Esta en el Cuarto Cuadrante";
return 0;
}

Ejemplo # 2:
Determinar si un punto se encuentra o no sobre los ejes de coordenadas.

#include <iostream>
using namespace std;
int main (){
int X, Y;
cout << "Coordenadas: ";
cin >> X;
cin >> Y;
if (X == 0 || Y == 0)
cout << "Esta sobre los ejes";
else
cout << "No está sobre los ejes";
return 0;
}

Ejemplo # 3:
Calcular el mayor de tres números sin utilizar operadores lógicos.

#include <iostream>
using namespace std;
int main (){
int X, Y, Z;
cout << "Entrar tres números: ";
cin >> X;
cin >> Y;
cin >> Z;
if (X > Y)
if (X > Z)
cout << " X es el mayor";
else
cout << " Z es el mayor";
else

Concurso de Computación “IPVCE Ernesto Guevara”


if (Y > Z)
cout << " Y es el mayor";
else
cout << " Z es el mayor";
system("pause > nul");
return 0;
}

Ejercicios utilizando operador lógico de conjunción (&&)

1) Dado el diámetro de una varilla determine si es excelente o no. Una varilla se considera
excelente si tiene un diámetro entre 25 y 30 cm.
2) Dado los valores de tres segmentos determine si ellos forman o no un triángulo
(Propiedad: Desigualdad triangular).
3) Determine la cantidad de dígitos que tiene un número entero (menor o igual que 100000)
entrado por teclado. Escriba un mensaje de error cuando exceda esta cifra. Resuelva el
ejercicio utilizando anidamiento de condiciones.
4) Dados los valores de los tres lados de un triángulo clasifíquelo en Isósceles o no.
5) Dados los valores de los tres lados de un triángulo clasifíquelo en: Equilátero, Escaleno o
Isósceles.
6) Calcule el mayor de tres números. Resuelva el ejercicio utilizando primero la cantidad de
preguntas que desee y luego la menor cantidad de condiciones posibles.

Ejercicios utilizando operado lógico de disyunción (||)

1) Un triángulo es Isósceles si dos lados consecutivos del mismo son iguales. Dado el valor
de los tres lados determine si el triángulo es Isósceles o no lo es.
2) Determinar la cantidad de días que tiene un mes perteneciente al segundo semestre del
año

Ejercicios Propuestos

1) Determine si un número es par o impar.

2) Las siguientes condiciones compuestas producen verdadero o falso como resultado de la


evaluación de la misma. Determine el valor de cada una.
a) ! (True || False)
b) (True && False) && (False || True)
c) ! (True && False)
d) True || (False && False) || False

3) Determine si un año es bisiesto o no lo es. Un año es bisiesto si el número del año es


divisible por 4. En el caso de los años que terminan en 00 tienen que ser divisibles por
400.

4) Dado un número con la cantidad de cifras que se especifica en cada inciso determine si
cumplen con la propiedad respectiva.
a) ab = a * b + a + b
b) abc = a3 + b3 + c3

Concurso de Computación “IPVCE Ernesto Guevara”


c) aabb = aa2 + bb2

5) Dado un número de dos cifras determine si la diferencia del este con el número formado
con sus dígitos invertidos es igual a 9 (valor absoluto). Por ejemplo, si el número es el 32,
la diferencia sería 32 – 23 es igual a 9.

6) Un número CAPICUA es aquel que leído sus cifras de izquierda a derecha o de derecha a
izquierda se obtiene el mismo número. Dado un número de cinco cifras determine si es
CAPICUA o no lo es.

7) Dado el día y el mes de una fecha del presente año, calcular la fecha (día y mes) del día
siguiente.

8) Calcular el mayor de tres números:


a) Utilizando operadores lógicos
b) Utilizando tres condiciones como máximo.

9) Calcular el mayor de cinco números utilizando la menor cantidad de condiciones posibles.

10) Hacer un programa para cada una de las siguientes criterios de divisibilidad:
- El número termina en cifra par.
- El número formado por las dos últimas cifras es 00 ó múltiplo de 4.
- La última cifra es 0 ó 5.
- Para números de 3 cifras: Al número formado por las dos primeras cifras se le resta la
última multiplicada por 2. Si el resultado es múltiplo de 7, el número original también lo
es. 469: porque 46-9·2 = 28 que es múltiplo de 7.
- Para números de más de 3 cifras: Dividir en grupos de 3 cifras y aplicar el criterio de
arriba a cada grupo. Sumar y restar alternativamente el resultado obtenido en cada
grupo y comprobar si el resultado final es un múltiplo de 7.
- El número formado por las tres últimas cifras es 000 ó múltiplo de 8.
- La suma de sus cifras es múltiplo de 9.

11) Dada una cantidad de dinero descomponerla en la menor cantidad de billetes posibles
usando solamente billetes de 20, 10, 5, 3 y de 1.

12) Ordenar tres números de menor a mayor sin utilizar operadores lógicos.
a) Utilizando operadores lógicos.
b) Utilizando tres condiciones como máximo.

13) Dados tres dígitos distintos de cero. Escriba un programa que encuentre el menor
entero positivo divisible por 3 que tenga en su representación decimal solamente los
dígitos dados. Cada dígito dado puede no estar incluido o ser incluido varias veces en el
resultado. Ejemplo con los dígitos 4, 7 y 2 el menor entero sería 24.

14) Determine la relación que existe entre dos segmentos que están sobre el eje de las X.
Las relaciones posibles son: separados, superpuestos o uno a continuación del otro.
Los segmentos se leen en cualquier orden.

Concurso de Computación “IPVCE Ernesto Guevara”


15) Dado tres ángulos que pertenecen a un triángulo clasifíquelo en: rectángulo ( si tiene un
ángulo recto), en acutángulo ( si sus tres ángulos son agudos, es decir , sus amplitudes
son menores que 900) o en obtusángulo ( si tiene un ángulo obtuso, es decir, un ángulo
cuya amplitud es mayor que 900 y menor que 1800).

16) Para la venta de productos en un supermercado existe una oferta es especial de fin de
semana la cual tiene en cuenta el peso en kilogramos del producto. Si un usuario
compra un producto que pesa menos de 100 kg debe pagar su precio completo. Si el
producto pesa entre 100 y 200 kg pagara los primeros 100 kg al 100 % del precio del
producto y los restantes solamente al 50 %.

17) Dadas las coordenadas de los puntos de un segmento de recta en el plano determine si
la recta intersecta al eje de las X o al de las Y.

18) Dado dos circulos: O1 con centro o1 = (xo1, yo1) y radio r1 y O2 con centro en o2 = (xo2,
yo2) y radio r2, determine si O1 esta dentro de O2. Tener en cuenta que 0 ≤ xo1, yo1, xo2,
yo2 ≤ 1000 y 0 < r1, r2 ≤ 1000.

19) Dados tres números enteros colocar entre el primero y el segundo dígito, y también
entre el segundo y el tercer dígito un signo para la adición o para la multiplicación.
Entonces calcular el resultado de la expresión aritmética respetando siembre la
prioridad de los operadores. Escriba un programa max el cual encuentre el valor más
grande que pude ser obtenido.

20) Una persona pensó un número de tres dígitos y lo tiene oculto en su programa. Usted
tiene que tratar de adivinar el número en un solo intento, sino lo adivina el programa le
responderá cuántos dígitos de los que usted entró están Bien (en su posición), cuántos
Regular (el digito está en otra posición) y cuántos Mal (no aparecen en el número que
hay que adivinar).

21) Solamente tenemos los números 8, 4, 2 y 1, cuales de ellos son necesarias para formar
el numero N menor o igual que 15. Hacer el programa que imprima estos números.
Ejemplo, para N=12, los números necesarios son el 8 y el 4.

22) Los números pares a partir del número 2 los hemos ubicado en una tabla cuadrada de
orden N (igual cantidad de elementos por filas que por columnas) de la siguiente forma.
Para N = 4 la tabla sería:

2 4 6 8
10 12 14 16
18 20 22 24
26 28 30 32

Hacer un programa que entrado N y un número P que aparezca en la tabla imprimir


los vecinos izquierdo, derecho, superior e inferior y los números en las diagonales.

Concurso de Computación “IPVCE Ernesto Guevara”


Ejemplo de Ejecución

N = 4 P = 22
Vecinos
Izquierdo: 20 Derecho: 22 Superior: 14 Inferior: 30
Diagonales: 12 16 28 32

Concurso de Computación “IPVCE Ernesto Guevara”


Tema 3: Ciclo For.

Sumario
- Sintaxis del for.
- Variable de control de ciclo para generar valores.
- Chequear propiedades.
- Lista de datos.
- Elementos acumuladores.
- Algoritmo del mayor y el promedio.
- Break y continue.

for (inicialización; condición; incremento/decremento)


Instrucción o bloque de instrucciones;

Expresión de incrementar en C/C++ Expresión general de incrementar


Variable++ Variable = variable +1
Variable- - Variable = variable –1
Variable += incremento Variable = variable + incremento
Variable -= incremento Variable = variable - incremento

Ejemplo # 1:
Imprimir la palabra algoritmos N veces.

#include <iostream>
#include <cstdlib>
using namespace std;
int main (){
int N;
cout << "Número: ";
cin >> N;
for (int i=1; i <= N; ++i)
cout << "Algoritmos \n";
system("pause > nul");
return 0;
}

Ejemplo # 2:
Imprimir para cada uno de los N primeros números naturales el número y con su raíz
cuadrada.

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main (){
int N;

Concurso de Computación “IPVCE Ernesto Guevara”


cout << "Número: ";
cin >> N;
cout << "Raíces Cuadradas \n";
for (int i=1; i <= N; ++i)
printf(" %d %.2f\n", i, sqrt(i));
system("pause > nul");
return 0;
}

3.1 Variable de control de ciclo para generar valores.

Ejemplo # 1
Determinar todos los números de dos cifras que cumplen la siguiente propiedad:
ab = a * b + a + b

#include <iostream>
#include <cstdlib>
using namespace std;
int main (){
int a, b;
cout << "Cumplen la propiedad \n";
for (int i=10; i <= 99; ++i) {
a = i / 10;
b = i % 10;
if (i == a*b+a+b)
cout << i << "\n";
}
return 0;
}
Ejemplo # 2
Imprimir descendentemente todos los números impares en un intervalo dado por el usuario.

#include <iostream>
#include <cstdlib>
using namespace std;
int main (){
int a, b;
cout << "Intervalo: ";
cin >> a >> b;
if (b % 2 == 0) b--;
if (a % 2 == 0) a++;
for (int i=b; i >= a; i-=2)
cout << i << "\n";
return 0;
}

Concurso de Computación “IPVCE Ernesto Guevara”


3.2 Tratamiento de Listas de Datos.

Ejemplo # 1
Dada una lista que contiene las N notas de un estudiante, calcular el promedio de aquellas
notas que estén por encima de 60 puntos.

#include <cstdio>
#include <cstdlib>
int main(){
int c, n, nota;
float s;
s = 0, c = 0;
scanf("%d", &n);
for (int i=1; i <= n; i++){
scanf("%d", &nota);
if (nota >= 60) {
s = s + nota;
c++;
}
}
float p = s / c;
printf("Promedio %f", p);
system("pause > nul");
return 0;
}

Ejemplo # 2
Calcular el mayor de una lista de N números.

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
int N, num, Mayor;
cout << "Tamaño de la lista ";
cin >> N;
scanf("%d", &num);
Mayor = num;
for (int i=2; i <= N; i++){
scanf("%d", &num);
if (num > Mayor)
Mayor = num;
}
printf("El mayor es %d", Mayor);
system("pause > nul");
return 0;
}

Concurso de Computación “IPVCE Ernesto Guevara”


La función scanf tiene dos argumentos, el primero es la cadena de control de formato en la
que se especifica el tipo de datos que deberán ser escritos por el usuario. Los
especificadores de conversión indican el tipo de los datos y los más comunes son:
%d – enteros.
%f – float.
%s – cadena.
%c – caracteres.
%lf – double.
%I64d - long long (lld en algunos compiladores).

El segundo argumento en el scanf las variables empiezan con ampersand o sea el


operador de dirección. En el printf las cadenas de control de formato se utilizan de manera
equivalente.

Ejercicios Propuestos

1) Se llaman cubos narcisistas aquellos números enteros positivos que son exactamente
iguales a la suma de sus dígitos elevados al cubo. Es decir 370 y 371 son cubos
narcisistas. Resolver el ejercicio usando un solo ciclo para recorrer todos los números de
tres cifras.

2) El número 8833 tiene la propiedad siguiente: Si se divide en dos números de dos cifras
(88 y 33) y se eleva al cuadrado cada cifra, sumándolas después, se obtiene el número
original (8833). Haga un programa que imprima todos los números de 4 cifras que tengan
ésta propiedad.

3) Obtener todos los números enteros positivos de cuatro cifras que cumplan la propiedad
que tiene el siguiente ejemplo: el número 3025, si lo separamos en dos números de dos
dígitos cada uno, 30 y 25, se suman dichos números y luego se elevan al cuadrado el
resultado final es 3025. Es decir: (30 + 25)2 = (55)2 = 3025.

4) Calcule el promedio de todos los números pares menores que M.

5) Calcular la suma de los numeros al cuadrado en un intervalo [A,B], o sea, a*a +


(a+1)*(a+1) + ... + (b-1)*(b-1) + b*b.

6) Dado un número entero, mostrar todos los múltiplos de 5 comprendidos entre 1 y el


número leído.

7) Dado dos números que representan un intervalo, mostrar todos los números terminados
en 4 comprendidos en dicho intervalo.

8) Confeccione un programa que imprima todos los números de tres cifras divisibles por
cinco, tales que la suma de sus dígitos sea 12.
a) Utilizando un solo ciclo para recorrer un rango.
b) Utilizando ciclos anidados para generar los dígitos de los números. Debe tener en
cuenta la descomposición decimal para formar los números.

Concurso de Computación “IPVCE Ernesto Guevara”


9) Confeccione un programa para imprimir todos los números de tres cifras que tienen como
incluido un número n.

10) Hacer la multiplicación de (a * b) por sumas consecutivas.

11) Encuentre todos los números de dos cifras cuya diferencia del número con sus dígitos
invertidos sea igual a 9.

12) Escriba algoritmos que permitan sumar los n primeros términos de las siguientes series:
a) 1 + 3 + 5+…+ (2k+1)
b) 1 – 3 + 5 – 7 +…

13) Confeccione un programa para leer un número entero y positivo e imprimir todos sus
divisores.

14) Construya un programa para calcula el máximo común divisor entre dos números
enteros apoyándose en los divisores de ambos números.

15) Determinar si un número es primo. Se llama número primo a todo aquel número que
tiene como divisores a la unidad y al propio número.

16) Implemente un programa que muestre todos los múltiplos de n entre a y b inclusive,
donde todos los valores de n, a y b son introducidos por teclado.

17) Determine si dos números son primos entre si, o sea, que sus divisores comunes es
solamente el 1.

18) Dados dos números naturales N y D que representan el numerador y el denominador de


una fracción respectivamente. Confeccione un programa para imprimir la fracción
irreductible correspondiente.

19) Dada una lista de las temperaturas en N días sucesivos determine en cuantos días la
temperatura del día actual es inferior a la del día anterior.

20) Dada una lista de N triángulos, de los cuales tenemos sus tres lados. Determine de
cada tipo de triángulos (Isósceles, Equilátero y Escaleno) cuántos existen.

21) Halle todos los números de dos cifras que cumplen con las siguientes propiedades:
la cifra de las decenas deben ser tres unidades menor que las de la cifra de la unidad, si
ese número se le sustrae al número que se obtiene de invertir sus cifras se obtiene 27 y
el número debe ser par.

22) Escriba un programa que simula la tirada de una moneda 10, 50, 500 y 1000 veces. En
cada caso, imprima la cantidad de veces que sale estrella y la cantidad de veces que
sale escudo. Debe utilizar las funciones rand y srand contenidas en la biblioteca cstdlib.

Concurso de Computación “IPVCE Ernesto Guevara”


23) Dado un intervalo [a, b] imprima el subintervalo que tenga como extremos los números
primos más grandes y más pequeños del intervalo inicial. Por ejemplo, para a=1 y
b = 30, los subintervalos son: más pequeño [2,3] y más largo [23,29].

24) Encuentre los números que cumplen con el siguiente cociente: abc / de = 9.

25) Se tienen tres números reales cualesquiera, x, y, z. Con los dos primeros, se desea
realizar una de las siguientes operaciones: adición, sustracción o multiplicación. Con el
resultado obtenido y el tercer número, se quiere efectuar también una de las
operaciones mencionadas (ambas operaciones pueden repetirse, o no). Se desea
encontrar una combinación de operaciones mediante las cuales se obtenga, en valor
absoluto, el mayor resultado final posible.

26) Escriba un programa para calcular el número de rectángulos con área S cm 2 tal que las
longitudes de los lados en centímetros sean enteros, siendo S (1 < S < 100000) es un
entero. Para S igual a 4 el número de rectángulo es 2.

27) Confeccione un programa para determinar e imprimir los número de cuatro cifras que
cumplen las condiciones siguientes:
- La suma de los cuadrados de las dos cifras extremas es igual a 13.
- La suma de los cuadrados de las cifras del medio es igual a 85.
- Si del número buscado se resta 1089, se obtiene un número que se escribe con las
mismas cifras pero en orden contrario.

28) Confeccione un programa que dado una lista de N elementos, calcule la suma de todos
los elementos de la misma que sean mayores que su antecesor y menores que su
sucesor. Por ejemplo:
N: 8
Lista: 1, 2, 8, 4, 5, 12, 7, 3
La suma de estos elementos es 7 (5 + 2).

29) Confeccione un programa para leer una lista de números e imprimir la cantidad de
veces que ocurre un cambio de signo en sus elementos.

30) Su amigo piensa un número. De este él sustrae el valor de a (1 ≤ a ≤ 1000) y entonces


le sustrae el número más grande de tres dígitos que es divisible por b (1 ≤ b ≤ 1000).
El valor obtenido es el número más pequeño de cuatro dígitos que es divisible por
c (1 ≤ c ≤ 1000). Escribe un programa num el cual debe encontrar el número que pensó
su amigo.

31) Al concursante más destacado de la provincia le asignaron un equipo de GPS. El


registró en cada minuto su altitud en metros. Después de buscar en la secuencia de
valores registrados, él decidió encontrar de cuántos minutos fue el intervalo más largo
que él estuvo escalando. Ayúdelo escribiendo un programa gps, que calcule dicho
intervalo. Tú programa leerá desde el teclado los datos. El primer número leído
especifica cuántos valores están registrados en la secuencia, seguido por los valores
registrados, separados entre sí por un espacio en blanco. La cantidad de números
registrados no es mayor que 1000 y cada número registrado tiene un valor entre 0 y

Concurso de Computación “IPVCE Ernesto Guevara”


1000. Tienes que escribir hacia la pantalla un entero el cual representa la longitud del
intervalo en minutos.

32) Consideremos un antiguo problema creado por Fibonacci o Leonardo de Pisa


matemático italiano de la edad media. Se precisa conocer el número de parejas
de conejos adulto resultantes de una pareja durante X meses si cada pareja adulta
produce mensualmente una nueva pareja y los recién nacidos alcanzan su plena
madures en el curso de un mes. NOTA: Al comenzar se contaba con una pareja de
adultos. Confeccione un programa para calcular el número de parejas de conejos
adultos resultante de una pareja durante x meses si cada pareja produce mensualmente
una nueva pareja y los recién nacidos alcanzan su plena madurez al cabo de un mes.

33) A continuación les mostramos varias series las cuales en dependencia del número de
términos entrados hacer un programa que calcule el valor aproximado de Pi. Haga un
programa para cada una de las siguientes series.

Series de Euler

Pi2 1 1 1 1
-- = --- + --- + --- + --- + …
4 12 22 32 42

Pi2 1 1 1 1
-- = --- + --- + --- + --- + …
8 12 32 5 2 72

Pi2 1 1 1 1
-- = --- - --- + --- - --- + …
12 12 22 3 2 42

Serie de Gregory

Pi 1 1 1 1
--- = 1 - --- + --- - --- + --- ...
4 3 5 7 9

Identidad de Wallis

Pi 2 4 4 6 6 8 8
-- = --- * --- * --- * --- * --- * --- * .--- * …
4 3 3 5 5 7 7 9

34) Con ocho bits el número mayor que se puede representar es el 255, utilizando para
ellos las potencias de dos, o sea, solamente los números 128, 64, 32, 16, 8, 4, 2 y el
necesario 1. Cuál es la menor cantidad de ellos que utilizaría para formar el número N
menor o igual que 255. Hacer el programa que imprima estos números. Ejemplo, para
N=50, los números necesarios son el 32, el 16 y el 2.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 4: Ciclos Indeterminados.

Sumario:
- Ciclos indeterminados (while y do)
- Condición.
- Trabajo con Listas de Datos.

La sintaxis del ciclo while es:


while (condición)
Instrucción o bloque de instrucciones;

Su funcionamiento consiste en repetir las instrucciones mientras la condición que aparece en


la expresión sea verdadera. Usted como programador debe garantizar que esa condición se
modifique para en algún momento salir del ciclo.

La sintaxis del do es:


do
Instrucción o bloque de instrucciones
while (condición);

Funciona similar al ciclo while excepto que la condición es evaluada después de la


ejecución de las instrucciones que aparecen antes de la condición lo que provoca la
ejecución del ciclo al menos una sola vez.

Ejemplo # 1
Determinar la cantidad de dígitos que tiene un número entero.

#include <cstdio>
#include <cstdlib>
int main(){
int Num, d;
printf("Número: ");
scanf("%d", &Num);
d = 0;
while (Num > 0) {
Num = Num / 10;
d++;
}
printf("Dígitos : %d ", d);
system("pause > nul");
return 0;
}

Ejemplo # 2
Calcular la división entera de dos números enteros por restas sucesivas. La cantidad de
veces que se reste será el cociente.

Concurso de Computación “IPVCE Ernesto Guevara”


#include <cstdio>
#include <cstdlib>
int main(){
int Dividendo, Divisor, Cociente, Resto;
printf("Dividendo: ");
scanf("%d", &Dividendo);
printf("Divisor: ");
scanf("%d", &Divisor);
Cociente = 0;
Resto = Dividendo;
while (Resto >= Divisor) {
Cociente = Cociente + 1;
Resto = Resto - Divisor;
}
printf("Cociente : %d ", Cociente);
printf("Resto : %d ", Resto);
system("pause > nul");
return 0;
}

Ejemplo # 3
Invertir un numero del tal manera que se forme un nuevo numero con las cifras tomadas de
derecha a izquierda.

#include <cstdio>
#include <cstdlib>
int main(){
int Num, Inv, d;
printf("Número: ");
scanf("%d", &Num);
Inv = 0;
while (Num > 0) {
d = Num % 10;
Inv = Inv * 10 + d;
Num = Num / 10;

}
printf("Numero Invertido : %d", Inv);
system("pause > nul");
return 0;
}

Ejemplo # 4
Imprimir aleatoriamente una cantidad de caracteres según un valor entrado.

#include <cstdio>
#include <algorithm>
using namespace std;
int size;

Concurso de Computación “IPVCE Ernesto Guevara”


int main() {
scanf( "%d", &size );
while ( size-- ) {
printf( "%c", 97 + ( rand() % 26 ) );
}
return 0;
}

Ejemplo # 5
Calcular el máximo común divisor utilizando el algoritmo de Euclides.

#include <cstdio>
#include <cstdlib>
int main(){
int a, b;
printf("Numero: ");
scanf("%d%d", &a, &b);
int r;
while (b != 0){
r = a % b;
a = b;
b = r;
}
printf("El máximo común divisor es %d\n", a);
return 0;
}

Ejercicios Propuestos

1) Confeccione un programa para determinar cuál fue el mejor y cuál fue el peor de una lista
indeterminada de saltos realizados por un atleta en una competencia. Cada salto se
evalúa con un número distinto de cero.

2) Diseñe un programa que solicite la entrada de un número entre a y b. Si el usuario teclea


el número fuera del rango válido, el programa solicitará la entrada del valor hasta que sea
correcta.

3) Un palíndromo es una palabra, número o frase que se lee igual hacia adelante que hacia
atrás. Si se trata de un número, se llama capicúa. Dado un número entero N, determine
si es capicúa o no.

4) Se dice que dos números “a” y “b” son “parientes” si la suma de los dígitos de es igual
a “b” y la suma de los dígitos de es igual a “a”: Ejemplo: 13 y 16 son parientes pues
. Escriba un algoritmo que
determine si dos números “a” y “b” son parientes.

5) Escriba un algoritmo que determine si un dígito “d” está en un número entero N. Por
ejemplo, si N=3567, el dígito 5 está y el dígito 4 no está.

Concurso de Computación “IPVCE Ernesto Guevara”


6) Escriba un algoritmo que reciba un número entero N y un valor i, y devuelva el i-ésimo
dígito de N contado de izquierda a derecha. Ejemplo: Para N=3478 e i=3, devuelve el 7.
7) Calcula con cuáles múltiplos de 2 y el 1 sumados se puede formar un número menor
estricto que N.

8) Escribir un programa que muestre una salida con la siguiente secuencia numérica: 1, 5, 3,
7, 5, 9, 7,…, 23. La secuencia debe detenerse al llegar al valor de V ó sobrepasarlo. La
secuencia se obtiene partiendo de 1 y sumando y restando 4 y 2, alternativamente.

9) Dado un número natural de dos cifras, réstele 1, y luego sucesivamente al valor que se va
obteniendo 2, luego 3... hasta obtener un resultado menor que 11. Imprima todos los
resultados intermedios formados por los dos dígitos iguales.

10) Lista a 9. Comience con un número de dos dígitos, digamos el 19. Invierta los dígitos
para obtener el 91, tomar la diferencia entre 91 y 19 para obtener el próximo número de
la lista 72 = 91 - 19. Repita este proceso con el 72 para obtener el próximo número 45 =
72 - 27. Una repetición más del mismo proceso produciría 9 = 54 - 45. La lista a 9 es: 19
72 45 9 Longitud de la lista es 4. Genere utilizando el procedimiento arriba descrito la
lista a 9 para un número entrado.

11) Elabore un programa que dado un entero n > 1, calcule e imprima sucesivamente los
elementos correspondientes a la conjetura de Ullman (en honor al matemático S.
Ullman) que consiste en lo siguiente: comience con cualquier entero positivo. si es par,
divídalo entre 2; si es impar multiplíquelo por 3 y agréguele 1. Al final se obtendrá el
número 1, independientemente del entero inicial. Por ejemplo, cuando el entero inicial
es 26, la secuencia será: 26 13 40 20 10 5 16 8 4 2 1

12) Un número perfecto es aquel que la suma de sus divisores primos y compuestos es
igual a él (exceptuando el propio número). Ejemplo 28 = 14+7+4+2+1. Confeccione un
programa que calcule todos los números perfectos que existen en un intervalo dado.

13) Dado un número del que no conocemos la cantidad de dígitos que posee, determinar si
es divisible por 3. Un número es divisible por 3 si la suma de sus cifras es un múltiplo de
tres.

14) Dada una lista de números cualquiera cuyo último elemento es el cero, llamemos
tramos en la lista a dos o más elementos consecutivos de la lista ordenados
estrictamente de menor a mayor, o sea, números iguales no son un tramo. Hacer un
programa que permita entrar los números de la lista e imprimir la suma de cada tramo
encontrado. Terminar un programa entrando el cero. Por ejemplo:

Lista:
12
11
100 Suma del Tramo: 111
9
8
70

Concurso de Computación “IPVCE Ernesto Guevara”


80 Suma del Tramo: 158
5
193 Suma del Tramo: 198

15) La suma de los N primeros números impares es N2. Confeccione un programa que
dado un número (que sea cuadrado perfecto) imprima la sucesión de impares cuya
suma sea igual a dicho número.

16) Confeccione un programa para multiplicar dos números por el curioso método siguiente:
- Coloque los dos números uno al lado del otro en el mismo renglón.
- Calcule la mitad del número de la izquierda (tome solamente la parte entera) y
colóquela debajo de dicho número. Calcule el duplo del número de la derecha y
colóquelo debajo de dicho número.
- Repita el paso anterior hasta obtener a la izquierda un 1.
- Tache todos los números pares de la izquierda y su correspondiente de la derecha.
- Sume todos los números no tachados de la derecha y el resultado es el producto
buscado.

48 22
24 44
12 88
6 176
3 352
1 704

El resultado sería: 352 + 704 = 1056

17) Convierta de decimal a binario utilizando en cada paso la potencia de dos más próxima
al número que tengo en ese momento. Imprima solamente las potencias de dos que
necesitó para formar el número en binario.

18) Multiplicando los dígitos de un número entero de dos cifras y continuando el proceso
nos encontramos con el sorprendente resultado de que la secuencia de productos llega
siempre a un número de un solo dígito, por ejemplo:

88  64  24  8
27  14  4

Al número de productos necesarios para alcanzar un solo dígito se llama


PERSISTENCIA de ese número entero. Es decir el 88 tiene persistencia 3, mientras
que el 27 tiene persistencia 2. Confeccione un programa para determinar la persistencia
de un número entero de dos cifras entrado por teclado.

19) El valor de la raíz cuadrada de un número puede calcularse con bastante aproximación
empleando el método siguiente:

a) Dividir el número por un valor estimado de su raíz cuadrada.

Concurso de Computación “IPVCE Ernesto Guevara”


b) Hallar la media entre el valor estimado y el cociente calculado en el paso a, la que
se convierte en el nuevo valor estimado.
c) Repetir los pasos A y B hasta que la diferencia entre dos valores estimados
consecutivos sea menor que la precisión deseada.

Confeccione un programa para imprimir una tabla de raíces cuadradas con los números
del 1 al 10, con incrementos de 0.2 y con una precisión igual a 0.001.

20) Se tiene tres números reales cualesquiera, x, y, z; (datos). Con los dos primeros, se
desea realizar una cualquiera de las siguientes operaciones: adición, sustracción o
multiplicación. Con el resultado obtenido y el tercer número, se quiere efectuar también
una de las operaciones mencionadas (ambas operaciones pueden repetirse, o no). Se
desea encontrar una combinación de operaciones mediante las cuales se obtenga, en
valor absoluto, el mayor resultado final posible.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 5: Ciclos Anidados.

Sumario:
- Anidamiento de dos o más ciclos for.
- Generar los dígitos de un número.

Ejemplo # 1
Determinar todos los números de dos cifras que cumplen la siguiente propiedad:
ab = a * b + a + b

#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
int num, prop;
cout << "Cumplen la propiedad" << endl;
for (int i=1; i <= 9; i++)
for (int j=0; j <= 9; j++) {
num = i*10 + j;
prop = i * j + i + j;
if (num == prop)
cout << num << endl;
}
system("pause > nul");
return 0;
}

Ejemplo # 2
Se llaman cubos narcisistas, aquellos números enteros positivos que son exactamente
iguales a la suma de sus dígitos elevados al cubo. Es decir 370 y 371 son cubos narcisistas.

#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
int num, prop;
cout << "Cumplen la propiedad" << endl;
for (int i=1; i <= 9; i++)
for (int j=0; j <= 9; j++)
for (int k=0; k <= 9; k++) {
num = i*100 + j*10 + k;
prop = i*i*i + j*j*j + k*k*k;
if (num == prop)
cout << num << endl;
}
system("pause > nul");
return 0;
}

Concurso de Computación “IPVCE Ernesto Guevara”


Ejemplo # 3
Encontrar todas las combinaciones que formen números de dos dígitos sin repetición, sin
importar el orden de los dígitos.

#include <iostream>
#include <cstdlib>
using namespace std;
int main (){
int i, j;
cout << "Combinaciones \n";
for (int i=1; i <= 9; ++i)
for (int j= i+1; j <= 9; ++j)
cout << i << j << "\n";
system("pause > nul");
return 0;
}

Ejercicios Propuestos

1) Confeccione un programa que imprima todos los números de tres cifras divisibles por 5
tales que la suma de sus dígitos sea 12. Usando ciclos anidados para generar los dígitos
de los números. Utilizar descomposición decimal para formar los números.

2) Haga un programa que imprima y cuente los números que dentro de un intervalo dado
cumpla con la condición de CAPICUA. Ejemplo: 121 y 2442.

3) Haga un programa que imprima todos los números de tres cifras que sean capicúa y
primos a la vez.

4) Con los números del 1 al 9 forme números de tres cifras de manera que la segunda cifra
sea el doble de la primera y la tercera el triplo de la primera. Hacer un programa que
imprima esos números.

5) Confeccione un programa para imprimir todos los números de dos cifras que pueden
formarse con los dígitos 1, 2, 3, 4 con la condición de que en cada número no haya
dígitos iguales.

6) Encuentre todas las ternas pitagóricas no mayores que 500. Estos tríos deben satisfacer
la relación de que la suma de los cuadrados de dos de ellos debe ser igual al cuadrado
del otro número.

7) Encuentra la solución del siguiente cociente ABC / DE = 9, pero usando los dígitos
impares (1, 3, 5, 7, 9).

8) Obtener todos los números de tres cifras que sean divisibles por 17, y que se puedan
construir a partir de tres dígitos dados (supongamos que los mismos son 2, 4, y 5).
Entre los números que se busca, se admite la repetición de dígitos.

Concurso de Computación “IPVCE Ernesto Guevara”


9) Confeccione un programa para imprimir todos los números pares de 4 cifras formados por
los dígitos 0,1, 2, 3 que cumplan la condición de que los dígitos que lo forman no se
repitan.

10) Encontrar todos los números que cumplan la propiedad de que la suma de tres números
consecutivos sea igual a 33.

11) Confeccione un programa para determinar qué cantidad de números de 4 cifras cumplen
la propiedad de tener todas sus cifras diferentes e impares.

12) Se le llama números amigos a aquellos números que cumplen la condición de que la
suma de los divisores de uno de ellos es igual al otro número. Confeccione un programa
para determinar e imprimir todos los números amigos menores que 500.

13) Escriba un algoritmo que permita calcular un valor de la serie para un


valor de “x” cualesquiera con una “aproximación” de 0.0001 en el resultado, es decir si
es la suma de los k primeros términos y la suma de los k+1 primeros términos, la
diferencia en valor absoluto entre y debe ser menor que 0.0001.

14) Encuentre todos los números cuyas últimas cifras de su cuadrado sean iguales a él.
Ejemplo: 25 = 5².

15) Los números 3, 4 y 5 forman una terna pitagórica pues cumplen la propiedad de que A2
+ B2 = C2 donde A = 3, B = 4 y C = 5. Confeccione un programa para obtener las n
primeras ternas pitagóricas en las que C = B+1, o sea, donde C sea el sucesor de B y A
sea cualquier entero positivo.

16) Cuando a un alumno se le pidió que simplificara la fracción 16/64, sencillamente tachó el
6 del numerador y del denominador. Para asombro de su profesor, la técnica empleada
dio en este caso un resultado correcto.

16 1

64 4

Confeccione un programa que determine cuáles son las fracciones con numerador y
denominador de dos cifras para los cuales la técnica empleada anteriormente es válida.
NOTA: Imprima los resultados en forma de fracción.

17) Encuentre todas las parejas de números de dos cifras que tienen la siguiente propiedad.
Por ejemplo, sean los números 46 y 96, su producto no se altera aunque las cifras que lo
integran cambien de lugar.

18) Encuentre todas las parejas de números de dos cifras que tienen la siguiente propiedad.
Por ejemplo, sean los números 46 y 96, su producto no se altera aunque las cifras que lo
integran cambien de lugar.

Concurso de Computación “IPVCE Ernesto Guevara”


46 * 96 = 4416
64 * 69 = 4416

19) El 24 y 58 son dos números que si se suman el resultado es 82 así 24 + 58 = 82 si


buscamos relaciones entre los dígitos que forman esos números y a cada uno le
asignamos una variable la expresión anterior se puede generalizar de la siguiente
forma: ab + (b+1)c = ca. Haga el programa que permita determinar si existen mas
números que cumplan esta condición o si es solo una propiedad de los números
24 y 58.

20) Sean los números enteros A, B, C y D. Haga un programa que encuentre el número
más pequeño que dividido por cada uno de ellos de como resto A - 1, B - 1, C - 1,
D - 1.

21) Dados dos números naturales, se puede obtener un mínimo común múltiplo mediante
sumas sucesivas en dos acumuladores diferentes hasta obtener sumas iguales, cada
acumulador corresponde a uno de los números dados. Confeccione un algoritmo para
calcular el mcm de dos números cualesquiera empleando este método. Analizar los
siguientes ejemplos:

mcm (3, 4) = 12 ya que 3 + 3 + 3 +3 = 12 y 4 + 4+ 4 = 12


mcm (4, 6) = 12 ya que 6 + 6 = 12 y 4 + 4 + 4 = 12
mcm (4, 8) = 8 ya que 8 = 8 (se suma una sola vez) y 4 + 4 = 8

22) Confeccione un programa para imprimir todos los números de 5 cifras que cumplan las
condiciones siguientes: que se formen con las cifras 1, 2, 3, 4, 5 sin que alguna de ellas
se repita y que sean múltiplos de 5.

23) Confeccione un programa que encuentre todos los números de 6 cifras de la forma
a1a2a3a4a5a6 que son cuadrados prefectos y satisfacen la condición de a4a5a6 - a1a2a3 =
100.

24) Un número perfecto es un entero positivo, que es igual a la suma de todos los enteros
positivos (excluido el mismo) que son divisores del número. El primer número perfecto
es 6, ya que los divisores de 6 son: 1, 2, 3 y 1 + 2 + 3 = 6. Escribir un programa que
determine si un número es perfecto o no. De serlo al lado del número imprima los
divisores de él.

25) Confeccione un programa para hallar e imprimir los números naturales que cumplan
simultáneamente las condiciones siguientes: Se encuentren entre 1900 y 2000 Tengan
exactamente 4 divisores enteros positivos que son; 1, 5, otro número primo y el propio
número.

26) Con los números de 1 al 9 forme tres números de tres cifras cada uno de manera que:
no falte ningún número, no se repita ninguno, que la segunda cifra sea el doble de la
primera y la tercera el triplo de la primera. Confeccione un programa que imprima esos
números.

Concurso de Computación “IPVCE Ernesto Guevara”


27) Dados 4 dígitos diferentes y mayores que cero, imprima todos los números de 4 cifras
que es posible formar con ellos, con la condición de que ninguno de los dígitos puede
aparecer más de dos veces en un mismo número.

28) Halle todas las soluciones de la ecuación: ((A op1 B) op2 C) op3 D = E en la que A, B,
C, D, E son números reales que se lee como datos y op1, op2, op3 simbolizan en cada
caso cualquiera de las operaciones aritméticas fundamentales (+,-,*, /). Se admite la
aparición repetida de operaciones.

29) Los números feos son números cuyos únicos factores primos son 2, 3, ó 5. La
secuencia 1, 2, 3, 4, 5, 6, 8, 9,10,12,15, .... muestra los primeros N números feos. Por
convención se incluye el 1. Esto equivale a encontrar los números que se pueden
formar por 2a 3b 5c .Escriba un programa que encuentre e imprima el n-ésimo número
feo.

30) En una tira suficientemente larga se han escrito uno a continuación del otro, los
números desde 1 hasta 2000, formándose así un nuevo número natural N. Confeccione
un programa que permita imprimir que dígito ocupa la posición x en el nuevo número
natural.

31) En la teoría de los números se plantea que todo número natural N puede ser expresado
como suma de los cuadrados de a lo sumo 4 números.

Por ejemplo: 23 = 32 + 32 + 22 + 12

Encuentre todas las soluciones para que el número N dado se descomponga según se
explicó.

32) Considera la siguiente propiedad descubierta por Nicómaco de Gerasa: Sumando el


primer impar, se obtiene el primer cubo. Sumando los dos siguientes se obtiene el
segundo cubo. Sumando los tres siguientes, se obtiene el tercer cubo, etc. Es decir:

1 = 13,
3 + 5 = 23 = 8,
7 + 9 + 11 = 33 = 27,
13 + 15 + 17 + 19 = 43 = 64

Elabore un diagrama que dado un número n entero positivo, imprima los N primeros
cubos utilizando esta propiedad.

33) Confeccione un programa para imprimir todas las maneras en que puede expresarse un
número X empleando tres sumandos iguales relacionándolos convenientemente
mediante operadores aritméticos.

Ejemplo : 24 = 8 + 8 + 8

Concurso de Computación “IPVCE Ernesto Guevara”


34) Un cuadrado latino de orden n es un arreglo de orden n x n el cual contiene los números
1, 2, 3,..., tal que cada fila y columna contiene cada número exactamente una vez. Por
ejemplo un cuadrado latino de orden 4 es el que se muestra a continuación:

1234
2341
3421
4123
Confeccione un programa para construir un cuadrado latino si se conoce el mayor
valor que contendrá.

34) Imprima cada uno de los siguientes tipos de patrones por separado utilizando la menor
cantidad de instrucciones de impresión. Para generar los patrones use el caracter
asterisco. Debe pedir como dato de entrada la cantidad de filas del patrón.
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *

35) Imprima cada uno de los siguientes tipos de patrones por separado utilizando la menor
cantidad de instrucciones de impresión. Para generar los patrones use el caracter
asterisco. Debe pedir como dato de entrada la cantidad de filas del patrón.
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *

36) Escriba un programa que imprima la forma de la letra T siguiente, entrando como dato la
cantidad de asteriscos a utilizar en la fila más larga de la T y la cantidad de filas que
tendrá de altura.

********
********
**
**
**
**
**

37) Escriba un programa que imprima la forma de diamante siguiente, entrando como dato
la cantidad de asteriscos a utilizar en la fila central del diamante.
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*

Concurso de Computación “IPVCE Ernesto Guevara”


35) Si se realiza la suma de números consecutivos se obtiene un determinado valor. Por
ejemplo, en el intervalo [77, 90]

1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 = 78
2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 = 90

Entonces la suma tiene como máximo una cantidad de términos. En ambos casos del
ejemplo tiene 12 términos. Entrado un intervalo [A,B] calcular los n£meros que tienen la
mayor cantidad de t‚rminos en su suma, estando ese valor dentro del intervalo.

38) El Triángulo Parkside se genera a partir de dos números, el tamaño y la semilla. El


tamaño N (1 ≤ N ≤ 20) determina cuántas filas hay en el triángulo y la semilla S (1 ≤ S ≤
9) determina el primer número en el triángulo. La primera línea de cualquier triángulo no
tiene espacios en blanco al principio. Aquí hay dos ejemplos:

N=5, S=3 N=6, S=1

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

Después de analizar los ejemplos antes mostrado, descubra la regla, y escriba un


programa que generará el Triángulo Parkside dados cualquier tamaño N (1 ≤ N ≤ 20) y
cualquier semilla S (1 ≤ S ≤ 9).

39) Triángulo Ordenado: A continuación mostramos un triángulo numérico en el que N


números son colocados en un orden como usted puede percatarse en el ejemplo de
abajo

1
2 5
3 6 8
4 7 9 10

Este triángulo se construyó para N = 10.

Escriba un programa para generar un triángulo numérico para algún valor de N entrado
por teclado. Restricción de problema: En la confección del programa no se pueden
utilizar las facilidades de los formatos de escritura, ni de escritura en la memoria de
video u otra. No se pueden hacer uso de los arreglos.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 6: Arreglos unidimensionales.

Sumario:
- Declaración de arreglos de datos
- Comprender la necesidad de su uso.
- Búsqueda secuencial de un elemento.
- Creación de sublistas.
- Encontrar el mayor de una lista
- Ordenar una lista.

Un arreglo es una serie de elementos del mismo tipo ubicados en zonas de memoria
continuas que pueden ser referenciados por un índice y un único identificador, esto quiere
decir que podemos almacenar 10 valores enteros en un arreglo sin tener que declarar 10
variables diferentes.

Los arreglos unidimensionales son estructuras de datos caracterizadas por:

- Una colección de datos del mismo tipo.


- Son referenciados mediante un mismo nombre
- Almacenados en posiciones de memoria físicamente contiguas, de ahí que la posición más
baja corresponde al primer elemento y la mas alta al del ultimo elemento.
- El formato general de la declaración de una variable de este tipo es:
Tipo_de_datos Nombre_de_la_variable [tamaño]

6.1 Almacenamiento y utilización de los datos en un arreglo.

Ejemplo # 1
Dada las edades de N estudiantes determinar cuántos se encuentran por encima de la edad
promedio. (Necesidad de utilizar los arreglos).

#include <iostream>
using namespace std;
int n, s, e, Edad[30];
float p;
int main() {
cout << "Cantidad de estudiantes: ";
cin >> n;
s = 0;
cout << "Entrar edades" << endl;
for (int i = 1; i <= n; i++) {
cin >> Edad[i];
s = s + Edad[i];
}
p = s / n;
e = 0;
for (int i = 1; i <= n; i++)
if (Edad[i] > p) e++;

Concurso de Computación “IPVCE Ernesto Guevara”


cout << "Edades por encima del promedio " << e;
system ("pause > nul");
return 0;
}

Ejemplo # 2
Creación de un subarreglo a partir de un arreglo con aquellos elementos que sean menores
que el promedio.

#include <iostream>
using namespace std;
int n, s, e, Edad[30], SubList[30];
float p;
int main() {
cout << "Cantidad de estudiantes: ";
cin >> n;
s = 0;
cout << "Entrar edades" << endl;
for (int i = 1; i <= n; i++) {
cin >> Edad[i];
s = s + Edad[i];
}
p = float (s) / float (n);
e = 0;
for (int i = 1; i <= n; i++)
if (Edad[i] < p) {
e++;
SubList[e] = Edad[i];
}
cout << "Edades por encima del promedio " << p << endl;
for (int j = 1; j <= e; j++)
cout << SubList[j] << endl;
system ("pause > nul");
return 0;
}

6.2 Algoritmos básicos utilizando arreglos unidimensionales.

Ejemplo # 1
Hacer la búsqueda secuencial de un elemento en una lista de N elementos.

#include <iostream>
using namespace std;
int n, B, Lista[30];
bool f;
int main() {
cout << "Cantidad de elementos: ";
cin >> n;
cout << "Entrar elementos de la Lista" << endl;

Concurso de Computación “IPVCE Ernesto Guevara”


for (int i = 0; i < n; i++)
cin >> Lista[i];
cout << "Elemento a Buscar: ";
cin >> B;
f = false;
int i = 0;
do{
if (Lista[i] == B)
f = true;
else
i++;
} while (!f && i < n);
if (f)
cout << "E s t á";
else
cout << " No E s t á";
system ("pause > nul");
return 0;}

Ejemplo # 2
Encontrar el valor mayor de una lista de N elementos.

#include <iostream>
using namespace std;
int n, Mayor, Lista[30];
int main() {
cout << "Cantidad de elementos: ";
cin >> n;
cout << "Lista de Elementos" << endl;
for (int i = 0; i < n; i++)
cin >> Lista[i];
Mayor = Lista[0];
for (int i = 1; i < n; i++)
if (Lista[i] > Mayor) Mayor = Lista[i];
cout << "Mayor de la lista " << Mayor;
system ("pause > nul");
return 0;
}

Ejemplo # 3
Ordenar los elementos de una lista de N elementos encontrando el mínimo de los elementos
no procesados en cada iteración.

#include <iostream>
using namespace std;
int n, Lista[30];
int main() {
cout << "Cantidad de elementos: ";
cin >> n;

Concurso de Computación “IPVCE Ernesto Guevara”


cout << "Lista de Datos" << endl;
for (int i = 0; i < n; i++)
cin >> Lista[i];
int T;
for (int i = 0; i < n-1; i++)
for (int j = i+1; j < n; j++)
if (Lista[i] > Lista[j]) {
T = Lista[i];
Lista[i] = Lista[j];;
Lista[j] = T;
}
cout << "Lista Ordenada" << endl;
for (int j = 0; j < n; j++)
cout << Lista[j] << endl;
system ("pause > nul");
return 0;
}

6.3 Algoritmos que utilizan arreglos para generar combinaciones.

Ejemplo # 1

Obtener todos los números de tres cifras que sean divisibles por 17, y que se puedan
construir a partir de tres dígitos dados (supongamos que los mismos son 2,4, y 5). Entre los
números que se busca, se admite la repetición de dígitos.

#include <cstdio>
const
int d[3]= {2,4,5};
int num;
int main() {
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
for (int k=0; k<3; k++) {
num = d[i]*100 + d[j]*10 + d[k];
if (num % 17 == 0) printf ("%d \n", num);
}
return 0;
}

Ejemplo # 2

Supongamos ahora que tenemos otra lista de N números no repetidos y que nos interesa
obtener todas las sumas posibles de tres sumandos diferentes cada una. Pero, si ya hemos
considerado la suma x + y + z, queremos evitar considerar las equivalentes z + x + y, o y + x
+ z. Es decir, en este caso, el ORDEN de los elementos no determina que dos tríos sean
diferentes.

Concurso de Computación “IPVCE Ernesto Guevara”


#include <cstdio>
int A[30], suma, L;
int main() {
scanf ("%d", &L);
for (int i=0; i< L; i++)
scanf ("%d", &A[i]);
for (int i = 0; i < L-2; i++)
for (int j= i+1; j < L-1; j++)
for (int k = j+1; k < L; k++) {
suma = A[i] + A[j] + A[k];
printf("%d+%d+%d=%d\n", A[i], A[j], A[k], suma);
}
return 0;
}

Ejercicios Propuestos de Arreglos Unidimensionales

1) Dada una lista de números y dos valores A y B que representan un intervalo, encuentre
cuántos números de la lista están dentro del intervalo.

2) Implemente las siguientes operaciones básicas con arreglos unidimensionales


- Eliminar un elemento.
- Insertar un nuevo elemento.
- Modificar un elemento.
- Ordenar el arreglo completo.

3) Dada una lista de números cree una sublista con todos los números repetidos en la lista
original.

4) Haga el programa para convertir un número de decimal a binario.

5) Un equipo electrónico consta de un visor y dos únicos botones señalados con "1" y
"2". Al encender el equipo aparece el número 1 en el visor. Si se oprime el botón 1 el
número que está en la pantalla aumenta en uno, mientras que si se oprime el 2, el
número se duplica. Escribir un programa que ingresado un número natural N escriba en
una cadena la manera en que se deberán apretar los botones. Por ejemplo sea N igual a
25, lo botones deberán apretarse en el siguiente orden: "1-2-1-2-2-2-1".

6) Dado un arreglo de N elementos calcule la suma de todos los elementos del mismo que
sean mayores que su antecesor y menores que su sucesor.

7) Dada una secuencia de enteros S = s1, s2, ..., sn, determine si es posible dividir S en dos
partes: s1, s2, ..., si y si+1, si+2, ..., sn (1 <= i < n) de tal manera que la primera parte sea
una subsecuencia en orden descendente y la segunda en orden ascendente.

8) En un arreglo de N elementos positivos y negativos, imprima todos los tríos de números


que sumen 20.

Concurso de Computación “IPVCE Ernesto Guevara”


9) Dada una lista de números donde los dos primeros definen un intervalo, seleccione entre
los demás elementos de la lista los intervalos que contengan al anterior.

10) El Ordenamiento de Burbuja consiste en llevar a cabo varias pasadas a través de un


arreglo. En cada pasada, se comparan pares sucesivos de elementos y se intercambian
sus valores si no están en orden deseado. Una pasada se realiza hasta el último lugar
donde sucedió el último intercambio. Cuando no se produjeron intercambios en una
pasada el arreglo se encuentra ordenada.

11) Leer un arreglo de tamaño impar en el que sus elementos se encuentran


desorganizados. Se quiere ubicar los elementos del arreglo de manera tal que se
muevan la menor cantidad de elementos quedando los menores a la izquierda del
elemento medio y los mayores a la derecha.

12) Dado un arreglo de N elementos queremos implementar un desplazamiento de E


elementos a la izquierda del mismo. Sea el arreglo (4, 6, 2, 3, 8, 9) al desplazar sus
elementos 3 caracteres a la izquierda quedaría el arreglo de la siguiente manera (3, 8,
9, 4, 6, 2).

13) Dado un arreglo de N elementos queremos implementar un desplazamiento de E


elementos a la derecha del mismo. Sea el arreglo (4, 6, 2, 3, 8, 9) al desplazar sus
elementos 2 caracteres a la derecha quedaría el arreglo de la siguiente manera (6, 2, 3,
8, 9, 4).

14) Dado un arreglo de N elementos queremos mover una cantidad de elementos del
mismo insertándolos en otra posición. Sea el arreglo (1, 4, 6, 2, 3, 8, 9) al mover los tres
elementos que están a partir de la cuarta posición hacia la segunda posición quedaría el
arreglo de la siguiente manera (1, 2, 3, 8, 4, 6, 9).

15) La mediana de una lista de números es el elemento M de la lista tal que la mitad de los
elementos en el arreglo son mayores que o igual a M y la otra mitad son menores o
igual a M si el número de elementos de la lista es impar. Calcule la mediana para una
lista impar de elementos desordenados. No se puede ordenar la lista.

16) La moda de una lista es el elemento que más se repite. Si varios números se repiten
con igual frecuencia no existe moda. Calcule la moda o imprima un mensaje apropiado
en caso de que no exista.

17) Comience con cualquier número, digamos el 25. Encuentre la suma del cubo de los
dígitos de 25: 23 + 53 = 133. Repita el procedimiento con 133 para obtener 13 + 33 + 33 =
155. Continúe sumando los cubos de los dígitos individualmente para obtener el
próximo número hasta que se repita un número de la lista. Hacer un programa que
permita:

a) Entrar un número por teclado.


b) Imprimir por pantalla la lista de dígitos cúbicos.
c) Imprima la posición anterior en la lista donde se encuentra el número repetido.
d) Imprima la longitud de la lista.

Concurso de Computación “IPVCE Ernesto Guevara”


Ejemplo:

Entre el número: 25
Lista de Dígitos Cúbicos: 25 133 55 250 133
Posición anterior del número repetido: 2
Longitud de la Lista: 5

18) Dada una lista de números cualquiera, imprima todos los tramos de la misma,
ordenados de menor a mayor. Llamamos tramos a dos o más elementos consecutivos
de la lista.

Ejemplo:

Lista: 12 11 100 9 8 70 80 95 3
Tramos: 11 100 y 8 70 80 95

19) Dados N números enteros, y otro número natural M, con 0 < M < N imprima el único
número de la lista que tiene exactamente M menores que él en la misma.

Ejemplo # 1 Ejemplo # 2

Lista = 11 45 63 81 100 27 -3 -4 Lista = 1 1 1 1 1 1 1 1 1


M = 7, Resultado = 100 M = 3, Resultado = No tiene solución

20) Se tiene una lista de N números naturales positivos y no repetidos. Imprima la fracción
más próxima a 1, pero diferente de 1, que se puede construir con elementos de la lista.

Ejemplo:

Lista = 232 45 67 89 126


Resultado = 0.7528
Se forma con 67 / 89

Lista = 1 2 2 4 4 8 8 16
Resultado = 0.5
Se forma con 1 / 2; 2 / 4; 4 / 8; 8 / 16

21) Dada una lista de N números, en la que uno o más pueden estar repetidos,
encontrar las posiciones más alejadas entre si que contienen el mismo número.

Ejemplo:

Lista = 3 4 78 53 56 4 34 4 6 3
La posición más alejada es 9 entre los 3.

22) Dado un conjunto de números determine el mayor subconjunto posible de los números
que tienen las mismas cifras.

Concurso de Computación “IPVCE Ernesto Guevara”


Ejemplo:
Conjunto: 11200, 21101, 22010, 2201, 15314, 4531, 44511, 120
Respuesta: 11200, 21101, 22010, 2201, 120

23) Hay M soldados en un cerco y tienen un solo caballo. Para salir forman circularmente y
comienzan a contar inicialmente por un soldado elegido al azar. Cada N soldados uno
sale y el último que permanezca en el circulo se quedará con el caballo. Hacer un
programa que permita imprimir que soldado saldrá del cerco con el caballo si se conoce
la cantidad de soldados M y el incremento N en el conteo.

24) Dada una lista de N números no repetidos y nos interesa obtener todas las sumas de
los tres sumandos no necesariamente elementos distintos. Es decir, admitimos ahora
expresiones del tipo x+x+z, x+x+x o x+y+y.

25) Los números grandes (bignum) poseen muchas cifras. Dado dos números grandes de
hasta mil cifras cada uno queremos implementar las operaciones aritméticas de suma,
resta, multiplicación y división.

26) Se tiene una lista de N números positivos. Se desea imprimir todos los “tríos pitagóricos”
que se pueda obtener con elementos de la lista. (“trío pitagórico” es cualquier conjunto
de tres números positivos - a veces se agrega la condición de que sean naturales -
tales que el cuadrado de uno de ellos sea igual a la suma de los cuadrados de los otros
dos. Ejemplo: 3, 4,5.

27) El Tamiz de Eratóstenes es un método para encontrar los N primeros números primos.
Partiendo de un arreglo unidimensional donde se encuentran todos los numeros entre 2
y N, comenzamos tomando el numero dos y eliminamos todos los múltiplos de él que
aparecen en el arreglo. A continuación, se escoge el próximo elemento no eliminado en
el arreglo y se borran todos sus múltiplos si no han sido eliminados anteriormente. Los
números que queden en el arreglo son los números primos. Utilice un arreglo booleano
para marcar los números eliminados.

28) Dados N números naturales (N>5), imprima sin repeticiones todos los tríos posibles
tales que la suma de dos de esos números, divididos por un tercero, también de la lista,
den un resultado mayor que 1 y menor que 2. Cada número puede aparecer a lo sumo
una vez en un trío. Los tríos deben imprimirse en el orden 1er.sumando, 2do sumando,
divisor. A los efectos de este problema, a, b, c y b, a, c se consideran el mismo trío
(porque a + b es “lo mismo” que b + a), pero a, b, c y a, c, b son tríos diferentes.

29) Consideramos los números de Stirling de un conjunto de n elementos, al número total


de subconjuntos que podemos formar. Nos preguntamos cuántos conjuntos de k
subconjuntos podemos formar que excluyan el elemento vacío y la unión de ellos, nos
da el conjunto original. Estos números se denominan números de Stirling de segundo
orden. Para calcular S(n, k) se puede utilizar, al igual que los ejemplos anteriores la
siguiente recurrencia: S(n, k) = S(n − 1, k) + kS(n − 1, k). Hay que tomar en cuenta que
los límites son: S(n, 1) = 1, y S(n, n) = 1.

Concurso de Computación “IPVCE Ernesto Guevara”


30) Los primeros números Catalanes son los números 1,1,2,5,14,42,132,429… y están
asociados a la fórmula:
n-1

Cn = C k Cn-1-k
K=0

Número Catalán Valor


C0 1
C1 1
C2 C0 C1 + C1 C0 = 2
C3 C0 C2 + C1 C1 + C2 C0 = 5
C4 C0 C3 + C1 C2 + C2 C1 + C3 C0 = 14

31) Dados 8 números cualesquiera, distribuirlos en dos grupos de 4 elementos cada uno,
de modo que la diferencia entre las sumas de ambos grupos sea mínima.

32) Tenemos cuatro dígitos distintos de cero. Con ellos podemos formar dos números a y b
(a > b) utilizando los dígitos dados exactamente una vez. Escriba un programa para
calcular el valor de la posible mínima diferencia entre a y b. Ejemplo, sean los números
5, 9, 1 y 2 la mínima diferencia es 6, o sea, 25 – 19 = 6.

33) Todo número natural mayor uno que puede expresarse como producto de números
primos, por ejemplo:

180 = 22 * 32 * 5
216 = 23 * 33
270 = 2 * 33 * 5

Elabore un programa que dado un numero imprima su descomposición según se


explico. Observe que en los casos que el exponente es 1 este no se pone.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 7: Arreglos Bidimensionales, Matrices o Tablas.

Sumario:
- Declaración de arreglos bidimensionales.
- Acceso a los elementos.
- Operaciones con matrices.
- Arreglos de movimientos.

Ejemplo # 1
Almacenar las notas de M asignaturas pertenecientes a N estudiantes.

#include <cstdio>
#include <iostream>
using namespace std;
int n, m;
int Notas[100][15];
int main() {
cout << "Cantidad de estudiantes: ";
cin >> n;
cout << "Cantidad de asignaturas: ";
cin >> m;
cout << "Datos ";
for (int i = 1; i <= n; i++) {
cout << "Entrar Notas de Alumno " << i << endl;
for (int j = 1; j <= m; j++){
scanf ("%d", &Notas[i][j]);
}
}
cout << "Listado de promedios " << endl;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++){
printf("%5d", Notas[i][j]);
}
printf("\n");
}
system ("pause > nul");
return 0;
}

Ejemplo #2
Calcular los promedios de los N estudiantes de un grupo y almacenar sus promedios en un
arreglo.

#include <iostream>
using namespace std;
float n, m, s;
int Notas[100][15];
float p[100];
int main() {

Concurso de Computación “IPVCE Ernesto Guevara”


cout << "Cantidad de estudiantes: ";
cin >> n;
cout << "Cantidad de asignaturas: ";
cin >> m;
cout << "Datos ";
for (int i = 1; i <= n; i++) {
cout << "Entrar Notas de Alumno " << i << endl;
for (int j = 1; j <= m; j++){
cin >> Notas[i][j];
}
}
for (int i = 1; i <= n; i++) {
s = 0;
for (int j = 1; j <= m; j++)
s = s + Notas[i][j];
p[i] = s / m;
}
cout << "Listado de promedios ";
for (int i = 1; i <= n; i++)
cout << p[i] << endl;
system ("pause > nul");
return 0;
}

Ejemplo # 3: Sopa de letras, Buscar una palabra en una matriz de caracteres. La palabra
puede aparecer horizontalmente a la izquierda o hacia la derecha o verticalmente hacia
arriba o hacia abajo.

#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

const int
mf[4] = {1,-1,0,0},
mc[4] = {0,0,1,-1};

int cf,l,yes,cc,a,b,newf,newc;
char word[259],SL[259][259];
int main(){
scanf ("%d%d\n", &cf,&cc);
scanf ( "%s", &word );
l = strlen(word);
for (int i = 0;i < cf;i++){
scanf ("%s", &SL[i]); }
for ( int i = 0;i < cf;i++){
for (int j = 0;j < cc;j++){
if (SL[i][j] == word[0]){
a = i;

Concurso de Computación “IPVCE Ernesto Guevara”


b = j;
for ( int x = 0;x < 4;x++ ){
yes = 1;
newf = a + mf[x];
newc = b + mc[x];
for ( int y = 1;y < l;y++ ){
if (SL[newf][newc] == word[y]){
newf += mf[x];
newc += mc[x];
yes++;
if ( yes == l ){printf("yes");return 0;}
}else{break;}
}
}
}
}
}
printf ( "no" );
return 0;
}

Ejercicios

1) Dada una matriz de M filas y N columnas calcular:


a) El mayor por filas.
b) El menor por columnas.
c) El producto de la diagonal principal.
d) La suma de los elementos de la diagonal secundaria.
e) Producto de los elementos del triangulo superior.
f) Promedio de los elementos del triangulo inferior.
g) Buscar un elemento B en una columna C cualquiera.
h) Intercambiar el contenido de dos filas cualesquiera.
i) Intercambiar el contenido de dos columnas cualesquiera.

2) Una matriz identidad es aquella cuyos elementos en la diagonal principal, es decir,


accesibles con una expresión de la forma M[i][i], valen uno y el resto valen cero.
Construye una matriz identidad de n filas y m columnas.

3) Escribir un programa que determine la posición (fila y columna) de una matriz de M filas y
N columnas en la que se encuentra el valor máximo.

4) Realizar la suma para cada fila del triangulo inferior. Solamente se puede recorrer los
elementos de dicha parte de la matriz evitando así comparaciones innecesarias.

5) Escribir un programa que sume los datos de cada una de las columnas de una matriz de
M filas y N columnas; el resultado se almacenará en la última posición de cada columna.

6) Una matriz es diagonal superior si todos los elementos por debajo de la diagonal principal
son nulos. Diseña un programa que diga si una matriz es o no es diagonal superior.

Concurso de Computación “IPVCE Ernesto Guevara”


7) Diseña un programa que lea una matriz y un número y devuelva una nueva matriz: la que
resulta de multiplicar la matriz por el número. (El producto de un número por una matriz
es una nueva matriz que resulta de multiplicar cada elemento por dicho número)

8) La transpuesta de una matriz A de dimensiones m × n es una nueva matriz de


dimensiones n x m en la los filas pasan a ser las columnas y viceversa.

9) Escribir un programa que calcule los puntos de silla de una matriz de enteros. Un
elemento de una matriz es un punto de silla si es el mínimo de su fila y el máximo de su
columna.

10) Escribir un programa que determine si una matriz es simétrica.

11) Diseña un programa que determine si una matriz es prima o no. Una matriz A es prima
si la suma de los elementos de cualquiera de sus filas es igual a la suma de los
elementos de cualquiera de sus columnas.

12) Genere una tabla de números impares que tengan como máximo M filas y N columnas y
con ella:
a) Dado un elemento diga (si los tiene) los vecinos Nortes, Sur, Este y Oeste.
b) Dada una fila de la matriz calcule la suma de los elementos que integran dicha fila.

13) En la terminal de contenedores del puerto de la Habana se almacenan 9 contenedores,


en cualquier orden en una matriz de 3 filas y 3 columnas. Una empresa realizará la
extracción de dos contenedores A y B de los cuales se conocen sus números. Para
manipular los contenedores se emplea una grúa que puede cargar solamente un
contenedor en cada operación que realice. Por otra parte, el reglamento de operaciones
de la terminal establece que el número máximo de contenedores a situar en una pila no
puede ser mayor que cuatro y que no peden formarse pilas adicionales. Imprimir el
orden de las operaciones que debe realizar la grúa para extraer los contenedores
especificando en cada línea de la salida el numero del contenedor y la pila hacia donde
se movió o el numero del contenedor solamente si se pudo extraer del puerto.

14) Genere una matriz que contenga N filas de un triángulo numérico construido como el
que aparece a continuación:

1
2 3 2
3 4 5 4 3
4 5 6 7 6 5

15) En una matriz de NxN se han colocado los números de 1 al N de tal manera que si
usted comienza por el números N puede encontrar un camino descendente desde N
hasta 1 que contenga a todos los números. Imprima la fila y la columna de todos los
elementos del camino.

Concurso de Computación “IPVCE Ernesto Guevara”


16) Realizar la multiplicación de dos matrices.
| a11 a12 | | b11 b12 | a11 * b11  a12 * b21 a11 * b12  a12 * b22
| a 21 a 22 | | b21 b22 | a 21 * b11  a 22 * b21 a 21 * b12  a 22 * b22

17) Encontrar la mayor suma posible desde la parte superior del triangulo hasta la base del
mismo, sumando cada número con el que aparece debajo o a la derecha del mismo en
la fila siguiente. Para la solución siempre escogerá el mayor valor de los dos posibles
para cada número que se analice en la matriz.

18) Encontrar la mayor suma posible desde la base del triángulo hasta el vértice superior de
los números que se colocaron en una matriz con forma de triángulo, sumando cada
número con el que aparece arriba o a la derecha del mismo en la fila anterior.

9
8 2
5 6 3
2 4 1 6
7 1 2 4 1
La suma mayor seria: 7+ 4 + 6 + 8 + 9 = 34.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 8: Entrada y Salida por ficheros textos.

Sumario:
- Abrir un fichero en lectura o en escritura.
- Definir la manera de acceder al fichero.
- Cerrar el fichero.
- Diferentes formas.

8.1 Forma más sencilla de realizar la entrada y salida

#include <stdio.h>
freopen( "TEST.IN", "r", stdin );
freopen( "TEST.OUT", "w", stdout );

scanf ("%d", &n);


printf ("%d\n", sum);

Ejemplo: Calcular el promedio de las notas de cada estudiante de un grupo. Los datos de
entrada se leerán desde el fichero de entrada TEST.IN que tiene la siguiente estructura. En
la línea 1: N y M los cuales representan la cantidad de estudiantes y la cantidad de notas
respectivamente. De la línea 2 a la M, en cada fila aparecerán M elementos separados por
espacios los cuales representan las notas de un estudiante. Los promedios se escribirán
hacia el fichero de salida TEST.OUT colocando uno en cada fila.

#include <stdio.h>
#include <iostream>
using namespace std;
int n, m;
float Notas[100][15];
float p, s;
int main() {
freopen ("test.in", "r", stdin);
freopen ("test.out", "w", stdout);
scanf ("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++){
scanf ("%f", &Notas[i][j]);
}
}
for (int i = 0; i < n; i++) {
s = 0;
for (int j = 0; j < m; j++)
s += Notas[i][j];
p = s / m;
printf ( "%.2f\n", p);
}
system ("pause > nul");
return 0;}

Concurso de Computación “IPVCE Ernesto Guevara”


8.2 Otras maneras de realizar la entrada y salida.

Forma # 1

#include <stdio.h>
FILE *fin = fopen ("bigdance.in", "r");
FILE *fout = fopen ("bigdance.out", "w");
fscanf (fin, "%d", &n);
fprintf (fout, "%d\n", sum);

También pudo ser escrita las instrucciones de abrir el fichero de esta manera:
FILE *fin = fopen ("dance2.in", "r"), *fout = fopen ("dance2.out", "w");

Forma # 2

in = fopen("ADN.IN", "rt");
out = fopen("ADN.OUT", "wt");
fscanf(in, "%d", &n);
fscanf(in, "%s", text); tlen = strlen(text);

Forma # 3

in = stdin; out = stdout;


fscanf(in, "%d", &n);
fscanf(in, "%s", text);

Ejemplo utilizando la Forma # 1


Calcular la suma de cada elemento de cada fila de una matriz. Los datos de entrada se
leerán desde el fichero TEST.IN que tiene la siguiente estructura. En la línea 1: N y M. De la
línea 2 a la M, en cada fila aparecerán M elementos separados por espacios. Los promedios
se escribirán hacia el fichero de salida TEST.OUT colocando uno en cada fila.

#include <stdio.h>
#include <iostream>
using namespace std;
int n, m;
float Notas[100][15];
float p, s;
int main() {
FILE *fin = fopen ("test.in", "r");
FILE *fout = fopen ("test.out", "w");
fscanf (fin, "%d%d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++){
fscanf (fin, "%f", &Notas[i][j]);
}
}
fclose (fin);

Concurso de Computación “IPVCE Ernesto Guevara”


for (int i = 0; i < n; i++) {
s = 0;
for (int j = 0; j < m; j++)
s += Notas[i][j];
p = s / m;
fprintf (fout, "%.2f\n", p);
}
fclose (fout);
system ("pause > nul");
return 0;}

Cuando no conocemos la cantidad de elemento a leer de un fichero, entonces podemos


utilizar la función feof para realizar la lectura mientras no se ha encontrado el fin del fichero.

#include <stdio.h>
int main(){
FILE *in,*out;
int a,b;
in = fopen("data.in","r");
out = fopen("data.out","w");
while(!feof(in)){
fscanf(in,"%d %d\n",&a,&b);
fprintf(out,"%d\n",a+b);
}
return 0;
}

Ejemplo de Revisador
A menudo es necesario crear un programa revisor para chequear si la solución generada por
algún programa está correcta.

#include <cstdio>
#include <cmath>
double f1, f2;
int main (int count, char **param) {
FILE *in1, *in2;
if (count == 1) printf("Use: rev_6a salida1 salida2\n");
else {
in1 = fopen(param[1], "r");
in2 = fopen(param[2], "r");
if (in1 == NULL)
{printf("El fichero %s no existe\n", param[1]); return 0;}
if (in2 == NULL)
{printf("El fichero %s no existe\n", param[2]); return 0;}
int i = 1;
while (fscanf(in1, "%lf", &f1)!=EOF &&
fscanf(in2, "%lf", &f2)!=EOF){
if (fabs(f1-f2) > 0.001) {
printf("Diferencia mayor de 0.001 en linea %d\n", i);

Concurso de Computación “IPVCE Ernesto Guevara”


return 0;}
i++;
}
printf("OK");
fclose(in1);
fclose(in2);
}
}

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 9: Tratamiento de cadenas de caracteres.

Sumario:
- Concepto de cadenas.
- Funciones para el tratamiento de cadenas.

Los arreglos de caracteres almacenan secuencias de caracteres y después del último, se


escribe el carácter nulo '\0' (backslash, cero) utilizado como una señal del fin de la secuencia
valida.

En C, existen varias funciones útiles para el manejo de cadenas de caracteres. Las más
utilizadas son: strlen(), strcat(), strcmp() y strcpy(). Sus prototipos o declaraciones están en la
biblioteca <cstring> y son los siguientes (se incluye a continuación una explicación de cómo
se utiliza la función correspondiente).

- strlen para obtener la longitud de la cadena, sin contar el carácter nulo,


- strcat para concatenar dos cadenas,
- strcmp para comparar dos cadenas,
- strcpy para copiar una cadena en otra,
- strncpy para copiar los n primeros caracteres de una cadena en otra.

Función Sintaxis Ejemplo Respuesta


Strlen Strlen (Cadena) L = strlen(Text1) l=8
Strcat Strcat (Cad1,Cad2) Strcat(Text1, Text2) Concurso3C
Strcmp Strcmpt (Cad1,Cad2) Strcmp (Cad1 ,Cad2) 0, desigual de 0
Strcpy Strcpy (Cad1, Cad2); strcpy(texto3, "IPVCE"); IPVCE
strncpy strncpy(Cad1, Cad2, n); strncpy(texto3, texto1, 4); Conc
Atoi Atoi (strdos) Num = atoi(strdos); Num = 100
Itoa Itoa (número ,Cad, base) Itoa(numero ,Cad, 10);
Strupr Strupr (Cad) strupr(texto1) CONCURSO

char Text1[] = "Concurso";


char Text2[2] = "3C";
char Num[3] = "100";
int numero = 60;

Ejemplo # 1
Confeccionar un programa que permita leer un número y escribir si es mayor leído de
izquierda a derecha o en caso contrario.

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const
int MAXN = 100;
char S[MAXN];
int N, i, j, k;

Concurso de Computación “IPVCE Ernesto Guevara”


int main() {
gets(S);
N = strlen(S);
k = N - 1;
for ( i = 0; i < N; i++, k-- ) {
if ( S[i] != S[k] ) {
if ( S[i] < S[k] )
puts( "Es mayor al reves" );
else
puts( "Es mayor al derecho" );
return 0;
}
}

Ejemplo # 2

Determine si una palabra aparece en una frase dada. El programa emplea la función de
comparación de cadenas strcmp, dicha función devuelve 0 en caso de que las cadenas
comparadas sean iguales

#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MAXLIN 100
int main() {
char pal[MAXLIN];
char palfrase[MAXLIN];
int total = 0;
printf( "Frase: ");
gets (palfrase);
printf( "Palabra: " );
gets (pal);
if (strcmp(pal, palfrase) == 0)
printf( "La palabra aparece en la frase.");
else
printf( "La palabra aparece en la frase.");
system ("pause");
return 0;
}

Ejemplo # 3

Leer dos cadenas de caracteres, las concatena y convierte las letras minúsculas en
mayúsculas y viceversa, y finalmente escribe la cadena resultante.

#include <cstdio>
#include <cstring>
#include <cstdlib>
int main(){

Concurso de Computación “IPVCE Ernesto Guevara”


char cad1[80], cad2[80], cad3[160];
int i, delta;
printf( "Primera cadena: " );
gets(cad1);
printf( "Segunda cadena: " );
gets( cad2 );
strcpy( cad3, cad1 );
strcat( cad3, cad2 );
i=0;
delta = 'a' - 'A';
while (cad3[i] != '\0'){
if ((cad3[i] >= 'a') && (cad3[i] <= 'z'))
cad3[i] -= delta; /* Convierte a mayúuscula */
else
if ((cad3[i] >= 'A') && (cad3[i] <= 'Z'))
cad3[i] += delta; /* Convierte a minúuscula */
i++;
}
printf( "La cadena resultante es: %s", cad3 );
system ("pause");
return 0;
}

Ejercicios Propuestos

1) Diseñe un programa que solicite la lectura de un texto que no contenga letras


mayúsculas. Si el usuario introdujo alguna letra mayúscula, el programa solicitara
nuevamente la introducción del texto cuántas veces sea necesario.

2) Sea una cadena de hasta 12 dígitos de números formar otra cadena con los números de
la anterior separando por coma los miles, millones y así sucesivamente.

3) Haz un programa que lea dos cadenas que representen a números binarios. El
procedimiento de suma con acarreo que implementes deberá trabajar directamente con la
representación binaria.

1010
1011
--------
10101

4) Dados los 11 dígitos del carné de identidad determine cuántos años tiene esa persona y
la fecha de nacimiento en el formato Día, Mes y Año.

5) Determinar cuántas palabras contiene una frase.

6) Dado un entero positivo x la palabra Wo...ow (la letra o tiene que estar repetida x veces).
Para x igual a 7 la respuesta sería Wooooooow.

Concurso de Computación “IPVCE Ernesto Guevara”


7) Escribir un programa que cuente el número de palabras de más de cuatro caracteres en
una frase.

8) Escribir un programa que lea del teclado dos números enteros de hasta 20 dígitos y los
sume. Utilice cadena para almacenar los dígitos de cada número.

9) Escribir un programa que decida si una palabra es palíndrome o no.

10) Entrada una cadena por teclado y valide si corresponde o no con un número.

11) Escribir un programa que, dada una cadena de caracteres y un entero correspondiente
a una posición valida dentro de ella, genere una nueva cadena de caracteres que
contenga todos los caracteres a la izquierda de dicha posición, pero en orden inverso.

12) Escribir un programa que, dada una cadena de caracteres, la limpie de caracteres
blancos. Por ejemplo, la cadena "Esto es una frase" deberá transformarse en
"Estoesunafrase". Escribir dos versiones, una utilizando una cadena auxiliar y otra
versión que realice los cambios sobre la misma cadena.

13) Escribir un programa que lea dos cadenas de caracteres, las compare e informe de si
son iguales o diferentes. No usar la función de la librería estándar strcmp.

14) Hay un tipo de pasatiempos que propone descifrar un texto del que se han suprimido
las vocales. Por ejemplo, el texto ((.n .j.mpl. d. p.s.t..mp.s)), se descifra sustituyendo
cada punto con una vocal del texto. Diseña un programa que ayude al creador de
pasatiempos. El programa recibiría una cadena y mostraría otra en la que cada vocal ha
sido reemplazada por un punto.

15) Lea una cadena de caracteres formadas por los caracteres 1 y 2. Cada vez que
aparezca un 1 en la cadena se suma un 1 y cada vez que aparezca un 2 se multiplica
por 2 el número acumulado hasta ese momento. Haga un programa que entrada una
cadena de 1 y 2 imprima el resultado según el método explicado.

16) Diseña un programa que lea una cadena y un número entero k y nos diga cuántas
palabras tienen una longitud de k caracteres.

17) Diseña un programa que lea dos cadenas a y b y nos diga si b es un prefijo de a o no.
(Ejemplo:’sub’ es un prefijo de ’subcadena’.).

18) Diseña un programa que lea dos cadenas a y b y nos diga si b es una subcadena de a o
no.(Ejemplo:’de’ es una subcadena de ’subcadena’.).

19) Diseña un programa que lea dos cadenas y devuelva el prefijo común más largo de
ambas. (Ejemplo: las cadenas ’politécnico’ y ’polinización’ tienen como prefijo común
más largo a la cadena ’poli’).

Concurso de Computación “IPVCE Ernesto Guevara”


20) Diseña un programa que lea tres cadenas y muestre el prefijo común más largo de
todas ellas. (Ejemplo: las cadenas ’politécnico’, ’polinización’ y ’poros’ tienen como
prefijo común más largo a la cadena ’po’.)

21) Diseña un programa que muestre la cantidad de números que aparecen en una cadena
leída de teclado. Entiéndase por números a una secuencia de dígitos.

22) Una de las técnicas de criptografía más rudimentarias consiste en sustituir cada uno de
los caracteres por otro situado n posiciones más a la derecha. Si n= 2, por ejemplo,
sustituiremos la ((a)) por la ((c)), la ((b)) por la((e)), y así sucesivamente. El problema
que aparece en las últimas n letras del alfabeto tiene fácil solución: en el ejemplo, la
letra ((y)) se sustituirla por la ((a)) y la letra((z)) por la((b)). La sustitución debe aplicarse
a las letras minúsculas y mayúsculas y a los dígitos (el ((0)) se sustituye por el((2)), el
((1)) por el((3)) y así hasta llegar al((9)), que se sustituye por el ((1))). Diseña un
programa que lea un texto y el valor de n y muestre su versión criptografiada.

23) Diseña un programa que lea un texto criptografiado siguiendo la técnica descrita en el
apartado anterior y el valor de n utilizado al encriptar para mostrar ahora el texto
decodificado.

24) Diseña un programa que indique si una cadena leída por teclado está bien formada
como número flotante. Todos estos casos estarían correctamente formados:’3.1’, ’3.’,
’.1’, ’1e+5’, ’-10.2E3’, ’3.1e-2’, ’.1e01’.

25) Disponemos de una cadena que contiene una frase cuyas palabras están separadas por
un número arbitrario de espacios en blanco. Queremos arreglar la frase de tal manera
que no empiece ni acabe con espacios en blanco y que cada palabra se separe de la
siguiente por un único espacio en blanco.

26) Evaluar una cadena polaca (los operandos aparecen antes que el operador). Para este
ejercicio los operandos serán solamente dígitos.

27) Dada una lista de números de teléfonos (6 cifras) determinar cuántos de ellas tienen sus
cifras diferentes.

28) Dada una frase calcule cuántas mayúsculas, minúsculas y vocales tiene dicha frase.

29) Dado un número, sumamos sus cifras en las posiciones impares por un lado y las de las
posiciones pares por el otro. Luego se resta el resultado de ambas sumas obtenidas. Si
el resultado es cero (0) o un múltiplo de 11, el número es divisible por éste. Haga un
programa que dado un numero determine si es divisible por 11.

30) Criterio de divisibilidad por 13. Para números de 3 cifras: al número formado por las dos
primeras cifras se le suma la última multiplicada por 4. Si el resultado es múltiplo de 13,
el número original también lo es. Ejemplo el 364 lo es porque 36+4*4= 52 es múltiplo de
13. Para números de más de 3 cifras: Dividir en grupos de 3 cifras, sumar y restar
alternativamente los grupos de derecha a izquierda y aplicar el criterio de arriba al

Concurso de Computación “IPVCE Ernesto Guevara”


resultado obtenido. Si es múltiplo de 13, el número original también lo es. 432549:
porque 549-432 = 117 y luego 11 + 4·7 = 39 es múltiplo de 13.

31) Dada una frase en la que aparecen diferentes signos de puntuación y espacios
separando las palabras calcule cuántas palabras tiene dicha frase.
32) Dada una frase escrita en mayúsculas y minúsculas haga un programa que permita:
a) Convertir de mayúsculas a minúsculas.
b) Convertir de minúsculas a mayúsculas.

33) Convierta un determinado número de:


a) Binario a decimal.
b) Decimal a binario.
c) Hexadecimal a decimal.
d) Decimal a hexadecimal.

34) Dada una frase y una palabra eliminar todas las ocurrencias de dicha palabra en la
frase. Imprima la frase modificada.

35) Necesitamos construir todos los números de cuatro dígitos con los dígitos 2, 3 y 5, de tal
manera que los dígitos siempre aparecen una o dos veces.

36) Una palabra es palíndrome si leída de izquierda a derecha y de derecha a izquierda


resulta la misma palabra, ejemplo: ANA, ABBA. Construir una función booleana que
devuelva verdadero si la palabra es palíndrome y falso en caso contrario.

37) Dada una lista de nombres masculinos de una sola palabra (Ej.: Carlos, Alberto,
Roberto) obtener todos los nombres compuestos diferentes que sea posible (cada
nombre compuesto se formar con 2 nombres simples), con la condición de que ambos
nombres no comiencen con la misma letra.

38) Dada una oración, imprima en pantalla y separando las letras por un espacio, la palabra
más larga. (Si hubiera dos o más de longitud máxima, tome la situada más a la derecha
en la oración). A continuación, seleccione de las restantes palabras, aquellas que
podrían “cruzarse” con la más larga seleccionada, si se imprimieran en forma vertical.
En esa selección, tienen prioridad las palabras más largas. Dos palabras “verticales” no
se pueden cruzar sobre letras consecutivas de la palabra horizontal.

Imprima como lo muestra el ejemplo: Oración dada: este es un ejemplo sencillo


Impresión: sencillo
2 3 1
1 – ejemplo
2 – este
3 – un
No se pudo cruzar: es

Observe que “es” no se puede “cruzar” con la “e” de sencillo, porque al lado cruza
“este”, que tiene prioridad por ser más larga.

Concurso de Computación “IPVCE Ernesto Guevara”


39) Dada una cadena que corresponde a un número romano (caracteres I, V, X, L, C, D y
M) conviértala a decimal. Como regla general, los símbolos se escriben y leen de
izquierda a derecha, de mayor a menor valor. El valor de un número se obtiene
sumando los valores de los símbolos que lo componen, salvo en las siguiente
excepciones:
- Si un símbolo de tipo 1 está a la izquierda inmediata de otro de mayor valor, se resta
al valor del segundo el valor del primero. Ej. IV=4, IX=9.
- Los símbolos de tipo 5 siempre suman y no pueden estar a la izquierda de uno de
mayor valor.
- Se permiten a lo sumo tres repeticiones consecutivas del mismo símbolo de tipo 1.
- No se permite la repetición de una misma letra de tipo 5, su duplicado es una letra de
tipo 10.
- Si un símbolo de tipo 1 aparece restando, sólo puede aparecer a su derecha un sólo
símbolo de mayor valor.
- Si un símbolo de tipo 1 que aparece restando se repite, sólo se permite que su
repetición esté colocada a su derecha y que no sea adyacente al símbolo que resta.
- Sólo se admite la resta de un símbolo de tipo 1 sobre el inmediato mayor de tipo 1 o
de tipo 5. Ejemplos: el símbolo I sólo puede restar a V y a X, el símbolo X sólo resta a
L y a C además el símbolo C sólo resta a D y a M.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 10: Subprogramas. Soluciones reusables.

Sumario:
- Declaraciones de funciones.
- Transferencia de parámetros por valor y por referencia.
- Variables locales y globales.
- Formas de llamada.

10.1 Declaración de funciones.

Ejemplo # 1: (Traspaso de parámetros por valor)


Hacer una función para sumar dos números

#include <iostream>
using namespace std;
int addition (int a, int b){
int r;
r = a + b;
return (r);
}
int main (){
int a, b, z;
cin >> a, b;
z = addition (5,3);
cout << "The result is " << z;
return 0;
}

10.2 Traspaso de parámetros por valor.

Ejemplo # 1:
Hacer una función que calcule la distancia entre dos puntos.

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
float Distancia (float x1, float y1, float x2, float y2) {
float Dist = sqrt (pow(x1 - y1, 2) + pow(x2 - y2, 2));
return Dist;
}
int main (){
float a, b, c, d, D;
cout << "Punto 1: ";
cin >> a >> b;
cout << "Punto 2: ";
cin >> c >> d;
D = Distancia (a, b, c, d);
cout << "El distancia entre los dos puntos es " << D;

Concurso de Computación “IPVCE Ernesto Guevara”


system ("pause > nul");
return 0;
}

Ejemplo # 3: Dado un número determine si el mismo es primo o no lo es. Construir una


función booleana que devuelva verdadero si el número es primo y falso en caso contrario.

#include <iostream>
using namespace std;
bool EsPrimo (double n) {
if (n % 2 == 0)
return false;
int sqrtI = int( sqrt( (double) n) );
for (int i=3; i < sqrtI; i += 2)
if (n % i == 0)
return false;
return true;
}
int main(void) {
double num;
cin >> num;
if (EsPrimo(num))
cout << "Es Primo";
else
cout << "No es Primo";
return 0;
}

10.3 Traspaso de parámetros por referencia.

Ejemplo # 1: . Construir una función para intercambiar el contenido de dos variable.

Void Swap(int& a, int& b){


int T;
T = a;
a = b;
b = T;}

En la declaración de Swap cada parámetro está seguido por un signo de ampersan (&). Este
signo & especifica que su correspondiente argumento es traspasado por referencia en lugar
de por valor. Cuando una variable se pasa por referencia se pasa la variable misma y no una
copia de ella, por tanto cualquier modificación que se le haga a los parámetros de la llamada
son modificados.

Ejemplo # 2
Recorrer una cadena y formar otra con los números que encuentren en ella.

#include <cstdio>
#include <stdlib.h>

Concurso de Computación “IPVCE Ernesto Guevara”


#include <string.h>
#include <string>
using namespace std;
int i, l1, l2;
char StIn[100], StNum[100], StChar[100];
char *s;
string a, b;
void GetString() {
printf( "Texto : " );
scanf( "%s", StIn );
}
void SubString() {
for ( i = 0; i < strlen( StIn ); i++ ) {
if ( StIn[i] >= 'a' && StIn[i] <= 'z' )
StChar[l1++] = StIn[i];
if ( StIn[i] >= '0' && StIn[i] <= '9' )
StNum[l2++] = StIn[i];
}
}
void PrnString( char *Cartel, char *StPrn ) {
printf( "%s %s\n", Cartel, StPrn );
}
int main() {
GetString();
SubString();
PrnString( "Cadena de Numeros = ", StNum );
PrnString( "Cadena Alfab‚tica = ", StChar );

a = StNum;
system( "pause" );
return 0;
}

Ejercicios Propuestos

1) Implemente las siguientes funciones:


a) Sucesor
b) Predecesor.

2) Implemente las siguientes funciones de incremento que permitan aumentar el valor de


una variable en cualquier cantidad y respondan a cada una de las siguientes llamadas.
a) y = Inc (x, 3);
b) IncP (y, 4);

3) Utilizando la función para calcular el MCD resuelva los siguientes problemas:


a) Sumar dos fracciones y escribir el resultado en su forma irreducible.
b) Haga un programa que calcule el máximo común divisor de tres números.

Concurso de Computación “IPVCE Ernesto Guevara”


4) Implemente la función Pow (x, p) la cual debe elevar la variable entera x a cualquier
potencia entera p.

5) Diseña un programa que, dados cinco puntos en el plano, determine cuál de los cuatro
últimos puntos es más cercano al primero. Un punto se representaría con dos variables:
una para la abcisa y otra para la ordenada. Construya una función para determinar la
distancia entre los dos puntos.

6) La última letra del DNI puede calcularse a partir del número. Para ello solo tienes que
dividir el número por 23 y quedarte con el resto, que es un número entre 0 y 22. La letra
que corresponde a cada numero la tienes en esta tabla:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
T R W A G M Y F P D X B N J Z S Q V H L C K E
Define una función que, dado un número de DNI, devuelva la letra que le corresponde.

7) Calcular el valor de Pi implementando las funciones respectivas para cada uno de los
métodos estudiados anteriormente:
a) Método de Wallis.
b) Método de Liepnitz.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 11: Recursividad Lineal.
Sumario:
- Introducción al concepto.
- Partes de una función recursiva.
- Variables locales y globales.
- Uso de la pila.

Consejos Prácticos sobre la recursividad

1. Determinar que instancia del problema puede servir como caso base.
2. Entonces asuma que sabe como resolver el problema de tamaño n-1, y busque una
manera de obtener la solución para el problema de tamaño n a partir de la solución de
tamaño n-1.
3. Como puedo definir el problema en términos de uno más pequeño del mismo tipo, en el
que cada llamada recursiva disminuye el tamaño del problema hasta alcanzar el caso
base.

Los subprogramas recursivos deben contener siempre las dos partes:

- Una llamada a si misma (recursiva), normalmente con el valor de los parámetros que
cambian en cada autollamada.
- Una condición de terminación o salida (caso base), la que no produce ninguna
autollamada.

Ejemplo # 1:
La notación matemática que define el factorial puede ser presentada como:

n! = 1 si n = 0
n! = n * (n - 1)! si n>0

Veamos como se puede utilizar la definición recursiva de la función factorial para evaluar 5!.
La definición establece que 5!, es igual a 5 * 4!. Por tanto antes de evaluar 5! debemos
evaluar 4!. Una vez más utilizando la definición, encontramos que 4! = 4 * 3!. Por tanto,
debemos evaluar 3!. Repitiendo este proceso tenemos que:

(1) 5! = 5 * 4!
(2) 4! = 4 * 3!
(3) 3! = 3 * 2!
(4) 2! = 2 * 1!
(5) 1! = 1 * 0!
(6) 0! = 1

Cada caso se reduce a un caso simple hasta que llegamos al caso 0! el cual es por supuesto
1. En la línea (6) tenemos un valor que es definido directamente y no como el factorial de un
número. Por consiguiente podemos devolvernos de la linea 6 a la linea 1,
retornando el valor computado en una linea para evaluar el resultado de la línea anterior.

Concurso de Computación “IPVCE Ernesto Guevara”


Este procedimiento recursivo puede ser traducido a una función en:

double Fact(double n) {
if (n == 0)
return 1;
else
return n * Fact(n - 1);
}

Ejemplo # 2
Escriba una función recursiva para determinar el n-esimo número de Fibonacci. Se define
como:
Fib(n) = n si n = 0 ó 1
Fib(n) = Fib(n-2) + Fib(n-1) si n>=2

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
long Fib(long n) {
if (n == 0 || n == 1)
return n;
else
return Fib(n-1) + Fib(n-2);
}
int main (){
long f;
cout << "Número: ";
cin >> f;
cout << "El n-esimo Fibonacci es " << Fib(f);
system ("pause > nul");
return 0;
}

Ejemplo # 3
Imprimir en orden inverso todos los elementos de un arreglo unidimensional

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
const
int A[6] = {1,2,3,4,5,6};
void Invertir(int n) {
if (n < 6){
Invertir(n+1);
printf ("%d", A[n]);
}
return;

Concurso de Computación “IPVCE Ernesto Guevara”


}

int main (){


Invertir (0);
system ("pause > nul");
return 0;
}

Ejercicios Propuestos

1) La definición recursiva de an es:

1 n = 0
an =
a * a(n-1) n > 0

2) La función de Ackerman se define en forma recursiva para enteros no negativos de la


siguiente manera:

A(m, n) = n + 1 si m = 0
A(m, n) = A(m-1, 1) si m <> 0, n = 0
A(m, n) = A(m-1, A(m, n-1)) si m <> 0, n <> 0

a) Utilice la definición y demuestre que A(2, 2) = 7.


b) Programe dicha función recursivamente.
c) Puede encontrar un método iterativo para calcular A(m, n).

3) El máximo común divisor (Teorema de Euclides) para cualesquiera dos enteros no


negativos a y b está definido como

mcm(M,N) = N si N divide a M, sino


mcm(M,N) = mcm(N, M%N)

4) Para los dos casos siguientes hallar C(m,n) dados m y n Definamos las fórmulas
combinatorias C(m,n) como:

a) C(m,n) = 1, si m=n ó n=0


C(m,n) = 0, si m<n
C(m,n) = C(m-1,n-1) + C(m-1,n) , en los restantes casos

b) C(m,n)=1 , si m=n ó n=0


C(m,n)=0 , si m<n
C(m,n)=(m-n)/n * C(m,n-1)

Concurso de Computación “IPVCE Ernesto Guevara”


5) Escriba las funciones, una recursiva y otra no recursiva, tal que dado un entero positivo X
devuelva verdadero si y solo si X es una potencia de 2.

6) Dado una cadena de caracteres determinar si es o no palíndrome, utilizando la siguiente


definición recursiva: una cadena es palíndrome si los caracteres de los extremos son
iguales y la subcadena interior es palíndrome.

7) La siguiente función recursiva para calcular el máximo común divisor entre dos enteros
positivos.

8) Escribe una función recursiva que dado un numero decimal lo convierta a binario (no
dejes ceros a la izquierda).

9) Queremos hacer una función recursiva que encuentre el numero de diferentes comités de
k personas que pueden ser formados, dado n personas para escoger. Por ejemplo, para
comités de 3 personas de 4 a escoger se pueden formar 4 o sea, ABC, ABD, ACD y
BCD.

10) Método de los menores para matrices. Dada una matriz, hallar su determinante por el
método de menores:

|a1 a2 a3|
|b1 b2 b3| = a1 |b2 b3| - a2 |b1 b3|+ a3 |b1 b2|
|c1 c2 c3| |c2 c3| |c1 c3| |c1 c2|

y así sucesivamente hasta llegar a un determinante de 2x2 que quedaría:

|a b| = a*d - b*c
|c d|

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 12: Recursión Ramificada.

Sumario
- Árbol de la recursividad.
- Ciclos anidados vs Recursiva.
- Evitar los desbordamientos del stack.

La recursión ramificada crea más de un nodo en cada paso, creciendo rápidamente. Puede
ser utilizada para una búsqueda completa. Esta recursión tiene un orden cuadrático, cúbico o
superior y por lo tanto no es recomendable para resolver problemas grandes.

Ejemplo 1
Imprima en orden ascendente todos los números de 4 cifras que es posible construir
empleando los dígitos 2, 3 y 5.

#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
int t;
void Call(string a, int l) {
if (l == 4) {
printf ("%s ", a.c_str());
t++;
}
else {
Call (a + "2", l + 1);
Call (a + "3", l + 1);
Call (a + "5", l + 1);
}
}
int main() {
call("", 0);
printf ("\n");
printf ("%d", t);
system ("pause > null");
return 0;
}

Ejemplo 2
Imprima en orden ascendente todos los números de 4 cifras que es posible construir
empleando los dígitos 2, 3 y 5. Se pueden repetir los dígitos solamente dos veces.

#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
int sol;

Concurso de Computación “IPVCE Ernesto Guevara”


bool chkdigit (string a, char dig) {
int c, l;
c = 0;
l = a.size();
for (int i = 0; i < l; i++)
if (a[i] == dig) c++;
if (c == 2)
return false;
else
return true;
}
void call(string a, int l) {
if (l == 4) {
printf ("%s ", a.c_str());
sol++;
}
else {
if (chkdigit(a, '2'))
call (a + "2", l + 1);
if (chkdigit(a, '3'))
call (a + "3", l + 1);
if (chkdigit(a, '5'))
call (a + "5", l + 1);
}
}
int main() {
call("", 0);
printf ("\n");
printf ("%d", sol);
system ("pause > nul");
return 0;
}

Ejercicios de concurso

1) Desarrolle un método recursivo para calcular el número de formas diferentes en el cual


puede escribirse un entero K como una suma, de números enteros positivos distintos de
cero, y en el que cada uno de sus operandos es menor que n.

2) Dada una lista de N coeficientes no nulos C1, C2,..., CN, (N>3), que determina una
ecuación del tipo C1 op(1) C2 op(2) C3 op(3) ..... op(n-1) Cn-1 = Cn en la que la
expresión se evalúa siempre de izquierda a derecha, sin tener en cuenta el orden usual
de operaciones, y op(1),..., op(n-1) simbolizan las operaciones de adición, sustracción,
multiplicación o división. Halle todas las combinaciones de operaciones que satisfacen la
igualdad.

3) Dados 4 dígitos, y dos datos adicionales N y K (enteros positivos, K<N), imprima


todos los números naturales de N dígitos que es posible construir con los 4 dígitos

Concurso de Computación “IPVCE Ernesto Guevara”


dados, con la condición de que ninguno de estos pueda aparecer más de K veces en el
número.

4) Un tubo metálico contiene N bolas, numeradas 1, 2, 3,..., N. Las bolas pueden


extraerse (una por vez), ya sea por el extremo de la derecha del tubo, o por un orificio
lateral del mismo, enfrentado exactamente a la K-ésima bola que este en ese momento
en el tubo. En ambos casos, la bola extraída debe introducirse nuevamente por el
extremo izquierdo del tubo.

5) Dados el valor de K (1<K<N) y una distribución inicial arbitraria de las N bolas,


encuentre la combinación de extracciones de las bolas en el tubo, por el extremo derecho
o por la salida lateral, de modo que las mismas queden ordenadas en forma ascendente
según su numeración con la menor cantidad de extracciones posibles. Una disposición de
las bolas en el tubo como la siguiente (N=8): 3 4 5 6 7 8 1 2 se considera que ya esta
ordenada.

6) Un centro distribuidor recibe N contenedores sellados, cada uno de los cuales contiene
cierta cantidad (no necesariamente la misma) de cajas de medicamentos. El centro
distribuidor debe entregar todos los contenedores en dos hospitales cercanos, de forma
de lograr la distribución de cajas más equitativa que sea posible, sin abrir los
contenedores. Encuentre una distribución de tales características.

7) Dada una matriz cuadrada de orden N, cuyos elementos son números reales, hallar la
mayor sucesión creciente que se pueda obtener, pasando de una casilla a otra que está
a su derecha, a su izquierda, inmediatamente arriba o inmediatamente debajo. No se
puede pasar de una casilla a otra por las diagonales. Imprima la longitud de la sucesión y
a continuación, la lista de las casillas de la misma con sus valores, en la forma a[3,4] =
27.2.

8) Hacia una avenida a la que cruzan o llegan N calles transversales (N>=3),


convergen diariamente los usuarios de la línea "X" en dirección al destino "D". Por cada
transversal, se conoce la cantidad promedio de usuarios que llega a la avenida entre las 6
y las 8 de la manana para montar en dicho transporte. Se desea situar K paradas
(K<=N/3) sobre la avenida (exactamente en las esquinas, no menos de tres cuadras entre
una parada y otra), de modo de minimizar el total de cuadras a recorrer por el conjunto
de los usuarios para llegar hasta la parada mas próxima. Haga el programa
correspondiente.

9) Confeccione un programa para leer una lista de números enteros y halle todas las
combinaciones de elementos de la lista que sumen un número entrado. Por ejemplo, sea
la lista 1, 2, 5, 3, 4, 10 y el número entrado es 15, todas las combinaciones serían:

1 + 2 + 5 + 3 + 4 = 15
1 + 4 + 10 = 15
2 + 3 + 10 = 15
5 + 10 = 15

Concurso de Computación “IPVCE Ernesto Guevara”


10) Desarrolle un método recursivo para calcular el número de formas diferentes en el cual
puede escribirse un entero K como una suma, de números enteros positivos distintos de
cero, y en el que cada uno de sus operandos es menor que n.

Ejemplo:

k = 5
n = 3

1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 2
1 + 1 + 3
1 + 2 + 2
2 + 3

11) Desarrolle un método recursivo para imprimir en orden alfabético todas las
permutaciones posibles de letras en un arreglo de tamaño N.

12) Encontrar de manera recursiva la mayor suma posible de los números colocados en una
matriz con forma de triángulo desde el vértice superior hasta la base del mismo. Los
movimientos posibles son hacia abajo y hacia la derecha.

13) Escriba un programa que imprima los k primeros elementos del conjunto (Niklaus Wirth
lo propuso) de números positivos que se define de la siguiente forma: 1 si pertenece al
conjunto y si m es un miembro del conjunto, entonces 2m + 1 y 3m + 1 también
pertenecen.

14) Considere el siguiente grupo de definiciones recursivas:


 Una expresión es un término seguido por un signo (+,-) seguido por un término, o un
término únicamente.
 Un término es un factor seguido por un asterisco seguido por factor o factor
únicamente.
 Un factor es una letra o una expresión encerrada entre paréntesis.
 Escriba un programa que acepte una hilera de caracteres e imprima si corresponde a
una expresión siguiendo las definiciones recursivas anteriores.

15) Una función que llame a otra función la cual llame a la funciones llamado algunas veces
correcursividad. Escriba un programa que cuente el número de caracteres alfabéticos
en una cadena y sume los dígitos en la cadena. Por ejemplo la cadena "A0is444apple7"
tiene 8 caracteres alfabéticos y los dígitos en la cadena suman. Escriba una función
correcursiva Count_Alph() para contar los caracteres alfabéticos. Hacer que esta llame
a una segunda función Sum_Digit() para sumar los dígitos.

16) Colocar n damas sobre un tablero de (NxN), de modo que dos cualesquiera de ellas no
se ame- nacen mutuamente. Como en muchos casos vamos a reducir nuestro
problema al análisis de uno en caso n = 8 pero dejándolo abierto para toda n. Esta idea
es muy práctica ya que materia- liza las ideas y el problema se hace más fácil de
entender.

Concurso de Computación “IPVCE Ernesto Guevara”


17) Dada una secuencia de N matrices para ser multiplicadas queremos parentizar la
multiplicación para que el costo de la multiplicación sea mínimo. Dos matrices se
pueden multiplicar si el número de columnas q de la primera matriz es igual al numero
de filas r de la segunda y el costo de esa multiplicación es p*q*r, donde p es el número
de filas de la primera.

18) Dadas dos cadenas de caracteres determinar la longitud de la subsecuencia común


más larga de caracteres no necesariamente consecutivos.

19) El problema “de las cajas chinas”: sobre 10 cajas (o también “casillas”) dispuestas
linealmente una al lado de la otra, se colocan en cualquier orden cuatro láminas que
tienen dibujado cierto símbolo (digamos, una letra “a”) y otras tantas con otro símbolo
(por ejemplo una letra “b”), dejando vacías las dos casillas centrales. Dos letras que
estén una al lado de la otra se pueden llevar (conservando el mismo orden que tení- an)
hacia las casillas vacías, originando una nueva posición de casillas desocupadas a las
que, a su vez, puede llevarse otra pareja de letras. Y así sucesivamente. Dada una
configuración inicial cualquiera, se desea determinar la menor cantidad de “pasos”
necesaria para que todas las “a” queden a la izquierda de cualquier “b”, sin que importe
en que posiciones finales queden las dos casillas consecutivas desocupadas.

Ejemplo: Se indica con ** la pareja a mover en cada “paso”


Configuración inicial: abba--abab
**
Paso 1: abbabaa--b
**
Paso 2: a--abaabbb
**
Paso 3: aaaab--bbb (final)

20) Enumerar las posiciones de una tabla de 5 filas y 5 columnas de la siguiente forma : si
el número i (1 ≤ i ≤ 25) ha sido asignado a una posición de la tabla con
coordenadas (x, y) entonces el número i+1 puede ser asignado a la posición de la
matriz con coordenadas (z, w) acorde a una de las siguiente reglas :

(z, w) = (x±3, y)
(z, w) = (x, y±3)
(z, w) = (x±2, y±2)

Enumere las posiciones de una tabla de 5 filas y 5 columnas partiendo de la posición


inicial dada con el número 1, o sea fila 2 y columna 2 (2,2).

Nota aclaratoria: Si la posición de la tabla con coordenadas (2,2) es seleccionada


como la posición de comienzo entonces la próxima posición en la matriz a la cual el
número 2 será asignado puede ser una de las siguientes posiciones con coordenadas:
(2,5) o (5,2) o (4,4). Estas posiciones están marcadas en la figura por un asterisco.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 13: Estructuras.

Sumario:
- Declaración de una estructura.
- Principales usos.
- Acceso a los campos.
- Sobrecarga de operadores.
- Funciones en el interior de estructuras.

13.1 Declaración y uso de las estructuras.

Una estructura es una forma de agrupar un conjunto de datos (o variables) referentes a un


mismo objeto bajo un mismo nombre o identificador. Cada uno de estos datos se denomina
miembro (o campo) de la estructura. Las estructuras se declaran de la siguiente manera:

struct nombre_structura {
tipo1 miembro1;
tipo2 miembro2;
tipo3 miembro3;
.
.
} objecto_nombre;

donde structure_name es un nombre para el tipo estructura, object_name pueden ser un


conjunto de identificadores validos para los objetos que tienen el tipo de esa estructura. Entre
{ } estarán los miembros de ellas, cada uno es especificado con un tipo y un identificador.

Ejemplos de estructuras

struct product { struct point {


int weight; int x, y;};
float price;
} ; struct segment {
point A, B;};
product apple, banana, melon;
segment s1, s2;
struct product { s1.A.x=1; s1.A.y=1;
int weight; s1.B.x=5; s1.B.y=5;
float price; s2.A.x=6; s2.A.y=6;
} apple, banana, melon; s2.B.x=5; s2.B.y=1;

apple.weight
apple.price
banana.weight
banana.price
melon.weight
melon.price

Concurso de Computación “IPVCE Ernesto Guevara”


Ejemplo 1
Asuma que un número real se representa por separado los dígitos a la derecha y a la
izquierda del punto decimal. Escriba las funciones para sumar, restar y multiplicar números
reales representados en estructuras. Las funciones deben devolver estructuras.

#include <cstdio>
#include <cstdlib>
struct Dec {
int x, y;
};
Dec Sumar (Dec D1, Dec D2) {
Dec D3;
D3.x = D1.x + D2.x;
D3.y = D1.y + D2.y;
return D3;
}
int main(){
Dec D1, D2, Dr;
D1.x = 2;
D1.y = 1;
D2.x = 3;
D2.y = 6;
Dr = Sumar (D1, D2);
system("pause > nul");
return 0;
}

Ejemplo 2
Conocida la información de cada municipio, se quiere imprimir un listado con aquellos
municipios con mas de 50000 habitantes.

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
struct Municipio {
char Nb[10];
int Ext;
int Hab;};
int i, n;
Municipio M[20];
void Lectura () {
cout << "Cant. de Municipios : " << "\n";;
cin >> n;
for(i=0; i < n; i++) {
cout << "Municipio " << i << "\n";;
cin >> M[i].Nb;

Concurso de Computación “IPVCE Ernesto Guevara”


cin >> M[i].Ext;
cin >> M[i].Hab;
}
return;
}
void Listado () {
cout << "Listado con los municipios";
for(i=0; i < n; i++) {
if (M[i].Hab > 50000 || M[i].Ext > 400)
cout << M[i].Nb << "\n";
}
return;
}
int main () {
Lectura ();
Listado ();
system("pause");
return 0;
}

13.2 Funciones en el interior de las estructuras.

C++, al contrario que C, permite incluir funciones en el interior de las estructuras.


Normalmente estas funciones tienen la misión de manipular los datos incluidos en la
estructura.

#include <iostream>
using namespace std;
struct stPareja {
int A, B;
int LeeA() { return A;} // Devuelve el valor de A
int LeeB() { return B;} // Devuelve el valor de B
void GuardaA(int n) { A = n;} // Asigna un nuevo valor a A
void GuardaB(int n) { B = n;} // Asigna un nuevo valor a B
} Par;
int main() {
Par.GuardaA(15);
Par.GuardaB(63);
cout << Par.LeeA() << endl;
cout << Par.LeeB() << endl;
return 0;
}

13.3 Sobrecarga de operadores.

Para sobrecargar uno operador cualquiera la sintaxis general es:


tipo operator operador (lista de parámetros); donde, tipo se refiere al tipo
retornado por el operador, operator es una palabra reservada y debe aparecer en toda

Concurso de Computación “IPVCE Ernesto Guevara”


declaración de sobrecarga de operadores, y la lista de parámetros indica los argumentos
sobre los que operarará la función de sobrecarga

Ejemplo # 1
Realizar la suma de dos números complejos sobrecargando el operador de suma.

#include <iostream>
using namespace std;
struct complejo {
float a,b;
};
complejo operator + (complejo a, complejo b){
complejo temp = {a.a+b.a, a.b+b.b};
return temp;
}
int main(){
complejo x = {10,32};
complejo y = {21,12};
complejo z;
z = x + y;
cout << z.a << "," << z.b << endl;
return 0;
}

Ejemplo # 2

Los operadores para una clase específica se deben sobrecargar dentro de la misma clase,
es decir, dichos operadores serán miembros de la clase. Antes de sobrecargar cualquier
operador para una clase se deben tener en cuenta los siguientes factores:

1. Los operadores binarios se declaran con un solo parámetro, ya que el primer parámetro es
pasado por el programa como this, es decir, un puntero al mismo objeto.
2. Los operadores unarios se declaran sin parámetros, ya que el único parámetro es pasado
por el programa como this.

struct LIS {
int x, id;

bool operator < ( const LIS &other ) const {


return ( x < other.x );
}
} T[MAXN], lis[MAXN];

Concurso de Computación “IPVCE Ernesto Guevara”


Ejercicios Propuestos

1) Escribir un programa que, dadas dos fechas, indique cuál de las dos es anterior a la otra.
Para ello, el programa deberá definir una estructura para el tipo de datos fecha (día, mes
y año).

2) Definir una estructura de datos para representar polinomios de hasta grado 10. Escribir un
programa capaz de sumar dos polinomios expresados con dicha estructura.

3) Un número complejo es aquel que contiene una parte real y una imaginaria y ambas son
números reales. Escriba las funciones para calcular la suma, la diferencia y el producto de
dos números complejos. Las operaciones siempre se hacen entre las partes reales y
entre las imaginarias de ambos números.

4) Para representar la hora utilizaremos una estructura en la que se almacenen las hora, los
minutos, los segundos y si es “am” o “pm”. Dada la hora de comienzo y terminación de
una actividad determine la duración de la misma.

Concurso de Computación “IPVCE Ernesto Guevara”


Tema # 14: Uso de la STL.

Sumario:
- Colección genérica de plantillas.
- Los vectores.
- Los contenedores: Pilas, Colas y Colas de Prioridad.

La STL (Standard Template Library) de C++ es una colección genérica de plantillas de clases
y algoritmos que permite a los programadores implementar fácilmente estructuras de datos
como colas (queues), listas (lists), y pilas (stacks). La STL de C++ contiene los constructores
siguientes, agrupados en tres categorías:

Secuenciales: Vector, List y Double-Ended Queues


Adaptadores de contenedor : Stack, Queue y Priority Queue
Contenedores asociativos: Bitset, Map, Multimap, Set y Multiset

Un iterador es como una especie de "puntero especial" que nos permite leer o escribir
valores sobre cada uno de los elementos en una lista, o sea los elementos de las lista
pueden ser navegados en su orden normal desde el primero hasta el último de los elementos
agregados a la lista.

14.1 Los Vectores.

La clase vector se utiliza para almacenar elementos contiguos de manera similar a los
arreglos unidimensionales, soporta acceso aleatorio, inserción y eliminación de elementos al
final, en tiempo constante, la inserción y eliminación de los elementos en el principio o en el
medio, en tiempo lineal. La cantidad de elementos de un vector puede variar dinámicamente.
Los elementos de un vector pueden ser referenciados a través de un índice numérico, de la
misma manera que en un arreglo haciendo uso de índices, o a través de punteros iteradores.

vector <int> vect;

Acción Forma de escribirlo


Insertar un elemento al final vect.push_back(i)
Acceder a un elemento vect[4]
Cantidad actual vect.size()
Imprimiendo su cantidad máxima vect.max_size()
Obtener su valor inicial vect.front()
Inicio del vector vect.begin();
Preguntar si esta vacio vect.empty()
Obtener su último valor vect.back()
Intercambiar los valores con otro vector vect.swap(a)

Concurso de Computación “IPVCE Ernesto Guevara”


Ejemplo # 1
Demostración del uso de un vector

#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main(){
char buffer[80];
double suma;
vector <double> v;

v.push_back(999.25);
v.push_back(888.50);
v.push_back(777.25);
suma = 0;
for(int i = 0; i < v.size(); i++){
suma += v[i];
printf("%10.2f", v[i]);
}
cout << "---" << endl;
printf("%10.2f", suma);
return EXIT_SUCCESS;
}

Ejemplo # 2
Ordenar ascendentemente los elementos de un vector de números enteros.

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#include <vector>
#include <iterator>
int main(){
vector<int> vect;
for(int i=0; i<10; i++){
vect.push_back(i);
}
vector<int>::iterator i=vect.begin();
while(i != vect.end()){
cout << *i <<" ";
i++;
}
sort(v.begin(),v.end()); // default sort, ascending
printf("Sorted version\n");
for (i = v.begin(); i!= v.end(); i++)
printf("%d ",*i); // iterator's pointer hold the value
printf("\n");

Concurso de Computación “IPVCE Ernesto Guevara”


}

14.2 Los contenedores.

Las clases contenedoras, es decir, plantillas (templates) permiten almacenar objetos de muy
diversos tipos. Los iteradores, que nos permitirán recorrer los elementos incluidos en los
contenedores.

14.2.1 Las pilas.

Una pila es una estructura en donde los elementos son insertados y retirados del tope (top)
de la misma, debido a ello el último en entrar es el primero en salir. La librería estándar de
plantillas soporta el uso de estructuras de pila a través de la plantilla de clase stack, la cual
posee el mecanismo de operación necesario para manejar operaciones de insertar (push),
borrar(pop), entre otras. La clase stack posee únicamente cinco métodos y dos
constructores.

Acción Forma de escribirlo


cierto (true) si el stack está vacío empty
borra el elemento en el tope del stack pop
agrega un elemento en el tope del stack push
regresa el numero de elementos en el stack size
regresa el último elemento en el stack top

Ejemplo # 1: Uso de la Pila

#include <cstdlib>
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<char> s;
for (int i='A'; i <= 'Z'; i++)
s.push(i);
while (! s.empty() ) {
cout << s.top() << " " ;
s.pop();
}
cout << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Ejemplo # 2
Evaluar una expresión en notación postfijo, utilizando una pila de operandos.

#include <iostream>
#include <stack>

Concurso de Computación “IPVCE Ernesto Guevara”


#include <string>
using namespace std;
int main(){
stack <int> pila;
char* cadena = new char[1000];
cin>>cadena;
int l = strlen(cadena);
for(int i=0; i<l; i++){
if(cadena[i]=='+' || cadena[i]=='-'||
cadena[i]=='*' || cadena[i]=='/')
{
int x = pila.top();
pila.pop();
int y = pila.top();
pila.pop();
switch (cadena[i]) {
case '+': pila.push(y+x); break;
case '-': pila.push(y-x); break;
case '*': pila.push(y*x); break;
case '/': pila.push(y/x); break;
}
}
else
pila.push(cadena[i]- '0');
}
}
cout<<pila.top()<<endl;
pila.pop();
system("PAUSE");
return 0;
}

14.2.2 Las colas.

Una cola (queue) es una estructura en la cual los elementos son insertados y retirados del
inicio (front) o sea el primero en entrar es el primero en salir.

Acción Forma de escribirlo


verdadero (true) si el cola está vacio empty
borra el elemento en el tope de la cola pop
agrega un elemento al frente de la cola push
retorna el número de elementos de la cola size
retorna una referencia al primer elemento en la cola front
retorna una referencia al último elemento en la cola back

Ejemplo:
Crear una cola para almacenar elementos de tipo char. Los caracteres se introducen en
orden desde la 'A' hasta la 'Z' y al imprimirlos se obtienen en el mismo orden que se
entraron, o sea, desde la 'A' hasta la 'Z'.

Concurso de Computación “IPVCE Ernesto Guevara”


#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
int main() {
queue <char> s;
for (int i='A'; i <= 'Z'; i++)
s.push(i);
while (! s.empty() ){
cout << s.front() << " " ;
s.pop();
}
cout << endl;
return 0;
}

14.2.3 Las colas de prioridad.

Las colas de prioridades (priority_queue) de la STL son parecidas a las colas. No obstante, el
próximo elemento no no es el primer elemento insertado sino aquel que tiene la más alta
prioridad, o sea los elementos están parcialmente ordenados acorde a su valor. Por defecto
los elementos están ordenados en orden descendente.

Acción Forma de escribirlo


verdadero (true) si el cola está vacío empty
borra el elemento en el tope de la cola pop
agrega un elemento al frente de la cola push
retorna el número de elementos de la cola size
retorna una referencia al último elemento en la cola top

Ejemplo:
Almacenar los elementos de una lista de datos desordenados y recuperarlos de manera
ordenada descendentemente.

#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
int main() {
priority_queue <int> p;
p.push(100);
p.push(35);
p.push(12);
p.push(200);
while (! p.empty() ){
cout << p.top() << endl;
p.pop();
}

Concurso de Computación “IPVCE Ernesto Guevara”


cout << endl;
return EXIT_SUCCESS;
}

Ejercicios Propuestos

1) Dada una lista de números y dos valores A y B que representan un intervalo, encuentre
cuántos números de la lista están dentro del intervalo.

2) Implemente las siguientes operaciones básicas con arreglos unidimensionales


- Eliminar un elemento.
- Insertar un nuevo elemento.
- Modificar un elemento.
- Ordenar el arreglo completo.

3) Determine si una hilera de caracteres es de la forma XCY, donde X es una hilera que
consta de los caracteres ”a” y ¨”b” y Y es el inverso de X. En cada momento solamente
puede leer el carácter siguiente de la hilera.

4) Las expresiones aritméticas para que están correctas tienen que tener la misma cantidad
de paréntesis y corchetes abiertos que cerrados. Chequear si es correcta o no utilizando.
Juegos de Datos:(() (())) ([)] [()] )(

5) Transforme una expresión en entrefijo a postfijo.

6) Evaluar una cadena en entrefijo. Utilice dos pilas, una para operandos y la otra para
operadores. No se puede convertir la cadena inicial a postfijo, sino que se debe evaluar a
medida que se avanza.

7) Evaluar una cadena polaca en la que aparecen solamente dígitos y operadores


aritméticos.

8) Lavando los Platos (Dishes, Bronce, Usaco 2010). Utilizar para su solución
a) Una pila.
b) Una cola.

Concurso de Computación “IPVCE Ernesto Guevara”


Anexo 1: Funciones.

Función Tipo Propósito Librería


abs(i) int Retorna el valor absoluto de I. cmath
stdlib.h
atof(s) double Convierte la cadena s en una cantidad de Math.h
doble precisión.
atoi(s) long Convierte la cadena s en un entero. stdlib.h
cos(d) double Retorna el coseno de d. cmath
sqrt(d) double Retorna la raíz cuadrada de d. cmath
pow(d1,d2) double Retorna d1 elevado a la potencia d2. cmath
rand(void) int Retorna un valor aleatorio positivo. stdlib.h
fabs(d) double Retorna el valor absoluto de d. cmath
floor(d) . double Retorna un valor redondeado por defecto al cmath
entero más cercano.
fmod(d1,d2) double Retorna el resto de d1/d2 (con el mismo cmath
signo de d1).
log(d) double Retorna el logaritmo natural de d. cmath
srand(int) void Pone punto de inicio para rand(). cmath
tan(d) double Retorna la tangente de d. cmath
sin(d) double Retorna el seno de d. cmath
fclose(f) int Cierra el archivo f. cstdio
feof(f) int Determina si se ha encontrado un fin de cstdio
archivo.
fgetc(f) int Leer un carácter del archivo f. cstdio
fgets(s,i,f) char * Leer una cadena s, con I caracteres del cstdio
archivo f.
fputc(c,f) int Escribe un carácter en el archivo f. cstdio
fputc(c,f) int Escribe un carácter en el archivo f. cstdio
fputc(c,f) int Escribe un carácter en el archivo f. cstdio
getc(f) int Leer un carácter del archivo f. cstdio
strcat(s1,s2) char * Añade s2 a s1. string.h
strcmp(s1,s2) int Compara dos cadenas lexicográficamente. string.h
strcpy(s1,s2) char * Copia la cadena s2 en la cadena s1 string.h
strlen(s1). int Retorna el número de caracteres en la string.h
cadena s
toupper(c) int convierte una letra a mayúscula. string.h
ctype.h
system(s) int Pasa la orden s al sistema operativo. stdlib.h
exp(d) Double Elevar e a la potencia d (e=2.77182...) cmath
time(p) long Retorna el número de segundos time.h
int transcurridos después de un tiempo base
designado.
exit(u) Void Cerrar todos los archivos y buffers stdlib.h
terminando el programa.

Concurso de Computación “IPVCE Ernesto Guevara”


Anexo 2: Instrucción alternativa múltiple. El uso del switch.
switch(<variable>){
case <expresión constante>:
[<sentencias>[...<sentencia>]][break;]
...
default: [<sentencias>[<sentencia>...]]
}

Ejemplo
Diseñar un programa que permita traducir a cadena de caracteres un dígito entre 1 y 5.

#include <stdio.h>
void main(){
int num;
scanf("%d", &num);
switch ( num )
case 1 :
printf("Uno.");
break;
case 2 :
printf("Dos.");
break;
case 5 :
printf("Cinco.");
break;
default :
printf("El dígito está fuera de rango");
break;
}
}

Concurso de Computación “IPVCE Ernesto Guevara”


Anexo 3: Macros para facilitar el trabajo.

#define REP( i, n ) \
for ( int i = 0; i < (n); i++ )
#define For( i, j, k ) for ( int i = (j); i <= (k); i++ )
For ( i, 1, R )
For ( i, 1, R ){
For ( j, 0, C-1 )

#define PREV(x) (x & (x - 1))


#define NEXT(X) ((x << 1) - PREV(x))
#define min(a, b) (((a)<(b))?(a):(b))
#define sqr(x) ((x)*(x))
#define max2(a,b) (((a)>(b))?(a):(b))
#define min2(a,b) (((a)<(b))?(a):(b))
#define sqr(x) ((x)*(x))
#define debug(x) cout<<(#x)<<": "<<(x)<<endl
#define echo(x) cout<<(#x)<<endl
#define SZ(x) (int(x.size()))
#define PREV(x) (x & (x - 1))
#define NEXT(X) ((x << 1) - PREV(x))
#define min(a, b) (((a)<(b))?(a):(b))
#define sqr(x) ((x)*(x))
#define max2(a,b) (((a)>(b))?(a):(b))
#define min2(a,b) (((a)<(b))?(a):(b))
#define sqr(x) ((x)*(x))
#define debug(x) cout<<(#x)<<": "<<(x)<<endl
#define echo(x) cout<<(#x)<<endl
#define SZ(x) (int(x.size()))

Concurso de Computación “IPVCE Ernesto Guevara”


Anexo 4: VARIADOS.
char may[26]; int j = 0;
for (char i = 'A'; i <= 'Z'; i++) {
may[j] = i;
j++;
}

Ordenamiento de un arreglo de manera descendente

struct object {
int b, e, c;
long int f;
};

object a[mxo];

bool fcmp(const object &a, const object &b) {


return (a.b < b.b);
}

sort(a, a+n, fcmp);

Un ejemplo típico del uso de este operador es el cálculo del m máximo


de dos valores. En la siguiente sentencia, c toma el valor del m
máximo entre la variable a y b.

c=(a>b)? a: b;

Esto mismo podría haberse escrito usando la construcción if-else


como:

if (a > b)
c=a;
else
c=b;

struct point {
int x, y, id;
bool mk;

bool operator < (const point &a) const {


if(x != a.x)
return x < a.x;

Concurso de Computación “IPVCE Ernesto Guevara”


return y < a.y;
}
} p[100];

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

char A[100];

int f(int n) {
if(n == 1) return 1;
else return n * f(n-1);
}

int main() {
freopen("permu.in", "r", stdin);
freopen("permu.out", "w", stdout);

cin >> A; int l = strlen(A);


sort(A, A + l);

int fac = f(l);


while() {
next_permutation(A, A + l);
}

return 0;
}

struct kkk{
bool operator()(const point &a , const point &b){
return (cross(a,b,pts[0]) > 0);
}
};

memset( mark , 0 , sizeof(mark) );


fill (C+1,C+n+1,999999);

Concurso de Computación “IPVCE Ernesto Guevara”

También podría gustarte