Documente Academic
Documente Profesional
Documente Cultură
Christian Mori
Esta es la entrega que ofrece una amplia enseanza
en lenguaje C++.Net.
1.1.1 Programa
1.1.2 Programacin
1.1.3 Programador/Desarrollador
1.1.4 Sistema
1.1.6 Dato
1.1.7 Informacin
1.1.8 Software
1.1.9 Hardware
2.1.4 Codificacin
2.1.6 Documentacin
2.1.7 Mantenimiento
3.1.2 Identificadores
3.1.5 Operadores
6.4 Subprogramas
6.6 Funciones
6.7 Procedimientos
Captulo 8: Arreglos
8.1 Arreglos Unidimensionales
8.3 Ordenamientos
8.4 Bsquedas
Captulo 9: Cadenas
9.1 Fundamentos de cadenas
Sus sugerencias sern procesadas para el mejoramiento continuo del libro, mas
no para la resolucin de algn problema propuesto, puesto que los problemas
sern resueltos paulatinamente en las siguientes ediciones del libro.
Agradecimientos
El presente trabajo ha sido un gran esfuerzo mstico con el fin de orientar a los
primeros estudiantes que ayudara a desarrollar la capacidad de anlisis en los
problemas computacionales.
Sistemas de Procesamiento
de Datos
1.1 Conceptos de la programacin
1.1.1 Programa
1.1.2 Programacin
1.1.3 Programador/Desarrollador
1.1.4 Sistema
1.1.6 Dato
1.1.7 Informacin
1.1.8 Software
1.1.9 Hardware
Introduccin
1.1.1 Programa
Es el conjunto de instrucciones que una computadora ha de seguir. Estas instrucciones son escritas en
un lenguaje de programacin que la computadora es capaz de interpretar.
1.1.2 Programacin
1.1.3 Programador/Desarrollador
1.1.4 Sistema
Representa observaciones o hechos fuera de contexto y sin significado inmediato (Es materia prima de
la informacin).
1.1.7 Informacin
Es el significado que una persona asigna a un dato (conjunto de datos).En otras palabras es el
resultado o salida que emite un programa o sistema de informacin.
1.1.8 Software
1.1.9 Hardware
Son las maquinas fsicas reales que constituyen una instalacin de cmputo.
Programa
-------------
-------------
Salida
-------------
--------------
---- Computadora
--------------
Datos --------------
-------------
-------------
-------------
1.3 Lenguajes de Programacin
Definicin
Es un conjunto de reglas semnticas as como sintcticas que los programadores usan para la
codificacin de instrucciones de un programa o algoritmo de programacin.
4to nivel: Llamados tambin generador de aplicaciones Son en esencia programas para crear
programas, por ejemplo herramientas CASE, GENEXUS Tool, PowerDesigner, etc.
3er nivel: Es el nivel de lenguaje ms parecido al lenguaje del ser humano, con ms signos y reglas
para expresar con facilidad las cosas ms complicadas, entre ellos existen C++, BASIC, PASCAL, C#,
JAVA, Php, ETC
Ejm: Z=X+Y
2do nivel: Es el tipo de lenguaje que cualquier computadora puede entender, por ejemplo
Ensamblador.
Ejm: ADD X Y Z
1er nivel: Llamado tambin Lenguaje de Maquina. Son los programas escritos en forma de ceros y
unos.
Ejm
Son las distintas formas y categoras de los lenguajes de programacin, se categorizan en:
2.1.4 Codificacin
2.1.6 Documentacin
2.1.7 Mantenimiento
Introduccin
Es la serie de pasos adecuados que se ha de seguir para obtener una solucin completa de un
problema computacional.
Conocer y delimitar por completo el problema, saber que es lo se desea realice la computadora.
Escribir la solucin del problema (de acuerdo al pseudocdigo), en una serie de instrucciones
detalladas en un cdigo reconocible por la computadora (PROGRAMA).
En la actualidad y con algo de prctica se es posible pasar del anlisis de la solucin a la codificacin,
en muchos casos es ms rpido y permite detectar errores mediante la depuracin o debug, asunto
que se hara manualmente en el pseudocdigo y/o diagrama de flujo.
La Prueba es el proceso de identificar los errores que se presenten durante la ejecucin del programa.
La Depuracin consiste en eliminar los errores que se hayan detectado durante la prueba.
2.1.6 Documentacin
Es la gua o comunicacin escrita que sirve como ayuda para usar un programa, o facilitar futuras
modificaciones.
La documentacin que va a sustentar en trminos legales la creacin y/o modificacin del programa.
Existen 3 tipos:
Documentacin Interna
Consiste en los comentarios o mensajes que se agregan en el cdigo del programa (Es la ms usada),
mientras ms detallado se encuentre el programa ser ms fcil la modificacin en el futuro, adems
es utilizado para controles internos dentro del rea de TI.
Consta de: Nombre de modulo, Descripcin del mdulo, Nombre del Autor, fecha creacin, fecha
modificacin
Documentacin Externa
Es el Manual Tcnico (A menudo obviada), est integrada por los siguientes elementos: Descripcin
del Problema, Nombre del Autor, Diagrama del Flujo, Pseudocdigo, Lista de variables y constantes, y
Codificacin del Programa.
Es de uso indispensable cuando se va a entregar el programa al usuario final puesto que facilitara el
manejo en gran medida del programa.
2.1.7 Mantenimiento
Se realiza despus de determinado el programa cuando se detecta que es necesario hacer un cambio,
ajuste y/o complementacin al programa para que siga trabajando de manera correcta.
A continuacin se detallan los distintos tipos y formas en que aparecen los errores, adems las
recomendaciones para disminuir su aparicin.
Pueden aparecer por no teclear correctamente alguna instruccin y/o comando del lenguaje de
programacin utilizado, la buena noticia de este tipo de errores son que se pueden detectar y corregir
en tiempo de codificacin, El software del lenguaje de programacin en muchos casos detecta los
errores automticamente mientras se digita el cdigo antes de ejecutar el programa.
Por ejemplo en C++ toda instruccin termina en punto y coma < ; > si obvias ponerla seguramente el
compilador te mostrara un mensaje de error al intentar ejecutar el programa.
Son los errores del desarrollador y son errores de interpretacin de los procesos funcionales (A
menudo en expresiones de clculos).
Por ejemplo le podran pedir calcular el promedio de 2 nmeros y por distraccin suma los dos
nmeros y los divide sobre tres, O quizs en su frmula emplea lo siguiente: A+B / 2 y no coloca el
parntesis para que primero sume.
Este tipo de errores no es percibido por el software editor de cdigo ya que estos errores son
sintcticamente correctos, en consecuencia solo pueden ser percibidos en tiempo de ejecucin del
programa al intentar ver el resultado o quizs mucho despus.
Estos tipos de errores suelen mostrar el respectivo mensaje de error, y en muchos casos consiguen
hacer terminar forzosamente al programa.
Este tipo de errores son los ms comunes aun cuando se alcanza a dominar la programacin.
A menudo este tipo de errores son por clculos numricos y reglas matemticas que no pueden ser
pasadas por alto por ejemplo si se intenta dividir un nmero sobre cero,
Otro caso general es cuando se intenta obtener un valor ya sea por teclado o de otra ubicacin, y no
se valida que haya obtenido realmente el valor y se hace una expresin con la variable como si tuviera
el valor y en ese momento seguramente tendrs un error en tiempo de ejecucin.
La recomendacin para este tercer tipo de error es siempre validar las entradas ya sea teclado, lectura
de archivos de texto, base de datos, etc.
No solo el desarrollador tiene errores, el software de programacin utilizado algunas veces muestra
errores. En algunos casos por modificacin de algn componente interno ya sea por la instalacin de
algn otro software en la PC (Personal Computer) que consigue modificar el componente.
Otros casos tambin suceden por no refrescar el proyecto utilizado, actualmente el software de
programacin cuenta con herramientas de actualizacin incluido. Este es nombrado de muchas
formas: refrescar, actualizar, regenerar, etc. En cualquiera de los casos es recomendable actualizar
cada cierto tiempo el proyecto de programacin.
Un caso menos usual es la infeccin de virus que en la actualidad se corrige con un antivirus efectivo.
Captulo 3
Fases de la Programacin
3.1.2 Identificadores
3.1.5 Operadores
Introduccin
En este captulo comenzaremos a revisar los elementos de un programa, los conceptos necesarios
para realizar un programa sencillo.
Son clasificadores de variables ya sea en el dato que contendr u operaciones que se realizara sobre
ellas. A continuacin se muestra una tabla con los rangos y algunas otras caractersticas de los tipos
de datos:
Tipo de datos
Rango Mnimo (*) Precisin
Descripcin C++
short 32,767
int 32,767
Enteros long 2147,483,467
Entero sin signo unsigned long 4294,967,295
float 10^37 6 dgitos
double 10^37 6 dgitos
Reales long double 10^37 6 dgitos
Carcter char 127
Cadena string
Booleano bool
(*) EL limite considera lmite inferior el mismo nmero con signo negativo hasta el lmite superior que
es el numero mostrado, con excepcin de los que llevan la palabra reservada unsigned(sin signo) en
esos casos el lmite inferior es cero y el lmite superior es el doble del numero mostrado.
Estos son los mnimos rangos sin embargo esto puede variar de acuerdo a la versin del compilador, a
continuacin se muestra los tpicos rangos para un ambiente de 32 bits:
Tipo de datos
Bytes utilizados Tpico Rango(*)
Descripcin C++
short 2 bytes 32,767
int 4 bytes 2147,483,467
Enteros long 4 bytes 2147,483,467
Entero sin signo unsigned long 4 bytes 2147,483,467
float 4 bytes 1.8^-38 a 3.4^38
double 4 bytes 2.2^-308 a 1.8^308
Reales long double 8 bytes 2.2^-308 a 1.8^308
unsigned double
Real sin signo unsigned long double
1 Byte: guarda un
char
Carcter carcter
Bytes Dinmicos, su
string
Cadena tamao es ilimitado
Booleano bool 1 bit
Nota: Para los iniciantes los tipos de datos definidos bajo pseudocdigo se puede utilizar la descripcin
de la tabla. Sin embargo para este libro se utilizara los trminos de C++.
3.1.2 Identificadores
Variable: Son ubicaciones de memoria en las cuales guarda un valor, adems dicho valor puede ser
cambiado a lo largo del programa.
Constante: Son un tipo de variable que mantiene su valor desde el principio hasta el final del
programa.
Imagine una variable local de tipo entero que va a contener una edad, el nombre de la variable podra
ser: li_edad.
Variable global para guardar el sexo de mara (M,F), podemos declarar: gc_sexo_maria.
CAR
CAR y Car son variables distintas
Car
a_50
b35a
pepito
Promedio_ventasC
En este libro usaremos la forma recomendada de nombrar variables cuando veamos problemas
algortmicos de sobremanera complejos.
Se asigna valores del mismo tipo que el que se declar previamente a la variable/constante
(aritmtica, lgica, textos y caracteres).
3.1.5 Operadores
Suma + +
Resta - -
Multiplicacin * *
Aritmticos
Divisin real /
(*) /
Divisin entera Div
Igualdad = ==
Diferente <> !=
Y And &&
Lgicos O Or ||
Negacin Not !
(*) Notar que para C++ se coloc el mismo smbolo en divisin real y entera, para saber en qu
momento funciona como divisin real y en qu momento como divisin entera (Vase los apartados
3.2.5, 3.2.6, 3.2.7)
1. () (*)
2. /
3. *
4. +
5.
(*) Las operaciones que estn dentro de parntesis se evalan primero. Cuando existe mltiples
parntesis (anidado: internos unos a otros), se evalan primero las expresiones ms internas.
Ejemplos
a) b)
X = A-B+C Y = A*B + C
X=3-4+5 Y = 3*4 + 5
X= 3-9 Y = 12 + 5
X= -6 Y = 17
c) d)
Z = 5*4 + 3 / 3 W = ( (3 + 4) - (5 - 3) ) / 5
Z = 20 + 1 W = (5) / 5 = 1
Z = 21
Entrada
Es el flujo de datos que el programa utilizar para realizar sus procesos. Vale decir que la entrada
puede originarse de distintas ubicaciones (Teclado, un archivo, etc.).
scanf(<formato>, &<variable>);
Ejemplo:
int nro;
scanf("%d,&nro");
Salida
Es generalmente la informacin y/o resultado del programa. Adems se puede utilizar como mensajes
para solicitud de entradas.
Ejemplos:
(*) Notar el texto en negrita %f y %s, dichos valores sern reemplazados por las variables listadas
despus de la coma en orden de ocurrencia.
(**) Notar el nmero 8.4 del formato %8.4lf, representa el formato de impresin del nmero en pantalla
en este caso longitud 8 a 2 decimales.
Notar que %c y %s tienen el mismo tipo de dato, no obstante %c imprime solo un carcter y %s
imprime una cadena de caracteres.
Secuencias de escape
Como sealamos en los ejemplos de Salida en la impresin con printf, mostramos unos ejemplos de
uso de las secuencias de escape, a continuacin listamos ms secuencias de escape:
Descripcin Smbolo
Nueva Lnea \n
Tabulacin Horizontal \t
Retorno de carro \r
Alerta \a
Diagonal invertida \\
Comillas dobles \"
Ejemplos:
Como ya se mencion en el apartado Prioridad de operadores, solo estn permitidos los parntesis ()
a continuacin veremos cmo transformar las expresiones algebraicas hacia expresiones
computacionales:
4+5 4+5
A - 10
2x4 2*4
1/2
1 + 2 / 8 - ( 10 * 2 )
7(a + b) 7*(a+b)
8*x + 9y + 3*z
(p+q) / (x+m/n)
( )
(a / b)*c*d
(a+b)*(c-d)*(e-f)
(A + 5 b 4 + 2) / D
[ ]
(a * b * (-c * d) + 5) / 10
1 / (a * b * c + c * d - 10)
((a-b)/(c-d) / ((e-f)/(g-h))
3.2.2 Declaracin de Variables
Es el acto de definir un Tipo de dato vlido a una variable que se utilizar en el programa.
Ejemplos:
Pseudocdigo C++
Entero: A,B int A,B; long k,b;
Real: P,Q float P,Q; double R, s;
Carcter: Sexo, Condicin char Sexo, Condicin;
Constante Entero: P=10 const int P = 10;
En c++ hay que tener claro la diferencia entre los datos enteros y reales, para eso dividimos el
concepto en 2 partes: nmeros y variables:
Para los nmeros digitados en expresiones, son enteros siempre y cuando no se digita el punto
decimal y nmeros posteriores, en caso contrario son reales.
Nmeros Enteros
Nmeros Reales
No obstante en la programacin en C++, las variables que contendrn nmeros son del tipo en el
que son declarados ya sea real (double o float) o entero (int, long).
Variables Enteras
Variables Reales
Son aquellas variables que son declaradas como tipo de dato reales.
En los problemas computacionales no solo es usada la divisin real sino tambin es a menudo
necesario el uso del operador de divisiones enteras.
Los resultados de la divisin van a depender del tipo de dato del dividendo y/o divisor. A continuacin
mostraremos los resultados teniendo en cuenta el tipo de dato del dividendo y divisor:
Divisin de Nmeros
b) 12 / 5 = 2
c) 15 / 4.0 = 3.75
d) 15 / 4 = 3
e) 10 / 3 = 3
f) 10.0 / 3 = 3.333333
La representacin c) muestra el resultado real pues la divisin cuenta con un dividendo entero y un
divisor real (por estar con punto decimal .0) y adems tiene residuo inicial 3 (> 0)
Dnde:
15: Dividendo
4.0: Divisor
3: Residuo
Dnde:
10: Dividendo
3: Divisor
1: Residuo
Divisin de Variables
int P, Q;
double R,S;
P=10; Q=20;
R=1.5; S=2.5;
a) B / A = 2
b) A / B = 0
c) S / R = 1.66666
d) R / S = 0.6
e) Q / S = 8.0
f) R / P = 0.15
Divisin de variables y nmeros
a) P / 5 = 2
b) Q / 4.0 = 5.0
c) P / 6 = 1
d) Q / 20.0 =1.000000 (*)
e) P / 0 = (Error en tiempo de ejecucin)
f) R / 10 = 0.15
g) 5.0 / S = 2.0
h) 2.5 / R = 1.666666 (**)
(*): El resultado es real, en el ejemplo se muestra 1.000000 como resultado no obstante la cantidad de
dgitos decimales va a depender del tipo de dato definido en C++ ya sea float o double. (Vase el
apartado 3.1.1)
(**): Existen divisiones en las cuales el resultado de la divisin es un nmero con parte decimal muy
extenso como .33333..., la longitud de los dgitos va a depender del tamao del tipo de dato de la
variable en la cual se va a almacenar o el formato redondeando el ultimo digito de ser necesario
(Vase el apartado 3.1.1)
En general para obtener los resultados esperados de acuerdo al dividendo y divisor ya sea variables o
nmeros se puede aplicar la siguiente regla:
Considere que las variables A, B, C y P son de tipo entero int, variables C, D E y Q de tipo double:
//Asignacin a variables
A=10;
B=5;
C=0.5; // C almacena 1 ya que la variable C es de tipo int
D=0.5;
E=1.24;
F=1; // F almacena 1.000000, ya que la variable F es de tipo double
A continuacin se muestran tpicas operaciones en la que se almacena valores errneos por los tipos
de datos:
P=A / E;
Cuidado con este tipo de operaciones. El resultado de la divisin es 8.06 pero P=8, por la causa de
que la variable P es de tipo entero.
Q=(A+B) / 2;
Q=(A+B) / 2.0;
En C++ el operador modulo es representado por < % >, y se utiliza para obtener el residuo o resto de
una divisin entera, vale decir que para obtener el resto el dividendo y divisor deben ser
necesariamente enteros.
Ejemplos
a) A % 6 = 3
b) B % 2 = 0
c) 19 % C = 1
d) 7%9=7
e) C%3=0
f) D%5=2
g) B%0=0
Captulo 4
FLUJOS DE CONTROL
Usualmente en los programas va a ser necesario que se ejecuten ciertas instrucciones bajo ciertas
condiciones, es en estos casos cuando resultan sumamente tiles las estructuras de control, las cuales
mediante expresiones booleanas en una estructura condicional van a determinar que bloque del
cdigo se va a ejecutar.
Son el tipo de expresiones ms sencillas en las cuales se van a evaluar dos valores mediante un
operador de comparacin.
Ejemplos:
char
A == 50 => true
C==A => Error en tiempo de codificacin, las comillas dobles indica cadena
B>C => true, A representa el nmero 65 en la tabla de los cdigos ASCII Vase capitulo X
A+B < B+D => false
D != D => false
D => true
(*) Ntese que < !D > retorna false, puesto que en C++ el numero 1 representa true y 0 false, aunque
esto es posible no se recomienda usar los nmeros para este propsito, en su lugar C++ cuenta con
un tipo de dato especial bool.
Ejemplo:
bool sw;
sw = false;
sw=true;
Para este propsito utilizaremos los operadores lgicos, pero antes debemos mostrar las tablas de
verdad de los principales operadores:
Ejemplos:
Considere que:
Una receta para recordar la tabla del O: Los operadores deben ser todos falsos para que el resultado
sea falso, caso contrario es verdadero
Ejemplos:
Considere que:
Ejemplos:
Considere que:
A > 0 && ! (B > 0) => true && ! true = true && false = false
!!(A!=15) || !(B==20) => !! true || ! true = ! false || false = true || false = true
4.1.2 Estructura Condicional < if >
Es una estructura que bifurca el flujo de ejecucin del cdigo del programa en funcin del resultado de
una expresin booleana.
Sintaxis
if(<Expresin booleana>)
{<Inicio de bloque>
<Bloque de Cdigo>
}<Fin de bloque>
dnde:
Inicio de bloque: La llave abierta que indica el inicio del cuerpo de cdigo a ejecutarse si la expresin
booleana retorna true.
Bloque de Cdigo: El compilador va a ejecutarlo siempre que la expresin booleana retorne true.
Fin de bloque: La llave cerrada indica el fin del cuerpo de cdigo a ejecutarse si la expresin
booleana retorna true.
Continuacin del programa: Si la expresin booleana dentro de la instruccin < if > retorna false el
compilador salta hacia continuacin del programa.
Ejemplos:
Promedio = 10.5;
flag_desaprobado = true;
Salta printf("Condicion Alumno: Repitente");
flag_desaprobado = true;
printf("Condicion Alumno: Repitente");
Cuando el compilador llegue hasta la evaluacin dentro de la instruccin < if > como el promedio no es
menor sino igual a 10.5 saltar hasta la instruccin:
flag_desaprobado = true;
printf("Condicion Alumno: Repitente");
y aun tambin:
Es la estructura que bifurca el flujo de ejecucin del cdigo del programa con una estructura alternativa
en funcin del resultado de una expresin booleana.
Sintaxis
if(<Expresin booleana>)
else
dnde:
Inicio de bloque if: La llave abierta que indica el inicio del cuerpo de cdigo a ejecutarse si la
expresin booleana retorna true.
Bloque de Cdigo if: El compilador va a ejecutarlo siempre que la expresin booleana retorne true.
Fin de bloque if: La llave cerrada indica el fin del cuerpo de cdigo a ejecutarse si la expresin
booleana retorna true.
Inicio de bloque else: La llave abierta que indica el inicio del cuerpo de cdigo a ejecutarse si la
expresin booleana retorna false.
Bloque de Cdigo else: El compilador va a ejecutarlo siempre que la expresin booleana retorne
false.
Fin de bloque else: La llave cerrada indica el fin del cuerpo de cdigo a ejecutarse si la expresin
booleana retorna false.
Continuacin del programa: En este caso de estructura condicional como tiene parte alternativa
<else> este debe ejecutarse primero antes de la continuacin del programa.
En este tipo de estructuras solo un bloque se ejecuta: el bloque de cdigo if o el bloque de cdigo else,
ms no los dos bloques.
Ejemplos:
Promedio = 15;
if( Promedio > 10.5 )
{
printf("Alumno Aprobado");
}
else
{
printf("Alumno Desaprobado");
}
..
..
Para este ejemplo solo se ejecutara el bloque < if >, lo que no ocurrira si el Promedio=10 en ese caso
se ejecutara el bloque < else >.
O tambin:
if(Promedio > 10.5) printf("Alumno Aprobado");
else printf("Alumno Desaprobado");
La razn es que en C++ son necesarias las llaves solo si un bloque tiene 2 a ms instrucciones.
En C++ existe una forma adicional de condicional que simula la instruccin <if>, que no es
recomendada, pero que quizs observen en algunos cdigos externos, y aqu se muestra para que sea
de conocimiento:
int A=11;
(A==10) ? printf("A es 10") : printf("A No es 10");
Es la estructura con n alternativas de bifurcacin del flujo de ejecucin del cdigo del programa, en
funcin del resultado de mltiples expresiones booleanas.
Sintaxis
}else
..
dnde:
Expresin booleana 1,2,n: Debe siempre retornar true o false en la respectiva expresin booleana.
Continuacin del programa: Si la estructura anidada tiene al final un bloque <else> en ese caso
debe ejecutarse primero antes de la continuacin del programa. Si no tuviese un bloque < else > al
final, el compilador de no encontrar ningn true en las estructuras booleana saltar a la continuacin
del programa.
Ejemplos:
Numero = 15;
if(Numero < 0 )
{
printf("Numero Negativo");
}
else
if(Numero == 0 )
{
printf("Numero Neutro");
}else{
printf("Numero Positivo");
}
Para este ejemplo el resultado ser Numero Positivo
La instruccin < if > del ejemplo anterior se puede escribir de la siguiente forma:
O tambin:
Cabe decir que para este ejemplo, la ltima forma mostrada es la ms fcil de entender e interpretar.
Este tipo de estructura es solo una variacin ampliada de la estructura <if-else>. Realmente esta
estructura es flexible y se va a acomodar muy bien a cualquier tipo de problemas en las cuales se
evale varias condiciones.
A diferencia de la instruccin < if - else > en C++ esta estructura puede evaluar solo una variable y solo
puede comparar igualdad adems no permite la combinacin con operadores lgicos como && (Y
lgico por ejemplo), en su lugar puede combinar el || (O lgico) de forma homologa.
Sintaxis
switch (<variable a comparar>)
{
Dnde:
<valor a comparar i>: Constante con la cual la <variable a comparar >va a evaluar igualdad, si es
que no coincide pasa al siguiente <valor a comparar i>.
<Bloque de instruccin i>: Conjunto de instrucciones a ejecutarse si es que el <valor a comparar i>
respectivo retorna true.
break: Instruccin C++ para bifurcar o saltar al final de la estructura switch. De no invocar a la
instruccin break si es que encuentra coincidencia seguir evaluando los siguientes case de la
instruccin.
Ejemplos:
char sexo;
printf("Ingrese sexo de persona (M, F):"); sexo=getchar();
switch(sexo){
case 'M':
printf("Masculino"); break;
case 'F':
printf("Femenino"); break;
default:
printf("Error: Dato de ingreso No valido"); break;
}
Para el ejemplo anterior mostrado supongamos que se ingres por teclado el carcter M, entonces se
imprime por pantalla: Masculino.
Supongamos que se ha ingresado por teclado la letra m, entonces por pantalla se mostrara: Error:
Dato de ingreso No valido. La siguiente estructura switch muestra el mensaje correcto sin distinguir
maysculas o minsculas.
switch(sexo){
case 'M': case 'm': printf("Masculino"); break;
case 'F': case 'f': printf("Femenino"); break;
default: printf("Error: Dato de ingreso No valido"); break;
}
Sin lugar a dudas es posible usar las estructuras condicionales de muchas formas, a continuacin
mencionamos unos consejos para la eleccin de estructura:
a) Solucin anidada
if( A <= 10 )
printf("Error nmero no es mayor a 10.\n\n");
else
if( A % 2!=0 )
printf("Error nmero no es par.\n\n");
else
{
A = A + 10;
printf("A = %d\n\n", A);
}
system("PAUSE");
Aunque esta solucin es vlida, dificulta la lectura cuando se cuenta con varios
niveles de anidamiento y con ms instrucciones.
b) Solucin recomendada
if(A % 2!=0){
printf("Error numero no es par.\n\n");
system("PAUSE");
exit(0); //Funcin para terminar el programa
}
A = A + 10;
printf("A = %d\n\n", A);
system("PAUSE");
La debilidad de esta forma es que se generan ms lneas de cdigo, no obstante en los problemas
computacionales en algn momento va a pesar ms el entendimiento que las lneas de cdigo.
Ejemplo: Decir si un numero pasa la prueba de validacin. Debe ser mltiplo de 3 y la vez divisible por
18.
a) Solucin psima
bool pasa_prueba;
if( A % 3 == 0 && 18 % A == 0 )
pasa_prueba=true;
else
pasa_prueba=false;
system("PAUSE");
No se recomienda este tipo de soluciones se sobrescribe las alternativas de los booleanos, ya que
sabemos que los booleanos solo tienen dos posibles valores (true o false)
b) Solucin buena
bool pasa_prueba=false;
if( A % 3 == 0 && 18 % A == 0 )
pasa_prueba=true;
system("PAUSE");
Esta solucin es a menudo utilizada, inicializar como false y luego preguntar si pasa la prueba y
asignar a true.
c) Solucin recomendada:
bool pasa_prueba;
pasa_prueba = ( A % 3 == 0 && 18 % A == 0 );
if( pasa_prueba )
printf("Si pasa la prueba");
else
printf("No pasa la prueba");
system("PAUSE");
Con ms conocimiento tcnico sabemos que una expresin booleana retorna dos valores (true o
false) entonces, no es necesario preguntar con < if > por lo tanto es vlido < pasa_prueba = ( A
% 3 == 0 && 18 % A == 0 ); >. Adems tampoco es necesario if( pasa_prueba == true )
puesto que el cdigo del < if > se va a ejecutar si la expresin retorna true, pero
la variable pasa_prueba solo tiene (true o false) como valor por lo tanto es vlido
if( pasa_prueba )
5 ) Use switch para estructuras grandes, para demarcar algo importante y diferenciarlo de estructuras
< if >, adems de lo explicado anteriormente.
Ejemplo
a) Solucin no recomendada
char op;
op=getchar();
switch(op){
case 'a': case 'e':case 'i': case 'o':case 'u':
printf("Es vocal minscula"); break;
}
b) Solucin recomendada
char op;
op=getchar();
if(op=='a' || op=='e' || op=='i' || op=='o' || op=='u')
printf("Es vocal minscula ");
7) Utilice sangras. Hasta ahora no habamos resaltado la importancia de estas, sin embargo son
esenciales para la lectura del cdigo.
Tenemos fortuna de utilizar C++, pues antiguamente no contbamos con estas, asi que a sangrar
cdigo.
Para hacer un sangrado es usualmente utilizada la tecla < Tab >.
Ejemplo
a) Sin sangra
if( A > 0 ){
if( A == 5 )
printf("Es cinco positivo");
else
printf("No es cinco positivo");
}
else if ( A < 0 ){
if( A == -5 )
printf("Es cinco negativo");
else
printf("No es cinco negativo");
}
b) Con sangra
if( A > 0 ){
if( A == 5 )
printf("Es cinco positivo");
else
printf("No es cinco positivo");
}
else if ( A < 0 ){
if( A == -5 )
printf("Es cinco negativo");
else
printf("No es cinco negativo");
}
8) Fjese y utilice las ayudas del editor de cdigo de fuente como el color (azul, rojo, verde, etc.). En
nuestro caso utilizamos Visual Studio .Net el cual tiene varias ayudas.
Al inicio no se tome mucho tiempo pensando con coraje en una solucin cuando es difcil el problema y
no muestra los resultados esperados.
Use marcadores y validaciones de usuario, es decir asegrese de que la variable contiene el deseado
o supuesto valor, imprimiendo la variable por pantalla antes de entrar a una estructura. Este
concepto nos puede ahorrar horas de anlisis despus de todo Un vistazo no est de ms.
Son estructuras en las cuales un bloque de cdigo puede ser ejecutado un nmero de veces, ya sea
por un nmero que represente la cantidad de veces o por una expresin booleana.
Bucle
Iteracin: Es cada repeticin del bucle. Por ejemplo si una estructura repetitiva
tiene 3 repeticiones, tendr iteracin 1, Iteracin 2 e Iteracin 3.
A menudo las variables son utilizadas como controladores de bucles, para tal caso mostraremos como
incrementar o decrementar una variable:
Antes de utilizar una variable es necesario que esta tenga un valor contenido, ya sea por teclado o
asignacin. En estructuras repetitivas su uso muy amplio, y en aplicaciones reales son utilizadas de
muchas formas. En un sentido es una asignacin simple. Para tal caso mostraremos un ejemplo:
//Declaracion de variables
int A;
bool bandera;
//inicializacin de variables
A=0;
bandera=false;
Existe un riesgo que ocurre al no inicializar variables, estas variables pueden ser utilizadas y el
compilador no mostrara error sino hasta el tiempo de ejecucin y si el programa es complejo puede no
detectarse rpidamente
Para el caso de estructuras repetitivas (Punto a ver a continuacin) es general inicializar las variables a
cero.
En trminos prcticos una variable que no es ingresada por teclado y que va a usarse en una
estructura repetitiva siempre debe ser inicializada.
Son variables que sern utilizadas en la estructura repetitiva, Algunas de ellas son inicializadas antes
de la estructura repetitiva, otras dentro de ellas.
Contadores
Son variables que controlan mediante conteo un aspecto del bucle, pueden se controlador de
iteraciones del bucle, o contar algunos aspectos del problema a resolver por el programa.
Generalmente el conteo es de a 1.
Ejemplo
Contador = Contador + 1
Acumuladores
Son variables que van a funcionar como recolectoras de resultados individuales, es decir de cada
iteracin. Su uso es para obtener un resultado general de todo el bucle y generalmente son
sumatorias.
Ejemplo
Banderas (Flag)
Son variables que trabajan como indicadores o marcadores. Son para resolver algn aspecto de
identificacin dentro del programa. Su uso se extiende en las estructuras repetitivas para determinar la
continuacin de iteraciones. Generalmente son de tipo booleano sin embargo su uso se puede ampliar
hasta el grado de usar enteros o caracteres para representar sus mltiples estados.
Ejemplo
bool flag_casado=false;
.
if(estado_civil=='C') flag_casado = true;
Es la estructura repetitiva de C++ para ejecutar cdigo teniendo como datos el inicio , el fin e
iteraciones a procesar.
Aunque en C++ la estructura < for > es muy flexible, no es muy utilizado en sus formas complejas,
para esos casos veremos ms adelante estructuras que nos ayudaran en esos casos.
Sintaxis
<bloque de cdigo>
<expresin booleana para continuar>: si retorna true contina el bucle, caso contrario termina.
La primera vez:
for( 1 ; 2; 4 )
{
3, solo si la expresin booleana retorna true
}
for( <omitido> ; 1; 3 )
{
2, solo si la expresin booleana retorna true
}
Ejemplo:
final=7;
for( indice = 1 ; indice <= final ; indice = indice + 1 )
printf("\n Numero: %d", indice);
Explicacin del cdigo:
estado
Iteracin ndice expresin booleana ejecucin cdigo
bucle
1 1 1 <= 7 = true printf("\n Numero: %d", 1); Continua
2 2 2 <= 7 = true printf("\n Numero: %d", 2); Continua
3 3 3 <= 7 = true printf("\n Numero: %d", 3); Continua
4 4 4 <= 7 = true printf("\n Numero: %d", 4); Continua
5 5 5 <= 7 = true printf("\n Numero: %d", 5); Continua
6 6 6 <= 7 = true printf("\n Numero: %d", 6); Continua
7 7 7 <= 7 = true printf("\n Numero: %d", 7); Continua
8 8 <= 7 = true <No ejecuta cdigo> Termina
Notar que al final del bucle la variable ndice queda con el valor final del bucle ms el incremento, es
decir: ndice = final + incremento.
La expresin booleana debe estar bien planteada de lo contrario ocurre 2 posibles eventos:
-El bucle se ejecuta indefinidamente hasta acabar los recursos o bloquear la computadora por
completo.
Numero: 1
Numero: 2
Numero: 3
Numero: 4
Numero: 5
Numero: 6
Numero: 7
Una forma adicional de la estructura < for > es utilizarla como instruccin en los problemas
algortmicos y es a menudo para abreviar conteos o para marcar posiciones.
for (<valor inicial> ; <expresin booleana para continuar> ; <incremento / decremento>) ;
Puede ser utilizada para obtener precisamente el valor final del <valor inicial> al finalizar el bucle.
Esta no es la forma ms fcil de usar < for > pues puede crear confusiones, sin embargo en
aplicaciones prcticas veremos su uso.
Ejemplo:
final=7;
for ( indice = 1; indice <= final ; indice = indice + 1 );
printf("\n Numero: %d", indice);
Numero: 8
La estructura < for > puede admitir el trabajo con muchas variables, para separarlas se debe usar
coma < , > diferenciando claramente el < ; > que distingue la parte funcional del < for >.
Ejemplo:
final =10;
for( A = 1, B = - A ; A <= final ; A++, B-- )
{
printf("\n Positivo: %d", A);
printf("\t Negativo: %d", B);
}
Resultado:
Positivo: 1 Negativo: -1
Positivo: 2 Negativo: -2
Positivo: 3 Negativo: -3
Positivo: 4 Negativo: -4
Positivo: 5 Negativo: -5
Positivo: 6 Negativo: -6
Positivo: 7 Negativo: -7
Nota: Como ltimo recurso tambin es posible declarar variables dentro de la estructura < for >.
Este tipo de declaraciones aunque no es tan usado solo permite usar la variable (en este caso indice)
dentro de la estructura, es decir la variable no ser tomada en cuenta como declarada en otros lugares
del cdigo del programa.
4.2.6 Estructura repetitiva < while >
Es la estructura repetitiva para evaluar una expresin booleana y entonces ejecutar un bloque de
cdigo. A diferencia del < for > no siempre cuenta con los lmites de las iteraciones (Valor inicial y valor
final).
Sintaxis
<bloque de cdigo>
Ejemplo:
int C, S, final;
C=1; S=0; final=15
while( C <= final ){
S+=C;
printf("\n%d",C);
C+=2;
}
printf("\n\nSuma: %d",S);
El ejemplo mostrado anteriormente muestra por pantalla los 15 primeros nmeros impares positivos y
adems al final muestra la suma de ellos.
Notar las inicializaciones S=0 porque va a acumular, C=1 porque es el primer nmero impar, final=15
es el lmite superior.
Notar que dentro del < while > se cuenta con una instruccin printf que imprime por pantalla a la
variable C (nmero impar de cada iteracin) con un salto de lnea, y al finalizar el bucle imprime la
suma con dos saltos de lnea
< printf("\n\nSuma: %d",S); >.
<Inicializacin> 15 0 1
1 15 1 3 3 <= 15 = true Continua
2 15 4 5 5 <= 15 = true Continua
3 15 9 7 7 <= 15 = true Continua
4 15 16 9 9 <= 15 = true Continua
5 15 25 11 11 <= 15 = true Continua
6 15 36 13 13 <= 15 = true Continua
7 15 49 15 15 < = 15 = true Continua
8 15 64 17 17 < = 15 = false Termina
El resultado es:
11
13
15
Suma: 64
4.2.7 Estructura repetitiva < do - while >
Es la estructura repetitiva para ejecutar un bloque de cdigo por lo menos una vez, y evaluar una
expresin booleana.
Sintaxis
do{
<bloque de cdigo>
<bloque de cdigo>: Se ejecuta al menos una vez antes de que se evalu la expresin booleana,
para que se repita dicha expresin debe retornar true.
Ejemplo:
Ingresar una secuencia de nmeros, mostrar por pantalla los nmeros ingresados y su suma, hasta
que el usuario decida no ingresar ms nmeros.
char op;
int N, S;
S=0;
do{
printf("\nIngrese numero: "); scanf("%d", &N); fflush(stdin);
S+=N;
printf("\n\nNumero ingresado: %d", N);
printf("\n\n\nDesea seguir ingresando numeros?(S/N): ");
op=getchar();
} while( op!='N' && op!='n' );
printf("\n\nSuma: %d",S);
Notar las inicializaciones < S=0; > porque va a acumular, N es el nmero ingresado en la iteracin
respectiva, < op > es la variable con la opcin de seguir ingresando ms nmeros.
En este ejemplo se ingresa N mediante < scanf("%d", &N); >, se acumula < S+=N; > y se muestra
dicho valor ingresado.
Entonces llega a la expresin booleana de la estructura repetitiva, la cual va a repetir siempre que el
usuario no digite la tecla N o n.
Estado
Iteracin N S op op!='N' && op!='n'
Bucle
<Inicializacin> 0
1 5 5 S 'S'!='N' && 'S'!='n' = true Continua
2 1 6 S 'S'!='N' && 'S'!='n' = true Continua
3 9 15 S 'S'!='N' && 'S'!='n' = true Continua
4 7 22 S 'S'!='N' && 'S'!='n' = true Continua
5 50 72 N 'N'!='N' && 'N'!='n' = false Termina
< N > es un valor ingresado por teclado, es decir pueden ser cualquier nmero.
< op > es un carcter ingresado por teclado, para el ejemplo el usuario afirmo ingresar 4 nmeros
pero, como se usa la estructura < do- while > se ejecuta la primera vez sin evaluar.
El resultado es:
Ingrese numero: 5
Numero ingresado: 5
Ingrese numero: 1
Numero ingresado: 1
Ingrese numero: 9
Numero ingresado: 9
Ingrese numero: 7
Numero ingresado: 7
Ingrese numero: 50
Numero ingresado: 50
Suma: 72
4.2.8 Anidamiento de bucles
Del mismo modo en que se puede anidar las estructuras condicionales, tambin es posible anidar
estructuras repetitivas, ya que en realidad no hay regla que lo impida. Por tanto veremos el
anidamiento mediante este un ejemplo.
Ejemplo: Se pide generar la tabla de multiplicar de un nmero ingresado por teclado. Se debe solicitar
la finalizacin del programa.
char op;
int N;
do{
printf("\nIngrese numero: "); scanf("%d", &N); fflush(stdin);
for(int i=0;i<=12;i++)
printf("\n %d * %d = %d", N, i, N * i );
system("PAUSE");
Como se muestra en este ejemplo existe una estructura repetitiva < do while > y dentro de ella una
estructura repetitiva < for >. Sin embargo puede haber varios niveles de anidamiento de acuerdo a la
complejidad del problema.
1) Cuando se conozcan los lmites a iterar use la estructura < for >.
2) Cuando al menos necesite ejecutar una vez la estructura repetitiva use < do while>.
3) Cuando necesite salir de un bucle antes de ejecutar todas las iteraciones utilice la instruccin
break.
Ejemplo:
int N=5;
for(int i=1;i<=12;i++){
if (i==5)break;
printf("\n %d * %d = %d", N, i, N * i );
}
Este ejemplo muestra la tabla de multiplicar del nmero N desde 1 hasta 4, puesto que cuando llega a
5 est la instruccin break, por lo tanto termina la instruccin < for >.
Ejemplo:
a) No recomendado
int N=5;
for(int i=1;i<=12;i++){
if (i==5)
printf("\n %d * %d = %d", N, i, N * i );
}
b) Recomendado
int N=5;
for(int i=1;i<=12;i++){
if (i!=5)continue;
printf("\n %d * %d = %d", N, i, N * i );
}
Este ejemplo muestra la tabla de multiplicar del nmero <N>, pero si el indice es distinto a 5 itera
nuevamente por la instruccin continue, solo cuando llega a 5 muestra por pantalla el resultado.
5) Minimice el uso de constantes. En los bucles como en la mayora de casos es de usarse variables
por ms esttica que parezca, ya cada vez ms nos damos cuenta que no existen las constantes sino
las variables muy variables y las variables que son muy lentamente variables o las variables
lejanamente variables ya que en el futuro seguramente ser modificado su valor.
Ejemplo
a) No recomendado
for(i=1;i<=12;i++)
S+= precio * 0.18;
b) Recomendado
IGV=0.18; NroMeses=12;
for(i=1;i<=NroMeses;i++)
S+= precio * IGV;
La forma no recomendada parece correcta, pero si pensamos bien el porcentaje 0.18 representa el
IGV y aunque por aos se mantiene esa tasa, en algn momento de seguro su valor cambiara a 0.19,
0.17 u otro.
Respecto a NroMeses=12, fcilmente se puede pensar que ese valor no va a cambiar, mas la lectura
puede volverse menos tediosa cuando dejamos de ver el cdigo del programa por algn tiempo y
cuando volvamos a ver sabremos rpidamente que ese 12 que hubiesemos dejado representa los
nmeros de meses del ao.
6) Analice que variables se inicializan fuera y dentro del bucle. Como consejo practico se inicializa
afuera del bucle respectivo (por que puede haber anidamientos) las variables que van a retener un
valor global acumulado respecto al bucle. Las variables que van a retener datos de la iteracin se
deben inicializar dentro del bucle respectivo.
7) Use estructuras condicionales para asegurarse que las variables de la iteracin son las correctas e
imprmalas.
Ejemplo
int S=0;
for( int i=7;i<=100000; i+=7 ){
S+=i;
}
Ahora supongamos un caso particular, que necesitamos saber si el nmero 97930 tambin se est
sumando, entonces podramos aadir:
int S=0;
for( int i=7;i<=100000; i+=7 ){
S+=i;
if (i==97930)
printf("\n Si esta sumando!");
}
Si se muestra el mensaje en pantalla sabremos que ese nmero est siendo sumado.
No obstante este ejemplo es solo una suposicin, ya que sabemos que 97930 es mltiplo de 7. Pues
tambin podemos averiguarlo con 97930 % 7, como el resultado del mdulo es cero decimos que si
es mltiplo de 7.
8) Cudese de los bucles sin fin. Cuando en un bucle la expresin booleana que la controla nunca
retorna false entonces habremos cado en un bucle infinito. Un poco de prctica nos ser necesario
para no preocuparnos por estas.
Ejemplo
int S=0;
while(S%2==0){
printf("\n%d", S);
S+=2;
}
Este ejemplo muestra claramente que no puede ser variado la condicin de la variable S dentro del
cdigo como numero par, por lo tanto no tiene un adecuado fin el programa, porque se va a ejecutar
hasta que se acaben los recursos o porque se forz a cerrarse.
4.3 Introduccin a C++
C++ tiene sus orgenes en la dcada de los 70 y en ese entonces fue creado como C y su funcin fue
para mantener el sistema operativo UNIX y su creador fue Bjarne Stroustrup de la compaa AT&T.
Previamente hubo lenguajes: BCPL -> B -> C -> C++, pero no fue contundente como lo es hoy C++, C
comparte muchas caractersticas de C++ pero C++ hoy es ms popular por su manejo mejorado de
memoria, funcionalidades adems de contar con programacin orientada a objetos.
El lenguaje C++ utiliza directivas o archivos de cabecera que proporciona informacin necesaria til
para el programa. Para importar un archivo de cabecera se utiliza #include
iostream es el nombre de la biblioteca que contiene las definiciones de las rutinas que manejan las
entradas del teclado y el despliegue en la pantalla.
#include <iostream>
using namespace std;
fflush(stdin)
Es la funcin de C++ que va a eliminar los caracteres sobrantes en una entrada, el no utilizarla
provocar errores de entrada de mltiples variables. Se suele llamar a esta instruccin inmediatamente
luego de usar una instruccin scanf.
gets(<variable carcter>)
Funcion para ingresar una cadena de caracteres.
system("PAUSE")
Es el comando de C++ para detener la ejecucin hasta que se presione la tecla < Enter >.
system("CLS")
Es el comando de C++ para borrar la pantalla de ejecucin.
exit(0)
Termina inmediatamente el programa.
getchar()
La funcin que permite el ingreso por teclado de un carcter.
break
Permite salir o terminar a una estructura (Condicional o repetitiva por ejemplo).
continue
Permite continuar o iterar a una estructura repetitiva.
goto
Permite saltar o bifurcar el flujo del programa hacia una etiqueta.
Comentarios en C++
/*
Comentario de
varias lneas
de cdigo
*/
Un programa en C++ se compone de directivas con archivos de cabecera, la funcin principal main,
declaracin de variables e instrucciones validas de C++, a continuacin se muestra un ejemplo sencillo
completo de un programa que enva por pantalla un mensaje HOLA MUNDO.
//Archivos de encabezado
#include <iostream>
using namespace std;
printf("\nHOLA MUNDO\n");
system("PAUSE");
Creacin
Para crear
un
programa
en C++,
utilizaremos
Visual
Studio .Net
Ingresamos al
men
Archivo
Nuevo
Proyecto
En el rbol de la
izquierda,
seleccionar Visual
C++
En el panel central
seleccionar Proyecto
Vaco.
En la parte inferior
escribir el nombre
del proyecto.
Finalmente Click en
Aceptar
Click en boton
de Nuevo y
seleccionar
Agregar Nuevo
Elemento.
En el panel
izquierdo,
seleccionar
Visual C++.
En el panel
central
seleccionar
Archivo C++.cpp).
En la parte
inferior escribir el
nombre del
archivo.
Click en Agregar.
Finalmente
tendremos una
pantalla con un
editor de cdigo
fuente en el cual
introduciremos
nuestro cdigo
C++.
Ejecucin
Ahora ejecutaremos el siguiente programa con la tecla < F5 > o en el botn verde con smbolo de play
de la barra de men:
Se mostrara la ventana de ejecucin:
Depuracin
Adems se puede iniciar la depuracin en un punto escogido por el desarrollador haciendo click, y
luego ejecutando:
Al pasar el mouse por encima de alguna instruccin de C++ muestra un pequeo mensaje.
Tambin se puede
seleccionar variable
para una inspeccin
rpida.
Desplazarse
en el cdigo
con los
botones de
depuracin.
Detener la
ejecucin o
depuracin
presionamos
el botn
stop.
Captulo 5
EJERCICIOS DE
AUTOEVALUACION
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
doble = nro * 2;
cubo = nro * nro * nro;
tercera_parte = nro / 3.0;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char nombre[30];
int n1, n2, n3;
double prom;
prom = ( n1 + n2 + n3 ) / 3.0;
printf("\n\n%s tiene promedio: %8.0lf", nombre, prom);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
void main(){
char descripcion[50];
double precio, importe_compra, igv=0.18, impuestos, importe_final;
int cantidad;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
C = nro / 100;
D = (nro % 100) / 10;
U = nro % 10;
nroinv = U*100 + D*10 + C;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int seg, hor, min, seg_res, segxhor=3600, segxmin=60;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
M05 = centavos / 5;
M02 = (centavos % 5) / 2;
M01 = (centavos % 5) % 2;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Ejercicio 09: Ingrese por teclado el nombre y 2 fechas (da, mes ao)
una la fecha actual y otra la fecha de nacimiento de la persona,
calcule y muestre la edad exacta de dicha persona.
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("\n\n\%s tienes %d Ano(s) con %d Mes(es) y %d Dia(s) ", nombre, av, mv, dv );
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int A, B, aux;
aux=A;
A=B;
B=aux;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
5.2 Estructura condicional < if - else >
Ejercicio 01: Ingrese por teclado un nmero y muestre un mensaje "es cero",
solo cuando esto ocurra.
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int nro;
if(nro==0)
printf("\n\n Es cero");
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa******************************
Ejercicio 03: Ingrese por teclado el nombre, cantidad de hijos y sueldo basico
de un trabajador, Solo si el trabajador tiene hijos tendra una bonificacin
de 4% del sueldo basico, mostrar la bonificacion y el sueldo final.
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char nombre[50];
int cant_hijos;
double sueldo, bonificacion, porc=0.04, sueldoFinal;
//Inicializacion
bonificacion = 0;
sueldoFinal = sueldo;
//Evaluacion
if(cant_hijos > 0){
bonificacion = sueldo * porc;
sueldoFinal = sueldo + bonificacion;
}
//Impresion de informacion
printf("\n\n Trabajador %s tiene ", nombre);
printf("\n\n Bonificacion es : %8.2lf", bonificacion);
printf("\n\n Sueldo Final es : %8.2lf", sueldoFinal);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char caracter;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char caracter;
if(caracter == 'A' || caracter == 'E' || caracter == 'I' || caracter == 'O' || caracter == 'U')
printf("\n\n Es vocal mayuscula ");
if(caracter == 'a' || caracter == 'e' || caracter == 'i' || caracter == 'o' || caracter == 'u')
printf("\n\n Es vocal minuscula ");
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
mayor = a;
if(b > mayor)mayor = b;
if(c > mayor)mayor = c;
menor = a;
if(b < menor)menor = b;
if(c < menor)menor = c;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
|X , 1<=X<=5
|X + 5, 5< X <=25
Z => |1 / X, 25< X <=50
|5X -4, 50< X <=90
|X3 , X >90
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
double X;
//No anidamos porque segun la funcion, X solo puede entrar a una condicion.
if( 1 <= X && X <= 5){
printf("\n\n\rZ: %8.2lf \n\n", X );
system("PAUSE");
exit(0);
}
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int nro, U, D, C, M;
bool bandera=false;
if(bandera)
printf("\n\nSi cumple las condiciones\n\n");
else
printf("\n\nNo cumple las condiciones\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int nro;
if( nro % 2 == 0 )
printf("\n\nNumero es Par\n\n");
else
printf("\n\nNumero es Impar\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
Ejercicio 11: Ingrese por teclado el nombre, edad y sexo (M, F), muestre uno
de acuerdo a los datos ingresados los siguientes mensajes:
-Masculino mayor de edad
-Masculino menor de edad
-Femenino mayor de edad
-Femenino menor de edad
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
if( sexo=='M' )
if(edad>=18)
printf("\n\nMasculino mayor de edad\n\n");
else
printf("\n\nMasculino menor de edad\n\n");
else if( sexo=='F' )
if(edad>=18)
printf("\n\nFemenino mayor de edad\n\n");
else
printf("\n\nFemenino menor de edad\n\n");
else
printf("\n\nError en ingreso de sexo\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char nombre[50];
double importe, lim_impcomp = 5,
IGV = 0.18, impuestos,
dscto, descuentos,
subtotal, lim_subtotal = 500, importeFinal;
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
Ejercicio 13: Se desea saber cual es la mejor compra entre dos tipos
de pizza rectangular y circular. Para eso se ingresan las dimensiones
largo, ancho y diametro respectivamente, ademas del precio de la pizza.
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("\n\nPizza redonda\n\n");
printf("Ingrese diametro(en pulgadas) de una pizza redonda:"); scanf("%lf", &diametro);
fflush(stdin);
printf("Ingrese precio de una pizza redonda $/ :"); scanf("%lf", &precio_redonda);
fflush(stdin);
printf("\n\nPizza rectangular\n\n");
printf("Ingrese largo(en pulgadas) de una pizza rectangular :"); scanf("%lf", &largo);
fflush(stdin);
printf("Ingrese ancho(en pulgadas) de una pizza rectangular :"); scanf("%lf", &ancho);
fflush(stdin);
printf("Ingrese precio de pizza rectangular $/ :"); scanf("%lf", &precio_rectangular);
fflush(stdin);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
5.3 Estructura de selectiva mltiple < switch >
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int n;
switch(n){
case 1: printf("Uno");break;
case 2: printf("Dos");break;
case 3: printf("Tres");break;
case 4: printf("Cuatro");break;
case 5: printf("Cinco");break;
case 6: printf("Seis");break;
case 7: printf("Siete");break;
case 8: printf("Ocho");break;
case 9: printf("Nueve");break;
case 10:printf("Diez");break;
case 11:printf("Once");break;
case 12:printf("Doce");break;
case 13:printf("Trece");break;
case 14:printf("Catorce");break;
case 15:printf("Quince");break;
case 16:printf("Diez y Seis");break;
case 17:printf("Diez y siete");break;
case 18:printf("Diez y ocho");break;
case 19:printf("Diez y nueve");break;
case 20:printf("Veinte");break;
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
void main(){
int n;
switch(n){
case 1: printf("Lunes");break;
case 2: printf("Martes");break;
case 3: printf("Miercoles");break;
case 4: printf("Jueves");break;
case 5: printf("Viernes");break;
case 6: printf("Sabado");break;
case 7: printf("Domingo");break;
default: printf("Numero de dia No reconodido");break;
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char ope;
double n1, n2;
switch(ope){
case '+': printf("%8.2lf", n1 + n2);break;
case '-': printf("%8.2lf", n1 - n2);break;
case '*': printf("%8.2lf", n1 * n2);break;
case '/': printf("%8.2lf", n1 / n2);break;
default: printf("Operacion ingresada No reconodido");break;
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char ope;
double n1, n2;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
5.4 Estructura repetitiva < for >
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
for(i=ini;i<=fin;i++)
printf("\n\rNumero %d, doble %d, triple %d y su cuadrado %d.",
i,
i * 2,
i * 3,
i * i);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
for(i=ini;i<=fin;i++)
printf("\n\rALGORITMO");
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
Ejercicio 03: Digite un numero positivo y entero, visualice la
palabra "SENTENCIA" 5 veces el numero ingresado. Ademas enumere
cada visualizacion.
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
for(i=ini;i<=fin;i++)
printf("\n\r %d ALGORITMO", i);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
Ejercicio 05: Ingrese por teclado dos numeros (asuma enteros y positivos)
visualice todos los enteros consecutivos que estan comprendidos
en estos. Ademas mostrar la suma al finalizar.
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
if(n1>n2){
ini = n2;
fin = n1;
}else{
ini = n1;
fin = n2;
}
S=0;
for( i = ini + 1 ; i < fin ; i++ ){
S+=i;
printf("\n\r %d", i);
}
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char nombre[50];
int i, N, n1, n2;
double promA, promG, SG;
SG=0;
for(i=1;i<=N;i++){
SG+= promA;
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int i, N, divisores;
divisores=0;
for(i=1;i<=N;i++)
if(N%i==0)divisores++;
if(N==1 || divisores==2)
printf("\n\rEs primo ");
else
printf("\n\rNo es primo");
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
Ejercicio 09: Ingrese un numero entero de n cifras,
muestre y sume sus cifras.
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
S=0;
for(nro=N ; nro > 0 ; nro/= 10){
digito = nro % 10;
S+=digito;
}
printf("\n\nSuma digitos: %d\n\n", S);
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
a) -2 -4 -6 -8 -10...N
b) 3.3 4.4 5.5 6.6 7.7 8.8...N
c) 1 4 9 16 25 36...N
d) -1 +2 -3 +4 -5 +6 -7...N
e) -1 3 15 35 63 99...N
f) 1 2 4 7 11 16...N
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
S+=termino;
}
printf("\n\nSuma de secuencia: %d\n\n", S);
S=0; A=1;
for(i=1; i<=N ; i++){
printf("%d\t", A);
S+=A;
A+=i;
}
printf("\n\nSuma de secuencia: %d\n\n", S);
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("Ingrese nro...");scanf("%d",&x);
printf("Ingrese exponente...");scanf("%d",&y);
r=1;
for(i=1;i<=y;i++)
r*=x;
printf("Resultado...%ld\n\n",r);
system("PAUSE");
}
/***************************Fin del Programa****************************/
5.5 Estructura repetitiva < while > y < do - while >
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
char car;
do{
printf("\nIngrese caracter: "); car=getchar(); fflush(stdin);
}while(car!='K');
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int N;
do{
printf("\n\rIngrese numero : "); scanf("%d",&N);
}while(N!=0);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int N;
do{
printf("\n\rIngrese numero : "); scanf("%d",&N);
}while(N>=10);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int N, U, D;
do{
printf("\n\rIngrese numero de dos cifras: "); scanf("%d",&N); fflush(stdin);
D = N/10;
U = N%10;
}while( D + U != 12 );
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int ini, fin, i;
ini=33;
fin=9000;
i=ini;
while( i<=fin ){
printf("\n\r %d", i);
i+=2;
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
nro=N;
nroInv=R=0; //Inicializamos las dos variables a cero.
do{
R = nro % 10;
nro = nro / 10;
nroInv = (nroInv * 10) + R;
}while( nro > 0 );
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
void main(){
nro=N;
nroInv=R=0;
incremento=1;
do{
R = nro % 5;
nro = nro / 5;
nroInv = nroInv + R * incremento;
incremento = incremento * 10;
}while( nro > 0 );
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
cp=ci=c7=ct=0;
do{
printf("\n\rIngrese numero : "); scanf("%d",&N); fflush(stdin);
if(N!=0){
if(N%2==0) cp++;
else ci++;
if(N%7==0)c7++;
}
ct++;
}while( N != 0 );
printf("\n\r Cantidad Pares : %ld", cp);
printf("\n\r Cantidad ImPares : %ld", ci);
printf("\n\r Cantidad Multiplos 7 : %ld", c7);
printf("\n\r Total Numeros Ingresados: %ld", ct);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int N, A, B, i, S;
// A-> 1 1 2 3 5 8 13 21 ...N
// B-> 1 0 1 1 2 3 5 8
S=i=A=0;
B=1;
do{
A=A + B;
B=A - B;
S+= A;
printf("\t%d", A);
i++;
}while( i<N );
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/*********************************************************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int nro, U, D, C, S;
bool bandera=true;
S=0;
while(bandera){
bandera = ( nro%2!=0 );
if( !bandera )continue;
C = nro / 100 ;
D = (nro % 100) / 10;
U = nro % 10;
bandera = ( C != D && D != U );
if( !bandera )continue;
S+=nro;
}
/*********************************************************************
a) -1 -2 3 4 -5 -6 7 8...N
b) -1 -2 -3 4 5 6 -7 -8 -9...N
c) -1 -2 -3 -4 5 6 7 8...N
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("%d\t", termino);
S+= termino;
if( C == cambio_signo ){
C=0;
bandera = !bandera;
}
i++;
}
system("PAUSE");
}
/***************************Fin del Programa****************************/
5.6 Anidamiento de bucles
a) No me sobre dinero
b) Me sobre al menos S/. 10 soles
c) Me sobre al menos S/. 500 soles
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
combinacion=0;
for(i100=1;i100<=final100;i100++)
for(i50=1;i50<=final50;i50++)
for(i10=1;i10<=final10;i10++){
if( !((i100*B100 + i50*B50 + i10*B10) == (Monto - sobra)) )continue;
combinacion++;
printf("\n\rCombinacion: %d\tB100: %d B50: %d B10: %d",
combinacion,
i100,
i50,
i10);
}
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
base=10;
s=0;
for( i=1 ; i<=n ; i++){
termino=1;
for( j=1 ; j<=i ; j++)
termino = termino * base;
base+=5;
s+=termino;
}
printf("\n\nLa suma es...%u",s);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int c,cd,i,j;
long s;
c=s=0;
for(i=1000;i<=9999;i++){
cd=0;
for(j=1;j<=i;j++)
if(i%j==0)
cd++;
if(cd==2){
printf("Primo %d : %d\n\r",c, i);
c++;
s+=i;
}
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Recordar que:
!3 = 3*2*1
!n = n*(n-1)*(n-2)*...* 1
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int n,i,j;
unsigned long s, termino;
printf("Ingrese #...");scanf("%d",&n);
s=0;
for(i=1;i<=n*2;i+=2){
termino=1;
for(j=1;j<=i;j++)
termino*=j;
}//CIERRE FOR
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
s=0;
for(i=5;i<=1000;i++){
sd=0;
for(j=1;j<=i/2;j++)
if(i%j==0)
sd+=j;
if(sd==i){
printf("Es perfecto..%d\n", i);
s+=i;
}
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
1! 1 2! 1 3! 2 4! 3 5! 5 ...N
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int n,i;
unsigned long S, termino;
int A, B;//fibonacci
int j, terminofac;//factorial
printf("Ingrese #...");scanf("%d",&n);
// 1! 1 2! 1 3! 2 4! 3 5! 5 ...N
// 1! 2! 3! 4! 5! =>factorial
// 1 1 2 3 5 =>fibonacci
// 1 2 3 4 5 6 7 8 9 10...N -> i
S=0;
A=0;B=1;//fibonacci
terminofac=0;//factorial
for(i=1;i<=n;i++){
if(i%2==0){//fibonacci
A=A+B;
B=A-B;
termino = A;
printf("%u\n", termino);
}else{//factorial
terminofac++;
termino=1;
printf("%d! = ", terminofac);
for( j=1 ; j<=terminofac ; j++ ){
termino = termino * j;
if(j < terminofac)
printf("%d * ", j);
else
printf("%d", j);
}
}
S+=termino;
}
printf("\n\nLa suma es...%u",S);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int n,m, i, mayor, menor, ns, ms;
printf("Ingrese numerador...");scanf("%d",&n);
printf("Ingrese denominador...");scanf("%d",&m);
mayor=n;
if(m>mayor)mayor=m;
ns=n;
ms=m;
for(i=mayor;i>=1;i--)
if(ns%i==0 && ms%i==0){
ns=ns/i;
ms=ms/i;
}
printf("\n\nNumerador simplificado...%d",ns);
printf("\n\nDenominador simplificado...%d",ms);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
printf("Ingrese numerador...");scanf("%d",&n);
printf("Ingrese denominador...");scanf("%d",&m);
mayor=n;
if(m>mayor)mayor=m;
ns=n;
ms=m;
for(i=mayor;i>=1;i--)
if(ns%i==0 && ms%i==0){
ns=ns/i;
ms=ms/i;
}
printf("\n\nNumerador simplificado...%d",ns);
printf("\n\nDenominador simplificado...%d",ms);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
int n,u,d,c,m, i;
char r;
do{
m=n/1000;
c=(n%1000)/100;
d=((n%1000)%100)/10;
u=n%10;
printf("\n\n\t\t";
for(i=1;i<=m;i++)
printf("M");
if(c==9)
printf("CM");
else
for(i=1;i<=c;i++)
printf("C");
if(d==9)
printf("XC");
else
for(i=1;i<=d;i++)
printf("X");
switch(u){
case 1:printf("I");break;
case 2:printf("II");break;
case 3:printf("III");break;
case 4:printf("IV");break;
case 5:printf("V");break;
case 6:printf("VI");break;
case 7:printf("VII");break;
case 8:printf("VIII");break;
case 9:printf("IX");break;
}
printf("\n\nDesea Continuar S/N ";
r=getchar();
}while(r=='s'|| r=='S');
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const double MES=12;
double cant, tasa, ncant, cant_sug, pag_men, inte;
int tiempo;char op;
printf("\n\n1. Esta conforme con lo que recibe.\n2. Desea recibir %1.2f", cant);
printf("\n\nIgrese Opcion: ");
op=getchar(); fflush(stdin);
switch(op){
case '2':
cant_sug=cant;
do{
cant_sug+=0.1;
inte=((cant_sug*tasa) / 100) * (tiempo / MES);
ncant=cant_sug - inte;
pag_men=cant_sug / tiempo;
}while(ncant < cant);
printf("\n\nUsted debe solicitar %1.2lf y los pagara en %d meses con cuotas de %1.2lf.",
cant_sug, tiempo, pag_men); break;
default: break;
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Captulo 6
Funciones Predefinidas de
C++
6.1 Concepto de Funcin
Introduccin
Los desarrolladores en C++, hacen sus programas teniendo siempre en mente escribir lo menos
posible reutilizando bloques de cdigo, dividiendo mentalmente las partes del programa (entrada -
proceso salida) como divisiones principales.
Adems hay procesos cotidianos en los programas que a menudo no vale la pena escribirlos
reiteradamente, En eso C++ nos facilita la labor pues cuenta con funciones predefinidas de diferentes
tipos y para cada tipo de situaciones. No obstante antes de mostrar las funciones predefinidas
mostraremos el concepto de funcin para ingresar con ms visin a las funciones.
Una funcin es un conjunto de instrucciones con una tarea determinada, una funcin es utilizada para
dividir un programa en subprogramas con tareas propias de la funcin. Una funcin siempre devuelve
valor.
Valor
Tipo Dato Tipo Dato Librera
Funcin Descripcin Ejemplo devuelto
Argumento devuelto (**)
ejemplo
double double sqrt(4.0) 2.0
sqrt Raz cuadrada float float sqrt(4.0) 2.0 math.h
long long sqrt(4) 2
pow(2.0,
double 8.0
double 3.0)
8.0
pow(2.0, 3)
pow pow(2.0,
Potencias float float 8.0 math.h
(*) 3.0)
8.0
pow(2.0, 3)
long long
pow(20.0, 3) 8000.0
double double
abs(-7.0) 7
double double
abs(7.0) 7
abs(-7.0) 7 math.h
float float
abs(7.0) 7
abs(-7) 7
int int
abs Valor Absoluto abs(7) 7
abs(-70000) 70000
long long
abs(70000) 70000
long long abs(- stdlib.h
70000.0
double double 70000.0)
70000.0
abs(70000.0)
ceil(3.2) 4.0
double double
ceil(3.9) 4.0
ceil(3.2) 4.0
float float
Techo(redondeo ceil(3.9) 4.0
ceil math.h
arriba) ceil(30000.2
long long ) 30001.0
double double ceil(30000.9 30001.0
)
floor(3.2) 3.0
double double
floor (3.9) 3.0
floor (3.2) 3.0
float float
floor (3.9) 3.0
floor Piso(redondeo abajo) math.h
floor
long long (30000.2) 30000.0
double double floor 30000.0
(30000.9)
double double exp(1.0) 2.7
float float exp(1.0) 2.7
exp Exponencial math.h
long long
exp(10.0) 22026.5
double double
double double log(5.0) 1.6
float float log(5.0) 1.6
log Logaritmo natural(ln) math.h
long long
log(1000.0) 6.9
double double
double double log10(10.0) 1.0
Logaritmo base 10 float float log10(10.0) 1.0
log10 math.h
(ln) long long log10(1000.0
3.0
double double )
(*) Para la funcin pow y otras, solo basta con asignar a una variable de tipo del valor devuelto de la
funcin o mostrar por pantalla con el formato, por ejemplo:
Guardando el valor en variable:
Valor
Tipo Dato Tipo Dato Librera
Funcin Descripcin Ejemplo(*) devuelto
Argumento devuelto (**)
ejemplo
double double cos(0.0) 1.0
cos Coseno float float cos(0.0) 1.0 math.h
long double long cos(1000.0) 0.6
double double acos(1.0) 0.0
acos Arco Coseno float float acos(1.0) 0.0 math.h
long double long double acos(0.5) 1.0
double double sin(0.5) 0.5
math.h
sin Seno float float sin(0.5) 0.5
long double long double sin(10.0) -0.5
double double asin(0.8) 0.9
asin Arco Seno float float asin(0.8) 0.9 math.h
long double long double asin(1.0) 1.6
double double tan(1.0) 1.6
tan Tangente float float tan(1.0) 1.6 math.h
long double long double tan(100.0) -0.6
double double atan(0.8) 0.7
Arco
atan float float atan(0.8) 0.7 math.h
Tangente
long double long double atan(100.0) 1.6
double double cosh(1.0) 1.5
Coseno
cosh float float cosh(1.0) 1.5 math.h
Hiperblico
long double long double cosh(10.0) 11013.2
double double tanh(1.0) 0.8
Tangente
tanh float float tanh(1.0) 0.8 math.h
Hiperblico
long double long double tanh(0.5) 0.5
(*) Notar que en los ejemplos se asignan como parmetros constantes de tipo real, pues todos aceptan
reales ya sea double, float o long double, no obstante tambin es posible asignar variables con
el tipo solicitado en la funcin.
Muchas de las funciones predefinidas toman como base la tabla de cdigos ascii.
(*)32 56 8 80 P 104 h
33 ! 57 9 81 Q 105 i
34 " 58 : 82 R 106 j
35 # 59 ; 83 S 107 k
36 $ 60 < 84 T 108 l
37 % 61 = 85 U 109 m
38 & 62 > 86 V 110 n
39 ' 63 ? 87 W 111 o
40 ( 64 @ 88 X 112 p
41 ) 65 A 89 Y 113 q
42 * 66 B 90 Z 114 r
43 + 67 C 91 [ 115 s
44 , 68 D 92 \ 116 t
45 - 69 E 93 ] 117 u
46 . 70 F 94 ^ 118 v
47 / 71 G (*)95 _ 119 w
48 0 72 H 96 ` 120 x
49 1 73 I 97 a 121 y
50 2 74 J 98 b 122 z
51 3 75 K 99 c 123 {
52 4 76 L 100 d 124 |
53 5 77 M 101 e 125 }
54 6 78 N 102 f 126 ~
55 7 79 O 103 g
La tabla muestra los caracteres imprimibles por pantalla incluyendo el carcter con cdigo nmero 32
que representa el espacio en blanco y el carcter nmero 95 es la lnea inferior.
Funciones de caracteres
Valor
Tipo
Tipo Dato devuelt Librera
Funcin Descripcin Dato Ejemplo(*)
Argumento o (**)
devuelto
ejemplo
Devuelve true si su
isalnum('B')
argumento satisface true
isalnum('1')
isalnum isalpha o isdigit. char bool true ctype.h
isalnum('+')
Caso contrario devuelve false
false.
Devuelve true si su
argumento es letra isalpha('B')
true
(Mayscula o isalpha('1')
isalpha char bool false ctype.h
Minscula). Caso isalpha('+')
false
contrario devuelve
false.
Devuelve true si su isdigit('B')
false
argumento es un digito. isdigit('1')
isdigit char bool true ctype.h
Caso contrario devuelve isdigit('+')
false
false.
Devuelve true si su
argumento es un
carcter imprimible que
ispunct('B')
no satisface isalnum y false
ispunct('1')
ispunct no es espacio en blanco char bool false ctype.h
ispunct('+')
(Caracteres de true
puntuacin). Caso
contrario devuelve
false.
Devuelve true si su isspace(
argumento es un ' ') true
carcter de espacio en isspace(' ') true
isspace char bool ctype.h
blanco (Tabular, Enter). isspace('\n' true
Caso contrario devuelve )
false.
Devuelve true si su iscntrl
argumento es un (
iscntrl
carcter de control. Caso char bool char(127) true ctype.h
(*)
contrario devuelve )
false.
Devuelve true si su islower('a') true
islower char bool ctype.h
argumento es letra islower('A') false
Minscula. Caso islower('+') false
contrario devuelve
false.
isupper
Devuelve true si su ('a')
argumento es letra isupper false
isupper Mayscula. Caso char bool ('A') true ctype.h
contrario devuelve isupper false
false. ('+')
Devuelve la versin en
tolower('A')
minscula de su a
tolower('a')
tolower argumento. Si no tiene char char a ctype.h
tolower('+')
minscula devuelve el +
mismo argumento
Devuelve la versin en
toupper('A')
mayscula de su A
toupper('a')
toupper argumento. Si no tiene char char A ctype.h
toupper('+')
mayscula devuelve el +
mismo argumento
(*) Hay una forma de averiguar cules son caracteres de control y esto es con las siguientes
instrucciones:
for(int i=1;i<=127;i++)
if(iscntrl(char(i)))
printf("\n%d = %c", i, char(i));
El resultado nos mostrara todos los caracteres en el cual su cdigo ascii esta entre (1-31) y el 127. Son
caracteres no imprimibles por ejemplo el nmero 10 que representa la tecla <Enter>
Valor
Librera
Prototipo Descripcin Ejemplo devuelto
(**)
ejemplo
int atoi
Convierte <cadena> char cad[2]={'1','0'};
(char* <cadena>) 10 stdlib.h
hacia un int atoi(cad);
long atol
Convierte <cadena> char cad[2]={'0','5'};
(char* <cadena>) 5 stdlib.h
hacia un long atol(cad);
double atof char
Convierte <cadena>
(char* <cadena>) cad[3]={'0','.','5'}; 0.5 math.h
hacia un double
atof(cad)
char* strcat(
Anexa o junta char cad1[10]={'A','B'};
char*
<cad_origen > al char cad2[2]={'C'};
<cad_destino>, ABC string.h
final de strcat(cad1, cad2);
char* <cad_origen>
<cad_destino> printf("\n%s", cad1);
)
Devuelve 0, si las
char cad1[1]={'A'};
cadenas son
int strcmp( char cad2[1]={'A'};
iguales, 1 si
char* <cadena1>, printf("\n%d", 0 string.h
<cadena1> es mayor
char* <cadena2>) strcmp(cad1, cad2));
a <cadena2> y -1 si
es menor (*)
char* strcpy(
Cambia el valor de char cad[10];
char*
<Expresioncad> strcpy(cad, "ABC");
<cad_destino>, ABC string.h
hacia printf("\n%s", cad);
char*
<cad_destino>
<Expresioncad>)
int strlen char cad[10]={'A','B'};
Devuelve la longitud
(char* <cadena>) printf("\n%d", ABC string.h
de <cadena>
strlen(cad));
char* strncat(
char* Anexa o junta <n>
char cad1[10]={'A','B'};
<cad_destino>, caracteres de
char cad2[2]={'C','D'};
char* <cad_origen > al ABC string.h
strncat(cad1,cad2,1);
<cad_origen>, final de
printf("\n%s", cad1);
int <n>) <cad_destino>
int strncmp(
Compara <n> char cad1[10]={'A','B'};
char* <cadena1>,
caracteres de char cad2[2]={'A','C'};
char* <cadena2>, 0 string.h
<cadena1> con printf("\n%d",
int <n>)
<cadena2> strncmp(cad1, cad2, 1));
char
Devuelve un puntero
cad1[10]={'A','B','C'};
a la primera
char cad2[10]={'B'};
char* strstr( ocurrencia de la
char cad3[10];
char* <cadena>, cadena <Patrn> BC string.h
strcpy(cad3, strstr(cad1,
char* <Patrn>) en <cadena> y
cad2));
NULL si no lo
printf("\n%s", cad3);
encuentra
Devuelve un puntero char cad1[10]={'A','B',
char* strchr(
a la primera 'A','B'};
char* <cadena>, BAB string.h
ocurrencia de la char car='B';
char <caracter>)
cadena < char cad3[10];
caracter> en strcpy(cad3, strchr(cad1,
<cadena> y NULL car));
si no lo printf("\n%s", cad3);
encuentra
Devuelve un puntero char cad1[10]={'A','B',
a la ltima 'A','B'}; char car='B';
ocurrencia de la char cad3[10];
char* strrchr(
cadena < strcpy(
char* <cadena>, B string.h
caracter> en cad3, strrchr(cad1, car)
char <caracter>)
<cadena> y NULL );
si no lo printf("\n%s", cad3);
encuentra
Ejemplos:
(**) Las libreras mostradas en las tablas son automticamente referenciadas en Visual Studio .Net por
la ya conocida referencia:
#include <iostream>
using namespace std;
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
int tiempo, desde, hasta, Numero;
tiempo=time(NULL);
srand(tiempo);
desde=50; hasta=150;
printf("%d\n", Numero);
system("PAUSE");
#include "stdlib.h"
#include "time.h"
desde=50; hasta=150;
a + rand() % (1 + b - a)
Captulo 7
Programacin Modular
7.1 Diseo descendente
7.2 Subprogramas
7.4 Funciones
7.5 Procedimientos
Introduccin
Los desarrolladores en C++, hacen sus programas teniendo siempre en mente el conocido dicho
Divide y vencers, el cual nos va a evitar serios dolores de cabeza a la hora de realizar aplicaciones
grandes y complejas. En C++ es esencial el trabajo modular ya sea por objetivos, abstraccin o por
reutilizacin.
Lnea 1 xxxxxxxx
Lnea 2 xxxxxxxx
Lnea 3 xxxxxxxx
Lnea 4 xxxxxxxx
Lnea 5 xxxxxxxx
...
Lnea n-1 .....
Lnea n.....
7.2 Subprogramas
Son subdivisiones que bifurcan o alteran el flujo del cdigo en un programa. Hacia la zona del
subprograma, esto puede ser en la hoja de cdigo o en ocasiones a otros archivos.
SUBPROGRAMA (Y)
Lnea 1 xxxxxxxx
Lnea 2 xxxxxxxx
Lnea 3 xxxxxxxx
Lnea n.....
Notar que el programa principal cuenta con 2 subprogramas estos puede estar dentro de la hoja de
cdigo o en otro archivo.
El compilador comienza con la lnea 1, lnea 2 y llega a la lnea en la cual se llama al subprograma X,
entonces el flujo brinca al subprograma X entonces comienza a ejecutarse la lnea 1, 2, n del
subprograma. Al terminar de ejecutarse el subprograma el flujo retorna al programa principal.
Entonces contina el programa principal con la lnea 4, 5, 6 entonces vuelve a llamar al subprograma X
y vuelve a ejecutar y terminar sus instrucciones para retornar nuevamente al programa principal.
Se ejecuta las lneas 8,9,10 y llega a la invocacin del subprograma Y, entonces similar a lo que hizo
el compilador con el subprograma X hace con Y, ejecuta las lneas del subprograma Y, al finalizar
retorna al programa principal hasta terminar de ejecutar lo restante.
7.3 Variables globales y locales
Una variable es global o local en funcin de la zona dentro de la hoja de cdigo en donde es
declarada. Esto puede ser por el alcance del valor de la variable con la cual se necesita trabajar.
Variable global
Es una variable que es declarada fuera de todo modulo, su valor almacenado es mantenido hasta que
se termine el programa.
#include <iostream>
using namespace std;
Variable local
Es una variable que es declarada dentro de un mdulo, su valor almacenado es mantenido hasta que
termine el modulo.
#include <iostream>
using namespace std;
void main(){
int nro; //Variable Local del programa principal
7.4 Funciones
Una funcin es un mdulo de instrucciones con una tarea especfica que retorna siempre resultado(s).
Este resultado es del tipo de datos con el cual fue definido.
Una funcin es cdigo en espera hasta que la funcin sea invocada desde el programa principal, el
valor devuelto por la funcin puede ser almacenado o mostrado directamente por pantalla.
Para utilizar una funcin antes previamente debe ser definida. A continuacin mostramos la definicin
de una funcin:
<Conjunto de instrucciones>
return <valor/variable>;
}
Dnde:
<Tipo de dato>:
Tipo de datos valido C++ (int, double, bool, etc.) Vase apartado 3.1.1
<Nombre Funcin> :
Identificador valido C++(Aplica las reglas a nombrar variables Vase apartado 3.1.3)
<Lista de argumentos>:
Lista de variables separadas por coma, cada argumento debe estar declarado con el tipo de dato
(<Tipo de dato > <Argumento1>, < Tipo de dato > <Argumento2>,)
<valor/variable>:
Valor o variable que la funcin devolver como resultado, cabe decir que este resultado debe ser del
tipo de dato declarado por la funcin.
Ejemplo:
La funcin f_sumar es un cdigo en espera sino hasta que es invocado desde el modulo void main.
Para invocar a una funcin se nombra la funcin y se pasan valores como se muestra a continuacin:
void main(){
int A, resultado;
A=10;
resultado=f_sumar(A, 5);//Invocacion a funcion
printf("%d\n", resultado);//Muestra 15
system("PAUSE");
}
Una funcin no es necesariamente invocado de la funcin principal void main tambin es posible que
sea invocado desde cualquier funcin valida de C++, y todas ellas estarn en espera hasta que sean
invocados desde el modulo void main. A continuacin mostraremos como se invoca una funcin
dentro de otra:
int f_sumar(int A, int B){
int devolver;
devolver = A + B;
return devolver;
}
#include <iostream>
using namespace std;
//Programa Principal
void main(){
int A, resultado;
A=10;
resultado=f_doble(A);//Invocacion a funcin f_doble
printf("%d\n", resultado);//Muestra 20
system("PAUSE");
}
7.5 Procedimientos
Un procedimiento es un tipo de funcin con la nica restriccin que NO retorna resultado(s). Por tanto
todas las reglas que se describieron para las funciones son tambin aplicables a los procedimientos.
En C++ los procedimientos tambin son conocidos como funciones void. Se concibe a un
procedimiento como bloque de cdigo que es anexado al mdulo que lo invoca.
Para utilizar un procedimiento antes previamente debe ser definida. A continuacin mostramos la
definicin de un procedimiento:
<Conjunto de instrucciones>
Dnde:
Identificador valido C++(Aplica las reglas a nombrar variables Vase apartado 3.1.3)
<Lista de argumentos>:
Lista de variables separadas por coma, cada argumento debe estar declarado con el tipo de dato
(<Tipo de dato > <Argumento1>, < Tipo de dato > <Argumento2>,)
Ejemplo:
El procedimiento f_mostrar es un cdigo en espera sino hasta que es invocado desde el modulo
void main.
void main(){
int A, resultado;
A=10;
f_mostrar(A); //Invocacion a Procedimiento f_mostrar
}
#include <iostream>
using namespace std;
//Procedimiento Principal
void main(){
int A, resultado;
A=10;
f_mostrar(A);//Invocacion a Procedimiento f_mostrar
}
Como podemos apreciar la funcin principal void main es un procedimiento o una funcin void.
Tener en cuenta que las variables que se declaran y los argumentos solo cuentan dentro del mdulo
donde fueron declaradas, por lo tanto el argumento (int A) del procedimiento f_mostrar y la
variable int A de void main son distintas.
En C++ los parmetros o argumentos de una funcin pueden ser de dos tipos: Por valor o por
referencia.
Son aquellos parmetros en los cuales el valor o contenido de los parmetros es copiado, y dentro de
la funcin se trabaja con dicha copia. Esto sugiere que la variable real no puede ser modificada en
contenido.
void main(){
int A;
A=10;
f_incrementar(A);//Muestra 11
printf("%d\n", A);//Muestra 10
system("PAUSE");
}
Son aquellos parmetros en los cuales la direccin de memoria es pasada hacia la funcin, esto indica
que dentro de la funcin se trabaja realmente con la variable que es pasada como argumento, por
tanto dicha variable puede ser modificada.
Para decirle al compilador de C++ que un argumento es por referencia se debe anteponer a la variable
el smbolo de ampersand &.
void main(){
int A;
A=10;
f_incrementar(A);//Muestra 11
printf("%d\n", A);//Muestra 11
system("PAUSE");
}
Se recomienda usar parmetros por referencia en lo mnimo. Es posible tambin modificar variables en
funciones si la declaramos como variables globales, esto nos va a facilitar el entendimiento y sabremos
que estamos modificando.
Captulo 8
Arreglos
8.3 Ordenamientos
8.4 Bsquedas
Introduccin
Los arreglos son conjuntos de datos del mismo tipo, agrupados en una variable y cuyo acceso
individual es numrico, este acceso individual es denominado ndice. Un arreglo puede contener por
ejemplo listas de calificaciones de exmenes, de temperaturas o de nombres.
Cabe decir que la cantidad de elementos de los arreglos es de tipo esttica es decir que al declarar la
longitud del vector esta va a mantener su longitud hasta el final del programa.
int A[10]
0 1 2 3 4 5 6 7 8 9
7 5 6 3 0 8 2 1 15 9
Asignar a un elemento del vector es mediante la variable seguida del ndice entre corchetes as como
sigue a continuacin:
Leer o escribir un elemento del vector es similar ha como se hace a variables individuales mediante la
variable seguida del ndice entre corchetes as como sigue a continuacin:
Lectura
scanf(<formato>, &<Variable_vector>[<indice>] );
Ejemplos
Escritura
Ejemplos
printf("%d", A[ 5 ]);
printf("%lf", B[ 0 ]);
printf("%d y %8.2lf", A[ p ], B[ p ]);
Recorrido
Para recorrer un vector ya sea para asignacin, lectura o escritura utilizamos la sentencia for
Longitud=10;
for(i=0 ; i< Longitud ; i++){
A[i]=i;
}
Longitud=10;
for(i=0 ; i< Longitud ; i++){
scanf("%d", &A[i]);
}
Ejemplo 3 Impresin por teclado a cada elemento en una lnea para un vector de 10 elementos:
Longitud=10;
for(i=0 ; i< Longitud ; i++){
printf("%d\n", A[i]);
}
Insercin
Sabemos que la longitud del vector es de tipo esttica por tanto la insercin es simulada, es decir no
aumenta la longitud declarada al inicio.
Para tal caso debemos declarar la longitud del vector con un valor mximo tope, que contemple la
longitud actual ms las inserciones.
0 1 2 3 4 5
2 3 1 4
Algoritmo de insercin:
A[posicion-1] = nro_insertar;
N++;
Dnde:
< for(i = N-1 ; i>=posicion-1 ; i--) > significa que la variable < i > comienza de la longitud
del vector < N-1 >, y termina en la posicin a insertar < i>=posicion-1 >. < A[i+1] = A[i] >
significa el elemento siguiente es igual al anterior.
A[i+1] = A[i]
A[4] = A[3]
A[3] = A[2]
A[2] = A[1]
Resultado:
0 1 2 3 4 5
2 3 3 1 4
A[posicion-1] = nro_insertar;
A[2-1] = 10;
0 1 2 3 4 5
2 10 3 1 4
N++;
N=5
Eliminacin
Sabemos que la longitud del vector es de tipo esttica por tanto la eliminacin es simulada, es decir no
decrementa la longitud declarada al inicio.
0 1 2 3 4 5
2 3 1 4 5
Algoritmo de eliminacin:
N--;
Dnde:
<A>: Vector de elementos
< for(i= posicion; i<N ; i++) > significa que la variable < i > comienza de la posicin a
eliminar < i= posicion > hasta la longitud del vector < i<N >. < A[i-1] = A[i] > significa el
elemento anterior es igual al siguiente.
A[i-1] = A[i]
A[1] = A[2]
A[2] = A[3]
A[3] = A[4]
Resultado:
0 1 2 3 4 5
2 1 4 5 5
N--;
A continuacin mostramos una matriz de tipo entero de 5x5 (filas x columnas) elementos:
int A[5][5]
A[0][0]=2 A[0][3]=6
0 1 2 3 4 A[1] [1]=6
0 2 3 5 6 7
1 5 6 0 8 6 A[2] [3]=9
2 2 6 3 9 5
3 1 2 7 2 8 A[3] [1]=2
4 7 8 9 3 4
Asignar a un elemento de la matriz es mediante la variable seguida de los ndices entre corchetes as
como sigue a continuacin:
Ejemplos:
A[0][0] = 7; A[3][1] = 3; A[8][8] = 15;
Leer o escribir un elemento de la matriz es similar ha como se hace a variables individuales mediante
la variable seguida de los ndices entre corchetes as como sigue a continuacin:
Lectura
scanf(<formato>, &<Variable_matriz>[<ndice_fila>][<ndice_columna>]);
Ejemplos
Escritura
Ejemplos
printf("%d", A[ 5 ][ 4 ]);
printf("%lf", B[ 0 ][ 0 ]);
printf("%d y %8.2lf", A[ f ][ 1 ], B[ f ][ c ]);
8.2.4 Recorridos y ejemplos de matrices.
Para recorrer una matriz ya sea para asignacin, lectura o escritura utilizamos 2 sentencias for
Uno para controlar las filas y otro para las columnas, as como se muestra a continuacin:
Ejemplo 1 Asignacin de la suma de los ndices a cada elemento de una matriz de 5x4 elementos:
TotalFilas=5;
TotalColumnas=4;
for(fila=0 ; fila < TotalFilas ; fila++)
for(columna=0 ; columna < TotalColumnas; columna++)
A[fila][columna]= fila + columna;
Ejemplo 2 Recorrer y sumar cada elemento en forma horizontal para una matriz de 2x3 elementos:
TotalFilas=2;
TotalColumnas=3;
S=0;
for(fila=0 ; fila < TotalFilas ; fila++)
for(columna=0 ; columna < TotalColumnas; columna++)
S+=A[fila][columna];
Recorrido:
fila columna
0 0
0 1
0 2
1 0
1 1
1 2
Ejemplo 3 Recorrer y sumar cada elemento en forma vertical para una matriz de 2x3 elementos:
TotalFilas=2;
TotalColumnas=3;
S=0;
for(columna=0 ; columna < TotalColumnas; columna++)
for(fila=0 ; fila < TotalFilas ; fila++)
S+=A[fila][columna];
Recorrido:
columna fila
0 0
0 1
1 0
1 1
2 0
2 1
TotalFilas=5;
TotalColumnas=6;
for(fila=0 ; fila < TotalFilas ; fila++)
for(columna=0 ; columna < TotalColumnas; columna++)
scanf("%d", A[fila][columna]);
Las instrucciones anteriores son correctas sin embargo tendremos que ingresar por teclado 5x6 veces
es decir 30.
TotalFilas=5; TotalColumnas=6;
desde=1; hasta=10;
for(fila=0 ; fila< TotalFilas ; fila++)
for(columna=0 ; columna< TotalColumnas ; columna++)
A[fila][columna] = desde + rand() % (1 + hasta - desde);
tiempo=time(NULL);
srand(tiempo);
TotalFilas=5; TotalColumnas=6;
desde=1; hasta=5;
for(fila=0 ; fila< TotalFilas ; fila++){
printf("\n\n\t");
for(columna=0 ; columna< TotalColumnas ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
//Definition
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
//Ingreso
printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N); fflush(stdin);
printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M);
fflush(stdin);
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
//Definition de matriz
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
//Ingreso orden matriz
printf("\n\rIngrese # de filas de la matriz: "); scanf("%d", &N);
fflush(stdin);
printf("\n\rIngrese # de columnas de la matriz: "); scanf("%d", &M);
fflush(stdin);
tiempo=time(NULL);
srand(tiempo);
printf("\n\n");
system("PAUSE");
8.3 Ordenamientos
El primer < for > indica que se debe recorrer desde el inicio < i=0 > hasta el penltimo elemento <
i<N-1 >
El segundo < for > indica que se debe recorrer desde el siguiente del elemento actual < j=i+1 >
hasta el ltimo elemento < j<N >
i j
0 1,2,3,4,5
1 2,3,4,5
2 3,4,5
3 4,5
4 5
aux = A;
A = B;
B = aux;
Supongamos que el vector es el siguiente:
0 1 2 3 4 5
3 5 4 6 7 0
Como conocemos N=6, el recorrido de las variables <i> y <j> el algoritmo del intercambio es
entonces:
1 2 5 4 true 0 4 5 6 7 3
1 3 4 6 false
1 4 4 7 false
1 5 4 3 true 0 3 5 6 7 4
2 3 5 6 false
2 4 5 7 false
2 5 5 4 true 0 3 4 6 7 5
3 4 6 7 false
3 5 6 5 true 0 3 4 5 7 6
4 5 7 6 0 3 4 5 6 7
0 3 4 5 6 7
Captulo 9
Cadenas
9.1 Fundamentos de cadenas
Introduccin
En el mundo de la programacin y sistemas se trabajan con base de datos. Que no es ms que datos
interrelacionados, y en su mayora almacena datos de tipo texto (Cadenas).
Entonces debemos aprender tambin a manejar bien los datos tipos cadenas en operaciones de
concatenacin, extraccin, filtros, etc.
En C++ existen dos tipos de cadenas: estticas y dinmicas. Nosotros comenzaremos con las de tipos
estticas para comprender el manejo interno y de cmo son las operaciones primitivas.
Representacin Grafica
char A[12]
0 1 2 3 4 5 6 7 8 9 10 11 12
H O L A M U N D O \0 ? ?
Asignar a un elemento de la cadena es mediante la variable seguida de los ndices entre corchetes as
como sigue a continuacin:
A[0] = '7';
A[3] = (char)65;
A[8] = 'A';
Leer o escribir un elemento de la cadena es similar a como se hace en los vectores, con la adicin de
entrada completa de la cadena mediante la funcin < gets >. Muchas de las operaciones en cadenas
se realizan mediante funciones (Vase apartado 6.5).
Lectura Carcter
scanf(<formato>, &<Variable_cadena>[<indice>] );
Ejemplos
Lectura Cadena
gets(<Variable_cadena>);
Ejemplos
gets(A);
gets(B);
Escritura Caracter
Ejemplos
printf("%c", A[ 5 ]);
printf("%c y %c", A[ p ], B[ p ]);
Escritura Cadena
Ejemplos
printf("%s", A);
printf("%s y %s", A, B);
9.4 Arreglo de cadenas
char A[5][16]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 J O E R O C A \0 ? ? ? ? ? ? ? A[1][10]=S
1 M A R I A S A L A S \0 ? ? ? ?
2 J U L I O T E L L O \0 ? ? ? ?
3 P E D R O M O R E N O \0 ? ? ? A[2][9]=L
4 P I L A R \0 ? ? ? ? ? ? ? ? ? ?
Lectura Cadena
gets(<Variable_cadena>[<ndice fila>]);
Ejemplos
gets(A[0]);
gets(B[p]);
Escritura Cadena
Ejemplos
printf("%s", A[0]);
printf("%s y %s", A[0], B[p]);
Ejemplo 1:
Ingrese una cadena de caracteres por teclado, desarrolle la simulacin de la funcin extraer.
Solucin
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax], Resultado[LongitudMax];
int i, inicio, fin, nrocar, c;
c=0;
fin=(inicio-1) + nrocar;
for(i=inicio-1 ; i < fin ; i++){
Resultado[c]=cadena[i];
c++;
}
Resultado[c]='\0';
system("PAUSE");
}
Observamos la declaracin de variables: una constante con la longitud mxima de la cadena, una
variable cadena para el ingreso y una variable resultado para mostrar lo que se va a extraer. Y un
conjunto de variables numricas.
Las instrucciones mostradas son para el ingreso de variables. Observar la instruccin <fflush> despus
de cada instruccin de ingreso, para no perder caracteres.
c=0;
fin=(inicio-1) + nrocar;
for(i=inicio-1 ; i < fin ; i++){
Resultado[c]=cadena[i];
c++;
}
Inicializamos a la variable c a cero. La variable fin representa hasta donde se va a extraer, es inicio
menos uno ms la cantidad de caracteres a extraer.
En el bucle for la variable i comienza en inicio menos uno hasta fin y se va asignando a resultado el
contenido carcter a carcter. La variable c representa el ndice de la variable resultado.
Resultado[c]='\0';
cadena=JUAN PEREZ
inicio=6
nrocar=4
Entonces:
c=0
fin = ( 6 - 1 ) + 4 = 9
i=5
i c Resultado[c]
5 0 P
6 1 E
7 2 R
8 3 E
Captulo 10
EJERCICIOS DE
AUTOEVALUACION
10.3 Cadenas
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int Longitud=20;
int A[Longitud], tiempo, desde, hasta, i, mayor;
tiempo=time(NULL);
srand(tiempo);
desde=50;
hasta=150;
for(i=0 ; i<Longitud ; i++){
A[i]=desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, S;
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, mayor, menor, posmay, posmen;
desde=2;
hasta=19;
mayor=desde;
menor=hasta;
posmay=posmen=0;
for(i=0 ; i<N ; i++){
A[i]=desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, cp, ci;
desde=2;
hasta=19;
cp=ci=0;
for(i=0 ; i<N ; i++){
A[i]=desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
if(A[i] % 2 ==0)cp++;
else ci++;
}
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N;
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i]=desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
printf("\n\n");
//i=1, para evitar la division sobre cero
for(i=1 ; i<N ; i++)
if(A[i] % i ==0)
printf("\nA[%d] = %d es multiplo de %d", i, A[i], i);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], M5[LongitudMax], NM5[LongitudMax], tiempo, desde, hasta, i;
int N, c5, cn5;
desde=2;
hasta=19;
c5=cn5=0;
for(i=0 ; i<N ; i++){
A[i]=desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
if(A[i] % 5 ==0){
M5[c5]=A[i];
c5++;
}else{
NM5[cn5]=A[i];
cn5++;
}
}
printf("\n\nMultiplos de 5\n\n");
for(i=0 ; i<c5 ; i++)
printf("%d\t ", M5[i]);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, aux;
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i]=desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
printf("\n\nInvirtiendo contenido...\n\n");
for(i=0 ; i<N/2 ; i++)
{
aux=A[i];
A[i]=A[N-i-1];
A[N-i-1]=aux;
}
printf("Vector Invertido\n\n");
for(i=0 ; i<N ; i++)
printf("%d\t",A[i]);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, cp, ci, sp, si;
desde=2;
hasta=19;
cp=ci=sp=si=0;
for(i=0 ; i<N ; i++){
A[i]=desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
if(A[i]%2==0){
cp++;
sp+=A[i];
}else{
ci++;
si+=A[i];
}
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, nro_insertar, posicion;
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i]=desde + rand() % (1 + hasta - desde);
printf("%4d", A[i]);
}
A[posicion-1] = nro_insertar;
N++;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, cdp, cdi, nro, u;
tiempo=time(NULL);
srand(tiempo);
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i] = desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
cdp=cdi=0;
for(i=0;i<N;i++){
nro=A[i];
do{
u=nro%10;
nro=nro/10;
if(u%2==0)
cdp++;
else
cdi++;
}while(nro>0);
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, j, nro, aux;
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i] = desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
//ORDENAMIENTO BURBUJA(Ascendente)
for(i=0 ; i<N-1 ; i++)
for(j=i+1 ; j<N ; j++)
if(A[i] > A[j]){
aux=A[i];
A[i]=A[j];
A[j]=aux;
}
//ORDENAMIENTO BURBUJA(Descendente)
for(i=0 ; i<N-1 ; i++)
for(j=i+1 ; j<N ; j++)
if(A[i] < A[j]){
aux = A[i];
A[i]= A[j];
A[j]= aux;
}
printf("\nVector Ordenado..Descendente..\n\n");
for(i=0;i<N;i++)
printf("%d\t", A[i]);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, j, nro, aux;
tiempo=time(NULL);
srand(tiempo);
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i] = desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
//ORDENAMIENTO BURBUJA(Ascendente)
for(i=0 ; i<N-1 ; i++)
for(j=i+1 ; j<N ; j++)
if(A[i] > A[j]){
aux=A[i];
A[i]=A[j];
A[j]=aux;
}
A[j+1]=nro;
N++;
printf("\n\n\n");
for(i=0 ; i<N ; i++)
printf("%d\t", A[i]);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, j, k, nro, aux;
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i] = desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
N--;
i--;
printf("\nHa sido Eliminado..");
//Descomentar break; si solo se quiere eliminar un solo elemento
//break;
}
printf("\n\n\n");
for(i=0 ; i<N ; i++)
printf("%d\t", A[i]);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, j, k, nro, aux;
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i] = desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
printf("\n\n");
//Eliminacion
for(i=0 ; i<N-1 ; i++)
for(j=i+1 ; j<N ; j++)
if(A[i]==A[j]){
for(k=j+1;k<N;k++)
A[k-1]=A[k];
N--;
j--;
printf("\nEliminado %d", A[i]);
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, j, posicion;
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
A[i] = desde + rand() % (1 + hasta - desde);
printf("%d\t", A[i]);
}
N--;
printf("Ha sido Eliminado!..");
}
printf("\n\n\n");
for(i=0 ; i<N ; i++)
printf("%d\t", A[i]);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, j, k, nro;
desde=2;
hasta=19;
for(i=0 ; i<N ; i++){
nro = desde + rand() % (1 + hasta - desde);
//Modificar el for para ordenar descendente
//for(j=0 ; j<i && A[j] > nro ; j++);
for(j=0 ; j<i && A[j] < nro ; j++);
A[k+1]=nro;
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, j, k, nro;
desde=2;
hasta=19;
i=0;
do{
nro = desde + rand() % (1 + hasta - desde);
for(j=0 ; j<i && A[j]!=nro ; j++);
if(A[j]!=nro){
for(k=i-1 ; k>=j ; k--)
A[k+1]=A[k];
A[k+1]=nro;
i++;
}
}while(i<N);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], B[LongitudMax], C[LongitudMax], tiempo, desde, hasta, i;
int N, j, k, nro;
desde=2;
hasta=19;
for(i=0;i<N;i++){
A[i]=desde + rand() % (1 + hasta - desde);
B[i]=desde + rand() % (1 + hasta - desde);
}
for(i=0;i<N;i++)
C[i]= A[i] + B[N-i-1];
for(i=0;i<N;i++)
printf("\n%d\t+\t%d\t=\t%d\t", A[i], B[i], C[i]);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax = 50;
int A[LongitudMax], tiempo, desde, hasta, i;
int N, j, k, nro;
if(i == N-1){
printf("\nVector Ordenado Ascendentemente");
printf("\n\n");
system("PAUSE");
exit(0);
}
if(i==N-1){
printf("\nVector Ordenado Descendentemente");
printf("\n\n");
system("PAUSE");
exit(0);
}
printf("\nVector Desordenado");
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax=50;
int N, salvado, turno, cg, c, i, desde, hasta;
int a[LongitudMax], tiempo;
tiempo=time(NULL);
srand(tiempo);
printf("\n");
cg=0;
salvado=0;
desde=1;
hasta=6;
c=0;
do{
c++;
salvado++;
if(salvado > N-1)
salvado=0;
if(a[salvado]== 1 )
c--;
a[salvado]=1;
printf("\t\t\tSe salvo el alumno %d\n\n", salvado + 1);
getchar();
}
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int LongitudMax=50;
int a[LongitudMax], N, i, j, c, tiempo, desde, hasta;
tiempo=time(NULL);
srand(tiempo);
for(i=0;i<N;i++){
a[i]=desde + rand() % (1 + hasta - desde);
printf("%d\t",a[i]);
}
for(i=desde;i<=hasta;i++){
c=0;
for(j=0;j<N;j++){
if(a[j]!=i) continue;
c++;
}
if(c > 0)
printf("\n\r%d Se repite...%d veces", i, c);
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=16;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
Ejercicio 2: Se tiene una matriz de orden N*M de tipo entero con numeros
al azar, se pide encontrar el mayor y menor elemento de toda la matriz.
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
int Mayor, Menor;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=16;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
Mayor=desde;
Menor=hasta;
for(fila=0 ; fila<N ; fila++)
for(columna=0 ; columna<M ; columna++){
if(A[fila][columna] > Mayor) Mayor = A[fila][columna];
if(A[fila][columna] < Menor) Menor = A[fila][columna];
}
}
/***************************Fin del Programa****************************/
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
int Mayor, Menor;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=16;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
int S;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=16;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
S=0;
for(fila=0 ; fila<N ; fila++)
for(columna=0 ; columna<M ; columna++)
S+= A[fila][columna];
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
int S;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
S=0;
for(fila=0 ; fila<N ; fila++){
S+= A[fila][0];
S+= A[fila][M-1];
}
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
int S;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
S=0;
for(fila=1 ; fila<N-1 ; fila++)
for(columna=1 ; columna<M-1 ; columna++)
S+= A[fila][columna];
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
int SP, SS;
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<N ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
SP=SS=0;
for(fila=0 ; fila<N ; fila++){
SP+= A[fila][fila];
SS+= A[fila][N-fila-1];
}
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
/*
ANALISIS:
Matriz transpuesta es transponer los elementos de las filas a las
columnas y viceversa.
*/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], B[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
printf("\n\nMatriz Transpuesta...\n\n");
for(fila=0 ; fila<M ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<N ; columna++){
B[fila][columna] = A[columna][fila];
printf("\t%d", B[fila][columna]);
}
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
/*
ANALISIS:
Matriz triangular superior son los elementos por encima de la
diagonal principal inclusive.
Ejm:
Matriz
2 3 4
1 3 2
3 2 4
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N;
int tiempo, desde, hasta, fila, columna;
int S;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<N ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
S=0;
for(fila=0 ; fila<N ; fila++)
for(columna=fila ; columna<N ; columna++)
S+=A[fila][columna];
}
/***************************Fin del Programa****************************/
Ejercicio 10: Se tiene una matriz cuadrada de orden N de tipo entero con
numeros al azar, se pide realizar la suma de la matriz triangular
inferior.
*********************************************************************/
/*
ANALISIS:
Matriz triangular inferior son los elementos por debajo de la
diagonal principal inclusive.
Ejm:
Matriz
2 3 4
1 3 2
3 2 4
2
1 3
3 2 4
*/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N;
int tiempo, desde, hasta, fila, columna;
int S;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<N ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
S=0;
for(columna=0 ; columna<N ; columna++)
for(fila=columna ; fila<N ; fila++)
S+=A[fila][columna];
}
/***************************Fin del Programa****************************/
Ejercicio 11: Se tiene una matriz cuadrada de orden N de tipo entero con
numeros al azar, se pide realizar la suma de los elementos que no
pertencen a la matriz triangular superior.
*********************************************************************/
/*
ANALISIS:
No Matriz triangular superior son los elementos por debajo de la
diagonal principal.
Ejm:
Matriz
2 3 4
1 3 2
3 2 4
1
3 2
*/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N;
int tiempo, desde, hasta, fila, columna;
int S;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<N ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
S=0;
for(columna=0 ; columna<N-1 ; columna++)
for(fila=columna+1 ; fila<N ; fila++)
S+=A[fila][columna];
}
/***************************Fin del Programa****************************/
Ejercicio 12: Se tiene una matriz cuadrada de orden N de tipo entero con
numeros al azar, se pide realizar la suma de los elementos que no
pertencen a las diagonales.
*********************************************************************/
/*
ANALISIS:
No diagonales son los elementos que no se encuentran en la diagonal
principal y la secundaria.
Ejm:
Matriz
2 3 4
1 3 2
3 2 4
No diagonales:
3
1 2
2
*/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N;
int tiempo, desde, hasta, fila, columna;
int S;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<N ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
S=0;
for(fila=0 ; fila<N ; fila++)
for(columna=0 ; columna<N ; columna++)
if(fila!=columna && fila!= N-columna-1)
S+=A[fila][columna];
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
Ejercicio 13: Se tiene una matriz cuadrada de orden N de tipo entero con
numeros al azar, se pide intercambiar el contenido de sus diagonales.
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N;
int tiempo, desde, hasta, fila, columna;
int aux;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<N ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
for(fila=0;fila<N;fila++){
aux=A[fila][fila];
A[fila][fila]=A[fila][N-fila-1];
A[fila][N-fila-1]=aux;
}
printf("\n\nDiagonales Intercambiadas\n\n");
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<N ; columna++)
printf("\t%d", A[fila][columna]);
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Ejercicio 14: Se tiene una matriz orden N*M de tipo entero con
numeros al azar, se pide invertir el contenido de sus columnas.
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
int aux;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
printf("\n\nColumnas Invertidas\n\n");
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++)
printf("\t%d", A[fila][columna]);
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Ejercicio 15: Se tiene una matriz orden N*M de tipo entero con
numeros al azar, se pide mostrar el promedio de los elementos pares
e impares siempre y cuando la suma de sus indices sea par e impar
respectivamente.
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], N, M;
int tiempo, desde, hasta, fila, columna;
int sp, si, cp, ci;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
for(fila=0 ; fila<N ; fila++){
printf("\n\n\t");
for(columna=0 ; columna<M ; columna++){
A[fila][columna] = desde + rand() % (1 + hasta - desde);
printf("\t%d", A[fila][columna]);
}
}
sp=cp=si=ci=0;
for(fila=0;fila<N;fila++)
for(columna=0;columna<M;columna++)
if((fila+columna)%2==0 && A[fila][columna]%2==0){
sp+=A[fila][columna];
cp++;
}
else{
si+=A[fila][columna];
ci++;
}
Ejercicio 16: Se tiene una matriz de orden N*M y otra de orden M*Q
ambos de tipo entero con numeros al azar, se pide realizar el concepto
de Producto de Matrices.
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax], B[OrdenMax][OrdenMax],C[OrdenMax][OrdenMax], N, M, Q;
int tiempo, desde, hasta, filaA, columnaA, filaB, columnaB ;
int S;
tiempo=time(NULL);
srand(tiempo);
desde=1; hasta=5;
S=0;
for(columnaA=0 ; columnaA<M ; columnaA++)
S+=A[filaA][columnaA] * B[columnaA][columnaB];
C[filaA][columnaB]=S;
printf("\t%d", C[filaA][columnaB]);
}
}
printf("\n\n \n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int OrdenMax = 10;
int A[OrdenMax][OrdenMax],N;
int fila, columna, c, i ;
fila=0;
c=N/2;
for(i=1;i<=N*N;i++){
A[fila][c]=i;
if(i%N==0)fila++;
else{
if(fila==0) fila=N-1;
else fila--;
if(c==N-1) c=0;
else c++;
}
}
for(fila=0;fila<N;fila++){
printf("\n\n");
for(c=0;c<N;c++)
printf("\t%d",A[fila][c]);
}
printf("\n\n \n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
10.3 Cadenas
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax];
int L;
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax], Resultado[LongitudMax];
int i, inicio, fin, nrocar, c;
c=0;
fin=(inicio-1) + nrocar;
for(i=inicio-1 ; i < fin ; i++){
Resultado[c]=cadena[i];
c++;
}
Resultado[c]='\0';
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax], Resultado[LongitudMax];
int i, nrocar, c;
c=0;
for(i=0 ; i<nrocar; i++){
Resultado[c]=cadena[i];
c++;
}
Resultado[c]='\0';
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax], Resultado[LongitudMax];
int i, nrocar, c, L;
L=strlen(cadena);
c=0;
for(i=L-nrocar ; cadena[i]!='\0' ; i++){
Resultado[c]=cadena[i];
c++;
}
Resultado[c]='\0';
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena1[LongitudMax], cadena2[LongitudMax], Resultado[LongitudMax];
int i, c, L;
L=strlen(cadena1);
c=0;
for(i=0 ; i<L ; i++){
Resultado[c]=cadena1[i];
c++;
}
L=strlen(cadena2);
for(i=0 ; i<L ; i++){
Resultado[c]=cadena2[i];
c++;
}
Resultado[c]='\0';
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena1[LongitudMax], cadena2[LongitudMax];
int i, L1, L2;
L1=strlen(cadena1);
L2=strlen(cadena2);
for(i=0 ; cadena1[i]!='\0' && cadena1[i]==cadena2[i] ; i++);
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char caracter;
int N;
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax], Resultado1[LongitudMax], Resultado2[LongitudMax];
int i, L;
L=strlen(cadena);
//Hacia Minusculas
if(cadena[i]>='A' && cadena[i]<='Z')
Resultado2[i]=char(int(cadena[i]) + 32);
else
Resultado2[i]=cadena[i];
}
Resultado1[L]='\0';
Resultado2[L]='\0';
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax];
int i, L;
L=strlen(cadena);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax];
int i, j, L;
printf("\n\rIngrese Cadena: "); gets(cadena); fflush(stdin);
L=strlen(cadena);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax];
int i, j, L;
L=strlen(cadena);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
*********************************************************************/
#include <iostream>
using namespace std;
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax];
int i, j, L;
L=strlen(cadena);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
i=strlen(cad);
k--;
i--;
}else
if(cad[j]==' '){
for(k=j ; k<i ; k++) //elimina el caracter anterior al espacio
cad[k-1]=cad[k];
k-=2;
i-=2;
}
cad[j]='\0';
return(cad);
}
//Procedimiento Principal
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax];
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
i=strlen(cad);
for(j=0;j<i;j++){
car=tolower(cad[j]);
if(car=='a'|| car=='e'|| car=='i'|| car=='o'|| car=='u'){
for(k=j+1;k<i;k++)
cad[k-1]=cad[k];
j--;
i--;
}
}
return (cad);
}
//Procedimiento Principal
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax];
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
L=strlen(cad);
for(i=0 ; cad[i]==cad[L-i-1] ; i++);
return i==L;
}
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax];
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
" Si tienes alguna duda sobre el uso de este programa, acude a la pagina
oficial del programa, o pregunta en la lista de correo "
Resultado
"Si tienes alguna duda sobre el uso de este programa, acude a la pagina
oficial del programa, o pregunta en la lista de correo"
La funcion devolvera: 12
*********************************************************************/
#include <iostream>
using namespace std;
L=strlen(cad);
for(i=0 ; i<L; i++)
if(cad[i]==' ')
cad[i]=car;
}
L=strlen(cad);
can=0;
for(i=0 ; i<L; i++)
if(cad[i]==car && cad[i+1]==car){
for(j=i+2 ; j<L ; j++)
cad[j-1]=cad[j];
i--;
L--;
can++;
cad[L]='\0';
}
for(p=1;p<=2;p++){
(p==1) ? i=0: i=L-1;
if(cad[i]==car){
for(j=i+1 ; j<L ; j++)
cad[j-1]=cad[j];
L--;
can++;
cad[L]='\0';
}
}
return can;
}
void main(){
const int LongitudMax = 100;
char cadena[LongitudMax], espacio_reemplazo='_';
int can;
system("PAUSE");
}
/***************************Fin del Programa****************************/
10.4 Ejercicios Varios
/**********************Inicio del Programa***************************
P E A B C
E E A B C
A A B C E
B B C E A
C C E A B
*********************************************************************/
/*
ANALISIS:
Se toman dos caracteres entonces segun la tabla fijarse en la primera
fila y en la primera columna entonces el resultado esta en la
interseccion.
Ejemplo:
Ingreso: AB
_ _ A _ _
_ _ _ _ _
B _ C _ _
_ _ _ _ _
Ingreso: BC
_ _ _ _ C
_ _ _ _ _
B _ _ _ A
_ _ _ _ _
*/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
//validando caracteres
for(i=0;i<lon;i++)
if(cad[i]!='A' && cad[i]!='B' && cad[i]!='C' && cad[i]!='E' && cad[i]!=' '){
printf("\nError Caracter %c no permitido!",cad[i]);
exit(0);
}
//Operacion
for(k=0;k<lon;k++)//k-> cadena ingresada
for(i=1;i<5;i++){//filas de la matriz
if(cad[k] != tabla[i][0]) continue;
for(j=1;j<5;j++){//columnas de la matriz
if(cad[k+1] != tabla[0][j])continue;
val=tabla[i][j];
printf("\n%c por %c es igual a %c",tabla[i][0], tabla[0][j], val);
cad[l+1]=val;
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
/**********************Inicio del Programa***************************
Se pide:
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
//Funcion para extraer la suma de divisores
long suma_divisores(long nro){
long k,sd=0;
sd_n = suma_divisores(n);
printf("\n\rLa suma de los divisores de %ld es...%ld",n, sd_n);
sd_m = suma_divisores(m);
printf("\n\rLa suma de los divisores de %ld es...%ld",m, sd_m);
//Procedimiento Principal
void main(){
long n, m;
if(amigo(n, m))
printf("\n\n\rSon numeros amigos");
else
printf("\n\n\rNo son numeros amigos");
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Ejemplo:
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
long azar, n;
int i, j, k, A[5], B[5], desde, hasta, intentos=6, cantidad_digitos=5;
int u,d,c,m,um, u1,d1,c1,m1,um1, tiempo;
char r;
bool sw;
tiempo=time(NULL);
srand(tiempo);
desde=10000;
hasta=99999;
do{
//printf("\n\n%d...", azar);
for(i=0 ; i<intentos ; i++){
um1=n/10000;
m1=(n%10000)/1000;
c1=((n%10000)%1000)/100;
d1=(((n%10000)%1000)%100)/10;
u1=n%10;
B[0]=um1,B[1]=m1,B[2]=c1,B[3]=d1,B[4]=u1;
if(B[j]==A[j]){
printf("y");
continue;
}
sw=false;
for(k=0 ; k<cantidad_digitos ; k++){
if(j==k)continue;
if(B[j]==A[k]){
printf("x");
sw=true;
break;
}
}
if(n==azar){
printf("\n\nUsted ha acertado \t\"Felicitaciones\"");
break;
}else if(i<=intentos )
printf("\nNo acerto tiene %d oportunidades",intentos -i -1);
}
if(n!=azar)
printf("\n\nNo acerto \"QUE LASTIMA...\" el # de la PC era...%ld", azar);
}while(r=='s'|| r=='S');
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
lon=strlen(frase);
for(i=0 ; i<lon ; i++)
frase[i]=toupper(frase[i]);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Ejercicio 5: JUEGO 21
El banquero reparte las cartas una a una cuando el retador las solicita,
el retador puede detenerse en cualquier momento.
Si el retador o el banquero sobrepasa 21 acumulado pierde.
Cuando el retador decide detenerse de solicitar cartas, es el turno
del banquero.
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
/*CONSTANTES Y VARIABLES GLOBALES*/
const int Max_Carta=11, GrupoCartas=4, Tope=21;
int tiempo;
int MazoCartas[4][Max_Carta], cartas_retador[Max_Carta], cartas_banquero[Max_Carta];
/*************PROCEDIMIENTOS Y FUNCIONES**************/
void barajar(){
tiempo=time(NULL);
srand(tiempo);
}
void IniciarMazoCartas(){
for(int fila=0 ; fila<GrupoCartas ; fila++)
for(int columna=0 ; columna<Max_Carta ; columna++)
MazoCartas[fila][columna]=columna+1;
}
int Cantidad_MazoCartas_Disponibles(){
int cant=0;
for(int fila=0 ; fila<GrupoCartas ; fila++)
for(int columna=0 ; columna<Max_Carta ; columna++)
if(MazoCartas[fila][columna]!=0) cant++;
return cant;
}
contador++;
if(contador==ai_numero){
carta=MazoCartas[fila][columna];
MazoCartas[fila][columna]=0;
break;
break;
}
}
return carta;
}
void Faltan_Cartas(){
int cantidad_cartas = Cantidad_MazoCartas_Disponibles();
if(cantidad_cartas!=0)return;
/*****************PROCEDIMIENTO PRINCIPAL*****************/
void main(){
do{
printf("\n\n\rCartas disponibles: %d\n\n", Cantidad_MazoCartas_Disponibles());
desde=1;
hasta=Cantidad_MazoCartas_Disponibles();
azar=desde + rand() % (1 + hasta - desde);
carta=Carta_Aleatoria(azar);
Aadir_Carta(longitud_retador, cartas_retador, carta);
acumulado_retador=SumaCartas(longitud_retador, cartas_retador);
if(acumulado_retador==Tope){
printf("\n\nHa ganado el retador, ha acumulado");
printf("%d\n\n", acumulado_retador);
system("PAUSE");
goto final;
}else if(acumulado_retador>Tope){
printf("\n\nRetador ha perdido, obtuvo %d", acumulado_retador);
printf("y ha sobrepasado el tope %d\n\n", Tope);
system("PAUSE");
goto final;
}
}while(toupper(solicitud)!='N' );
desde=1;
hasta=Cantidad_MazoCartas_Disponibles();
azar=desde + rand() % (1 + hasta - desde);
carta=Carta_Aleatoria(azar);
Aadir_Carta(longitud_banquero, cartas_banquero, carta);
acumulado_banquero=SumaCartas(longitud_banquero, cartas_banquero);
if(acumulado_banquero==Tope){
printf("\n\nHa ganado el banquero, ha ");
printf("acumulado %d\n\n", acumulado_banquero);
system("PAUSE");
goto final;
}else if(acumulado_banquero>Tope){
printf("\n\nBanquero ha perdido obtuvo %d ", acumulado_banquero);
printf("y ha sobrepasado el tope %d\n\n", Tope);
system("PAUSE");
goto final;
}
}while(acumulado_banquero < acumulado_retador && acumulado_banquero < Tope );
final:
printf("\n\n\rJugar de nuevo? S/N:"); juego_nuevamente=getchar();
fflush(stdin);
}while(toupper(juego_nuevamente)!='N' );
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
*********************************************************************/
#include <iostream>
using namespace std;
#include "stdlib.h"
#include "time.h"
void main(){
const int OrdenMax = 100;
int A[OrdenMax][OrdenMax],N, M, fila, columna;
int V[OrdenMax * OrdenMax], i, L;
int tiempo, desde, hasta;
int nro, s, u;
tiempo=time(NULL);
srand(tiempo);
desde=1;
hasta=1000;
for(fila=0;fila<N;fila++){
printf("\n\n");
for(columna=0;columna<M;columna++){
A[fila][columna]=desde + rand() % (1 + hasta - desde);
printf("\t%d",A[fila][columna]);
}
}
L=0;
for(fila=0;fila<N;fila++)
for(columna=0;columna<M;columna++){
nro=A[fila][columna];
s=0;
do{
u=nro%10;
nro/=10;
s+=(u*u*u);
}while(nro>0);
if(s==A[fila][columna]){
V[L]=A[fila][columna];
L++;
}
}
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Ejercicio 7: GRAFOS
*********************************************************************/
/*
ANALISIS
SE UTILIZA EL CONCEPTO DE PRODUCTO DE MATRICES.
ML=
A B C D
0 0 1 1 A
1 0 0 1 B
0 1 0 0 C
0 0 1 0 D
SI E=2
MLxML=
0 0 1 1 0 0 1 1
1 0 0 1 X 1 0 0 1
0 1 0 0 0 1 0 0
0 0 1 0 0 0 1 0
MLxML=
A B C D
0 1 1 0 A
0 0 2 1 B
1 0 0 1 C
0 1 0 0 D
indice++;
}
//PROCEDIMIENTO PRINCIPAL
void main(){
tiempo=time(NULL);
srand(tiempo);
desde=0; hasta=1;
printf("\n\nPuntos de conexion de grafo\n\n");
for(filaA=0 ; filaA<N ; filaA++)
printf("\t%c", char(65+filaA));
printf("\n\n");
i=0;
for(filaA=0 ; filaA<N ; filaA++){
for(columnaA=0 ; columnaA<N ; columnaA++){
printf("\t");
if(filaA!=columnaA){
A[filaA][columnaA] = desde + rand() % (1 + hasta - desde);
}else
A[filaA][columnaA]=0;
printf("%d", A[filaA][columnaA]);
}
printf("%4c\n\n", char(65+filaA));
}
Asignar_Matriz(i, ML, A);
//Al cuadrado
for(filaA=0 ; filaA<N ; filaA++)
for(columnaB=0 ; columnaB<N ; columnaB++){
S=0;
for(columnaA=0 ; columnaA<N ; columnaA++)
S+=A[filaA][columnaA] * A[columnaA][columnaB];
B[filaA][columnaB]=S;
}
Asignar_Matriz(i, ML, B);
//Al cubo
for(filaA=0 ; filaA<N ; filaA++)
for(columnaB=0 ; columnaB<N ; columnaB++){
S=0;
for(columnaA=0 ; columnaA<N ; columnaA++)
S+=A[filaA][columnaA] * B[columnaA][columnaB];
C[filaA][columnaB]=S;
}
Asignar_Matriz(i, ML, C);
//E > 3
for(p=3;p<E;p++){
for(filaA=0 ; filaA<N ; filaA++)
for(columnaB=0 ; columnaB<N ; columnaB++){
S=0;
for(columnaA=0 ; columnaA<N ; columnaA++)
S+=ML[0][filaA][columnaA] * ML[p-1][columnaA][columnaB];
D[filaA][columnaB]=S;
}
Asignar_Matriz(i, ML, D);
}
final:
printf("\n\nMatriz Resultado\n\n");
Mostrar_MatrizResultado(i, ML);
printf("\n\n");
system("PAUSE");
}
/***************************Fin del Programa****************************/
Captulo 11
Ejercicios Propuestos al
estudiante
11 Ejercicios Propuestos al estudiante
o
o o
o o
o o o o o o o o
o FELIZ o
o NAVIDAD! o
o 2000 o
o o
o o o
o o o o
o o
o o
Solo se pide que la letra "I" de la palabra NAVIDAD este en el centro de la pantalla.( por ejm si
trabajamos en una pantalla de 80 columnas y 25 lneas el centro ser el punto 40,12 )
3. Carreras:
Eres miembro de un equipo de carreras a campo traviesa, estas carreras son un poco
diferentes a las que conoces, ya que no importa quien llegue ms rpido, sino quien lo haga de
manera ms eficiente. La carrera se lleva a cabo en un terreno cuadriculado y en carros que
pueden avanzar solo en direccin vertical y horizontal, la cantidad de combustible que puede
llevar cada uno de los carros del equipo no le alcanza para llegar de la salida a la meta (una
unidad de combustible alcanza exactamente para avanzar un cuadro), en el terreno se
encuentran abastecimientos de combustible en los que los carros pueden recargar, cada uno
de los abastecimientos puede ser utilizado solo una vez durante la carrera sin importar la
cantidad de combustible que se obtenga de l. Tambin un carro de tu equipo puede
proporcionarte combustible si se cruzan en algn lugar del terreno. Todos los carros de tu
equipo pueden tomar caminos diferentes, y no es necesario que vayan juntos en ningn
momento.
Problema:
Escribe un programa que dados los puntos en los que se encuentran los abastecimientos de
combustible, sea capaz de elaborar un itinerario que pueda hacer que alguno de los carros de
tu equipo realice el recorrido desde la salida hasta la meta utilizando el menor nmero de
carros del equipo en caso contrario determinar que no existe ninguna solucin posible.
Lmites
Tamao del mapa (100 x 100) FIJO SIEMPRE.
Nmero de carros por equipo (16) FIJO TAMBIEN.
Nmero mximo de abastecedores (500).
Cantidad mxima de combustible por carro (15).
Entrada
Primer ingreso por teclado la cantidad de combustible que puede llevar cada uno de los carros
del equipo (todos los carros del equipo son siempre iguales y parten de la salida con el tanque
lleno).
Segunda entrada son las coordenadas (xs,ys) del punto de salida.
Tercera entrada son las coordenadas (xm,ym) de la meta.
Cuarta entrada es el nmero N de abastecedores que hay en el mapa, y en las ltimas N lneas
estn las coordenadas x, y de cada uno de los abastecedores.
Salida
Tu programa deber escribir por pantalla el itinerario que utiliz tu equipo para llegar a la meta,
empleando para ello 4 nmeros separados por un espacio utilizando la siguiente notacin:
C Xa Ya A
Ejemplo
ENTRADA SALIDA
8 1 18 19 0
20 14 1 10 19 0
1 14 1 7 18 0
6 2 19 9 0
19 9 2 13 7 0
18 19 2 7 9 0
13 7 2 7 14 1
10 19 2 1 14 17
7 9
7 18
4. Castillo:
Neo ha ingresado de nuevo a la matriz y las mquinas han logrado encerrarlo en un complejo
con forma de castillo medieval. Sin embargo esto no es suficiente para atraparlo, ya que l es
capaz de modificar la matriz, con lo que puede hacer que desaparezcan paredes, logrando de
esta forma, encontrar una ruta de escape que lo lleve de vuelta al mundo real para llegar a
Zin.
Las mquinas sin embargo, pueden darse cuenta de cada cambio que se realice en el sistema,
por lo que Neo desea derribar el menor nmero de paredes para que se dificulte su rastreo. Su
tarea es ayudar a salvar la especie humana, escribiendo un programa que determine la menor
cantidad de paredes que deben modificarse para salir del castillo.
Entrada
El castillo consta de m filas (2<=m<=50) cada una con n mdulos (2<=n<=50) rectangulares
donde cada mdulo puede estar rodeado de a lo ms 4 paredes.
La entrada consta de una lnea con los nmeros m y n y a continuacin m lneas cada una
describiendo los n mdulos de esa fila.
Por ejemplo el nmero 11 representa un mdulo con paredes en los lados oeste, norte y sur.
Finalmente, una lnea indicando la posicin inicial en formato fila, columna, en la que se
encuentra Neo. Ntese que el castillo puede estar totalmente encerrado, o puede tener
mdulos con salida directa al exterior. Para salir, Neo puede modificar cualquier pared, incluso
las que conectan directamente al exterior.
Salida
Un nmero entero que indica el menor nmero de paredes que debe modificar Neo para salir
del castillo y escapar de los agentes.
Ejemplo
ENTRADA SALIDA
58 2
15 3 2 10 14 11 6 7
7 9 12 7 15 15 13 5
1 14 11 8 10 14 11 4
12 11 10 10 10 10 14 13
11 10 10 10 10 10 10 14
2 5
Este el mapa del castillo ejemplo. La X marca el lugar inicial donde se encuentra Neo. Una
posible salida derriba dos paredes hacia el norte. Sin embargo esta no es la nica forma de
salir derribando dos paredes.
5. Desrdenes:
Una permutacin de los nmeros del 1 al N es una secuencia de nmeros a1, a2,... aN en la
cual aparece exactamente una vez cada uno de los nmeros del 1 al N.
Por ejemplo, para N=5 se desea obtener la permutacin 3, 4, 1, 5, 2. Esto se logra con dos
desrdenes, primero intercambiando el 1 por el 3 y el 2 por el 5 para posteriormente
intercambiar el 2 por el 4.
Entrada:
La primera entrada contiene el valor de N (con 1 N 1000) y en la segunda lnea una lista de
N enteros del 1 al N.
Salida:
Mostrar por pantalla en la primera lnea el valor de D y en cada una de las siguientes D lneas
la cantidad K de intercambios seguida de K parejas de enteros indicando los nmeros
intercambiados. Las parejas podrn estar escritas en cualquier orden, pero los desrdenes
debern escribirse en el orden en que fueron aplicados.
Ejemplos
ENTRADA SALIDA
5 2
3 4 1 5 2 2 1 3 2 5
1 2 4
ENTRADA SALIDA
7 1
3 2 1 7 6 5 4 3 1 3 4 7 5 6
6. Calendario de un curso:
En una Universidad hay un grupo de M personas interesadas en tomar un curso, numeradas de
la 1 a la M. La Universidad est dispuesta a contratar los servicios de un profesor para que
imparta ese curso. El profesor tiene N fechas disponibles para dar clases, numeradas de la 1 a
la N.
Para ello la Universidad solicita a todos los interesados que le indiquen en que fechas pueden
asistir a las clases del curso.
Escribe un programa que encuentre una seleccin de P alumnos y Q fechas que cumplan las
condiciones exigidas y que maximicen el producto PQ.
Por ejemplo, suponga que M=3 y N=5, la persona 1 puede asistir en las fechas 1, 2, 4 y 5; la
persona 2 puede asistir en las fechas 2, 3 y 4; y la persona 3 puede asistir en las fechas 1, 3, 4
y 5. Entonces la Universidad seleccionar a las personas 1 y 3, las cuales pueden asistir en las
fechas 1, 4 y 5, el producto PQ es 6.
Entrada:
La primera entrada son los enteros M y N (1 M, N 30), y en cada una de las siguientes M
lneas N enteros 0 1, un 0 indica que la persona no puede asistir a la clase correspondiente y
un 1 que si puede asistir.
Salida:
Mostrar por pantalla en la primera lnea los enteros P y Q, en ese orden, en la segunda lnea
las P personas que asistirn al curso y en la tercera lnea las Q fechas en las que se impartir
el curso. Estas dos ltimas listas debern estar en orden creciente.
Ejemplos
ENTRADA SALIDA
3 5 2 3
1 1 0 1 1 1 3
0 1 1 1 0 1 4 5
1 0 1 1 1
ENTRADA SALIDA
4 5 3 3
0 1 0 1 0 2 3 4
1 1 1 1 1 1 3 5
1 0 1 0 1
1 1 1 0 1
7. Curvas:
Todo el mundo prefiere carreteras con pocas curvas. Un ingeniero debe disear una carretera que
una dos ciudades y quiere que tenga el menor nmero de curvas posible, sin importar la longitud
de la carretera. Para facilitar el diseo, el ingeniero dibuj un mapa con los accidentes naturales
por donde no puede construirse la carretera, tales como montaas y barrancos muy grandes.
Cuadricul su mapa y quiere que los tramos rectos de la carretera sean horizontales o verticales o
diagonales. La carretera slo puede ir de un cuadro a otro si tienen un lado o una esquina en
comn, y no puede pasar por un accidente natural.
Hay una curva en la carretera en un cuadro donde termina un tramo recto e inicia otro.
Cada cuadro del mapa se identifica por sus coordenadas, primero la columna y despus el rengln.
Las columnas estn numeradas de izquierda a derecha iniciando con el 0. Los renglones estn
numerados de arriba hacia abajo iniciando con el 0.
Problema
Escribe un programa que dado un mapa con los accidentes naturales encuentre el menor nmero
posible de curvas que puede tener una carretera que inicie en el cuadro donde se encuentra la
ciudad A y termine en el cuadro donde se encuentra la ciudad B.
Entrada
La primera entrada son los enteros N y M, el nmero de columnas y renglones del mapa, donde
1 N 50, 1 M 50.
En cada uno de los siguientes M renglones hay N nmeros que pueden ser 1 0, 1 si hay un
accidente natural en el cuadro correspondiente y 0 si no hay ninguno.
En el siguiente rengln (el penltimo) la columna y el rengln de la ciudad A.
En el ltimo rengln la columna y el rengln del punto B.
Salida
La primera salida el menor nmero de curvas que puede tener una carretera entre las ciudades
A y B.
Ejemplo
ENTRADA SALIDA
5 7 3
0 0 0 1 0
1 0 1 0 0
0 0 1 0 0
1 1 0 0 1
0 0 0 1 0
0 0 1 1 0
0 0 0 0 0
1 1
4 6
NOTA: en todos los casos de prueba se puede disear al menos una carretera.
8. Incendio:
En una ciudad se han presentado ltimamente una gran cantidad de incendios, y las autoridades
sospechan que estos han sido provocados por un conocido maleante. Pero mientras se realiza su
captura, el alcalde ha decidido organizar un sistema de bomberos.
La alcalda ha dividido la ciudad en zonas y ha determinado para cada una de ellas, estadsticas
sobre el nmero de incendios presentados y ha determinado una medida del nmero de incendios
que se podran prevenir si se asigna una determinada cantidad de bomberos a esa zona. Por
ejemplo, podemos decir que si a la zona 1 se asignan dos bomberos, se podran prevenir tres
incendios, si se le asignan tres, se podran prevenir seis, si se asignan cuatro se podran prevenir
seis y para cada cantidad de bomberos asignada se pueden prevenir una cantidad determinada de
incendios
Es importante notar que esta relacin no es lineal, es decir el hecho de asignar el doble de
bomberos, no implica que se puedan prevenir el doble de incendios. Adems, debido a que no se
quiere que ninguna zona se considere discriminada, se debe asignar un mnimo de bomberos para
cada una, aunque en zonas sin construir es posible que este mnimo sea cero, es decir, que no sea
necesario asignar bomberos.
Debido a que esta alcalda tiene algunos problemas respecto a las cuestiones de planeacin, ha
solicitado ayuda para determinar cmo distribuir los bomberos de tal forma que se puedan prevenir
la mayor cantidad de incendios, mientras logra atrapar al criminal. Su tarea es escribir un programa
que ayude a la alcalda a cumplir su propsito.
Entrada:
En la siguiente entrada vienen n nmeros, que indican el nmero mnimo de bomberos necesarios
en cada zona. Enseguida aparecen n lneas, cada una de ellas conteniendo m nmeros, cada
lnea representando una zona, donde el i-simo nmero de esa lnea es la cantidad de incendios
que se pueden prevenir en esa zona si se asignan i bomberos.
Salida:
La salida son dos lneas. La primera indica cual es la mayor cantidad de incendios que se pueden
prevenir en la ciudad. En la segunda vienen n nmeros, en la que el i-simo nmero indica el
nmero de bomberos asignados a la i-sima zona. En caso de que exista ms de una
configuracin que prevenga la mayor cantidad de incendios, cualquiera de ellas puede darse en la
salida.
Ejemplo
ENTRADA SALIDA
26 12
12 33
2 3 6 6 9 10
4 5 6 8 9 20
9. TENER ENE PADRES:
Unos extraos microbios descubiertos en un lago oculto debajo de la gruesa capa de hielo que
cubre el continente antrtico han demostrado una extraa forma de reproduccin que no se ha
encontrado en otros seres vivos.
En lugar de tener uno o dos padres como los dems seres vivos, pueden llegar a tener hasta N
padres, donde N puede ser un entero no mayor que 1000.
La informacin gentica de cada padre viene dada en una cadena de a lo sumo 200 letras
maysculas.
La informacin gentica que da lugar al neonato esta dada por una cadena formada por la
intercalacin de un elemento de cada cadena de cada padre mientras estas cadenas tengan letras
disponibles. No todas las cadenas de los padres son de la misma longitud. La cadena del neonato
tendr la longitud de la suma de las longitudes de las cadenas de todos sus padres, siendo esto
una curiosidad biolgica adicional de estos microbios.
Problema
Debes escribir un programa para calcular la cadena del microbio neonato a partir de las cadenas
de sus padres.
Entrada:
lneas 2 a N+1: cada una con una cadena con Ci ( 1 Ci 200) letras maysculas indicando la
informacin gentica de cada padre.
Salida:
La salida ser hacia pantalla la cual estar formada por una sola lnea. Esta lnea debe contener la
cadena del microbio neonato.
Ejemplo
ENTRADA SALIDA
3 ACXBDZACXBDZAXFEGEFFG
ABABAFGFG
CDCD
XZXZXEEF
Esta ciudad tiene una particularidad, ha nacido y se ha desarrollado a lo largo de una carretera, de
modo tal que todo el patrullaje se reduce a la calle principal que tiene B-1 cuadras de largo, que
visto de otra forma son B bocacalles.
Considera una asignacin buena de tramos a los policas aquella que minimiza el mximo desnivel
que pudiera tocarle a algn polica.
Tarea
Debes escribir un programa que le ayude a determinar ese nmero para poder juzgar si la tarea
que le impondr a sus agentes es razonable.
Se conoce la altura sobre el nivel del mar de cada bocacalle. Se ha utilizado una unidad de medida
lo suficientemente pequea para que estas alturas sean cantidades enteras. Tu resultado quedar
expresada en la misma unidad.
Entrada:
La entrada tiene el siguiente formato:
lnea 1: los nmeros B (1 B 10.000) y P (1 P 1.000) separados por un blanco.
lneas 2 a B+1: las alturas Yi (-400 Yi 8850) sobre el nivel del mar de las B bocacalles
Salida:
La salida ser hacia pantalla que contendr una nica lnea con un nico nmero: el peor desnivel
que inevitablemente le tocar a algn polica.
Ejemplo
ENTRADA SALIDA
62 4
100
101
104
101
108
105
Podrs comprobar este resultado imaginando las distintas formas de asignar tramos a cada polica.
11. Rompecabezas
Se tienen N x N piezas cuadradas numeradas del mismo tamao. Cada una viene con su nmero
en el interior y con cada lado marcado con algn nmero. Un ejemplo de pieza 1 es el siguiente:
Se trata de acomodar las piezas en un arreglo de N x N de tal manera que si dos lados de dos
piezas son adyacentes entonces esos lados deben estar marcados con los mismos nmeros.
Por ejemplo:
Las piezas no pueden ser giradas ni rotadas al momento de buscar una configuracin.
Entrada
La primera entrada es el nmero N, donde 1 N 7. En las siguientes N lneas subsecuentes la
descripcin de cada pieza. En cada una de estas lneas (comenzando por la ficha 1) primero va el
nmero que marca el lado vertical izquierdo y luego en sentido horario los que marcan los otros
lados para cada una de las piezas.
Salida
En pantalla en N lneas, en cada lnea van los nmeros de las piezas en el orden hallado para
cumplir las condiciones del problema de cada fila. Se garantiza que toda entrada de prueba tiene al
menos una solucin.
Cualquier solucin que cumpla las condiciones del problema es vlida.
Ejemplo
ENTRADA SALIDA
3 862
4133 153
4214 947
3432
4535
3135
4441
3214
1541
4344
12. Ruleta:
El juego de la ruleta ha sido objeto de innumerables intentos de descubrir alguna flaqueza que
permitiera disear un mtodo para obtener ganancias sistemticas. Numerosos autores han escrito
tratados de cmo saltar la banca. Norman Leigh escribi una obra clsica donde expone como,
junto con doce compaeros, saltaron la banca de Montecarlo. La obra, magistralmente escrita,
cuenta hechos verdicos. Pero con el auxilio de la ciencia de la computacin podemos ver que
esos hechos tal como los relata Leigh en su libro no pueden haber sucedido.
El mtodo que Leigh relata en su libro es el Labouchere inverso. El apostador comienza anotando
en una libreta los nmeros 1, 2, 3 y 4. Siempre apuesta una ficha igual a la suma de los nmeros
de los extremos de la lista. Si gana agrega al final de la lista un nmero de igual valor al de su
ltima apuesta, que acaba de ganar. Si pierde tacha los dos nmeros de los extremos de la lista. Si
en principio pierde las dos apuestas iniciales, la lista se acaba y en total ha perdido $10 y entonces
vuelve a comenzar anotando los nmeros 1, 2, 3 y 4 en su libreta y reiniciando el mtodo. Si la
apuesta llega a superar el lmite de la mesa el jugador tambin reinicia el mtodo anotando una
nueva lista de 1, 2, 3 y 4 en su libreta y apostando $5.
Recordamos que la ruleta europea consta de los nmeros del 0 al 36 y que, jugando a par se gana
si se obtiene un nmero par distinto de cero, el que juega a impar gana si el nmero es impar y en
caso de salir cero ambos pierden. La apuesta mxima es de $100, recuerde que cuando se supera
esta apuesta el mtodo se reinicia. En cada apuesta se gana o se pierde el monto apostado.
Con dos jugadores uno jugando a par y otro a impar el mtodo se comporta as en unas bolas de
ejemplo.
31 22 26 11 4 36 0 4
Sale
Par
Lista 1 2 3 4 2 2 2 3 3 3 5 5
3 3 3 5 5 5 8 8 13
5 5 8 8
7 11
Impar
Lista 1 2 3 4 1 2 3 3 1 2 1 2
2 3 4 3 2 3 2 3
3 3 3
4 4 4
Se le pide que escriba un programa que calcule la ganancia o prdida alcanzada luego de jugarse
cierta cantidad de bolas de ruleta.
Entrada:
La entrada consta de un entero 0 < N <= 30000 en la primera lnea indicando la cantidad de
tiradas de ruleta y a continuacin N lneas cada una con un nmero entero entre 0 y 36,
representando las bolas obtenidas en cada uno de los N giros de la ruleta.
Salida:
La salida consistir de dos enteros P y Q separados por un blanco indicando respectivamente la
ganancia (o prdida) de par e impar, proveniente de aplicar el mtodo de Labouchere inverso a las
apuestas de par e impar en la serie de bolas contenida en la entrada.
Ejemplo
ENTRADA SALIDA
8 16 -25
31
22
26
11
36
Una sierpe de N x N cubos busca enroscarse formando un cuadrado de N cubos de lado. La sierpe
para dormir adopta la posicin, en el plano, que le permite tener el cubo 1, (la cabeza), lo ms lejos
posible del cubo N2, (la cola).
Exceptuando la cabeza y la cola todos los dems cubos de la sierpe se articulan con los vecinos
en dos caras opuestas (cubos tipo 0) o en dos caras adyacentes (cubos tipo 1). Lo que hace a una
sierpe distinta de otra es la ubicacin de los cubos de tipo cero y tipo uno en su conformacin.
As la sierpe ilustrada tiene luego de la cabeza cuatro cubos seguidos de tipo 1 y luego alterna un
cubo de tipo 0 otro de tipo 1 y finalmente otro de tipo 0.
Un plegado corresponde a una rotacin de 180 grados de la sierpe entre dos cubos vecinos.
Aunque la rotacin invade la tercera dimensin, al final de la misma la sierpe queda nuevamente
en un plano.
Problema
Debes escribir un programa que indique, a partir de la posicin que adopta para dormir, entre
que cubos debe plegarse para lograr su cometido de quedar enroscada formando un
cuadrado.
Luego de cada plegado ningn cubo de la sierpe puede quedar apoyado sobre otro. Se
considerar como solucin la lista pares de cubos vecinos entre los cuales que debe plegarse
la sierpe para llegar a formar un cuadrado.
Entrada:
La sierpe viene descripta por pantalla que en su primera lnea tiene el nmero entero N (3 N
5) que indica la raz cuadrada de la longitud de la sierpe. A continuacin el archivo tiene N2-2
lneas. Cada una con la descripcin (un cero o un uno) del tipo de cada uno de los N2-2 cubos
centrales (los que no son la cabeza ni la cola).
Salida:
Mostrar por pantalla, a razn de uno por lnea, los nmeros de los pares de cubos entre los
cuales se ha plegado la sierpe respecto de la posicin de reposo separados entre s por un
blanco. Los plegados deben darse en el orden en que fueron sucediendo. En caso de haber
ms de una solucin cualquiera se considerar como correcta.
Ejemplo
ENTRADA SALIDA
3 2 3
1 5 6
1 4 5
1
1
0
1
0
Nota 1: observen que 5-6 4-5 2-3 no es una solucin porque despus de plegar en 5-6 no
puede hacerse el plegado en 4-5 debido a que se produce la superposicin de los cubos 1 y 9.
Nota 2: Todas las sierpes que se presenten como casos de prueba tendrn al menos una
forma de enroscarse para formar un cuadrado.
14. Territorios:
En el juego "territorios" dos jugadores A y B se alternan para ir destruyendo el territorio del
enemigo. El terreno de juego es una cadena de N territorios alineados, 1 N 120. El territorio 1
limita slo con el territorio 2 que limita a su vez tambin con el territorio 3 que limita a su vez
tambin con el territorio 4, hasta llegar al territorio N-1 que limita con los territorios N-2 y N que a su
vez slo limita con el territorio N-1. El primero que juega es A quien es dueo de todos los
territorios impares, mientras que B quien juega en segundo turno es dueo de todos los territorios
pares.
Cada territorio i esta inicialmente ocupado por una cantidad entera Ti de soldados, 0 Ti 500. En
cada turno un jugador puede aniquilar los soldados de un territorio enemigo si la cantidad de
soldados suyos en un territorio vecino o la suma de los soldados en sus dos territorios vecinos es
superior a la cantidad de soldados que tiene el jugador enemigo en ese territorio, quedando 0
soldados en el territorio vencido.
Si un jugador no puede jugar deber cederle el turno al otro jugador. Cuando ninguno de los dos
pueda jugar se dar por terminado el juego. El puntaje que obtiene el jugador A es igual a la
cantidad de terrenos salvados por A menos los salvados por el jugador B. Si el puntaje de A es
positivo gana A, si es negativo gana B y 0 significa un empate.
Problema
Escribe un programa que dados todos los Ti halle el valor del juego para A, considerando que
ambos jugadores hacen la mejor jugada posible en cada turno, es decir utilizan una estrategia
ptima.
Entrada
La primera entrada tiene el entero N y las siguientes N lneas tienen los enteros Ti, 1 i N.
Salida
La salida se har escribiendo el valor del juego para A en pantalla
Ejemplo
ENTRADA SALIDA
5 2
33
71
56
44
21
15. Agente de Comunicaciones:
En toda rea de telecomunicaciones se transmiten datos de un origen a un destino, por ejemplo
en el caso de AVL (Automatic Vehicle Location Localizacin automtica de Vehculos) la
transmisin es realizada desde un origen mvil (Vehiculo) hacia un destino Centro de Control
(Oficina central de una empresa donde se recibe la informacin) tal como se ve en el la ilustracin
1.
Centro de Control
De
Mensajes
Mensajes
Todos los mensajes son del mismo tamao y contienen datos como tiempo, posicin, velocidad y
rumbo.
Al centro de control llegan mensajes de varias unidades mviles, estos mensajes forman una cola
de mensajes el cual debe ser procesado por un Agente de comunicaciones que finalmente
muestra al usuario informacin til.
Problema
Implementar un Agente de Comunicaciones que tiene como entrada una cola de mensajes y
como salida un reporte con informacin procesada.
Debe procesar los mensajes para obtener a partir de su formato hexadecimal sus respectivos
valores decimales de acuerdo al Anexo 2.
Total Unidades : 2
Total de Mensajes: 5
------------------------------------------------------------------------------------------------------
Orden Longitud Latitud Vel. Rumbo Tiempo Est. Operativo Est. Posicin
------------------------------------------------------------------------------------------------------
Orden Longitud Latitud Vel. Rumbo Tiempo Est. Operativo Est. Posicin
Anexos
Parte \ Descripcin Tipo Carcter (*) Numero de Posicin Posicin Datos Adicionales
Caracteres Inicial Final
Carcter Inicial > 1 1 1 Siempre tiene valor >
Unidad HH 2 2 3 Cdigo de la unidad mvil
Longitud HHHHHHH 7 4 10 Coordenada x
Latitud HHHHHHH 7 11 17 Coordenada y
Velocidad HH 2 18 19 Km./h
Rumbo HHH 3 20 22 Grados (0 a 360)
Tiempo HHHH 4 23 26 Total de Minutos
transcurridos de la semana
actual.
Anexo2: Ejemplo de una Cola de Mensajes que se ingresara como entrada al programa:
>C847B7622083466200000780>C84811082098A30C1E02D78A>C847B87520EE17C72805A79E>C942F2AE20EF08522310E796
>C943E6D220EEB2625C1187A0
Ordenada resultara:
Carcter Inicial Unidad Longitud Latitud Velocidad Rumbo Tiempo (Fecha Hora)
> 200 75.200034 08.603234 0 0 2006/05/08 08:00
> 200 75.567234 10.003212 30 45 2006/05/08 08:10
> 200 75.204434 15.603655 40 90 2006/05/08 08:30
> 201 70.200034 15.665234 35 270 2006/05/08 08:22
> 201 71.200034 15.643234 92 280 2006/05/08 08:32
(**)Para el calculo de la fecha y hora agregar a la fecha hora inicial de la semana (domingo a las o horas) la
cantidad de minutos correspondiente al mensaje.
(*)La Zona Prohibida es un rectngulo definido mediante coordenadas de dos vrtices en diagonal: (70.000000,
09.000000) (80.000000, 12.000000)
Anexo4: Un numero Hexadecimal esta compuesto por los dgitos: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E y F
DgitoHexacecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F
DgitoDecimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Para transformar un nmero hexadecimal a su correspondiente decimal debes realizar la sumatoria del
equivalente real (es equivalente unitario por potencia de 16, la potencia depende de la posicin del
digito) de cada digito Por ejemplo: