lunes, 21 de julio de 2008

ARCHIVOS Y FUNCIONES

ARCHIVO
Un archivo es una colección de información (datos relacionados entre si) almacenada como una unidad en alguna parte de la computadora. Esta colección de datos sirve para entrada y salida a la computadora y se manejan con un programa. A diferencia de los arrays y registros un archivo puede almacenarse en un dispositivo auxiliar discos, etc. de forma que los datos obtenidos durante y después del procesamiento no se pierdan.

Los archivos en contraste con los Arrays y Registros no son de tamaño fijo. Es decir los archivos son “Estructuras dinámicas”, en cambio en un registro se deben especificar los campos, él número de elementos de un arrays (o arreglo), el número de caracteres en una cadena; por esto se denotan estos como “Estructuras Estáticas".

CARACTERISTICAS:
El tamaño de los archivos pueden variar según sea el caso, por lo tanto se llaman estructuras dinámicas, mientras que los arreglos y registros se denominan estructuras estáticas.
Los archivos permiten guardar información para su uso posterior mediante la ejecución de programas adecuados.
Los archivos permiten guardar información en memoria secundaria o externa (cd, pendrive etc) para su uso posterior.
Tipos de archivos .exe (archivos ejecutables, ), .sys (archivos de configuración del sistema), .txt o .doc (archivos de texto) entre otros.

ARCHIVOS EN PASCAL:
Después que los archivos son creados en turbo pascal estos archivos se manipulan con el Sistema operativo, ya que, se pueden copiar, renombrar, enviar a dispositivos de entrada y salida, los archivos se pueden almacenar en discos duros, unidades externas, en pascal los archivos tienen extensión .PAS y .BAK, el nombre del archivo debe ser de 1 a 8 letras.


TIPOS DE ARCHIVOS EN TURBO PASCAL
Texto (text) o secuenciales (acceso secuencial)
Tipeados o con tipo (file of) Acceso Aleatorio
No Tipeados (no tipificados) o sin tipo (file)

DECLARACION DE ARCHIVOS EN PASCAL
La declaración de un archivo consta de 2 pasos:

Declaración del tipo de archivo adecuado
file of char (archivo de texto)
file of text (archivo de texto)
Var
texto : text;

file of (archivo tipeado o tipificado)
type
archivo : file of tipo_de_dato;
var
arch : archivo;

file archivo sin tipo.
Var
Archi:file

2. Declaración de una variable archivo de un tipo de archivo declarado.

Ejemplo:
Type
Nombre= file of string [60]; (tipo de archive de cadenas)
Numeros= file of integer; (tipo de archive de números enteros)

Var
Cantidades:numeros; (variable archivo)
Personas:nombre; (variable archivo)
Texto:text (archivo de texto)
archivo:file (archivo sin tipo)


FUNCIONES
En algunas ocasiones se debe llamar un bloque de código mas de una vez, una forma de hacerlo es escribir las instrucciones tantas veces como se necesite, tornando de esta manera programas con exceso de código y dificultad para descubrir posibles errores, la otra es colocar las instrucciones en subprogramas que se invocan cada vez que se necesiten.
Los procedimientos y funciones se declaran o escriben antes del begin principal, un procedimiento o función puede contener otros procedimientos y funciones.
Un procedimiento es un grupo de sentencias que realizan una tarea concreta. En lugar de reescribir el código completo de esa tarea cada vez que se necesite, únicamente se hace una referencia al procedimiento (llamado).

Las funciones son, al igual que los procedimientos, un conjunto de sentencias que se ejecutan constantemente, la diferencia entre éstas y los procedimientos es que las funciones regresan un valor.

Hay dos tipos de funciones las que son predefinidas en pascal, estas son funciones que ya vienen incorporadas a Turbo pascal entre las que tenemos funciones aritméticas, de cadena, de transferencias, ordinales, de dirección y punteros y funciones de asignación dinámicas de memoria.
Y funciones definidas por el usuario, son aquellas funciones que crea el programador para hacer los programas mas óptimos.

La declaración de las funciones se realiza de la siguiente forma:
FUNCTION nombre(parámetros formales) : tipo_de_dato del resultado que devuelve la funcion;
BEGIN
------- INSTRUCIONES-----
END;

