Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Pg. 1
Pg. 2
Pg. 3
Pg. 4
Pg. 5
Pg. 6
"Un algoritmo se define como un mtodo que se realiza paso a paso para
solucionar un problema que termina en un nmero finito de pasos".
1.12.1 Tipos de Algoritmos
Existen dos tipos y son llamados as por su naturaleza:
Cualitativos: Son aquellos en los que se describen los pasos utilizando
palabras.
Cuantitativos: Son aquellos en los que se utilizan clculos numricos para
definir los pasos del proceso.
1.12.2 Lenguajes Algortmicos
Un Lenguaje algortmico es una serie de smbolos y reglas que se utilizan para
describir de manera explcita un proceso.
1.12.3 Tipos de Lenguajes Algortmicos
Grficos: Es la representacin grfica de las operaciones que realiza un
algoritmo (diagrama de flujo y diagrama de bloques).
Pg. 7
Pg. 8
a) Diagrama de flujo
Los diagramas de flujo (o flujogramas) son diagramas que emplean smbolos grficos
para representar los pasos o etapas de un proceso. Tambin permiten describir la
secuencia de los distintos pasos o etapas y su interaccin.
b) DFD
DFD es un software diseado para construir y analizar algoritmos. Se pueden
crear diagramas de flujo de datos para la representacin de algoritmos de
programacin estructurada a partir de las herramientas de edicin que para
ste propsito suministra el programa. Despus de haber ingresado el algoritmo
representado por el diagrama, podr ejecutarse, analizarse y depurarse en un
entorno interactivo diseado para este fin.
II.
Pg. 9
Pg. 10
Codificacin
En Papel
Lenguaje de
Programacin
Transcripcin
En Papel
Programa Ejecutable
Programa Fuente
Compilacin
Mac II
Mac II
Programa Fuente
Est escrito en un lenguaje de programacin. (pascal, C++, Visual Fox, Visual
Basic, etc.).
Es entendible por el programador.
Programa Ejecutable
Est en lenguaje mquina.
Entendible por la mquina.
Pg. 11
III.
Pg. 12
Pg. 13
Pg. 14
Numricos
Cadena
Lgicos
Constantes
36
450.35
0.58
'A'
'Juan'
'La Paz'
Falso
Verdadero
Variables
A
Nom
Edad
Ciudad
Estatura
Pg. 15
Operacin
Suma
Resta
Multiplicacin
Divisin real
Div
Divisin entera
Mod
Residuo
Exponenciacin
Ejemplos:
7+3 = 10 10 Div 4 = 2
7-3 = 4 20 Mod 3 = 2
7*3 = 21 5 Mod 7 = 5
10/4= 2.5 4 ^ 2 = 16
En la expresin 7+3, los valores 7 y 3 se denominan operandos. El valor de la
expresin 7+3 se conoce como resultado de la expresin.
Todos los operadores aritmticos no existen en todos los lenguajes de
programacin, por ejemplo, en Fortran no existen Div y mod.
Operadores Div y Mod
El smbolo / se utiliza para la divisin real, y el operador Div representa la
divisin entera.
Expresin Resultado Expresin Resultado
10.5/3.0
3.5
10 Div 3
0.25
18 Div 2
2.0/4.0
0.5
30 Div 30
30/30
1.0
10 Mod 3
6/8
0.75
10 Mod 2
Pg. 16
b) Operadores Relacionales
Permiten realizar comparaciones de valores de tipo numrico o carcter. Estos
operadores sirven para expresar las condiciones en los algoritmos.
Proporcionan resultados lgicos.
Operador
Significado
<
Menor que
>
Mayor que
Igual que
<=
>=
<>
Diferente de
Prioridad
Alta
*, /, Div
+, -, Mod
Relacionales
Baja
Pg. 17
c) Operadores Lgicos
Son aqullos que permiten la combinacin de condiciones para formar una sola
expresin lgica. Utilizan operandos lgicos y proporcionan resultados lgicos
tambin.
Operador
Relacin
not
Negacin (No)
and
Conjuncin (Y)
or
Disyuncin (O)
xor
Disyuncin Exclusiva
(O/SOLO)
Pg. 18
El operando es falso
AND
OR
Al menos un operando es
verdadero
XOR
Pg. 19
Salida
Pg. 20
Algoritmo
Inicio
leer(B)
leer(h)
x = B*h
A = x/2
escribir(A)
Fin
3.3 Expresiones
Las expresiones son combinaciones de constantes, variables, smbolos de
operadores, parntesis y nombres de funciones especiales. Las mismas ideas
son utilizadas en notacin matemtica tradicional; por ejemplo:
a + b ( b+2)
Cada expresin toma un valor que se determina tomando los valores de las
variables y constantes implicadas y la ejecucin de las operaciones indicadas.
Una expresin consta de operadores y operandos. Segn sea el tipo de objetos
que manipulan, las expresiones se clasifican en:
Aritmticas
Relacionales
Lgicas
Carcter
El resultado de la expresin numrica es de tipo numrico; el resultado de una
expresin relacional y de una expresin lgica es de tipo lgico; el resultado de
una expresin carcter es de tipo carcter.
1. Expresiones Aritmticas
Las expresiones aritmticas son anlogas a las frmulas matemticas. Las
variables y constantes son numricas (real o entera) y las operaciones son las
aritmticas.
+
suma
resta
*
multiplicacin
/
divisin
**, ^
exponenciacin
div
divisin entera
mod
mdulo (resto)
Los clculos que implican tipos de datos reales y enteros suelen dar
normalmente resultados del mismo tipo si los operandos lo son tambin. Por
ejemplo, el producto de operandos reales produce un real.
Pg. 21
Ejemplo :
4x6
se representa por 4 * 6
39
se representa por 3 ^ 9
18 div 6 se representa por 18/6
2. Expresiones Lgicas (booleanas)
Es una expresin que solo pueden tomar los valores de: verdadero y falso. Las
expresiones lgicas se forman combinando constantes lgicas, variables lgicas
y otras expresiones y otras expresiones lgicas utilizando los operadores lgicos
not, and y or, y los operadores relacionales (de relacin o comparacin) =, >, <,
<=, >=, <>.
IV.
Pg. 22
TCNICAS DE DISEO
Con el objeto de facilitar el diseo de algoritmos y la organizacin de los
diversos elementos de los que se componen se utilizan algunas tcnicas que
muestran una metodologa a seguir para resolver los problemas. Estas tcnicas
hacen que los programas sean ms fciles de escribir, verificar, leer y mantener.
Algunas de las tcnicas ms conocidas son:
Top Down (diseo descendente)
Botton Up
Warnier Orr
Compra
Conseguir
Proveedor
Conseguir
Crditos
Manejo
Transportacin
Alacenamiento
Inventario
Capturar
Introducir
Clave
Venta
Etiquetas
Facturacin
Reparto
Reportes
Introducir
Precio
Pg. 23
4.2 Botton Up
Esta tcnica consiste en partir de los detalles ms precisos del algoritmo
completando suscesivamente mdulos de mayor complejidad, se recomienda
cuando ya se cuenta con experiencia y ya se sabe lo que se va a hacer.
Conforme se va alcanzando el desarrollo de mdulos ms grandes se plantea
como objetivo final la resolucin global del problema.
Este mtodo es el inverso del anterior y es recomendable cuando se tiene un
modelo a seguir o se cuenta con amplia experiencia en la resolucin de
problemas semejantes.
La tcnica de Botton Up es frecuentemente utilizada para la realizacin de
pruebas a sistemas ya concluidos.
4.3 Warnier Orr
Es una tcnica que utiliza una representacin semejante a la de cuadros
sinpticos para mostrar el funcionamiento y organizacin de los elementos que
conforman el algoritmo.
Bsicamente, utiliza una notacin de llaves para organizar los mdulos y se
auxilia en la siguiente simbologa para indicar operaciones de control.
Smbolo
+
Significado
OR (uno, otro o varios)
XOR (uno u otro, solo uno)
(x,y)
Pg. 24
Conseguir Proveedor
Compras
Conseguir Crdito
Hipotecar propiedades
Transportacin
Control
de
Almacn
Almacenamiento
Manejo
Inventario
Etiquetacin
(1,n)
Captura
Repartos
Introducir clave
Introducir precios
Facturacin
Ventas
(0,n)
Reparto
V.
Pg. 25
Pg. 26
11. Las entradas a un smbolo pueden ser varias, pero la salida es nica excepto
para el smbolo de decisin.
12. Debe de indicar claramente dnde inicia y dnde termina el diagrama.
13. Organizar los smbolos de tal forma que siga visualmente el flujo de arriba
hacia abajo y de izquierda a derecha.
14. Las lneas deben ser verticales u horizontales, nunca diagonales.
15. No cruzar las lneas de flujo empleando los conectores adecuados sin hacer
uso excesivo de ellos.
Pg. 27
18. Las lneas de flujo deben de entrar a un smbolo pro la parte superior y/o
izquierda y salir de l por la parte inferior y/o derecha.
19. Evitar que el diagrama sobrepase una pgina; de no ser posible, enumerar y
emplear los conectores correspondientes.
5.1.2 Comprobacin de Diagramas
Terminado el diagrama de flujo, se deben tomar un conjunto de datos
significativos y comenzar la lectura del mismo en el orden arriba abajo /
izquierda derecha y seguir paso a paso todos los smbolos con sus operaciones
correspondientes, introduciendo los datos tomados inicialmente en los
momentos oportunos y ver cmo responde el diagrama de flujo y si los
resultados obtenidos son correctos y coherentes.
Pg. 28
Funcin
Terminal (representa el inicio y el final, de un
programa, puede representar tambin una
para o interrupcin programada que sea
necesario realizar en un programa
Entrada/Salida
(cualquier
introduccin de datos)
tipo
de
SI
Pg. 29
Pg. 30
Ejemplo:
Calcular el salario neto de un trabajador en funcin del nmero de horas trabajadas,
precio de la hora de trabajo y considerando unos descuentos fijos al salario bruto en
concepto de impuestos (20 por 100).
Inicio
Salario_bruto
horas*precio
Impuesto
0.20*salario_neto
Salario_neto
salario_bruto impuesto
Escribir nombre,
salario_bruto,
salario_neto
Fin
Pg. 31
Ejemplo:
Realizar un diagrama de flujo que permita mostrar en pantalla un mensaje de
mayora o minora de edad segn sea el caso para un nombre especfico.
Inicio
Nombre:
nom
Edad:
ed
falso
verdadero
Ed >= 18
Nom, eres
Nom, eres
Fin
Pg. 32
5.2 Pseudocdigo
Otra herramienta muy til en el anlisis de programacin es el pseudocdigo.
Pseudo o seudo, significa <<falso>>, <<imitacin>> y cdigo se refiere a las
instrucciones escritas en un lenguaje de programacin: pseudocdigo no es
realmente sin cdigo sino una imitacin y una versin abreviada de
instrucciones reales para las computadoras.
Las tres herramientas que utilizan los programadores son: diagramas de flujo,
tablas de decisin y pseudocdigos. Aunque se utilizan las tres sin duda las ms
utilizadas son los diagramas de flujo y los pseudocdigos.
El pseudocdigo es una tcnica para expresar en lenguaje natural la lgica de
un programa, es decir, su flujo de control. El pseudocdigo no es un lenguaje de
programacin sino un modo de plantear un proceso de forma que su traduccin
a un lenguaje sea sencilla para un programador.
Ejemplo:
Preparar un algoritmo que represente la receta que se muestra a continuacin:
Ingredientes:
1. 1 taza de almendras picadas.
2. de libra de chocolate en bloque para hornear
3. de libra de malvaviscos cortados a la mitad
4. 3 tazas de azcar
5. taza de leche evaporada
6. taza de miel de maz
7. 1 cucharadita de vainilla
8. libra de mantequilla
9. cucharadita de sal
Virtase la leche y aada la miel de maz, el azcar, el chocolate y la sal en un
recipiente de 1 litro, y cocnese en flama alta, mezclando constantemente hasta
que hierva la mezcla. Redzcase, a flama moderada y continese hirviendo y
revolviendo hasta que una gota de la miel forme una pelota suave en un vaso de
agua fra. Qutese de la flama y djesele enfriar durante 10 minutos. Mzclese la
mantequilla y la vainilla hasta que estn completamente incorporadas.
Agrguense las almendras. Distribyanse las mitades de malvavisco en el fondo
de una charola de horneado, de 30 centmetros por lado, engrasada. Virtase la
miel sobre los malvaviscos. Djesele enfriar durante 10 minutos. Crtese en
cuadros y srvase.
La ventaja del pseudocdigo es que en su uso en la planificacin de un
programa, el programador se puede concentrar en la lgica y en las estructuras
de control y no preocuparse de las reglas de un lenguaje especfico. Es tambin
fcil modificar el pseudocdigo si se descubren errores o anomalas en la lgica
del programa, adems de todo esto es fcil su traduccin a lenguajes como
pascal, COBOL, C, FORTRAN o BASIC.
Pg. 33
Pg. 34
Inicio
Repetir
escribir(Primer valor : )
leer(X)
escribir(Segundo valor : )
leer(Y)
escribir(1) Suma )
escribir(2) Resta )
escribir(3) Multiplicacin )
escribir(4) Divisin )
escribir(Qu operacin deseas realizar ? : )
leer(OPCION)
casos OPCION de
1 : RESULTADO = X+Y
2 : RESULTADO = X-Y
3 : RESULTADO= X*Y
4 : si Y=0 entonces
escribir( Error )
RESULTADO
0
en caso contrario
RESULTADO = X/Y
escribir (Resultado : ,RESULTADO)
escribir(Deseas otro clculo : [S/N] )
leer(OP)
Hasta que RES = N
Fin
Ejemplo:
Preguntar un nombre y repetirse en pantalla tantas veces como se desee.
(preguntar cantidad de repeticiones), indicando el nmero de repeticin.
Declaracin de variables
Cadena : nom
entero : x, n
Inicio
escribir(Nombre : )
leer(nom)
escribir(Cuntas veces quieres repetirlo ? : )
leer(n)
para x
1 hasta n hacer
escribir(x.- , nom)
Fin
Pg. 35
Fin
Una estructura condicional en N-S se representa de la siguiente manera:
Condicin?
Si
<Acciones>
No
<Acciones>
VI.
Pg. 36
ESTRUCTURAS ALGORTMICAS
6.1 Estructura Secuencial
Es aqulla en la que una accin (instruccin) sigue a otra en secuencia. Las
tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y
as sucesivamente hasta el fin del proceso. La estructura secuencial tiene una
entrada y una salida. Su representacin grfica es la siguiente:
Estructura Secuencial
Accin 1
Accin 1
Accin 1
Pg. 37
Ejemplos:
1. Calcular el salario neto de un trabajador en funcin del nmero de horas
trabajadas, precio de la hora de trabajo y considerando unos descuentos fijos
al sueldo bruto en concepto de impuestos (20 por 100).
Pseudocdigo
Inicio
{clculo salario neto}
leer nombre, horas, precio_hora
salario_bruto = horas * precio
impuestos = 0.20 * salario_bruto
salario_neto = salario_bruto_impuestos
escribir nombre, salario_bruto, salario_neto_bruto, salario_neto
Fin
Diagrama de flujo
Inicio
Diagrama N-S
Salario_bruto
horas*precio
Leer
Nombre, horas, precio
Impuesto
0.20*salario_neto
Salario_neto
salario_bruto impuesto
Escribir
Nombre, salario_bruto, salario_neto
Escribir nombre,
salario_bruto,
salario_neto
Fin
Pg. 38
Pseudocdigo
Inicio
Leer(A,B)
C=A+B
Escribir(C)
Fin
Fin
Cdigo Lenguaje C+ +:
#include "conio.h"
#include "stdio.h"
int A,B,C;
main()
{
clrscr();
gotoxy(10,10 );
printf("Digite un nmero entero ");
scanf("%d",&A);
gotoxy(10,11);
printf("Digite un nmero entero ");
scanf("%d",&B);
C= A+B;
gotoxy(10,12);
printf("La suma es: %d ",C);
getch()
}
En el ejercicio anterior se hubiera podido escribir directamente el valor de la
suma sin necesidad de almacenarlo previamente en la variable C utilizando
para ello la siguiente sentencia.
Write(La suma es: ,A+B);
Repeat until keypressed;
gotoxy(10,12);
printf("La suma es: %d ",A+B);
Pg. 39
Fin
Codigo Pascal
Pg. 40
4. Desarrolle un algoritmo que le permita leer un valor para radio (R), calcular el
rea (A) de un crculo A =*R y escribir su valor.
Anlisis: En el ejercicio se identifican como tareas las tres acciones solicitadas. Leer,
Calcular y Escribir. Cada uno de los procesos mencionados se describen en el
smbolo respectivo quedando el diagrama de flujo de la siguiente manera.
Algoritmo:
Seudo lenguaje:
Diagrama de flujo:
Inicio
Leer el valor del radio y guardarlo en la variable R Calcular el
Inicio
valor del rea aplicando la formula *R y almacenar dicho
valor en la variable A Escribir el valor encontrado para el
A, B
rea
guardado en la variable A.
A = *R2
Fin
Seudo cdigo:
Inicio
Leer( R)
A = *R
Escribir (A)
Finalizar
Cdigo Turbo Pascal:
Program rea;
Uses crt;Const pi=3.1415926;
Var R,A:real;
Begin
clrscr;
gotoxy(10,10);
write(Digite el valor de Radio R);
readln(R);
R"); A = pi*exp(2*ln(R));
gotoxy(10,12);
write( El valor del rea es: ,A);
repeat until keypressed;
End.
A
Fin
Pg. 41
Diagrama de flujo
INICIO
A,B,C
P=(A+B+C)/2
AREA=
C
FIN
Pg. 42
Pg. 43
Pg. 44
Pg. 45
Condicin
?
si
no
Acciones
Pseudocdigo en espaol
Mientras condicin hacer
Accin S1
Accin S2 :
accin Sn
Fin_mientras
Pseudocdigo en ingls
while condicin do
<Acciones>
End_while
Diagrama N-S
Mientras condicin
Acciones
Ingeniera Informtica y Sistemas UNAMBA
Pg. 46
Ejemplo:
Contar los nmeros enteros positivos introducidos por teclado. Se consideran
dos variables enteras NUMERO y CONTADOR (contar el nmero de enteros
positivos). Se supone que se leen nmeros positivos y se detiene el bucle
cuando se lee un nmero negativo o cero.
Pseudocdigo
Inicio
contador
0
Leer (numero)
Mientras numero > 0 hacer
contador
contador+1
Leer (numero)
Fin_Mientras
Escribir('El nmero de enteros positivos es : ', contador)
Fin
Diagrama de Flujo
Inicio
C0
Leer
Nmero > 0
si
C C+1
Leer
no
Escribir
Nmeros
Nmero
Fin
Pg. 47
Representacin en N-S
Inicio
C0
Leer nmero
Mientras nmero > 0
Leer nmero
C C+1
j = 0;
while (j <= 24)
{
/*Conjunto de instrucciones */
j = j + 4;
}
j = 50;
while (j > 5)
{
/*Conjunto de instrucciones */
j -= 5; /* j = j -5 */
}
j = 2;
while (j <= 20)
{
/*Conjunto de instrucciones */
j += 3;
}
Pg. 48
Ejemplos:
1. Calcular el promedio de n nmeros ingresados por el teclado
#include "iostream.h"
main()
{ int N, i, Num;
float Media, S;
cout<<"Digite cantidad de numeros a promediar ";
cin>>N; S=0; i=1;
while (i<=N)
{
cout<<"Digite el "<<i<<" numero: ";
cin>>Num;
S=S+ Num;
i++;
}
Media=S/N;
cout<<"el promedio es:"<<Media<<endl;
return 0;
}
Nota: Utilice while cuando el cuerpo del ciclo tenga que ejecutarse slo si una
condicin es cierta.
6.2.3 do/while
Similar al while, slo que se garantiza que el cuerpo del ciclo se ejecuta al menos
una vez. til para la validacin de datos dados por el usuario.
do { /*Conjunto de instrucciones*/
/*Una instruccin que en algn momento haga falsa la condicin que
controla el do/while */
} while (condicin);
Nota: Utilice do/while cuando desee que el cuerpo del ciclo se ejecute al menos
una vez.
Ejemplos:
1. Imprima la suma de los 7 primeros nmeros enteros y luego mostrar por
pantalla las diferentes sumas sucesivas, as como el resultado final.
#include <stdio.h>
void main() {
int digito = 0;
int suma = 0, n = 7;
printf("Suma desde 0 hasta 7.\n");
do{
suma = suma + digito;
printf("Suma parcial hasta %d es: %d\n",digito++,suma);
} while (digito <= n);
printf("El resultado final es: %d\n",suma);
}
Pg. 49
Pg. 50
Pg. 51
#include"iostream.h"
main()
{ int n,i,Aprobado=0,desaprobado=0;
float A[100],porcentaje;
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Nota"<<i<<":";
cin>>A[i];
}
for(i=1;i<=n;i++)
{
if(A[i]>=10.5)
Aprobado=Aprobado+1;
else
desaprobado=desaprobado+1;
}
cout<<"el numero de aprobados es:"<<Aprobado<<endl;
cout<<"el numero de desaprobados es:"<<desaprobado<<endl;
cout<<"el porcenaje de aprobados es:"<<Aprobado*100/n<<"%"<<endl;
cout<<"el porcentaje de desaprobados es:"<<desaprobado*100/n<<"%"<<endl;
return 0;
Pg. 52
La sintaxis de un if es la siguiente:
if (condicin_es_verdadera)
{ /*Bloque de instrucciones*/
}
Ejemplo:
if (n % 2 == 0)
{
cout << El nmero digitado es par;
}
A continuacin se muestra la grfica de la
estructura condicional simple.
Falso
Pseudocdigo en espaol
Si <condicin> Entonces
<accin S1>
Fin_si
Condicin?
Verdadero
Pseudocdigo en ingls
If <condicin> then
<accin S1>
end_if
Accin
Diagrama N-S
Condicin?
Verdadera
Falsa
Acciones
Pg. 53
If anidada
#include <iostream.h>
#include <stdlib.h>
void main() /*main no retorna ningn valor (no es necesario "return 0;") */
{ int numero; /* Variable de entrada */
cout << "Digite un nmero entre 1 y 5: ";
cin >> numero;
if (numero == 1)
{
cout << "El nmero digitado es: 1..." << endl;
}
if (numero == 2)
{
cout << "El nmero digitado es: 2..." << endl;
}
if (numero == 3)
{
cout << "El nmero digitado es: 3..." << endl;
}
if (numero == 4)
{
cout << "El nmero digitado es: 4..." << endl;
}
if (numero == 5)
{
cout << "El nmero digitado es: 5..." << endl;
}
system("PAUSE"); /* Ver resultado en consola antes de pulsar una tecla */
}
Nota: Utilizar la estructura de seleccin if no implica utilizar siempre un else.
Hay ocasiones en que un else no es necesario, por tanto, no lo coloque.
6.3.2 if/else
Realiza una accin si la condicin es verdadera, o realiza una accin diferente si
la condicin es falsa.
if (condicin_es_verdadera)
{
/*Bloque de instrucciones
que se ejecutarn si la
condicin es verdadera. */
}
else
{
/*Bloque de instrucciones
que se ejecutarn si la
condicin es falsa.
*/
}
if (n % 2 == 0)
{
cout << El nmero digitado es par;
}
else
{
cout << El nmero digitado es par;
}
Pg. 54
Ejemplos:
1. Un nio de la I.E. Miguel Grau desea calcular el nmeros mayor de los
dos nmeros ingresados por el teclado.
if (a>b)
INICIO
cout<<"a es mayor que b";
else
N
cout<<"b es mayor que a";
NO
N%2=0
SI
Es par
FIN
Pg. 55
Sueldo ($)
80.000
160.000
320.000
450.000
550.000
20 % de las ventas
Pg. 56
1
Accin
Accin
S1
S2
Accin
Accin
Accin
S3
S4
Sn
Diagrama N-S
Modelo 1
Modelo 2
Pseudocdigo
En ingls la estructura de decisin mltiple se representa
Case expresin of
[e1]: accin S1
[e2]: accin S2
:
[en]: accin Sn
else
accin Sx
end_case
Pg. 57
Ejemplo:
1. Se desea disear un algoritmo que escriba los nombres de los das de la
semana en funcin del valor de una variable DIA introducida por teclado.
Los das de la semana son 7; por consiguiente, el rango de valores de DIA ser
1..7, y caso de que DIA tome un valor fuera de este rango se deber producir un
mensaje de error advirtiendo la situacin anmala.
Inicio
Leer DIA
Segn_sea DIA hacer
1: escribir('Lunes')
2: escribir('Martes')
3: escribir('Mircoles')
4: escribir('Jueves')
5: escribir('Viernes')
6: escribir('Sabado')
7: escribir('Domingo')
else
escribir('Error')
fin_segn
fin
Estructura de seleccin mltiple. Se selecciona la accin a realizar, a partir de
muchos estados diferentes, dependiendo del valor de una expresin entera.
La sintaxis de un switch es la siguiente:
switch (expresion) {
case constante1:
/*Conjunto de instrucciones*/
break;
case constante2:
/*Conjunto de instrucciones*/
break;
case constante3:
/*Conjunto de instrucciones*/
break;
.
.
.
Default :
/*Conjunto de instrucciones*/
switch (numero)
{
case 1:
cout << Digit el valor 1;
break;
case 2:
cout << Digit el valor 2;
break;
case 3:
cout << Digit el valor 3;
Pg. 58
Ejemplo:
1. Leer un nmero entero 1 y 7 e imprime las siete maravillas del Per haciendo
uso de la sentencias switch.
#include"iostream.h"
main()
{
int op;
cout<<"ingrese el un numero de <1 - 7>:";
cin>>op;
switch(op)
{
case 1:cout<<" Las Lneas de Nazca "<<endl;
break;
case 2:cout<<" Lago Titicaca"<<endl;
break;
case 3:cout<<" Bosque de piedras de Huayllay"<<endl;
break;
case 4:cout<<" El Gran Pajaten"<<endl;
break;
case 5:cout<<" Meseta de Marcahuasi"<<endl;
break;
case 6:cout<<" Ciudadela de Markahuamachuco"<<endl;
break;
case 7:cout<<" Ciudadela de Chan Chan"<<endl;
break;
default:
cout<<"No corresponde a ninguna de las siete maravillas del
Per"<<endl;
break;
}
return 0;
Otra hora
0%
0%
0%
0%
0%
Pg. 59
#include <iostream.h>
#include <stdlib.h>
void main()
{ system ("CLS"); //limpiar pantalla
int hora; //Guarda la hora de llegada del cliente
float legumbres, aseo, carnes, ropa, abarrotes;
float valorReal, valorNeto;
float ahorro;
cout << "Digite el valor de compra de las frutas y verduras: ";
cin >> legumbres;
cout << "Digite el valor de compra de los productos de aseo: ";
cin >> aseo;
cout << "Digite el valor de compra de carnes:
";
cin >> carnes;
cout << "Digite el valor de compra de ropa y calzado:
";
cin >> ropa;
cout << "Digite el valor de compra de licores:
";
cin >> abarrotes;
cout << "\nDigite la opcin segn la hora de compra:\n"
<< "\n 1
: La hora est entre las 7:30 a.m y 8:30 a.m"
<< "\n 2
: La hora est entre las 8:30 a.m y 9:30 a.m"
<< "\n Otro valor : Ninguna de las anteriores"
<< "\n\nOpcin: ";
cin >> hora;
//FASE DE PROCESAMIENTO: Procesamiento de los datos
valorReal = legumbres + aseo + carnes + ropa + abarrotes;
switch(hora)
{
case 1:
ahorro = legumbres*0.1 + aseo*0.05 + carnes*0.05 + ropa*0.1 +
abarrotes*0.08;
valorNeto = valorReal - ahorro;
break; //Salir del switch
case 2 :
ahorro = legumbres*0.05 + aseo*0.02 + carnes*0.02 + ropa*0.08 +
abarrotes*0.06;
valorNeto = valorReal - ahorro;
break; //Salir del switch
default :
valorNeto = valorReal;
ahorro = 0;
}
cout << "\n************************************"
<< "\n Valor total:
" << valorReal
<< "\n Valor neto a pagar: " << valorNeto
<< "\n Usted ahorr:
" << ahorro
<< "\n************************************";
system("PAUSE"); //Ver resultados antes de pulsar una tecla
}
Pg. 60
int A[n + 5] = 8
ndice o subindice
E2
Pos 1
Arreglo[0] = E1
Arreglo[4] = E5
E3
Pos 2
E4
Pos 3
Arreglo[1] = E2
Arreglo[5] = E6
E5
Pos 4
E6
Pos 5
E7
Pos 6
Arreglo[2] = E3
Arreglo[6] = E7
E8
Pos 7
Arreglo[3] = E4
Arreglo[7] = E8
Pg. 61
system("PAUSE");
return 0;
#include <iostream.h>
#include <stdlib.h>
#define TAM 10
int main()
{
int tamanio;
int arreglo[TAM];
do {
cout << "Digite tamao del arreglo (entre 1 y 10): ";
cin >> tamanio;
} while (tamanio < 1 || tamanio > 10);
system("PAUSE");
return 0;
}
Pg. 62
Pg. 63
inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n incremento 1 en 1
leer A(i)
fin hacer
multiplicando los elementos del array
hacer para i=0 mientras i<=n incrementado 1 en 1
C(i)=A(i)*B(i)
fin hacer
imprimir C(i)
fin
Pg. 64
/*Arreglo de enteros
*/
/*Valor de inicializacin del arreglo */
/*Variable de control ciclo for
*/
cout << "Digite el valor con el que desea inicializar los elementos del arreglo: ";
Pg. 65
7. Una empresa desea procesar las ventas realizadas mes a mes anualmente con
el fin de obtener la siguiente informacin:
Mes en el que se obtuvo la mejor venta
El monto de la venta mxima obtenida
Total de las ventas
Promedio de ventas
Mostrar las ventas de menor a mayor
#include <stdlib.h>
#include <iostream.h>
void main(void)
{
float ventas[12];
//Arreglo que guarda las ventas del mes
int mes, i;
//Guarda mes(indice) de una venta en el arreglo
int mesVMax;
//Guarda el mes de la venta mxima
float ventaMax;
//Guarda el monto de la venta mxima
float totalVentas; //Guarda el monto total de ventas en el ao
float temporal;
//Se utiliza en el ordenamiento de las ventas
system("CLS");
//Limpiar pantalla
cout << "programa de procesamiento de ventas anuales: \n\n";
for(mes = 0; mes < 12 ; mes++)
{
cout << "Digite las ventas del mes nmero " << mes +1 <<": ";
cin >> ventas[mes];
}
Pg. 66
Pg. 67
#include"iostream.h"
main()
{
int n,i,Aprobado=0,desaprobado=0;
float A[100],porcentaje;
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Nota"<<i<<":";
cin>>A[i];
}
for(i=1;i<=n;i++)
{
if(A[i]>=10.5)
Aprobado=Aprobado+1;
else
desaprobado=desaprobado+1;
}
cout<<"el numero de aprobados es:"<<Aprobado<<endl;
cout<<"el numero de desaprobados es:"<<desaprobado<<endl;
cout<<"el porcenaje de aprobados es:"<<Aprobado*100/n<<"%"<<endl;
cout<<"el porcentaje de desaprobados
es:"<<desaprobado*100/n<<"%"<<endl;
return 0;
Pg. 68
encontrado=encontrado+1;
indice=i;
cout<<"el nmero "<<nBuscar<<" se encuentra en la posicin "<<indice<<endl;
}
}
if(encontrado>=1)
cout<<"el nmero "<<nBuscar<<" se repite "<<encontrado<<" veces"<<endl;
else
cout<<"no se encuentra el numero "<<nBuscar<<endl;
return 0;
}
Pg. 69
Pg. 70
Pg. 71
7.4 Ordenamiento
Pg. 72
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
if(A[i]>A[j])
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
for(i=1;i<=n;i++)
cout<<A[i]<<endl;
return 0;
Pg. 73
Codigo en C++
#include<iostream.h>
#include<conio.h>
main( )
{
int izq,der, aux,i,N,k;
float A[20];
cout<<"ingrese dimencion de matriz"; cin>>N;
k=N;izq=2;der=N;
for(i=1;i<=N;i++)
{
cout<<i<<" : "; cin>>A[i];
}
while(izq<der)
{
for(i =der;i>=izq;i--)
if (A[i-1]>A[i])
{
aux=A[i-1];
A[i-1]=A[i];
A[i]=aux;
k=i;
}
izq=k+1;
for(i =izq ;i<=der;i++)
if (A[i-1]>A[i])
{
aux=A[i-1];
A[i-1]=A[i];
A[i]=aux;
k=i;
}
der=k-1;
}
for(i=1;i<=N;i++)
cout<<A[i]<<" ";
return 0;
}
c) Insertion Sort (Metodo de Ordenamiento por Insercin)
El objetivo de este mtodo es copiar la forma como los jugadores de cartas ordenan la
baraja en una mano. El objetivo de este mtodo es insertar un elemento en la parte
izquierda del arreglo que ya se encuentra ordenada. El proceso se repite desde el
segundo hasta el n-esimo elemento.
Algoritmo:
insercion(A,N)
Inicio
Declarar i, aux, k: entero
Para i 2 hasta N haga
Aux A[i]
k i-1
Mientras Que ((k>=1) y (aux<A[k])) haga
A[k+1] A[k]
k k -1
Fin MQ
A[k+1] aux
Fin para
Fin
Ingeniera Informtica y Sistemas UNAMBA
Pg. 74
Codigo en C++
#include "iostream.h"
main()
{
int A[100],N,i,k,aux;
cout<<"ingrese la dimensin del vector";
for(i=1;i<=N;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
for(i=2; i<=N;i++)
{
aux=A[i];
k=i-1;
while((k>=1)&&(aux<A[k]))
{
A[k+1]=A[k];
k=k-1;
}
A[k+1]=aux;
}
for(k=1;k<=N;k++)
cout<<A[k]<<endl;
return 0;
}
cin>>N;
Codigo en C++
#include "iostream.h"
main()
{
int A[100],N,i,j,menor,k;
cout<<"ingrese la dimensin del vector";
for(i=1;i<=N;i++)
{
cout<<"A["<<i<<"]:"; cin>>A[i];
}
for(i=1; i<=N-1;i++)
{
menor=A[i];
k=i;
for(j=i+1; j<=N;j++)
{
if(A[j]<menor)
{
menor=A[j];
k=j;
}
}
A[k]=A[i];
A[i]=menor;
}
for(k=1;k<=N;k++)
cout<<A[k]<<endl;
return 0;
}
Pg. 75
cin>>N;
f)
Pg. 76
Fin
Top 1
Pilamenor[top] 1
Pilamayor[top] N
Mientras Que (top>0) haga
Ini pilamenor[top]
Fin pilamayor[top]
Top top-1
Pos Reduceitera(ini, fin)
Si (ini<(pos-1)) entonces
Top top+1
Pilamenor[top] ini
Pilamayor[top] pos-1
Fin si
Si (fin>(pos+1)) entonces
Top top+1
Pilamenor[top] pos+1
Pilamayor[top] fin
Fin si
Fin MQ
Pg. 77
Algoritmo
Inicio
Desde i = 1 hasta 4 hacer
Desde j = 1 hasta 4 hacer
Si i=j entonces
Matriz[i,j] =1
Sino
Matriz[i,j] =0
Fin_si
Fin_desde
Fin_desde
Fin
Pg. 78
Ejemplos:
1. Inicializar e imprimir una matriz
#include <iostream.h>
#include <stdlib.h>
#define FILAS 2
#define COL 3
int main()
{
int matriz[FILAS][COL];
/*capturar datos de la matriz */
for (int fila = 0; fila < FILAS; fila++)
{
for (int col = 0; col < COL; col++)
{
cout << "Digite el elemento de la posicin [" << fila << "][" << col << "]: ";
cin >> matriz[fila][col];
}
}
cout << "\n\n***** MATRIZ GENERADA *****\n\n" ;
for (int fila = 0; fila < FILAS; fila++)
{
for (int col = 0; col < COL; col++)
{
cout << matriz[fila][col] << "\t";
}
cout << "\n";
}
system("PAUSE");
return 0;
}
2.
3.
Pg. 79
}
4.
Pg. 80
for(j=1;j<=b;j++)
{
cout<<"B["<<i<<"]"<<"["<<j<<"]:";
cin>>B[i][j];
}
}
cout<<"multiplicando las dos matrices"<<endl;
if(m==a)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=b;j++)
{
C[i][j]=0;
for(k=1;k<=m;k++)
{
C[i][j]=C[i][j]+A[i][k]*B[k][j];
}
cout<<C[i][j]<<" ";
}
cout<<endl;
}
}
else
cout<<"no son compatibles las matrices"<<endl;
return 0;
}
5.
Tumbes
P1
P2
P3
P4
P5
P6
P0(Votos en
blanco)
Valle
Cauca
...
Caldas
Que partido obtuvo el mayor nmero de votos
Cul es el departamento con mayor nmero de abstenciones y cul es el
departamento con mayor porcentaje de abstenciones?
Pg. 81
void main()
{ int votos[DPTOS][7],votantes[DPTOS],abstencion[DPTOS],total,i,j;
int maximo,max_indice;
system("CLS");
for(i=0;i<DPTOS;i++) {
for(j=0;j<=6;j++) {
if(j == 0) {
cout<<"Votos en blanco en el Dpto " <<i<<": ";
cin>>votos[i][j]; // Almacena los datos leidos en la matriz
}
else {
cout<<"Votos del partido P"<<j<<" en el Dpto "<<i<<": ";
cin>>votos[i][j]; // Almacena los datos leidos en la matriz
}
}
}
cout<<endl;
for(i=0;i<DPTOS;i++){
cout<<"Personas que deben votar en el Dpto "<<i<<": ";
cin>>votantes[i];
}
cout <<endl;
for(j=1;j<=6;j++){
total=0; // Variable acumuladora, por lo cual hay que inicializarla en 0
for(i=0;i<DPTOS;i++){
total = total+votos[i][j];
}
cout<<"Votos obtenidos por el partido P"<<j<<": "<<total<<endl;
}
cout<<endl;
// Suma la matriz por filas para dar el total de votos por departamento
maximo=0;
for(i=0;i<DPTOS;i++){
total=0; // Variable acumuladora, por lo cual hay que inicializarla en 0
for(j=0;j<=6;j++){
total=total+votos[i][j];
if(i==1 && maximo<votos[i][j]){ // Busca el partido de ms votos en el segundo Dpto.
maximo=votos[i][j];
max_indice=j; // Almacena el ndice del partido con ms votos
}
}
abstencion[i]=votantes[i]-total; // Calcula la abstencin de una vez
cout<<"Votos totales en el Dpto "<<i<<": "<<total;
cout<<"; Vot el "<<total*100/votantes[i]<<"% de la poblacin."<<endl;
}
cout<<endl<<"El partido P"<<max_indice<<" obtuvo el mayor nmero de votos en el segundo
Dpto."<<endl<<endl;
maximo=0;
for(i=0;i<DPTOS;i++){
if(maximo<abstencion[i]){ // Busca el Dpto de ms abstencin
maximo=abstencion[i];
max_indice=i;
}
cout <<"Abstencin de "<<abstencion[i]<<" en el Dpto "<<i<<", para un porcentaje de"
<<abstencion[i]*100/votantes[i]<<"% "<<endl;
}
cout<<endl<<"El partido con mayor abstencin fue el Dpto "<<max_indice<<endl;
system("PAUSE");
}
6.
Pg. 82
Pg. 83
float U[100][100];
int i,j,k,l,m,n,tem,temporal,p;
cout<<"ingrese dimencion de matriz"; cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=2*n;j++)
{ A[i][j]=0 ;
if(j-i==n || i==j)
A[i][j]=1;
B[i][j]=A[i][j];
}
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=2*n;j++)
cout<<A[i][j]<<" ";
}
cout<<endl<<endl;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
cout<<i<<"-"<<j<<" : ";
cin>>A[i][j];
B[i][j]=A[i][j];
}
cout<<endl<<endl;
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=2*n;j++)
cout<<A[i][j]<<" ";
}
//hasta aqui ingreso matrizzzz
i=1;
for(j=1;j<=n;j++){
if(i==j && i<=n){
for(m=1;m<=2*n;m++){
U[i][m]=A[i][m]/B[i][i];
C[i][m]=U[i][m];}
}
if(i==j&&i<=n){
for(k=1;k<=n;k++)
if(i!=k && i<=n){
for(m=i;m<=2*n;m++)
C[k][m]=A[k][m]-U[i][m]*B[k][i];
}
}
for(l=1;l<=n;l++)
for(p=1;p<=n*2;p++)
A[l][p]=C[l][p];
Pg. 84
for(l=1;l<=n;l++)
for(p=1;p<=n*2;p++){
B[l][p]=A[l][p];
}
i++;
}
cout<<endl<<endl;
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=n*2;j++)
cout<<U[i][j]<<" ";
}
cout<<endl<<endl;
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=n*2;j++)
cout<<A[i][j]<<" ";
}
cout<<endl;
getch();
}
IX.
Pg. 85
FUNCIONES Y PROCEDIMIENTOS
9.1
Procedimientos
9.2
Funciones
Algoritmo:
Funcin factorial (n:entero):entero
var i,factorial:entero
inicio
si n <=1 entonces
factorial <-- 1
sino
factorial <-- 1
desde i = 1 hasta n hacer
factorial <-- factorial * 1
fin_desde
fin_si
fin
Evaluar la funcin f = x! / (y!(x-y)!)
Algoritmo hallarf
var x,y:entero
f:real
inicio
leer (x,y)
f <-- factorial (x)/(factorial (y)* factorial (x-y))
escribir ("El valor de f es:", f)
fin
Ingeniera Informtica y Sistemas UNAMBA
9.3
9.4
Pg. 86
9.5
Pg. 87
Instruccion Return
Dentro del cuerpo de la funcion deber haber una instruccion return cuando
menos para regresar el valor, esta instruccion permite regresar datos.
Cuando tratamos de resolver un problema, resulta muy til utilizar la filosofa de
divide y vencers. Esta estrategia consiste en dividir nuestro problema en otros ms
sencillos
1. Funcin suma
#include "iostream.h"
double suma(double x, double y);
int main()
{
double a, b, resul;
cout<<"teclee el primer valor";
cin>>a;
cout<<"teclee el segundo valor";
cin>>b;
resul=suma(a, b);
cout<<resul<<endl;
return 0;
}
double suma(double x, double y)
{
double z;
z=x+y;
return z;
}
2. Calcular el costo total, incluido el IGV de 5%, en la compra de cantidad_par
artculos que cuestan precio_par cada uno.
#include"iostream.h"
double articulo(int n, double p, double igv);
main()
{ double precio, factura, impuesto;
int cantidad;
cout<<"ingrese el precio del articulo: ";
cin>>precio;
cout<<"ingrese la cantidad de articulos: ";
cin>>cantidad;
cout<<"ingrese el impuesta a la venta: ";
cin>>impuesto;
factura=articulo(cantidad,precio,impuesto);
cout<<cantidad<<" articulos cuestan: "<<factura<<" nuevos soles ";
return 0;
}
double articulo(int n, double p, double igv)
{ double costo;
//const double IGV=0.05;
costo=n*p;
return (costo+costo*igv);
}
Pg. 88
Pg. 89
Pg. 90
#include "iostream.h"
double suma(double x, double y);
double resta(double x, double y);
double multiplicacion(double x, double y);
double division(double x, double y);
double a,b,resul,z;
int main()
{
int opcion;
do{
cout<<"Operaciones Bsicas"<<endl;
cout<<"1. Suma"<<endl;
cout<<"2. Resta"<<endl;
cout<<"3. Multiplicacion"<<endl;
cout<<"4. Division"<<endl;
cout<<"5. Salir"<<endl;
cout<<"ingrese la opcion entre 1-5:";
cin>>opcion;
}
while(opcion<1||opcion>5);
cout<<"teclee el primer valor: "<<endl; cin>>a;
cout<<"teclee el segundo valor: "<<endl; cin>>b;
switch (opcion)
{
case 1:resul=suma(a,b);
cout<<"El Resultado es: "<<resul<<endl; break;
return 0;
case 2:resul=resta(a,b);
cout<<"El Resultado es: "<<resul<<endl;
return 0;
case 3:resul=multiplicacion(a,b);
cout<<"El Resultado es: "<<resul<<endl;
return 0;
case 4:resul=division(a,b);
cout<<"El Resultado es: "<<resul<<endl;
return 0;
case 5:cout<<"gracias"<<endl;
return 0;
}
}
double suma(double x, double y)
{
z=a+b;
return z;}
double resta(double x, double y)
{
z=a-b;
return z;}
double multiplicacion(double x, double y)
{
z=a*b;
return z;}
double division(double x, double y)
{
z=a/b;
return z;
}
Ingeniera Informtica y Sistemas UNAMBA
Pg. 91
#include <iostream.h>
int leer(int A[100], int n);
int burbuja(int [100], int n);
void imprimir(int [100],int);
int n;
main ()
{ int n, A[100];
cout<<"ingresa cantidad de numeros:";
cin>>n;
leer(A,n);
burbuja(A,n);
return 0;
}
int leer(int A[100], int n)
{
int i;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
}
int burbuja(int A[100],int n)
{ int i,j,temp;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(A[i]>A[j])
{
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
}
imprimir(A,n);
}
void imprimir(int A[100],int n)
{
int i;
cout<<"el nuevo arreglo ordenado es : "<<endl;
for(i=1;i<=n;i++)
{
cout<<" "<<A[i];
}
}
Pg. 92
#include"iostream.h"
int leer(int A[ ], int n)
{
int i;
for(i=1;i<=n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
}
X.
Pg. 93
Recursividad
10.1 Dfinicion
Una funcin recursiva es una funcin que se llama asi misma directa o
indirectamente. La recursividad o recursin directa es el proceso por el que una
funcin se llama as misma desde el propio cuerpo de la funcin. La recursin
directa implica ms de una funcin.
Se dice que un proceso es recursivo si forma parte de s mismo, es decir, que se
define en funcin de s mismo. La recursin aparece en la vida diaria, en
problemas matemticos, en estructuras de datos y en muchos otros problemas.
Es un proceso extremadamente potente, por lo que hay que saber cundo y
cmo aplicarla.
10.2 Reglas fundamentales de la recursin
n * ( n 1)! si n 0
N=3
factorial3*factorial(2)
N=2
factorial2*factorial(1)
N=1
factorial1*factorial(0)
N=0
factorial1
Pg. 94
Ejemplos:
1. Factorial de un nmero
#include<iostream.h>
#include<conio.h>
long factorial(long);
int main()
{
int n;
cout<<"ingrese faotorial";
cin>>n;
for(int i=1; i<=n; i++)
cout << "facorial de " << i << "! = " << factorial(i) << endl;
//
getch();
return 0;
}
long factorial (long numero)
{
if (numero<=1)
return 1;
else
return(numero * factorial(numero - 1));
}
2. La serie Fibonacci
#include<iostream.h>
#include<string.h>
long fibonacci(long);
int main()
{
long numero, resultado;
cout << "\nIngrese un numero : ";
cin >> numero;
resultado = fibonacci(numero);
cout << "\nFibonacci (" << numero << ") : " << resultado<<endl;
return 0;
}
long fibonacci(long n)
{
if (n==0 || n==1)
return n;
else
return fibonacci(n-1) + fibonacci(n-2);
}
Pg. 95
3. Potencia de un numero
#include<iostream.h>
long potencia(long , long);
int main()
{
long n,x, resultado;
cout << "\nIngrese la base: ";
cin >>x;
cout << "\nIngrese la potencia: ";
cin>> n;
cout << "\n la Potencia de: " << x << " es: " << potencia(x,n)<<endl;
return 0;
}
long potencia(long x, long n)
{
if (n==0)
return 1;
else
return x * potencia(x,n-1);
}
4. Numero binario
#include "iostream.h"
#include "conio.h"
int binario(int x);
main()
{int n;
cout<<"ingrese nro en base 10";
cin>>n;
cout<<"el nro en base 2 ="<<binario(n);
getch();
}
int binario(int x)
{ //int x;
if(x==1)
return 1;
else
{
return ((binario(x/2)*10)+x%2);
}
}
XI.
Pg. 96
Estructura de Datos
11.1 Definicion de Struct
Una estructura es una agrupacin, bajo un mismo nombre de variable, distintos
datos que pueden ser de diferente tipo. Las estructuras vienen a salvar la
limitacin de los arrays, que solo almacenan un nico tipo de dato.
Una estructura tambin es llamada registro y cabe su analoga con los registros
de una tabla, donde un registro tiene varios datos (campos) y estos pueden
diferir en su tipo:
Ejemplo:
struct usuarios_t {
int dni;
char nombres[50];
char apellido[30];
time_t nacimiento;
};
//un registro usuarios:
struct usuarios_t usuario;
usuario.dni=27651109
strcpy(usuario.nombres,"Jose Maria");
...
//un array de registros:
struct usuarios_t usuarios[10];
usuario[0].dni=27651109
strcpy(usuario[0].nombres,"Jose Maria");
usuario[1].dni=26852789
strcpy(usuario[1].nombres,"Juan Carlos");
...
Ejemplo:
struct Date {
int day;
int month;
int year;
} today;
int main() {
today.day = 4;
today.month = 7;
today.year = 1776;
}
11.2 Union
Una union se declara de la misma forma que una estructura, reemplazando
struct por union. La diferencia est en que todos los miembros de la union
comparten el mismo espacio en memoria, por lo que solo se puede tener
almacenado un miembro de ellos en cada momento. El tamao de la union
estar dado por el miembro ms largo de la misma.
Pg. 97
Ejemplo:
struct usuarios_t {
int dni;
char nombres[50];
char apellido[30];
time_t nacimiento;
};
union usuario_t usuario;
/* Declaracin de la variable */
11.3 Enum
Una enumeracin es un conjunto de constantes enteras. A la enumeracin se le
puede asignar un nombre, que se comportar como un nuevo tipo de dato que
solo podr contener los valores especificados en la enumeracin.
Ejemplo:
enum dias_semana {Lunes=1, Martes=2, Miercoles=3, Jueves=4, Viernes=5,
Sbado=6, Domingo=7 };
dias_semana dia;
dia
= Lunes;
dia
= 1; /* Ambas asignaciones son equivalentes */
Ejemplo con estructuras:
1. Datos del alumno y su promedio de notas
#include "iostream.h"
#include "iomanip.h"
struct Alumno {
int codigo;
char curso[50];
int nota1;
int nota2;
int nota3;
float promedio;
};
Alumno AlumnoSec[2];
int main()
{
int i, n;
cout<<"cuantos datos desea ingresar? ";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"Ingrese el cdigo del estudiante "<<i<<" ";
cin>>AlumnoSec[i].codigo;
cout<<"Ingrese el curso del estudiante: ";
cin>>AlumnoSec[i].curso;
cout<<"Ingrese nota1: ";
cin>>AlumnoSec[i].nota1;
cout<<"Ingrese nota2: ";
cin>>AlumnoSec[i].nota2;
cout<<"Ingrese nota3: ";
Pg. 98
cin>>AlumnoSec[i].nota3;
AlumnoSec[i].promedio =
(AlumnoSec[i].nota1+AlumnoSec[i].nota2+
AlumnoSec[i].nota3)/3.0;
cout<<"el promedio es:"<<AlumnoSec[i].promedio<<endl;
}
cout<<setw(20)<<"CODIGO";
cout<<setw(20)<<"CURSO";
cout<<setw(20)<<"PROMEDIO"<<endl;
for(int c=1;c<=n;c++)
{
cout<<setw(20)<<AlumnoSec[c].codigo;
cout<<setw(20)<<AlumnoSec[c].curso;
cout<<setw(20)<<AlumnoSec[c].promedio<<endl;
}
return 0;
2. Estructura - producto
#include "iostream.h"
#include "iomanip.h"
#include "iostream.h"
struct ventas { char cod_producto[50];
char nombre_producto[50];
double precio;
int cantidad;
double importe;
};
int main()
{
const int numero=2;
ventas mante_ventas[numero];
cout<<"ingreso de productos"<<endl;
cout<<"--------------------"<<endl;
for(int i=0;i<=numero;i++)
{
cout<<"\n datos del productos"<<i+1<<endl;
cout<<"codigo: ";cin>>mante_ventas[i].cod_producto;
cout<<"Nombre: ";cin>>mante_ventas[i].nombre_producto;
cout<<"Precio: ";cin>>mante_ventas[i].precio;
cout<<"Cantidad: ";cin>>mante_ventas[i].cantidad;
mante_ventas[i].importe=(mante_ventas[i].cantidad*mante_ventas[i].precio);
}
cout<<"\n REPORTE DE PRODUCTOS"<<endl;
cout<<"-----------------------\n";
cout<<setiosflags(ios::left);
cout<<setw(10)<<"Codigo";
cout<<setw(15)<<"Nombre";
Pg. 99
cout<<setw(10)<<"Precio";
cout<<setw(10)<<"Cantidad";
cout<<setw(10)<<"Importe"<<endl;
for(int c=0;c<=numero;c++)
{
cout<<setw(10)<<mante_ventas[c].cod_producto;
cout<<setw(15)<<mante_ventas[c].nombre_producto;
cout<<setw(10)<<mante_ventas[c].precio;
cout<<setw(10)<<mante_ventas[c].cantidad;
cout<<setw(10)<<mante_ventas[c].importe<<endl;
}
return 0;
Pg. 100
cout<<lib.datos_libro.nombre;
cout<<setw(20)<<lib.datos_libro.autor;
cout<<setw(20)<<lib.datos_libro.editorial;
cout<<setw(20)<<lib.datos_libro.fecha.dia;
cout<<lib.datos_libro.fecha.mes;
cout<<lib.datos_libro.fecha.anyo;
cout<<setw(20)<<lib.costo<<endl;
return 0;
}
Pg. 101
Pg. 102
El mtodo para abrir un archivo en modo lectura es muy similar, pero en este caso
utilizaremos ifstream. Para tener el control del fichero, aparte de conocer los
modos de apertura de un archivo, debemos de conocer el delimitador, as como en
las cadenas existe el carcter de fin de cadena('\0'), en los archivos est el fin de
archivo (EOF).
El siguiente programa lee caracteres de un archivo y los imprime en pantalla hasta
llegar al fin de ste.
#include<iostream.h>
#include<fstream.h>
int main(){
char caracter;
ifstream archivo("miarchivo.txt", ios::in);
while(!archivo.eof()){
archivo.get(caracter);
cout<<caracter;
}
archivo.close();
}
El programa abre el archivo en modo de lectura, inmediatamente el indicador de
posicin se coloca en el primer caracter del flujo (el archivo), la funcin
eof() devuelve verdadero en caso de que en la posicin en la que est el indicador
est el fin de archivo, nosotros hacemos una comprobacin de sto, y mientras
(bucle while) no se llegue al final de archivo se leer un caracter de ste flujo, al
hacer esto el indicador de posicin avanzar, posteriormente se imprime el caracter
ledo en pantalla y continua el ciclo.
Que pasara si el archivo no existiese?, el programa entrara en un ciclo infinito, por
eso debemos de asegurarnos de que el flujo se ha creado bien.
#include<iostream.h>
#include<fstream.h>
int main()
{
char caracter;
ifstream archivo("miarchivo2.txt", ios::in);
if(archivo){
while(!archivo.eof()){
archivo.get(caracter);
cout<<caracter;
}
archivo.close();
}else{
cerr<<"el archivo no existe"<<endl;;
return 1;
}
return 0;
}
Para el manejo de caracteres desde un archivo podemos utilizar las funciones
miembro get, getline, read, write, ignore, gcount con las que ya tenemos un poco de
experiencia.
Ingeniera Informtica y Sistemas UNAMBA
Pg. 103
Adems de stas, existen otras funciones que nos sern muy tiles para que no sea
tan secuencial la forma en la que leemos o escribimos el archivo.
tellg()
seekg()
Pg. 104
Pg. 105
//lectura
#include <fstream.h>
#include <iostream.h>
main()
{
fstream fichero;
char texto[200];
// Abro para lectura
fichero.open("d:/ejemplo.txt", ios::in); //io::in=modo entrada
fichero >> texto;
// Leo una primera linea
while (!fichero.eof()) // Mientras se haya podido leer algo // eof:devuelve un
valor distinto a cero
{
cout << texto << endl; // Muestro lo que lei
fichero >> texto;
// Y vuelvo a intentar leer
}
fichero.close();
// Finalmente, cierro
}
12.4 Modos de abrir un archivo
Un archivo puede ser abierto de dos formas distintas, en modo texto o en modo binario.
Modo texto
Pg. 106
for(c=0;c<=17;c++){
d=cade[c];
fputc(d,arch);
}
}
fclose(arch);
if(!(arch=fopen("archivo.txt","r"))){
printf("Error");
exit(0);
}
else{
fgets(cade,18,arch);
printf("%s",cade);
}
fclose(arch);
getch();
}
Muestra un Fichero
#include <stdio.h>
void main()
{
FILE *archdisco;
archdisco = fopen("c:/alumnos3.txt", "r");
fclose(archdisco);
getchar();
}
Crear un archivo *.txt con el codigo y nombre del alumno
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
struct {
char codigo[10];
char nombre[30];
} alumno;
void main() {
//clrscr();
// captura de campos
cout<<"Digite su codigo :";
gets(alumno.codigo);
cout<<"Digite su nombre :";
gets(alumno.nombre);
// grabando a disco
FILE *archdisco;
archdisco = fopen("c:alumnos3.txt","a");
fwrite(&alumno,sizeof(alumno),1,archdisco);
fclose(archdisco);
//avisando usuario
cout<<"alumno insertado";
getchar();
}
Ingeniera Informtica y Sistemas UNAMBA
Pg. 107
Pg. 108
mensaje:
200
y 2
1000
ap 100
200
y 1
1000
ap 100
Pg. 109
200
x 100 y 1
1000
ap 100
200
y 1
1000
ap 100
Pg. 110
La razn por la cual se asocia un apuntador a un tipo de dato, es por que se debe
conocer en cuantos bytes esta guardado el dato. De tal forma, que cuando se
incrementa un apuntador, se incrementa el apuntador por un ``bloque'' de
memoria, en donde el bloque esta en funcin del tamao del dato.
Por lo tanto para un apuntador a un char, se agrega un byte a la direccin y para
un apuntador a entero o a flotante se agregan 4 bytes. De esta forma si a un
apuntador a flotante se le suman 2, el apuntador entonces se mueve dos
posiciones float que equivalen a 8 bytes.
13.2 Apuntadores y Funciones
Cuando C++ pasa argumentos a funciones, los pasa por valor, es decir, si el
parmetro es modificado dentro de la funcin, una vez que termina la funcin el
valor pasado de la variable permanece inalterado.
Hay muchos casos que se quiere alterar el argumento pasado a la funcin y
recibir el nuevo valor una vez que la funcin ha terminado. Para hacer lo
anterior se debe usar una llamada por referencia, en C se puede simular
pasando un puntero al argumento. Con esto se provoca que la computadora
pase la direccin del argumento a la funcin.
Para entender mejor lo anterior consideremos la funcin swap() que
intercambia el valor de dos argumentos enteros:
void swap(int *px, int *py);
main()
{ int x, y;
x = 10;
y = 20;
printf("x=%d\ty=%d\n",x,y);
swap(&x, &y);
printf("x=%d\ty=%d\n",x,y);
}
void swap(int *px, int *py)
{ int temp;
temp = *px; /* guarda el valor de la direccion x */
*px = *py; /* pone y en x */
*py = temp; /* pone x en y */
}
13.3 Apuntadores y arreglos
Existe una relacin estrecha entre los punteros y los arreglos. En C, un nombre
de un arreglo es un ndice a la direccin de comienzo del arreglo. En esencia, el
nombre de un arreglo es un puntero al arreglo. Considerar lo siguiente:
int a[10], x;
int *ap;
ap = &a[0]; /* ap apunta a la direccion de a[0] */
x = *ap;
/* A x se le asigna el contenido de ap (a[0] en este caso) */
*(ap + 1) = 100; /* Se asigna al segundo elemento de 'a' el valor 100 usando
ap*/
Pg. 111
Pg. 112
Guardar todas las lneas en un arreglo de tipo char grande. Observando que \n
marca el fin de cada lnea.
Guardar los apuntadores en un arreglo diferente donde cada apuntador apunta al
primer caracter de cada lnea.
Comparar dos lneas usando la funcin de la biblioteca estndar strcmp().
Si dos lneas estn desacomodadas -- intercambiar (swap) los apuntadores (no el
texto).
5.
Arreglos de apuntadores (Ejemplo de ordenamiento de cadenas).
Pg. 113
o an
f( int (*a)[35] ) { ..... }
En el ltimo ejemplo se requieren los parnteis (*a) ya que [ ] tiene una
precedencia ms alta que *.
Por lo tanto:
int (*a)[35]; declara un apuntador a un arreglo de 35 enteros, y por ejemplo si
hacemos la siguiente referencia a+2, nos estaremos refiriendo a la direccin del primer
elemento que se encuentran en el tercer rengln de la matriz supuesta, mientras que
int *a[35]; declara un arreglo de 35 apuntadores a enteros.
char anomb[10][20];
En donde es vlido hacer nomb[3][4] y anomb[3][4] en C.
Sin embargo:
anomb es un arreglo verdadero de 200 elementos de dos dimensiones tipo char.
El acceso de los elementos anomb en memoria se hace bajo la siguiente frmula
Se puede indicar que se hace un manejo ms eficiente del espacio haciendo uso
de un arreglo de apuntadores y usando un arreglo bidimensional.
Pg. 114
int *x
*x = 100;
lo adecuado ser, tener primeramente una localidad fsica de
memoria, digamos int y;
int *x, y;
x = &y;
*x = 100;
Pg. 115
Indireccin no vlida
Pg. 116
2. Array con punteros que imprime la posicin del elemento, memoria y el valor
que corresponde a cada elemento.
#include "iostream.h"
main( )
{
int A[10];
int n,i, suma=0;
int *p;
p=&A[0];
cout<<"ingrese cantidad de elementos del vector"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];
}
for(i=0;i<n;i++)
{
cout<<"A["<<i<<"]:"<<p<<" "<<*p<<endl;
suma=suma+*p;
p++;
}
cout<<"la suma de los elementos es:"<<suma<<endl;
return 0;
}
3. mtodo de burbuja utilizando punteros
#include "iostream.h"
main()
{
int A[10];
int n,i,j,temp;
int *p;
p=&A[0];
cout<<"ingrese cantidad de elementos del vector"<<endl;
cin>>n;
for(i=0;i<n;i++)
{
cout<<"A["<<i<<"]:";
cin>>A[i];}
cout<<"elementos desordenados"<<endl;
for(i=0;i<n;i++)
cout<<*(p+i)<<endl;
cout<<"el arreglo ordenado es:"<<endl;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(*(p+i)>*(p+j))
{
temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
for(i=0;i<n;i++)
cout<<*(p+i)<<endl;
return 0;
}
Ingeniera Informtica y Sistemas UNAMBA
Pg. 117
Para emplear esta matriz lo hacemos igual que con una matriz esttica es decir
Lo que si es engorroso es tener que liberar la memoria al emplear este tipo de
arreglos o matrices para este caso(2 dimensiones), bien lo haremos de la
siguiente manera:
for(int i=0; i<n; i++)
{delete[] A[i];
}
Delete A[i];
Pg. 118
El tipo de dato que pueden tener las matrices y array dinamicos son los mismos
que para las matrices y arrays estaticos: int, char, float, etc. Y asi podemos crear
matrices multidimensionales, aqui les dejo un ejemplo de una matriz
tridimensional:
3 dimensiones
Char ***M;
M=new char** [n];
for(int i=0; i<n; i++)
{ M[i]=new char*[n];
for(int j=0; j<10; j++)
{M[i][j]=new char[10];
}
}
Ejemplos:
2. EN C
#include<stdio.h>
#include<malloc.h>
int main()
{
int *arrayDinamico,tamano,i;
printf("ingresa el tamao del arreglo: ");
scanf("%d",&tamano);
arrayDinamico = (int *)malloc(tamano*sizeof(int));
for(i=0;i<tamano;i++)
{
printf("Valor para la posicion [%d]: ",i+1);
scanf("%d",arrayDinamico+i);
}
for(i=0;i<tamano;i++)
{
printf("Valor [%d]: %d\n",i,*(arrayDinamico+i));
}
}
Ingeniera Informtica y Sistemas UNAMBA
Pg. 119
3. EN C++
#include<conio.h>
#include<iostream.h>
main()
{
int *arrayDinamico,tamano,i;
cout<<"ingresa el tamano del arreglo: "; cin>>tamano;
arrayDinamico = new int;
for(i=0;i<tamano;i++)
{
cout<<"Valor para la posicion "<<"["<<i<<"]:";
cin>>arrayDinamico[i];
}
for(i=0;i<tamano;i++)
{ cout<<"["<<i<<"]:"<<*(arrayDinamico+i)<<endl;
}
return 0;
}
4. Arreglo dinmico con tipo definido
#include "iostream.h"
typedef int* ApuntInt;
int main()
{
ApuntInt p;
int n,i;
cout<<"cuantos desea ingresar";
cin>>n;
p=new int ;
for(i=0;i<=n;i++)
{
cout<<"["<<i<<"]: ";
cin>>p[i];
}
for(i=0;i<=n;i++)
{
cout<<*(p+i)<<endl;
}
return 0;
Pg. 120
cout<<"P["<<i<<"]:";
cin>>p[i];}
//metodo de insertion sort
for(i=2; i<=n;i++)
{
aux=*(p+i);
k=i-1;
while((k>=1)&&(aux<*(p+k)))
{
*(p+k+1)=*(p+k);
k=k-1;
}
*(p+k+1)=aux;
}
for(k=1;k<=n;k++)
cout<<*(p+k)<<endl;
return 0;
for(i=1;i<=n;i++)
{
cout<<*(p+i)<<endl;
}
return 0;
Pg. 121
LINK
El campo liga, que es de tipo puntero, es el que se usa para establecer la liga con
el siguiente nodo de la lista. Si el nodo fuera el ltimo, este campo recibe como
valor NIL (vaco).
A continuacin se muestra el esquema de una lista:
Juan
Luis
Mara
Sofa
NULL
Las operaciones que podemos realizar sobre listas encadenadas son las
siguientes:
Pg. 122
Recorrido. Esta operacin consiste en visitar cada uno de los nodos que forman la
lista. Para recorrer todos los nodos de la lista, se comienza con el primero, se toma
el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo
nos dar la direccin del tercer nodo, y as sucesivamente.
Insercin. Esta operacin consiste en agregar un nuevo nodo a la lista. Para esta
operacin se pueden considerar tres casos:
o Insertar un nodo al inicio.
o Insertar un nodo antes o despus de cierto nodo.
o Insertar un nodo al final.
Borrado. La operacin de borrado consiste en quitar un nodo de la lista,
redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos:
o Eliminar el primer nodo.
o Eliminar el ltimo nodo.
o Eliminar un nodo con cierta informacin.
o Eliminar el nodo anterior o posterior al nodo cierta con informacin.
Bsqueda. Esta operacin consiste en visitar cada uno de los nodos, tomando al
campo liga como puntero al siguiente nodo a visitar.
Algoritmo de Creacin
Pg. 123
c)
Algoritmo para insertar un nodo a una lista que ya existe y que est
apuntada por top
d)
Pg. 124
e)
Pg. 125
Luis
Mara
Sofa
Algoritmo de creacin
b)
Pg. 126
Pg. 127
Una lista doble, o doblemente ligada es una coleccin de nodos en la cual cada
nodo tiene dos punteros, uno de ellos apuntando a su predecesor (Ant) y otro a
su sucesor (Sig). Por medio de estos punteros se podr avanzar o retroceder a
travs de la lista, segn se tomen las direcciones de uno u otro puntero.
En estas listas cada nodo conoce quien es el siguiente nodo y quien es el
anterior.
Ant Dato Sig
NODO
Donde Ant y Sig son punteros a NODO.
TOP
NULL
NULL
FIN
Dado que las listas doblemente encadenadas se pueden recorrer de izquierda a
derecha y vise versa
Es necesario mantener dos punteros indicando los extremos de la lista, el
puntero TOP al inicio y el puntero FIN al trmino.
Existen dos tipos de listas doblemente ligadas:
Listas dobles lineales. En este tipo de lista doble, tanto el puntero
izquierdo del primer nodo como el derecho del ltimo nodo apuntan a NULL.
Listas dobles circulares. En este tipo de lista doble, el puntero izquierdo del
primer nodo apunta al ltimo nodo de la lista, y el puntero derecho del ltimo nodo
apunta al primer nodo de la lista.
a)
b)
Pg. 128
Recorrido a la Derecha
P = top
repite
escribe(p->dato)
p = p->sig
hasta p = top->ant
Recorrido a la Izquierda
P = top
repite
escribe(p->dato)
p = p->ant
hasta p = top->sig
g)
Pg. 129
Antes de x
Despus de x
p = top
lee(x)
repite
si p->dato = x entonces
q = new nodo
leer(q->dato)
si p = top entonces
top = q
q->sig = p
q->ant = p->ant
p->sig->ant = q
p->ant = q
p = top
en caso contrario
p = p->sig
hasta p = top
p = top
lee(x)
repite
si p->dato = x entonces
q = new nodo
leer(q->dato)
q->sig = p->sig
q->ant = p
p->sig->ant = q
p->sig = q
p = top
en caso contrario
p = p->sig
hasta p=top
1.
#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
struct elemento
{
char apellido[30];
char nombre[20];
float nota;
struct elemento *siguiente;
};
Pg. 130
main( )
{
struct elemento *p;
struct elemento *q;
int n;
cout<<"numero de elemento";
cin>>n;
p=NULL;
for(n;n>0;n--)
{
q=new elemento;
q->siguiente = p;
p=q;
cout<<"apellidos: "; gets(q->apellido);
cout<<"nombres: "; gets(q->nombre);
cout<<"nota: "; cin>>q->nota;
}
q=p;
while(q!=NULL)
{
cout<<q->apellido<<" "<<q->nombre<<" "<<q->nota<<endl ;
q=q->siguiente;
}
getch( );
}
2.
#include "iostream.h"
#include "stdlib.h"
struct Nodo
{
int dato;
Nodo *enlace;
};
typedef Nodo* ApuntNodo;
main( )
{
ApuntNodo cabeza;
int el_numero;
ApuntNodo apunt_temp;
apunt_temp=new Nodo;
if(apunt_temp==NULL)
{
cout<<"Error: No hay suficiente memoria";
exit(0);
}
cout<<"ingrese un elemento";
cin>>el_numero;
apunt_temp->dato=el_numero;
apunt_temp->enlace=cabeza;
cabeza=apunt_temp;
cout<<"el elemento ingresado es:"<<cabeza->dato<<endl;
return 0;
}
3.
Pg. 131
#include "iostream.h"
#include "stdlib.h"
struct Nodo
{
int dato;
Nodo *enlace;
};
typedef Nodo* ApuntNodo;
void insertar_cabeza(ApuntNodo& cabeza, int el_numero)
{
ApuntNodo apunt_temp;
apunt_temp=new Nodo;
if(apunt_temp==NULL)
{
cout<<"Error";
exit(1);
}
apunt_temp->dato=el_numero;
apunt_temp->enlace=cabeza;
cabeza=apunt_temp;
}
void imprimir(ApuntNodo cabeza)
{
cout<<"la lista es:";
//while( !=NULL)
//{
cout<<cabeza->dato<<endl;
cabeza=cabeza->enlace;
//}
}
void main( )
{
ApuntNodo cabeza;
int el_numero;
cout<<"ingrese el numero";
cin>>el_numero;
insertar_cabeza(cabeza,el_numero);
imprimir(cabeza);
}
4.
#include "iostream.h"
#include "stdlib.h"
#include "conio.h"
struct Nodo
{
int dato;
Nodo *enlace;
};
typedef Nodo* ApuntNodo;
Pg. 132
5.
#include "iostream.h"
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
struct Nodo
{
int dato;
Nodo *enlace;
};
Ingeniera Informtica y Sistemas UNAMBA
Pg. 133
}
}
Pg. 134
}
6.
#include<iostream.h>
#include<conio.h>
struct nodo
{
char dato;
nodo *sgt;
};
typedef nodo *puntero;
void inserta_inicio(puntero &lista,char valor);
void eliminarelemento(puntero &lista,char valor);
void ver_lista(puntero );
main( )
{ int op,pos,i=0;
char valor;
puntero lista=NULL;
do
{
clrscr( );
cout<<"===MENU==="<<endl;
cout<<"1: inserte al inicio"<<endl;
cout<<"2: eliminar un elemento"<<endl;
cout<<"3: ver lista"<<endl;
cout<<"4: salir"<<endl;
cout<<"ingrese su opcion..";
cin>>op;
switch(op)
{
case 1:cout<<"ingrese el valor : ";
cin>>valor;
inserta_inicio(lista,valor);
break;
case 2:cout<<"ingrese valor a eliminar: ";
cin>>valor;
eliminarelemento(lista, valor);
break;
case 3:ver_lista(lista);
Ingeniera Informtica y Sistemas UNAMBA
Pg. 135
getch( );
break;
}
}while(op!=4);
}
void inserta_inicio(puntero &lista, char valor)
{ puntero nuevo;
nuevo=new(struct nodo);
nuevo->dato=valor;
nuevo->sgt=lista;
lista=nuevo;
}
void eliminarelemento(puntero &lista,char valor)
{ puntero nuevo,anterior;
nuevo=lista;
while(nuevo!=NULL)
{
if(nuevo->dato==valor)
{
if(nuevo==lista)
lista=lista->sgt;
else
anterior->sgt=nuevo->sgt;
delete(nuevo);
return ;
}
anterior=nuevo;
nuevo=nuevo->sgt;
}
}
void ver_lista(puntero lista)
{
while(lista!=NULL)
{
cout<<"|"<<lista->dato<<"|->";
lista=lista->sgt;
}
getch( );
7.
#include <conio.h>
#include <stdlib.h>
#include <iostream.h>
typedef struct nodo
{
int dato;
struct nodo *sig;
} NODO;
Ingeniera Informtica y Sistemas UNAMBA
Pg. 136
}
else cout<<"Memoria insuficiente";
}
Pg. 137
Pg. 138
15.2 PILAS
El smil del que deriva el nombre de la estructura es una pila de platos. Slo es
posible aadir platos en la parte superior de la pila, y slo pueden tomarse del
mismo extremo.
Pg. 139
El nodo tpico para construir pilas es el mismo que vimos en el captulo anterior
para la construccin de listas:
struct nodo {
int dato;
struct nodo *siguiente;
};
15.2.2 Aplicaciones de las pilas:
En compiladores
Sistemas operativos
Programas de aplicacin
Programa
Principal
I
Subprograma
A
Subprograma
B
Subprograma
C
15.2.3 Representacin en Memoria
Las pilas no son estructuras de datos fundamentales, es decir, no estn definidas
como tales en los lenguajes de programacin. Las pilas pueden representarse
mediante el uso de:
Arreglos.
Listas enlazadas.
Nosotros ahora usaremos los arreglos. Por lo tanto debemos definir el tamao
mximo de la pila, adems de un apuntador al ltimo elemento insertado en la
pila el cual denominaremos SP. La representacin grfica de una pila es la
siguiente:
Pg. 140
1. Incrementar la pila
2. Repetir
o Tomar un caracter.
o Si el caracter es un operando colocarlo en la pila.
o Si el caracter es un operador entonces tomar los dos valores del tope de la
pila, aplicar el operador y colocar el resultado en el nuevo tope de la pila.
(Se produce un error en caso de no tener los 2 valores)
3. Hasta encontrar el fin de la expresin RPN.
Pg. 141
15.2.7 Recursin
Podemos definir la recursividad como un proceso que se define en trminos de
s mismo.
El concepto de recursin es difcil de precisar, pero existen ejemplos de la vida
cotidiana que nos pueden servir para darnos una mejor idea acerca de lo que es
recursividad. Un ejemplo de esto es cuando se toma una fotografa de una
fotografa, o cuando en un programa de televisin un periodista transfiere el
control a otro periodista que se encuentra en otra ciudad, y este a su vez le
transfiere el control a otro.
Casos tpicos de estructuras de datos definidas de manera recursiva son los
rboles binarios y las listas enlazadas.
La recursin se puede dar de dos formas:
Pg. 142
Pg. 143
15.3 Colas
15.3.1 Definicin
Una cola es un tipo especial de lista abierta en la que slo se puede insertar
nodos en uno de los extremos de la lista y slo se pueden eliminar nodos en el
otro. Adems, como sucede con las pilas, las escrituras de datos siempre son
inserciones de nodos, y las lecturas siempre eliminan el nodo ledo.
Este tipo de lista es conocido como lista FIFO (First In First Out), el primero en
entrar es el primero en salir.
El smil cotidiano es una cola para comprar, por ejemplo, las entradas del cine.
Los nuevos compradores slo pueden colocarse al final de la cola, y slo el
primero de la cola puede comprar la entrada.
Ejemplo: una cola de un autobuses en la calle, una cola para ingresar al estudio.
Aplicaciones: un sistema de tiempo compartido suele haber un procesador
central y una serie de perifricos compartidos: disco, impresoras, etc.
Pg. 144
El nodo tpico para construir pilas es el mismo que vimos en los captulos
anteriores para la construccin de listas y pilas:
struct nodo {
int dato;
struct nodo *siguiente;
};
15.3.2 Declaraciones de tipos
Los tipos que definiremos normalmente para manejar colas sern casi los
mismos que para manejar listas y pilas, tan slo cambiaremos algunos nombres:
typedef struct _nodo {
int dato;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Cola;
tipoNodo es el tipo para declarar nodos, evidentemente.
pNodo es el tipo para declarar punteros a un nodo.
Cola es el tipo para declarar colas.
DATO
DATO
DATO
DATO
Primero
NULL
ltimo
Es evidente, a la vista del grfico, que una cola es una lista abierta. As que sigue
siendo muy importante que nuestro programa nunca pierda el valor del puntero
al primer elemento, igual que pasa con las listas abiertas. Adems, debido al
funcionamiento de las colas, tambin deberemos mantener un puntero para el
ltimo elemento de la cola, que ser el punto donde insertemos nuevos nodos.
Teniendo en cuenta que las lecturas y escrituras en una cola se hacen siempre
en extremos distintos, lo ms fcil ser insertar nodos por el final, a
continuacin del nodo que no tiene nodo siguiente, y leerlos desde el principio,
hay que recordar que leer un nodo implica eliminarlo de la cola.
15.3.3 Operaciones bsicas con colas
De nuevo nos encontramos ante una estructura con muy pocas operaciones
disponibles. Las colas slo permiten aadir y leer elementos:
Aadir un elemento:
Las operaciones con colas son muy sencillas, prcticamente no hay casos
especiales, salvo que la cola est vaca.
Aadir elemento en una cola vaca:
Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que
apunte a l, adems los punteros que definen la cola, primero y ultimo que
valdrn NULL:
Ingeniera Informtica y Sistemas UNAMBA
Pg. 145
NULL ltimo
ltimo
nodo
NULL NULL
DATO
ltimo
NULL
DATO
ltimo
nodo
DATO
nodo
ltimo
NULL
DATO
DATO
Primero
nodo
DATO
NULL
ltimo
Pg. 146
DATO
DATO
Primero
nodo
NULL
ltimo
DATO
Primero
nodo
ltimo
DATO
NULL
ltimo
Ejemplo de cola en C:
Construiremos una cola para almacenar nmeros enteros. Haremos pruebas
insertando varios valores y leyndolos alternativamente para comprobar el
resultado.
Algoritmo de la funcin "Anadir":
1.
2.
3.
4.
5.
Pg. 147
Pg. 148
Pg. 149
void extraer(void)
{
if (CAB==NULL) return;
AUX=CAB;
CAB=CAB->sig;
free(AUX);
if (CAB==NULL)
{
FIN=AUX=NULL;
}
}
void visualizar(void)
{
if (CAB==NULL) return;
AUX=CAB;
while (AUX!=NULL)
{
cout<<"nombre:"<<AUX->nombre<<endl;
AUX=AUX->sig;
}
getch();
}
Pg. 150
Pg. 151
Pg. 152
E
Fig. 3
Fig. 2
I
Nivel de un Nodo
El nivel de un nodo es el nmero de nodos contados en forma ascendente hacia la raz.
A
Pg. 153
En este caso el recorrido se realiza en orden por los distintos niveles del rbol.
As, se comenzara tratando el nivel 1, que slo contiene el nodo raz,
seguidamente el nivel 2, el 3 y as sucesivamente. En el rbol de la figura el
recorrido en amplitud sera: 2, 7, 5, 2, 6, 9, 5, 11 y 4.
Al contrario que en los mtodos de recorrido en profundidad, el recorrido por
niveles no es de naturaleza recursiva. Por ello, se debe utilizar una cola para
recordar los subrboles izquierdos y derecho de cada nodo.
void amplitud(tArbol *a)
{
tCola cola;
tArbol *aux;
if (a != NULL) {
crearCola(cola);
encolar(cola, a);
while (!colavacia(cola)) {
desencolar(cola, aux);
visitar(aux);
//Realiza una operacin en nodo
if (aux->hIzquierdo != NULL) encolar(cola, aux->hIzquierdo );
if (aux->hDerecho!= NULL) encolar(cola, aux->hDerecho);
}
}
}
Pg. 154
Profundidad 1
A
B
Fig. 5
Profundidad 4
E
Fig. 6
F
16.1.8 rboles Binarios
Un rbol binario es aquel en el que todos sus nodos tienen como mximo dos nodos
hijos; est formado por un nodo raz desde donde parten dos subrboles: subrbol
izquierdo y subrbol derecho, donde cada subrbol es un rbol binario.
rbol binario equilibrado: En este rbol binario la diferencia del nmero de niveles
entre los subrboles de cualquier nodo es la unidad.
rbol binario perfectamente equilibrado: Los subrboles de todos los nodos tienen el
mismo, nmero de niveles.
rbol binario completo: Todos los nodos del rbol a excepcin de los nodos terminales
tienen 2 hijos.
Un rbol es binario cuando cualquier nodo del rbol puede tener como mximo dos
nodos hijos.
A
Fig. 7
Pg. 155
Cuando el rbol (A) esta vaci, entonces (A) es un rbol binario lleno de altura
cero.
Cuando el rbol (A) no est vaci, entonces (A) es un rbol binario lleno si los
subrboles de la raz son ambos rboles binarios llenos de altura h menos 1.
Ejemplo:
rbol de altura 3
A
Pg. 156
E
H
F
I
En este caso se trata primero el subrbol izquierdo, despus el nodo actual y por
ltimo el subrbol derecho. En un ABB este recorrido dara los valores de clave
ordenados de menor a mayor. En el rbol de la figura el recorrido en inorden
sera: 2, 7, 5, 6, 11, 2, 5, 4 y 9.
En conclusin consiste en visitar primero el subrbol izquierdo, luego visitar la raz y
finalmente visitar el subrbol derecho.
Pseudocdigo:
Pg. 157
A
B
A
C
J
Pseudocdigo:
Pg. 158
Ejemplo:
14,15,4,9,7,18,3,5,16,20,17
14
15
18
16
20
Fig. 9
5
17
14,4,3,9,7,5,15,18,16,17,20
3,4,9,7,5,14,15,18,16,17,20
3,5,7,9,4,17,16,20,18,15,14
Fig. 10
Subrbol izquierdo: 3+2=5/5=1
Pg. 159
La Notacin Infija
La notacin infijo es habitual, el orden es primer operando, operador y segundo
operando.
La Notacin Prefija
El orden es operador primer operando y segundo operando.
La Notacin Posfija
El orden es primer operando, segundo operando y operador.
La Notacin Funcional
Se escribe primero el operador funcin y despus (los operadores separados por
comas).
La Notacin Infija
Tiene problema con expresiones con ms de un operador existe ambigedad sobre
cul es el orden de evaluacin.
Ejemplo
8/4/2
Se puede interpretar de dos formas:
(8/4)/2 v
8/(4/2)
Las otras notaciones no sufren este problema.
Para resolver esta ambigedad se aaden unas reglas denominadas orden de
precedencia de operadores, cuando dos operadores compiten con el mismo operando
entonces en este caso gana el operador con mayor precedencia que se encuentra
situado ms a la izquierda.
Las reglas de precedencia habituales son que los operadores divisin y producto tienen
igual precedencia y gana el resto de operadores, la resta tiene igual precedencia y gana
el operador igualdad.
Ejemplos:
Notacin Infija
Notacin Prefija
Notacin Posfija
Notacin Funcional
2+(3*4)=x
2+3*4=x
=+ 2 * 3 4 x
234*+x=
= (+(2,*(3,4)),4)
((2+3)*4)
(2+3)*4=x
=* + 2 3 4 x
23+4*x=
=(*(+(2,3),4),x)
((2*4)-(8/2))=x
2*4-8/2=x
=-*24/82x
2 4 * 8 2 / - x=
=(-(*(2,4),/(8,2),x)
Pg. 160
{
int i;
char newnod,chain[100],elementos;
clrscr();
ARBOL raiz=NULL;
cout<<"Introduzca una cadena de caracteres (max. 100 elementos)\n";
gets(chain);
elementos=strlen(chain);
for(i=1;i<=elementos;i++)
{
newnod=chain[i-1];
insertanodonuevo(&raiz,newnod);
}
cout<<"\n\n preorden \t";
preorden(raiz);
cout<<"\n\n inorden \t";
inorden(raiz);
cout<<"\n\n postorden \t";
postorden(raiz);
getch();
treefree(raiz);
raiz=NULL;
return 0;
}
Pg. 161
Pg. 162
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
struct nodoarbol{ //estructura del arbol
struct nodoarbol *izqnodo;
int info;
struct nodoarbol *dernodo;
};
typedef struct nodoarbol nodo; //definicion de tipo nodo
typedef nodo *arbol; //declaracion de variable puntero a nodo
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void insertanodonuevo(arbol *,int); //declaracion de funciones
void inorden(arbol);
void preorden(arbol);
void postorden(arbol);
void treefree(arbol);
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
main(){
int i; //contador
char newnod,chain[200],elementos; //declaracion de cadena,bandera y variable que
contiene el nuevo valor a insertar en el arbol
clrscr();
arbol raiz=null; //declaracion de variable de tipo arbol
printf("\n\n\tintroduzca una cadena de caracteres (max. 200 elementos):\n");
gets(chain);
elementos=strlen(chain); //checa el tamao de la cadena y establece el numero de
nodos del arbol
for(i=1;i<=elementos;i++) {
newnod=chain[i-1];
insertanodonuevo(&raiz,newnod);
}
printf("\n\n preorden \t");
preorden(raiz); //llamado a funcion de recorrido en preorden
printf("\n\n inorden \t");
inorden(raiz); //llamado a funcion de recorrido en inorden
printf("\n\n postorden \t");
postorden(raiz); //llamado a funcion de recorrido en postorden
getch();
treefree(raiz); //liberacion de memoria del arbol.
raiz=null; //asignacion de un valor nulo a la raiz.
return 0;
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
/*-crea un nuevo nodo y coloca los valores del nuevo elemento en la posicion
correspondiente */
void insertanodonuevo(arbol *rarbol,int nuevo){
if(*rarbol==null){ //creacion de un nuevo nodo
*rarbol=(nodo *)malloc(sizeof(nodo));
if(*rarbol!=null){
//asignacion de valores nuevos en el nodo nuevo
(*rarbol)->info=nuevo;
(*rarbol)->izqnodo =null;
Ingeniera Informtica y Sistemas UNAMBA
Pg. 163
(*rarbol)->dernodo=null;
}
else{printf("\n memoria no disponible !!!!\n");}
}
else
if(nuevo<(*rarbol)->info) //checa si el elemento nuevo es mayor que el elemento
padre
insertanodonuevo(&((*rarbol)->izqnodo),nuevo); //coloca el elemento a la izquierda
del padre o raiz
else
if(nuevo>(*rarbol)->info) //checa si el elemento nuevo es menor que el elemento
padre
insertanodonuevo(&((*rarbol)->dernodo),nuevo); //coloca el elemento a la derecha
del padre o raiz
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//funcion iterativa la cual recorre el arbol imprimiendo siempre el valor
//que contiene la raiz,despues la rama izquierda,luego la rama derecha,siempre
//y cuando la raiz sea diferente de un valor nulo, si es nulo salta a la siguiente
instruccion.
void preorden(arbol rarbol){
if(rarbol!=null){
printf(" %c ",rarbol->info);
preorden(rarbol->izqnodo);
preorden(rarbol->dernodo);
}
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//funcion iterativa la cual recorre el arbol buscando el nodo mas izquierdo
//que contiene el arbol o sea hasta que la rama del ultimo nodo sea nulo,luego la
imprime,despues
//despues la raiz del sub-arbol,y luego el nodo de la derecha.
void inorden(arbol rarbol){
if(rarbol!=null){
inorden(rarbol->izqnodo);
printf(" %c ",rarbol->info);
inorden(rarbol->dernodo);
}
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//funcion iterativa la cual recorre el arbol buscando el nodo que esta mas a la izquierda
//luego el nodo de la derecha y luego la raiz de ese sub-arbol
void postorden(arbol rarbol){
if(rarbol!=null){
postorden(rarbol->izqnodo);
postorden(rarbol->dernodo);
printf(" %c ",rarbol->info);
}
}
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//funcion iterativa identica al recorrido en postorden la unica diferencia
//es que en vez de imprimir en pantalla el valor de un nodo este es
//eliminado del arbol liberando la memoria con la funcion free(), elegi esta
Ingeniera Informtica y Sistemas UNAMBA
Pg. 164
//forma ya que se elimina primero los nodos hijo de el sub-arbol y luego la raiz
//ya que si se elimina la raiz primero, los datos de los hijos se desconectan
//del arbol pero la memoria que ocupaban sigue siendo utilizada y de esta forma
//se elimina el arbol de abajo hacia arriba (o sea de los hijos a la raiz).
void treefree(arbol rarbol){
if(rarbol!=null){
treefree(rarbol->izqnodo);
treefree(rarbol->dernodo);
free(rarbol);
}
}
Pg. 165
//Algoritmo de Arboles
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<graphics.h>
typedef struct nodo{
int dato;
struct nodo *izquierda;
struct nodo *derecha;
}NODOARBOL;
typedef NODOARBOL tarbolb;
void insertar(tarbolb **,int);
void inorden(tarbolb *);
void preorden(tarbolb *);
void postorden(tarbolb *);
void buscar(tarbolb *,int);
void eliminar(tarbolb **,int);
void reemplazar(tarbolb **);
int numeronodos(tarbolb *);
void mostarmenor(tarbolb *,int);
int hojas(tarbolb *);
int alturanodo(tarbolb cabeza,int);
void crear(struct nodo **);
void insertar(struct nodo **,int);
void recorrer_InOrden(struct nodo **);
void recorrer_PostOrden(struct nodo **);
void recorrer_PreOrden(struct nodo* *);
int buscar(struct nodo **,int);
void eliminar(struct nodo **,int);
void unir(struct nodo **,struct nodo **);
void cambiar(struct nodo **,int,int);
void mostrar();
void dibujar(struct nodo *,int ,int ,int ,int );
int menu(void);
void poner_recuadro(void);
int acerca_de(void);
void cuadro();
main(){
int elemento;
tarbolb *raiz=NULL;
int opcion;
int gdriver = DETECT, gmode;
clrscr();
for(;;){
clrscr();
opcion=menu();
switch(opcion){
case 6:{
Ingeniera Informtica y Sistemas UNAMBA
case 8:{
case 10:{
Pg. 166
clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"ingrese : ";
cin>>elemento;
insertar(&raiz,elemento);
getch();
}
break;
clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"El arbol en preorden es :"<<endl;
preorden(raiz);
getch();
}
break;
clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"El arbol en inorden es :"<<endl;
inorden(raiz);
getch();
}
break;
case 12:{
case 14:{
case 16:{
clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"El arbol postoreden es :"<<endl;
postorden(raiz);
getch();
}
break;
clrscr();
cuadro();
window(1,1,80,25);
gotoxy(4,3);
cout<<"Elemento a buscar : ";
cin>>elemento;
buscar(raiz,elemento);
getch();
}
break;
clrscr();
cuadro();
window(1,1,80,25);
Pg. 167
gotoxy(4,3);
cout<<"Elemento a eliminar : ";
cin>>elemento;
eliminar(&raiz,elemento);
getch();
}
break;
case 18: {
clrscr();
initgraph(&gdriver,&gmode,"e:\\BC45\\BGI");
dibujar(raiz,15,3,7,0);
getch();
cleardevice();
closegraph();
}
}
int menu(){
int pos=6;
char aux;
poner_recuadro();
for( ; ; ){
switch(pos){
case 6 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" INSERTAR ELEMENTO ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" INSERTAR ELEMENTO ");
break;
case 8 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" RECORRIDO PRE-ORDEN ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" RECORRIDO PRE-ORDEN ");
break;
case 10 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" RECORRIDO IN-ORDEN ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" RECORRIDO IN-ORDEN ");
break;
Ingeniera Informtica y Sistemas UNAMBA
Pg. 168
case 12 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" RECORRIDO POST-ORDEN ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" RECORRIDO POST-ORDEN ");
break;
case 14 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" BUSCAR ELEMENTO ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" BUSCAR ELEMENTO ");
break;
case 16 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf(" ELIMINAR ELELEMENTO ");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf(" ELIMINAR ELELEMENTO ");
break;
case 18 : gotoxy(26,pos);
textcolor(YELLOW);
textbackground(BLACK);
cprintf("
GRAFICAR
");
aux=getch();
textcolor(15);
textbackground(4);
gotoxy(26,pos);
cprintf("
GRAFICAR
");
break;
}
switch(aux){
case 0x48 : pos=pos-2;
if(pos==4) pos=18;
break;
case 0x50 : pos=pos+2;
if(pos==17) pos=3;
break;
case 0x0d : return pos;
case 0x44 : exit(0);
case 0x3b : break;
case 0x3c : acerca_de();
}
}
Pg. 169
void poner_recuadro(void){
int i;
textbackground(18);
clrscr();
clrscr();
cuadro();
textcolor(BLUE);
textbackground(CYAN);
gotoxy(23,4);
cprintf("[Menu Principal]");
for(i=0;i<16;i++){
gotoxy(23,i+5);
textbackground(CYAN);
cprintf("
");
}
gotoxy(23,20);
cprintf("[ UNAMBA ]");
textcolor(WHITE);
textbackground(RED);
gotoxy(26,6);
cprintf(" INSERTAR ELEMENTO ");
gotoxy(26,8);
cprintf(" RECORRIDO PRE-ORDEN ");
gotoxy(26,10);
cprintf(" RECORRIDO IN-ORDEN ");
gotoxy(26,12);
cprintf(" RECORRIDO POST-ORDEN ");
gotoxy(26,14);
cprintf(" BUSCAR ELEMENTO ");
gotoxy(26,16);
cprintf(" ELIMINAR ELELEMENTO ");
gotoxy(26,18);
cprintf("
GRAFICAR
");
}
void cuadro()
{
int i;
gotoxy(2,2);
cprintf("");
for(i=3;i<24;i++){
gotoxy(2,i);
cprintf("
");
}
gotoxy(2,24);
cprintf("[F2 Acerca de][F10 Salir]");
}
int acerca_de(void){
window(10,6,70,18);
textcolor(WHITE);
textbackground(BLUE);
clrscr();
cprintf("\n\r
UNIVERSIDAD NACIONAL DE APURIMAC");
cprintf("\n\n\r
carrera de ingenieria informatica y sistemas\n\r\n\r");
cprintf("
ALGORITMICA II\n\r\n\r");
Ingeniera Informtica y Sistemas UNAMBA
Pg. 170
cprintf("
Autor: Pool Nichel Aguilar Baez\n\r");
cprintf("
Curso: Algoritmica II\n\r\n\r");
cprintf("
Semestre: 2008-II - diciembre/2008\n\r");
window(1,1,80,25);
getch();
poner_recuadro();
return(0);
Pg. 171
Pg. 172
Pg. 173
Pg. 174
buscar((cabeza)->derecha,elemento);
else
buscar((cabeza)->izquierda,elemento);
}
}
void insertar(tarbolb **cabeza,int elemento){
if(*cabeza==NULL){
*cabeza=(tarbolb *)malloc(sizeof(tarbolb));
if(*cabeza==NULL){
cout<<"no hay memoria"<<endl;
return;
}
(*cabeza)->dato=elemento;
(*cabeza)->izquierda=NULL;
(*cabeza)->derecha=NULL;
}
else if(elemento<(*cabeza)->dato)
insertar(&(*cabeza)->izquierda,elemento);
else if(elemento>(*cabeza)->dato)
insertar(&(*cabeza)->derecha,elemento);
else{
cout<<"No puede insertar valor duplicado"<<endl;
getch();
return;
}
}
void inorden(tarbolb *cabeza){
if(cabeza!=NULL){
inorden(cabeza->izquierda);
cout<<" "<<cabeza->dato;
inorden(cabeza->derecha);
}
}
void preorden(tarbolb *cabeza){
if(cabeza!=NULL){
cout<<" "<<cabeza->dato;
preorden(cabeza->izquierda);
preorden(cabeza->derecha);
}
}
void postorden(tarbolb *cabeza){
if(cabeza!=NULL){
postorden(cabeza->izquierda);
postorden(cabeza->derecha);
cout<<" "<<cabeza->dato;
}
}
Pg. 175
16.2 GRAFOS
Pg. 176
e) Tipos De Trayectoria
Existen dos tipos de trayectoria: La simple y el ciclo.
S una trayectoria o camino de vi a vj no tiene vrtices repetidos, se llama:
Trayectoria simple. Un circuito o ciclo es una trayectoria o camino que empieza y
termina en el mismo vrtice y no tiene aristas repetidas. El circuito se llamar
simple si no tiene aristas ni vrtices repetidos, excepto el primero y el ltimo.
Ciclo: Es una trayectoria simple donde el primero y el ltimo nodo son iguales. En
no dirigidos su longitud mnima es de 3 y en dirigidos es de 2.
Sea G = (V, E) un grafo con V vrtices y E aristas, entonces le corresponde una matriz
VE denominada la matriz de incidencia de G. Si denotamos los vrtices de G por v 1, v 2,
. . . , vV y las aristas por e1, e2, . . . , e E". Entonces la matriz de incidencia de G es la matriz
M (G) = [mij] donde mij es el nmero de veces que la arista ej incide en el vrtice vi; los
valores son 0,1 2 (2 en el caso que la arista sea un lazo).
Otra matriz asociada a G es la matriz de adyacencia, esta es una matriz v v A(G)[a ij],
en donde a ij es el nmero de aristas que van de vi hasta vj. A continuacin damos un
ejemplo de un grafo con su correspondiente matriz de incidencia y matriz de
adyacencia.
16.2.6 Caminos
Se llama caminos a una secuencia de aristas (V1, V2, V3Vn) de la manera que el vrtice
final de cada uno sirve de vrtice inicial al siguiente.
Pg. 177
Pg. 178
Por ejemplo:
Para ir de A a D, podra ser:
(A,B,D),(A,C,D),(A,B,C,D) (A,C,B,D)
c)
d)
Camino cerrado.- es aquel cuyo vrtice final coincide con el vrtice inicial.
Ej. Un ciclo(A, B, C, D, A)
e)
f)
Caminos Hamiltonianos
Un ciclo es un camino, es decir una sucesin de aristas adyacentes, donde no se
recorre dos veces la misma arista, y donde se regresa al punto inicial. Un ciclo
hamiltoniano tiene adems que recorrer todos los vrtices exactamente una vez
(excepto el vrtice del que parte y al cual llega). Por ejemplo, en un museo
grande, lo idneo sera recorrer todas las salas una sola vez, esto es buscar un
ciclo hamiltoniano en el grafo que representa el museo (los vrtices son las salas,
y las aristas los corredores o puertas entre ellas).
Un circuito o ciclo hamiltoniano es un ciclo simple que contiene todos los vrtices
de G. Lo anterior quiere decir que un circuito hamiltoniano es una trayectoria que
empieza y termina en el mismo vrtice, no tiene aristas repetidas y pasa por
cada vrtice una sola vez.
Pg. 179
Ejemplo:
Teorema. Sea G un grafo conexo con n vrtices, donde n3. Si la suma de los
grados de cada par de vrtices no adyacentes es mayor o igual a n, entonces G
tiene un circuito hamiltoniano.
Recorrer un grafo significa tratar de alcanzar todos los nodos que estn relacionados
con uno que llamaremos nodo de salida. Existen bsicamente dos tcnicas para
recorrer un grafo: el recorrido en anchura; y el recorrido en profundidad.
Pg. 180
Ejemplo:
A(D)=
1
0
1
0
0
0
0
0
1
1
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
1
Pg. 181
Ejemplo:
En el ejemplo anterior, los grados de entrada y de salida de cada vrtice se
detallan en la siguiente tabla.
Vrtice
Grado entrada
Grado salida
v1
v2
v3
Pg. 182
Los grafos (dirigidos o no) que no tienen lazos ni ms de una arista adyacente al
mismo par de vrtices se llaman grafos simples.
16.2.10 Grafos Etiquetados y Ponderados
Aunque ya hemos usado los grafos etiquetados, damos una definicin en esta seccin.
Un grafo G es un grafo etiquetado si sus aristas y/o vrtices tienen asignado alguna
identificacin. En particular, G es un grafo ponderado si a cada arista e de G se le asigna
un nmero no negativo w(e) denominado peso o longitud de l. El peso (o longitud de
un camino en un grafo ponderado G se define como la suma de los pesos de las aristas
del camino. Un importante problema en teora de grafos es encontrar el camino ms
corto (liviano), esto es, el camino con el peso (longitud) mnimo entre dos vrtices
dados.
Pg. 183
Ejemplo:
Pg. 184
Pg. 185
Pg. 186
Ejemplo:
G es Plano
G es conexo.
a) Algoritmo de Prim
El algoritmo de Prim es un algoritmo de la teora de los grafos para encontrar un rbol
recubridor mnimo en un grafo conexo, no dirigido y cuyas aristas estn etiquetadas.
En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un
rbol con todos los vrtices, donde el peso total de todas las aristas en el rbol es el
mnimo posible. Si el grafo no es conexo, entonces el algoritmo encontrar el rbol
recubridor mnimo para uno de los componentes conexos que forman dicho grafo no
conexo.
Pg. 187
/*algoritmo de prim*/
#include<conio.h>
#include<stdio.h>
void prim(int[10][10]);
int n;
void main()
{
int i,j,A[10][10];
printf("\n ingrese la dimencion o cantidad de nodos de la matriz");
scanf("%d",&n);
printf("\n ingrese los elementos de la matriz");
printf("\n las aristas inexistentes se llena con 1000");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("\n posicion[%d][%d]",i,j);
scanf("%d",&A[i][j]);
}
}
prim(A);
getch();
}
void prim(int grafo[10][10])
{ int mas_proximo[10];
int distmin[10],t;
int i,j,k,min;
printf("\n Arbol de extension obtenido mediante el algoritmo de Prim:\n");
printf(" (Se indican las aristas y sus costos correspondientes)\n");
printf(" ----------------------------------------------------------\n\n");
t=0;
for(i=2;i<=n;i++){
mas_proximo[i]=1;
distmin[i]=grafo[i][1];
}
for(i=1;i<=n-1;i++)
{
min=1000;
for(j=2;j<=n;j++)
{
if((0<=distmin[j])&&(distmin[j]< min))
{
min=distmin[j];
k=j;
}
}
/*se imprime la arista seleccionada*/
printf("\t* Nodo %d - Nodo %d, costo %d\n", mas_proximo[k],k,grafo[k][
mas_proximo[k]]);
t=t+ grafo[k][ mas_proximo[k]];
distmin[k]=-1;
for(j=2;j<=n;j++)
if(grafo[j][k]<distmin[j]){
distmin[j]=grafo[j][k];
mas_proximo[j]=k;
}
}
printf("\n la suma de costos minimos es: %d ",t);
}
Pg. 188
b) Algoritmo de Kruskal
El algoritmo de Kruskal es un algoritmo de la teora de grafos para encontrar un rbol
recubridor mnimo en un grafo conexo y ponderado. Es decir, busca un subconjunto de
aristas que, formando un rbol, incluyen todos los vrtices y donde el valor total de
todas las aristas del rbol es el mnimo. Si el grafo no es conexo, entonces busca un
bosque expandido mnimo (un rbol expandido mnimo para cada componente
conexa). El algoritmo de Kruskal es un ejemplo de algoritmo voraz.
// Codigo de A.E.M. (Kushkal)
#include<iostream.h>
#include<math.h>
#define MAX 10
Pg. 189
c)
Pg. 190
Pg. 191
#include<iostream.h>
#include<conio.h>
#define m 10
int g[m][m];
void menu();
void iniciar(int,int,int);
void escribe(int);
void verticemenos(int);
void verticemas(int);
void aristamenos(int);
void aristamas(int);
void taristas(int);
void saristas(int,int);
void earistas(int,int);
int numvertice(int[m][m]);
int buscavertice(int,int);
void camino(int);
void menu(){
clrscr();
cout<<"1 = inicia grafo"<<endl;
cout<<"2 = agrega vertice"<<endl;
cout<<"3 = agrega arista"<<endl;
cout<<"4 = eliminar vertice"<<endl;
cout<<"5 = elimina arista"<<endl;
cout<<"6 = mostrar camino vertice"<<endl;
cout<<"7 = mostrar grafo"<<endl;
cout<<"8 = total de aristas"<<endl;
cout<<"9 = total de vertices"<<endl;
cout<<"10 = total de aristas de salida para un vertice"<<endl;
cout<<"11 = total de aristas de entrada para un vertice"<<endl;
cout<<"12 = salir"<<endl;
cout<<"Elija opcion :"<<endl;
}
void taristas(int grafo[m][m]){
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
int contador=0;
for(int i=1;i<=numvertice(g);i++){
for(int j=1;j<=numvertice(g);j++){
if(grafo[i-1][j]==1)
contador=contador+1;
}
}
cout<<"El numero total de aristas es : "<<contador;
}
}
void saristas(int grafo[m][m],int vertice){
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
int contador=0;
for(int i=1;i<=numvertice(g);i++){
if(grafo[vertice-1][i]==1)
contador=contador+1;
}
Pg. 192
cout<<"El numero de aristas que salen del vertice "<<vertice<<" son "<<contador;
}
}
void earistas(int grafo[m][m],int vertice){
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
int contador=0;
for(int i=1;i<=numvertice(g);i++){
if(grafo[i-1][vertice]==1)
contador=contador+1;
}
cout<<"El numero de aristas que entran en el vertice "<<vertice<<" son "<<contador;
}
}
int buscavertice(int vertice,int grafo[m][m]){
int i,existe,num;
i=0;
existe=0;
num=numvertice(g);
while(existe==0&&i<num){
if(grafo[i][0]==vertice)
existe=1;
else
i=i+1;
}
return existe;
}
int numvertice(int grafo[m][m]){
int contador;
contador=0;
while(grafo[contador][0]!=0){
contador=contador+1;
}
return contador;
}
void aristamas(int grafo[m][m]){
int origen,destino;
cout<<"ingrese vertice de origen :";cin>>origen;
cout<<"ingrese vertice de destino :";cin>>destino;
if(buscavertice(origen,g)==1){
if(buscavertice(destino,g)==1){
grafo[origen-1][destino]=1;
cout<<"arco agregado"<<endl;
}
else{cout<<"vertice de destino no existe"<<endl;}
}
else{cout<<"vertice de origen no existe"<<endl;}
}
void verticemas(int grafo [m][m]){
int i;
i=0;
while(grafo[i][0]!=0){
i=i+1;
}
grafo[i][0]=i+1;
cout<<"vertice agregado"<<endl;
}
Pg. 193
Pg. 194
cout<<"vertice eliminado"; }
else{cout<<"vertice no existe";}
}
}
void camino(int grafo[m][m]){
int j,contador,origen,destino;
if(grafo[0][0]==0){
cout<<"grafo vacio"<<endl;
}
else{
cout<<"ingrese vertice de origen : ";cin>>origen;
cout<<"ingrese vertice de destino : ";cin>>destino;
if(buscavertice(origen,g)==1){
if(buscavertice(destino,g)==1){
if(grafo[origen-1][destino]==1)
cout<<origen<<"->"<<destino;
else cout<<"no hay camino";
}
else{cout<<"vertice de destino no existe"<<endl;}
}
else{cout<<"vertice de origen no existe"<<endl;}
}
}
void main(){
int op;
op=-1;
while(op!=12){
menu();
cin>>op;
switch(op){
case 1:clrscr();
iniciar(10,10,g);
cout<<"grafo iniciado"<<endl;
getch();
break;
case 2:clrscr();
verticemas(g);
getch();
break;
case 3:clrscr();
aristamas(g);
getch();
break;
case 4:clrscr();
verticemenos(g);
getch();
break;
case 5:clrscr();
aristamenos(g);
getch();
break;
case 6:clrscr();
camino(g);
getch();
break;
case 7:clrscr();
escribe(g);
getch();
break;
Pg. 195
case 8:clrscr();
taristas(g);
getch();
break;
case 9:clrscr();
cout<<"El numero de vertices del grafo son : "<<numvertice(g);
getch();
break;
case 10:clrscr();
int a;
cout<<"Ingrese el vertice :";cin>>a;
saristas(g,a);
getch();
break;
case 11:clrscr();
int b;
cout<<"Ingrese el vertice :";cin>>b;
earistas(g,b);
getch();
break;
case 12:clrscr();
cout<<"termino el programa"<<endl;
getch();
break;
}
Pg. 196
BIBLIOGRAFA
BAASE, Sara y VAN GELDES, Allen (2002): Algoritmos computacionales:
Introduccin al Anlisis y Diseo, 3ra edic. Mxico.
FLORES RUEDA, Roberto (2005): Algoritmos, Estructura de Datos y
Programacin Orientado a Objetos, 1ra edicin, Ecoe ediciones, Bogot.
Hedetmienic, Goodman (1991): "Introduction to the Design and Analysis of
Algorithms", Editorial Mc Graw Hill, U.S.A.
James Martn & Carma Mc Clure (1992): "Diagraming Techniques for
Analysis and Programmers", Editorial Prentice Hall.
JOYANES AGUILAR, Lus (2003): Fundamentos de Programacin,
Algoritmos y Estructura de Datos, 3ra edicin, editorial Mcgrau-Hill,
Madrid.
JOYANES AGUILAR, Lus; ZAHONERO MARTINCA, Ignacio
Algoritmos y Estructura de Datos, Mcgrau-Hill, Madrid.
(2004):
Pg. 197
(2004):
PRESSMAN Roger S. (2002): Ingeniera de Software, 5ta edicin, McGrawHill/INTERAMERICANA de Espaa, S.A.U. Madrid.
Chris H. Pappas; William H. Murria (1999): Microsoft Visual C++ 6.0, Manual
de Referencia, editorial McGraw-Hill, primera edicin, Mdrid.
Wirth, Niklaus (1989): "Algoritmos y Estructura de Datos", Editorial Mc
Graw Hill, Mxico.
Jean Paul Tremblay, Richard B. Bunt (1990): "Introduccin a la Ciencia de
las Computadoras, Enfoque Algortmico", Editorial Mc Graw Hill, Mxico.
Luis Joyanes Aguilar (1994): "Fundamentos de Programacin, Algoritmos y
Estructura de Datos", Editorial Mc Graw Hilll, Mxico.
Guillermo Levine (1991): "Introduccin a la Computacin
Programacin Estructurada", Editorial Mc Graw Hill, Mxico.
la