Clases Iniciales para Concurso - 240923 - 091614
Clases Iniciales para Concurso - 240923 - 091614
Clases Iniciales para Concurso - 240923 - 091614
_/_/_/ _/_/_/
_/ _/
_/_/ _/
_/ _/ 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)
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.
13. Estructuras.
13.1. Declaración y uso de las estructuras.
13.2. Funciones en el interior de estructuras.
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.
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.
#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;
}
Ejemplos que utilizan las funciones matemáticas que aparecen en la librería <cmath>.
Consultar la tabla de funciones al final del documento.
#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;
Ejercicios Propuestos
2) Dada una cantidad de dinero en CUP convertirla a CUC entrando además como dato la
tasa de cambio actual.
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.
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
abc
P= A = P (P - a) (P - b) (P - c)
2
#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.
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.
Sumario
- Utilizar la sintaxis más general de la instrucción If.
- Operadores de relación (==, <, >, >=, <=, !=).
- Operadores lógicos (&&,|| ,^).
If (condición)
Instrucción o bloque de instrucciones;
[else
Instrucciones o bloque de instrucciones;]
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;
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 (){
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
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.
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
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
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.
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.
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
N = 4 P = 22
Vecinos
Izquierdo: 20 Derecho: 22 Superior: 14 Inferior: 30
Diagonales: 12 16 28 32
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.
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;
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;
}
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", ¬a);
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;
}
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.
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.
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.
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.
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.
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.
Sumario:
- Ciclos indeterminados (while y do)
- Condición.
- Trabajo con Listas de Datos.
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.
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;
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.
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á.
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
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
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
19) El valor de la raíz cuadrada de un número puede calcularse con bastante aproximación
empleando el método siguiente:
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.
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;
}
#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.
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.
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.
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:
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.
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ó.
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
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.
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
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.
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
1
2 5
3 6 8
4 7 9 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.
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.
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++;
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;
}
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;
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;
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.
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.
3) Dada una lista de números cree una sublista con todos los números repetidos en la lista
original.
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.
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:
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
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 = 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.
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.
Cn = C k Cn-1-k
K=0
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
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() {
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;
Ejercicios
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.
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.
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.
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.
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.
Sumario:
- Abrir un fichero en lectura o en escritura.
- Definir la manera de acceder al fichero.
- Cerrar el fichero.
- Diferentes formas.
#include <stdio.h>
freopen( "TEST.IN", "r", stdin );
freopen( "TEST.OUT", "w", stdout );
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;}
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
#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);
#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);
Sumario:
- Concepto de cadenas.
- Funciones para el tratamiento de cadenas.
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).
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;
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(){
Ejercicios Propuestos
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.
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.
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.
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’).
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
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.
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.
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.
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.
Sumario:
- Declaraciones de funciones.
- Transferencia de parámetros por valor y por referencia.
- Variables locales y globales.
- Formas de llamada.
#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;
}
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;
#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;
}
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>
a = StNum;
system( "pause" );
return 0;
}
Ejercicios Propuestos
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.
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.
- 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.
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;
Ejercicios Propuestos
1 n = 0
an =
a * a(n-1) n > 0
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
4) Para los dos casos siguientes hallar C(m,n) dados m y n Definamos las fórmulas
combinatorias C(m,n) como:
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|
|a b| = a*d - b*c
|c d|
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;
Ejercicios de concurso
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.
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.
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
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.
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.
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.
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)
Sumario:
- Declaración de una estructura.
- Principales usos.
- Acceso a los campos.
- Sobrecarga de operadores.
- Funciones en el interior de estructuras.
struct nombre_structura {
tipo1 miembro1;
tipo2 miembro2;
tipo3 miembro3;
.
.
} objecto_nombre;
Ejemplos de estructuras
apple.weight
apple.price
banana.weight
banana.price
melon.weight
melon.price
#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;
#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;
}
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;
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.
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:
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.
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.
#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");
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.
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.
#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>
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.
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'.
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.
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();
}
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.
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:(() (())) ([)] [()] )(
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.
8) Lavando los Platos (Dishes, Bronce, Usaco 2010). Utilizar para su solución
a) Una pila.
b) Una cola.
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;
}
}
#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 )
struct object {
int b, e, c;
long int f;
};
object a[mxo];
c=(a>b)? a: b;
if (a > b)
c=a;
else
c=b;
struct point {
int x, y, id;
bool mk;
#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);
return 0;
}
struct kkk{
bool operator()(const point &a , const point &b){
return (cross(a,b,pts[0]) > 0);
}
};