Ejemplo de funciones predefinidas en pascal:
abs(x) Devuelve el valor absoluto de un numero x
round(x) Permite redondear un numero real a un entero
Int(x) Devuelve la parte entera de un numero real.
Ln(x) Devuelve el logaritmo natural de x
Entre otras.

Ejemplo de funciones definidas por el usuario

Funcion triple de un numero:
Function triple (numero:real):real;
Begin
Triple:=3*numero
End;

Funcion que calcula el mayor de 3 enteros

Function max3 (a,b,c:integer):integer;
Var
Maximo:integer;
Begin
If a>b then
Maximo:= a
Else maximo:=b;
If maximo>=c then max3:=maximo
Else max3:=c
End;

RECURSIVIDAD
El concepto de recursividad está ligado, en los lenguajes de programación, al concepto de procedimiento o función. Un procedimiento o función es recursivo cuando durante una invocación a él puede ser invocado a su vez él mismo.
Ejemplo:

Function Factorial ( n : Integer ) : Integer;
begin
If n < 2 Then Factorial := 1
else Factorial := n * Factorial ( n – 1);
end;



viernes, 11 de julio de 2008

ARBOLES BINARIOS

ARBOLES
Arboles: un árbol es un conjunto finito de uno o más nodos tales que:

a) existe un nodo llamado raíz
b) el resto de los nodos están partidos en n>=0 conjuntos disjuntos T1….Tn los cuales son por sí mismos un árbol. T1…Tn se denominan subárboles de la raíz.

Existen muchos términos que se utilizan cuando se habla de árboles. Consideremos el siguiente árbol:


Arboles Binarios.

Un árbol binario es una estructura de datos muy importante que se utiliza en muchos algoritmos. Este tipo de árbol se caracteriza por el hecho de que cada nodo tiene un máximo de dos hijos. Al utilizar árboles binarios se habla de subárbol de la derecha y subárbol de la izquierda.

Definición: Un Arbol Binario es un conjunto finito de nodos el cual es o bien vacío o consta de una raíz y dos árboles binarios disjuntos llamados subárboles derecho e izquierdo.


Arbol Binario Desviado
Arbol Binario Casi Completo

Lema 1. El máximo número de nodos en el nivel i de un árbol es 2 i-1. El número máximo de nodos que puede tener un árbol de profundidad K es 2k -1, k>0.

Nota: en cualquier nivel los nodos deben numerarse de izquierda a derecha.

Un árbol binario con n nodos y una profundidad k está completo si y solo si sus nodos corresponden a los nodos que estan numerados del 1 a n en un árbol binario completo de profundidad k.

Lema 2. Si se tiene un árbol binario completo de n nodos; representado en forma secuencial entonces para cualquier nodo i, 1>=i>=n tenemos:

a) Padre [i] se encuentra en └ i/2┘ si i≠1. Cuando i=1, el nodo es la raíz y por lo tanto no tiene padre.
b) Hijo_Izq [i] se encuentra en 2i, si 2i<=n. Si 2i>n, entonces no existe hijo izquierdo.
c) Hijo_Der[i] se encuentra en 2i+1, si 2i+1n, entonces no existe hijo derecho.



























viernes, 4 de julio de 2008

ENLACES DE INTERES

http://www.algoritmia.net/articles.php?id=13&leng=Pascal

martes, 1 de julio de 2008

EJERCICIOS RESUELTOS Y PROPUESTOS

1. (Ejercicio de Registro) Escriba un programa que lea datos de una persona 'P' (nombre, edad, sexo, dirección, teléfono), los almacene en un registro y los muestre.

Program Datos;
Uses Crt;
Type
Persona : Record
Nombre : String[30];
Edad : Integer;
Sexo : Char;
Direccion : String[50];
Telefono : string[12];
End;

Var
P: Persona;
Begin
Clrscr;
{carga del registro}
Write(' Ingrese su Nombre: ');
Readln( P.Nombre );
Write(' Ingrese su Edad: ');
Readln( P.Edad );
Write(' Ingrese su Sexo [M / F]: ');
Readln( P.Sexo );
Write(' Ingrese su Dirección: ');
Readln( P.Direccion );
Write(' Ingrese su Teléfono: ');
Readln( P.Telefono )
{ fin carga del registro}

