Академический Документы
Профессиональный Документы
Культура Документы
LPE
SISTEMA DE REGISTRO DE BUTACAS
DOCENTE:
xxxxxxx
ALUMNO:
1
Índice
1.-Introducción----------------------------------------------------------------3
2.-Marco teórico--------------------------------------------------------------4
3.-Marco conceptual---------------------------------------------------------5
4.-Objetivos--------------------------------------------------------------------12
5.-Metodología---------------------------------------------------------------13
6.-Aplicación------------------------------------------------------------------31
7.-Análisis----------------------------------------------------------------------35
7.1.-Descripción general
7.1.3.-Restricciones
7.1.4.-Funciones
7.1.4.2.-Registro de compra
7.1.4.3.-Login de usuario
7.1.4.4.-Consultas
7.1.4.5.-Rendimiento
8.-Conclusiones------------------------------------------------------------38
9.-Bibliografía---------------------------------------------------------------39
2
1.-Introducción
En la actualidad toda cadena de cines cuenta con una página web propia sin
excepción, donde se brinda información acerca de su servicio sea acerca de su
cartelera, promociones, sedes, salas disponibles, horarios, costos, etc. Sin
embargo no todos los cines toman en cuenta en su sistema de información
virtual acerca de las ventas que se vienen realizando en una determinada sala
en un determinado horario, información como el costo o información acerca
de asientos disponibles.
En una primera parte tratará acerca de los objetivos del proyecto, los
específicos y los generales, también se mostrará una serie de gráficas acerca
de su funcionamiento; como ingresar al menú, como almacenar los datos; y
finalmente se mostrará el código desarrollado en el lenguaje c++, que por
comodidad se ejecuta en el programa borlandc++.
Esperamos que el presente proyecto sea de gran utilidad intelectual; así como
pueda ser aplicable en distintas empresas, cines o teatros.
3
2.- Marco Teórico
Los conceptos de cadenas también son útiles para este proyecto. El uso de
funciones es muy importante para el desarrollo de la programación modular,
los conceptos de declaración y definición de una función, los parámetros y
tipos de datos que se van a usar, el llamado a la función, la función principal
(main), el uso de funciones recursivas también son útiles a la hora de
desarrollar el proyecto. Los conceptos de registros, la definición y declaración
de estructuras, el anidamiento de registros, el acceso a los elementos de una
estructura son nociones que se tienen que tener claras pues son usadas en la
construcción del proyecto (la funcionalidad del proyecto será explicada
después por eso no estamos incluyendo para que se usa cada concepto).
4
el final del archivo, cambiar de nombre del archivo, la eliminación de archivos
y las funciones para realizar las operaciones antes mencionadas.
5
Presentan tres tipos de:
- Estructuras condiciones simples
- Estructuras condiciones compuestas y
- Estructuras condiciones con anidamiento
iosfwd:
Contiene declaraciones adelantadas de todas las plantillas de flujos y sus
typedefs estándar. Por ejemplo ostream.
iostream:
Parte del a STL que contiene los algoritmos estándar, es quizá la más usada e
importante (aunque no indispensable).
La biblioteca list:
Parte de la STL relativa a contenedores tipo list; listas doblemente enlazadas
math:
Contiene los prototipos de las funciones y otras definiciones para el uso y
manipulación de funciones matemáticas.
Memory:
Utilidades relativas a la gestión de memoria, incluyendo asignadores y
punteros inteligentes (auto_ptr).
"auto_ptr" es una clase que conforma la librería memory y permite un fácil
manejo de punteros y su destrucción automaticamente.
6
Biblioteca new:
Manejo de memoria dinámica
numeric:
Parte de la librería numérica de la STL relativa a operaciones numéricas.
Ostream:
Algoritmos estándar para los flujos de salida.
queue:
Parte de la STL relativa a contenedores tipo queue (colas de objetos).
Librería stdio:
Contiene los prototipos de las funciones, macros, y tipos para manipular datos
de entrada y salida.
Librería stdlib:
Contiene los prototipos de las funciones, macros, y tipos para utilidades de uso
general.
Sting:
Parte de la STL relativa a contenedores tipo string; una generalización de las
cadenas alfanuméricas para albergar cadenas de objetos. Muy útil para el fácil
uso de las cadenas de caracteres, pues elimina muchas delas dificultades que
generan los char
Typeinfo:
Mecanismo de identificación de tipos en tiempo de ejecución
Vector:
Parte de la STL relativa a los contenedores tipo vector; una generalización de
las matrices unidimensionales C/C++
forward_list
Esta librería es útil para implementar con gran facilidad listas enlazadas
simples.
List:
Permite implementar listas doblemente enlazadas (listas enlazadas dobles)
fácilmente.
Iterator:
Proporciona un conjunto de clases para iterar elementos.
Regex:
Proporciona fácil acceso al uso de expresiones regulares para la comparación
de patrones.
7
Thread:
Útil para trabajar programación multi hilos y crear múltiples hilos en nuestra
aplicación.
Lista
Una lista lineal es un conjunto de elementos definidos que pueden variar en
número y donde cada elemento tiene un único predecesor y un único sucesor
o
siguiente, excepto el primero y el último de la lista.
Pila
Una pila (stack) es un tipo especial de lista lineal en la que la inserción y
borrado
de nuevos elementos se realiza solo por un extremo que se denomina cima o
tope (top).
feof()
Esta función sirve para comprobar si se ha alcanzado el final del archivo
rewind()
Se usa para colocar el apuntador del archivo al inicio del archivo abierto, sin
necesidad de usar la función fseek.
ftell()
Se usa para conocer la posición actual del apuntador de un archivo abierto. La
posición se expresa en bytes (dirección física), contados desde el principio del
archivo.
fseekf()
Esta función sirve para situar el cursor del archivo para leer o escribir en el
lugar deseado. El valor de retorno es cero si la función tuvo éxito, y un valor
distinto de cero si hubo algún error. También es importante mencionar que
cada vez que se realiza una operación de lectura o de escritura, el apuntador
se mueve al final de dicho dato, de tal forma que está posicionado en el
siguiente, por lo se debe asegurar que se encuentre en la posición deseada
antes de realizar cualquier operación.
fread()
La función fread permite abrir o “cargar” todos los campos de un registro, es
decir; lee un registro y lo copia en la memoria RAM para luego realizar
operaciones.
Esta función tiene los mismos argumentos que la función fwrite ().
8
fflush()
Un buffer es un área de almacenamiento temporal en memoria de todos los
datos leídos o escritos en el archivo. Estos buffers retienen datos en tránsito
desde y hacia el archivo y tienen la finalidad de hacer más eficiente la ejecución
del programa.
Los buffers también se vacían cuando se cierra el archivo.
fwrite()
Esta función trabaja con registros de longitud constante y forma pareja con
fread(). Es capaz de escribir hacia un archivo uno o varios registros de la misma
longitud, almacenados a partir de una dirección de memoria.
Esta función tiene cuatro argumentos: la variable que se desea grabar, su
tamaño en bytes, la cantidad de variables y el alias del archivo donde se desea
almacenar.
fclose ()
Cierra un archivo abierto.
floreal ()
Cierra todos los archivos abiertos.
Archivos de texto
Son archivos que pueden contener cualquier clase de datos, detal manera que
son “entendibles” por la sociedad. Los datos de los registros, en un archivo de
texto, se almacenan usando el código ASCII. Este tipo de archivos solo
tienemarcas lógicas de fin de línea (eol y eof), asimismo, no tieneCAMPOS,
índices lógicosde registros para identificar los registros físicos.
Archivos binarios
Este tipo de archivos procesan y almacenan los datos numéricos basados en
su representación binaria. Cuando utiliza un lenguaje de programación, se usa
instrucciones, a esto se le denomina programa fuente y cuando ejecuta este
programa genera un archivo binario. Archivo que se puede ejecutar sin
disponer del lenguaje de programación.
Archivos (FILE)
Es una estructura de datos para el procesamiento de registros, es decir, está
compuesto por un conjunto de registros con igual cantidad de campos.
Recuerde que los registros se inician con el índice lógico cero (0).
Registro
9
Está compuesto por un conjunto de estructuras denominadas campos.
Se procesa datos en términos de: registro lógico, registro físico, campo, claves
primarias, foráneas.
Entidad: Objeto del mundo real, con existencia independiente y distinguible
de otros, del que queremos almacenar información en la base de datos.
Atributo o campo: propiedades específicas de cada entidad para describirla.
Funciones recursivas
Puede definirse un programa en términos recursivos, como una serie de pasos
básicos, o paso base (también conocido como condición de parada), y un paso
recursivo, donde vuelve a llamarse a la función. En un ordenador, esta serie de
pasos recursivos debe ser finita, terminando con un paso base. Es decir, a cada
paso recursivo se reduce el número de pasos que hay que dar para terminar,
llegando un momento en el que no se verifica la condición de paso a la
recursividad. Ni el paso base ni el paso recursivo son necesariamente únicos.
Cuando una función se puede llamar a sí misma (por su nombre), se le
denomina recursividad y puede ser directa e indirecta.
Recursividad directa. Cuando una función se llama a sí misma.
Recursividad indirecta. Cuando tenemos un procedimiento P que llama a otro
Q y éste, a su vez, llama a P. También en estos casos debe haber una condición
de parada.Los dos tipos de recursividad se dan en dos formas, aquellas que
eventualmente terminan de ejecutar los procesos y generan un resultado y el
caso en que la recursividad nunca termina produciendo un bucle infinito y de
aquí una falla en tiempo de ejecución por falta de memoria.
Identificador local. Cuando está definido dentro del cuerpo de una función, a
este tipo de variables se les denomina locales, ya que sólo son útiles dentro
del cuerpo de la función.
Identificador global. Cuando están definidas fuera del bloque o fuera del
cuerpo de cualquier función.
Parámetros
Se denominan parámetros a los objetos declarados en el prototipo (que deben
corresponder con la definición).
Argumentos
10
Cuando se realiza una llamada a la función, los “valores” pasados se
denominan argumentos.
ElTipo_dato_devuelto.
Indica el tipo del valor que la función devolverá mediante el uso de return.
Funciones
Las funciones son un conjunto de instrucciones que realizan una tarea
específica. En general toman ciertos valores de entrada, llamados parámetros
y proporcionan un valor de salida o valor de retorno; aunque en C++, tanto
unos como el otro son opcionales, y pueden no existir.
Prototipos de funciones
Un prototipo es una declaración de una función. Consiste en una presentación
de la función, exactamente con la misma estructura que la definición, pero sin
cuerpo y terminada con un ";".
Operando: cada una de las constantes, variables o expresiones que
intervienen en una expresión.
Operador: cada uno de los símbolos que indican las operaciones a realizar
sobre los operandos, así como los operandos a los que afecta.
Expresión: según el diccionario, "Conjunto de términos que representan una
cantidad", para nosotros es cualquier conjunto de operadores y operandos,
que dan como resultado un valor.
11
4.-Objetivos
Principal:
Secundarias:
12
5.-Metodología
Para esto se creó un acceso tanto para el cliente como para el administrador,
para poder modificar las funciones y reiniciar los asientos después de cada
función realizada.
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<iomanip.h>
void login();
voidmenu();
voidmostrar_butacas();
voidbutacas_llenas();
void registrar();
13
char A[4][4][3], B[4][12][3], C[4][4][3], D[4][12][3];
char cadena[3]="\333\333";
int i, j, z=1;
void login(){
clrscr();
gotoxy(20,6);cout<<"ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»";Sleep(150);
gotoxy(20,7);cout<<"º";gotoxy(57,7);cout<<"º";Sleep(150);
gotoxy(20,8);cout<<"º";gotoxy(57,8);cout<<"º";Sleep(150);
gotoxy(20,9);cout<<"º";gotoxy(57,9);cout<<"º";Sleep(150);
gotoxy(20,10);cout<<"ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹";Sleep(150);
gotoxy(20,11);cout<<"º";gotoxy(57,11);cout<<"º";Sleep(150);
gotoxy(20,12);cout<<"º";gotoxy(57,12);cout<<"º";Sleep(150);
gotoxy(20,13);cout<<"º";gotoxy(57,13);cout<<"º";Sleep(150);
gotoxy(20,14);cout<<"ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ";Sleep(150);
gotoxy(23,8);cout<<"ID :";
gotoxy(23,12);cout<<"PASSWORD :";
intento=0;
14
do{
gotoxy(23,8);cout<<"ID :";gotoxy(35,8);gets(usuario);
gotoxy(23,12);cout<<"PASSWORD :";gotoxy(35,12);
i=0;
while((caracter=getch())!=13){
contrasena[i]=caracter;
if(i==0){
gotoxy(35,12);
else{
//contrasena[i]='\0';
i--;
else{
if(i==10){
gotoxy(35+i,12);//maximo 10 caracteres
}else{
contrasena[i]=caracter;
cout<<"*";
i++;
15
}
contrasena[i]='\0';
/*gets(contrasena); */
if((!(strcmp(usuario,"usuario"))&&!(strcmp(contrasena,"123456")))||(!(strcmp(usuario,"u
ser"))&&!(strcmp(contrasena,"654321")))){
break;
gotoxy(35,8);cout<<" ";
gotoxy(35,12);cout<<" ";
intento++;
}while(1&&intento<3);
if(intento==3){
clrscr();
system("color 3f");
getche();
}else{
clrscr();
system("color 3f");
menu();
16
}
void menu(){
char caracter;
system("color 3f");
gotoxy(22,2);cout<<"ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»";Sleep(150);
gotoxy(22,3);cout<<"º";gotoxy(61,3);cout<<"º";Sleep(150);
gotoxy(22,4);cout<<"º";gotoxy(61,4);cout<<"º";Sleep(150);
gotoxy(22,5);cout<<"º";gotoxy(61,5);cout<<"º";Sleep(150);
gotoxy(22,6);cout<<"ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹";Sleep(150);
gotoxy(22,7);cout<<"º";gotoxy(61,7);cout<<"º";Sleep(150);
gotoxy(22,8);cout<<"º";gotoxy(61,8);cout<<"º";Sleep(150);
gotoxy(22,9);cout<<"º";gotoxy(61,9);cout<<"º";Sleep(150);
gotoxy(22,10);cout<<"º";gotoxy(61,10);cout<<"º";Sleep(150);
gotoxy(22,11);cout<<"º";gotoxy(61,11);cout<<"º";Sleep(150);
gotoxy(22,12);cout<<"º";gotoxy(61,12);cout<<"º";Sleep(150);
gotoxy(22,13);cout<<"º";gotoxy(61,13);cout<<"º";Sleep(150);
gotoxy(22,14);cout<<"ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ";Sleep(150);
do{
17
gotoxy(22,2);cout<<"ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»";
gotoxy(22,3);cout<<"º";gotoxy(61,3);cout<<"º";
gotoxy(22,4);cout<<"º";gotoxy(61,4);cout<<"º";
gotoxy(22,5);cout<<"º";gotoxy(61,5);cout<<"º";
gotoxy(22,6);cout<<"ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹";
gotoxy(22,7);cout<<"º";gotoxy(61,7);cout<<"º";
gotoxy(22,8);cout<<"º";gotoxy(61,8);cout<<"º";
gotoxy(22,9);cout<<"º";gotoxy(61,9);cout<<"º";
gotoxy(22,10);cout<<"º";gotoxy(61,10);cout<<"º";
gotoxy(22,11);cout<<"º";gotoxy(61,11);cout<<"º";
gotoxy(22,12);cout<<"º";gotoxy(61,12);cout<<"º";
gotoxy(22,13);cout<<"º";gotoxy(61,13);cout<<"º";
gotoxy(22,14);cout<<"ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ";
gotoxy(35,4);cout<<"MENU DE OPCIONES";
gotoxy(31,8);cout<<"[1] REGISTRO";
gotoxy(31,9);cout<<"[2] ACTUALIZACION";
gotoxy(31,10);cout<<"[3] ORDENAMIENTO";
gotoxy(31,11);cout<<"[4] BUSQUEDA";
gotoxy(31,12);cout<<"[5] EXIT";
18
i=0;
valido=1;
gotoxy(26,7);textbackground(GREEN);textcolor(YELLOW);cprintf("=>");
while(valido){
caracter=getch();
if(caracter==13){
opc=i;
valido=0;
if(caracter==80){
i++;
gotoxy(26,12);cout<<" ";
if(i>=0&&i<6){
gotoxy(26,7+i);textcolor(YELLOW);cprintf("=>");
caracter=getch();
if(caracter==13){
opc=i;
valido=0;
19
}
}else{
i=5;
gotoxy(26,7);cout<<" ";gotoxy(26,8);cout<<"
";gotoxy(26,9);cout<<" ";gotoxy(26,10);cout<<" ";gotoxy(26,11);cout<<" ";
gotoxy(26,12);cout<<" ";
gotoxy(26,7+i);textcolor(YELLOW);cprintf("=>");
caracter=getch();
if(caracter==13){
opc=i;
valido=0;
if(caracter==72){
i--;
gotoxy(26,12);cout<<" ";
if(i>=0&&i<6){
gotoxy(26,7+i);textcolor(YELLOW);cprintf("=>");
caracter=getch();
if(caracter==13){
opc=i;
20
valido=0;
}else{
i=0;
gotoxy(26,12);cout<<" ";
gotoxy(26,7+i);textcolor(YELLOW);cprintf("=>");
caracter=getch();
if(caracter==13){
opc=i;
valido=0;
switch(opc){
caracter=getch();clrscr();system("color
3f");break;
caracter=getch();clrscr();system("color
3f");break;
21
case 2: clrscr(); system("color 3f");gotoxy(31,7);//actualizacion();
caracter=getch();clrscr();system("color
3f");break;
caracter=getch();clrscr();system("color
3f");break;
caracter=getch();clrscr();system("color
3f");break;
caracter=0;clrscr();system("color
3f");break; // cualquier valor para que salga
}while(caracter==27);
void mostrar_butacas(){
clrscr();
system("color 3f");
for(i=0;i<4;i++){
for(j=0;j<4;j++){
gotoxy(3+3*j,4+2*i);
22
cout<<A[i][j];
for(i=0;i<4;i++){
for(j=0;j<12;j++){
gotoxy(21+3*j,4+2*i);
cout<<B[i][j];
for(i=0;i<4;i++){
for(j=0;j<4;j++){
gotoxy(63+3*j,4+2*i);
cout<<C[i][j];
for(i=0;i<4;i++){
for(j=0;j<12;j++){
gotoxy(21+3*j,14+2*i);
cout<<D[i][j];
23
}
getche();
void butacas_llenas(){
for(i=0;i<4;i++){
for(j=0;j<4;j++){
gotoxy(3+3*j,4+2*i);
strcpy(A[i][j],cadena);
for(i=0;i<4;i++){
for(j=0;j<12;j++){
gotoxy(21+3*j,4+2*i);
strcpy(B[i][j],cadena);
for(i=0;i<4;i++){
for(j=0;j<4;j++){
gotoxy(63+3*j,4+2*i);
strcpy(C[i][j],cadena);
24
for(i=0;i<4;i++){
for(j=0;j<12;j++){
gotoxy(21+3*j,14+2*i);
strcpy(D[i][j],cadena);
void registrar(){
char area;
clrscr();
system("color 3f");
switch(area){
case 'A':
do{
}while(cant<1||cant>16);
25
for(h=1;h<=cant;h++){
clrscr();
system("color 3f");
vale=0;
while(vale==0){
do{
}while(num_asi<1||num_asi>16);
a[z]=num_asi;
vale=1;
for(j=1;j<=16;j++){
if(a[j]==a[z]&&j!=z){
vale=0;gotoxy(15,6);cout<<"codigo ya existe";getch();gotoxy(15,6);cout<<"
";
/*
if(h==1){
do{
gotoxy(6,9);clreol();system("color 3f");cout<<"Numero de
asiento : ";cin>>a[h];
26
}while(a[h]<1||a[h]>16);
vale=1;
}else{
do{
gotoxy(6,9);clreol();system("color 3f");cout<<"Numero de
asiento : ";cin>>a[h];
}while(a[h]<1||a[h]>16);
vale=1;
for(j=1;j<=h-1;j++){
if(a[j]==a[h]){
vale=0;gotoxy(15,6);cout<<"codigo ya existe";getch();
*/
if(a[z]%4==0){
k=a[z]/4;
m=4;
}else{
k=(a[z]/4)+1;
m=a[z]%4;
27
strcpy(A[k-1][m-1],"\260\260");
z++;
break;
}while(cant<1||cant>48);
for(h=1;h<=cant;h++){
clrscr();
system("color 3f");
do{
}while(cant<1||cant>48);
if(n%12==0){
k=n/12;
m=12;
}else{
k=(n/12)+1;
m=n%12;
strcpy(B[k-1][m-1],"\260\260");
28
break;
}while(cant<1||cant>16);
for(h=1;h<=cant;h++){
clrscr();
system("color 3f");
do{
}while(cant<1||cant>16);
if(n%4==0){
k=n/4;
m=4;
}else{
k=(n/4)+1;
m=n%4;
strcpy(C[k-1][m-1],"\260\260");
break;
29
gotoxy(6,8);clreol();system("color 3f");cout<<"Cantidad de boletos : ";cin>>cant;
}while(cant<1||cant>48);
for(h=1;h<=cant;h++){
clrscr();
system("color 3f");
do{
}while(cant<1||cant>48);
if(n%12==0){
k=n/12;
m=12;
}else{
k=(n/12)+1;
m=n%12;
strcpy(D[k-1][m-1],"\260\260");
break;
voidmain(){
butacas_llenas();
30
login();
getche();
6.-Aplicación
31
Las siguientes imágenes corresponden al sistema del administrador, donde
registrará al cliente asegurando el pago correspondiente. Además se tendrá
que tener en cuenta la validación del código del cliente, caso contrario el
programa mandará un mensaje.
32
Las siguientes imágenes corresponden al sistemas de revisión en las funciones,
esto es necesario para poder verificar que los datos correspondan a lo
requerido en la función (edad del cliente), además de poder obtener algunos
datos extras para poder tener una estadística de los clientes por película.
33
7.-Análisis
*login de usuario.
34
*Creación y mantenimiento de datos del cine.
*Consulta de funciones.
Los usuarios inscritos podrán reservar sus asientos en sala de cine, con el
beneficio de evitar las largas filas al momento de comprarlas en las taquillas
de los cines.
*login de usuario.
*Consulta de funciones.
35
*Usuario Administrador: este usuario deberá tener una instrucción superior
en Ingeniería de Sistemas, pues tendrá un control total sobre la base de
datos y el programa.
7.1.3. Restricciones
Seguridad
7.1.4. Funciones
36
ACTIVIDAD DESCRIPCIÓN ENTRADAS SALIDAS
Login de Se debe *Nombre del Ninguna
usuarios desarrollar un usuario
programa el cual *Clave
permita ingresar
el usuario y
clave.
7.1.4.4. Consultas.
37
En lo que respecta a la frecuencia de uso, se espera que el sistema sea
utilizado diariamente, pues el proceso puede ejecutarse de manera
continua, algunas veces al día, el sistema soporta sin problemas el número de
transacciones diarias.
8.-Conclusiones
9.-Bibliografía
38
o URL:
o http://prof.usb.ve/mirodriguez/borland-c.pdf
39