Professional Documents
Culture Documents
Lenguaje de programacin
estructurada
y sus aplicaciones en Borland C++ 5.02
II
Palabras liminares
Me complace felicitar a los docentes de nuestra Universidad ganadores del II
Concurso para la Publicacin de Libros de Texto convocado por el Rectorado
y realizado en cada una de las Facultades. Una de las polticas medulares del
Rectorado es la permanente mejora en la calidad acadmica, y en ese sentido nos
interesa que cada docente tenga la oportunidad de convertir su labor cotidiana
de enseanza en textos para uso de los estudiantes universitarios de todo el pas.
Los autores han hecho un meritorio esfuerzo para organizar los temas de sus
exposiciones, realizando investigaciones y consultando fuentes peruanas y
extranjeras, as como recogiendo el fruto del dilogo con sus colegas y los propios
estudiantes. Asimismo, se han esmerado en presentar sus cursos de manera que
facilita el acceso por parte de los interesados.
La publicacin de textos acadmicos es una de las obligaciones de toda
universidad y uno de los ndices que se toma en cuenta para la evaluacin de
la calidad acadmica. Por ende, seguiremos apoyando la publicacin de libros
y revistas a travs de nuestra Editorial Universitaria, cuya meta es formar parte
del liderazgo peruano en la industria editorial dedicada a ingeniera, ciencia y
arquitectura.
Es responsabilidad de la Universidad Nacional de Ingeniera aportar al Per
un liderazgo de base tecnolgica que trabaje en estrecha asociacin con las
autoridades gubernamentales, los dirigentes empresariales y la sociedad civil
en su conjunto, lo cual requiere de una poltica editorial y de publicaciones que
estamos impulsando.
III
IV
VI
VII
VIII
ndice
Presentacin................................................................................................................XIII
Introduccin.................................................................................................................XV
Captulo I
Generalidades................................................................................................................ 1
1.1 Introduccin......................................................................................................... .1
1.2 Introduccin a la programacin......................................................................... 1
1.3 Caractersticas de un algoritmo de computador.............................................. 2
1.4 Lenguajes de programacin................................................................................ 2
1.5 Lenguajes de mquina......................................................................................... 3
1.6 Lenguaje de bajo nivel.......................................................................................... 3
1.7 Lenguaje de alto nivel.......................................................................................... 3
1.8 Programa ejecutable............................................................................................. 3
1.9 Compilador............................................................................................................ 3
1.10 Palabras reservadas.............................................................................................. 3
1.11 Identificadores....................................................................................................... 4
1.12 Comentarios........................................................................................................... 4
1.13 Tipos de datos....................................................................................................... 5
1.14 Carcter (char)....................................................................................................... 5
1.15 Declaracin de constantes simblicas................................................................ 6
Captulo II
Estructuras de control................................................................................................. 11
2.1 Estructuras secuenciales ................................................................................... 11
2.2 Estructuras selectivas condicionales................................................................ 16
2.2.1 Estructura selectiva simple............................................................................... .16
2.2.2 Estructura selectiva compuesta........................................................................ 18
2.2.3 Estructura condicional con anidamiento......................................................... 19
2.3 Estructuras mltiples......................................................................................... 21
IX
Captulo IV
Las cadenas de caracteres......................................................................................... 199
4.1 Introduccin...................................................................................................... 199
4.2 Punteros a cadenas........................................................................................... 200
4.3 Funciones para el tratamiento de cadenas:strlen(), strcat()........................ 202
4.4 Copia de cadenas:stpcpy(), strcpy(), strncpy()............................................. 204
4.5 Funciones para buscar un carcter en una cadena:strchr(), strrchr()........ 206
4.6 Funcin para reconocimiento de una porcin de cadena: strspn(),
strcspn(), strpbrk() y strtok().......................................................................... 208
4.7 Funciones para la comparacin de cadenas: strcmp(), strnicmp(),
stricmp()............................................................................................................. 210
4.8 Transformacin de cadenas: strset(), strnset().............................................. 213
4.9 Funciones para invertir cadenas:strxfrm(), strrev()..................................... 214
4.10 Conversin a maysculas y minsculas: strupr(),strlwr().......................... 215
4.11 Inclusin de una cadena en otra cadena........................................................ 215
Captulo V
Programacin modular............................................................................................. 221
5.1 Introduccin...................................................................................................... 221
5.2 Funciones definidas por el usuario................................................................ 222
5.3 Declaracin y definicin de funciones........................................................... 224
5.4 Lista de parmetros y sus tipos de datos...................................................... 225
5.5 Variables locales y globales............................................................................. 226
5.6 Parmetros por defecto, valor......................................................................... 227
5.7 Funciones que llaman a funciones................................................................. 246
5.8 Funciones recursivas........................................................................................ 259
X
Captulo VI
Registros..................................................................................................................... 273
6.1
6.2
6.3
6.4
6.5
6.6
Captulo VII
Archivos (File)........................................... 307
7.1 Introduccin...................................................................................................... 308
7.2 Caractersticas de los archivos........................................................................ 308
7.3 Archivos (file).................................................................................................... 308
7.4 Apertura de archivos........................................................................................ 308
7.5 Clasificacin de archivos por tipo de contenido: texto, binarios............... 309
7.5.1 Archivos de texto.............................................................................................. 309
7.5.2 Archivos binarios.............................................................................................. 309
7.6 Clasificacin de archivos por tipo de acceso................................................. 310
7.6.1 Archivos secuenciales....................................................................................... 310
7.6.2 Archivos directos: acceso aleatorio ............................................................... 310
7.7 Direcciones lgicas y direcciones fsicas........................................................ 310
7.8 Clculo de direcciones fsicas.......................................................................... 311
7.9 Funciones para el manejo de archivos........................................................... 311
7.10 Declaracin de la variable lgica (alias) del archivo................................ 311
7.11 Funcin para procesar archivos...................................................................... 311
7.12 Validar la apertura de un archivo................................................................... 312
7.13 Cierre de archivos usando fclose() y fcloseall()............................................ 312
7.14 Escritura de registros usando fwrite()........................................................... 313
7.15 Vaciando los buffers usando fflush ()........................................................... 313
7.16 Lectura de registros usando fread ().............................................................. 313
7.17 Funcin para acceso de archivo...................................................................... 313
7.18 Conocer posicin del apuntador del archivo:funcin ftell()...................... 314
7.19 Posicionando apuntador al inicio del archivo: rewind()............................. 314
7.20 Detectando el final del archivo con feof()...................................................... 314
7.21 Cambio de nombre de archivo rename()....................................................... 314
7.22 Eliminando archivos con la funcin remove().............................................. 315
XI
Captulo VIII
Programacin dinmica........................................................................................... 327
8.1 Programacin dinmica:punteros.................................................................. 327
8.2 Creacin de un puntero................................................................................... 328
8.3 Operadores........................................................................................................ 328
8.4 Inicializacin de un puntero............................................................................ 329
8.5 Lista..................................................................................................................... 332
8.6 Pila....................................................................................................................... 332
8.7 Punteros nivel RAM......................................................................................... 336
8.8 Punteros y archivos......................................................................................... 346
8.9 Compendio de problemas............................................................................... 349
Bibliografa.................................................................................................................. 357
ndice temtico. ............. 359
XII
Presentacin
En el milenio pasado, como en el actual, se exige constantemente a la universidad
elevar su calidad acadmica, especialmente la formacin profesional que est
relacionada directamente con la formacin del docente universitario.
En general, el paradigma de la docencia universitaria est ligado a dos variables:
el dominio y experiencia de la especialidad profesional y el conocimiento y praxis
del proceso de enseanza - aprendizaje en sus asignaturas correspondientes.
Dentro de este contexto, felicito a las autoridades de la Universidad y al ente
normativo de promocionar actividades estratgicas en el sector acadmico, tales
como la publicacin de textos universitarios, actividad estratgica que beneficia a
la universidad como al docente, debido que en conjunto se est cumpliendo con
el perfil de la universidad: Ciencia Tecnologa y Sociedad (CTS).
Respecto al docente, estamos en la responsabilidad de proporcionar un conjunto
de enfoques didcticos relacionados con nuestro rol universitario, donde el
proceso de enseanza - aprendizaje, mtodos, tcnicas y evaluacin, engloben las
TICS buscando mejoras continuas. En este sentido, como docente de la asignatura
Lenguaje de Programacin Estructurada, asignatura obligatoria que forma
parte del plan curricular de vuestra Facultad, presento el texto denominado
Aplicaciones en Borland C++ 5.02 Programacion Estructurada, organizado
y diseado con base en la experiencia de ms de 20 aos comprometido con el
concepto de programacin en lenguajes estructurados.
Esperando que la lectura, anlisis y reflexin de la antologa que presento sirva
para acrecentar el espritu de renovacin institucional, de innovacin profesional
continua y que obviamente trascender al mejor aprendizaje y alta calidad
acadmica de nuestros alumnos, cuando adems de la enseanza presencial,
tambin se dispongan de herramientas didcticas: libros, clases on line, etc.
El autor
XIII
XIV
Introduccin
El comit para el estndar ANSI C se form en el ao 1983 con el objetivo de
crear un lenguaje uniforme a partir del Lenguaje de Programacin C original,
desarrollado por Kernighan y Ritchie en 1972, en la ATT. Respecto a C++ comenz
a desarrollarse en 1980 por B. Stroustrup. Al comienzo era una extensin del
lenguaje C, que fue denominada C with classes. Este nuevo lenguaje comenz
a ser utilizado fuera de la AT&T en 1983. Ante la gran difusin y xito que iba
obteniendo en el mundo de los programadores, la AT&T comenz a estandarizarlo
internamente en 1987. En 1989 se form un comit ANSI para estandarizarlo a
nivel internacional.
En la actualidad, el C++ es un lenguaje verstil, potente y general. Su xito
entre los programadores permite ocupar el primer puesto como herramienta
de desarrollo de aplicaciones, pues mantiene las ventajas del C en cuanto a
riqueza de operadores y expresiones, flexibilidad, conciso y eficiencia. Adems,
ha eliminado muchas de las dificultades y limitaciones que tiene C original. La
evolucin de C++ ha continuado con la aparicin de Java, un lenguaje creado
simplificando algunas partes de C++ y aadiendo otras, que se utiliza en la
presente dcada para realizar aplicaciones en internet.
El C++ se presenta como:
1. Lenguaje de programacin procedural (orientado a algoritmos) y por cumplir
con las normas de poseer las tres estructuras de control (secuenciales, condicionales/
mltiples y repetitivas).
2. Lenguaje orientado a objetos (objectoriented programming, OOP). Como
lenguaje procesal se asemeja al C y es compatible con l. Este nivel de programacin
admite una filosofa completamente diferente, que exige del programador un
completo cambio de mentalidad. Las caractersticas propias de la programacin
orientada a objetos, este tema es el ms fascinante, pues C++ cambia radicalmente
su pensamiento de programacin.
Cabe notar que un programa fuente diseado a nivel C++, no compila en C,
pero lo contrario s se cumple. Adems de las estructuras del control, tambin
disponen de estructuras de datos en forma legible al usuario, tales como: listas o
XV
vectores, tablas o matrices, etc. Asimismo, los registros (struct), uniones, archivos
(FILE), programacin dinmica (punteros), procesamiento de cadenas basadas
fuertemente en funciones (strcmp, struppr, etc.).
El presente texto est basado en experiencias obtenidas por ms de dcada y media,
dictando asignaturas en las escuelas de Ingeniera de Sistemas, Computacin e
Informtica de las diferentes universidad del Per (Universidad Nacional de
Ingeniera - Facultad de Ingeniera Industrial y de Sistemas), Universidad de
San Martn, Universidad Antnez de Mayolo, Universidad Tecnolgica del Per,
Universidad San Martn de Porres, etc.).
Me es grato agradecer las sugerencias de colegas que, en su debida oportunidad,
aportaron con sus opiniones para la mejora del presente libro.
El autor
XVI
Captulo 1
Generalidades
Objetivos
- Conocer la biblioteca standard de
Borland C++ 5.02.
- Dar fundamentos para el estudio de
otros lenguajes de programacin en
general y aplicarlos para java, etc.
- Comprender la programacin de nivel estructurada.
- Comprender las tcnicas bsicas para
resolver problemas.
- Desarrollar programas usando las
tcnicas de tipo top-down (de arriba
abajo)
- Usar los operadores lgicos, relacionales, funciones resto y parte entera.
- Usar los tipos de datos enteros, reales, cadenas, booleanos.
1.9 Compilador
Es una herramienta bsica en el mantenimiento y mejora del sistema operativo.
Por ello este producto est en constante evolucin, ya que de su buen rendimiento
depende en parte el del sistema.
Ejemplos:
break do enum int typedef
bool double for
private while
case else if sizeof
1.11 Identificadores
Son secuencias de caracteres que representan a las variables, constantes, tipos,
funciones, clases y etiquetas en un programa. En C++, un identificador vlido
debe cumplir con lo siguiente:
Reglas
13.1. Debe estar formado solamente por letras maysculas (de la A a la Z), o
letras minsculas (de la a a la z) Adicionalmente puede combinarse con el
carcter subrayado ( _ ).
Ejemplo : pc, prom_pc, cont, _nombre.
13.2. Usar dgitos del 0 al 9. Debe comenzar con una letra o letras (nunca con
nmeros).
Ejemplo: pc_01, prom_pc, cont, Lab1, etc.
13.3. Puede comenzar con un subrayado, pero las palabras que comienzan con
dos subrayados son reservadas para el uso interno del compilador.
13.4. No debe contener espacios en blanco, use el subrayado ( _ ) en vez de blancos.
13.5. No usar palabras reservadas del compilador.
Ejemplos de identificadores no vlidos:
3pc:
comienza con un nmero
nombre apellidos: contiene un espacio en blanco
_i_y:
comienza con dos subrayados
x*y:
contiene un carcter no vlido (*)
do:
es una palabra reservada
Nota: C++ es sensible al uso de las maysculas y minsculas. As, A es diferente
de a.
1.12 Comentarios
Son explicaciones literales que sirven para aumentar la legibilidad de los
programas. Estas son ignoradas totalmente por el compilador. En C++, se puede
colocar comentarios en cualquier parte del programa donde sea posible, de dos
maneras:
14.1 Mediante dos barras inclinadas (//), para comentarios de una lnea.
4
Tamao
Lgico
bool
1 bit
true o false
Enteros
unsigned char
8 bits
0 .. 255
char
8 bits
128 .. 127
enum
16 bits
32 768 .. 32 767
unsigned int
16 bits
0 .. 65 535
short int
16 bits
32 768 .. 32 767
int
16 bits
32 768 .. 32 767
unsigned long
32 bits
long
32 bits
float
32 bits
3.4E38 .. 3.4E+38
double
64 bits
1.7E308 .. 1.7E+308
long double
80 bits
3.4E4932 .. 1.1E+4932
Reales
Rango
\b
retroceso (backspace)
\f
\n
\r
\t
tabulacin horizontal
\v
tabulacin vertical
\\
#define
nombre
valor
Ejemplos:
# define pi 3.141
# define linea ---------------------------------------------------------------
Puede hacer que una constante tome un valor en funcin de otras:
# define pi 3.141,
# define doble_pi 2*pi
Mediante tipos enumerados:
El tipo enum es til cuando se crean constantes simblicas con valores enteros.
Ejemplo:
enumdias = {lunes=1,martes,miercoles,jueves,viernes,sabado,domingo}
Adems, se puede alterar el orden consecutivo, por ejemplo:
enum colores = {blanco,amarillo,rojo,azul,anterior=64 }
Variables.- Una variable es un identificador vlido cuyo valor puede cambiar
temporalmente durante la ejecucin de un programa. Las variables deben ser
declaradas antes de ser utilizadas.
Sintaxis:
Tipo_de_dato
nombre_de_variable;
Operador
Significado
Ejemplo
Negacin
Negacin lgica
(NOT)
!(n<11)
//si n es menor
que 11,devuelve falso (0)
Contador
Incremento
++
Preincremento o
posincremento
Contador
Disminuir
--
Predecremento o
posdecremento
--n//
Multiplicar
Multiplicacin
a * b //Multiplica a por b.
Dividir
Divisin
Resto
Mdulo (resto)
Operadores
relacionales
<
Menor que
<=
>
Mayor que
>=
==
Igualdad
5 == 3 // devuelve falso
!=
Desigualdad
a!=13
&&
y Lgico (AND)
||
oLgico (OR)
(mivar==hola) || (3<5)
//Devuelve verdadero
Condicional
?:
Condicional
abreviado
Asignacin
Asignacin
Asignar producto
m*=3 //Equivale a m = m * 3
/=
Asignar divisin
e/=d //Equivale a e = e / d
%=
Asignar mdulo
t%=2//Equivale a t = t % 2
+=
Asignar suma
g+=7 //Equivale a g = g + 7
Igualdad
Expresiones: *=
n disminuye en 1
c>d
# define pi 3.14
// Prototipo de funciones
tipo_datonomb_ funcion (lista_argumentos);
.................................................
// Declaracion de variables globales
inta,b,c;
// Declaracin y definicin de funciones: Implementacin
tipo_datonomb_funcion(lista__de_argumentos)
{ Declaraciones locales
<Instrucciones >;
return(expresin_de_tipo_dato);
}
tipo_nfuncion_n(lista_de_argumentos)
{ <dem caso de la funcion1>;
}
/
/Programa principal
voidmain()
{ Declaraciones sobre variables locales al proceso principal
<Instrucciones>;
Nomb_funcion(lista_de_argumentos);
-------------------------------------------- funcion_n(lista_de_argumentos);
return(0);
}
Como se observa el esquema ms empleado para un programa en C++ se compone
bsicamente por:
1. Directivas
2. Declaracin y definicin de funciones secundarias definidas por el usuario
3. Una funcin principal main()
Notas:
1. La funcin principal o main() regresa un valor 0 al sistema operativo para indicar que el proceso termin exitosamente, cuando ocurre algn tipo de error
regresar algn otro valor entero. Si no se requiere que main devuelva algn
valor, se escribe voidmain() y se omite return0;
2. Si desea retornar un valor entero, entonces defina el tipo de dato delante de
la funcin respectiva.
intmain()
{ return 0;
}
Las dems funciones, por lo general son llamadas a ejecucin dentro del mbito
de nuestra funcin principal y por consiguiente, ah pueden regresar valores.
Observacin:
Durante el diseo de los programas solo especificar una librera de entrada y
de salida:
# include<iostream.h>
Las dems libreras el usuario definir segn su requerimiento.
10
CAPTULO II
Estructuras de control
Objetivos
- Comprender la seleccin a travs de la
instruccin de condicional if (simple,
compuesta y con anidamiento).
- Como definir estructuras mltiples o
de seleccin Switch (selector).
- Utilizar las instrucciones de control
con pretest de prueba (while).
- Utilizar las instrucciones de control
con posprueba (do, while).
- Utilizar las estructuras de control de
programas break y continue.
- Combinar las estructuras selectivas,
mltiples y repetitivas.
- Hacer aplicaciones que representen problemas reales, tales como validacin
de cdigos de alumnos, empleados, DNI, cdigo de productos, etc.
Sintaxis
<instruccin_1>;
< instruccin _2>;
...........................
< instruccin _ n>;
Sentencia nula: En C++ existe, adems, la sentencia nula (una instruccin que no
hace nada), est representada por un punto y coma (;).
11
#include<iostream.h>
#include<iomanip.h> //para setiosflags
void main()
{
float a,b,c,p,area;
clrscr();
gotoxy(8,2);cout<<Ingrese
los lados del triangulo;
gotoxy(10,4);cout<<a = ; cin>>a;
gotoxy(10,5);cout<<b = ; cin>>b;
gotoxy(10,6);cout<<c = ; cin>>c;
p=(a+b+c)/2;
gotoxy(10,8);cout<<El permetro
es <<setw(10)<<setprecision(2)<<
2*p;
area=float(sqrt(p*(p-a)*(pb)*(p-c)));//moldeo de datos
gotoxy(10,10);
cout<<El rea es <<setw(15)<<setprecision(4)<<area<< metros ;
gotoxy(10,14);system(pause);
}
Problema 2. Disear un programa que permita leer datos de un trabajador
consistentes en: nombre, cdigo, sueldo bsico y bonificacin. Considere tambin
que:
-
-
-
-
Solucin: //simula_planilla.cpp
#include<iostream.h>
void main()
{ float s_basico,bonif,dscto,aumento,s_neto,s_real,fon,afp,snp,
float inval,senati,aport; char nom[20],cod[5];
clrscr();
12
13
15
if (<condicin>)
{ intrucciones;
}
16
Solucin // if_resto.cpp
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main()
{int n, ult_dig,dato;
clrscr();gotoxy(10,2);
cout<<Sr. ingrese nmero :;cin>>n;
dato=n;
if(n>9)
{ ult_dig=dato%10;
gotoxy(10,5);cout<<ltimo dgito de << n<< es = <<ult_dig;
}
getche();
}
Problema 2. Disear un programa que permita leer un nmero n entero positivo
y mayor que 99. Si le lectura es correcta, entonces obtener sus dos ltimos dgitos.
Si la lectura es incorrecta el programa no realiza ninguna tarea.
Solucin
void main()
{int n, dos_dig,dato; clrscr();
gotoxy(10,2);
cout<<Sr. ingrese nmero :;cin>>n;
dato=n;
if(n>99) {dos_dig=dato%100;
gotoxy(10,5);cout<<
Dos
ltimos
dgitos de << n<< es = <<dos_dig;
if(dos_dig%2==0)
{ gotoxy(10,7);cout<< Y adems, <<
dos_dig<< es un nmero PAR ; }}
getche();}
Comentario. Los resultados de los
problemas 1, 2 y 3 se obtiene toda vez
que la condicin lgica es verdadera. Si
usted ingresa nmeros que no satisfacen
la condicin, el programa no enva
ningn resultado.
17
18
Si < expresin > es verdadera, se ejecuta el bloque <instrucciones >, en otro caso
se ejecuta las <instrucciones> del bloque else.
Problema 1. Disear un programa
que permita leer un nmero y luego
averiguar si es capica.
Solucin // if_capicua.cpp
#include<iostream.h>
void main()
{int num,c,r1,d,u,inv;
clrscr();
gotoxy(10,4);
cout<< Ingrese Nmero: ;cin>>num;
c=num/100; // obtiene primer dgito
r1=num%100; //obtiene dos ltimos dgitos
d=r1/10; u=r1%10;
inv=u*100+d*10+u;
if (num==inv) { clrscr();
gotoxy(10,4);cout<< El nmero<<num << Es capica;
gotoxy(10,5);cout<< su primer dgito es=<<c;
}
else { clrscr();
gotoxy(10,4);cout<<El nmero<<num << No capica;
gotoxy(10,5);cout<<Sus ltimos dos dgitos es=<<r1;
}
getch();
}
19
20
{ char apell[10],clave[10],e=0;
int a,b,c,mayor, tresd;
gotoxy(10,2); cout<< Ingrese Apellido = ;gets(apell);
gotoxy(10,3); cout<< Ingrese Clave = ;gets(clave);
gotoxy(10,4); cout<<linea;
if ((strcmp(strupr(apell),CORDOVA)==0) && (strcmp(strupr(clave),T
CN)==0))
{ gotoxy(10,6);cout<< Saludos, Sr..<< apell<< y Bienvenido ;
gotoxy(10,7);cout<< Ingrese 3 nmeros ;
gotoxy(10,8);cout<< a= ;cin>>a;
gotoxy(10,9);cout<< b= ;cin>>b ;
gotoxy(10,10);cout<< c= ;cin>>c;
if ((a>b)&&(a>c))
{mayor=a; gotoxy(10,13);cout<<El mayor nmero es = <<mayor;
}
else
if((b>a)&&(b>c))
{mayor=b; gotoxy(10,13);
cout<<El mayor nmero es = <<mayor;
}
else
if((c>a)&&(c>b))
{mayor=c;
gotoxy(10,13);cout<<El mayor
nmero es = <<mayor;
}
else
{ gotoxy(10,13);cout<< Los
nmeros son iguales...;
}
}
else
{ gotoxy(10,5); cout<< Sr. sus datos son incorrectos ;
}getche();
}
switch (expresin) {
case valor1:
<instrucciones_1>;
break;
21
case valor2:
<instrucciones_2>;
break;
.....
case valor_n:
<instrucciones_n>;
break;
default: < instrucciones_X>; break;
} //fin de switch()
Observaciones
1. La etiqueta default indica al programa
lo mismo que el else en la secuencia de if anidado, es decir; se ejecuta cuando
el usuario edita un valor que no est en la lista de valores.
2. La sentencia break permite que el
programa abandone la estructura
switch omitiendo los dems casos.
3. La variable selector no puede ser
tipo: real, cadena de dgitos, cadenas.
4. Cuando se quiere realizar una misma
accin para distintos valores de la
expresin evaluada, se coloca una
sentencia case por cada valor, sin
ninguna accin y la accin comn
se pone al final del ltimo valor. Por
ejemplo, el segmento de cdigo:
switch (a) {
case 1:case 2:case 3: cout<<Accin para 1, 2 y 3;
break;
case 4: cout<<Accin para 4; break;
default: cout<<Accin para cualquier otro valor; break;
}
Problema 1. Disear un programa que permita disponer de tres alternativas:
- Alternativa 1: permite leer la base y el exponente para calcular la potencia de
un nmero.
- Alternativa 2: permite leer un nmero n positivo y luego calcula la raz
cuadrada.
- Alternativa 3: permite ingresar un nmero de tres dgitos y luego este nmero
mostrarlo en forma invertida sin usar estructuras de control repetitivas.
- Alternativa 4: permite salir del modo compilacin al programa fuente.
22
cout<<linea;
getche();
else
{ gotoxy(15,6); cout<< El nmero no satisface condicin ;
}
break;
caseS:case s: clrscr(); gotoxy(2,8);cout<<linea;
gotoxy(10,12);cout<< Ud saldr del Sistema, hasta luego.. ;
gotoxy(2,14);cout<<linea; getche(); exit(1);
default: gotoxy(10,12);cout<< Ud NO seleccion su opcin correcta.. ;
}
getche();
}
break;
default:cout<<No existe Marca de tal Ordenador, hasta luego;
getche();
exit(1);
// fin de alternativas de ordenadores :O : Ordenadores
break;
case i:case I:// Opcin de case principal :I : Impresoras
clrscr();
gotoxy(15,2); cout<<Impresoras;
gotoxy(15,4);cout<<<L> Lasse :;
gotoxy(15,5);cout<<<M> Matricial;
gotoxy(15,6);cout<< Edite opcin;cin>>imp;
switch(imp)
{ case l:case L:
clrscr();
cout<<\ningrese nmero de impresoras Lasser:;cin>>nimpl;
cout<<\ningrese precio por unidad:; cin>>pimpl;
montolasser=nimpl*pimpl;
cout<< \nUd. debe pagar :<<montolasser; getche();
break;
case m:case M: clrscr();
cout<<\ningrese nmero de impresoras Matricial:;cin>>nimpm;
cout<<\ningrese precio por unidad:; cin>>pimpm;
montomat=nimpm*pimpm;
cout<< \nUd. debe pagar :<<montomat;
getche();
break;
default:cout<<No existe Impresoras; getche();
exit(1);
}// fin de alternativas de Impresoras :I: Impresoras
break;
case l:case L:// Opcin de case principal :L : Lectoras
clrscr();
gotoxy(15,2); cout<<Lectoras;
gotoxy(15,4);cout<<<C> Creative :;
gotoxy(15,5);cout<<<H> HP;
gotoxy(15,6);cout<< Edite opcin;cin>>imp;
switch(imp)
{ case c:case C: clrscr();
cout<<\ningrese nmero de Lectoras Creative: ;cin>>nlcre;
cout<<\ningrese precio por unidad:; cin>>plcre;
montolcre=nlcre*plcre;
cout<< \nUd. debe pagar :<<montolcre;
getche(); break;
case h:case H: clrscr();
cout<< \ningrese nmero de Lectoras HP: ;cin>>nlhp;
cout<< \ningrese precio por unidad:; cin>>plhp;
montolhp=nlhp*plhp;
26
}
getche()
}
cont = cont + 1
inicialice : cont =1
inicialice: suma=0
que lea una cadena y determine en ella la frecuencia de aparicin de cada vocal.
Solucin // while_vocal.cpp
#include <iostream.h>
#define linea ____________________________________
void main() {
int na=0,ne=0,ni=0,no=0,nu=0; char c=\0;
gotoxy(10,2);cout<<Ingrese texto :<<endl ;
while (c!=\n) {
c=toupper(getchar());
switch (c) {
case A: na++; break;
case E: ne++; break;
case I: ni++; break;
case O: no++; break;
case U: nu++; break;
} // fin de while }
gotoxy(10,5);cout<<
===>
RESULTADOS <=== ;
gotoxy(8,7);cout<<Cracter
# de
repeticiones ;
gotoxy(5,8);cout<<linea;
gotoxy(10,9);cout<< a\t\t<<na<<
veces;
gotoxy(10,10);cout<< e\t\t<<ne<<
veces;
gotoxy(10,11);cout<< i\t\t<<ni<< veces;
gotoxy(10,12);cout<< o\t\t<<no<< veces;
gotoxy(10,13);cout<< u\t\t<<nu<< veces;
gotoxy(5,14);cout<<linea;
getch();
}
Problema 2. Escribir un programa que permita leer un nmero compuesto por
ms de un dgito y luego mostrar:
Total de dgitos, total de dgitos pares e impares, nmero invertido, total de suma
de dgitos pares e impares respectivamente. El programa debe ser interactivo, es
decir; despus de cada ejecucin, el sistema enva el mensaje Desea continuar..?
(S / N). Si edita S contina ejecutando el programa, en otro caso finaliza.
Solucin // while_digitos.cpp
#include <iostream.h>
void main()
{ int r,d,n,inv=0,par=0,impar=0, nd,sump=0,sumimpar=0;
char resp=s;
while(resp==s)
30
31
Si los datos son correctos, el sistema solicita que ingrese dos elementos de la
serie 1+2+3+4+.......+n. Los elementos son lado izquierdo (ladi): indicando primer
elemento y lado derecho (ladd) indicando segundo elemento; es decir; definimos
un rango de elementos a sumar. Luego, generar reportes que permita saber la
32
suma acumulada y el total de dgitos que tiene este resultado. Si los datos son
incorrectos, el sistema enva el mensaje de error.
Solucin //while_if.cpp
#include<iostream.h>
void main() {int acum=0,ladi,ladd,li; char codigo, clave;
gotoxy(12,6);cout<< Ingrese cdigo : ;cin>>codigo;
gotoxy(12,7); cout<< Ingrese clave : ;cin>>clave;
if((codigo==a)&& (clave==b)) {clrscr();
gotoxy(12,6); cout<<Ingrese lado izquierdo : ;cin>>ladi;
gotoxy(12,7); cout<<Ingrese lado derecho : ;cin>>ladd;
clrscr();
li=ladi;
while (ladi<=ladd) { acum+=lad ladi++;
}
gotoxy(6,6);cout<< La suma
desde <<li<< hasta <<ladd<<
es= <<acum;
if ((acum>=0)&&(acum<10))
{ gotoxy(6,7);cout<< La
suma tiene 1 dgito ;
}
else { if ((acum>9)&&(acum<
100))
{ gotoxy(6,8);cout<< La suma
tiene 2 dgitos;
}
else
{ if ((acum>99)&&(acum< 999))
{ gotoxy(6,9);cout<< La suma tiene
3 dgitos;
}
}
}
} // fin del if
else {clrscr();
gotoxy(12,12); cout<< Sus datos no
se registraron, hasta luego :;
}
getche();
}
Problema 5. Disear un programa que
permita leer un nmero n entero positivo, luego calcular su factorial e imprir su
resultado.
Solucin // while_fact.cpp
#include<iostream.h>
#include<conio.h>
void main()
33
{ double fact=1.0,n,minumero;
gotoxy(8,4);
cout<<Ingrese un nmero : ;
cin>>n;
minumero=n;
while (minumero >0)
{ fact=fact* minumero;
minumero--;
}
gotoxy(15,6);cout<<El factorial
de <<n << es =<<fact; getche();
}
Problema 6. Disear un programa
que permita mostrar la tabla de multiplicar de n filas y m columnas, donde el
usuario ingresar nmero de filas y columnas.
Solucin //while_mult.cpp
#include <iostream.h>
void main() { int n,m,i=1,j=1;
gotoxy(12,3);cout<<TABLA DE MULTIPLICAR;
gotoxy(4,5);
cout<<ingrese nmero de fila :;cin>>n;
gotoxy(4,6);
cout<<ingrese nmero de columna; cin>>m;
while(i<=n )
{ cout<<Para fila :<<i<<endl;
while ( j <= m )
{cout<<\ti= <<i<< y <<j=<<j<< se tiene <<i<<*<<j<<=<<i*j<<endl;
j++;
} cout<<\n;
i++; j = 1;
}
system(pause);
}
Problema 7. Disear un programa que permita calcular la suma acumulada de la
SERIE = 1+x+x*x/2 ! +.......+ x^n / n !
Para lo cual se debe ingresar el valor de x y el nmero de trminos a sumar.
Solucin //while_sum_fact.cpp
#include<iostream.h>
void main() { int x,n,i=1;
float r=0.0; clrscr();
gotoxy(8,2);cout<<SUMA DE SERIE = 1+X+X*X/2!+...+X^n/n! ;
gotoxy(8,4);cout<<Ingrese el valor de x : ;cin>>x;
gotoxy(8,5);cout<<Ingrese el valor de n : ;cin>>n;
34
while(i<=n)
{ float fact=1,g=1;int j=1;
while(j<=i)
{ g=x*g;
fact=fact*j;
j++;
}
r=r+g/fact;
i++;
}
gotoxy(8,7);
cout<<La suma Acumulada es
=
;cout<<(r+1)<<endl<<endl;
system(pause);}
Problema 8. Disear un programa que permita leer n nmeros enteros y para
finalizar la lectura, edite 0 (cero). Asimismo, el programa debe permitir :
a. La suma de nmeros pares positivos.
b. La suma de nmeros impares positivos.
c. Los resultados de a) y b), mostrarlos en forma concatenada.
d. Al resultado de c) y de derecha a izquierda, es decir; si el dgito es par y la
posicin que ocupa y si es impar y la posicin que ocupa, respectivamente.
e. Segn los datos ingresados, genere reportes del: total de dgitos pares e
impares positivos, dgitos negativos pares e impares, al mayor dgito par y el
mayor dgito impar negativo.
Solucin //while_if_uni.cpp
#include <iostream.h>
void main (){int i=0,n,pp=0,spp=0,mpp=0,ip=0,in=0,sin=0,sip=0;
int min=0,ud,o,num,s=0,y,x,p1=0;
gotoxy(40,2);cout<<Edite 0(cero) para finalizar:;
gotoxy(10,2);cout<<Ingrese nmero : ;cin>>num;
while(num!=0)
{ if (num!=0)
{ if(num>0)
{ if (num%2==0)
{ pp++; spp+=num;
}
if(num>mpp)
{mpp=num;
}
}
Else
{ip++; sip+=num;
35
}
}
else if (num %2!=0)
{in++;
sin+=num;
}
{ min=num;
}
if (num>>min)
}
i++;
}
gotoxy(10,4+i+1); cout<<ingrese nmero:;cin>>num;
}
cout<< \nSuma de pares positivos :<<spp<<endl;
cout<< \nSuma de impares positivos:<<sip<<endl;getche();
y=sip;
while(y>0)
{y=y/10;p1++;
}
x=(spp*pow(10,p1))+ sip; o= x;
while (o>0)
{ o=o/10; s++;
}
o=x;
cout<<\n el resultado concatenado es <<o<<endl;getche();
while (o>0) { ud= o%10;
if (ud%2==0)
{cout<<\n <<ud<< es par, su posicin es <<s<<endl;
s--;
} else
{ cout<<\n <<ud<< es impar,su posicin es <<s<<endl;
s--;
}
o=o/10;
}
getche();
gotoxy(35,18);cout<<el total de pares positivos es
:<<pp;
gotoxy(35,19);cout<<el total de impares positivos es :<<ip;
gotoxy(35,20);cout<<el total de impares negativos es :<<in;
gotoxy(35,21);cout<<el mayor de los pares positivos es :<<mpp;
gotoxy(35,22);cout<<el mayor de los impares negativos es : <<min;
getche();
}
36
37
do { suma+=pow(cont,cont);
cont++;
} while (cont<=n);
gotoxy(10,12);
cout<<La suma desde << dato
<< hasta << n<< es = <<suma;
gotoxy(14,15); cout<<Desea
continuar..?(s/n);cin>>resp;
suma=0 ; cont=1;
} while(resp==s|| resp==S);
}
getche();
}
Problema 3. Disear un programa que permita calcular la suma acumulada de
la
SERIE = 1/(1+2^2+3^2 +4^2.......+ x^n)
Para un error de e =10 exp(-2) ingresado por el usuario.
Solucin //do_whi_serie.cpp
#include <iostream.h>
# define linea ----------------------------------------------------
void main () { int n=1; float s=0.0,e;
gotoxy(10,2);cout<<Ingrese precisin(error) :;cin>>e; cout<<linea;
do
{ s=s+(1.0/(pow(n,2)));
gotoxy(10,3+n);
cout<<setw(10)<<setprecision(2)<<valor de s=<<s<<en iteracin <<n;
n++;
}while(!(1.0/(n*n)<e));
gotoxy(10,n+7);
cout<<Valor aproximado final: ;cout<<setw(6)<<setprecision(3)
<<s<< en iteracin <<n<<endl;
gotoxy(10,n+9);cout<<Sesatisface que:;cout<<setw(6)<<setprecision(3)<<p
<<<<<e<< en iteracin <<n<<endl;
getche(); }
Problema 4. Disear un programa que permita validar prcticas calificadas
definidas en el rango:0..20. El sistema solo acepta tres intentos, los cuales le van
informando y, superado este valor, finaliza el programa.
Solucin // validar.cpp
#include<iostream.h>
void main() { int i=0,pc1;
clrscr(); gotoxy(10,4); cout<< Sr. usuario, tiene Ud. solo 3 opciones;
39
do { i++;
gotoxy(10,8); cout<< Le quedan <<(4-i)<<
intentos:;clreol();cin>>pc1;
gotoxy(10,12);cout<< La prctica pc1= << pc1<< esta fuera de rango ;
if(i>=3 ) {clrscr();
gotoxy(12,8);cout<<Sr. se agotaron sus opciones, hasta luego: ;getche();
exit(1);}
}while ((pc1<0)||(pc1>20)); clrscr();
gotoxy(12,8);cout<<Sr. Bienvenidos al sistema: ; getche(); }
40
if (n>0)
{ gotoxy(42,i);cout<<nmero par positivo;
sumanpp+=n; npp++;
}
else
{ gotoxy(42,i);cout<<nmero par negativo;
sumanpn+=n;
npn++;
}
}
else
{ gotoxy(42,i);cout<<nmero impar;
if (n>0) { gotoxy(42,i);cout<<nmero impar positivo;
sumanip+=n;
nip++;
}
else
{gotoxy(42,i);cout<<nmero impar negativo;
sumanin+=n;
nin++;
}
}
} while(n!=0);
clrscr();
gotoxy(20,4);cout<< ............... RESULTADOS................. ;
gotoxy(10,9);cout<< Total de Nmeros PARES POSITIVOS =<<npp;
gotoxy(10,13);cout<<Suma de Nmeros PARES POSITIVOS =<<sumanpp;
gotoxy(10,10);cout<<Total de Nmeros PARES NEGATIVOS =<<npn-1;
gotoxy(10,14);cout<<Suma de Nmeros PARES NEGATIVOS =<<sumanpn;
gotoxy(10,11);cout<<Total de Nmeros IMPARES POSITIVOS =<<nip;
gotoxy(10,15);cout<<Suma de Nmeros IMPARES POSITIVOS =<<sumanip;
gotoxy(10,12);cout<<Total de Nmeros IMPARES NEGATIVOS =<<nin;
gotoxy(10,16);
cout<<Suma de Nmeros IMPARES NEGATIVOS =<<sumanin; getche();
}
Problema 8. En la siguiente figura, se ilustra la funcionalidad del mdulo de
validacin y nmero de intentos por parte del usuario, es decir, debe ingresar la
cantidad de dgitos que se desea procesar, que para nuestro caso el rango es como
mnimo cinco dgitos (puede ser: 6, 7 ,8, etc.). Por cada error, el sistema enva el
mensaje de error (ver figura) y, asimismo, el nmero de intentos que le quedan.
Si el nmero de intentos supera los tres, entonces el sistema finaliza.
Cuando se ingres correctamente la cantidad de dgitos en el rango establecido,
(en nuestro caso cinco) entra a funcionar el Mdulo de Validacin de Dgitos
definidos como cadenas, el cual solicita que usted ingrese dgito por dgito y
si ingresa una letra en forma automtica, elimina la letra y presenta los dgitos
anteriores para que contine ingresando ms datos hasta cumplir con la condicin
inicial (cinco dgitos). Ejemplo: edito 43 U, entonces el sistema elimina la letra
(carcter U y devuelve solo el nmero 43, donde usted contina ingresando
nuevos datos (ver figura).
42
cout<<\nHe eliminado el
carcter:<<cad[i]<<endl;
cout<<;
cout<<\nFavor continue ingresando
nuevo dato :;
for(j=0; j<i; j++)
cout<<cad[j];
cad[i]=getche();
} }
cad[i]=\0; //para que al final asigne
todo blanco
int p=atoi(cad);
cout<<\n La cadena convertida en
nmero es :<<p<<endl;
int inv=0,d,tt=p;
while(p>0)
{d=p%10; inv=inv*10+d; p=p/10;
}
cout<<\nEl nmero <<tt << invertido es : <<inv<<endl;
dosd=inv%100;
cout<<Los dos ltimos dgitos del nmero invertido <<inv<< es <<dosd<<endl;
int uld=dosd%10; cout<<\nEl ltimo dgito de :<<dosd<< es <<uld<<endl;
for(i=1;i<=uld; i++)
fact=fact*i; cout<<\nEl factorial del ltimo dgito es :<<fact<<endl;
int vi=fact;
while(fact>0) { d=fact%10;
if (d%2==0) {ndp++; }
else { ndi++; }
fact=fact/10;
}
cout<<\nEl total de dgitos pares de <<vi<< es = <<ndp;
cout<<\nEl total de dgitos impares de <<vi<< es =<<ndi; getche(); }
2.4.3 Estructura repetitiva cuando se conoce el nmero de iteraciones: for
( <instrs >)
Permite realizar instrucciones conociendo el nmero de iteraciones.
Sintaxis:
for(inicializar;<condicin>; contador)
{ <instrucciones>;
}
donde:
1. inicializar: indica valor donde inicia el bucle.
2. <condicin>: se evala antes de cada iteracin. Si es verdadera, se ejecuta el
bloque de <instrs>, en caso contrario se termina la estructura y se salta a la
instruccin siguiente.
44
do
{u=may%10;
if (u%2==0)
{ dp++;
sdp+=u;
}
else
{di++; sdi+=u;
}
inv=inv*10+u;may=may/10;
}while(may/10!=0);
inv=inv*10+may;
if (may%2==0)
{dp++; sdp+=may;
}
else { di++; sdi+=may; }
gotoxy(19,21);cout<<El inverso del mayor nmero de tres cifras es = <<inv;
gotoxy(19,22);cout<<El nmero de dgitos pares es =<<dp;
gotoxy(19,23);cout<<El nmero de dgitos impares es =: <<di;
gotoxy(19,24);cout<<La suma de los dgitos pares es = <<sdp;
gotoxy(19,25);cout<<La suma de los dgitos impares es= <<sdi; getch();}
Problema 3. Disear un programa que permita primero validar sus datos de
usuario por c_pasword = tcn100 y clave = ****. Si los datos son correctos
el sistema solicita que ingrese el nmero de trabajadores por: nombre, cdigo,
sueldo bsico, bonificacin, descuento, categora y estado civil. Para categora
47
existen tres: profesional, tcnico o auxiliar, y para estado civil: soltero, casado,
viudo o divorciado. El sueldo neto se calcula usando: s_n = (s_basico + bonif) dscto; los reportes consisten en:
a. Promedio general de sueldo de trabajadores.
b. Promedio por categoras: profesional, tcnico y auxiliar.
c. Promedio por estado civil.
d. Reporte por nombre y sueldo de cada trabajador.
Si sus datos de validacin son incorrectos, el sistema enva el mensaje:
Sr. usuario, sus Datos son incorrectos, hasta pronto;
Solucin // sue_gen.cpp
#include<iostream.h>
# define linea -----------------------------------------------------------
void main() { float
pp,i,n,s_basico,bonif,dscto,acu_pg=0,p_sn,s_neto,s_n1,a_pgp=0,a_p=0,s_n2,a_
pgt=0,a_t,pt,s_n3,a_pga=0,a_a=0,pa,
s_n4,a_pgs=0,a_s=0,ps,s_n5,a_pgc=0,a_
c=0,pc,s_n6,a_pgv=0,a_v=0,pv,s_n7,a_pgd=0,a_d=0,pd;
char nomb[30],cod[10],r,cat,est_civ, c_pasw[10],clave[10];clrscr();
gotoxy(14,4);
cout<< BIENVENIDOS AL SISTEMA DE VALIDACIN DE DATOS;
gotoxy(7,5); cout<<linea;
gotoxy(24,8);cout<<Ingrese pasword :;gets(c_pasw);
gotoxy(24,9);cout<<Ingrese clave :;gets(clave);
if (strcmp(c_pasw,tcn100)==0 && strcmp(clave,****)==0)
{clrscr();gotoxy(24,1),cout<< SISTEMA DE PLANILLAS ;
gotoxy(5,3),cout<<# de Trabajadores: ;cin>>n;
for (i=0;i<n;i++)
{gotoxy(23,4);clreol();gotoxy(5,4),cout<<Nombre Trabajador:;cin>>nomb;
gotoxy(23,5);clreol();gotoxy(5,5),cout<<Codigo Trabajador:;cin>>cod;
gotoxy(23,6);clreol();gotoxy(5,6),cout<<Sueldo Bsico :;cin>>s_basico;
gotoxy(23,7);clreol();gotoxy(5,7),cout<<Bonificacin :;cin>>bonif;
gotoxy(23,8);clreol();gotoxy(5,8),cout<<Descuento
:;cin>>dscto;
gotoxy(30,9), cout<<[P] Profesional;
gotoxy(30,10),cout<<[T] Tcnico;
gotoxy(30,11),cout<<[A] Auxiliar;
gotoxy(5,9),cout<<Categoria
:;cin>>cat;
if (cat==P)
{ s_n1=(s_basico+bonif)-dscto;
a_pgp=a_pgp+s_n1;
a_p=a_p+1;
if (a_p >0) pp=a_pgp/a_p;
else pp=0; }
if (a_p >0)
pp=a_pgp/a_p;
else pp=0; if (cat==T) { s_n2=(s_basico+bonif)-dscto;
48
a_pgt=a_pgt+s_n2;
a_t=a_t+1;
if (a_t >0)
pt=a_pgt/a_t;
else pt=0;
}
else if (a_t >0) pt=a_pgt/a_t;
else pt=0;
if (cat==A) {s_n3=(s_basico+bonif)-dscto;
a_pga=a_pga+s_n3;
a_a=a_a+1;
if (a_a >0)
pa=a_pga/a_a;
else
pa=0;
}
else
if (a_a >0)
pa=a_pga/a_a;
else pa=0;
gotoxy(30,13),cout<<[S] Soltero;
gotoxy(30,14),cout<<[C] Casado;
gotoxy(30,15),cout<<[V] Viudo;
gotoxy(30,16),cout<<[D] Divorciado;
gotoxy(5,11),cout<<Estado Civil
:;cin>>est_civ;
if (est_civ==S)
{ s_n4=(s_basico+bonif)-dscto;
a_pgs=a_pgs+s_n4;
a_s=a_s+1;
if (a_s >0)
ps=a_pgs/a_s;
else ps=0;
}
if (a_s >0) ps=a_pgs/a_s;
else ps=0;
if (est_civ==C) {s_n5=(s_basico+bonif)-dscto;
a_pgc=a_pgc+s_n5; a_c=a_c+1;
if (a_c >0) pc=a_pgc/a_c;
else pc=0;
}
if (a_c >0) pc=a_pgc/a_c;
else pc=0;
if (est_civ==V)
{s_n6=(s_basico+bonif)-dscto;
a_pgv=a_pgv+s_n6;
a_v=a_v+1;
if (a_v >0)
pv=a_pgv/a_v;
else pv=0;
}
if (a_v >0)
pv=a_pgv/a_v;
else
pv=0;
if (est_civ==D) {s_n7=(s_basico+bonif)-dscto;
49
a_pgd=a_pgd+s_n7;
a_d=a_d+1;
if (a_d >0) pd=a_pgd/a_d;
else
pd=0;
}
if (a_d >0)
pd=a_pgd/a_d;
else pd=0;
s_neto=(s_basico+bonif)-dscto;
gotoxy(44,20+i);cout<<Sueldo Neto del Trab. <<nomb<< es: <<s_neto;
acu_pg=acu_pg+s_neto; }
p_sn=acu_pg/n; gotoxy(10,17),cout<<ESTADISTICAS DE SUELDOS ;
gotoxy(,18),cout<<Promedio General
:<<p_sn;
gotoxy(3,19),cout<<Promedio Categoria Profesional:<<pp;
gotoxy(3,20),cout<<Promedio Categoria Tcnico :<<pt;
gotoxy(3,21),cout<<Promedio Categoria Auxiliar :<<pa;
gotoxy(3,22),cout<<Promedio Soltero
:<<ps;
gotoxy(3,23),cout<<Promedio Casado
:<<pc;
gotoxy(3,24),cout<<Promedio Viudo
:<<pv;
gotoxy(3,25),cout<<Promedio Divorciado
:<<pd;
}
else{clrscr(); gotoxy(20,12);cout<<Sr. sus datos son incorrectos, hasta luego;
}
getche(); }
Primero: El usuario ingresa sus datos de acceso al sistema. Si los datos son
correctos, el sistema presenta el siguiente men. Debe iniciar ingresando el
nmero de trabajadores luego sus datos solicitados por cada trabajador.
Segundo: Ingreso de datos por cada trabajador y luego genera los reportes
solicitados:
Problema 4. Disear un programa que permita leer un nmero n de alumnos por
cdigo, edad, peso, sexo (masculino: M / femenino: F) luego generar reportes
que permita conocer: promedio de alumnos por sexo y de acuerdo a: talla, edad
y peso.
50
Solucin //pro_sexo.cpp
#include<conio.h>
void main() { int a_m=0,a_f=0,n,i,edad;
float peso,talla,p_talla_m,p_edad_m,p_peso_m,p_talla_f,p_edad_f,p_peso_f,
a_talla_m=0,a_peso_m=0,a_edad_m=0,a_talla_f=0,a_peso_f=0,a_edad_f=0;
char sexo[10],codigo[10]; clrscr();
gotoxy(24,1),cout<<Clculo de Promedios;
gotoxy(23,2),cout<<=====================;
gotoxy(23,3);clreol();cout<< Ingrese nmero de Alumnos : ; cin>>n;
for (i=1;i<=n;i++)
{
gotoxy(23,4);cout<<Alumno #:<<i;
gotoxy(5,5),cout<<Cdigo del alumno:;gets(codigo);
gotoxy(5,6),cout<<Edad del alumno :;cin>>edad;
gotoxy(5,7),cout<<Peso del alumno :;cin>>peso;
gotoxy(5,8),cout<<Talla del alumno :;cin>>talla;
gotoxy(5,9),cout<<Sexo [M/F]
:;gets(sexo);
if (strcmp(sexo,M)==0 ||strcmp(sexo,m)==0)
{a_m = a_m+1;
a_edad_m =a_edad_m+edad;
a_talla_m =a_talla_m+talla;
a_peso_m =a_peso_m+peso;
}
else
{a_f=a_f+1;
a_edad_f=a_edad_f+edad;
a_talla_f=a_talla_f+talla;
a_peso_f=a_peso_f+peso;
}
clrscr();
}
51
//Calculando promedio de alumnos de sexo masculino
p_edad_m=a_edad_m/a_m; p_talla_m=a_talla_m/a_m;
p_peso_m=a_peso_m/a_m; p_edad_f=a_edad_f/a_f;
p_talla_f=a_talla_f/a_f;
p_peso_f=a_peso_f/a_f;
clrscr();
gotoxy(14,2);cout<<REPORTES ESTADSTICOS;
for(i=1;i<=n;i++)
{gotoxy(12,3);cout<<Total de alumnos <<n;
gotoxy(15,5);cout<<Promedio de Talla [M]: <<p_talla_m;
gotoxy(15,6);cout<<Promedio de Talla [F]: <<p_talla_f;
gotoxy(15,7);cout<<Promedio de Edad [M]: <<p_edad_m;
gotoxy(15,8);cout<<Promedio de Edad [F]: <<p_edad_f;
gotoxy(15,9);cout<<Promedio de Peso [M]: <<p_peso_m;
gotoxy(15,10);cout<<Promedio de Peso [F]: <<p_peso_f;
} getche();
}
Problema 5. Disear un programa que permita encontrar todas las soluciones de
la siguiente expresin, donde cada carcter represente dgito (s)
SEND + MORE = MONEY
Solucin //for_send_more.cpp
#include<iostream.h>
#include<conio.h>
void main()
{ int d,e,y,n,r,o,s,a=0;
clrscr();
cout<<\tPrograma que busca todas las soluciones de:SEND+MORE=MONEY:
\n;
s=9;
for(d=1;d<=9;d++){
for(e=1;e<=9;e++){
52
for(y=1;y<=9;y++){
for(n=1;n<=9;n++){
for(r=1;r<=9;r++){
for(o=0;o<=1;o++){
if(d+e==y){
if(n+r==e){
if(e+o==n){
if(s+1==10+o){
cout<<SEND = <<9<<e<<n<<d<< ;
cout<<MORE = <<1<<o<<r<<e<<\n;
a=a+1;
}break;
}
else{
if(e+o==10+n){
if(s+1+1==10+o){
cout<<SEND = <<9<<e<<n<<d<< ;
cout<<MORE = <<1<<o<<r<<e<<\n;
a=a+1;
}break;
}
}
}
else{
if(n+r==10+e){
if(e+o+1==n){
if(s+1==10+o){
cout<<SEND = <<9<<e<<n<<d<< ;
cout<<MORE = <<1<<o<<r<<e<<\n;
a=a+1;
}break;
}
else{
if(e+o+1==10+n){
if(s+1+1==10+o){
cout<<SEND = <<9<<e<<n<<d<< ;
cout<<MORE = <<1<<o<<r<<e<<\n;
a=a+1;
}break;
}
} }
}
}
else{ if(d+e==10+y){
if(n+r+1==e){
if(e+o==n){
if(s+1==10+o){
cout<<SEND = <<9<<e<<n<<d<< ;
53
cout<<MORE = <<1<<o<<r<<e<<\n;
a=a+1;
}break;
}
else{
if(e+o==10+n){
if(s+1+1==10+o){
cout<<SEND = <<9<<e<<n<<d<< ;
cout<<MORE = <<1<<o<<r<<e<<\n;
a=a+1;
} break;
} } }
else{
if(n+r+1==10+e){
if(e+o+1==n){
if(s+1==10+o){
cout<<SEND = <<9<<e<<n<<d<< ;
cout<<MORE = <<1<<o<<r<<e<<\n;
a=a+1;
}break;
}
else{
if(e+o+1==10+n){
if(s+1+1==10+o){
cout<<SEND = <<9<<e<<n<<d<< ;
cout<<MORE = <<1<<o<<r<<e<<\n;
a=a+1;
}break;
}
}
} } } } } } } } } }
cout<<----------------------------------;
cout<<\nTodas las soluciones son : <<a;
getch();}
Problema 6. Disear un programa que permita leer un nmero n positivo
comprendido dentro del intervalo del 10 al 999 y luego mostrar su factorial.
Solucin // factoria.cpp
#include<iostream.h>
void main()
{ long int n, factorial=1,i;
clrscr();
gotoxy(10,4);cout<< CALCULANDO FACTORIAL;
do{gotoxy(12,6);clreol(); cout<< Ingrese un nmero : ;cin>>n;
54
55
Usar a = p*( 1 + r ) ^ n
Donde
p: cantidad invertida inicialmente
r : tasa de inters
n: cantidad de aos
a: cantidad en depsito al final de cada
ao
Solucin // for_banco.cpp
#include<iostream.h>
# define linea -------------------------------------------
main() {float principal=1000.0,interes
=0.1,cantdep;
gotoxy(20,3);cout<<
CUENTA
BANCARIA;
gotoxy(15,5);cout<< ANNOS
CANTIDAD;
gotoxy(10,6);cout<<linea;
for(int anno=1;anno<=10;anno++)
{ cantdep=principal*pow(1.0+interes,anno);
gotoxy(17,6+anno);cout<<anno;
gotoxy(30,6+anno); cout<<S/. <<cantdep;
} getche();}
Problema 9. Disear un programa que permita leer un nmero entero (nmero
de filas) y luego mostrar la formacin de una pirmide tal como se ilustra en la
figura adjunta.
Solucin //for_piramide.cpp
#include <iostream.h>
void main() { int nl,lt,i; clrscr();
gotoxy(3,2);cout<<Ingrese nmero
de lineas:; cin>>nl;
for (lt=1;lt<=nl;lt++)
{for (i=1;i<=(nl-lt);i++) cout<< ;
for (i=lt;i<=2*lt-1;i++) cout<<i%10;
for (i=i-2;i>lt-1;i--) cout<<i%10;
cout<<\n;
}
cout<<endl;system(pause); }
Sentencia continue
Se utiliza con las instrucciones for, while y dowhile para avanzar a la siguiente
iteracin del bucle, abandonando la actual.
56
Por ejemplo, el segmento de cdigo siguiente imprimir solo los valores enteros
mltiplos de 5 en el intervalo 1100:
For (int i=1;i<=100;i++) {
if (i%5) continue;
cout<<i<< es mltiplo de 5<<endl;
57
Compendio de problemas
Problema 1. Escribir un programa que lea cinco nmeros enteros, dos de ellos
por lo menos negativos. Luego, el programa deber ordenar en forma ascendente
los nmeros positivos, siempre y cuando existan por lo menos dos.
Solucin: posneg.cpp
#include <iostream.h>
void main() {
int num,pos,neg,max,min,med; clrscr();
do {pos=0, neg=0;
cout<<Ingrese 5 nmeros enteros no nulos<<endl;
for (int i=1;i<=5;i++) {
do {cout<<i<< nmero: ; cin>>num;
if (!num) cout<<\aError. ;
} while (!num);
if (num>0) {
pos++;
if (pos==1) max=min=med=num;
elseif (num>max) max=num;
elseif (num<min) min=num;
else med=num; }
else neg++;
} //for i=1
if (neg<2)
cout<<\nError, debe haber por lo menos 2 nmeros negativos<<endl;
} while (neg<2);
if (pos>1) {cout<<Los nmeros positivos ordenados son: <<endl;
cout<<setw(8)<<min;
if (pos==3) cout<<setw(8)<<med; cout<<setw(8)<<max;
}getch(); }
58
Problema 2. Se tienen dos relojes defectuosos, cada uno de los cuales sufre un
cierto adelanto u atraso por hora (en minutos). Si en un determinado momento
sus agujas marcan la misma hora (la correcta), determinar el da y la hora
correctos en que los dos relojes volvern a marcar esa misma hora. Considerar
que el programa lee el adelanto o atraso de cada reloj y la fecha, hora y minutos
en los cuales los tres relojes estn sincronizados.
Solucin: relojes.cpp
#include <iostream.h>
main() {int aa,mm,dd, h,m, a1,a2, correcto;
clrscr();
cout<<Hora y Fecha de sincronizacin;
do {correcto=1; cout<<endl<<Fecha (dd mm aa) ;
cin>>dd>>mm>>aa;
if (mm>12||mm<1) correcto=0;
else {
switch (mm) {
case 4:case 6:case 9:case 11:
if (dd>30) {correcto=0;}
break;
case 2:
if (aa%4==0 && aa%100!=0 || aa%400!=0){
if (dd>29) correcto=0;
}
elseif (dd>28) correcto=0;
break; default:
if (dd>31) correcto=0;
break;
} }
if (!correcto) cout<<\aFecha incorrecta\n;
} while (!correcto);
do {
correcto=1; cout<<Hora exacta (hh min) ;
cin>>h>>m;
if (h<0||h>23||m<0||m>59) {
correcto=0;
cout<<\aHora incorrecta\n;
}
} while (!correcto);
cout<<Adelantos/atrasos de los relojes en minutos por hora;
do {
correcto=1;
cout<<endl<<\tReloj 1: ; cin>>a1;
cout<<\tReloj 2: ; cin>>a2;
if (abs(a1)>59||abs(a2)>59||a1*a1==0) {
correcto=0;
cout<<\aUno de los adelantos es incorrecto\n;
}
} while (!correcto);
59
exacta:
Solucin //Prg_1.cpp.
#include<iostream.h>
void main() {int num,k,num1,r,valor,num2,num3,num4,num5,num6,num7,num
8,num9,num10;
char op;
gotoxy(12,2),cout<< CONVERSIN DE NMEROS A LETRAS<<endl;
do{ do{ cout<< \nIngrese un nmero entre -999..999 : ;cin>>num;
}while(num<-999999 || num>999999);
k=0;
num1=num; num3=num; num4=num;
num5=num; num6=num; num7=num;
do{
num=num/10 ;
k++ ;
} while(num!=0);
valor=0;
if(num1<0){ cout<<Menos ; num1=num1*-1 ;
}
do {
r=num1/pow10(k-1);
if (valor==1) { r=r%10;
}
switch(r){
case 9:
switch(k){
case 6: cout<<Novecientos ;break;
case 5:num9=num9%10000;
if(num9==0)
cout<<Noventa ;
else cout<<Noventay ;
break;
case 4: num5=num5/10000;
num5=num5%10;
num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Nueve Mil ;}break;
case 3: cout<<Novecientos ;break;
case 2: num8=num8%10;
if(num8==0)
cout<<Noventa ;
else
cout<<Noventay ; break;
case 1:num1=num1%100;
num1=num1/10;
num3=num3/10;
if(num1!=1 && num1!=0||num3==0)
{ cout<<Nueve ;} break;
}
break;
61
case 8:
switch(k) {
case 6: cout<<Ochocientos ;break;
case 5:num9=num9%10000;
if(num9==0)
cout<<Ochenta ;
else
cout<<Ochentay ;
break;
case 4: num5=num5/10000;
num5=num5%10;
num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Ocho Mil ; } break;
case 3: cout<<Ochocientos ;break;
case 2: num8=num8%10;
if(num8==0)
cout<<Ochenta ;
else
cout<<Ochentay ;
break;
case 1: num1=num1%100;
num1=num1/10;
num3=num3/10;
if(num1!=1 && num1!=0||num3==0){
cout<<Ocho ;} break;
}
break;
case 7:
switch(k){
case 6: cout<<Setecientos ;break;
case 5:num9=num9%10000;
if(num9==0)
cout<<Setenta ;
else
cout<<Setentay ;
break;
case 4: num5=num5/10000;
num5=num5%10; num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Siete Mil ;}break;
case 3: cout<<Setecientos ;break;
case 2: num8=num8%10;
if(num8==0)
cout<<Setenta ;
else
cout<<Setentay ;
break;
case 1: num1=num1%100;
num1=num1/10;
num3=num3/10;
if(num1!=1 && num1!=0||num3==0){
62
cout<<Siete ;} break;
} break;
case 6:
switch(k){
case 6: cout<<Seiscientos ;break;
case 5:num9=num9%10000;
if(num9==0)
cout<<Sesenta ;
else
cout<<Sesentay ;
break;
case 4: num5=num5/10000;
num5=num5%10; num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Seis Mil ;}break;
case 3: cout<<Seiscientos ;break;
case 2: num8=num8%10;
if(num8==0)
cout<<Sesenta ;
else
cout<<Sesentay ;
break;
case 1:num1=num1%100;
num1=num1/10;
num3=num3/10;
if(num1!=1 && num1!=0||num3==0){
cout<<Seis ;} break;
}
break;
case 5:
switch(k) {
case 6: cout<<Quinientos ;break;
case 5:num9=num9%10000;
if(num9==0) cout<<Cincuenta ;
else
cout<<Cincuentay ;
break;
case 4: num5=num5/10000;
num5=num5%10; num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Cinco Mil ;}break;
case 3: cout<<Quinientos ;break;
case 2: num8=num8%10;
if (num8==0)
cout<<Cincuenta ;
else
cout<<Cincuentay ; break;
case 1: num1=num1%100;
63
num1=num1/10;
num3=num3/10;
if (num1!=1 && num1!=0||num3==0){
cout<<Cinco ;} break;
}
break;
case 4:
switch(k) {
case 6: cout<<Cuatrocientos ;break;
case 5:num9=num9%10000;
if(num9==0) cout<<Cuarenta ;
else
cout<<cuarentay ; break;
case 4: num5=num5/10000;
num5=num5%10;
num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Cuatro Mil ;}break;
case 3: cout<<Cuatrocientos ;break;
case 2: num8=num8%10;
if(num8==0) cout<<Cuarenta ;
else cout<<cuarentay ;
break;
case 1:num1=num1%100;
num1=num1/10;
num3=num3/10;
if(num1!=1 || num1!=0||num3==0){
cout<<Cuatro ;} break;
}
break;
case 3: switch(k) { case 6: cout<<Trecientos ;break;
case 5:num9=num9%10000;
if(num9==0)cout<<Treinta ;
else cout<<Treintay ;
break;
case 4: num5=num5/10000;
num5=num5%10; num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Tres Mil ;}break;
case 3: cout<<Trecientos ;break;
case 2: num8=num8%10;
if(num8==0)cout<<Treinta ;
else cout<<Treintay ;
break;
case 1:num1=num1%100;
num1=num1/10;
num3=num3/10;
if(num1!=1 && num1!=0||num3==0){
cout<<Tres ;} break;
}
break;
64
case 2:
switch(k) { case 6: cout<<Doscientos ;break;
case 5:num9=num9%10000;
if (num9==0) cout<<Veinte ;
else cout<<Veinty ;
break;
case 4: num5=num5/10000;
num5=num5%10;
num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Dos Mil ;}break;
case 3: cout<<Doscientos ;break;
case 2: num8=num8%10;
if(num8==0)
cout<<Veinte ;
else cout<<Veinty ; break;
case 1: num1=num1%100;
num1=num1/10; num3=num3/10;
if(num1!=1 && num1!=0||num3==0){
cout<<Dos;} break;
}
break;
case 1:
switch(k) {
case 6: num10=num10%100000;
if(num10==0)cout<<Cien ;
else cout<<Ciento ;break;
case 5: num4=num4/1000;
num4=num4%10;
switch(num4){
case 9:cout<<Diecinueve Mil ; break;
case 8:cout<<Dieciocho Mil ; break;
case 7:cout<<Diecisiete Mil ;break;
case 6:cout<<Dieciseis Mil ; break;
case 5:cout<<Quince Mil ; break;
case 4:cout<<Catorce Mil ;break;
case 3:cout<<Trece Mil ; break;
case 2:cout<<Doce Mil ; break;
case 1:cout<<Once Mil ; break;
case 0:cout<<Diez Mil ; break;
}break;
case 4: num5=num5/10000;
num5=num5%10;
num6=num6/10000;
if (num5==0 || num5!=1||num6==0){
cout<<Un Mil ;}break;
case 3: num7=num7%100;
65
if(num7==0)cout<<Cien ;
else
cout<<Ciento ; break;
case 2: num2=num1%10;
switch(num2){
case 9:cout<<Diecinueve ; break;
case 8:cout<<Dieciocho ; break;
case 7:cout<<Diecisiete ;break;
case 6:cout<<Dieciseis ; break;
case 5:cout<<Quince ; break;
case 4:cout<<Catorce ;break;
case 3:cout<<Trece ; break;
case 2:cout<<Doce ; break;
case 1:cout<<Once ; break;
case 0:cout<<Diez ; break;
} break;
case 1:num1=num1%100;
num1=num1/10;
num3=num3/10;
if(num1!=1 && num1!=0||num3==0){ cout<<Uno ;} break; }
break;
case 0: switch(k) { case 6: break; case 5:break; case 4: break;
case 3: break;
case 2: num2=num1%10;
switch(num2){
case 9 : cout<<Nueve ;break;
case 8 : cout<<Ocho ;break;
case 7 : cout<<Siete ;break;
case 6 : cout<<Seis ;break;
case 5 : cout<<Cinco ;break;
case 4 : cout<<Cuatro ;break;
case 3 : cout<<Tres ;break;
case 2 : cout<<Dos ;break;
case 1 : cout<<Uno ;break;
case 0 : break;
}
case 1:
num3=num3*num3;
if(num3==0){ cout<<Cero ;} break;
} break;
}
k--;
valor=1 ;
}while(k>0);
gotoxy(20,8);cout<<\nQuiere seguir en el programa(s/n): ; cin>>op;clrscr();
} while(op==s); getche();}
66
67
cada nueva pareja se hace frtil a la edad de un mes. Si se dispone de una pareja
frtil y ninguno de los conejos muertos. Cuntas parejas habr despus de un
ao?
Mejorar el problema calculando el nmero de meses necesarios para producir un
nmero dado de parejas de conejos.
Solucin // while_conejos.cpp
Void main()
{int mes1,mes2,mes_tot,meses;
int numero_parejas;
mes1=1;
mes2=2;
mes_tot=2; meses=1;
while (meses<12)
{mes_tot=mes1+mes2;
mes1=mes2;
mes2=mes_tot;
meses=meses+1;
}
gotoxy(5,1);cout<<CRIA DE
CONEJOS;
gotoxy(5,2);cout<<Total de perejas despues de un ao :<<mes_tot;
gotoxy(5,4);cout<<ingrese nmero de parejas=;cin>>numero_parejas;
mes1=1; mes2=2;
mes_tot=2; meses=1;
while (mes_tot<numero_parejas)
{mes_tot=mes1+mes2;
mes1=mes2;
mes2=mes_tot;
meses+=1;
}
gotoxy(5,6);cout<<el nmero de meses necesarios es=<<meses; getche();}
Problema 6. Disear un programa que permita calcular e imprimir la suma de
los siete primeros trminos de la serie de fibonaci: 1,1,2,3,5,8,13. Asimismo, el
programa debe ir mostrando las sumas parciales.
Solucin. //while_fibo.cpp
#include<iostream.h>
void main() { int anterior=1,nuevonum,actual=1,i=3,total=2;
gotoxy(6,i+1);cout<<anterior<<+<<actual<<endl;
while(i<8) { nuevonum=anterior+actual;
total=total+nuevonum;
i++;
anterior=actual;
actual=nuevonum;
gotoxy(6,i+1); cout<<anterior<<+<<actual<<endl;
}
gotoxy(6,i+4);cout<<El total es: <<total; getche(); }
68
1
1
1
1
1
+ 2 + 2 + 4 + ........ + 2
2
1
2
3
4
n
para un error (precisin) de 10-2. (seor lector, puede generalizar para lectura
de cualquier grado de error).
Solucin //do_whi_serie.cpp
#include <iostream.h>
# define linea ----------------------------------------------------
void main () { int n=1; float s=0.0,e;
gotoxy(10,2);cout<<Ingrese precisin(error) :;cin>>e;
cout<<linea;
do {
s=s+(1.0/(pow(n,2)));
gotoxy(10,3+n);cout<<setw(10)<<setprecision(2)<<valor de s = <<s<< en
iteracin <<n<<endl;
n++;
} while(!(1.0/(n*n)<e)) ;
double p=1.0/(n*n);
gotoxy(10,n+7);
cout<<Valor aproximado final : ;
cout<<setw(6)<<setprecision(3)<<s<< en iteracin <<n<<endl;
gotoxy(10,n+9);
cout<<Se satisface que:;
cout<<setw(6)<<setprecision(3)<<p<<<<<e<< en iteracin <<n<<endl; getche();
}
69
70
r++; a--; }
while(a!=0);
r++;
xxx=xxx+r;
xxx++;
if( ( (g%4==0) && (g%100!=0) ) || (g%400==0) )
if(m<=2) xxx--; clrscr(); cout<<Corresponde al da: ; xxx=(xxx%7);
switch(xxx){ case 1:{cout<<Martes;break;}
case 2:{cout<<Miercoles;break;} case 3:{cout<<Jueves;break;}
case 4:{cout<<Viernes;break;}
case 5:{cout<<Sbado;break;}
case 6:{cout<<Domingo;break;} case 7:{cout<<Lunes;break;}
case 0:{cout<<Lunes;break;} } getch();}
Problema 9.- Un virus desconocido aumenta su poblacin de acuerdo a la
siguiente ley:
n = ni*t/(ni+t*exp(t))
en donde ni es el nmero inicial de unidades virales, t es el tiempo en minutos.
Escribir un programa que lea la cantidad inicial del virus y determine cuntos
minutos sern necesarios para que ste alcance su poblacin mxima. Indicar
dicha cantidad.
Solucin //while_virus.cpp
#include<iostream.h>
void main(){ int t,tt,ni,i;
float n,max; char h[100];
textcolor(11) ;
gotoxy(10,20) ;cout<<;
gotoxy(10,4) ;cout<<;
for (i=11 ;i <=69 ; i++)
{ gotoxy(i,4) ;cout<<; gotoxy(i,20) ;cout<<;
}
gotoxy(70,4) ;cout<< gotoxy(70,20) ;cout<<;
for(i=5;i<=19;i++)
{ gotoxy(10,i) ;cout<<; gotoxy(70,i );cout<<; }
71
U
V
W
Pc1
12
10
05
Pc2
10
8
18
Pc3
14
12
12
Pc4
14
12
18
Pc5
08
05
13
1.- Diseo del bucle repetitivo para ingreso de nota y seccin.- Usted ingresa
notas hasta que edite -10 mientras, tal como se ilustra en la siguiente grfica. Las
notas deben estar validadas en el rango de 0. . 20, as como las secciones solo u,
U, v, V, w, W.
//Preg_01_algo_SOLUCION.cpp
#include <iostream.h>
void main(){ char secc;
int nota,notamax=-1,nmax=-1,nu=0,nw=0,nv=0;
int sumav=0,sumaw=0,nau=0,nav=0,naw=0,sumau=0;
72
{
pw=float(naw*100)/nw;
}
gotoxy(5,14);cout<< Promedio de la seccin W = <<promw;
gotoxy(5,15);cout<< Porcentaje de aprobados = <<pw<< % ;
//clculo delpromedio general
pg=float(promu+promv+promw)/3;
gotoxy(5,17); cout<< Promedio de las 3 Secciones = <<pg;
//mostrar la nota mxima y cuantos la poseen
gotoxy(5,19);
cout<<la nota mxima es=<<notamax<< y la poseen <<nmax<<Alumnos;
getche();
}
Problema 11. Disear un algoritmo que realice las siguientes tareas: remita al
usuario validar sus datos de ingreso (cdigo y clave). Si el cdigo es 221 y la clave
es 999, el usuario puede ingresar al sistema, caso contrario se vuelve a pedir los
datos hasta un mximo de 3 intentos (si supera los 3 intentos el sistema enva el
mensaje No puede usar el sistema y termina el proceso). Si el usuario ingresa
al sistema, le debe solicitar un nmero entero positivo n para luego calcular la
siguiente suma de n trminos:
S = 15 + 35 + 55 + 75 + 115+ .
Luego debe mostrar el dgito mayor del nmero S y el nmero SI (SI es el nmero
invertido de S).
Ejemplo:
Para n = 2 S = 244 y SI = 442
Solucin
Mdulo I. Verificacin de usuario
autorizado a ingresar al sistema
a realizar operaciones. Aqu se
aplica la estructura de control
Repetir (do..), validando el Cdigo
= 221 de usuario (CLAVE = 999, ES
ANLOGO) y por cada error se
incrementa el contador de errores y
mediante la estructura condicional
Si se verifica que no se supere los
tres errores.
Mdulo II. Verificacin del nmero de consultas (interactivo),
el usuario puede continuar
realizando consultas (este es el
74
{ int m,ner=0,ncons=0,n,sum=0,menor=999,mayor=-1,d,inv=0;
char nombre[10],apell[10],resp=s; clrscr();
while(resp==s) // para bucle si resp=s
{ ncons++; //maximo 3
if(ncons<=3)
{ ///***************************************************
do //para validar mximo 3 errores, no dependen de consultas
{ ner++; clrscr() ;
if(ner<=3)
{ clrscr(); gotoxy(10,1);cout<< Validacin de Datos de Usuario;
gotoxy(10,3);cout<<Ingrese Cdigo = ;gets(nombre);
if(strcmp(strupr(nombre),221)!=0)
{ gotoxy(7,5);cout<<linea;
gotoxy(10,6);
cout<< Codigo < << nombre << > No esta registrado ;
gotoxy(10,7);cout<< Le quedan [ <<(3-ner)<< ] oportunidades;
gotoxy(7,8);cout<<linea;
getche();
}
else
{ clrscr();
gotoxy(7,1);cout<<linea;
gotoxy(10,2); cout<< Sr. < << nombre << > Bienvenido...;
}
} //fin del del if ner<=3
else
{ gotoxy(10,2);
cout<<Sr.<<nombre << Fin de sesin, debido a [ << ner << ] Errores ;
getche();exit(0);
}
} while(strcmp(strupr(nombre),221)!=0);
gotoxy(10,4); cout<< Ud. cometio [ <<(ner-1)<< ] Errore(s) ;
gotoxy(7,5);cout<<linea; getche(); ner=0;// para cada nueva consulta
gotoxy(10,8); cout<< Serie = 1^5 + 3^5 + 5^5 + 7^5 + ... + ;
gotoxy(10,10); cout<< Ingrese nmero de trminos a sumar ;cin>>n;
for(int i=1;i<=n;i++) sum=sum+pow(2*i-1,5);
gotoxy(10,12); cout<< La suma hasta el trmino <<n<< es = <<sum; getche();
m= sum;
while(m!=0)
{ d=m%10;
if(menor>d)
{ menor=d; }
if (mayor<d) {mayor=d;
}
inv=inv*10+d;
m=m/10;
} //fin del while
} clrscr();
76
gotoxy(10,3);cout<< RESULTADOS ;
gotoxy(7,4);cout<<linea;
gotoxy(10,6); cout<< Serie = 1^5 + 3^5 + 5^5 + 7^5 + ... + ;
gotoxy(10,8); cout<< La suma hasta el trmino <<n<< es = <<sum;
gotoxy(10,10);cout<< * El dgito menor es = <<menor;
gotoxy(10,11);cout<< * El dgito mayor es = <<mayor;
gotoxy(10,12);cout<< * El Nmero Invertido es = <<inv;
gotoxy(7,13);cout<<linea;
gotoxy(10,15); cout<< Gracias por su consulta Nmero : <<ncons;
gotoxy(10,18); cout<<Sr.desea hacer nueva consulta..? (S/N);cin>>resp;
if (resp==n) //depende de resp=n
{ clrscr();gotoxy(6,5);cout<<linea; gotoxy(7,6);
cout<<Sr.<<<nombre <<>gracias por hacer <<ncons<<consulta(s) ;
gotoxy(7,7);cout<<linea; getche();exit(0);
} ///****** fin del if de nmero de consultas... mximo ncons <= 3
else
{ gotoxy(10,2);
cout<<No esta autorizado para hacer ms de<<(ncons-1)<<
consultas,adios...;
getche();exit(0);
} clrscr();//para borra ltimo reporte de consultas
//fin del while resp=s
} }
Problema 12. El siguiente programa tiene como objetivo mezclar las estructuras
de control: Repetir (do..), mientras (while ) y desde (for..) con la estructura
condicional si (if). Asimismo solicita que ingrese un nmero y calcule el
factorial respectivo.
Anlisis
- Se disear los siguientes dos mdulos principales:
Mdulo I. Verificacin de usuario autorizado a ingresar al sistema a realizar
operaciones. Aqu se aplica la estructura de control Repetir (do.. ), validando
el nombre del usuario y, por cada error, incrementa el contador de errores y
mediante la estructura condicional Si se verifica que no se supere los tres errores.
Mdulo II. Verificacin del nmero de consultas (interactivo), el usuario puede
continuar realizando consultas (este es el modo interactivo de usuario con el
sistema) cuando se aplica la estructura de control mientras (while..). Para lo cual,
se ha diseado la pregunta Sr. desea continuar..? (S/N) y por cada respuesta de
si (S),el sistema usa un contador (n_cons) denominado nmero de consultas. Si
supera tres consultas el sistema finaliza.
Procedimientos
1. Verificar que el usuario (Nombre = LUIS) solo tiene tres alternativas para
77
realizar sus consultas. Por cada error que comete, el sistema le enva mensajes
de usuario no registrado en el sistema, as como el nmero de oportunidades
que le quedan (en este caso usuario PEDRO, no est registrado en el sistema).
Tal como se ilustra en las figuras adjuntas
2. Si el nmero de errores es igual a 4, entonces el sistema enva el siguiente mensaje,
78
6.
Si en el paso 6, el usuario
responde
a
la
pregunta
con n, el sistema envia la
siguiente interfase, indicando
los agradecimientos por las
diferentes consultas, as como el
total de consultas realizadas.
Solucin
//while_do_if_valida_2006_Set.
cpp
# define linea ________________
____________________________
_
void main()
{ int ner=0,ncons=0,n;
char
nombre[10],resp=s;clrscr();
while(resp==s) // para bucle si
resp=s
{ ncons++; //mximo 3
if(ncons<=3){// do para validar
mximo 3 errores, no dependen
de consultas
do { ner++; clrscr() ;
if(ner<=3)
{ clrscr(); gotoxy(10,1);cout<< Validacin de Datos de Usuario;
gotoxy(10,3);cout<<Ingrese
Nombre = ;gets(nombre);
if(strcmp(strupr(nombre),LUIS)!=0)
{ gotoxy(7,5);cout<<linea;
gotoxy(10,6);
cout<< Nombre < << nombre << > No esta registrado ;
gotoxy(10,7);cout<< Le quedan [ <<(3-ner)<< ] oportunidades;
gotoxy(7,8);cout<<linea;
getche();
}
else { clrscr();
gotoxy(7,1);cout<<linea;
gotoxy(10,2); cout<< Sr. < << nombre << > Bienvenido...; }
} //fin del del if ner<=3
else { gotoxy(10,2);
cout<<Sr.<<nombre << Fin de sesin, debido a [ << ner << ] Errores ;
getche();exit(0); }
} while(strcmp(strupr(nombre),LUIS)!=0);
gotoxy(10,4); cout<< Ud. cometio [ <<(ner-1)<< ] Errore(s) ;
gotoxy(7,5);cout<<linea; getche(); ner=0;// para cada nueva consulta
do { gotoxy(10,6); clreol();cout<<Ingrese nmero = ;cin>>n;
}while(n<0 || n>50 );
79
80
maysculas, razn por la cual la instruccin debe ser capaz de convertir letras
minsculas a maysculas (ver figura 1). Para la comparacin y conversin use
las funciones: strcmp() y strupr(). Para simular este proceso, ver figura 1).
Interface de validacin
(Fig. 1)
Error que permite salir del modo compilacin al programa fuente. Entonces
debe reiniciar la compilacin del programa y despus de usar paso 1), se
ingresa las notas y se calcula el promedio de prcticas eliminando la menor
nota (ver figura 5).
4. Si el promedio de prcticas fuera mayor a 6.5 (es nuestro caso), el alumno
puede rendir examen parcial y final (valores solo en el rango 0 al 20). En otro
caso debe volver al paso 1 y 3.
Usando estos datos, ms el promedio de prcticas, se calcula el promedio
final, (ver figura 6). Para obtener el mensaje de Alumno APROBADO ,
se debe cumplir que el promedio final sea mayor a 10.0, con lo cual finaliza
81
83
}
else
{ clrscr();
gotoxy(20,12); cout<<Sr. sus datos tienen error !!! ;
gotoxy(12,13); cout<<linea;
}
getche();
switch(opcp)
{ case o:case O:clrscr();
gotoxy(10,2);cout<< OPERACIONES ARITMTICAS;
gotoxy(5,3);cout<<linea;
gotoxy(10,5); cout<<Ingrese primer nmero = ;cin>>a;
gotoxy(10,6); cout<<ingrese segundo nmero= ;cin>>b;
gotoxy(5,7);cout<<linea;// primero dibujo el cuadro
gotoxy(5,9);cout<<linea;
gotoxy(5,8);cout<< Elija Operacin [+][-][*][/] = ;cin>>opera;
switch(opera)
{ case +:{resul=a+b;} break;
case -:{resul=a-b;}
break;
case *:{resul=a*b;}
break;
case /: { if(b!=0) resul=a/b;
else
{gotoxy(8,11);cout<< Con dato < <<b<< > no existe divisin ;
getche();
exit(0);
}
}
break;//fin fel if
default:
{ gotoxy(3,11);
cout<<Operador<<<opera <<>no
esta disponible, hasta luego..;
getche();exit(0);
}
}//fin del case opera
gotoxy(10,12); cout<< Resultado
de <<a<<opera<<b<< = <<resul;
gotoxy(8,14); system(pause);
case f: case F: clrscr();
gotoxy(10,2);cout<< Fecha Y Hora ;
gotoxy(7,3);cout<<linea;
gotoxy(10,5); cout<<Ao = <<d.da_year<<endl;
gotoxy(10,6);printf(dia = %d\n, d.da_day);
gotoxy(10,7);printf(mes = %d\n, d.da_mon);
gotoxy(10,9); printf(Hora= %2d:%02d:%02d.%02d\n,
t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);
getche(); break;
case c:case C:clrscr();
char usu[10],pasw[10];
int depos,saldoinic=0,opcion,tpcuenta,ret;
gotoxy(10,2); cout<< ==> MI CUENTA EN BCP <== ;
gotoxy(7,3);cout<<linea; //primero creo marco
gotoxy(7,6);cout<<linea;
86
case 4: gotoxy(8,11);
Nmero de alumnos: 4
1
2
3
4
cout<<Gracias
por
cdigos
100
200
300
400
sus Transacciones... ;
Notas
16
10
16
16
getche();
break;
default : gotoxy(8,11);
cout<< Sr. el dato [<<opcion<<] No esta disponible, hasta luego.. ;
getche();exit(0);
} //fin del switch()
} // fin de if 1 o 2
else { gotoxy(20,20); cout<<Gracias por su visista...; getche();exit(0);
}
}// fin de validar datos del usuario else
{ gotoxy(6,8);cout<<Sr. hasta luego por error en datos !!! ; getche();exit(0); }
}//fin de switch O ,B F} //fine del main()
obs. Sr. usuario, validar opciones del men principal
Problema 15. Usando estructuras de control, disear un programa que permita
leer alumnos (n>0 y n<=100) por cdigo y nota respectivamente, los cdigo estn
formados solo por 3 dgitos y las notas solo son validas de 0..20 inclusive. Luego
genere reportes para conocer:
a. Mayor nota
b. Cdigo, posicin y nmero de
veces que se repite la mayor nota.
c. Secuencia de cdigos y secuencia
de notas respectivas (de la mayor).
Anlogamente
identificar
la
menor nota y realice los procesos
anteriormente solicitados para la
menor nota.
Ejemplo. Considere los datos de la siguiente tabla:
Solucin:
Interface de entrada de datos.- Se ilustra cmo se debe ingresar el cdigo y
la nota de cada alumno. El ingreso se realiza en forma interactiva al usar la
confirmacin de (S/N).
Resultados. En las siguientes interfaces, se ilustra los resultados respecto a mayor
nota, cdigo y posicin, anlogo a la menor nota y el consolidado de alumnos
aprobados y desaprobados.
Interface. Con datos respecto a la mayor nota, mostrando la secuencia de formacin
de esta, la secuencia de formacin de las notas, la secuencia de formacin de los
cdigos y la secuancia de formacin de las posiciones respectivas.
Observacin. Seor usuario describa el mdulo para la menor nota y hacer que
el programa tenga alcance general, (verificar con las notas 12, 16 12 y 16).
88
//while_prg_03.cpp
#include<iostream.h>
#define linea________________________________________
void main(){intcod,nota,codigos,aprob=0,desap=0,i,spos,pos,codi,mayor=-1;
int nrep=0,notas=0;
char resp=s;
gotoxy(12,1);cout<< Bienvenidos...; gotoxy(8,2);cout<<linea;
while(resp==s) { nrep++;
do{gotoxy(10,4);clreol();cout<< Ingrese cdigo <<nrep<< = ;cin>>cod;
}while(cod<1||cod>999);
do {gotoxy(10,5);clreol();cout<< Ingrese nota = ;cin>>nota;
}while (nota<0 || nota>20);
clrscr();
if (mayor<nota) {mayor=nota;
codi=cod; pos=nrep; codigos = codi; spos=pos; notas=notas*100+mayor;
}
else { if(mayor==nota)
{ notas=notas*100+mayor; codigos = codigos*1000 + cod;
spos=spos*10+nrep; }
}
if(nota>=10) {aprob++; }
else { desap++;
}
gotoxy(10,7);cout<<Desea ingresar nuevo dato..? (s/n);cin>>resp;
}
clrscr(); gotoxy(10,3);cout<< Mayor nota
= <<mayor;
gotoxy(10,4);cout<< Notas formadas
= <<notas;
gotoxy(10,5);cout<< Secuencia de Cdigos = <<codigos;
gotoxy(10,6);cout<< Secuencia de Posiciones = <<spos;
getch(); clrscr(); gotoxy(12,8);cout<<linea;
gotoxy(8,9);cout<<\t\t
mayor nota:<<mayor;
gotoxy(12,10);cout<<linea;
gotoxy(14,12);cout<<\tcodigo\t\tposicion;
gotoxy(12,13);cout<<linea; getche(),
i=0; int nt;
while(codigos>0)
{nt=notas%100; cod=codigos%1000;codigos=codigos/1000;
notas=notas/100;pos=spos%10;spos=spos/10;gotoxy(18,15+i);cout<<cod;
gotoxy(36,15+i);cout<<pos;
89
i++;
gotoxy(12,16+i);cout<<linea;
gotoxy(12,17+i);cout<<La
cantidad
desaprobados son :<<desap;
gotoxy(12,18+i);cout<<La cantidad de aprobados son :<<aprob;
gotoxy(12,19+i);cout<<linea; getche();}
de
Problema 16. Segn las siguientes interfaces, plantear el enunciado del problema
respectivo. Los datos correctos del usuario son:
Cdigo = tcn y clave = 123
1.
Validar datos del usuario.
Como observar la entrada de
datos son incorrectos y se repite
ms de tres veces, el sistema
envia mensaje de finalizacin.
2.
Si los datos de entrada son
correctos, entonces se dispone
las siguientes alterrnativas para
el usuario, usted puede usar
cualquiera de las alternativas,
considerando que cada alternativa se puede procesar en forma interactiva.
Vemos con alternativa P:
Primero ingresa cuatro prcticas y luego calcula el promedio eliminando la
menor nota. A contiuacin debe ingresar notas del examen parcial y final,
mostrando resultado final y se inicia la interactividad con el usuario.
for(i=6;i<=50;i++)
{gotoxy(5+i,4);cout<<=;gotoxy(5+i,15);cout<<=;}
for(i=1;i<=10;i++)
{gotoxy(10,4+i);cout<<||;gotoxy(55,4+i);cout<<||; }
gotoxy(15,6);cout<< < P > Promedios del curso;
gotoxy(15,7);cout<< < B > Buscar dgito;
gotoxy(15,8);cout<< < I > Invertir nmero;
gotoxy(15,9);cout<< < S > Salir del sistema;
gotoxy(18,12);cout<<< Edite opcin >;cin>>opc;
switch(opc)
{case p:case P:
do {na++; clrscr();
gotoxy(5,2);cout<< Procesando promedios de Alumno #:< << na<< >
do{gotoxy(3,4);cout<<Ingrese p1 = ;clreol();cin>>p1;
}while((p1<0)||(p1>20));
do{gotoxy(3,5);cout<<Ingrese p2 = ;clreol();cin>>p2;
}while((p2<0)||(p2>20));
do{gotoxy(3,6);cout<<Ingrese p3 = ;clreol();cin>>p3;
}while((p3<0)||(p3>20));
do{gotoxy(3,7);cout<<Ingrese p4 = ;clreol();cin>>p4;
}while((p4<0)||(p4>20));
nmin=p1;
if(nmin>p2){nmin=p2;}
if(nmin>p3){nmin=p3;}
if(nmin>p4){nmin=p4;}
pp=float(p1+p2+p3+p4-nmin)/3;
gotoxy(12,10);cout<< Sr. su prctica con menor nota = <<nmin;
gotoxy(12,12);cout<< Promedio eliminando la menor nota = <<pp;
getche();clrscr();
if(pp>7) {
do { gotoxy(3,4);cout<<Ingrese examen parcial:;clreol();cin>>exp;
}while((exp<0)||(exp>20));
do{gotoxy(3,5);cout<<Ingrese examen final :;clreol();cin>>exf;
}while((exf<0)||(exf>20));
pf=(pp+exp+exf)/3;
gotoxy(12,8);cout<< Promedio Final del alumno # <<na<< es =<<pf;
if(pf>10){gotoxy(12,10);cout<< Estado del # <<na << ==> Aprobado;
gotoxy(12,12);cout<< Desea Ud. continuar...?(S/N)==> ;cin>>op; }
else {gotoxy(12,10);cout<< Estado del # <<na << ==> Desaprobado ;
gotoxy(12,12);cout<< Desea Ud. continuar...?(S/N)==>;cin>>op;}
}
else {gotoxy(12,10);cout<< Desaprobado,no puede rendir examenes;
gotoxy(12,12);cout<< Desea Ud. continuar...?(S/N)==>;cin>>op;
}
}while((op==s)||(op==S));
92
break;
caseb:caseB:do{clrscr();
gotoxy(5,2);cout<< Formando secuencia de dgitos;
gotoxy(3,4);cout<< Ingrese nmero
:;cin>>n;
gotoxy(5,7);cout<<Ingrese dgito a buscar : ;cin>>dig_busc;
while(n>0) {dig=n%10;
if(dig==dig_busc)
{tol_sec_dig_rep=tol_sec_dig_rep+dig_busc*pow(10,no_vec_sec_rep);
no_vec_sec_rep++;
}
else
{tol_sec_no_rep=tol_sec_no_rep+dig*pow(10,no_vec_no_rep);
no_vec_no_rep++;
} n=n/10;}
gotoxy(5,9);cout<< TOTAL DE DGITOS REPETIDOS = <<no_vec_sec_rep;
gotoxy(5,10);cout<< SECUENCIA DE DGITOS
= <<tol_sec_dig_rep;
gotoxy(5,11);cout<< SECUENCIA NO REPETITIVA
= <<tol_sec_no_rep;
gotoxy(5,12);
cout<< TOTAL DE DGITOS NO REPETIDOS = <<no_vec_no_rep;
no_vec_sec_rep=0;
tol_sec_no_rep=0;no_vec_no_rep=0;
no_vec_no_rep=0;
tol_sec_dig_rep=0;
gotoxy(8,14);cout<< Desea ud. continuar...?(S/N)==>;cin>>op;
}while((op==s)||(op==S)); break;
casei:caseI:do{clrscr();gotoxy(5,2);cout<<Invertir nmero;
gotoxy(3,4);cout<<Ingrese nmero:;cin>>n;
if((n>999)&&(n<9999))
{while(n>0) {d=n%10;
inv=inv*10+d;
n=n/10;
}
gotoxy(12,10);cout<< Nmero invertido = <<inv;
gotoxy(12,12);cout<< Desea ud. continuar...?(S/N)==>;cin>>op;
}
else {clrscr(); gotoxy(12,10);cout<< Nmero fuera de rango... ;
gotoxy(12,12);cout<< Desea ingresar otro nmero..?(S/N)==>;cin>>op;
}}while((op==s)||(op==S));
break;
cases:caseS: clrscr();
gotoxy(12,10);cout<< Gracias por sus consultas ; getche(); exit(0); break;
default: clrscr(); gotoxy(12,10);cout<< Opcin incorrecta;
gotoxy(20,12);system(pause);op=n;break;
} //FIN DEL SWITCH
}while((op==n)||(op==N));
}//FIN DEL VOID MAIN
Problema 17. En el centro metereolgico de Argentina, se llevan los promedios
mensuales de lluvias caidas en las principales regiones productoras del pas.
93
97
99
Solucin / / do_valida_cod_Fact.cpp
# include<iostream.h>
// defina otras libreras
# define linea ------------------------------------------
# define lineam =======================================
void main()
{long int si,dp,re,opc,dt,nrovec=0,sa=0,nc=0;
char cod[10],resp=s;
while (resp==s)
{clrscr(); time_t t; time(&t);
nc++;
gotoxy(3,1);cout<< Sr. Ud dispone de 3 oportunidades ;
gotoxy(15,3);cout<< Realiza la consulta # <<nc;
gotoxy(39,3);printf( en fecha %s, ctime(&t)); ;
do //bucle infinito mientras no edite tcn
{ nrovec++; gotoxy(1,3); cout<<VALIDACIN :;
gotoxy(1,4); cout<<lineam;
if (nrovec<=3) //para salir del del bucle cuando sea mayor a 3
{ gotoxy(6,5);cout<<Ingrese codigo : ;clreol(); gets(cod);
100
if (strcmp(strupr(cod),TCN)!=0)
{gotoxy(6,7);
cout<<Sr. el cdigo ==> <<cod<< <== no esta registrado ;
gotoxy(6,9);cout<< Le quedan <<(3-nrovec)<< oportunidades :;
gotoxy(3,10); cout<<linea; getche();
clrscr();
}
else {gotoxy(6,10);
cout<<Cdigo ==> <<cod << <== registrado en el sistema, bienvenido ;
}
}
else {gotoxy(10,12);
cout<< FIN DE SESIN, PUES SUPERO MS DE<<(nrovec-1)<< INTENTOS
;
getche(); exit (0);
}
} while(strcmp(strupr(cod),TCN)!=0); //while(!(cod==100));
gotoxy(10,12);cout<<Total de errores cometidos <<(nrovec-1);
getche(); clrscr();gotoxy(10,3);cout<< BIENVENIDOS ;gotoxy(5,4);cout<<linea;
int n;long int fact=1;
do {gotoxy(10,6);cout<<Ingrese nmero : ;clreol();cin>>n;
} while((n<0)||(n>99));
gotoxy(10,8);cout<< Nmero correcto en el rango 1..99 ;
for(int i=1;i<=n;i++) {fact=fact*i; }
gotoxy(10,10);cout<<El factorial de <<n<< es = <<fact;
long int m,d,nd=0,ndnocero=0,ndnulos=0,menor=999,mayor=-1;
m= fact; while(m !=0)
{ d=m%10; nd++;
if(d==0) {ndnulos++; }
else { ndnocero++;
if(menor>d) {menor=d; }
if (mayor<d) {mayor=d; } }
m=m/10;
}//fin del while
gotoxy(5,12);cout<<linea;
gotoxy(10,15);cout<< OTROS RESULTADOS ;
gotoxy(10,17);cout<<El
factorial <<fact<< tiene <<nd<<
digito(s);
gotoxy(10,19);cout<< * Dgito(s)
nulo(s) = <<ndnulos ;
gotoxy(10,20);cout<< * Dgito(s) no nulo(s) = <<ndnocero;
gotoxy(10,21);cout<< * El dgito menor es = <<menor; gotoxy(10,22);cout<<
* El dgito mayor es = <<mayor;
gotoxy(10,24);cout<< Sr. desea continuar...? (S/N) ==> ;cin>>resp;
101
nrovec=0;//actualizar
}
if(resp==n) { clrscr(); time_t t; time(&t);
gotoxy(4,10);cout<< Sr. Ud. realiz <<nc << consultas ;
gotoxy(35,10);printf( en fecha %s, ctime(&t));
gotoxy(10,12);cout<<Gracias por todo, hasta luego;
gotoxy(10,16); system(pause);
}}
Problema 20. En el siguiente problema, se ha diseado un programa con ciertos
atributos, tales como: generacin de un marco, mensajes con diferentes colores,
dentro del marco se presenta los mensajes para validar dato de un usuario por
Nombre = LUIS, quien solo dispone de tres opciones, cuando comete errores
el sistema le envia el mensaje de advertencia que no est registrado, asimismo, el
nmero de oportunidades que le quedan, vea la figura adjunta.
Si el usuario ingresa correctamente su nombre, el sistema envia el mensaje de
bienvenida, as como el acumulado de los errores:
A continuacion solicita que ingrese cuatro prcticas para buscar la prctica con
menor nota.
Como se conoce la menor nota, se puede continuar con la siguiente consulta y
as puede hacer las consultas que crea conveniente, el contador de consultas nos
indica la cantidad respectiva.
Solucin //if_valida_color_utp_2007.cpp
#include <iostream.h>
// defina otras librerias
# define linea -------------------------------------------
void marco(int x,int y,int ancho, int alto,int color)
{int i,j;
textcolor(color);
for(i=0;i<=ancho;i++)
{gotoxy(x+i,y);cprintf(); gotoxy(x+i,y+alto);cprintf();
}
for(j=0;j<=alto;j++)
{gotoxy(x,y+j);cprintf(); gotoxy(x+ancho,y+j);cprintf(); }
textcolor(color);
}
void main()
{ int nproces=0,nrovec=0,pc1,pc2,pc3,pc4,min;
// char nombre[10],clave[10],
char nombre[10],resp; marco(6,2,60,20,10);
gotoxy(14,4);cout<< Sr. Ud solo dispone de 3 oportunidades ;
do //bucle infinito mientras no edite tcn
{clrscr(); nrovec++; marco(6,2,60,20,10);
102
104
// Solucion while_if_do_pos_nega.cpp
#include <iostream.h>
void main() { int num,pos,neg,max,min,med,n;
clrscr();
do { pos=0, neg=0;
gotoxy(9,1); cout<<Ingrese 5 nmeros enteros no nulos ;
for (int i=1;i<=5;i++)
{ do { cout<< \n\tnumero <<i<<= ; cin>>num;
if (!num) cout<<\t\t\tError, debe ser diferente de 0\n ;
} while (!num);
if (num>0)
{pos++;
if (pos==1) max=min=med=num;
else
if (num>max)
max=num;
else
if (num<min)
min=num;
else med=num;
}
else neg++;
} //for i=1
if (neg<2)
{ cout<<\nError, debe haber por lo menos 2 nmeros Negativos<<endl;
clrscr();}
}while (neg<2);
if (pos>1) {cout<<\n\t Los nmeros positivos ordenados son: <<endl<<endl;
cout<<setw(7)<<min;
if (pos==3) cout<<setw(8)<<med; cout<<setw(8)<<max;
}
getche();
}
105
106
107
PROCEDIMIENTOS
4.1. Primera ejecucin del programa: en esta interfase, el Sistema le advierte al
usuario que SOLO dispone de 3 Alternativas para ingresar al sistema a
calcular el factorial de un nmero, para lo cual debe validando su cdigo
TCN (observe que el valor esta en letras maysculas) Asimismo le indica
el Nmero de consulta y la fecha correspondiente.
En esta interface, el usuario ingresa su cdigo=tc, cdigo que es
incorrecto. Ante este error el sistema enva el mensaje de error y el nmero
de oportunidades que quedan, tal como se ilustra en la figura.
109
111
114
Ana
Lus
Pedro
Edades
30
15
28
Posicin
10. Disear un programa interactivo que permita a un usuario Validar sus datos
de ingreso al sistema. Los datos pueden ser: una letra o un dgito. Si el usuario
ingresa un dgito, el sistema confirma que dato es un dgito y luego solicita
que ingrese un nmero entero mayor o igual a 10 y menor que 10000. Luego
puede ocurrir que:
I. Si el nmero es par, entonces
el programa debe realizar las
siguientes tareas:
a) Mostrar el nmero en forma invertida
b) Conocer el nmero total de dgitos.
c) Conocer el nmero total de dgitos pares.(ver figura.)
d) Conocer el nmero total de dgitos impares(ver figura.)
II. Si el nmero es impar, entonces el
sistema confirma que el dato es un
115
17. Puntos dentro de un tringulo: Considera un tringulo T dado por sus tres
vrtices (a, b), (c, d) y (e, f) con coordenadas enteras. Algunos puntos de
coordenadas enteras estn sobre los lados de T y otros puntos de coordenadas
enteras estn dentro de T. Escribe un programa que encuentre las cantidades s
y t de puntos sobre los lados y dentro de T, respectivamente.
Por ejemplo, si los vrtices de T tienen las coordenadas (0, 1), (4, 3) y (2, 5)
entonces s = 6 y t = 4 ya que los 6 puntos (0, 1), (2, 2), (4, 3), (3, 4), (2, 5) y (1, 3)
estn sobre los lados de T mientras que los 4 puntos (1, 2), (2, 3), (2, 4) y (3, 3)
estn dentro de T.
Entrada: Seis nmeros enteros a, b, c, d, e, f separados por espacios y todos
ellos en el intervalo de -1000 a 1000 (incluyndolos). Puedes suponer que los
tres vrtices de T no estn alineados y por lo tanto forman un tringulo.
Salida: Dos nmeros enteros s y t separados por un espacio.
18. Boletos por besos: Para ir hacia su escuela, Juan aborda un camin. Cuando
Juan sube al camin y deposita las monedas en la alcanca, el conductor le da
un boleto con un nmero de serie consecutivo, el cual generalmente llega a
la basura. Sin embargo, un da el se entera de algo interesante. Si la suma de
los dgitos de dicho boleto es 21, el lo puede cambiar con quien quiera por un
119
beso. Juan quiere conseguir muchos besos de la persona que esta enamorado
y ella ha aceptado drselos a cambio de dichos boletos, pero no es tan fcil
conseguirlos. Juan ha decidido que si el boleto que le da el conductor no suma
21 esperara hasta que el de una persona que suba despus de el sume 21, y
le pedir a esta su boleto, para lo cual debe ir realizando las cuentas a mano,
cosa que es muy tediosa. Ayuda a Juan escribiendo un programa que dado
un nmero n de 7 dgitos, le proporcione el nmero p de personas que deben
abordar despus de el para que obtenga el boleto deseado y m, donde m
representa los 7 dgitos de dicho boleto. Cuando un tiraje de boletos termina,
es decir llega a 9999999, el conductor toma otro tiraje comenzando nuevamente
en el nmero 0000000.
Entrada: Un nmero entero n de 7 dgitos (que posiblemente comienza con
ceros).
Salida: Un nmero entero p y un nmero m de 7 dgitos.
19. No te salgas: Una pulga muy especial se encuentra en la esquina de una mesa
y quieres que brinque hasta la esquina contraria de la misma mesa. Lo especial
de la pulga es que se ha aprendido una sucesin numrica y la usara para
determinar como brinca. Cada vez que aplaudas, la pulga decidir si se queda
donde esta o si da un brinco cuya longitud esta determinada por el termino
correspondiente de la sucesin. Los brincos siempre sern paralelos a los lados
de la mesa y siempre debern alejar a la pulga de su posicin inicial. Lo ideal
es que la pulga logre llegar a la esquina contraria de la mesa. Sin embargo,
basta con que llegue a una posicin tan cercana como sea posible. Lo que no
esta permitido es que la pulga salte hacia afuera de la mesa (le ha costado
mucho subir a la mesa como para que ahora la dejes caer).
Ejemplo, si la sucesin de n = 7 saltos de la pulga fuera s = (3, 1, 4, 1, 5, 9, 2) y
la mesa midiera a = 5 por b = 6 entonces la pulga podra lograr su objetivo si su
sucesin de brincos fuera arriba, arriba, derecha, arriba, nada, nada y derecha.
Por otro lado, si su sucesin fuera arriba, arriba, derecha, nada, nada, nada,
nada entonces no llegara a la esquina contraria pero tampoco se saldra de la
mesa.
Entrada: El archivo de texto nts.ent contendr un rengln con tres enteros n,
a y b separados por espacios seguido de un rengln con n enteros positivos
s1, s2, ..., sn y separados por espacios. Puedes suponer que todos estos enteros
estn en el rango de 1 a 1000, incluyndolos.
120
Salida: El archivo de texto nts.sal deber contener un rengln con tres enteros
n, c y d separados por espacios seguido de un rengln con n enteros positivos
t1, t2, ..., tn y separados por espacios. Los valores de c y d representan la
coordenada a la que llega la pulga y para 1 i n, el valor de ti es 0 si la
pulga no dio el salto de longitud si, 1 si lo dio hacia arriba y 2 si lo dio hacia la
derecha.
Evaluacin: 1 punto si los n saltos indicados dejan a la pulga en la coordenada
( c, d) de la mesa. En ese caso, 9(c2 + d2)/(a2 + b2) puntos adicionales. El primer
ejemplo de salida mostrado abajo obtendra 1 + 9(52+62)/(52+62) = 10 puntos,
el segundo ejemplo 1 + 9(42+42)/(52+62) = 4 puntos y el tercer ejemplo 0 puntos
porque la pulga se sali de la mesa.
20. Disear un programa que permita jugar al Master Mind. Para ello se escribir
el Programa de la siguiente forma:
Generar cuatro valores enteros aleatorios entre 0 y 9 distintos entre si.
Preguntar al usuario por cuatro valores enteros.
Considerando ambas combinaciones, indicar cuntos nmeros comunes
estn en la misma posicin y cuntos valores comunes estn en distinta
posicin.
Ejemplo: 3786 y 8760 uno colocado (el 7) y dos descolocados (8 y 6)
Se terminar el programa cuando el jugador acierte la combinacin o haya
agotado sus intentos (constante MAXINTENTOS con valor 10)
121
122
CAPTULO III
123
3.1 Introduccin
Los tipos de datos escalar (enteros, reales, booleanos, carcter, subrango y
definidos por el usuario) se denominan tipos simples, su justificacin se debe
a que las variables son limitadas a un solo valor cada vez que se procesan y no
existe alternativa de relaciones de alto nivel con otras variables del mismo tipo.
Esta tcnica permite clasificar y almacenar los datos del mundo real en grupos
o conjuntos de datos, pero todos del mismo tipo, es decir; puede almacenar y
procesar solo datos enteros, tales como: notas, pesos, cadenas, etc.
Se confirma que si maneja grandes volmenes de datos con arreglos y despus
de sus procesos (consultas, bsquedas, ordenamientos, etc.) estos se perdern. La
justificacin radica que los arreglos solo se realizan en memoria RAM (memoria
de acceso aleatorio).
La declaracin siguiente:
int a,b;
Se est estableciendo simplemente que a,b son dos variables no relacionadas que
tomarn valores de tipo enteros.
En segundo lugar, los tipos de datos estructurados, son tipos de datos de alto nivel
que se construyen a partir de conjuntos o colecciones de datos de tipo escalar simples
y que contienen algunas relaciones adicionales entre sus diversos elementos.
[0] [1]
12
11
[2] [3]
09
15
[ 18 ] [ 19 ] ndice
........
11
08
02
12
Inicializacin de un arreglo
1. Se puede inicializar un array con la declaracin:
int a[3] = {2,1,7}
int b[5] = {1,3,6} /*inicializa los tres primeros elementos a 1, 2 y 3, y
los restantes a cero*/
2. Se puede omitir el tamao del array:
float lista[ ] = { 1.0,5.1.10.4} //Declara un array de tres elementos
Funcin de acceso
Permite acceder a un elemento especfico (ndice)
Ejemplo: Notas[2]: indica que estamos apuntando al elemento en el ndice 2.
As, notas[2] = 09
El array nos permite manipular sus elementos individuales como si fueran
cualquier tipo de variable, veamos. Se puede tratar como operandos, asignarles
valores, compararlas con otro valor, etc:
Notas_p[ I ] + notas_e[ j ];
Notas [3] = 15compara[5]<=6.Resto_d[3]%2==0Dato[i]!=.
125
Restriccin:
1. No se puede operar con todo el array directamente. La sentencias:
int valor[200] = { 0 }, int datos[200]; valor = datos;
Esto nos generan un error de sintaxis.
2. En C++ no realiza verificacin de lmites de un array,es decir; no se genera un
error de compilacin cuando se referencia aun elemento inexistente en ste.
APLICACIONES
Problema 1. Disear un programa que permita leer nota y sexo de n alumnos
(n definido por el usuario) y luego generar un reporte que permita conocer la
cantidad de alumnos aprobados de sexo masculino.
Solucin // vector_sexo.cpp
#define max_el 100
# define linea -----------------------------------------------
void main(){ int nota[max_el],n,i;
char sexo[max_el], nap=0;
char op=s;clrscr();
gotoxy(10,2);cout<<Sistema de notas vs Sexo ;gotoxy(2,3);cout<<linea;
while (op==s)
{ gotoxy(2,5);cout<<Ingrese numero de alumnos: ;cin>>n;
for(i=0;i<n;i++)
{gotoxy(2,7+i*2);cout<<Alumno[<<(i+1)<<];
gotoxy(2,8+i*2); cout<<Ingrese nota [<<(i+1)<< ]= ; cin>>nota[i];
gotoxy(30,8+i*2);cout<<Ingrese sexo (M/F) = ; cin>>sexo[i];
}
for(i=0;i<n;i++)
126
if((sexo[i]==M)||(sexo[i]==m))
{ if(nota[i]>10) { gotoxy(2,15+i);
cout<<N[<<(i+1)<<]= <<nota[i]<< sexo[<<(i+1)<< ]= <<sexo[i];
}
Nap++ ;
}
gotoxy(2,19); cout<<Total alumnos aprobados de sexo Masculino :<<nap;
gotoxy(14,21); cout<<Desea continuar..(S/N);cin>>op;
getche();
}
}
127
Solucin //vectores_max_min.cpp
#include<iostream.h> //defina otras loibrerias
#define max_elem 100
void main()
{ int A[max_elem],k,i,n,j,aux,maxb,minc,B[max_elem],C[max_elem],d=0;
clrscr();
gotoxy(3,3);cout<<Ingrese numero de elementos del vector A: ;cin>>n;
gotoxy(4,5);cout<<Ingrese elementos;
for(i=1;i<=n;i++)
{ gotoxy(5,6+i);cout<<A[<<i<<]= ; cin>>A[i];}
for (i=1;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;}
gotoxy(30,7);cout<<El vector ordenado es ;
for (i=1;i<=n;i++)
{gotoxy(35,8+i);cout<<A[<<i<<]=;gotoxy(40,8+i);cout<<A[i]<<endl;}
gotoxy(20,25);cout<<Presione cualquier tecla para continuar...;
getche();clrscr();
for(i=1;i<=n;i++) {if((A[i]%2)==0) {d=d+1; B[d]=A[i]; }
k=d;}
gotoxy(5,4);cout<< Vector B con elementos pares y su maximo :;
for(d=1;d<=k;d++)
{gotoxy(5,5+d);cout<<B[<<d<<]= ,cout<<B[d]<<endl;maxb=B[d];}
for(i=1;i<=n;i++)
{if(((A[i]%2)<0)||((A[i]%2)>0)) /* puede usar !=0*/
{d=d+1; C[d]=A[i];} k=d; }
for(d=1;d<2;d++){minc=C[d];}
gotoxy(40,4);cout<<Vector C con elementos impares:;
for(d=1;d<=k;d++)
{gotoxy(40,5+d);cout<<C[<<d<<]= ,cout<<C[d]<<endl;}
gotoxy(20,25);cout<<Presione cualquier tecla para continuar...;
gotoxy(5,15);cout<<Max de B= <<maxb;
gotoxy(5,16);cout<<Min de C= <<minc;getche();clrscr();
int q,r,r2,q2,M[max_elem],l,x,N[max_elem];gotoxy(3,3);
cout<<Ingrese cantidad de elementos para el vector MaxMin: ;cin>>q;
gotoxy(4,5);cout<<Ingrese elementos:;
for(r=1;r<=q;r++)
{gotoxy(5,6+r);cout<<M[<<r<<]= ;cin>>M[r];}
r=q;M[r+1]=maxb;M[r+2]=minc;q2=r+2;
for(r=1;r<=q2;r++)
for(r2=r+1;r2<=q2;r2++) if(M[r]>M[r2]) {l=M[r];
M[r]=M[r2];
M[r2]=l;}
for(r=1;r<=q2;r++){gotoxy(40,6+r);cout<<M[<<r<<]=;cout<<M[r]<<endl;}
getche();clrscr();x=0;
for(r=1;r<=q2;r++)
if( ((M[r]%2)>0)||((M[r]%2)<0) ){x=x+1; N[x]=M[r];}
for(r=1;r<=q2;r++) if((M[r]%2)==0){x=x+1; N[x]=M[r];}
129
130
131
p=0;
for (i=0;i<cantL;i++)
{ if (let[i]!=let[i+1])
{ vlsrep[p]=let[i];
p++;
} }
gotoxy(2,12); cout << La letra < a > se repite = << contA << veces << endl;
gotoxy(2,13);cout << La palabra uni se repite = << menor << veces << endl;
gotoxy(2,14);cout << El vector sin letras repetidas es = << endl;
for (i=0;i<p;i++)
{ gotoxy(2,15+i);cout << vlsrep[<<i<< ]= <<vlsrep[i];
}
getche();
}
Problema 8. Disear un programa que permita ingresar nmeros enteros y
almacenarlo en un vector de longitud n (n definido por el usuario), luego mostrar:
Reporte de elementos ingresados.
Opciones en un men para :
a. Insertar elementos al inicio del vector
b. Insertar segn posicin espefificada por usuario
c. Insertar al final, cuando los datos estn ordenados
Solucin //vect_inse.cpp
#define linea -------------------------------
#define max_el 50
void main()
{ int a[max_el], n, i, dato; char opc,resp=S;
while(resp==S || resp==s)
{clrscr();
133
} //Fin de switch
} //Fin de else
gotoxy(25,21);cout<<Desea continuar..? ==>(S/N);cin>>resp;clrscr();
}
if((resp==n) || (resp==N))
{clrscr();gotoxy(30,12); cout<<Gracias por sus consultas ;getche(); exit(0);
}
}
Problema 9. Disear un programa que permita leer n alumnos (n ingresado por
usuario ) y por cada alumno ingrese su prctica, luego generar un reporte que
permita mostrar el promedio de prcticas de los n alumnos.
Solucin //vector_prom.cpp
#include <iostream.h> //defina otras librerias
#define max_n 10
#define linea ----------------------------------------------
void main()
{ int notas[max_n], i, n, suma=0;
float promedio;
gotoxy(10,2);
cout<<Sistema de Promedio de
practicas ;
gotoxy(2,3);cout<<linea;
do { gotoxy(2,5);
cout<< Ingrese cantidad de
alumnos :; cin>>n;
} while (!((n>=1) && (n<=max_n)));
fo r (i=0; i<n; i++)
{ gotoxy(2,7+i*2);cout<<Alumno[
<<(i+1)<<];
gotoxy(2,8+i*2); cout<<Ingrese nota [<<(i+1)<< ]= ; cin>>notas[i];
}
for(i=0; i<n; i++)
{suma=suma+notas[i];
}
promedio=(float)suma/n;
gotoxy(2,15);
cout<< El promedio de practicas es = <<promedio; getch();
}
Problema 10. Disear un programa que permita leer datos de tipo entero y
almacenarlo en un vector, luego generar un reporte sin elementos repetidos.
Solucin //vect_sin_el_rep.cpp
void main ( )
135
136
{gotoxy(9*i,9); cout<<B[<<i<<]=<<b[i]<<,;
}
gotoxy(2,10); cout<<linea<<endl;
x=0;
gotoxy(2,12);
cout<<Vector que contine numeros negativos pares e impares <<endl;
gotoxy(2,13);cout<<linea<<endl;
for(i=1; i<=n; i++)
//(almacenando numeros negativos)/
{ if(a[i]<0)
{ x=x+1;
c[x]=a[i];
} }
for(i=1; i<=x; i++)
{ gotoxy(9*i,14);cout<<C[<<i<<]=<<c[i]<<, ; }
gotoxy(2,15); cout<<linea<<endl;
for(i=1; i<=p; i++)
//numero maximo positivo max)
{ max=b[1];
suma=0;prom=0;cont=0;
for(i=1;i<=n;i++){ if (a[i]%5==0)
if(a[i]%2!=0)
{ r++;
m[r]=a[i];
suma=suma+a[i];cont=cont+1;
}
}
if(cont<=0)
{gotoxy(2,6);cout<<NO existe elemento que cumpla la condicion;
}
else
{prom=suma/cont; gotoxy(3,9);
cout<< Los elementos Multiplo de 5 y no de 2 son:;
for(i=1;i<=r;i++)
{ gotoxy(10*i,11);cout<<m[<<i<<]=<<m[i]<<,;
}
gotoxy(3,13);cout<<Suma = <<suma;
gotoxy(3,14);cout<<Promedio = <<prom;
}
getche();
}
Problema 15. Disear un programa que permita leer n alumnos, definido por
usuario, luego genere reportes para conocer:
a. Promedio general
b. Promedio de desaprobados
c. Promedio de aprobados
d. Total alumnos con nota 20
Solucin //vect_not_20.cpp
#include<iostream.h> //defina otras librerias
#define max 16
void main(){int i,j=0,k=0,v=0,n;
float nota[max],suma,promg,sumaa,sumad,promd,proma;
gotoxy(2,2);
cout<<Ingrese numero de alumnos; cin>>n;
for(i=1;i<=n;i++)
{cout<<\tNota [<<i<<]=;cin>>nota[i];
}
suma=0;
for(i=1;i<=4;i++){suma=nota[i]+suma;
}
sumad=0; sumaa=0;
for(i=1;i<=4;i++)
140
{if((nota[i]>=0)&&(nota[i]<=10))
{sumad=nota[i]+sumad;
j++;
}
if ((nota[i]>=11)&&(nota[i]<=20))
{sumaa=nota[i]+sumaa;
k++;
}
if(nota[i]==20)
{v++;
}
}
promg=suma/n; promd=sumad/j;
proma=sumaa/k;
gotoxy(4,n*2+2) ; cout<<REPORTES: ;
gotoxy(4,n*2+4); cout<<Promedio general
= <<promg;
gotoxy(4,n*2+5); cout<<Promedio de Desaprobados = <<promd;
gotoxy(4,n*2+6); cout<<Promedio de Aprobados = <<proma;
gotoxy(4,n*2+7); cout<<Total alumnos con nota 20 = <<v;
getche();
}
Problema 16. Disear un programa que permita leer el grado de un polinomio
Pn(x) y luego calcular para un valor x0 en x, el valor de P(x0), en la primera derivada: P(x0) y en la segunda derivada: P(x0).
El polinomio es de la forma : Pn (x) = P0 + P1x + P2x2 + P2x3 +....+ Pnxn
Solucin //vect_Polinomio.cpp
#include<conio.h>
# define max_coef 50
void main( )
{int i,n;float poli[max_coef]={0},x,px=0,dx=0,d2x=0;;
clrscr();
gotoxy(2,2);cout<<Ingrese el grado n del polinomio
gotoxy(2,3);cout<<Ingrese el Valor de la
variable x0 : ; cin>>x;
gotoxy(2,4);cout<<Ingrese el valor de
los coeficientes :<<endl<<endl;;
for(i=0; i<=n; i++)
{cout<<\tP[<<i<<]=;cin>>poli[i];
}
if (x==0) px=poli[0];
else {for(i=0; i<=n; i++)
{px += poli[i]*pow(x,i);
if (n>0) dx += poli[i]*i*pow(x,i-1);
if (n>1) d2x += poli[i]*i*(i-1)*pow(x,i-2);
: ; cin>>n;
141
}
}
cout<<\nRESULTADOS <<endl;
cout<<\n\tEl Valor de P(x<<=<<x<<)= <<px;
cout<<\tEl Valor de P(x<<=<<x<<)= <<dx;
cout<<\tEl Valorde P(x<<=<<x<<)= <<d2x;
getch();
}
Problema 17. Disear un programa que permita leer un nmero entero positivo
y luego retornar su equivalente en letras.
Solucin //vect_palab.cpp
#include <iostream.h>
char *Unidad[10]={ cero, uno, dos,tres,cuatro,cinco, seis,
siete, ocho, nueve};
char *Diez[10]={ diez, once, doce, trece, catorce, quince,
dieciseis, diecisiete, dieciocho, diecinueve};
char *Decena[10]={cero,diez,veinte,treinta,cuarenta, cincuenta,
sesenta,setenta,ochenta,noventa};
char *Centena[10]={ cien, ciento, doscientos, trescientos,
cuatrocientos,quinientos, seiscientos, setecientos,
ochocientos, novecientos };
char Millar[] = mil;
void main() { long Num,Aux;
char resp=s;
while (resp==s)
{ clrscr();gotoxy(4,2);cout<<CONVERTIR NUMEROS A PALABRAS;
gotoxy(4,4);cout<<Ingrese un nmero menor que 100000: ;cin>>Num;
if (Num<100000){
cout<<El nmero en letras es: ;
if (Num==0) cout<<Unidad[0];
while (Num>0){
Aux=Num;
if (Num>=1000) Num/=1000;
if (Num>0) {
int a,b,c;
c=Num%10;b=(Num%100c)/10;a=(Num-10*b-c)/100;
if (a>0) if (b==0 && c==0)
cout<<Centena[0]<< ;
else cout<<Centena[a]<< ; //si
100<Num<200
if (b>0)
if (b==1) cout<<Diez[c]<< ; //si 10<Num<20
else cout<<Decena[b]<< ; //si 1<b<10
142
143
Resultados
Solucin. En la siguiente figura se ilustra la entrada de datos de cuatro alumnos
por cdigo y nota respectivamente. Se valida para que los cdigos deben ser slo
de tres dgitos y las notas comprendidas en el rango 0 al 20
REPORTES DE LA MAYOR y MENOR NOTA. Se observa que la nota mayor
es 16 y esta se repite DOS veces, asignado a los alumnos de cdigos 400 y 200,
ocupando las posiciones 4 y 2, respectivamente; asimismo, se forma la secuencia
de cdigos: 400200 y la secuencia de repeticin de la nota mayor: 1616. Adems,
para la nota menor, tal como se observa en la grfica de identificacin de menor
nota.
//vectorNOtasCod_parc_01.cpp
# include <iostream.h >
#define linea _____________________
void main()
144
{ int cod[10],nota[10],n,i,max,ubica=0,cont=0,j,codi,pos;
int conts=0,ubicas=0,codis,poss,min;
long int codigos=0,codigosm=0;
gotoxy(4,2);
cout<<SISTEMA DE IDENTIFICACION DE MAYOR Y MENOR NOTA ;
for (i=1;i<=60;i++)
{gotoxy(2+i,4);cout<<;gotoxy(2+i,16);cout<<;
}
do
{gotoxy(5,6);clreol();cout<< Ingrese numero de alumnos = ;cin>>n;
}while(n<=0||n>100);
for(i=1;i<=n;i++)
{gotoxy(6,8);cout<<Ingrese Codigo de :;gotoxy(4,9);cout<<linea;
do
{gotoxy(5,10+i);clreol();cout<< Alumno <<i<< .- ;cin>>cod[i];
}while(cod[i]<100||cod[i]>999); }
for(i=1;i<=n;i++)
{gotoxy(34,8);cout<<Ingrese notas de : ;
gotoxy(32,9);cout<<linea;
do
{gotoxy(36,10+i);clreol();
cout<< Alumno <<i<< .- ;cin>>nota[i];
}while(nota[i]<0||nota[i]>20);
}
max=0;
for(i=1;i<=n;i++)
{if(nota[i]>=max)
max=nota[i];
}
for(i=1;i<=n;i++)
{if(nota[i]==max)
{codigos=codigos*1000+cod[i];
ubica=ubica*10+i;
cont++;
} }
clrscr();
gotoxy(3,1);cout<<Listado de Codigos y Posicion de la Nota Mayor ;
for (i=1;i<=43;i++)
{gotoxy(2+i,3);cout<<; gotoxy(2+i,7);cout<<;
gotoxy(2+i,9+cont);cout<<;
}
for (i=1;i<=9;i++)
{gotoxy(3,2+i);cout<<; gotoxy(45,2+i);cout<<; }
gotoxy(7,4);cout<< Nota Mayor = <<max;
gotoxy(25,4);cout<< Total = <<cont;
gotoxy(5,6);cout<< Codigo; gotoxy(25,6);cout<< Posicion;
145
for(j=1;j<=cont;j++)
{codi=codigos%1000;
codigos=codigos/1000;
pos=ubica%10;
ubica=ubica/10;
gotoxy(9,7+j);cout<<codi; gotoxy(29,7+j);cout<<pos;
gotoxy(23,7+j);cout<<;
gotoxy(5,20);cout<< Secuencia de Codigos = ;
gotoxy(5,21);cout<< Secuencia de Notas = ;
gotoxy(25+(4*j),20);cout<<codi; gotoxy(25+(4*j),21);cout<<max; }
getche(); clrscr();
min=999;
for(i=1;i<=n;i++) {if(min>=nota[i]) min=nota[i];}
for(i=1;i<=n;i++) {if(min==nota[i])
{codigosm=codigosm*1000+cod[i]; ubicas=ubicas*10+i; conts++;
}
}
gotoxy(3,1);cout<<Listado de Codigos y Posicion de la Nota Menor;
for (i=1;i<=43;i++)
{gotoxy(2+i,3);cout<<; gotoxy(2+i,7);cout<<;
gotoxy(2+i,9+cont);cout<<;
}
for (i=1;i<=9;i++)
{gotoxy(3,2+i);cout<<; gotoxy(45,2+i);cout<<;
}
gotoxy(7,4);cout<< Menor nota = <<min;
gotoxy(25,4);cout<< Total = <<conts;
gotoxy(5,6);cout<< Codigo; gotoxy(25,6);cout<< Posicion;
gotoxy(25,6);cout<< Posicion;
for(j=1;j<=conts;j++)
{codis=codigosm%1000;
codigosm=codigosm/1000;
poss=ubicas%10;ubicas=ubicas/10;
gotoxy(9,7+j);cout<<codis; gotoxy(29,7+j);cout<<poss;
gotoxy(23,7+j);cout<<;
gotoxy(5,20);cout<< Secuencia de Codigos = ;
gotoxy(5,21);cout<< Secuencia de notas = ;
gotoxy(25+(4*j),20);cout<<codis; gotoxy(25+(4*j),21);
cout<<min;
}
getche();
}
Problema 19. Disear un programa que permita leer, para un grupo de productos,
la siguiente informacin: cdigo, tipo de producto (una letra) y el nmero de
146
unidades. Sabiendo que algunos productos se pueden repetir (el mismo cdigo y
tipo de producto) se pide:
a. Mostrar un listado de los productos (sin repeticin) donde figure cdigo, tipo
de producto y el total de unidades (considere la suma de todas las unidades
del producto que se repite).
b. Indicar qu tipo(s) de producto(s) tiene(n) el mayor nmero de unidades.
Solucin
Diseo del mdulo de ingreso de productos por cdigo, tipo (letra) y cantidad de
productos. Debe validar que el cdigo solo acepte tres dgitos, la letra corresponde
a la abreviatura de un producto (A: arroz, F: fideos, etc.) y la cantidad es ilimitada,
solo depende de la longitud del tipo de dato especificado por el usuario.
Como se observa, durante el ingreso se repite el producto de cdigo 100 y tipo
A (arroz), entonces en el reporte final NO debe mostrarse repetido este cdigo,
pero si debe mostrar la suma acumulada (1200+800) del producto de tipo A, tal
como se ilustra en la siguiente figura:
Solucin//vector_prod_may_parcial_03
# include<iostrema.h>
#define linea _____________________________________________
int n, i, j, k, aux, temporal, mayor; codigo[100], unidades[100];
char tipo[100], codigoProd[1], aux2[1], maximo[1], resp=s;
void main (){gotoxy(6,2);
cout<< SISTEMA LOGISTICO PARA REGISTRAR PRODUCTOS ;
147
for (i=1;i<=60;i++)
{gotoxy(2+i,5);cout<<; gotoxy(2+i,23);cout<<;
}
while(resp==s) { do
{ gotoxy(5,4);cout<< Ingrese numero de productos [1..10]= ;cin >> n;
}while (n<1 || n>100);
// Ingreso de productos por cdigos, tipo y cantidad
for (i=1; i<=n; i++)
{ cout<<endl<<endl;
cout<<\tIngrese codigo del producto
<<i<<= ;cin>>codigo[i];
//gotoxy(6,7 Valido que el tipo sea de una sola letra
do
{ cout<<\tIngrese tipo de producto (Letra)
<<i<<= ;gets(codigoProd);
} while (strlen(codigoProd)>1);
// Se Agrego el caracter del Tipo de Producto a la variable Tipo
strcat(tipo,codigoProd);
cout <<\tIngrese total de unidades de producto <<i<<= ;cin>>unidades[i];
}
cout << endl;
// Ordenamos de mayor a menor segn Cdigo
for (i=1; i<=n-1; i++)
{for (j=i+1; j<=n; j++)
{if (codigo[i]<codigo[j])
{ aux=codigo[i];
codigo[i]=codigo[j];
codigo[j]=aux;
aux2[1]=tipo[i-1]; tipo[i-1]=tipo[j-1];tipo[j-1]=aux2[1];
aux=unidades[i]; unidades[i]=unidades[j]; unidades[j]=aux;
}
} }
cout << endl; cout << endl;
gotoxy(2+t,22);cout<<; // fin de marco que se genera bajo el for (*)
}
// ver tipo de producto que tiene mayor cantidad y ordenar primero por tipo
for (i=1; i<=n-1; i++)
{for (j=i+1; j<=n; j++)
{if (tipo[i-1]<tipo[j-1])
{ aux=codigo[i];
codigo[i]=codigo[j];
codigo[j]=aux;
aux2[1]=tipo[i-1];
tipo[i-1]=tipo[j-1];
tipo[j-1]=aux2[1];
aux=unidades[i];
unidades[i]=unidades[j]; unidades[j]=aux;
}
} }
// se suma por tipos, seleccionar cual es el mayor y hacer un reporte
i=1; j=1;
mayor=0;
148
do
{ if (tipo[i-1]==tipo[i+j-1])
{temporal=unidades[i];
do
{temporal=temporal+unidades[i+j];
j++;
}
while (tipo[i-1]==tipo[i+j-1]) ;
if (temporal>mayor)
{ mayor=temporal;
maximo[1]=tipo[i-1];
}
i=i+j;
j=1;
}
else
{ if (unidades[i]>mayor)
{ mayor=unidades[i];
maximo[1]=tipo[i-1];
}
i++;
}
} while (i<=n);
cout << endl;
gotoxy(3,12);cout<<linea;
gotoxy(10,16);cout << Tipo de Producto con MAYORES unidades ;
cout << endl; cout << endl; cout << Producto de tipo << maximo[1];
cout << tiene mayores cantidad y suma = << mayor;
cout << endl; cout << endl;
gotoxy(30, 23);cout<<Sr. desea continuar...? (S/N)==>; cin>>resp;
}
}
149
150
void main()
{ int lista[ max_f ] [ max_c ]
<instrs>;
}
Ejemplo 2. Inicializar los valores de una matriz para declarar una matriz lista de
5 x 3 elementos enteros.
int Lista [ 4 ] [ 2 ] = { { 4, 3, 3 },
{ 5, 4, 7 },
{ 7, 7, 7 },
{ 8, 4, 9 },
{ 9, 2, 5 }
}
Esta inicializacion, es equivalente a mostrarlo en la siguiente tabla.
Acceso a los elementos. Cada elemento de la matriz debe referenciarse
mediante sus ndices (subndices)
As,
Lista[ 3 ] [ 2 ] = 9
Lista[ 1 ] [ 1 ] = 4
Lista[ 4 ] [ 4 ] = 5
Aplicaciones
Los arreglos bidimensionales son utilizados ampliamente para problemas del
mundo real, tales como: control de productos en almacenes, distribuciones,
evaluciones, etc.
Problema 1. Una empresa importadora de vehculos tiene distribuido tres tipos de vehculos
en tres almacenes diferentes, tal
como se ilustra en la siguiente
figura:
Disear un programa que permita leer el nmero de tipos
de vehculos y el nmero de
almacenes (puede usted generalizar para n filas y m columnas), luego generar
reportes para conocer:
151
152
suma=0;
Problema 2. (Anlogo al problema 1), con la diferencia que presenta la fecha del
sistema en pantalla y se pide, adems, los siguientes reportes para:
a. Total de vehculos, por tipo, distribuidos en los almacenes
b. Total de vehculos por cada almacn
c. Cantidad mayor de vehculos, por tipo, en uno de los almacenes
d. Crear un vector cant_por_al[ ], que permita copiar los resultados segn b)
e. Crear un vector cant_tip[ ] que permita copiar los resultados segn a)
f. Usando los vectores segn d) y e), copiar en un vector sump[ ] la suma de sus
elementos
g. Crear vectores: par[] e impar[ ], donde vector par[ ] almacena los elementos
pares y vector impar[], almacenar los elementos impares segn vector sump[]
de parte f)
Solucin //matriz_alm_2004.cpp
#include<iostream.h>
# define maxf 10
# define maxc 10
void main(){ time_t tiemp;time(&tiemp);int t,n,m,i,j,mayor,k,p, sump[maxf];
float a[maxf][maxc],cant_por_al[maxf],cant_tip[maxc],par[maxf],imp[maxf];
float totaltipos,totalalmac; int q=1, s=1,, x=5, y=10;
gotoxy(6,2);cout<<EMPRESA VENDEX S.A.:;
gotoxy(30,2);printf( Fecha de Consultas: %s\n,ctime(&tiemp));
for(i=1;i<=77;i++)
{ gotoxy(i+1,3);cout<<_; //ASCII :alt +95}
gotoxy(3,4);cout<<ingrese total de tipos :;cin>>n;
gotoxy(3,5);cout<<ingrese total de almacenes :;cin>>m;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{ gotoxy(19+y*j,x+i*2);cout<<al[<<i<<,<<j<<]=;
gotoxy(27+y*j,x+i*2);cin>>a[i][j];
} /*calculando por tipos */
cout<<Total por tipo de vehiculos :<<endl;;
for (i=1; i<=n;i++){ totaltipos=0;
for (j=1; j<=m;j++)
{totaltipos=totaltipos+a[i][j];
}
153
155
{ prom[i]=0; min[i]=20;
}
for(i=1;i<=n;i++)
for(j=1;j<=3;j++)
{if (notas[i][j]<min[i])
min[i]=notas[i][j]; prom[i]+=notas[i][j];
}
for(i=1;i<=n;i++) {prom[i]-=min[i]; prom[i]/=2;
} //Ordenar la tabla descendentemente con respecto al promedio
for(i=1;i<=n-1;i++)
for(j=1;j<=n-i;j++)if (prom[j]<prom[j+1])
{
temp1=prom[j]; strcpy(temp,nom[j]);
prom[j]=prom[j+1]; strcpy(nom[j],nom[j+1]);
prom[j+1]=temp1; strcpy(nom[j+1],temp);
}
cout<<\n;
cout<<\t\tREPORTE DE ALUMNOS <<endl; cout<<\n;
cout<< Apellidos
Promedios
Estado<<endl;
for (i=1;i<=79;i++) cout<<;
for (i=1;i<=80;i++) cout<<_;
for (i=1;i<=n;i++) {cout<<i<<.-<<setw(10)<<nom[i]; //Nombres
cout<<setiosflags(ios::showpoint+ios::right);
cout<<setw(22)<<setprecision(2)<<prom[i]<<\t; //Promedios
if (prom[i]>=10) cout<< Aprobado;
else cout<< Desaprobado;cout<<endl;
}
for (i=1;i<=75;i++) cout<<_;cout<<\nPertenecen al Tercio Superior: <<endl;
if (n<3) cout<<alumno <<nom[1]<<endl;
else {for(i=1;i<=n/3;i++) cout<<alumno <<nom[i]<<endl; }
system(pause);}
1. Interface para ingreso de alumnos y sus tres notas
156
2. Reportes
157
for(i=0;i<o;i++)
{ac+=empresa[(dep-1)][(sec-1)][i];
}
cout<<ac;
prom=ac/o; clrscr();
cout<<El promedio del departamento y seccion es: <<prom;
}
else
{for(i=0;i<s;i++)
{for(j=0;j<o;j++)
ac+=empresa[(dep-1)][i][j];
}
prom=ac/(o*s);
clrscr();
cout<<El promedio del departamento es: <<prom;
}
getche();
}
158
159
Problema 6. Disear un programa para que una matriz, primero, permita ingresar
el nmero de tipo de productos (en este caso arroz y fideos), luego ingresar
el nmero de distritos (en nuestro caso 2: Lima y Lince). A continuacin debe
ingresar las cantidades de productos por tipos en los distritos. Luego se pide:
a. Calcular en forma automtica el total de productos por tipos, distritos y total
de productos ingresados a la matriz.
b. Mostrar en la matriz ordenada en forma ascendente los productos por tipos de
productos.
c. Mostrar en la matriz ordenada en forma ascendente los productos por distritos.
Solucin //mat_EXAMEN2.cpp
#include<iostream.h>
#include<conio.h>
#define maxf 50 #define maxcol 50
int a[maxf][maxcol],ordt[maxf][maxcol],ordd[maxf][maxcol];
char nomt[10][10];char nomd[10][10];
int n,i,m,j,tpf[maxcol],tpd[maxf],tot, temp, x,v,k,d,o;
void main(){clrscr(); cout<< ingrese # numero de tipos ;cin>>n;
cout<< ingrese nombre de tipo <<endl;
for(i=0;i<n;i++)
{cout<<t[<<(i+1)<<]=
;cin>>nomt[i];
}
cout<<\nIngrese #numero de distritos ;cin>>m;
cout<< ingrese nombre de distrito <<endl;
for(i=0;i<m;i++)
{cout<<d[<<(i+1)<<]=;cin>>nomd[i];
}
clrscr();
gotoxy(30,2);cout<< ingrese datos de la matriz<<endl;
for(i=0;i<n;i++)
{gotoxy(15+10*i,4);cout<<nomt[i];
160
}
for(i=0;i<m;i++) {gotoxy(3,5+i);cout<<nomd[i]; } //lectura de datos en la matriz
for(i=0;i<n;i++)
for(j=0; j<m;j++)
{ gotoxy(15+10*i,5+j);cin>>a[i][j];
} //calculando por tipos
for(i = 0;i<n;i++)
for(j=0;j<m;j++)
{ tpf[i]=tpf[i]+a[i][j];
}
for(i=0;i<n;i++)
{ gotoxy(15+10*i,6+m);cout<<tpf[i];
}
getche();
for(j=0;j<m;j++)
for(i=0;i<n;i++)
{ tpd[j]=tpd[j]+a[i][j];
}
for(i=0;i<n;i++)
{ gotoxy(15+10*n,5+i);cout<<tpd[i];
}
for(j=0;j<m;j++)
{tot = tot + tpd[j];
}
gotoxy(15+10*n,6+m);cout<<tot; getch();
//proceso de ordenacion;
for(i = 0;i<n;i++)
{ for(j=0;j<m;j++){ ordt[i][j]=ordd[i][j]=a[i][j];
}
}
temp=0;
//ordenando
for(k=0;k<n;k++)
{for(i=0;i<m;i++)
{ for(j=i;j<m;j++)
if( ordt[k][i]>=ordt[k][j] )
{ temp=ordt[k][j]; ordt[k][j]=ordt[k][i];
ordt[k][i]=temp;
}
}
}
//ord vertical
for(k=0;k<m;k++)
{for(j=0;j<n;j++)
{ for(i=j;i<n;i++)
if (ordd[j][k] >= ordd[i][k])
{temp=ordd[j][k];
ordd[j][k]=ordd[i][k];
ordd[i][k]=temp;
161
}
}
}
clrscr();gotoxy(20,2);cout<<proceso de ordenacion por tipos de la matriz;
for(i=0;i<n;i++) {gotoxy(15+10*i,4);cout<<nomt[i]; }
for(i=0;i<n;i++)
{ for(j=0; j<m;j++) {gotoxy(15+10*i,5+j);cout<<ordt[i][j];
}
}getch();
clrscr();
gotoxy(20,2);cout<<proceso de ordenacion por distritos de la matriz;
for(i=0;i<m;i++)
{gotoxy(3,5+i);
cout<<nomd[i];
}
for(i=0;i<n;i++)
for(j=0; j<m;j++)
{ gotoxy(15+10*i,5+j);
cout<<ordd[i][j];
}
getch();
int
x=a[0][0];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if (a[i][j]>x) { x=a[i][j];
}
cout<<\nLa mayor cantidad ingresada es = <<x;getche(); }
Despus de ingresar datos, debe presionar ENTER para mostrar en forma
automtica los clculos del total por tipos y por distritos.
Luego presione ENTER, para mostrar las cantidades de matriz, ordenados en
forma ascendente por tipos de productos.
162
163
Salida
164
suma1=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{ if(i+j==n+1)
{ suma1=suma1+z[i][j];
}
}
cout<<\nla suma de la diagonal secundaria es: <<suma1<<endl;
}
else cout<<la matriz no es cuadrada;getch();}
Problema 9. Disear un programa que permita ingresar nmeros enteros en una
matriz de orden 3*3, luego mostrarlo en forma ordenada por filas (las filas debe
ir ordenndose en forma secuencial y ascendente).
Solucin //mat_ord_fil.cpp
void main()
{ int A[3][3], min,j,i; clrscr();
cout<<Ingrese elementos de una matriz 3x3: <<endl;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{cout<<A[<<(i+1)<<,<<(j+1)<<]=;cin>>A[i][j];
}
clrscr();
cout<< Los datos de la La matriz original son:;
for(i=0;i<3;i++)
{cout<<endl;
for(j=0;j<3;j++) cout<<\t<<A[i][j];
}
for(i=0;i<8;i++)
{min=A[i/3][i%3];
for(j=i+1;j<9;j++)
if(A[j/3][j%3]<min)
{min=A[j/3][j%3];
A[j/3][j%3]=A[i/3][i%3];
A[i/3][i%3]=min;
}
}
cout<<endl<<endl<<La matriz ordenada es la siguiente :;
for(i=0;i<3;i++) {cout<<endl;
for(j=0;j<3;j++)
cout<<\t<<A[i][j];
}
getch();
}
165
}
cout<<La matriz ordenada por columnas:<<endl;
for(i=0;i<m;i++)
{cout<<endl;
for(int j=0;j<n;j++)
cout<<\t<<A[i][j];
}
cout<<endl<<endl<<Pulse una tecla para continuar ...<<endl<<endl;
getch(); clrscr();
for(i=0;i<m;i++)
//suma por filas, suma se acumula en
{ A[i][n]=0;
for(int j=0;j<n;j++)
A[i][n]=A[i][n]+A[i][j];
}
cout<<La suma acumulada por filas:<<endl;
for(i=0;i<m;i++)
cout<<La suma de los elementos de la fila <<(i+1)<< es: <<A[i][n]<<endl;
cout<<endl<<Pulse una tecla para continuar ...<<endl<<endl; getch();
for(j=0;j<n;j++)
//suma por columnas, suma se acumula en
{ A[m][j]=0;
for(int i=0;i<m;i++)
A[m][j]=A[m][j]+A[i][j];
}
cout<<La suma acumulada por columnas:<<endl;
for(j=0;j<n;j++)
cout<<La suma de los elementos de la columna <<(j+1)<< es: <<A[m][j]<<endl;
cout<<endl<<Pulse una tecla para continuar ...<<endl<<endl; getch();
cout<<Los valores mximo y mnimo de cada fila son:<<endl;
for(i=0;i<m;i++)
cout<<Enfila<<(i+1)<<, el mnimo es: <<A[i][0]<<y el mximo es: <<A[i][n-1];
cout<<endl<<Pulse una tecla para continuar ...<<endl;
getch();}
167
168
cout<<v[<<k<<]=<<v[k]<<endl;
}
getch();
}
Problema 12. Disear un algoritmo y el programa correspondiente que al leer un
nmero entero n en base 10, determine si existe otra base de numeracin b, en la
cual el nmero es escrito con sus cifras al revs. En caso afirmativo, mostrar la
base b y el nmero en dicha base (b 10). n debe tener por lo menos dos cifras y
la ltima de ellas ser siempre significativa.
Solucin //matriz_base_x.cpp
#include<iostream.h>
void main(){
char c[100],b[100];
int r,m,p=-1,n,i,k,j,s[100],d[100],x,w,h=0;
gotoxy(10,2);cout<< ************* NUEVA BASE *************** ;
gotoxy(2,4);cout<<endl<<Ingrese el numero: ;cin>>c;
n=atoi(c);
while((n<11)||((n%10)==0))
{cout<<Error al ingresar los datos vuelva a intentarlo: ;
cout<<Ingrese el numero: ;cin>>c;
n=atoi(c);
}
for(i=strlen(c)-1;i>=0;i--)
{p++; b[p]=c[i];
}
m=atoi(b);
r=n;
{j=-1;
k=m;
do { j++;
d[j]=(k%10);
k=k/10;
} while(k>=10);
d[j+1]=k; }
for(i=2;i<=10000;i++)
{j=-1; k=n;
for(x=0;x<=strlen(c)-1;x++)
{s[x]=0; }
do{ j++;
s[j]=(k%i);
k=k/i;
}while(k>=i);
s[j+1]=k;
if(((j+2)==strlen(c))&&(i!=10))
{ w=0;
169
for(x=0;x<=strlen(c)-1;x++)
{if(d[x]!=s[x])
w++;
}
if(w==0) {h++;
gotoxy(3,6);cout<<La base es : <<i<< y el numero es <<m;
}}}
if(h==0)
cout<<No se encontro ningun valor para b; getch();
}
Problema 13. Un aeropuerto cuenta con los datos de los pasajeros, por vuelos,
de los doce meses del ao pasado. Se tiene nueve destinos desde donde pueden
venir o llegar dichos vuelos y cinco aerolneas a los cuales pueden pertenecer
los vuelos (llammosla A, B, C, D, E). Se desea saber el mes en el cual llegaron o
partieron ms vuelos al aeropuerto, la aerolnea que realiz el mayor transporte
de pasajeros entre enero, febrero, marzo y los dos destinos ms concurridos por
las aerolneas C, D, E.
Solucin //mat_vuelos_avion.cpp
#include <iostream.h>
void main()
{ int vuelos[2][12][5][9], pasajeros[2][12][5][9][5], cont[12];
int i, j, k, l, m, max, maxi, max_pas, aero, cont_pas[5];
system(cls); cout<<\nRegistro de Salidas : ;
for(i=0;i<12;i++)
{ cout<<\nMes <<i+1<< :;
for(j=0;j<5;j++)
{ cout<<\nAerolinea <<i+65<< :;
for(k=0;k<9;k++)
{cout<<Ingrese numero de vuelos para el destino <<k+1;
cin>>vuelos[0][i][j][k];
for(l=0;l<vuelos[0][i][j][k];l++)
{cout<<Nmero de pasajeros del vuelo <<l+1<< :;
cin>>pasajeros[0][i][j][k][l];
}
}
}
}
system(cls);
cout<<\nRegistro de Llegadas : ;
for(i=0;i<12;i++)
{ cout<<\nMes <<i+1<< :;
for(j=0;j<5;j++)
{ cout<<\nAerolinea <<i+65<< :;
170
for(k=0;k<9;k++)
{
cout<<Ingrese el nmero de vuelos desde <<k+1<< :;
cin>>vuelos[1][i][j][k];
for(l=0;l<vuelos[1][i][j][k];l++)
{
cout<<Nmero de pasajeros del vuelo <<l+1<< :;
cin>>pasajeros[1][i][j][k][l];
}
}
}
}
for(i=0;i<12;i++)
{ cont[i]=0; max = cont[i];
for(m=0;m<2;m++)
for(j=0;j<5;j++)
for(k=0;k<9;k++)
cont[i]=cont[i]+vuelos[m][i][j][k];
if (cont[i] > max)
{ max=cont[i];
maxi=i;
}
}
cout<<\nEl mes de de mayor numeros de vuelos es <<maxi+1<< :;
for(j=0;j<5;j++)
{ cont_pas[j]=0;
max_pas = cont_pas[j];
for(i=0;i<3;i++)
for(m=0;m<2;m++)
for(k=0;k<9;k++)
for(l=0;l<vuelos[m][i][j][k];l++)
cont_pas[j]=cont_pas[j]+pasajeros[1][i][j][k][l];
if (cont_pas[j] > max_pas)
{ max_pas=cont_pas[j];
aero=j;
}
}
cout<<\nLa aerolinea con transporte de pasajeros es <<aero + 65<< :;
}
171
Problema 14. Disear un programa que permita leer n alumnos (n 200) y por
cada alumno, leer cdigo y ocho notas de prcticas calificadas, luego se pide:
a. Calcular el promedio de prcticas (PP) eliminando las dos notas ms bajas
b. Mostrar el cuadro de mritos con los siguientes datos: cdigo, las ocho notas
de prcticas y el promedio de prcticas (PP)
Solucin
Diseo del mdulo de ingreso de alumnos por cdigo y ocho notas. Se debe
validar los cdigos que estn compuestos por tres dgitos y las notas sean vlidas
slo en el rango del 0 al 20.
172
Solucin //matriz_notas_prac_02.cpp
# include <iostream .h>
#define linea1 ____________________
#define linea-------------------------------------------------------
#define maxal 100
void main() {int codigo,j,cod[maxal],menorpc1,menorpc2;
int not[maxal][8],nota,i,sum,n,aux1,pos[maxal]; float prom[maxal];
char resp=s; // para la parte interactiva
while(resp==s) {clrscr();
gotoxy(6,2);cout<<SISTEMA DE CONSULTAS DE NOTAS ;
for (i=1;i<=60;i++)
{gotoxy(2+i,4);cout<<; gotoxy(2+i,20);cout<<;
}
do {gotoxy(12,6);clreol();cout<<Ingrese cantidad de alumnos: ;cin>>n;
}while(n<1 ||n>maxal);
clrscr();
gotoxy(6,1);cout<< Total de alumnos <<n;
gotoxy(6,2);cout<< INGRESO DE CODIGO Y NOTAS POR ALUMNO ;
for(i=1;i<=n;i++)
{for (int t=1;t<=50;t++)
{gotoxy(2+t,4);cout<<; gotoxy(2+t,22);cout<<;
}
do
{gotoxy(8,5+i);clreol();cout<<Ingrese codigo de alumno <<i<<=;cin>>codigo;
}while(codigo<100 ||codigo>900);
cod[i]=codigo;
gotoxy(12,6+i); cout<<Ingreso de notas ;
gotoxy(10,8);
cout<<linea1;
gotoxy(10,17); cout<<linea1;
for(j=1;j<=8;j++)
{ do {gotoxy(12,8+j);clreol();
cout<< nota <<j<< = ;cin>>nota;
}while(nota<0 ||nota>20);
not[i][j]=nota;
}
clrscr();
}
for (int t=1;t<=60;t++)
{ gotoxy(2+t,4);cout<<;gotoxy(2+t,22);cout<<;
}
// buscando las dos notas mas bajas, creando el vector posicion y el vector promedio
for(i=1;i<=n;i++)
173
{ pos[i]=i;sum=0;menorpc1=21;menorpc2=21;
for(j=1;j<=8;j++)
{ sum=sum+not[i][j];
if(not[i][j]<menorpc1)
{ menorpc2=menorpc1; menorpc1=not[i][j];
}
else if(menorpc2>not[i][j])
menorpc2=not[i][j];
}
prom[i]=(sum-menorpc1-menorpc2)/6.0;
}
//ordenando en vector posicion
for(i=1;i<=n-1;i++)
(j=i+1;j<=n;j++)
if(prom[i]<prom[j])
{ aux1=pos[i];
pos[i]=pos[j];
pos[j]=aux1;
}
gotoxy(6,10);cout<<linea;
gotoxy(6,11);cout<<\t\t\tCuadro de Meritos;
gotoxy(6,12);cout<<linea;
gotoxy(6,13);cout<< #<< Codigo\t\t Notas\t\t Promedio;
gotoxy(6,14);cout<<linea;
gotoxy(20,15);cout<<1 2 3 4 5 6 7 8 ;
gotoxy(6,16);cout<<linea;
for(i=1;i<=n;i++)
{ gotoxy(6,16+i);cout<<i<<.-;
gotoxy(12,16+i);cout<<cod[pos[i]];
for(int j=1;j<=8;j++)
{ gotoxy(16+4*j,16+i);cout<<not[pos[i]][j];
}
gotoxy(54,16+i);cout<<prom[pos[i]];
174
}
gotoxy(6,16+i);cout<<linea;
gotoxy(30,23); cout<<Sr. desea continuar ?...(S/N); cin>>resp;
}// Debe actualizar las variables
}
Problema 15. Disear un programa que permita ingresar nmeros enteros a una
matriz de orden n*m (n:filas y m:columnas) n,m definidos por usuario y luego
mostrar sus elementos ordenados en forma ascendente y en espiral.
Los datos ingresados y resultados esperados, se ilustran en la siguiente figura:
Solucin //matriz_espiral.cpp
#include <stdio.h>
# define linea ___________________________
#define taman 20
void main()
{ int matriz[taman][taman], espiral[taman][taman], temp[100],i,j,k,n;
int farribaizq,farribader,cderechaarr,cderechaaba,fabajoder,fabajoizq, cizqaba;
int cizqarr,contador, aux;;
gotoxy(15,2);cout<< MATRIZ ESPIRAL ;gotoxy(6,3);cout<<linea ;
gotoxy(8,4);cout<< Ingrese dimension de la matriz = ;cin>>n;
gotoxy(8,6);cout<< Ingrese elementos de la matriz ;
int x,y; x = 10; y = 8; //para gotoxy(x,y)
for (i=0;i<n;i++){
for (j=0;j<n;j++)
{gotoxy(x,y);cout<<M[<<(i+1)<<,<<(j+1)<<]=;
cin>>matriz[i][j];
x +=12;
}
y +=1;
x = 10;
}
k = 0;
for (i=0;i<n;i++)
for(j=0;j<n;j++)
{temp[k] = matriz[i][j];
k ++;
}
for (j=0;j<n*n-1;j++)
{ for (i=0;i<n*n-1;i++)
{if (temp[i] > temp[i+1])
{ aux=temp[i];
temp[i]=temp[i+1];
temp[i+1]=aux;
}
175
}
}
k = 0;
for (i=0;i<n;i++)
for(j=0;j<n;j++)
{
matriz[i][j] = temp[k];
k ++;
}
//inicializacin de variables
farribaizq =0;farribader = n - 1;cderechaarr = 1;cderechaaba = n - 1;fabajoder = n 2;fabajoizq = 0;cizqaba = n - 2; cizqarr = 1;contador = 0;
while(contador < (n*n))
{for (i = farribaizq; i <= farribader; i++)
{espiral[farribaizq][i] = temp[contador];
contador++;
}
farribaizq++;
farribader--;
for( i = cderechaarr; i <= cderechaaba; i++ )
{espiral[i][cderechaaba] = temp[contador];
contador++;
}
cderechaarr++; cderechaaba--;
for( i = fabajoder; i >= fabajoizq; i-- )
{espiral[fabajoder + 1][i] = temp[contador];
contador++;
}
fabajoder--; fabajoizq++;
for( i = cizqaba; i >= cizqarr; i-- )
{espiral[i][cizqarr - 1] = temp[contador];
contador++;
}
cizqaba--;
cizqarr++;
}
cout<<\n\t Matriz de Forma de ESPIRAL ; cout<<\n\tlinea;
y += 3;
for( i = 0; i < n; i++ )
{for( j = 0; j < n; j++ )
{
gotoxy(x,y);
if( espiral[i][j] < 10 )
{cout<<espiral[i][j];
}
else{cout<<espiral[i][j];
}
176
x +=6;
}
y += 1;
x = 10;
cout<<\n;
}
cout<< \n\n\t ;system(pause);
}
Problema 16. Disear un programa que te permita ingresar los precios (en
formato real y hasta tres cifras decimales) de distintos productos pertenecientes
a distintos almacenes en una matriz de n filas (tipos de productos) y m columnas
(nmero de almacenes), donde n, m es definido por el usuario. Los datos
ingresados deben procesarse y ser presentados solo en formato entero, para lo
cual debe aplicar
Reglas de Redondeo. El programa debe realizar y presentar lo siguiente, tal
como se ilustra en la siguiente figura:
1. Almacenar en un vector Total en Almacn[ ] los totales en almacn
2. Almacenar en un vector Total para Producto Tipo[] los totales por producto
3. Mostrar en un vector los elementos todos tipos enteros tanto para Total en
Almacn[ ] como para Total para ProductoTipo[ ]
4. Segn la parte 3, mostrar los elementos repetidos, los elementos que quedan y
la secuencia
Solucin. En la siguiente figura se ilustra el proceso de datos.
177
p++;
}
cant_tipo--; k--; eliminadoi=1;
}
}
if(eliminadoi)
{l=i;
while(l<=cant_tipo)
{cant_tipo_Ent[l]=cant_tipo_Ent[l+1];
l++;
}
cant_tipo--;i--;eliminadoi=0;elementoi=1;
}
}
//Mostrando los elementos del vector entero cant_al_Ent sin repetidos
cout<<\n\nMostrando los elementos enteros sin repetir para el vector Total en
Almancen.;
for(i=1;i<=cant_al;i++)
cout<<El elemento sin repetir <<i<< del vector entero Total en Almacen es:
<<cant_al_Ent[i];
cout<<Presione una tecla para continuar......;
getche();//Mostrando los elementos del vector entero cant_tipo_Ent sin repetidos
cout<<\n\nMostrando los elementos enteros sin repetir para el vector Total
para Producto Tipo...;
for(i=1;i<=cant_tipo;i++)
cout<<El elemento sin repetir <<i<< del vector entero Total para Producto Tipo
es: <<cant_tipo_Ent[i]<<endl; cout<<Presione una tecla para continuar......;
getche();
//Mostrando los elementos del vector eliminado para cant_al_Ent
cout<<\n\n\nMostrando la secuencia de valores repetidos en el vector Total en
Almacen es: ;
for(i=1;i<=z;i++)
cout<<eliminados_al[i]<<endl;
cout<<Presione una tecla para continuar......;
getche();
//Mostrando los elementos del vector eliminado para cant_tipo_Ent
cout<<\nMostrando la secuencia de valores repetidos en el vector Total para
Producto Tipo es: ;for(i=1;i<=zz;i++)
cout<<eliminados_tipo[i]<<endl;
cout<<Fin del Programa;
getche();
return 0;
}
181
Problema 17. El cartero de una zona campestre debe de entregar cartas en n casas
de una regin. Para ello, desea armarse un recorrido que le permita entregar
todas las cartas y regresar a su oficina queriendo que el trayecto entre dos casas
consecutivas sea siempre recto.
Como le gusta pasear pretende, adems, que el recorrido no se corte a s mismo,
entonces el problema consiste en escribir un programa que le permita el ingreso
de las coordenadas (x,y)de cada una de las n casas y de la oficina de correos y que
si existe una lista de las casas en elorden en que deben ser visitadas.
Solucin // matriz_cartero.cpp
#include<iostream.h>
void main()
{int x,y,n,i,j,m,q,opc;double casa[100],y1,x1,aux;
cout<<\t\n ===> CARTERO <=== ;
cout<< \t\n Ingrese coordenadas de la Oficina;
do{gotoxy(10,4);cout<<x = ; cin>>x;
}while(x<1 || x>100);
do{ gotoxy(18,4);cout<<y = ; cin>>y;
}while(y<1 || y>100);
cout<< \t\n Sr. ingrese numero de Casas a visitar =;cin>>n;
for(i=1;i<=n;i++){cout<<\nIngrese Coordenadas de la Casa # <<i<< =<<endl;
do
{cout<< x = ; cin>>x1;
}while(x1<1 || x1>100);
do{cout<< y = ; cin>>y1;
}while(y1<1 || y1>100);
casa[i]=sqrt(pow(x1,2)+pow(y1,2));
// verificar mediante dx=pow((xx-x),2); dy=pow((yy-y),2);dxy=dx+dy;
//
dd=sqrt(dxy);
182
Compendio de problemas
[0] [1]
12
11
[2] [3]
09
15
[ 18 ] [ 19 ] ndice
........
11
08
02
12
Bidimensionales
Multidimensionales
183
Se inicia el ingreso con el dato 12, mediante el cual se enva los mensajes indicando
el nmero de repeticiones, as como ubicacin del ndice en la posicin
i,asimismo, se va registrando el dato repetido y el total, se encarga de llevar el
registro de intentos (error) repetidos para el valor en la posicin i-k.(k>1).
En la siguiente interface se ilustra los procesos de la secuencia de datos repetidos,
nmero de intentos (errores) y la posicin donde se localiza el dato repetido.
185
Solucin
En la siguiente interface se ilustra
la lectura de datos a vectores A y B,
asimismo, en la figura siguiente, se
ilustra lo solicitado.
187
Problema 7. Disear un programa que permita realizar las operaciones combinadas de vectores y matriz.
Leer la dimensin de la matriz y luego ingresar datos tipo enteros y almacenarlo
en una matriz, luego realice los procesos mostrados en las siguientes figuras:
a. Lectura del total de elementos de la matriz, almacenamiento de datos, copia de
datos de la matriz a un vector, ordenamiento de elementos de la matriz.
188
Ahora, si el cdigo del segundo alumno es diferente del primero, se puede editar
cdigo del tercer alumno, pero para este tercer alumno si se repite el cdigo,
entonces el sistema enva el mensaje:
Codigo Existe en posicion 2 Intento # 1
189
190
Arreglos unidimensionales
Problema 11. Solo se deben usar para que el usuario ingrese sus datos por cdigo
(solo de tres dgitos), nombre (cadena de longitud de 10 caracteres) y edad
(15..70) de n empleados( n<=100 ). Los datos deben almacenarse en vectores que
usted defina, luego genere los siguientes reportes:
1. Empleados por cdigo, nombre y edad, respectivamente.
2.
Empleados por nombre y
edad, ordenados en forma ascendente por edad.
Asimismo, mostrar la posicin actual y original de cada
empleado.
3. Buscar empleados por edad, si
existen; mostrar el total.
4. Insertar nuevo(s) empleado(s).
Mostrar los nuevos resultados.
5. Retirar empleados que tiene edad mayor a 60 aos.
Arreglos bidimensionales
Problema 12. Disear un programa que permita almacenar cantidad de vehculos
por marca (Toyota, Datsun, Honda, etc.) en almacenes ubicados en distritos
(Lima, Lince, Rmac, etc.) y luego genere los siguientes reportes:
a. Total de vehculos por tipo y ordenados en forma ascendente. Tambin se debe
mostrar el tipo (nombre) correspondiente.
b. Total de vehculos en cada almacn y ordenados en forma ascendente.Tambin
se debe mostrar el almacn (distrito) correspondiente.
c. Vehculos ordenados en forma ascendente en la matriz.
d. Nombre del almacn con mayor cantidad de vehculos, segn tipo y posicin
respectiva.
e. Nombre del tipo de vehculo con menor cantidad y nombre del almacn correspondiente y su posicin respectiva.
191
192
Seccin con mayor promedio
Problema 15. Dada una matriz bidimensional n x n, crear otra de las mismas
dimensiones, donde el valor de cada elemento, sea el promedio del elemento en
la misma posicin de la primera matriz y de los vecinos que lo rodean (nueve o
menos).
Ejemplo:
El elemento 2a fila y 2a columna es el promedio de todos
sus vecinos (marcados con doble lnea)
Problema 16. Matriz con entradas en diagonal
Dados dos enteros m y n, disear un programa que construya una matriz con
m filas y n columnas cuyas entradas sean los nmeros 1, 2, ..., m*n acomodados
en diagonal, comenzando con el 1 en la entrada que esta en la esquina superior
izquierda, siguiendo con el 2 a la derecha del 1 y el 3 abajo del 1, y as
sucesivamente.
193
196
1. Ingreso de Registros
2. Reporte Ordenado de Registros
por Apellidos
Permite ordenar los registros por
apellidos en forma ascendente
3. Insertando Registros. El usuario
ingresa el nmero de registros
que desea insertar, para lo cual el
sistema totaliza la cantidad total n) de registros que existen y enva el mensaje
que ingrese el (n+1) registro(s). Al final genere un reporte indicando el total de
registros.
198
Captulo 4
Objetivos
- Comprender cmo funciona el
procesamiento de cadenas.
- Definir la longitud fsica de una
cadena.
- Establecer el dato de usuario con
nombre de la cadena.
- Definir vector cadena.
- Definir vector de cadenas.
- Usar funciones de comparacin
(strcmp), convertir caracteres a
maysculas (strupper), etc.
- Funciones para el tratamiento de
cadenas: strlen(), strcat().
- Copia de cadenas: stpcpy(), strcpy(), strncpy().
4.1 Introduccin
Una cadena de caractereses una secuencia de cero o ms smbolos que incluyen
letras, dgitos y caracteres especiales o es un arreglo de caracteres que, en el caso
de C++, debe terminar en el carcter nulo (\0). Una cadena puede representarse,
o bien como un array comn (encerrado entre llaves), o bien como una serie de
caracteres encerrado entre comillas.
Existen diferentes juegos de caracteres, dentro de los que se destacan el cdigo
ASCII y el EBCDIC.
Ejemplo:
1. {A, l, a, n, d, , C, +, \0} //es una cadena en C++
2. Borland C++ 5 //Es una cadena C++
3. {s,u,n,a,l, ,C,+} //No es una cadena C++
199
Sintaxis
char cadena[30]; //Cadena de 30 caracteres + \0;
Se puede omitir la longitud de la cadena en la declaracin si es que tambin se
la inicializa:
char salida[ ]= Lenguajues de Programacion Estructurado;
200
Observacin:
1. Si declara cad[ ]: Solicita un valor
2. Si declara cad [4]: Imprime la cadena hasta encontrar un espacio en blanco
3. cout<<(cad1+1): imprime cad1 a partir de su segundo carcter
Notas:
1. Slo con punteros a cadenas (char*) se puede hacer la asignacin de cadenas
con el smbolo =, pues en este caso, nos referimos nicamente al primer carcter
de la cadena.
2. El flujo cincuenta con un mtodo getline, que es ms eficiente para leer una
cadena incluyendolos espacios en blanco que pueda contener.
Su sintaxis es:
cin.getline(char *cadena, int longitud, char escape=\n)
Cadena: es una variable de tipo cadena.
Longitud: es el nmero mximo de caracteres a considerar en la entrada.
Generalmente se usa el formato sizeof(cadena) para leer una cadena cuyo
tamao mximo es desconocido.
Escape: es el carcter con el cual terminar la lectura de la cadena. Es opcional.
3. Se puede acceder individualmente a cada carcter de la cadena, como en un
arreglo, llamndolo por su ndice, el cual representa su posicin en la cadena.
Problema 3. Disear un programa que permita convertir una cadena escrita en
letras minsculas a letras maysculas.
Solucin //vect_cad1.pp
#include <iostream.h>
void main() { char cad[40]; char copia_l[40];int i;
gotoxy(2,2); cout<< Ingrese cadena :;gets(cad);
for (i=0;i<=sizeof(cad);i++){copia_l[i]=toupper(cad[i]);}
gotoxy(2,4);
cout<<Cadena convertida a mayusculas =<<copia_l;
getche(); }
201
Concatenacin de cadenas
Funcin strcat()
Permite concatenar (unir) dos cadenas ledos e inicializadas por usuario.
Sintaxis:
char*strcat (char*cad1, constchar*cad2)
Problema 1. Disear un programa que permita leer dos cadenas: cad1[50] y
cad2[20], luego imprimir la cadena concatenada.
202
Solucin
//cadena5.cpp
#include<iostream.h>
void main()
{ char cad1[40];
char cad2[20];
cout<<\n Ingrese cadena 1: ;
gets(cad1);
cout<<\n Ingrese cadena 2: ;gets(cad2);
strcat(cad1,cad2);
cout<<\nCadena concatenada : <<cad1;getche() ;
}
Problema 2. Disear un programa que permita leer dos cadenas de longitud n
y m, respectivamente; luego las dos cadenas mostrarlas en forma concatenada,
convertirla a maysculas, mostrar en forma invertida y finalmente, la cadena
invertida mostrarla en su estado de origen (al estado en que se realiz la
conversin a maysculas).
Solucin //cadena_invertida.cpp
#define max 80
voidmain()
{ char cad1[max], *inv,original[max],x1[max], cad2[max],*p1,r*p2;inti,lon;
p1=&cad1[0]; p2=&cad2[0];
cout<<Ingresecadena 1 :; gets(p1);
cout<<Ingresecadena 2 :; gets(p2);
lon=strlen(strcat(p1,p2));
cout<<\n Cadena concatenada original: <<p1<<endl;
cout<<\n La longitud de la cadena es: <<lon<<endl;
for(i=0;i<lon;i++)
{
x1[i]=toupper(p1[i]); // copia en vector letras maysculas
x1[lon]=\0; //para fin de cadena
}
cout<<\n La concatenacin en Maysculas es : <<x1<<endl;
inv=strrev(x1); //para invertir cadena
cout<<\n La cadena invertida en maysculas es: <<inv<<endl;
cout<< \n Uso de for para mostrar invertida (a su original) la cadena. ;
for(i=0;i<lon;i++) {original[lon-i-1]=x1[i];
original[lon]=\0; //para fin de cadena
}
cout<<\n la cadena invertida: <<original;
getch();
}
203
aade al final de cad1 el carcter nulo, por lo que se debe definir para el correcto
funcionamiento del programa.
char *strncpy(char *cad1, constchar *cad2, size_t n)
Problema 1. Disear un programa que permita leer una cadena cad2, de longitud
mxima 50 y luego:
a. Copiar informacin de cad2 en un vector cad1
b. Imprimir a partir del tercer carcter y hasta el final
c. Imprimir solo los tres primeros caracteres
Solucin // cadena3.cpp
#include<iostream.h>
void main() {char cad1[40];
char cad2[100];
gotoxy(2,2);cout<<Ingrese una cadena : ;gets(cad2);
strcpy(cad1,cad2); //copia cad2 en cad1
gotoxy(2,4);cout<<Cadena completa :<<cad1;
strncpy(cad1,cad2,12); // solo imprime los primeros 3 caracteres
cad1[3]=\0;
// selecciona los 3 primeros caracteres, el resto es =0
gotoxy(2,6);cout<<Primeros 3 caracteres de cad2 : <<cad1<<endl;
stpcpy(cad1,cad2+3); //impresin a partir del cuarto carcter
gotoxy(2,8);cout<<Impresin a partir del 4 carcter y hasta el final:<<cad1;
getche() ;}
Problema 2. Disear un programa que permita leer una cadena cad1 de longitud
mxima 50 y luego imprimir a partir del octavo carcter. (Use asignacin de
variables tipo cadena).
Solucin //cadena4.cpp
#include<iostream.h>
voidmain()
{ char cad1[10], *cad2, *cad3;
gotoxy(2,2); cout<<ingrese cadena1 :; gets(cad1);
205
2. Funcin strrchr()
Hace lo mismo que strchr, pero busca la ltima aparicin de un carcter c en
lugar de la primera.
Sintaxis:char *strchr(const char *s, int c),
char *strrchr(const char *s, int c);
Problema 1. Disear un programa que permita leer dos cadenas: cad1[50] y
cad2[20] y copiar en cad1 la informacin de cad2. Luego ingresar un carcter
de bsqueda, si el carcter se encuentra en la cadena, este enva el mensaje el
carcter est en la posicin. En otro caso el carcter no se encuentra.
Solucin //cadena50.cpp
Intmain()
{ char cadena1[20],cadena2[20], *ptr, busca;
cout<<\nIngrese cadena :;gets(cadena2);strcpy(cadena1, cadena2);
cout<<\nIngresecaracter a buscar :;cin>>busca;
ptr = strchr(cadena1, busca); //en ptr almacena toda la cadena a partir de busca
cout<<\ncadena resultante al especificar el carcter de bsqueda :<<ptr<<endl;
cout<<\ntoda la cadena :<<cadena1<<endl;
206
if (ptr)
cout<<\nElcaracter <<busca<< esta en la posicin: <<(ptr-cadena1);
else
cout<<\n El caracter <<busca<< no se encuentra: ;return 0;getche();
}
207
2. Funcin strcspn()
Localiza la posicin de la primera aparicin de cualquier carcter de una cadena
cad2 dentro de una cadena cad1.
Sintaxis: size_tstrcspn (const char *s1, const char *s2);
Problema 2. Disear un programa que permita inicializar dos cadenas:
cad1=Los alumnos,estudian c, c++;cad2=,;
Luego genere un reporte de cad1 a partir del carcter idntico de cad2.
Solucin //cadena8.cpp
voidmain()
{ char *cad1=Los alumnos,estudian c, c++;
char *cad2= , ; // character a identificar en cad1
int p;
p=strcspn(cad1,cad2); //p == 11
cout<<\nLa posicin del carcter idntico esta en=<<p<<endl;
cout<<\nResto de la cadena : <<(cad1+p); getche() ;}
208
3. Funcin strtok()
Permite dividir una cadena cad1en palabras, consideradas unidades sintcticas,
las cuales se encontrarn separadas por caracteres especiales contenidos en otra
cadena cad2.
Sintaxis: char*strtok(char*cad1, constchar*cad2);
Strtok. Coloca un carcter nulo inmediatamente despus del primer token
encontrado en cad1. Por ello, la primera llamada a strtok() deber hacerse con
cad1 como primer argumento y las siguientes con NULL como primer argumento
(esta ltima es una constante definida en stdio.h y su valor es 0).
Strtok(). Devuelve un puntero a la cadena encontrado. Devuelve NULL cuando
ya no encuentran ms caracteres.
Ejemplo 1. Disear un programa para leer cadena1, compuesta por un conjunto
de caracteres y cada palabra(s) separado por comillas, luego leer cadena 2 basado
en el carcter que separa cada palabra (cadena1) mediante el cual, y despus de
este carcter, se insertaren la cadena 3, y finalmente, leer cadena 3 compuesta
por una palabra que ser la que se inserta en la cadena 1 y donde corresponda.
Solucin ///vect_inse.cpp
#include <iostream.h>
void main(){ char *p; char cad1[60]; char cad2[60]; char cad3[60];
gotoxy(2,2);cout<<Ingrese cadena 1:;gets(cad1);
gotoxy(2,4);cout<<Ingrese caracter :;gets(cad2); gotoxy(2,6);cout<<Ingrese
cadena 3 :;gets(cad3); gotoxy(2,8); cout<<\n;
p=strtok(cad1,cad2);
while (p)
{ cout<<p<<cad3;
p=strtok(NULL,cad2);
}
getche() ;
}
209
4. Funcin strpbrk()
Devuelve un puntero a una subcadena de cad1, en donde se encuentra la primera
aparicin de un carcter cualquiera, contenido en cad2. Devuelve NULL si no
encuentra ningn carcter.
Sintaxis:
1. Strcmp()
Compara dos cadenas, su sintaxis es: Intstrcmp(constchar *s1, constchar*s2)
Ejemplo 1. Disear un programa para validad datos de usuario por cdigo y
clave, si el cdigo=8712D y clave=tcn.
Solucin.-//vect_strcmp.cpp
# include<iostream.h>
voidmain(){ char
codigo[10],pasw[5];
gotoxy(2,2);cout<<Ingresecodig
o :;
gets(codigo);
gotoxy(2,3);
cout<<Ingresepasword :
;gets(pasw);
if(strcmp(codigo,8712D)==0&&strcmp(pasw,tcn)==0)
210
2. Stricmp() y strcmpi()
Comparan dos cadenas, pero sin tomar en cuenta si se comparan letras maysculas
o minsculas.
Sintaxis
int strcmpi(const char *cade1, const char *cad2);
int stricmp(const char *cad1, const char * cad2);
3. Strncmp()
Compara los n primeros caracteres de dos cadenas: intstrncmp(constchar *cad1,
constchar*cad2, size_t n);
4. Strnicmp() y strncmpi()
Hacen lo mismo que strncmp(), pero no toman en cuenta el tamao de las letras.
5. Strcoll()
Hace lo mismo que strcmp(), pero toma en cuenta el juego de caracteres internacionales seleccionado en el sistema operativo.
Estas funciones devuelven un valor entero i tal que:
i>0
i<0
i==0
si cad1>cad22
si cad1<cad2
si cad1i==cad2
Notas
1. El criterio para la desigualdad es comparar las cadenas carcter a carcter, de
acuerdo a su cdigo ASCII.
2. Si el primer carcter de cad1 es mayor que cad2, cad1 es mayor que cad2.
3. Si el primer carcter de cad1 es menor que cad2, cad1 es menor que cad2.
4. Si el primer carcter de cad1 es igual que cad2, se comparan los segundos
caracteres y as sucesivamente hasta encontrar caracteres desiguales o llegar al
final de las cadenas.
5. Las funciones stricmp() y strcmpi() son las mismas; strcmpi se implementa
mediante una macro en el archivo string.h que traduce la llamada desde
strcmpi() a stricmp(). Lo mismo sucede con strncmpi() y strncmpi().
211
Aplicaciones
int c;
c=strcmp(uni,UNI); //devuelve un c>0
c=stricmp(uni,UNI); //devuelve un c==0
c=strcmpi(fiis,uni); //devuelve un c<0;
c=strncmp(uni,uni fiis,3); //devuelve un c==0
Problema 1. Disear un programa que permita leer dos cadenas y luego hacer
una comparacin entre cadenas para obtener una de las siguientes respuestas:
a. Cadena 2 es ms grande que cadena 1
b. Cadena 2 es menor que cadena 1
c. Cadena 2 es igual a cadena 1
Solucin //vect_cad_com.cpp
#include <iostream.h>
int main(void)
{// char *cad1 =cordova, *cad2=CORD; puede inicializar para comparar
char cadena1[20],cadena2[20];intptr;
gotoxy(2,2);cout<<Ingrese cadena 1: ; gets(cadena1);
gotoxy(2,3);cout<<Ingrese cadena 2 : ; gets(cadena2);
ptr = strcmpi(cadena2, cadena1);
if (ptr> 0)
{ gotoxy(2,5);
cout<<cadena2 <<cadena2<<es ms grande que cadena1:<<cadena1;
}
else
if (ptr< 0) {gotoxy(2,5);
cout<<cadena2 <<cadena2<< es menor que cadena1 :<<cadena1;
}
elseif (ptr == 0)
{ gotoxy(2,5);
cout<<cadena2 <<cadena2<< es igual a cadena1 <<cadena1;
} getche();}
212
2. Funcin strnset()
Convierte los n primeros caracteres de una cadena s en un carcter c.
Sintaxis: char *strset(char *s, char c); char *strnset(char *s, char c, int n);
Problema 1. Disear un programa que permita inicializar la cadena:
cad = 848139d es mi Password
Luego genere un reporte :
a. Los primeros seis caracteres de cad reemplazados *.
b. Todos los caracteres de cad reemplazados *
Solucin //cadena9.cpp
#include<iostream.h>
voidmain(){char *cad = 848139d es mi Password ;
strnset(cad,*,6); //convierte a partir de la posicin 6 en *
cout<<\n Solo nmeros en * <<cad<<endl<<endl; //Visualiza ******* es mi
Password
strset(cad,*); // convierte todo en *
cout<<\nToda la cadena en * <<cad;
getch(); }
213
2. Funcin strxfrm()
3. Funcin strrev()
Invierte los caracteres de una cadena.
char*strrev(char*s)
Convierte una cadena s1 en una cadena igual a la secuencia de primeros n-1
caracteres de s2
Sintaxis: size_tstrxfrm(char*s1, char*s2, size_t n);
Problema 1. Disear un programa que permita inicializar una cadena y luego
mostrar su longitud
214
Solucin //vect_strx_cad.cpp
#include <iostream.h>
intmain(void)
{ char *destino;
char *origen = Borlandc++
5.0.2;
intlong;
destino = (char *) calloc(80,
sizeof(char));
longit= strxfrm(destino, origen,
80);gotoxy(2,2);
cout<< La cadena :<<destino<< tiene una longitud :<<longit<<endl <<endl;
system(pause); }
2. Funcin strlwr()
Convierte todos los caracteres de una cadena cad1 a minsculas.
Sintaxis: char *strupr(char *cad1)
Solucin //vect_str_str_cad.cpp
#include <iostream.h>
void main() { char *cadena = lenguajes Algoritmicos, con diagrama de flujo de
datos ;
char *subcad = con; char *ptr;
ptr=strstr(cadena, subcad);cout<<ptr; getche();}
Aplicaciones
Problema 1. Escribir un programa que permita ordenar una cadena de texto en
base a sus palabras, bajo los siguientes criterios:
1. En orden alfabtico, ascendente y descendente.
2. En orden de tamao, ascendente y descendente.
Adems, que muestre el texto con sus palabras invertidas y el texto con las
palabras en orden invertido del nmero total de palabras.
Solucin//vect_dic_forma
#include<iostream.h>
void main() { char frase[80]; int k;
char espacio[]= ;
cout<<Ingrese una cadena: ;cin.getline(frase,sizeof(frase));
//Obtenemos el nmero n de palabras de la frase
char *ptr, aux[80];
strcpy(aux,frase);
int n=0;
ptr=strtok(aux,espacio);
while (ptr) {n++;
ptr=strtok(NULL,espacio);
}
//Ordenar las palabras de la frase
enumTorden {ascendente=1, descendente, longitudasc, longituddes};
//Tipos de ordenacin
char ordenada[80]; //Frase ordenada
int SW; //Bandera para el mtodo de seleccin
for (int o=ascendente; o<=longituddes; o++) {
strcpy(ordenada,frase);
216
for (int i=1; i<=n-1; i++) {
for (int j=i+1; j<=n; j++) {
char *t, *ti, *tj;
strcpy(aux,ordenada);
t=strtok(aux,espacio);
for (int k=1; (k<=i)||(k<=j)&&(t); k++) {
if (i==k) ti=t;
if (j==k) tj=t;
t=strtok(NULL,espacio);
}
switch (o) {
caseascendente:
SW=(strcmp(ti,tj)>0); break;
casedescendente:
SW=(strcmp(ti,tj)<0); break;
caselongitudasc:
SW=(strlen(ti)>strlen(tj)); break;
caselongitudes: SW=(strlen(ti)<strlen(tj)); break;
}
char aux2[80]=;
t = strtok(ordenada, espacio);
for (k=1; t; k++) {
if ((i==k)&&(SW))
strncat(aux2,tj,strlen(tj));
else if ((i==k)&&(!SW))
strncat(aux2,ti,strlen(ti));
if ((j==k)&&(SW))
strncat(aux2,ti,strlen(ti));
else if ((j==k)&&(!SW))
strncat(aux2,tj,strlen(tj));
if ((i!=k)&&(j!=k))strncat(aux2,t,strlen(t)); strcat(aux2, );
t=strtok(NULL,espacio);}
stpcpy(ordenada,aux2);
}
}
switch(o) {
case ascendente:
cout<<endl<<Palabras ordenadas en forma ascendentemente: ;
break;
case descendente:
cout<<endl<<Palabras ordenadas en forma descendentemente: ; break;
caselongitudasc:
cout<<endl<<Palabras ordenadas por tamano ascendente: ; break;
caselongituddes:
cout<<endl<<Palabras ordenadas por tamano descendente: ; break;
}
217
cout<<endl<<ordenada<<endl;
}
cout<<endl<<Palabras escritas al reves<<endl;
strcpy(aux,frase);
ptr=strtok(aux,espacio);
while (ptr)
{
cout<<strrev(ptr)<< ;
ptr=strtok(NULL,espacio);
}
cout<<endl;
cout<<endl<<Palabras de atras hacia delante<<endl;
strcpy(aux,strrev(frase));
ptr=strtok(aux,espacio);
while (ptr)
{
cout<<strrev(ptr)<< ;
ptr=strtok(NULL,espacio);
}
cout<<endl;
cout<<endl<<Total de palabras de la frase: <<n<<endl;
system(pause);
} Salida:
Problema 2. Escribir un programa que elimine los comentarios de una
frase. Llmense comentarios a todo aquello que se encuentre encerrado por
parntesis, por ejemplo la frase:
char res[80];
strcpy(res,frase);
ptr = strchr(res,();
while (ptr) {SW = 0;
c = (ptr-res);
do {
if (res[c]==)) SW--;
else if (res[c]==() SW++;
for(int i=c; i<=strlen(res)-1; i++)
res[i]=res[i+1]; res[strlen(res)]=\0;
} while (SW);
ptr = strchr(res,();
}
gotoxy(2,5);cout<<Frase sin comentarios: <<res;gotoxy(7,8);system(pause);}
COMPENDIO DE PROBLEMAS
Problema 1. Una palabra es anagrama de otra cuando se obtiene una de la otra
por permutacin de sus letras. Por ejemplo:
- pote es anagrama de tope; saco es anagrama de cosa y de ocas.
- porta es anagrama de topar, de tropa y de parto.
Problema 2. Disear un programa que permita leer un texto formado por mas de
tres lneas y luego mostrar el nmero de palabaras que tiene el texto.
Problema 3. Disear un programa que permita leer un texto, luego mostrar la
letra o letras que ms se repiten.
Problema 4. Disear un programa que permita leer un texto y una letra, si la letra
est en el texto eliminarlo, formado por ms de tres lneas y luego mostrar el
nmero de palabaras que tiene el texto.
Escribir un programa que dado un grupo de palabras pueda determinar los
conjuntos de anagramas que existen en ste.
219
220
Captulo 5
Programacin modular
Objetivos
-
-
-
-
-
-
-
5.1 Introduccin
En el presente captulo, para la solucin de problemas, nos basaremos en las
tcnicas de diseo top-down (de arriba - abajo), tcnicas que permiten organizar
nuestra aplicacin en pequeos mdulos denominados funciones.
El funcionamiento del programa modular se basa en que el programa principal
Llamador, por el nombre de la funcin que realiza una llamada(call), usando
221
222
Partes de la definicin:
1. Una funcin tiene un nico nombre, al utilizar este nombre en otras partes del
programa se pueden ejecutar los enunciados contenidos en la funcin. A esto
se le conoce como llamara la funcin. Una funcin puede ser llamada desde
otra funcin, esta tcnica define el anidamiento de funciones.
floatdatos( )
nico nombre de la funcin
223
2. Una funcin es independiente. Una funcin puede ejecutar sus tareas sin
interferencia en o de otras partes del programa.
float cuadrado (float x)
{ int x;
float resp;
if (x!=0) resp=1/x; return resp;
}
3. Una funcin ejecuta una tarea especfica. Esta es la parte fcil de la definicin.
Una tarea es un conjunto de instrucciones definido por el programador.
4. Una funcin opcionalmente devuelve un solo valor o ninguno al programa que
la llam. Cuando un programa llama a una funcin se ejecutan los enunciados
contenidos en sta, si elprograma lo requiere, stos enunciados pueden
devolver un valor al programa que llam a la funcin. Debe usar la instruccin
return (cuando no devuelve ningn valor) return (valor_a_devolver) cuando
la funcin devuelve un valor especificado por el programador.
Tipos devueltos:
1. Pueden ser: float, int, etc.
Floatcalcular( ): la funcin calcular(), devuelve un tipo de dato real.
Intfactorial(int n): la funcin factorial(int n), devuelve un tipo de dato entero.
2. Puede devolver:void es una funcin que no devuelve ningn valor.
224
#include <iostream.h>
void resta(int , int ); // Prototipo de funciones
int multiplica(int, int);
int num1, num2, resultado;
void resta(int a, int b)
{ int restan;
// variable local
restan=a-b;
gotoxy(3,7);
cout<<La resta de <<a<< - <<b<< es = <<restan<< endl;
}
int multiplica(int a, int b)
{ int producto; // variable local
producto = a *b; return producto;}
int main() // Funcin principal
{ gotoxy(3,2); cout << Ingrese 2 numeros : << endl;
gotoxy(3,4); cout<<Ingrese numero 1 = ; cin >> num1;
gotoxy(3,5); cout<<Ingrese numero 2 = ; cin >> num2;
resta(num1, num2); // llama a la funcin resta
resultado = multiplica(num1, num2); gotoxy(3,9);
cout<<El producto de <<num1<< * <<num2<< es = <<resultado<<endl;
getche();}
226
Ejemplo
int multiplica(int valor1, int valor2)
{int productol; // variable local
producto = valor1 * valor2; return producto;}
Los parmetros de la funcin, son de tipo int, llamados valor1 y valor2, son en
efecto variables de alcance local,al igual que la variable declarada como de tipo
int, llamada producto dentro del cuerpo de la funcin multiplica( ). El alcance
de una variable es simplemente el espacio dentro del cdigo fuente donde la
variable puede ser utilizada, generalmente ste espacio est limitado por el par
de llaves que sirven para encerrar las instrucciones queconforman una funcin.
228
229
231
void leerd()
{gotoxy(2,3);
cout<<Ingrese la base : ; cin>>base;
gotoxy(2,4);cout<<Ingrese la Potencia : ; cin>>pot; }
int proceso()
{poten=pow(base,pot); return poten;
}
void reporte()
{ gotoxy(3,6);cout<<El numero <<base<< elevado al <<pot<< es =
<<proceso();}
void main()
{leerd(); proceso();
reporte(); getche();}
Problema 8. Disear un programa que permita leer un nmero entero positivo y
luego calcular su factorial.
Solucin // func_fact.cpp
void leernum ();
void imprimir();
int n,facto=1; float fact ();
void leernum ()
{ do
{ gotoxy(2,5);clreol(); cout<< Ingrese un numero=;cin>>n ;
}while (n<0);}
float fact()
{ int i;
for(i=1;i<=n;i++)
{ facto=facto*i;
}
return (facto);
}
void imprimir ()
{gotoxy(2,7);
cout << El factorial de <<n<< es = <<facto;
}
void main()
{ gotoxy(4,2);cout<<FACTORIAL DE UN NUMERO ;
leernum (); fact(); imprimir(); getche();
}
Problema 9. Disear un programa que permita leer el rango de una matriz A y
luego:
232
Solucin //func_matriz_peru.cpp
#include <iostream.h>
234
# define max_l 50
void case1(); void case2(); void case3();
void case4(); void case5(); void case6();
void case7(); void case8();
int peru=0, m,n,i,j,t;char A[max_l][max_l][1];
void main()
{clrscr();
/* Se usa la variable de estado t para que informe lo siguiente:
Si t=0 no esta tratando de formar una palabra y
Si t=1 se esta tratando de formar la palabra PERU*/
cout<<\n\tIngrese la cantidad de filas : ; cin>>n;
cout<<\n\tIngrese la cantidad de columnas : ; cin>>m;
cout<<\n\tIngrese los datos de la matriz ;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
gotoxy(10+2*j,7+i); cin>>A[i][j];
} }
/*Comparo con las letra p y dependiendeo del caso llamo a una funcion
que cumple con los requerimientos*/
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if((A[i][j-1][1]==p)||(A[i+3][j-1][1]==P)){
if(((i+3)<=n)&&((j-3)>0))
case1();
if(((i+3)<=n)&&((j+3)<=m)) case2();
if(((i-3)> 0)&&((j-3)> 0))
case3();
if((j+3)<=m)
case4();
if((j-3)>0)
case5();
if(((i-3)>0)&&((j+3)<=m)) case6();
if((i+3)<=n)
case7();
if((i-3)>0)
case8();
}
}
}
gotoxy(4,13);cout<<La palabra PERU, se repite <<peru<< veces ;
getch();}
void case1(
){
if((A[i+1][j-1-1][1]==e)||(A[i+1][j-1-1][1]==E)){
if((A[i+2][j-2-1][1]==r)||(A[i+2][j-2-1][1]==R)){
if((A[i+3][j-3-1][1]==u)||(A[i+3][j-3-1][1]==U)){
peru=peru+1;
}
} }}
void case2(){
if((A[i+1][j+1-1][1]==e)||(A[i+1][j+1-1][1]==E)){
if((A[i+2][j+2-1][1]==r)||(A[i+2][j+2-1][1]==R)){
235
i f ( ( A [ i + 3 ] [ j + 3 - 1 ]
[1]==u)||(A[i+3][j+3-1][1]==U)){
peru=peru+1;
} } }}
void case3(){
i f ( ( A [ i - 1 ] [ j - 1 - 1 ]
[1]==e)||(A[i-1][j-1-1][1]==E)){
i f ( ( A [ i - 2 ] [ j - 2 - 1 ]
[1]==r)||(A[i-2][j-2-1][1]==R)){
i f ( ( A [ i - 3 ] [ j - 3 - 1 ]
[1]==u)||(A[i-3][j-3-1][1]==U)){
peru=peru+1;
}
} } }
void case4(){
if((A[i][j+1-1][1]==e)||(A[i]
[j+1-1][1]==E)){
if((A[i][j+2-1][1]==r)||(A[i][j+2-1][1]==R)){
if((A[i][j+3-1][1]==u)||(A[i][j+3-1][1]==U)){
peru=peru+1;
} } } }
void case5(){
if((A[i][j-1-1][1]==e)||(A[i][j-1-1][1]==E)){
if((A[i][j-2-1][1]==r)||(A[i][j-2-1][1]==R)){
if((A[i][j-3-1][1]==u)||(A[i][j-3-1][1]==U)){
peru=peru+1;
}
} }
}
void case6(){
if((A[i-1][j+1-1][1]==e)||(A[i-1][j+1-1][1]==E)){
if((A[i-2][j+2-1][1]==r)||(A[i-2][j+2-1][1]==R)){
if((A[i-3][j+3-1][1]==u)||(A[i-3][j+3-1][1]==U)){
peru=peru+1;
}
} }
}
void case7(){
if((A[i+1][j-1][1]==e)||(A[i+1][j-1][1]==E)){
if((A[i+2][j-1][1]==r)||(A[i+2][j-1][1]==R)){
if((A[i+3][j-1][1]==u)||(A[i+3][j-1][1]==U)){
peru=peru+1;
}
} }}
void case8(){
if((A[i-1][j-1][1]==e)||(A[i-1][j-1][1]==E))
{ if((A[i-2][j-1][1]==r)||(A[i-2][j-1][1]==R))
{ if((A[i-3][j-1][1]==u)||(A[i-3][j-1][1]==U))
236
{ peru=peru+1;
}
}
}
}
Problema 11. Disear un programa que permita mostrar la suma acumulada de
la serie 1+2+3+4+....+n. El usuario edita el primer trmino de la serie (ldi) y luego
edita el lado derecho (ldd: hasta donde desea sumar).
Solucin // func_suma_ser.cpp
void leerd(); void suma_r(); void imprimir();
int ldi,ldd,suma=0,rldi;
void leerd()
{ gotoxy(2,4);cout<<Ingrese lado izquierdo :;cin>>ldi;
gotoxy(2,5);cout<<Ingrese lado derecho :;cin>>ldd;
}
void suma_r()
{ rldi=ldi; while(ldi<=ldd)
{ suma=suma+ldi; ldi=ldi+1;}
}
void imprimir()
{gotoxy(2,7);cout<<La suma desde <<rldi<< hasta <<ldd << es = <<suma;
}
void main() {gotoxy(2,2);cout<< Suma de Serie: 1 + 2 + 3 + 4 +...+ n :;
leerd(); suma_r(); imprimir(); getche();}
Problema 12. Disear un programa que permita ingresar un nmero entero como
cadena (ejemplo num=432), luego convertir esta cadena numrica a nmero
entero y elevar al cubo el segundo dgito.
Solucin ///func_dig_cub.cpp
#include<iostream.h>
void leerd (); int procesar(); void reporte();
int n,n1,n2,p;char num[3];
void leerd()
237
b. Elementos nulos
d. Total de elementos del vector
Solucin //func_pos_neg.cpp
#include <iostream.h>
void marco(); //genera un Marco(ventana)
void leer(int n,int Vec[10]);
int contador(int n,int Vec[]);
int posit=0,nulos=0,negat=0,n,Vec[10],totalel=0;
void marco()
{ int i;
for(i=1;i<=60;i++) //diseo de las filas
{gotoxy(8+i,2);cout<<_;
gotoxy(8+i,18);cout<<_; }
for(i=1;i<=16;i++) //diseo de las columnas
{gotoxy(8,2+i);cout<<|;
gotoxy(68,2+i);cout<<|; }
}
void leer(int n,int Vec [10])
{int i;
for(i=1;i<=n;i++) { gotoxy(13,5+i);cout<<v[<<i<<]=; cin>>Vec[i];
}
238
}
int contador (int n, int Vec[10])
{ int i;
for(i=1; i<=n; i++)
{ if (Vec[i]>0) { posit++;
}
else { if(Vec[i]==0)
{ nulos++; }
else
{negat++; }
}
}
totalel=totalel+posit+nulos+negat;re
turn 0;
}
void main()
{ marco(); gotoxy(12,5); cout<<Ingrese el tamao del vector:; cin>>n;
leer(n,Vec); contador(n,Vec);
gotoxy(12,12);cout<<Total positivos = <<posit;
gotoxy(12,13);cout<<Total nulos = <<nulos;
gotoxy(12,14);cout<<Total negativos = <<negat;
gotoxy(12,16);cout<<Total elementos = <<totalel;getche();}
Problema 14. Disear un programa que permita ingresar el nmero de filas y
columnas de dos matriz A y B, luego almacenar datos de tipo entero y con estos
datos mostrar:
a. Elementos de las matrices A y B
b. Almacenar en una matriz C, la suma de las dos matrices: A+B
c. Mostrar en forma invertida cada elemento de la matriz C
Solucin // func_mat_inv.cpp
#include<iostream.h>
#define max_f 30
#define max_c 30
#define linea -----------------------------------------------------------------
void leerd ();int procesar();void reporte();
int a[max_f][max_c],b[max_f][max_c],d[max_f][max_c],t[max_f][max_c],
di[max_f][max_c],inv[max_f][max_c],f,c,i,j;
void leerd()
{cout<<Ingrese total de filas : ;cin>>f;
cout<<Ingrese total de columnas : ;cin>>c;
cout<<linea;
for(i=1;i<=f;i++)
for(j=1;j<=c;j++)
{gotoxy(18,4);cout<<Matriz A;
gotoxy(10*j,5+2*i);cout<<a[<<i<<,<<j<<]=;
cin>>a[i][j];cout<<endl;
239
}
gotoxy(35,4);cout<<+;
for(i=1;i<=f;i++)
for(j=1;j<=c;j++)
{ gotoxy(48,4);cout<< Matriz B;
gotoxy(30+10*j,5+2*i);cout<<b[<<i<<,<<j<<]=;
cin>>b[i][j];cout<<endl;
}
}
int procesar ()
{ for(i=1;i<=f;i++)
for(j=1;j<=c;j++)
{ d[i][j]=a[i][j]+b[i][j]; t[i][j]=d[i][j];
while(d[i][j]>0)
{ di[i][j]=d[i][j]%10; inv[i][j]=inv[i][j]*10+di[i][j]; d[i][j]=d[i][j]/10; } }
return 0;
}
void reporte()
{ gotoxy(8,16);cout<< Suma de Matriz C ;
for(i=1;i<=f;i++)
for(j=1;j<=c;j++)
{gotoxy(10*j,16+2*i);cout<<d[<<i<<,<<j<<]=<<t[i][j];cout<<endl;
}
gotoxy(40,16);cout<<Elementos invertidos de matriz c:;
for(i=1;i<=f;i++)
for(j=1;j<=c;j++)
{gotoxy(35+10*j,16+2*i);cout<<d[<<i<<,<<j<<]=<<inv[i][j];cout<<endl;}
getche();
}
void main()
{leerd();
procesar();
reporte(); getche();}
}
240
Orden[30];
241
{
a++;
}
resp[a]=m_orden[i];
a++;
}
else {while(Orden[b]==false)
{b--;
}
resp[b]=m_orden[i];
b--;
}
}
gotoxy(2,11);cout<<\n\n\nResultado : ;
for(i=0;i<n;i++){gotoxy(14+4*i,14);cout<<resp[i];}getch();}
Problema 16. Disear un programa que permita encontrar todas las soluciones
para la relacin: SEND + MORE = MONEY.
Solucin //func_send_more.cpp
#include <iostream.h>
int buscando(int t);
void main(){ int o,f,i,c,e,m,n,d,s,w,r,a,b;
for(o=1;o<=9;o++)
{ for(f=0;f<=9;f++)
{ for(i=0;i<=9;i++)
{ for(c=0;c<=9;c++)
{ for(e=0;e<=9;e++)
{ for(m=1;m<=9;m++)
{ for(n=0;n<=9;n++)
{ for(d=0;d<=9;d++)
{ for(s=0;s<=9;s++)
{ for(w=1;w<=9;w++)
{ for(r=0;r<=9;r++)
{ a= o*10*10*10*10*10 + f*10*10*10*10 + f*10*10*10 + i*10*10 + c*10 + e ;
b=m*10*10*10*10*10 + s*10*10*10*10 + w*10*10*10 + o*10*10 + r*10 + d ;
242
Opcin 1) Depsitos
Opcin 2) Retiros
Opcin 3) Ver saldo
Opcin 4) Salir
243
void Retiro(){
gotoxy(2,10);cout<<Cuanto dinero desea retirar...?: ;cin>>monto;
if (( saldo - monto )< 5 )
{gotoxy(2,12);cout<< Su saldo es menor al monto del retiro;
}
else { saldo -= monto;
gotoxy(2,12); cout<< Presione ENTER : ;
}
getch();
}
void Deposito( ){
gotoxy(4,10);cout<<Elegir cantidad a Depositar[10,100,200]; cin>>monto;
if ( monto == 100 || monto == 200 || monto == 10 )
{saldo += monto;
gotoxy(4,12);cout<<Dinero depositado, presione ENTER ;
getche();
}
else
{ gotoxy(4,12);cout<<El monto no es correcto;
gotoxy(4,13);cout<<Presione ENTER : ;
getch();
}}
void MostrarSaldo(){
gotoxy(4,11);cout<<Su Saldo Actual es : <<saldo;
gotoxy(2,12);cout<<Presione ENTER : ;
getch();
}
void Menu(){
char iTecla; randomize(); saldo = random(1000);
do{ do{clrscr();
gotoxy(10,2); cout<< Menu Principal ;
gotoxy(4,3);cout<<linea;
gotoxy(8,4);cout<< [1] DEPOSITOS ;
gotoxy(8,5);cout<< [2] RETIROS ;
gotoxy(8,6);cout<< [3] SALDOS ;
gotoxy(8,7);cout<< [4] SALIR ;
gotoxy(4,8);cout<<linea; gotoxy(8,10);cout<<Seleccione Opcion :;
iTecla = getche();
} while( iTecla != 1 && iTecla != 2 && iTecla != 3 && iTecla != 4);
switch( iTecla ){ case 1 : Deposito(); break;
case 2 : Retiro(); break;
case 3 : MostrarSaldo(); break;
}
} while( iTecla != 4 );
}
void Usuario()
{char Uid[12]; char Pwd[12]; int Intentos=0;
do{ time(&tiemp);
gotoxy(34,2);printf( Fecha de Consultas: %s,ctime(&tiemp));
244
gotoxy(35,3);cout<<linea;gotoxy(50,3);cout<<linea;
gotoxy(8,2);cout<< CUENTA BANCARIA ;
gotoxy(4,3);cout<<linea;
gotoxy(4,4);cout<<Sr. Ud. solo tiene 3 Intentos ;
gotoxy(4,6);cout<<Ingrese Usuario : ;cin>>Uid;
gotoxy(4,7);cout<<Ingrese Clave : ;cin>>Pwd;
if (strcmp(Uid,tcn)==0 && strcmp(Pwd,1234)==0){
gotoxy(6,9);cout<<Sr.<<Uid<< Bienvenidos al sistema ..... ;/
Intentos=0;
}
else { Intentos++;
gotoxy(6,11);cout<<Sr.le quedan <<(3-Intentos)<< intentos ; getche();
}
} while(Intentos!=0 && Intentos!=3 );
if ( Intentos == 3 ){ clrscr();
gotoxy(4,3);cout<<Ud. no puede
ingresar al sistema, hasta Luego;
getche();
}
else
Menu();
}
void main()
{ Usuario();
}
Primero validar datos de usuario. En
la primera corrida, observe que se
comete un error, con lo cual le genera
el mensaje Sr. le quedan 2 intentos.
Suponga que en la seguna corrida
Los datos son correctos, entonces
se presentan las opciones para el
mantenimiento. Si selecciona la
opcion [ 1 ], le solicita que ingrese la
cantidad a depositar (en mi caso 200).
As puede continuar procesando las
opciones [2],[3] y [4].
Problema 18. Disear un programa que permita leer las coordenadasde dospuntos
A(x1,y1), B(x2,y2) y calcular la distancia entre los dos puntos descritos.
Solucin //func_dist.cpp
#include <iostream.h>
float distanciaxy(float x1, float y1,float x2, float y2);
float x1,y1,x2,y2;
245
float salida;
float distanciaxy(float x1, float
y1,float x2, float y2)
{ float resultado,intermedio;
intermedio=pow(x1x2,2)+pow(y1-y2,2);
resultado =sqrt(intermedio);
return (resultado); }
voidmain(){clrscr();
gotoxy(2,2);cout<<DISTANCIA
ENTRE DOS PUNTOS;
gotoxy(2,3);cout<<PUNTO A(x1,y1);
gotoxy(2,4);cout<<Ingrese el valor de x1 :;cin >>x1;
gotoxy(2,5);cout<<ingrese el valor de y1 :;cin >>y1;
gotoxy(2,7);
cout<<PUNTO B(x2,y2);
gotoxy(2,9);
cout<<Ingrese el valor de x2 :;
cin >>x2;
gotoxy(2,10);cout<<Ingrese el valor de y2:;cin >>y2;
salida=distanciaxy(x1,y1,x2,y2);
gotoxy(2,12); cout<<La distancia es= <<salida; getch();}
Solucin //func_func_ord.cpp
# include<iostream.h>
void entradas(int& a , int& b);
void intercambia(int& var1 ,int& var2);
void Ordena(int& n ,int& m);
void imprimir(int res1,int res2 );
void main(){int a, b;
gotoxy(5,2);cout<<FUNCIONES
QUE
LLAMAN
ABSTRACCION;
entradas(a, b); Ordena(a, b); imprimir(a, b); getche();
246
FUNCIONES:
}
void entradas(int& aa , int& bb)
{gotoxy(2,4);cout<<Ingrese primer numero :;cin>>aa;
gotoxy(2,5);cout<<Ingrese segundo numero :;cin>>bb; }
void intercambia(int& var1 ,int& var2)
{int aux;aux=var1;var1=var2;var2=aux;}
void Ordena(int& n ,int& m)
{ if(n>m) intercambia(n,m);}
void imprimir(int res1,int res2 )
{ gotoxy(2,7);cout<<los numeros ordenados son :<<res1<< <<res2<<endl;}
else return(0);
}
void main()
{ float x1,y1,x2,y2,m,x,y,r;
gotoxy(2,2); cout<<Ingrese las coordenadas del punta A(x1,y1):;
gotoxy(2,4); cout<<x1=; cin>>x1;
gotoxy(2,5); cout<<y1=; cin>>y1;
gotoxy(14,5);cout<<Punto: A(<<x1<<,<<y1<<);
gotoxy(2,7); cout<<Ingrese las coordenadas del punta B(x2,y2):;
gotoxy(2,9); cout<<x2=; cin>>x2;
gotoxy(2,10);cout<<y2=; cin>>y2;
gotoxy(14,10);cout<< Punto: B(<<x2<<,<<y2<<);
m = pendiente(x1,y1,x2,y2);
gotoxy(2,12);cout<<Calculando pendiente m =(y2-y1/x2-x1). de donde: m=
<<m;
gotoxy(2,13);cout<<Reemplazando en ecuacion de la recta L : y-y1=m(x-x1);
gotoxy(2,14);cout<< Obtenemos : y <<-<<y1<<=<<m<<(x<<-<<x1<<);
gotoxy(2,15);cout<<************************************************************;
gotoxy(2,17);cout<<Verificando si un punto pertenece a la recta L ;
gotoxy(2,18);cout<<Ingrese las coordenadas de un punto P(x,y):;
gotoxy(2,19);cout<<x=; cin>>x;
gotoxy(2,20);cout<<y=; cin>>y;
r = recta(y,y1,m,x,x1);
if(r==1)
{gotoxy(2,22);cout<<El punto P(<<x<<,<<y<<) Si pertenece a la recta L;
} else
{ gotoxy(2,22);cout<<El punto P(<<x<<,<<y<<), No pertenece a la recta L ;
} getche();
}
249
case 8 : resp = 8; break;
case 9 : resp = 9; break;
case 10 : resp = A; break;
case 11 : resp = B; break;
case 12 : resp = C; break; case 13 : resp = D; break;
case 14 : resp = E; break;
case 15 : resp = F; break;
}
break; }
return (resp);}
void main(){ unsigned int numero;
char opc;
gotoxy(2,2);cout<<CAMBIANDO BASE DE UN NUMERO ;
gotoxy(4,4);cout<<Ingrese un numero : ; cin>>numero;
gotoxy(4,6);cout<< [H] Hexadecimal ;
gotoxy(4,7);cout<< [O] Octal
;
gotoxy(4,8);cout<< [B] Binario <<endl;
gotoxy(4,9); cout<< [Esc] Salir <<endl;
gotoxy(4,11); cout<< Elija una opcion:; cin>>opc;
switch (opc)
{case b: case B : gotoxy(4,13);cout<< En Sistema Binario ;f_base(numero,2);
break;
case o: case O : gotoxy(4,13);cout<< En Sistema Octal ;f_base(numero,8);
break;
case h: case H : gotoxy(4,13);cout<< En Sistema Hexadecimal
;f_
base(numero,16); break;
case s: case S : break;default: cout<<opcin invalida;}
getche();
}
Solucin //func_Facultad_cursos.cpp
#include <iostream.h> #include <stdlib.h>
#include <string.h>
void calculo_promed();
int n,ca,i,j,prom,s,nota,cdesap;
char rpta,curso[20];
void calculo_promed()
{ do {cout<<Ingrese el nombre del curso:;
cin>>curso;
cdesap=0;
ca=0;
for(i=1;i<=8;i++)
{ cout<<\nCiclo : <<i<<endl;
cout<<Ingrese la cantidad de alumnos:; cin>>n;
s=0;
cout<<Ingrese las notas de los alumnos:\n;
for(j=1;j<=n;j++)
{cout<<Alumno <<j<<:;
cin>>nota;
s=s+nota;}
prom=s/n;
cout<<\nEl promedio de este ciclo es:<<prom<<endl;
if(prom<=10) { cdesap=cdesap+1;
}
}
cout<<\nNumero ciclos aprobados:<<8-cdesap<<endl;
cout<<\nNumero ciclos desaprobados:<<cdesap<<endl;
if(cdesap>=5)
{ puts(curso);
cout<<\nEl curso tiene problemas<<endl;
}
else { puts(curso);
cout<<\nEl curso no tiene
problemas<<endl;
}
cout<<\n\ Desea ingresar
otro curso [s/n]:; cin>>rpta;
if ((rpta==s)||(rpta==S))
{getchar();
}
}
while((rpta==s)||(rpta==
S));
}
void main()
{calculo_promed();
}
252
Al sur
: S/.30
Al oriente: S/.22
{suma=suma+ventas[i][j];
suma_venta=suma_venta+ventas[i][j]*costo[j];
}
cout<<\t\ Pasajeros totales = <<suma<<endl;
cout<<\t\ Monto total = <<suma_venta<<endl;
cout<<\n\Presione Tecla para continuar....<<endl;getch();
cout<<\n\ Mayor ventas de boletos es de ;
suma=Mayor(numero_vendedor,4,ventas,false);
cout<<suma<< del:\n\n;
Comparar(suma,numero_vendedor,4,vendedor,ventas,false);
cout<<\n\t Presione una Tecla para continuar....<<endl;getch();
cout<<\n\t Servicio que vendio mas boletos y el vendedor : \n\n;
suma=Mayor(numero_vendedor,4,ventas,true);
cout<<\tLa mayor venta de un servicio es <<suma<< del :<<endl;cout<<\n;
Comparar(suma,numero_vendedor,4,vendedor,ventas,true);
cout<<\n\tPresione Tecla para continuar....<<endl;getch();
cout<<\n\t Servicio que recaudo mas dinero y el vendedor : \n\n;
suma=0;
for(i=0;i<numero_vendedor;i++)
for(j=0;j<4;j++)
if (suma<ventas[i][j]*costo[j])
suma=ventas[i][j]*costo[j];
cout<<\t El dinero que mas se recaudo es de <<suma<< del : <<endl;
cout<<\n;
for(i=0;i<numero_vendedor;i++)
for(j=0;j<4;j++)
if (suma==ventas[i][j]*costo[j])
cout<<\tServicio <<oficina[j]<< del vendedor <<vendedor[i]<<endl;
cout<<\n\t\Presione una Tecla para salir :<<endl;getch();
} }
void Leer_datos(int &n, cadena v[],int ve[max][4])
{int i,j;
cout<<\n\t Ingrese Numero de Vendedores : ; cin>>n;
for (i=0;i<n;i++)
{cout<<\n\t Nombre del vendedor <<(i+1)<< : ; gets(v[i]);
cout<<\n\t Ventas de boletos del vendedor <<v[i]<< : <<endl;
for (j=0;j<4;j++)
{cout<<\n\tBoletos vendidos hacia el <<oficina[j]<<=; cin>>ve[i][j];
}
} }
bool Ingreso_usuar_sistema()
{int clave,intentos=3;
bool flag=false;
do {clrscr();gotoxy(2,2);cout<< MODULODE VALIDACION DE DATOS ;
gotoxy(2,4);cout<<Ingrese Clave : ;cin>>clave;
if (clave==1234)
flag=true;
254
else
{gotoxy(4,6);intentos--;
cout<<Clave incorrecta, le quedan <<intentos << intentos;
gotoxy(4,8);cout<< Presione cualquier tecla.......; getch();
} if (flag) intentos=0;
//exit(0);
}while(intentos!=0); return flag;
}
int Sumar(int fila,int columna,int v[max][4],bool flag)
{int i,suma=0;
if (flag)
for(i=0;i<columna;i++)
suma=suma+v[fila][i];
else
for(i=0;i<fila;i++)
suma=suma+v[i][columna];
return suma;
}
int Mayor(int fila,int columna,int v[max][4],bool flag)
{int i,j,numero,aux;
if (flag)
{numero=v[0][0];
for(i=0;i<fila;i++)
for(j=0;j<columna;j++)
{aux=v[i][j];
if (numero<aux) numero=aux;
}
}
else
{numero=Sumar(0,columna,v,true);
for(i=1;i<fila;i++)
{aux=Sumar(i,columna,v,true);
if (numero<aux) numero=aux;
}
}
return numero;
}
void Comparar(int numero,int fila,int columna,cadena v[],int ve[max][4],bool
flag)
{int i,j,aux; if (flag)
{for(i=0;i<fila;i++)
for(j=0;j<columna;j++)
{aux=ve[i][j]; if(numero==aux)
cout<<\t\ Vendedor <<v[i]<< con servicio al <<oficina[j]<<endl;
}
}
else
{for(i=0;i<fila;i++){aux=Sumar(i,columna,ve,true); if(numero==aux) cout<<\t
255
Vendedor <<v[i]<<endl;
}
}
256
#include<iostream.h>
# define max_el 100
void LeerMatriz (int matriz[10][10], int f, int c);
void ReporteMatriz(int matriz[10][10], int f, int c);
void OrdenarMatriz(int matriz[10][10], int f, int c);
void MostarDatosMatriz(int matriz[10][10], int f, int c);
void OrdenarVector (int vector[10], int n);
int genera[30][30], n, m;
void LeerMatriz(int matriz[10][10], int f, int c)
{ int i, j;
srand(10);//reinicializa el numero aleatorio
for(i=1; i<= f; i++)
{ for(j=1; j<=c; j++)
{ matriz[i][j]=rand()%10; }
cout<<\n;
} getche();
}
void OrdenarMatriz(int matriz[][10], int f, int c)
{ int vector[max_el ], i, j, k=1; // copiando elementos de la matriz en un vector
for(i=1; i<= f; i++)
for(j=1; j<= c; j++)
{ vector[k]=matriz[i][j]; k++; }
//Ordenar el Vector
OrdenarVector(vector, k); //Pasar los datos ordenados del vector a la Matriz
k=1;
for(i=1; i<= f; i++)
for(j=1; j<= c; j++)
matriz[i][j]=vector[k];
k++;}
}
void MostarDatosMatriz(int matriz[10][10], int f, int c)
{ int i, j;srand(10);//reinicializa el numero aleatorio
for(i=1; i<= f; i++)
{ for(j=1; j<=c; j++)
cout<<matriz[i][j]<<\t; cout<<\n;
}
}
void OrdenarVector(int vector[], int
n)
{ int i, j, aux;
for(i=1; i<n-2; i++)
{ for(j=1; j<n-1-i; j++)
{ if(vector[j] > vector[j+1])
{ aux=vector[j]; vector[j]=vector[j+1];
vector[j+1]=aux; } }}}
void main()
257
258
for(i=1;i<=n;i++){cout<<\nNumero[<<i<<]=; cin>>datos[i];
for(j=1;j<=datos[i];j++)
{if (datos[i]%j==0)
{cout<<El numero << datos[i]<< tiene como divisores a <<j<<endl;
}}
}
return 0; }
void main(){ gotoxy(6,2);cout<< DIVISORES UN NUMEROS ;
gotoxy(2,3);cout<<linea; cantidad_num (); divisores(); getch(); }
Salida inicialmente, le solicita que ingrese n, si usted ingresa un nmero menor
que 0 o mayor que 100, entonces el sistema enva el mensaje Nmero fuera de
rango, vuelva a Ingresar . Vea como ejemplo para n=3.
1
si n = 0
n(n-1) si n 0
Caso base
Caso recursivo
259
Aplicaciones
Problema 1. Disear un programa que permita ingresar un nmero entero
positivo y luego, en forma recursiva, generar un reporte de los elementos a partir
del nmero ingresado hasta terminar en cero (0).
Solucin //func_rec_serie.cpp
#include <iostream.h>
# define linea ------------------
int resp;int n,i=0;
void recursiva(int i);
void recursiva(int i)
{ if(i<=n)
{ recursiva(i+1);
cout<<i<< ;
}}
void main()
260
{gotoxy(4,2);cout<<RECURSIVIDAD DESCENDENTE;
gotoxy(2,3);cout<<linea;
gotoxy(4,5);cout<<Ingrese el numero:;cin>>n;
gotoxy(4,7);cout<<Serie Descendente: ;recursiva(0);getche();}
Problema 2. Disear un programa que permita leer un nmero entero positivo y
luego, en forma recursiva, calcular su factorial e indicar el nmero de veces que
se llama a la funcin recursiva por su nombre.
Solucin //func_rec_fact.cpp
#include <iostream.h>
void leer(int ); float factorial(int ); void imprimir();
int n,i,resp,j=1;
void leer(int )
{ gotoxy(2,4);cout<<Ingrese numero
:;cin>>n;return ;
}
float factorial(int n)
{ if ((n==0)||(n==1))
resp=1;
else { resp=(n*factorial(n-1));
j++;
}
return(resp);}
void imprimir()
{gotoxy(2,8);cout<<El factorial de
<< n<< es = <<factorial(n); }
void main()
{gotoxy(2,2);cout<<FACTORIAL EN FORMA RECURSIVA;
leer(n); factorial(n); gotoxy(2,6);
cout <<Usando el numero <<n<< se llamara a la funcion factorial <<j<<
veces << endl; imprimir(); getche();
}
Problema 3. Disear un programa que permita ingresar una cadena de n
caracteres, luego el programa debe solicitar al usuario que ingrese un carcter,
mediante l se debe generar un
reporte del nmero de veces que se
repite el carcter ingresado.
Solucin // func_rec_letras.cpp
# include<iostream.h>
int contador(char letra,char[]);
int contador(char letra, char cad[])
{if (cad[0]==\0) return 0;
else if(letra==cad[0])
return 1 + contador(letra,&cad[1]) ;
261
n!=
1
si n = 0
n(n-1) si n 0
Caso base
Caso recursivo
else
return contador(letra,&cad[1]);
}
void main()
{ char letra,cade[80];
gotoxy(3,3);cout<<Ingrese cadena : ; gets(cade);
gotoxy(3,4); cout<<Ingrese caracter a contar : ;
letra=getchar(); gotoxy(2,6);
cout<<El caracter <<letra<< se repite <<contador(letra,cade)<< veces en la
cadena :<<cade; getche();
}
Problema 4. Disear un programa que permita ingresar un nmero entero (base)
y un nmero entero m (para mostrar el nmero base su potencia desde cero hasta
el valor de m). Mostrar la potencia de un nmero en forma recursiva.
Solucin //func_rec_pote1.cpp
# include<iostream.h>
int potencia(int x , int n);
int potencia(int x , int n)
{ if (n<0) { cout<<Base de la potencia
no es valida:; exit(1); }
if(n>0)
return (x*potencia(x,n-1)); return(1);}
int main(){ int x,m;gotoxy(5,2);
cout<<FUNCION RECURSIVA ;
gotoxy(5,4);cout<<Ingrese
base
:;cin>>x;
gotoxy(5,5);
cout<<Ingresepotencia :;cin>>m;
for(int i=0;i<m;i++)
{cout<<Numero <<x << a la
potencia <<i<< es <<potencia(x,i)<<endl;
} // return 0; getche(); }
1
si b = 0
a(ab-1) si b > 0
262
<<exp<<es=
263
264
Solucin //func_rec_c++.cpp
#include<iostream.h>
void rotaciones(char s[],int n);void permutaciones(char s[],int n);
void main()
{ cout<<\n Permutaciones de la palabra NUI<<endl<<endl;
char s[]=NUI; int n=strlen(s);per
mutaciones(s,n);getche();}
void rotaciones(char s[], int n)
{ char c; int i; c=s[0];
for (i=0;i<n-1;i++)
s[i]=s[i+1]; s[n-1]=c;}
void permutaciones(char s[], int n)
{ int i; for(i=0;i<n;i++)
if(n==2)
{ cout<<s<< ;rotaciones(s,n);
}
else{permutaciones(s,n-1); rotaciones(s,n);
}}
Compendio de problemas
Problema 1. Disear un programa que permita ingresar datos de n alumnos
(n<=1000) por apellidos, nombres, cdigo, edad y sus evaluaciones respectivas:
tres prcticas calificadas y dos exmenes. En la figura adjunta se ilustra el ingreso
de datos por alumno.
Genere los siguientes reportes que permita conocer datos procesados usando los
siguientes subprogramas:
longitud_Vector(b, m): subprograma para lectura del tamao del vector o de la
matriz.
lectura_Edades(b,m): subprograma para lectura de edades en el rango 10..99. En
forma anloga, crear nuevas estructuras para almacenar los datos mostrados en
la figura adjunta.
265
Ordena(b[, n): subprograma que ordena las edades en forma ascendente (si
cambia la edad, tambin debe cambiar el resto de datos, inclusive la posicin
original como la actual de cada registro).
pares_impares(b,n): subprograma (funcin) que devuelve informacin de
vectores con edades pares e impares, asimismo, la secuencia de edades que
forman en cada vector.
reportes(): subprograma (procedimiento) que realiza un reporte de edades
ordenadas en forma ascendente.
Problema 2. Disear un programa
usando la tcnica de subprogramas,
que permita leer datos de alumnos por
nombres y edad de n alumnos (n<=1000),
luego genere los siguientes reportes
mostrados segn las grficas:
1. Subprograma para hacer lectura del
total de alumnos y subprograma para
hacer lectura de sus datos respectivos.
2. Subprograma que permita hacer reporte de datos de alumnos incluyendo la
ubicacin inicial.
266
Apellidos
Asignatura
Seccin
Prctica 1
Prctica 2
Prctica 3
Apellidos
Asignatura
Seccin
Prctica 1
Prctica 2
Prctica 3
Menor
Promedio
268
Apellidos
Asignatura
Seccin
Prctica 1
Prctica 2
Prctica 3
Menor
Promedio
270
271
272
Captulo 6
Registros (struct)
OBJETIVOS
-
-
-
-
-
-
6 .1 Introduccin
Un campo de la informtica es el procesamiento de datos reales, tales como
empleados, alumnos, vehculo, etc. Este tipo de informacin ser procesada con
mucha facilidad usando la tcnica de registro (struct), pero el procesamiento
solo se hace a nivel de memoria RAM.
273
Entidad y atributos
Entidad: Objeto del mundo real, con existencia independiente y distinguible de
otros, del que queremos almacenar informacin en la base de datos.
Atributo o campo: propiedades especficas de cada entidad para describirla.
274
Empleado
Cdigo
nombre
89760K
Ana
apellidos
Salas
Entero(int)
edad
30
sueldo
1209,4
sexo
F
Real (float)
Structnombre_tipo
{ tipo_dato_1 campo_nombre1;
tipo_dato_2 campo_nombre2;
....................................................
tipo_dato_n campo_nombre_n;
};
donde:
1. nombre_tipo: nombre de la estructura o modelo creado, bajo el cual servir
para crear las diversas instancias de la estructura.
2. tipo_dato_1, tipo_dato_2,..., tipo_dato_n: son los tipos de datos respectivos de
cada dato miembro.
3. campo_nombre_1,campo_nombre_2,...,campo_nombre_n son los nombres
respectivos.
275
As, las variables reales con las que se proces los datos son: instancia_1,
instancia_2,...,instancia_n y no nombre_tipo, el cual slo define la estructura de
cada una de aqullas.
Tambin es posible declarar las instancias del tipo al final de la declaracin de la
estructura:
struct nombre_tipo
{ <miembros>
} instancia_1,instancia_2,...,instancia_n;
Usando la estructura Empleado, se tiene la siguiente sintaxis:
struct Empleado
{ char codigo[10];
char apellidos[20], sexo;
int edad;
float sueldo;
} empl_1 empl_2, empl_3;
donde: empl_1 empl_2, empl_3, son las variables respectivas.
Pero puede mejorarse el almacenenamiento de los datos de la estructura
empleada, es decir, se debe almacenar en un vector de longitiud definida por el
usuario, de tal manera que cada registro sea un elemento del vector, para esto,
definir la instancia tipo registo: Lista_empleados[3]
Operador punto
nomb_var_de_estructura.nombre_var_miembro
Como se mencion, para trabajar con estructuras anidadas, se utilizar el punto
. varias veces para acceder a los miembros de la estructura ms interna.
struct Empleado
{char codigo[10];char apellidos[20], sexo;
int edad; float sueldo;
} Lista_empleado[4] // el vector cuyos elementos seran registros
276
6.6 Aplicaciones
Problema 1. Disear un programa que permita almacenar, en un vector de tamao
mximo 100, datos de n alumnos (n definido por usuario), donde la informacin
del alumno consta de: cdigo, nombres y edad. Genere reportes para conocer:
a. Total de alumnos con edades pares.
b. Total de alumnos con edades impares.
c. Listado de alumnos ordenados en forma ascendente por edad.
Solucin //struct_alumnos.cpp
# include<iostream.h>
# define maxal 100
# define linea ----------------------------------------------------------
struct alumnos
{ char codigo[10]; char nombre[20]; int edad;
};
void main()
{ struct alumnos aux,datos[maxal];
int i,j,n,par=0,impar=0;
gotoxy(2,2);cout<<Ingrese nmero de alumnos: ;cin>>n;
for(i=1;i<=n;i++)
{ cout<<\n\tAlumno[<<i<<]<<endl;
cout<<\tCodigo = ;gets(datos[i].codigo);
cout<<\tNombre = ;gets(datos[i].nombre);
cout<<\tedad = ;cin>>datos[i].edad; cout<<\n;
}
for(i=1;i<=n-1;i++)
{ for(j=i+1;j<=n;j++)
{ if (datos[i].edad>datos[j].edad)
{ aux=datos[i];datos[i]=datos[j];
datos[j]=aux;
} } }
for(i=1;i<=n;i++)
{ if (datos[i].edad % 2==0)
{ par++;
}
else{ impar++;
}
}
clrscr();
gotoxy(2,1);cout<<REPORTE DE ALUMNOS ; gotoxy(1,2);cout<<linea ;
gotoxy(2,4);cout<<Total del alumnos con edad par : <<par;
gotoxy(2,5);cout<<Total del alumnos con edad impar : <<impar;
gotoxy(2,7); cout<<REPORTE DE ALUMNOS ORDENADOS POR EDAD
EN FORMA ASCENDENTE;
277
Nombre
Edad<<endl;
gotoxy(2,9); cout<<linea ;
for(i=1;i<=n;i++) { gotoxy(4,10+i);
cout<<datos[i].codigo<< <<datos[i].nombre<< <<datos[i].edad;
getche();}
do{gotoxy(5,7);clreol();cout<< Examen Parcial: ;cin>>datos[i].ex1;
}while(datos[i].ex1<0 || datos[i].ex1>20);
do{ gotoxy(5,8);clreol();cout<< Examen Final: ;cin>>datos[i].ex2;
}while(datos[i].ex2<0 || datos[i].ex2>20);
do{ gotoxy(5,9);clreol();cout<< Practica 1 : ;cin>>dates[i].p1;
}while(dates[i].p1<0 || dates[i].p1>20);
do{ gotoxy(5,10);clreol();cout<< Practica 2 : ;cin>>dates[i].p2;
}while(dates[i].p2<0 || dates[i].p2>20);
do{gotoxy(5,11);clreol(); cout<< Practica 3 : ;cin>>dates[i].p3;
}while(dates[i].p3<0 || dates[i].p3>20);
clrscr();
dates[i].pp=(dates[i].p1+datos[i].p2+datos[i].p3)/3;
datos[i].pf=(datos[i].ex1 + datos[i].ex2 + datos[i].pp)/3;
} // buscando alumnos aprobados y desaprobados
clrscr();
for(i=1; i<=n; i++)
{if(dates[i].pf>10.5)
{ aprob++;
}
else{ desap++;
}
}
gotoxy(2,13); cout<<=> Total de Alumnos Aprobados: <<aprob<<endl;
gotoxy(2,14); cout<<=> Total de Alumnos Desaprobados: <<desap<<endl;
for(i=1; i<=n; i++)
{gotoxy(2,2);
cout<<Apellido;gotoxy(12,2); cout<<Nombre ;
gotoxy(20,2); cout<<Cdigo ;gotoxy(29,2); cout<<Edad ;
gotoxy(35,2); cout<<Ex_P; gotoxy(41,2); cout<<Ex_F;
gotoxy(47,2); cout<<Prom_p ;gotoxy(56,2); cout<<Promedio_f;
gotoxy(68,2); cout<<Condicin;gotoxy(1,3); cout<<linea;
gotoxy(2,3+i); cout<<dates[i].apellido;gotoxy(12,3+i); cout<<dates[i].nombre;
gotoxy(21,3+i); cout<<dates[i].codigo;gotoxy(30,3+i); cout<<dates[i].edad;
gotoxy(36,3+i); cout<<dates[i].ex1;gotoxy(42,3+i); cout<<dates[i].ex2;
gotoxy(48,3+i); cout<<dates[i].pp;gotoxy(58,3+i); cout<<dates[i].pf;
if(dates[i].pf>10.5)
{ gotoxy(68,3+i); cout<<\APROBO\<<endl;
}
else
{ gotoxy(68,3+i); cout<<\DESAPROBO\<<endl;
}
}
getch();
}
279
Problema 3. Disear un programa que permita crear tres funciones y que realicen
los siguientes procesos:
leer_reg(): permite almacenar en un vector de tamao mximo tres personas, con
los siguientes datos: nombre, edad, sexo, estatura, color de piel, color de ojos y
nacionalidad.
ordenar(): permite ordenar los registros por nombre.
listar(): permite generar reportes.
Solucin //struct_persona.cpp
# define linea ---------------------------------------------------------------
struct persona
{char nombre[30], sexo, piel[10], ojos[10], nacionalidad[15];
int edad, altura;
}inf[70];
//Prototipos de funciones
void leer_reg();void ordenar();void listar();
voidmain(){ char opcion;
do{clrscr();gotoxy(21,9);cout<<ELIJA UNA OPCIN ;gotoxy(10,10);cout<< linea;
gotoxy(27,12);cout<<[A] Ingresar Datos;gotoxy(27,13);cout<<[B] Ordenar;
gotoxy(27,14);cout<<[C] Listar;gotoxy(27,15);cout<<[T] Terminar\n\n\n\n\
n\n;
opcion=tolower(getche());
switch(opcion)
{ case t:return 0;case a:leer_reg();
break;case b:ordenar();break;
case c:listar();break;}
}while(opcion!=t);return 0;
}
void leer_reg()
{ int i;
for(i=0;i<cantidad_p;i++){clrscr();flushall();
280
281
282
}
}
clrscr();
cout<<REPORTES DE ALUMNOS POR APELLIDOS, NUMERO DE CURSOS,
ESTADO Y NOTA FINAL<<endl;
for(i=0;i<cantidad;i++)
{ cout<<\n\n\t\t El alumno <<alumno[i].apellido;
cout<< llevo <<alumno[i].numero_curso<< cursos : \n;
for(j=0;j<alumno[i].numero_curso;j++)
{cout<<\t\t\t Su curso <<alumno[i].curso[j].nombre_curso;
if (alumno[i].curso[j].pf>=10.0)
cout<< Aprobo con <<alumno[i].curso[j].pf;
else
cout<< Desaprob con <<alumno[i].curso[j].pf;
}
getch();
}
}
Entrada de datos y salida de datos
Problema 5. Disear un programa que permita crear tres funciones para procesar
registros de n alumnos (n definido por usuario), donde cada funcin realiza los
siguientes procesos:
Ingresa(): permite ingresar registros de alumnos por nombre y edad en un vector
de tamao 100. El usuario define la cantidad real de registros a procesar.
imprime(): genera un reporte de todos los registros ingresados.
Mayoredad(): busca el alumno con mayor edad.
Solucin//STRUCT_Al_mayor.cpp
#include<conio.h>
284
Reporte de registros
{gotoxy(14,20+i);cout<<lista[i].cod;
gotoxy(28,20+i);cout<<lista[i].
apell;
gotoxy(50,20+i);cout<<lista[i].nomb; gotoxy(65,20+i);cout<<lista[i].edad;
}
for(k=1;k<=59;k++)
{ gotoxy(k+10,18);cout<<_;
gotoxy(k+10,16);cout<<_;
gotoxy(k+10,20);cout<<_;
gotoxy(k+10,20+i);cout<<_;}
for(l=1;l<=(i+5);l++)
{ gotoxy(10,15+l);cout<<|;
if(l<=(i+3))
{
gotoxy(25,17+l);cout<<|;
gotoxy(47,17+l);cout<<|;
gotoxy(62,17+l);cout<<|;
}
gotoxy(70,15+l);cout<<|; }
} break;
case 7:{ system(cls);
marco();
for(i=1;i<=(n-1);i++)
for(m=(i+1);m<=n;m++){ if(strcmp(lista[i].apell,lista[m].apell)>0)
{aux2=lista[i];
lista[i]=lista[m];
lista[m]=aux2; }
}
gotoxy(12,17);cout<< REPORTE POR APELLIDO;
gotoxy(34,17);cout<< Esta usando el ARCHIVO :<<arch;
gotoxy(14,19);cout<<Codigo;
gotoxy(28,19);cout<<Apellidos;
gotoxy(50,19);cout<<Nombres;
gotoxy(65,19);cout<<Edad;
for(i=1;i<=n;i++)
{
gotoxy(14,20+i);cout<<lista[i].cod;
gotoxy(28,20+i);cout<<lista[i].apell;
gotoxy(50,20+i);cout<<lista[i].nomb;
gotoxy(65,20+i);cout<<lista[i].edad;
}// marcos Horizontales.
for(k=1;k<=59;k++)
{gotoxy(k+10,18);cout<<_;
gotoxy(k+10,16);cout<<_;
gotoxy(k+10,20);cout<<_;
gotoxy(k+10,20+i);cout<<_;
}
for(l=1;l<=(i+5);l++)
{gotoxy(10,13+l);cout<<|;
if(l<=(i+3)) {gotoxy(25,17+l);cout<<|; gotoxy(47,17+l);cout<<|;
gotoxy(62,17+l);cout<<|; }
gotoxy(70,15+l);cout<<|;} } break;
case 8:{marco();
gotoxy(22,5);cout<< REPORTE SEGUN ELECCIN DE DATOS ;
gotoxy(26,7);cout<< MEN DE OPCIONES ;
do {gotoxy(14,9);cout<<< 1 > Por Edad;
gotoxy(14,10);cout<<< 2 > Por Cdigo;
289
gotoxy(14,11);cout<<< 3 > por Apellidos;
gotoxy(14,12);cout<<Ingrese Opcin ;cin>>opc1;
switch(opc1)
{ case 1:
{clrscr(); marco();
gotoxy(28,5);cout<< REPORTE SEGN EDAD ;
gotoxy(35,6);cout<< Esta usando el ARCHIVO: <<arch;
gotoxy(28,8);cout<<Ingrese su edad ;cin>>edadal;clrscr();
for(i=1;i<=n;i++)
{ if(lista[i].edad==edadal)
{ gotoxy(25,17);cout<<SISTEMA DE CONSULTAS POR EDAD;
gotoxy(14,19);cout<<Codigo;
gotoxy(28,19);cout<<Apellid
os;
gotoxy(50,19);cout<<Nombres;
gotoxy(65,19);cout<<Edadgotoxy(14,20+i);cout<<lista[i].cod;
gotoxy(28,20+i);cout<<lista[i].apell;
gotoxy(50,20+i);cout<<lista[i].nomb; otoxy(65,20+i);cout<<lista[i].edad;
}
}
for(k=1;k<=59;k++)
{ gotoxy(k+10,18);cout<<_;
gotoxy(k+10,16);cout<<_;
gotoxy(k+10,20);cout<<_;
gotoxy(k+10,20+i);cout<<_; }
for(l=1;l<=(i+5);l++)
{ gotoxy(11,15+l);cout<<|;
if(l<=(i+3))
{ gotoxy(25,17+l);cout<<|;
gotoxy(47,17+l);cout<<|;
gotoxy(62,17+l);cout<<|; }
gotoxy(70,15+l);cout<<|;}
gotoxy(50,16+l);cout<<Desea Salir (s/n):;cin>>rpta1;clrscr(); marco();
} break;
case 2:
{clrscr(); marco();
gotoxy(28,5);cout<< REPORTE SEGN CDIGO ;
gotoxy(30,14);cout<<Ingrese su Cdigo ;cin>>codi;clrscr();
for(i=1;i<=n;i++)
{if(atoi(lista[i].cod)==codi)
{ gotoxy(11,15);cout<< ARCHIVO : <<arch;
gotoxy(25,17);cout<<SISTEMA DE CONSULTAS POR CDIGO;
gotoxy(14,19);cout<<Cdigo;
gotoxy(28,19);cout<<Apellidos;
gotoxy(50,19);cout<<Nombres; gotoxy(65,19);cout<<Edad;
gotoxy(14,20+i);cout<<lista[i].cod; gotoxy(28,20+i);cout<<lista[i].apell;
gotoxy(50,20+i);cout<<lista[i].nomb; gotoxy(65,20+i);cout<<lista[i].edad;
} }
for(k=1;k<=59;k++)
{ gotoxy(k+10,18);cout<<_;
gotoxy(k+10,16);cout<<_;
gotoxy(k+10,20);cout<<_;
gotoxy(k+10,20+i);cout<<_;}
for(l=1;l<=(i+5);l++)
290
{gotoxy(11,15+l);cout<<|;
if(l<=(i+3))
{ gotoxy(25,17+l);cout<<|; gotoxy(47,17+l);cout<<|;
gotoxy(62,17+l);cout<<|; }
gotoxy(70,15+l);cout<<|; }
gotoxy(50,16+l);cout<<Desea Salir (s/n): ;cin>>rpta1;clrscr(); marco(); }
break;
case 3: { clrscr();marco();
gotoxy(28,5);cout<< REPORTE SEGN APELLIDOS ;
gotoxy(30,18);cout<<Ingrese su Apellido ;gets(apelli);clrscr();
for(i=1;i<=n;i++)
{ if(strcmp(lista[i].apell,apelli)==0)
{ gotoxy(11,15);cout<<Registro <<arch;
gotoxy(25,17);cout<<SISTEMA DE CONSULTAS POR APELLIDOS;
gotoxy(14,19);cout<<Cdigo;
gotoxy(28,19);cout<<Apellidos;
gotoxy(50,19);cout<<Nombres;
gotoxy(65,19);cout<<Edad;
gotoxy(14,20+i);cout<<lista[i].cod;
gotoxy(28,20+i);cout<<lista[i].apell;
gotoxy(50,20+i);cout<<lista[i].
nomb;
gotoxy(65,20+i);cout<<lista[i].edad;
}
}
for(k=1;k<=59;k++)
{gotoxy(k+10,18);cout<<_;
gotoxy(k+10,16);cout<<_;
gotoxy(k+10,20);cout<<_;
gotoxy(k+10,20+i);cout<<_;} //Verticales.
for(l=1;l<=(i+5);l++)
{ gotoxy(11,15+l);cout<<|;
if(l<=(i+3))
{ gotoxy(25,17+l);cout<<|;
gotoxy(47,17+l);cout<<|;
gotoxy(62,17+l);cout<<|;
}
gotoxy(70,15+l);cout<<
}
gotoxy(50,16+l);cout<<Desea Salir
(s/n):;cin>>rpta1;
} break;
} while(rpta1==n);clrscr(); } break;
case 9:{marco();
for(e=1;e<=50;e++)
{ gotoxy(12+e,8);cout<<_;
gotoxy(12+e,10);cout<<_;}
291
for(u=1;u<=2;u++)
{gotoxy(12,8+u);cout<<|;
gotoxy(63,8+u);cout<<|;
}
gotoxy(14,9); cout<<Continuar.. s/n):; cin>>rpta;clrscr();
a=6;
}
break; }
}while((rpta==n)||(a<=5));}
Ingresando registros, despus de asignar el nombre al archivo, el nmero de
registros, usted usa la opcin 2, la cual permite ingresar datos de los alumnos.
Problema 7. Disear un programa que permita leer n alumnos (n ingresado por
el usuario) por cdigo, nombre, edad y facultad (existen tres facultades: sistemas,
industriales y mecnica). El programa debe permitir los siguientes:
a. Lectura de n de empleados dentro de un marco (ventana), fecha y hora de
implementacin del programa. El programa indica el nmero de registro a
editar cada vez que contesta S de la siguiente pregunta DESEA SEGUIR
INGRESANDO DATOS? (S/N).
b. Reporte de todos los registros ingresados.
c. Reporte del promedio de edades de alumnos por facultad.
d. Reporte de la edad mayor y posicin donde se localiza el registro.
Solucin //struct_alum_fac.cpp
#include<iostream.h>;
#define linea __________________________________________;
struct alum_universidad
{int codigo, edad;
char nomb[20], facu[20];
}alumno[20];
void marco(); void ingreso(); void imprimir(); void promedio(); void mayor();
int i=1, j; //implementacin de las funciones prototipo
void marco() {int i;
time_t t;
t = time(&t);
gotoxy(20,3);cout<<La fecha y hora actual es :<<ctime(&t);
textcolor(11) ;
gotoxy(10,20) ;cout<<;
//esquinas
gotoxy(10,4) ;cout<<;
//esquinas
for (i=11 ;i <=69 ; i++)
{ gotoxy(i,4) ;cout<<; gotoxy(i,5) ;cout<<;
// lineas horizontales
gotoxy(i,20) ;cout<<; }
gotoxy(70,4) ;cout<<; gotoxy(70,20) ;cout<<;
//esquinas
for(i=5;i<=19;i++) {gotoxy(10,i) ;cout<<;
//lineas verticales
gotoxy(70,i );cout<<;
} }
void ingreso() { char opc; i=1;
marco(); gotoxy(20,5); cout<<Datos de Alumno ==> 1;
do { gotoxy(12,8); cout<<Ingrese Codigo
: ; cin>>alumno[i].codigo;
292
for(j=0;j<i;j++)
{if(strcmp(alumno[j].facu,sistemas)==0)
{if(alumno[j].edad>mayor)
{mayor=alumno[j].edad; pos=j;
}
gotoxy(14,10); cout<<El alumno de Sistemas con Edad Mayor es :
<<alumno[pos].nomb;
gotoxy(14,11);cout<<alumno[pos].nomb<< esta en la posicin <<(j+1);
}
if(strcmp(alumno[j].facu,industriales)==0)
{if(alumno[j].edad>mayor)
{ mayor=alumno[j].edad; pos=j; }
gotoxy(14,13);cout<<El alumno de Industriales con Edad Mayor es :
<<alumno[pos].nomb;
gotoxy(14,14);cout<<alumno[pos].nomb<< esta en la posicin <<(j+1);}
if(strcmp(alumno[j].facu,mecanica)==0)
{if(alumno[j].edad>mayor)
{ mayor=alumno[j].edad;
pos=j;
}
gotoxy(14,16); cout<<El alumno de Mecnica con Edad Mayor es :
<<alumno[pos].nomb;
gotoxy(14,17);cout<<alumno[pos].nomb<< esta en la posicin<<(j+1);
} } gotoxy(20,22);system(pause); }
void main()
{ marco(); ingreso(); reportes(); promedio(); mayor(); getch();
}
Procedimientos de salida
Parte I. Entrada de datos: adems de lectura de datos por cada alumno, puede
visualizar un marco, fecha y hora del sistema. Para ingresar ms registros
presione S.
Parte II. Reporte: despus de presionar N, usted obtiene un listado de registros
y el total respectivo.
Parte III. Reporte del promedio de edades de alumnos por facultad. A
continuacin se ilustra la entrada y salida.
294
}}
void color(char fondo,char texto)
{ textcolor(texto);
textbackground(fondo);}
struct transporte { char vendedor[30]; int tipo,cant; };
void main (){int r,n=4,i,j,k=0;int x[10][10],ta[50],tb[50],tt;int orden[50];
int
recau[50]; int precio[50]; float comision[50],porce[50],trec;int monto[50];
transporte data[50];
int maxtipo,maxvend,mintipo,minvend;
int maxmontotipo,maxmontovend,minmontotipo,minmontovend;
char menu;color(1,14);
precio[0]=40; precio[1]=30; precio[2]=25; precio[3]=22;
porce[0]=0.02; porce[1]=0.03; porce[2]=0.04; porce[3]=0.05;
do{clrscr();
gotoxy(16,2);cout<<EMPRESA DE TRANSPORTES BETA:;
gotoxy(6,3);cout<<linea;
gotoxy(4,5);cout<<Disponibilidad de Oficinas, Precio y Porcentajes por ventas ;
gotoxy(4,7);cout<< Tipo A : S/.40.00 2% para cada vendedor;
gotoxy(4,8);cout<< Tipo B : S/.30.00 3% para cada vendedor;
gotoxy(4,9);cout<< Tipo C : S/.25.00 4% para cada vendedor;
gotoxy(4,10);cout<< Tipo D : S/.22.00 5% para cada vendedor;
gotoxy(8,12);cout<< Ingrese Cantidad de Vendedores : ;cin>>r;
for(i=0;i<r;i++){
cout<<\t\t\tVendedor [<<(i+1)<<] = ; cin>>data[i].vendedor; data[i].cant=0;
}
for(i=0;i<n;i++){data[i].tipo=i; }tt=0; trec=0;clrscr();
gotoxy((11+r*7 /2),1);cout<<Vendedores;gotoxy(5,2);cout<<linea;
for(i=0;i<r;i++){
gotoxy((5+7*(i+1)),3); cout<<data[i].vendedor;
ta[i]=0; recau[i]=0; comision[i]=0; }
for(j=0;j<n;j++){ gotoxy(1,(j+5));
switch (data[j].tipo) {case 0 : cout<< <<TIPO A ;break;
case 1 :cout<< <<TIPO B ;break;
case 2 :cout<< <<TIPO C ;break;
case 3 :cout<< <<TIPO D ;break; }
gotoxy(5,n);cout<<linea; tb[j]=0;}
gotoxy(3,j+n+1);cout<<linea; // Ingreso de Datos
for(i=0;i<r;i++){
for(j=0;j<n;j++){
gotoxy((6+7*(i+1)),(j+5));
cin>>x[i][j];
orden[k]=x[i][j]; monto[k]=x[i][j]*precio[j]; k++;
ta[i]+=x[i][j];
// Calculo de los Totales en los Distritos
recau[i]+=x[i][j]*precio[j];
comision[i]+=x[i][j]*precio[j]*porce[j];
data[i].cant+=x[i][j];
tb[j]+=x[i][j];
// Clculo de los Totales de las Marcas de tipos
296
tt+=x[i][j];
// Clculo de la Suma de todos los elementos
} }
Burbuja(orden,k); Burbuja(monto,k);gotoxy(1,6+n);cout<<BoletoxVend;
gotoxy(1,7+n);cout<<RecaudxVend;gotoxy(1,8+n);cout<< % x Vend;
for(i=0;i<r;i++){ gotoxy((6+7*(i+1)),6+n);cout<<ta[i];
gotoxy((6+7*(i+1)),7+n);cout<<recau[i];
trec+=recau[i]; gotoxy((6+7*(i+1)),8+n);cout<<comision[i]; }
Burbuja(ta,i); gotoxy(12+(r*7),3);cout<<TotalxOfic.;
gotoxy(24+(r*7),3);cout<<MontoxOficina;
for(i=0;i<n;i++){ gotoxy(15+(r*7),(i+5));cout<<tb[i];
gotoxy(25+(r*7),(i+5));cout<<tb[i]*precio[i];}
gotoxy(15+(r*7),6+n);cout<<Total = <<tt<< Pasajeros;
gotoxy(15+(r*7),7+n);cout<<Rec. Total S/.<<trec;
for(i=0;i<r;i++){
for(j=0;j<n;j++){if (orden[k-1]==x[i][j]){maxtipo=j; // Posicin con Max # en Oficina
maxvend=i;
// Posicin con Max # por Vendedor
}
if (orden[0]==x[i][j])
{mintipo=j;
// Posicin con Min # en Oficina
minvend=i;
// Posicin con Min # por Vendedor
}
if (monto[k-1]==x[i][j]*precio[j])
maxmontotipo=j; // Posicin con Max Monto en Oficina
maxmontovend=i;
// Posicin con Max Monto por Vendedor
}
if (monto[0]==x[i][j]*precio[j]){
minmontotipo=j;
// Posicin con Min Monto en Oficina
minmontovend=i;
// Posicin con Min Monto por Vendedor
} }}
cout<<\n\n\n\tPasajeros Registrados\t\tVendedor\tOficina;
cout<<\n =====================================================;
cout<<\n\tMax # de Pasaj : <<orden[k-1];
switch (data[maxtipo].tipo)
{
case 0 : cout<<\t\t<<data[maxvend].vendedor<<\t\tTIPO A;break;
case 1 : cout<<\t\t<<data[maxvend].vendedor<<\t\tTIPO B;break;
case 2 : cout<<\t\t<<data[maxvend].vendedor<<\t\tTIPO C;break;
case 3 : cout<<\t\t<<data[maxvend].vendedor<<\t\tTIPO D;break; }
cout<<\n\tMin # de Pasaj : <<orden[0];
switch (data[mintipo].tipo)
{
case 0 :
cout<<\t\t<<data[minvend].vendedor<<\t\tTIPO
A;break;
case 1 :
cout<<\t\t<<data[minvend].vendedor<<\t\tTIPO
B;break;
case 2 :
cout<<\t\t<<data[minvend].vendedor<<\t\tTIPO
297
C;break;
case 3 :
cout<<\t\t<<data[minvend].vendedor<<\t\tTIPO
D;break;
}cout<<\n\tMax Recaud S/. : <<monto[k-1];
switch (data[maxmontotipo].tipo)
{case 0 : cout<<\t\t<<data[maxmontovend].vendedor<<\t\tTIPO A;break;
case 1 : cout<<\t\t<<data[maxmontovend].vendedor<<\t\tTIPO B;break;
case 2 : cout<<\t\t<<data[maxmontovend].vendedor<<\t\tTIPO C;break;
case 3:cout<<\t\t<<data[maxmontovend].vendedor<<\t\tTIPO D;break; }
cout<<\n\tMin Recaud S/. : <<monto[0];
switch (data[minmontotipo].tipo)
{case 0 : cout<<\t\t<<data[minmontovend].vendedor<<\t\tTIPO A;break;
case 1 : cout<<\t\t<<data[minmontovend].vendedor<<\t\tTIPO B;break;
case 2 : cout<<\t\t<<data[minmontovend].vendedor<<\t\tTIPO C;break;
case 3 : cout<<\t\t<<data[minmontovend].vendedor<<\t\tTIPO D;break;
}
cout<<\n\nOrdenado por Vendedores :\n\t\t;int temp[50];
for(k=0;k<r;k++){ gotoxy((6+7*(k+1)),n+19);cout<<ta[k];
for(i=0;i<r;i++){ if (ta[k]==data[i].cant){temp[k]=i;
} }
gotoxy((6+7*(k+1)),n+18);cout<<data[temp[k]].vendedor;
}
gotoxy(50,24);
cout<<Desea continuar ...(S/N)==>;cin>>menu;
}
while ((menu==S)||(menu==s));}
Parte I. Ingreso del nmero de
vendedores.
Parte II. Lectura de cantidad de boletos
expedidos por cada vendedor.
298
Compendio de problemas
Problema 1. Disear un programa que permita ingresar n alumnos (n definido
por el usuario), identificados por: apellidos y nombre (cadenas de 20), fecha
de nacimiento (da/mes/ao) y su edad respectiva. Luego realice las siguientes
consultas:
a. Alumnos por apellidos, fecha de nacimiento y edad
b. Alumnos ordenados por apellidos en forma ascendente
c. El alumno(s) de mayor edad, alumno(s) de menor edad
d. Total de alumnos y el promedio de edades
Problema 2. Disear un programa que permita ingresar n artculos (n definido
por usuario), donde cada artculo provee los siguientes campos: cdigo (cadena
de 4), nombre (cadena de 20), fecha de fabricacin (d/m/a), cantidad (entero) y
precio (real). Realice las siguientes consultas:
a. Listado de productos por cdigo, nombre, fecha de fabricacin y precio
b. Listado de productos ordenados en forma ascendente por precio
c. Listado de artculo(s) con mayor precio y la cantidad
Problema 3. Disear un programa que permita ingresar n alumnos (n definido
por usuario), los registros alumnos corresponden a un colegio, identificados por:
cdigo (cadena de 8), el apellidos (cadena de 20), puntaje (entero:0 al 100) y sexo
(carcter). Realice las siguientes consultas:
a. Listado de alumnos por: cdigo, apellidos y puntaje
b. Listado de alumnos por apellidos y ordenados por sexo en forma ascendente
c. Total de alumnos indicando promovidos cuando su puntaje es mayor que
20 y la cantidad de repitentes, cuando su puntaje es menor que 20
299
Descuento
C (casa)
18%
D (departamento)
12%
301
crea_cursos():
Procedimiento
para registrar m cursos (m<=10)
por alumno, tambin debe validar
que el cdigo del curso que NO
se repita. Si lee un cdigo que ya
existe, debe enviar el mensaje
Cdigo Existe, vuelva a leer.
En la siguiente figura se ilustra
procedimiento de lectura.
Editar_Notas(): Procedimiento
para registrar mximo tres
prcticas calificadas por cada
alumno y su curso respectivo.
Primero se lee el nmero de
alumnos y luego cdigo de
alumno y cdigo de curso, luego se registra las notas. Para el llenado de notas
se debe procesar tal como se ilustra en la siguiente figura, considerando que el
cdigo actual del alumno sea igual al cdigo registrado en la tabla alumnos.
305
306
Captulo 7
Archivos (file)
Objetivos
-
-
-
-
-
-
307
7.1 INTRODUCCIN
Los archivos constan de una coleccin de registros y sirven para la entrada y
salida de datos en computadora y son procesados con programas o lenguajes de
programacin de bajo nivel y alto nivel ( c++, netbeans, etc).
Para mejorar el procesamiento de archivos se puede usar vectores (arrays) como
variables tipo registros, lo cual resulta ms eficiente para las operaciones de
mantenimiento de Datos(insercin, eliminacin, modificacin, actualizacin).
308
309
310
fopen(nomb_archivo,modo):
Donde: nomb_archivo: es una cadena que indica ruta y nombre de archivo
modo : modo de acceso al archivo que se abrir o se crear
Modo de
apertura
(archivos de
texto)
texto)
Modo de
apertura
(archivos
binarios)
rb
wb
ab
r+
rb+
w+
wb+
a+
ab+
Descripcin
Apertura en modo de slo lectura. El archivo debe existir.
Apertura en modo de slo escritura. Si el archivo existe,
se reescribir (pierde el contenido anterior).Si archivo no
existe, lo crea
Apertura en modo de agregar. Si el archivo existe, los
datos se agregan al final del archivo en caso contrario el
archivo se crea.
Apertura en modo de lectura/escritura. El archivo debe
existir.
Apertura en modo de lectura/escritura. Si el archivo existe,
se reescribir.
Apertura en modo de lectura/agregar. Si el archivo no
existe lo crea.
7.13Cierre
de
archivos
usando fclose() y fcloseall()
Despus de procesar datos del archivo se debe cerrar. Esto se logra mediante las
funciones fclose() o fcloseall(), donde:
Funcin fclose (): cierra un archivo abierto
Funcin floreal (): cierra todos los archivos abiertos
312
&
: direccin de memoria
var_reg : es una variable registro
1
: se procesar en cada operacin 1 registro
alias1 : es una variable lgica para relacionar con archivo fsico
La funcin fwrite() graba el registro en la direccin fsica
Tambin puede usar fprintf ().
Donde:
Alias: variable lgica
direcc_fisica: Se debe calcular la direccin fsica antes de reposicionar el
puntador del archivo.
Punto_de_referencia: se refiere desde dnde se iniciar el conteo de bytes
determinado por la direccin fsica. Vara segn:
1. SEEK_SET : el desplazamiento se cuenta desde el inicio del archivo.
2. SEEK_CUR: el desplazamiento se cuenta desde la posicin actual del cursor.
3. SEEK_END : el desplazamiento se cuenta desde el final del archivo.
direcc_fisica = ftell(alias)
rename(c:\\datost\\empleados.txt, c:\\datos\\trabajadores.txt)
Donde:
empleados.txt : debe existir
trabajadores.txt : nuevo archivo
void IngresarCurso()
{ int cod_cur; system(cls);
cout<<\n\rINGRESAR
REGISTROS DEL CURSO;
fcurso=fopen(CURSO.
DAT,rb+);
if(fcurso == NULL)
{
fcurso = fopen(CURSO.
DAT,wb); }
cout << \n\n\n\r Codigo del
Curso : ;
cin
>>cod_cur;
fread(&f2,sizeof(f2),1,fcurso);
while(!feof(fcurso))
{ if(f2.cod_cur == cod_cur)
{cout << \n\n\n\r Registro DE CURSO YA EXISTE ...!!!;
fclose(fcurso); getch(); return;
}
fread(&f2,sizeof(f2),1,fcurso);
}
f2.cod_cur = cod_cur;
cout<< \n\rNombre del Curso : ; gets(f2.nomb_cur);
cout<< \n\rCreditos:;cin>>f2.cred;
fwrite(&f2,sizeof(f2),1, fcurso); fclose(fcurso); // Cierra el archivo
cout << \n\n\n\r CURSO REGISTRADO !!!\n; getch(); return;
}
Alternativa 3. Mdulo para ingresar notas.- Se registra la data de notas usando la
tabla (struct) NOTA_ALUMNO, que permite crear el archivo NOTAALUMNO.
DAT,usando los campos para claves forneas y los campos p1,p2,p3, ep, ef. Esta
informacin se implementa mediante el siguiente mdulo:
void Crea_archivo_NotasAlumnos()
{ clrscr(); NOTA_ALUMNO f3; int n,i;
fnota_alumno=fopen(NOTAALUMNO.DAT,a+);
if (fnota_alumno==NULL)
{ cout<<Creare el archivo;
cout<<Ingrese nmero de alumnos cuyas notas quiere ingresar: ;cin>>n;
for(i=1;i<=n;i++)
{cout<<Codigo Alumno :<<\n;
cin>>f3.cod_al;
cout<<Codigo del curso:; cin>>f3.cod_cur;
cout<<Nota de la practica 1: ;cin>>f3.p1;
cout<<Nota de la practica 2: ;cin>>f3.p2;
cout<<Nota de la practica 3: ; cin>>f3.p3; cout<<Nota del examen parcial: ;
317
cin>>f3.ep; //scanf(%d,®.ep);
cout<<Nota del examen final: ;
cin>>f3.ef;
fwrite(&f3,sizeof(f3),1,fnota_
alumno); }fclose(fcurso);
}
Con estos tres mdulos, se ha creado
los tres archivos fsicos, tal como se
ilustra en la siguiente grfica:
Mantenimiento. A partir de la alternativa 4, se considera mantenimiento de la
data, es decir se puede modificar contenido de las archivos fsicos (eliminar,
insertar, etc.), as como modificar datos de algn registro que el usuario crea
conveniente. A continuacin, se procesan las alternativas, es decir, se puede usar
indistintamente las alternativas, veamos:
Alternativa 6. Mostrar registro de alumnos.- En la siguiente grfica, se ilustra el
reporte de los registros de alumnos.
Esta interfase se logra al implementar el siguiente mdulo.
void Mostrar()
{ system(cls);
cout
<<
\n\rLISTADO
DE
REGISTROS
DE
ALUMNOS<<endl<<endl;
falumno = fopen(ALUMNO.
dat,rb);
if(falumno == NULL)
{ cout << \n\n\n\rNo existe el
archivo !!!\n;
cout << \n\r<<< ... PRESIONE ENTER para continuar >>>; getch(); return;
}
cout <<\n\r _________________________________________________;
cout << \n\r
CODIGO
NOMBRE
APELLIDO;
cout <<\n\r ___________________________________________________;
fread(&f1, sizeof(f1), 1, falumno);
while(!feof(falumno))
{ printf(\n\r %12d
\t%15s %-5s,f1.cod_al, f1.apell_al,
f1.nomb_al);
fread(&f1, sizeof(f1), 1, falumno);
}
fclose(falumno); // Cierra el
archivo
cout<<\
318
n\r__________________________;
cout << endl<<\n\n;
cout << \n\r<<< ... PRESIONE ENTER para continuar >>>; getch(); return;}
Alternativa 4. Actualizacin.- Suponga que el error est en al apellido de Ana,
es decir el apellido correcto es SIFUENTES, entonces se debe llamar el registro
por cdigo 100 (es la clave pimaria) y luego edite los nuevos datos. Este proceso
se ilustra en la siguiente grfica:
Verificacin. Use alternativa 6 y
por el cdigo verificar el cambio,
veamos:
Como se observa en la siguiente
grafica, el registro nmero 1 ha
sido actualizado.
Alternativa 5
Eliminacin. Se
elimina registros mediante la
edicin del cdigo, tal como se
ilustra a continuacin:
Para la verificacin, use la
alternativa 6, tal como se ilustra a
continuacin, que solo queda en
el archivo alumnos.dat, el registro
correspondiente a Carlos.
Este proceso se logra al implementar el siguiente mdulo:
void Eliminacin()
{ int cod_al; char op; system(cls);Eliminar(); cout << \n\rELIMINACION
DE REGISTROS DE ALUMNO;
falumno = fopen(ALUMNO.DAT,rb+);
if(falumno == NULL) // Checa la existencia del archivo
{ cout < \n\n\n\rNo existe el archivo !!!\n;
getch(); return;
}
cout << \n\n\n\r CODIGO DE ALUMNO A ELIMINAR : ; cin >>cod_al;
fread(&f1, sizeof(f1), 1, falumno);
while(!feof(falumno))
{ if(f1.cod_al == cod_al) { f1.cod_al = 0;
do { cout << \n\n\r... SEGURO que desea BORRARLO ...? [S/N] : ;
op = toupper(getche());
}while(op!=S && op!=N);
if(op == S)
{ fseek(falumno, ftell(falumno)-sizeof(f1), SEEK_SET);
fwrite(&f1, sizeof(f1), 1, falumno); cout << \n\n\n\rRegistro eliminado !!!\n;
}
319
fclose(falumno); Eliminar();
getch();
return;
}
fread(&f1, sizeof(f1), 1, falumno); }
cout << \n\rNo se encuentra ese registro !!!\n; fclose(falumno); // Cierra el
archivo
Eliminar(); getch(); return; }
void Eliminar()
{ //Variable para controlar el archivo temporal
FILE *Temporal;
falumno = fopen(ALUMNO.DAT,rb); // Valida la
existencia del archivo
if(falumno == NULL)
{ cout << \n\n\n\rNo existe el archivo !!!\n; getch(); return;
}
// Crea el archivo Temporal.DAT Temporal = fopen(TEMPORAL.DAT,wb);
fread(&f1, sizeof(f1), 1, falumno);
while(!feof(falumno))
{ if(f1.cod_al != 0) fwrite(&f1,sizeof(f1),1,Temporal); fread(&f1, sizeof(f1), 1,
falumno); //Lee el siguiente elemento del archivo }
fclose(falumno); fclose(Temporal); remove(ALUMNO.DAT);
rename(TEMPORAL.DAT, ALUMNO.DAT); getch(); return; }
Compendio de problemas
Problema 1. Disear programas que permitan crear los archivos mostrados en
las siguientes figuras usando las tcnicas de: Programa 1.- Solo usa tcnica de
archivos.
Se entiende que los campos claves no deben repetirse en las tablas, luego realice
las siguientes consultas usando las tcnicas de:
320
I. Tcnica de archivos:
Consulta 1. Listado de alumnos por cdigo y edad, pero ordenados en forma
ascendente por edad
Consulta 2. Listado de alumnos por cdigo, apellidos, nombre de cursos, notas y
su promedio respectivo, indicando el estado aprobado / desaprobado.
Problema 2. Disear programas que permita consultar data histrica (avance
curricular) de n alumnos. Para lo cual considere las siguientes restricciones:
- Considere solo 10 ciclos acadmicos.
- El Archivo ALUMNOS.TXT, puede ser el NICO y contiene datos de alumnos.
- El Archivo NOTAS.TXT contiene notas y datos de alumnos.
- Considere que se implementaron 3 ciclos por ao.
- Las notas por cada ciclo varan.
- Cuando ingresa a consultar las notas de un alumno, se elije el primer ao
acadmico, en este ao el programa permite al usuario consultar ciclo por
ciclo (hasta 3), luego puede pasar al segundo ao y repite lo mismo del
primer ciclo- 1.
Ejemplo:
Cdigos
100
200
Ciclos
Promedio
2005-1
12.3
2006-1
5.5
2005-2
11.4
2006-2
2005-3
15.8
2006-3
Ciclos
Promedio
Ciclos
Ciclos
Promedio
Ciclos
Promedio
2007-1
10.2
12.5
2007-2
3.4
6.7
2007-3
11.2
Ciclos
Promedio
2005-1
11
2006-1
Promedio
4.4
2007-1
12.4
2005-2
11.4
2006-2
12.2
2007-2
17.5
2005-3
12
2006-3
11.3
2007-3
11.5
321
322
323
325
326
Captulo 8
OBJETIVOS
- Definicin de punteros.
- Cmo identificar una direccin de memoria y cmo asignar espacios de
memoria.
- Usar estructuras de pilas para procesar archivos.
variable
puntero
valor
guarda
direccin
*P
Donde:
Tipo_dato: tipo estndar de dato
*: apunta a
Variable: identificador vlido
Ejemplo:
void main()
{ int * x ;
// x es un puntero a entero
char *nombre ; // nombre es un puntero a carcter
float *a,*b ;
//a y b son punteros a reales
}
Notaciones: Las siguientes sintaxis
void main(){ int *a;int* a;
}
Las dos notaciones son vlidas, la nica diferencia es que para caso 1) se sugiere
que * forma parte de b, y para el caso 2), * forma parte del tipo de dato.
Es recomendable adoptar la segunda forma, la primera se presta a confundir el
operador * con el operador de indirection; para que el programa compile sin
problemas es necesario utilizar el operador & antes del nombre de la variable, el
efecto del operador es devolver la direccin en memoria de la variable, la cual se
asigna naturalmente a un puntero.
8.3 OPERADORES
Este operador proporciona el contenido de una variable
apuntada.
Este operador devuelve la direccin de memoria de una
variable.
328
*P
&Q
* p;
Reserva de memoria
dinmica
Liberacin de memoria
reservada
delete a;
delete [] a;
329
APLICACIONES
Problema 1. Disee un programa que permita declarar dos punteros y que
apunten a su variable dinmica para almacenar nmeros ingresados por el
usuario, luego genere reportes para conocer: suma de las variables dinmicas,
contenido de cada variable, direccin de cada puntero y finalmente, liberar
espacio de memoria ocupada por los dos punteros.
Solucin:*/ punt_0011_2008.cpp
void main()
{ int suma;
int *a;
int *b ;
a = new int;
b = new int;
gotoxy(10,2);
cout<< Ingrese valor de *a = ;cin>>*a;
gotoxy(10,3);
cout<< Ingrese valor de *b =
;cin>>*b;
suma=*a+*b;
gotoxy(10,5);cout<< La suma de *a+*b es = <<suma;
gotoxy(10,7);cout<< El contenido de la variable puntero *p es = <<*a;
gotoxy(10,9);cout<< El contenido de la variable puntero *p es = <<*a;
gotoxy(10,12);cout<< La direccin de puntero *a es = <<a;
gotoxy(10,14);cout<< El La direccin de puntero *b es = <<b;
delete a;
delete b;
gotoxy(10,16);
cout<< Eliminacin de espacio de
memoria: delete a ;
gotoxy(10,17);
cout<< Eliminacin de espacio de
memoria: delete b ;
getche();
}
Problema 2. Realizar un programa que me permita declarar un puntero y que
apunte a una variable, la misma que almacena un nmero entero quees igual a
16. Generar un reporte para conocer contenido y la direccin de memoria donde
se encuentra dicha variable.
Solucin:*/ Punt001_2008.cpp
void main()
{
int x=16;
int *p;
330
p=&x;
gotoxy(10,4);cout<< El contenido es de la variable puntero es = <<*p;
gotoxy(10,5);cout<< El valor de la direccin del puntero es = <<p;
getche();
}
Problema 3. Disee un programa que permita ingresar por teclado dos nmeros
enteros y que estos permitan apuntar a su puntero respectivo, luego generar
un reporte que permita la suma acumulada de las dos variables dinmicas y su
direccin de la suma de dichos punteros.
Solucin / puntero_P002_suma_2008.cpp
void main(){
int x,y,*p,*q,suma;
gotoxy(10,4);cout<<Ingrese primer nmero = ;cin>>x;
gotoxy(10,5);cout<< Ingrese segundo nmero = ;cin>>y;
p=&x; q=&y; suma=*q+*p;
gotoxy(10,7);cout<< La suma de *p + *p es = <<suma;
gotoxy(10,9); cout<< El contenido de &suma es = <<&suma; getche();
}
Problema 4. Disee un programa, usando variables dinmicas, que permite
validar datos de usuario por cdigo =tcn y clave =123. Si los datos son
correctamente ingresados, el sistema solicita que ingrese dos nmeros enteros
para calcular la suma respectiva. A este resultado y usando una funcin que
reciba como parmetros la suma acumulada de los dos variables dinmicas,
mostrarlo en forma invertida. El programa debe ser interactivo con el usuario. Si
los datos son ingresados incorrectamente, el sistema finaliza.
Solucin //punt_valida_usuarios.cpp
int numero(int num);
int q;
int numero (int num)
{ int inv=0,n;n=num;
while(n>0)
{ inv=10*inv+n%10; n=n/10;
}
return inv;
}
void main()
{ clrscr(); int *a,*b; int q;char *cod, *clave; char resp=s;
do
{ gotoxy(10,2);cout<<VALIDANDO DATOS DE USUARIO ;clrscr();
cod=new char[5];
clave=new char[5];
a=new int;
b=new int;
gotoxy(10,4);cout<<Ingrese codigo = ; cin>>cod;
331
8.5 Lista
Una lista lineal es un conjunto de elementos definidos que pueden variar en
nmero y donde cada elemento tiene un nico predecesor y un nico sucesor o
siguiente, excepto el primero y el ltimo de la lista.
Lista
20
12
11
8.6 PILA
Ultimo en Ingresar, Primero en Salir(LIFO), quiere decir, que el elemento
que se ingres al final ser el primer elemento que se muestra y tambin ser el
primero en salir.
-> UltmoIngresar -> UltmoIngresar-1 -> UltmoIngresar-2 -> ...-> 2do -> 1ro -> NULL
Una pila (stack) es un tipo especial de lista lineal en la que la insercin y borrado
de nuevos elementos se realiza solo por un extremo que se denomina cima o
tope (top).
332
333
datos=entero;
while(datos!=0)
{d=datos%10;
inv=inv*10+d;
datos=datos/10;
}
return (inv);
}
void guarda(int entero, int a[10])
{ int d,k=1,i;
while(entero!=0)
{d=entero%10;
a[k]=d;
k++;
entero=entero/10;
}
gotoxy(10,12);cout<<Promedio almacenado en un vector ;
for(i=1;i<k;i++)
{
gotoxy(10,12+i); cout<< A[<<i<<]=<<a[i]<<endl;
}
gotoxy(5,15);cout<<linea;
return ;
}
void main()
{gotoxy(10,2);cout<< ESTRUCTURA PUNTEROS ;
prom_sumar(&n,&m,&z);
gotoxy(10,17); cout<< Promedio <<entero<< invertido es = <<invertido(entero);
guarda(entero,a);getche();}
334
335
{d = invertir%10;
inv =inv*10+d;
invertir=invertir/10;}
return (inv);
}
void main(){invertirn(prom_mas);prome();
gotoxy(10,16);cout<<Numero invertido es = <<invertirn(prom_mas); getche();
}
}
voidmarco()
{ int i;
time_t t;
t = time(&t);
gotoxy(12,3);cout<<Fecha y hora actual : <<ctime(&t);
gotoxy(10,20) ;cout<<; gotoxy(10,4) ;cout<<; //esquinas
for (i=11 ;i <=59 ; i++)
{gotoxy(i,4) ;cout<<; gotoxy(i,5) ;cout<<;
// lineashorizontales
gotoxy(i,20) ;cout<<;
}
gotoxy(60,4) ;cout<<; gotoxy(60,20) ;cout<< ; //esquinas
for(i=5;i<=19;i++)
{gotoxy(10,i) ;cout<<; gotoxy(60,i );cout<<; //lineasverticales
}
gotoxy(17,5);cout<< ---> Creando Lista (*PILA) <--- ;
}
voidcrear_lista(nodo *&p)// creo procedimiento para ir llamando a nodo
{ marco(); intnota,i;
nodo *r;
p=NULL;//inicializo
do{ gotoxy(16,7);cout<<Ingrese numero de nodos: ;cin>>n;
}while (n<0 ||n>100);
for(i=1;i<=n;i++)
{ do {gotoxy(18,i+8);cout<<Nota <<i<< : ;cin>>nota;
}while(nota<0||nota>20);
r=crear_nodo(nota);//llamar a funcin y asigno nota
// preguntamos: existe pila o no
if (p==NULL) //1.- Pila p NO existe
{p=r; //tomo direccin de nodo r
}
else
// 2.- pila existe
{ r->sgte=p;//inserto nodo delante de p
p=r;//p recibe direccin de r
}
}//fin de for
}// fin procedimiento
voidaprob_desap(nodo *&p)// recorrer la pila
{ marco();
nodo *aux;// crear var puntero para obtener copia
aux=new nodo;// su espacio de memoria
aux=p; //hacer copia de p en aux
while(aux!=NULL)//recorre la lista mientras no este al final de ultimo nodo
{ if(aux->nota >10)// ingrese a dato de cada nodo
{ap++;//aprob++;
notas[ap]=aux->nota;//copia nota en vector
}
338
else
{de++;//desap++;
notasde[de]=aux->nota;
}
aux=aux->sgte;// pasar al nuevo nodo
} //fin del while
gotoxy(13,n+10);cout<<Total Aprobados: <<ap;//aprob;
gotoxy(18,n+11);cout<<Notas ;
for(i=1;i<=ap;i++) // vector notasaprob
{ gotoxy(15,n+12);cout<<----------------;
gotoxy(18,i+16);cout<<i<<.- <<notas[i]<<endl;
}
gotoxy(36,n+10);cout<<Total Desaprobados: <<de;//desap;
gotoxy(42,n+11);cout<<Notas <<endl;
for(i=1;i<=de;i++)// noasdesaprob
{ gotoxy(39,n+12);cout<<----------------;
gotoxy(40,i+16);cout<<\t<<i<<.-<< <<notasde[i]<<endl;
}
}//fin de procedimiento desap()
voidListarDatos(nodo *&p)// procedimiento p mostrar pila
{ nodo *aux;// para obtener copia
aux=new nodo;// su espacio de memoria
aux=p; //hacer copia de p en aux
if(aux==NULL)
cout<<\n\nLA LISTA ESTA VACIA<<endl;
int k=0;
while(aux!=NULL)
{ k++;
gotoxy(14,10); cout<<PILA: ;
gotoxy(12+7*k,11);cout<< -> <<aux->nota;
aux=aux->sgte; //paso a siguiente nodo
}
getch();
}
voidbuscar_nota(nodo *&p)// procedimiento para buscar
{ intnotas,nn=0;
marco();
nodo *aux;// para obtener copia
aux=new nodo;// su espacio de memoria
aux=p; //hacer copia de p en aux
gotoxy(13,15);cout<<Ingrese Nota a Buscar = ;cin>>notas;
while(aux!=NULL)//recorre la lista
{if(aux->nota==notas)
{ nn++;
}
339
341
while(p!=NULL)
{ q=p->sgte;
while(q!=NULL)
{ if(q->nota < p->nota)
{ aux=q->nota; q->nota=p->nota;
p->nota=aux;
}
q=q->sgte;
}
gotoxy(10,11); cout<< Notas : ;
gotoxy (20+8*i,11); cout<< => << p->nota;
p=p->sgte; i++;
}
free(q); free(p);
return;
}
voidOrdenarDescend(nodo *p)
{ caratulmarco();
nodo *q;intaux,i=0;
q = new nodo;
q=p;
gotoxy(20,5);cout<< Reporte de Notas;
gotoxy(4,6);
cout<<__________________________________________________ ;
gotoxy(10,9);cout<< Notas ordenadas de forma Descendente ;
while(p!=NULL)
{
q=p->sgte;
while(q!=NULL)
{ if(q->nota > p->nota)
{aux=q->nota;q->nota=p->nota; p->nota=aux;
}
q=q->sgte;
}
gotoxy(10,11); cout<< Notas : ;
gotoxy (20+8*i,11); cout<< => << p->nota;
p=p->sgte; i++;
}
free(q); free(p); return;
}
void Eliminar(nodo *p)
{ caratulmarco();int dato; nodo *q;
gotoxy(20,5);cout<< Modulo de Eliminacion ;
gotoxy(15,6);
cout<<__________________________________________________ ;
gotoxy(10,11);cout<< Ingrese Nota a eliminar = ;cin>>dato;
q = new nodo; q=p;
343
if(p->nota==dato)
{q=q->sgte;
free(p);
return;
}
while(p!=NULL)
{ if(p->nota==dato)
{ q->sgte=p->sgte;
free(p);
gotoxy(10,13);cout<< Nota Eliminada.... ;
getche();
return;
}
q=p;
p=p->sgte;
}
gotoxy(10,12);cout<< existe ese dato...\n\n;
system(pause);
return;
}
voidBuscarXPos(nodo *p)
{ caratulmarco();
intpos,cont=0;
gotoxy(20,5);cout<< Modulo de Bsqueda ;
gotoxy(15,6);cout<<________________________________ ;
gotoxy(10,8);cout<< Ingrese posicin: ;cin>>pos;
while(p!=NULL)
{ cont++;
if(cont==pos)
{
gotoxy(10,12);
cout<<La posicin <<pos<< contiene la nota : <<p->nota;
getche();
return;
}
p=p->sgte;
}
gotoxy(10,12);cout<< La posicin no existe;
getche();
return;
}
voidBuscarXVal(nodo *p)
{caratulmarco();
intdato,cont=0;
gotoxy(20,5);cout<< Mdulo de Bsqueda ;
gotoxy(4,6);cout<<________________________________ ;
gotoxy(10,8);cout<< Ingrese Nota = ;cin>>dato;;
while(p!=NULL)
{ cont++;
344
if(p->nota==dato)
{gotoxy(10,12);cout<< La Nota se encuentra en la posicin : <<cont;;
getche();
return;
}
p=p->sgte;
}
gotoxy(10,12);cout<< La Nota no existe;
getche();
return;
}
voidMostrarLista(nodo *p)
{ caratulmarco();
int i;
gotoxy(20,5);cout<< PILA(LIFO) FORMADA ;
gotoxy(10,6);cout<<________________________________________ ;
while(p!=NULL)
{ gotoxy(12,11); cout<< Pila : ;
gotoxy (20+8*i,11); cout<< => << p->nota;
p=p->sgte;
i++;
}
return;
}
void main()
{ nodo *lista;
bool log=true;
caratula();
caratulmarco();
do{caratulmarco();
switch(Menu(lista))
{ case 1: clrscr();//caratula();
crea_lista(lista); getche();clrscr(); break;
case 2: clrscr();caratulmarco();aprob_desap(lista);getche();clrscr();
break;
case 3:clrscr();caratulmarco();OrdenarAscend(lista);getche();clrscr();
break;
case 4: clrscr();caratulmarco();;OrdenarDescend(lista); getche();clrscr();
break;
case 5: clrscr();caratulmarco();Eliminar(lista);
getche();clrscr();
break;
case 6: clrscr();caratulmarco();BuscarXPos(lista); getche();clrscr();
break;
case 7: clrscr();caratulmarco();BuscarXVal(lista); getche();clrscr();
break;
case 8: clrscr();caratulmarco();MostrarLista(lista);getche();clrscr();
345
break;
case 0: clrscr();log=false;
}
}while(log);
}
Aplicacin
Disear un programa que permita crear el archivo ALUMNOS.TXT y luego
almacenar datos de nalumnos (n definido por usuario), datos por: nombre(se
puede considerar como clave con fines de usar funciones de cadenas), promedio
y crditos respectivamente. Luego de usando el archivo de datos, mediante una
pila hacer un reporte de alumnos10. Seguir los siguientes procedimientos:
1. Crear archivo ALUMNOS.TXT. En la siguiente interface se ilustra la lectura de
datos de alumnos, observe que existen dos alumnos con promedio menor a 10.
2. Procesando PILA. Permite jalar, cargar los registros de los n alumnos
creados, segn paso 1. Los resultados se ilustran en la siguiente interface.
Observe que en el reporte se
visualiza los elementos de
la estructura dinmica PILA
(LIFO), asimismo, no existen
alumnos con promedio menor a
10.
Implementacin
I. CREA ARCHIVO//Arc_crea_
Pilas_Alumn.cpp
struct ALUM
{ char alum_pri_nomb[12]; float prom;int cred;
} alumnos;
FILE *falumnos;
void crea_alumnos()
{int l,i=0,j;
char resp=S,cod[12];clrscr();
gotoxy(10,2);
cout<<....CreandoArchivo ALUMNOS.txt.;
gotoxy(10,4);
346
cout<< Nombre
Promedio
Creditos ;
gotoxy(5,5); cout<<_______________
____________;
while(resp==S||resp==s)
{i++; falumnos=fopen(ALUMNOS.
txt,a+);
if(falumnos == NULL)
{ f a l u m n o s = f o p e n ( A L U M N O S .
txt,a+);}
gotoxy(12,5+i);gets(cod) ;fread(&al
umnos,sizeof(alumnos),1,falumnos);
while(!feof(falumnos))
{if(strcmpi(alumnos.alum_pri_
nomb,cod)==0)
{ gotoxy(26,16); fclose(falumnos);
cout<< Nombre ya existe..!!! ; getche();return;
}
fread(&alumnos,sizeof(alumnos),1,falumnos);
}
strcpy(alumnos.alum_pri_nomb,cod);
do{ gotoxy(26,5+i);clreol();cin>>alumnos.prom;
}while(alumnos.prom<0 || alumnos.prom>20);
gotoxy(45,5+i);cin>>alumnos.cred;
gotoxy(4,16);cprintf(Desea ingresar nuevo alumnos..?<S/N>==> );cin>>resp;
for(l=1;l<=50;l++)
{gotoxy(3+l,16);cprintf(); }
fwrite(&alumnos,sizeof(alumnos),1,falumnos);fclose(falumnos);
}
gotoxy(10,21);cout<<adios; getche(); return;
}
void main(){crea_alumnos();getche();}
II. Mediante la estructura PILA. Programa que permite, mediante una PILA,
hacer un reporte de alumnos almacenados en un archivoALUMNOS.TXT,
creado con el programa fuente del paso I)
Solucin //pila_jala_arch_Alumn.cpp
struct ALUM
{char nomb[12];
float prom;
int cred;
}f1;
typedef struct pila_trabajadores
{ float prom; char nombres[20]; int cred;
347
348
200
Ciclos
Promedio
2005-1
12.3
2005-2
11.4
2005-3
15.8
Ciclos
Promedio
2005-1
11
2005-2
11.4
2005-3
12
Ciclos
Promedio
2006-1
5.5
2006-2
12.5
2006-3
6.7
Ciclos
Promedio
2006-1
4.4
2006-2
12.2
2006-3
11.3
Ciclos
Promedio
2007-1
10.2
2007-2
3.4
2007-3
11.2
Ciclos
Promedio
2007-1
12.4
2007-2
17.5
2007-3
11.5
350
.
06
06
Desaprobado
Desaprobado
-------------------------------------------------------------------
Problema 5.- Se tienen las siguientes tablas donde se almacena los datos de cada
docente y los das que dicta cada curso, el pago por hora es de acuerdo a la
categora segn:
Categora 1: 20 soles
Categora 2: 23 soles
Categora 3: 27 soles
Usando tcnica de archivos con pilas/colas disear el programa que permita
leer los datos solicitados, segn campos mostrados, en cada entidad el siguiente
modelo relacional de base de datos:
Aqu, se ilustra tablas con datos de algunos registros.
DOCENTE
DIARIO
CODDOC
5C
NOMDOC
30C
CATEGORIA int.
D001
D002
D003
Luis Vera
Ana Garca
Juan Lopez
CURSO
CODDOC
CODCUR
HORAS
FECHA
1
3
2
D001
D001
D002
D002
D003
D003
C001
C004
C003
C001
C005
C003
5C
5C
DOUBLE
10C
4
5
3
4
3
2
11/10/10
15/10/10
17/11/10
21/11/10
23/11/10
25/11/10
CODCUR5C
NOMCUR
15C
C001
C002
C003
C004
Matemtica I
Anlisis II
Fisca I
Qumica
351
Fecha
Horas
Nombre del curso
XXXXX
999
Total horas
Total pago
xxxxxxxxxxx
=> 999,999.
=> 999.999.99
Apellidos
CURSOS.DAT
Nombres
Cod._cur.
Descripcin
rea acad.
100
Salas
Juan
124
Matemticas
Bsicas
200
Sols
Pedro
760
Compiladores
Sistemas
300
Cspedes
Mara
195
Numricos
Bsicas
400
Carrasco
Noem
511
Costos
Gestin
Cdigo
100
200
300
400
100
Cod._cur.
124
760
124
124
760
N1
14
13
11
10
08
N2
11
14
11
10
10
N3
10
05
14
13
14
pp
?
NOTAS_ALUMNOS.DAT
Se pide:
a. Disear un programa que permita: crear los archivos fsicos:
ALUMNOS.DAT, CURSOS.DAT y NOTAS_ALUMNOS.DAT
b. Disear un programa: Reportes.CPP, programa que permita mostrar un
reporte de los archivos alumnos o cursos o notas_alumnos.
c. Disear un programa: Insertar.CPP, programa que permita insertar registros
correspondientes a alumnos o cursos o notas_alumnos.
d. Disear un programa: Eliminar.CPP, programa que permita eliminar registros
alumnos o cursos o notas_alumnos.
352
e. Disear
un
programa:
Modificar.CPP, programa que
permita modificar
re-gistros
correspondientes a alumnos o
cursos o notas_alumnos.
f. Disear un programa: Estado_
Alum.CPP,
programa
que
permita hacer un reporte
de alumnos por: cdigo,
apellidos y nombre, cond_cur, descripcin y sus promedios, mostrando el
estado:aprobado o desaprobado.
g. Cuando realiza el proceso de eliminacin, guardar como histrico todos los
registros eliminados en un archivo registros_baja.txt.
Problema 7.- Usando pilas, disear un programa que permita ingresar datos de
n alumnos (n<=1000) por apellidos, nombres, cdigo, edad y sus evaluaciones
respectivas: tres prcticas calificadas y dos exmenes.
En la figura adjunta se ilustra el ingreso de datos por alumno. Realice los
siguientes procesos:
353
354
Problema 8. Usando archivos con pilas/ colas, disear un programa que permita
disponer de un sistema acadmico de matrcula, para lo cual se considera el
siguiente modelo relacional de base de datos:
355
356
Bibliografa
Deitel & Associates Inc. C/C++ Como programar. 4a ed. Mxico: Prentice Hall, 2004.
Joyanes, Luis. Fundamentos de programacin. Madrid: Mc. Graw Hill, 2004
------------------. Programacin en Turbo Pascal. 3a Madrid...
357
358
ndice temtico
Anidamiento de registros..............................................................276
ANSI C.............................................................................................. XV
Argumento.......................................................................................225
Arrays bidimensionales.................................................................149
Arreglos unidimensionales............................................................191
Cadenas de caracteres....................................................................199
Cin.getline........................................................................201, 216, 218
Conversin a mayscula y minscula.........................................215
Colas (FIFO).....................................................................................351
Estructura repetitiva.............................................................29, 37, 44
Estructura selectivas condicionales................................................16
Estructura selectiva compuesta.......................................................18
Funciones.........................................................................................221
Funciones para invertir cadenas...................................................214
Funciones para la comparacin de cadenas................................210
Identificadores.....................................................................................4
Inclusin de una cadena en otra...................................................215
Lenguaje de programacin procedural...............................................XV
Lenguaje orientado a objetos.......................................................... XV
Lenguajes de mquina.........................................................................3
Operaciones con vectores...............................................................126
Parmetro.................................................................................225, 227
Programacin dinmica (punteros)..............................................327
Recursividad directa e indirecta...................................................259
Registros...........................................................................................273
Rewind..............................................................................................314
Tipos de datos......................................................................................5
Transformacin de cadenas...........................................................213
Variables locales y globales............................................................226
359
360
361
362