{mostrar información del registro}
Writeln(' El Nombre es: ' , P.Nombre );
Writeln(' La Edad es:’ ,P.Edad );
Writeln(' El sexo de la persona es:’ , P.Sexo );
Writeln(' La Dirección es: ', P.Direccion );
Writeln(' el numero de Teléfono es: ' ,P.Telefono );
{fin mostrar información del registro}
End.

2. (Ejercicio de arreglo de registro) Usando el ejercicio anterior, supongamos que ahora deseamos guardar los datos de 20 personas y buscar cuál es la más joven.
Program Mas_joven;
Uses Crt;
Type
Personas : Record
Nombre : String[30];
Edad : Integer;
Sexo : Char;
Direccion : String[50];
Telefono : string[12];
End;

arre_persona=array[1..20] of persona;
Var
persona:arre_persona;
i, Menor : Integer;
Nombre : String[30];

Begin
Clrscr;
For i := 1 to 20 do
Begin
Write(' Ingrese el Nombre de la persona ', i , ': ');
Readln( persona[i].Nombre );
Write(' Ingrese su Edad: ');
Readln( persona[i].Edad );
Write(' Ingrese su Sexo [M / F]: ');
Readln( persona[i].Sexo );
Write(' Ingrese su Dirección: ');
Readln( persona[i].Direccion );
Write(' Ingrese su Teléfono: ');
Readln( persona[i].Telefono )
End;
Menor := persona[1].Edad;
For i := 2 to 20 do
If persona[i].Edad < Menor then
Begin
Menor := persona [i].Edad;
Nombre := persona [i].Nombre;
End;
Writeln(' El más joven es ',Nombre,' y tiene ',Menor,' años de edad.');
End.

(Ejercicio de arreglo de registro) Hacer un programa en pascal de 10 alumnos guardar nombre, nombre de la asignatura y 4 notas. Calcular y mostrar el promedio y la suma de las notas.

PROGRAM ARR_REGISTROS;
USES CRT;
TYPE
ALUMNOS=RECORD
NOMBRE:STRING[30];
ASIGNATURA:STRING[40];
NOTA:array[1..4] of REAL;
END;

ARRE_ALUMNOS=ARRAY[1..10] OF ALUMNOS;

VAR
ALUM:ARRE_ALUMNOS;
I,J:INTEGER;
SUMA,MEDIA:REAL;

BEGIN
CLRSCR;
FOR I:=1 TO 10 DO
BEGIN
WRITELN('INTRODUZCA EL NOMBRE DEL ALUMNO ',I);
READLN(ALUM[I].NOMBRE);
WRITELN('INTRODUZCA EL NOMBRE DE LA ASIGNATURA');
READLN(ALUM[I].ASIGNATURA);
SUMA:=0;

FOR J:=1 TO 4 DO
BEGIN
WRITELN('INTRODUZCA LA NOTA ',J);
READLN(ALUM[I].NOTA[J]);
SUMA:=SUMA + ALUM[I].NOTA[J];
END;
MEDIA:=SUMA/4;
WRITELN('LA MEDIA DEL ALUMNO ',ALUM[I].NOMBRE,' ES ', MEDIA:2:2);
WRITELN('LA SUMA ES: ',SUMA:2:2);
READLN;
END;
END.

EJERCICIO RESUELTO DE ARREGLOS DE REGISTROS

hacer un programa en pascal que almacene en un arreglo de registro la siguiente informacion de 10 trabajadores: nombre, edad, sexo, estado civil y salario base, Calcular y mostrar por pantalla la cantidad de trabajadores del sexo masculino, cantidad de trabajadoras casadas y suma de todos los sueldos.


program arreglo_registros;uses crt; type
trabajadores=record
nombre:string[30];
edad:integer;
sexo:char;
edo_civil:char;
salario:real;
end;
arre_trabajadores=array[1..10] of trabajadores;
var
trabajador:arre_trabajadores;
i, cant_masculino,cant_casadas:integer;
acum_salarios:real;
procedure inicializar;
begin
acum_salarios:=0;
cant_masculino:=0;
cant_casadas:=0;
end;
procedure cargar_datos;
begin for i:= 1 to 10 do
begin
writeln('tipee el nombre: ');
readln(trabajador[i].nombre);
writeln('tipee la edad del trabajador:');
readln(trabajador[i].edad);
writeln('tipee el sexo del trabajador f=femenino /m=masculino:');
readln(trabajador[i].sexo);
writeln('tipee el estado civil del trabajador c=casado/s=soltero:');
readln(trabajador[i].edo_civil);
writeln('tipee el sueldo del trabajador:');
readln(trabajador[i].salario);
end;
end;
procedure masculinos_casadas;
begin
for i:=1 to 10 do
begin
if upcase(trabajador[i].sexo)='M' then
cant_masculino:=cant_masculino+ 1;
if (upcase(trabajador[i].sexo)='F') and (upcase(trabajador[i].edo_civil)='C') then cant_casadas:=cant_casadas+ 1; end;end;
procedure sumar_salarios;
begin
for i:= 1 to 5 do
acum_salarios:=acum_salarios + trabajador[i].salario;
end;
procedure mostrar_datos_trabajador;
begin
for i:=1 to 5 do
begin
writeln('el nombre del trabajador es: ', trabajador[i].nombre);
readln;
writeln('la edad del trabajador es: ', trabajador[i].edad);
readln;
if upcase(trabajador[i].edo_civil)='S' then
begin
writeln('el estado civil es: soltero');
readln;
end
else
begin
writeln('el estado civil es: casado');
readln;
end; writeln('el salario del trabajador es: ', trabajador[i].salario:2:2);
readln;
end;
end;
procedure mostrar;
begin
writeln('la cantidad de trabajadores masculinos es: ', cant_masculino);
readln;
writeln('la cantidad de mujeres casadas es: ', cant_casadas);
readln;
writeln('la suma de todos los sueldos es: ' ,acum_salarios:2:2);
readln;
end; {programa principal}
begin
clrscr;
inicializar;
cargar_datos;
masculinos_casadas;
sumar_salarios;
mostrar_datos_trabajador;
mostrar;
end.

(*Escribir un programa en pascal que rellene un array unidimensional con 5 nombres y en un arreglo bidimensional guardar el monto pagado por 3 meses. Calcular el monto total pagado por cada persona. Mostrar nombre, el monto total pagado por esa persona y los montos de cada mes*)

PROGRAM pagos;
USES
crt;
TYPE
arreglo_personas=array[1..5] of string;
arreglo_monto=array[1..5,1..3] of real;
arreglo_suma=array[1..5] of real;
VAR
per:arreglo_personas;
monto:arreglo_monto;
f,c:integer;
suma:arreglo_suma;
sumas:real;

BEGIN
FOR f:=1 TO 5 DO
BEGIN
WRITELN('Introduzca el nombre:' );
READLN(per[f]);
WRITELN('Introduzca los 3 montos de 3 meses');
sumas:=0;
FOR c:=1 TO 3 DO
BEGIN
READLN(monto[f,c]);
sumas:=sumas+monto[f,c];
END;
suma[f]:=sumas;
END;

FOR f:=1 TO 5 DO
BEGIN
WRITELN('el cliente' , per[f] , 'en tres meses ha pagado: ' , suma[f]:2:2);
READLN;
FOR c:=1 TO 3 DO
BEGIN
WRITELN('En el mes' , c, ' la persona ha pagado: ' , monto[f,c]:2:2);
READLN;
END;
END;
CLRCSR;
END.


PROPUESTOS

1. Inicializar una matriz con ceros (0) y que sea de dimensión 10x12.
2. Colocar un uno (1) en todos los espacios de la matriz en que la suma de sus índices sea mayor que 6. Utilice la misma matriz de dimensión 10x12.
3. Un instituto desea controlar los resultados de los alumnos en las distintas asignaturas de la facultad de Ingeniería. El programa debe ingresar las calificaciones de los alumnos y visualizar en pantalla la media de notas por alumno y la media de notas por asignatura. Las asignaturas están codificadas de 1 a 6 y hay 30 alumnos.



lunes, 30 de junio de 2008

REGISTROS (RECORD)

Registros (Record)

Son estructuras de datos cuyos elementos pueden ser de diferentes tipos. En los registros se puede almacenar una variedad de información sobre una persona (nombre, estado civil, edad, fecha de nacimiento, etc.).

Cada elemento se almacena en un campo de registro independiente y se puede referenciar cada elemento almacenado en un campo por su nombre.
Tambien, se puede decir que un registro (record) es un tipo de dato estructurado que consta de un conjunto de elementos que pueden ser del mismo tipo o no. Los componentes de un registro se denominan campos, cada campo tiene un nombre llamado identificador del campo.

Formato:

TYPE
tipo_registro= record
lista_1: tipo_dato1;
lista_2 tipo_dato2;
lista_3 tipo_dato3;
.
.
.
lista_n:tipo_daton;
end;

donde,
tipo_registro es el nombre de la estructura.
lista_1, lista_2, lista_3 ... linsta_n son los nombres de los campos.
dato1, dato2, dato3 ... daton son los tipos de datos de cada campo.

VAR
nombre_reg:tipo_registro;

donde nombre_reg es el nombre de la variable de tipo registro.
tipo_registro es el nombre de la estructura que se uso en TYPE.


Ejemplo: Declarar un registro de empleados cuyos campos son: nombre, edad, direccin y salario

TYPE
empleado= record
nombre:string[30];
edad:integer;
direccion:string[40];
salarios:real;
end;

VAR
trabajador:empleado;

graficamente seria
nombre: Juan Perez
edad:22
direccion: calle 50, barquisimeto estado Lara.
salario12345

Acceso a los campos de un registro: Se puede acceder a cada campo de un registro directamente usando un designador o selectro de campo.
Formato: nombre_registro.nombre_campo

Ejemplo:
trabajador.nombre
trabajador.edad
trabajador.direccion
trabajador.salario

Una vez que los datos estan almacenados en un registro, se pueden manipular de igual forma que otros datos en memoria.
writeln ('el empleado se llama:', trabajador.nombre)
visualizad en pantalla lo siguiente el empleado se llama: Juan Perez

Operaciones sobre registros: Las operaciones de escritura y lectura se deben realizar individualmente, ya que un registro esta compuesto por campos de tipos diferentes.

Cargar datos a un registro y mostrarlos

program cargar_mostrar;
uses crt;
type
empleado=record
nombre:string[30];
edad:integer;
direcccion:string[40];
salario:real
end;

var
trabajador:empleado;
begin
{inicio cargar registro}
writeln('Introduzca nombre');
readln(trabajador.nombre);
writeln('Introduzca la edad');
readln(trabajador.edad);

writeln('Introduzca direccion');
readln(trabajador.direccion);

writeln('Introduzca salario');
readln(trabajador.salario);

{fin cargar registro}

{inicio mostrar informacion}
writeln('el nombre es', trabajador.nombre);
writeln('la edad del trabajador es', trabajador.edad);
writeln('la direccion del trabajador es', trabajador.direccion);
writeln('el salario del trabajador es', trabajador.salario);
readln;
{fin mostrar informacion}
end.


Ejercicio: Sean 10 alumnos de los cuales se tienen los siguientes datos nombre, asignatura y 4 notas de la asignatura. Calcular y mostrar la suma de las 4 notas y la media de la asignatura.

program registros;
uses crt;
type
alumnos=record
nombre:string[30];
asignatura:string[40];
nota:real;
end;

var
alumno:alumnos;
i,c:integer;
suma,media:real;

begin
for c:= 1 to 10 do
begin
writeln('Introduzca el nombre');
readln(alumno.nombre);
writeln('Introduzca la asignatura');
readln(alumno.asignatura);
suma:=0;

for i:=1 to 4 do
begin
writeln('introduzca la nota', i);

readln(alumno.nota);
suma:=suma+alumno.nota;
end;

media:=suma/4;
writeln('la media del alumno', alumno.nombre, 'es', media:2:2);
writeln('la suma es:',suma:2:2);
readln;
clrscr;

end;
end.

Tomado del libro Programacion en Pascal de Luis Joyanes Aguilar


ARRAYS DE REGISTROS

Los registros simples se utilizan raramente por si mismos. En general se agrupan en conjuntos conocidos como arrays de registros. Por ejemplo, si se dispone un registro que contiene los datos relativos a articulos de un almacén y si el inventario dispone de 100 artículos y se desean procesar adecuadamente se puede utilizar un array de 100 elementos; mediante la declaración siguiente se definen los elementos del conjunto.


Type
Itemstock = record
Nombre : string[30];
Numero : integer;
Precio : real;
End;

lista = array [ 1..100] of itemstock;
Var
inventario : lista;

Con estas declaraciones se puede acceder a cada registro a través de los campos de cada registro. Así, por ejemplo, la lista completa del inventario se puede cargar con el siguiente segmento del programa:

For i : = 1 to 100 do
Begin
Writeln(‘ introduzca el nombre’);
Readln (iventario[i].nombre);
Writeln(‘ introduzca número de stock’);
Readln (inventario[i].número);
Writeln(‘ introduzca precio);
Readln (invetario[i].precio);
End;

El proceso de registros del array es similar al tratamiento, ya conocido, de elementos de un array con la peculiaridad de ser tipos compuestos (registros) en lugar de ser tipos simples.
Elemplo: Inventario [ 2 ]. Nombre

miércoles, 25 de junio de 2008

ARREGLOS BIDIMENSIONALES Y MULTIDIMENSIONALES







Fuente: prof. Francys Ochoa

Enlace importante:














lunes, 23 de junio de 2008

CONTENIDO UNIDAD III Y PLAN DE EVALUACION

Sección 3N2IS / Semestre III
Materia: Programación
Docente: Ing. Mayra Ramirez

Contenido Corte III:
arreglos Bidimensionales / Multidimensionales.
Funciones/ recursividad
Registros y Archivos
Colas
Listas
Árboles
Grafos.

Plan de evaluación Corte III (35 ptos.)
Evaluación laboratorio 4 ptos.
Grupo 1 Jueves 10/7/2008
Grupo 2 Jueves 17/7/2008

Taller 4 ptos. Sobre pilas, colas, listas, árboles y grafos.
Miércoles 16/7/2008 y Miércoles 23/7/2008

Entrega proyecto 6 ptos. Miércoles 23/7/2008
Defensa proyecto 6 ptos.: Jueves 24/7/2008 y Jueves 31/7/2008

Examen Parcial 15 Ptos Miércoles 30/7/2008

=================================================================

Sección 3N5IS / Semestre III
Materia: Programación
Docente: Ing. Mayra Ramirez

Contenido Corte III:
Arreglos Bidimensionales / Multidimensionales.
Funciones/ recursividad
Registros
Archivos
Colas
Listas
Árboles
Grafos.


Plan de evaluación Corte III (35 ptos.)
Evaluación laboratorio 4 ptos.
Grupo 1 martes 8/7/2008
Grupo 2 martes 15/7/2008

Taller 4 ptos. Sobre pilas, colas, listas, árboles y grafos.
Lunes 14/7/2008 y Lunes 21/7/2008

Entrega proyecto 6 ptos. Lunes 21/7/2008
Defensa proyecto 6 ptos.: Martes 22/7/2008 y Martes 29/7/2008

Examen Parcial 15 Ptos Lunes 28/7/2008
==================================================================
Sección 3N6IS / Semestre III
Materia: Programación
Docente: Ing. Mayra Ramirez

Contenido Corte III:
Arreglos Bidimensionales / Multidimensionales.
Funciones/ recursividad
Registros
Archivos
Colas
Listas
Árboles
Grafos.


Plan de evaluación Corte III (35 ptos.)
Evaluación laboratorio 4 ptos.
Grupo 1 martes 8/7/2008
Grupo 2 martes 15/7/2008

Taller 4 ptos. Sobre pilas, colas, listas, árboles y grafos.
Lunes 14/7/2008 y Lunes 21/7/2008

Entrega proyecto 6 ptos. Lunes 21/7/2008
Defensa proyecto 6 ptos.: Martes 22/7/2008 y Martes 29/7/2008

Examen Parcial 15 Ptos Lunes 28/7/2008

===============================================================