]> git.llucax.com Git - z.facultad/75.40/1er-cuat/orden.git/commitdiff
Se pone fin de línea del sistema. master svn_import
authorLeandro Lucarella <llucax@gmail.com>
Thu, 27 May 2004 04:12:00 +0000 (04:12 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 27 May 2004 04:12:00 +0000 (04:12 +0000)
26 files changed:
informes/9C-C-INFORME.TXT
informes/9C-D-INFORME.TXT
informes/9D-C-INFORME.TXT
informes/9D-D-INFORME.TXT
informes/C-C-INFORME.TXT
informes/C-D-INFORME.TXT
informes/D-C-INFORME.TXT
informes/D-D-INFORME.TXT
informes/R-C-INFORME.TXT
informes/R-D-INFORME.TXT
src/comp-dbg.pas
src/comp.pas
test/IRDnames.pas
test/ORDnames.pas
test/RNDnames.pas
test/SORTINGMetodos.pas
test/cargar.pas
test/comp_.pas
test/msdemo.pas
test/qsdemo.pas
test/qsort.pas
test/shellsort.pas
test/temp.pas
test/testrnd.cpp
test/testrnd.pas
test/tsrndnms.pas

index b675d1e07e80deb6efac74ede26dc54a05c36d30..9c1278ba9f692587c93c97aabf6bbc66bb666548 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado 90% Creciente y 10% Desordenado. Ordenado de forma Creciente.\r
-=======  ~~~~~~~~ ~~~ ~~~~~~~~~ ~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  49214 (147642 asignaciones)\r
-             Tiempo (seg):  85.30\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 95849\r
-             Intercambios:  49214 (147642 asignaciones)\r
-             Tiempo (seg):  18.12\r
-\r
-Shake Sort:\r
-             Comparaciones: 94733\r
-             Intercambios:  49214 (147642 asignaciones)\r
-             Tiempo (seg):  18.07\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  49214 (147642 asignaciones)\r
-             Tiempo (seg):  48.12\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  992 (2976 asignaciones)\r
-             Tiempo (seg):  37.18\r
-\r
-Insertion Sort::\r
-             Comparaciones: 50213\r
-             Intercambios:  16737 (50213 asignaciones)\r
-             Tiempo (seg):  7.53\r
-\r
-Shell's Sort::\r
-             Comparaciones: 34808\r
-             Intercambios:  4170 (12510 asignaciones)\r
-             Tiempo (seg):  3.57\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 12086\r
-             Intercambios:  4170 (12510 asignaciones)\r
-             Tiempo (seg):  1.75\r
-\r
-Quick Sort:\r
-             Comparaciones: 11268\r
-             Intercambios:  1736 (5208 asignaciones)\r
-             Tiempo (seg):  1.27\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
+
+INFORME: Generado 90% Creciente y 10% Desordenado. Ordenado de forma Creciente.
+=======  ~~~~~~~~ ~~~ ~~~~~~~~~ ~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  49214 (147642 asignaciones)
+             Tiempo (seg):  85.30
+
+Bubble Sort Mejorado:
+             Comparaciones: 95849
+             Intercambios:  49214 (147642 asignaciones)
+             Tiempo (seg):  18.12
+
+Shake Sort:
+             Comparaciones: 94733
+             Intercambios:  49214 (147642 asignaciones)
+             Tiempo (seg):  18.07
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  49214 (147642 asignaciones)
+             Tiempo (seg):  48.12
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  992 (2976 asignaciones)
+             Tiempo (seg):  37.18
+
+Insertion Sort::
+             Comparaciones: 50213
+             Intercambios:  16737 (50213 asignaciones)
+             Tiempo (seg):  7.53
+
+Shell's Sort::
+             Comparaciones: 34808
+             Intercambios:  4170 (12510 asignaciones)
+             Tiempo (seg):  3.57
+
+Shell's Sort Mejorado:
+             Comparaciones: 12086
+             Intercambios:  4170 (12510 asignaciones)
+             Tiempo (seg):  1.75
+
+Quick Sort:
+             Comparaciones: 11268
+             Intercambios:  1736 (5208 asignaciones)
+             Tiempo (seg):  1.27
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
index 7fb7dea9a0155cb8acc51d5391fd5b57739b3732..75e72c3c02a749b05e8c917a80d690c336171b0a 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado 90% Creciente y 10% Desordenado. Ordenado de forma Dereciente.\r
-=======  ~~~~~~~~ ~~~ ~~~~~~~~~ ~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  450286 (1350858 asignaciones)\r
-             Tiempo (seg):  174.01\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 499500\r
-             Intercambios:  450286 (1350858 asignaciones)\r
-             Tiempo (seg):  136.82\r
-\r
-Shake Sort:\r
-             Comparaciones: 471163\r
-             Intercambios:  450285 (1350855 asignaciones)\r
-             Tiempo (seg):  134.78\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  450286 (1350858 asignaciones)\r
-             Tiempo (seg):  136.82\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  980 (2940 asignaciones)\r
-             Tiempo (seg):  37.08\r
-\r
-Insertion Sort:\r
-             Comparaciones: 450386\r
-             Intercambios:  150428 (451285 asignaciones)\r
-             Tiempo (seg):  66.90\r
-\r
-Shell's Sort:\r
-             Comparaciones: 40717\r
-             Intercambios:  5182 (15546 asignaciones)\r
-             Tiempo (seg):  4.17\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 12483\r
-             Intercambios:  5182 (15546 asignaciones)\r
-             Tiempo (seg):  2.09\r
-\r
-Quick Sort:\r
-             Comparaciones: 11134\r
-             Intercambios:  1972 (5916 asignaciones)\r
-             Tiempo (seg):  1.26\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
+
+INFORME: Generado 90% Creciente y 10% Desordenado. Ordenado de forma Dereciente.
+=======  ~~~~~~~~ ~~~ ~~~~~~~~~ ~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  450286 (1350858 asignaciones)
+             Tiempo (seg):  174.01
+
+Bubble Sort Mejorado:
+             Comparaciones: 499500
+             Intercambios:  450286 (1350858 asignaciones)
+             Tiempo (seg):  136.82
+
+Shake Sort:
+             Comparaciones: 471163
+             Intercambios:  450285 (1350855 asignaciones)
+             Tiempo (seg):  134.78
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  450286 (1350858 asignaciones)
+             Tiempo (seg):  136.82
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  980 (2940 asignaciones)
+             Tiempo (seg):  37.08
+
+Insertion Sort:
+             Comparaciones: 450386
+             Intercambios:  150428 (451285 asignaciones)
+             Tiempo (seg):  66.90
+
+Shell's Sort:
+             Comparaciones: 40717
+             Intercambios:  5182 (15546 asignaciones)
+             Tiempo (seg):  4.17
+
+Shell's Sort Mejorado:
+             Comparaciones: 12483
+             Intercambios:  5182 (15546 asignaciones)
+             Tiempo (seg):  2.09
+
+Quick Sort:
+             Comparaciones: 11134
+             Intercambios:  1972 (5916 asignaciones)
+             Tiempo (seg):  1.26
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
index fa4dde8071d8c1ff35f20f2db87d94e09564a209..3d01f8b722f30f60378d9a632ea901357fe7944d 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado 90% Dereciente y 10% Desordenado. Ordenado de forma Creciente.\r
-=======  ~~~~~~~~ ~~~ ~~~~~~~~~~ ~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  457205 (1371615 asignaciones)\r
-             Tiempo (seg):  174.39\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 499500\r
-             Intercambios:  457205 (1371615 asignaciones)\r
-             Tiempo (seg):  138.35\r
-\r
-Shake Sort:\r
-             Comparaciones: 481087\r
-             Intercambios:  457204 (1371612 asignaciones)\r
-             Tiempo (seg):  137.32\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  457205 (1371615 asignaciones)\r
-             Tiempo (seg):  138.47\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  985 (2955 asignaciones)\r
-             Tiempo (seg):  37.07\r
-\r
-Insertion Sort:\r
-             Comparaciones: 457305\r
-             Intercambios:  152734 (458204 asignaciones)\r
-             Tiempo (seg):  67.56\r
-\r
-Shell's Sort:\r
-             Comparaciones: 36788\r
-             Intercambios:  5081 (15243 asignaciones)\r
-             Tiempo (seg):  3.90\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 12359\r
-             Intercambios:  5081 (15243 asignaciones)\r
-             Tiempo (seg):  2.03\r
-\r
-Quick Sort:\r
-             Comparaciones: 11096\r
-             Intercambios:  1995 (5985 asignaciones)\r
-             Tiempo (seg):  1.26\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
+
+INFORME: Generado 90% Dereciente y 10% Desordenado. Ordenado de forma Creciente.
+=======  ~~~~~~~~ ~~~ ~~~~~~~~~~ ~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  457205 (1371615 asignaciones)
+             Tiempo (seg):  174.39
+
+Bubble Sort Mejorado:
+             Comparaciones: 499500
+             Intercambios:  457205 (1371615 asignaciones)
+             Tiempo (seg):  138.35
+
+Shake Sort:
+             Comparaciones: 481087
+             Intercambios:  457204 (1371612 asignaciones)
+             Tiempo (seg):  137.32
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  457205 (1371615 asignaciones)
+             Tiempo (seg):  138.47
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  985 (2955 asignaciones)
+             Tiempo (seg):  37.07
+
+Insertion Sort:
+             Comparaciones: 457305
+             Intercambios:  152734 (458204 asignaciones)
+             Tiempo (seg):  67.56
+
+Shell's Sort:
+             Comparaciones: 36788
+             Intercambios:  5081 (15243 asignaciones)
+             Tiempo (seg):  3.90
+
+Shell's Sort Mejorado:
+             Comparaciones: 12359
+             Intercambios:  5081 (15243 asignaciones)
+             Tiempo (seg):  2.03
+
+Quick Sort:
+             Comparaciones: 11096
+             Intercambios:  1995 (5985 asignaciones)
+             Tiempo (seg):  1.26
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
index 4190391915749f921cc18812b8b62e1ed97994d9..d1afac0802b1215f861093d11d94e7550c0d21ae 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado 90% Decreciente y 10% Desordenado. Ordenado de forma Decreciente.\r
-=======  ~~~~~~~~ ~~~ ~~~~~~~~~~~ ~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  42295 (126885 asignaciones)\r
-             Tiempo (seg):  83.87\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 95849\r
-             Intercambios:  42295 (126885 asignaciones)\r
-             Tiempo (seg):  16.53\r
-\r
-Shake Sort:\r
-             Comparaciones: 80303\r
-             Intercambios:  42295 (126885 asignaciones)\r
-             Tiempo (seg):  15.33\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  42295 (126885 asignaciones)\r
-             Tiempo (seg):  46.24\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  965 (2895 asignaciones)\r
-             Tiempo (seg):  36.64\r
-\r
-Insertion Sort:\r
-             Comparaciones: 43294\r
-             Intercambios:  14431 (43294 asignaciones)\r
-             Tiempo (seg):  6.48\r
-\r
-Shell's Sort:\r
-             Comparaciones: 37789\r
-             Intercambios:  4387 (13161 asignaciones)\r
-             Tiempo (seg):  3.74\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 12334\r
-             Intercambios:  4387 (13161 asignaciones)\r
-             Tiempo (seg):  1.92\r
-\r
-Quick Sort:\r
-             Comparaciones: 11108\r
-             Intercambios:  1673 (5019 asignaciones)\r
-             Tiempo (seg):  1.15\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
+
+INFORME: Generado 90% Decreciente y 10% Desordenado. Ordenado de forma Decreciente.
+=======  ~~~~~~~~ ~~~ ~~~~~~~~~~~ ~ ~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  42295 (126885 asignaciones)
+             Tiempo (seg):  83.87
+
+Bubble Sort Mejorado:
+             Comparaciones: 95849
+             Intercambios:  42295 (126885 asignaciones)
+             Tiempo (seg):  16.53
+
+Shake Sort:
+             Comparaciones: 80303
+             Intercambios:  42295 (126885 asignaciones)
+             Tiempo (seg):  15.33
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  42295 (126885 asignaciones)
+             Tiempo (seg):  46.24
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  965 (2895 asignaciones)
+             Tiempo (seg):  36.64
+
+Insertion Sort:
+             Comparaciones: 43294
+             Intercambios:  14431 (43294 asignaciones)
+             Tiempo (seg):  6.48
+
+Shell's Sort:
+             Comparaciones: 37789
+             Intercambios:  4387 (13161 asignaciones)
+             Tiempo (seg):  3.74
+
+Shell's Sort Mejorado:
+             Comparaciones: 12334
+             Intercambios:  4387 (13161 asignaciones)
+             Tiempo (seg):  1.92
+
+Quick Sort:
+             Comparaciones: 11108
+             Intercambios:  1673 (5019 asignaciones)
+             Tiempo (seg):  1.15
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
index e71727dd94bf7321759204633177845de8353fa6..8a205bf428c9f5fc863970dbcce8900970aabd64 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado de forma Creciente. Ordenado de forma Creciente.\r
-=======  ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  60.31\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 999\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.05\r
-\r
-Shake Sort:\r
-             Comparaciones: 999\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.06\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  29.93\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  30.10\r
-\r
-Insertion Sort:\r
-             Comparaciones: 999\r
-             Intercambios:  333 (999 asignaciones)\r
-             Tiempo (seg):  0.11\r
-\r
-Shell's Sort:\r
-             Comparaciones: 8006\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.50\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 8006\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.49\r
-\r
-Quick Sort:\r
-             Comparaciones: 8010\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.49\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
+
+INFORME: Generado de forma Creciente. Ordenado de forma Creciente.
+=======  ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  60.31
+
+Bubble Sort Mejorado:
+             Comparaciones: 999
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.05
+
+Shake Sort:
+             Comparaciones: 999
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.06
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  29.93
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  30.10
+
+Insertion Sort:
+             Comparaciones: 999
+             Intercambios:  333 (999 asignaciones)
+             Tiempo (seg):  0.11
+
+Shell's Sort:
+             Comparaciones: 8006
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.50
+
+Shell's Sort Mejorado:
+             Comparaciones: 8006
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.49
+
+Quick Sort:
+             Comparaciones: 8010
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.49
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
index c395033758679a53720b85dfb62864897119cb46..2df95b42e4fb98da2dcbd6ca8c73b1c69d15db5e 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado de forma Creciente. Ordenado de forma Decreciente.\r
-=======  ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  499500 (1498500 asignaciones)\r
-             Tiempo (seg):  174.83\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 499500\r
-             Intercambios:  499500 (1498500 asignaciones)\r
-             Tiempo (seg):  140.11\r
-\r
-Shake Sort:\r
-             Comparaciones: 499499\r
-             Intercambios:  499499 (1498497 asignaciones)\r
-             Tiempo (seg):  140.72\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  499500 (1498500 asignaciones)\r
-             Tiempo (seg):  140.72\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  500 (1500 asignaciones)\r
-             Tiempo (seg):  35.37\r
-\r
-Insertion Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  166833 (500499 asignaciones)\r
-             Tiempo (seg):  70.47\r
-\r
-Shell's Sort:\r
-             Comparaciones: 18942\r
-             Intercambios:  4700 (14100 asignaciones)\r
-             Tiempo (seg):  2.37\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 11716\r
-             Intercambios:  4700 (14100 asignaciones)\r
-             Tiempo (seg):  1.81\r
-\r
-Quick Sort:\r
-             Comparaciones: 8018\r
-             Intercambios:  500 (1500 asignaciones)\r
-             Tiempo (seg):  0.71\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
+
+INFORME: Generado de forma Creciente. Ordenado de forma Decreciente.
+=======  ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  499500 (1498500 asignaciones)
+             Tiempo (seg):  174.83
+
+Bubble Sort Mejorado:
+             Comparaciones: 499500
+             Intercambios:  499500 (1498500 asignaciones)
+             Tiempo (seg):  140.11
+
+Shake Sort:
+             Comparaciones: 499499
+             Intercambios:  499499 (1498497 asignaciones)
+             Tiempo (seg):  140.72
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  499500 (1498500 asignaciones)
+             Tiempo (seg):  140.72
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  500 (1500 asignaciones)
+             Tiempo (seg):  35.37
+
+Insertion Sort:
+             Comparaciones: 499500
+             Intercambios:  166833 (500499 asignaciones)
+             Tiempo (seg):  70.47
+
+Shell's Sort:
+             Comparaciones: 18942
+             Intercambios:  4700 (14100 asignaciones)
+             Tiempo (seg):  2.37
+
+Shell's Sort Mejorado:
+             Comparaciones: 11716
+             Intercambios:  4700 (14100 asignaciones)
+             Tiempo (seg):  1.81
+
+Quick Sort:
+             Comparaciones: 8018
+             Intercambios:  500 (1500 asignaciones)
+             Tiempo (seg):  0.71
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
index d83fe919b9f834aaec073ceacd919e96715128f7..c4b02e656af57fff75bf8dd5413baa6f64d5e5c4 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado de forma Decreciente. Ordenado de forma Creciente.\r
-=======  ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  499500 (1498500 asignaciones)\r
-             Tiempo (seg):  185.59\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 499500\r
-             Intercambios:  499500 (1498500 asignaciones)\r
-             Tiempo (seg):  148.35\r
-\r
-Shake Sort:\r
-             Comparaciones: 499499\r
-             Intercambios:  499499 (1498497 asignaciones)\r
-             Tiempo (seg):  148.63\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  499500 (1498500 asignaciones)\r
-             Tiempo (seg):  147.75\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  500 (1500 asignaciones)\r
-             Tiempo (seg):  37.08\r
-\r
-Insertion Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  166833 (500499 asignaciones)\r
-             Tiempo (seg):  73.82\r
-\r
-Shell's Sort:\r
-             Comparaciones: 18942\r
-             Intercambios:  4700 (14100 asignaciones)\r
-             Tiempo (seg):  2.41\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 11716\r
-             Intercambios:  4700 (14100 asignaciones)\r
-             Tiempo (seg):  1.98\r
-\r
-Quick Sort:\r
-             Comparaciones: 8018\r
-             Intercambios:  500 (1500 asignaciones)\r
-             Tiempo (seg):  0.66\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
+
+INFORME: Generado de forma Decreciente. Ordenado de forma Creciente.
+=======  ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  499500 (1498500 asignaciones)
+             Tiempo (seg):  185.59
+
+Bubble Sort Mejorado:
+             Comparaciones: 499500
+             Intercambios:  499500 (1498500 asignaciones)
+             Tiempo (seg):  148.35
+
+Shake Sort:
+             Comparaciones: 499499
+             Intercambios:  499499 (1498497 asignaciones)
+             Tiempo (seg):  148.63
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  499500 (1498500 asignaciones)
+             Tiempo (seg):  147.75
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  500 (1500 asignaciones)
+             Tiempo (seg):  37.08
+
+Insertion Sort:
+             Comparaciones: 499500
+             Intercambios:  166833 (500499 asignaciones)
+             Tiempo (seg):  73.82
+
+Shell's Sort:
+             Comparaciones: 18942
+             Intercambios:  4700 (14100 asignaciones)
+             Tiempo (seg):  2.41
+
+Shell's Sort Mejorado:
+             Comparaciones: 11716
+             Intercambios:  4700 (14100 asignaciones)
+             Tiempo (seg):  1.98
+
+Quick Sort:
+             Comparaciones: 8018
+             Intercambios:  500 (1500 asignaciones)
+             Tiempo (seg):  0.66
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
index a5b2ecb1d168098c138938e21309f1a5fffcb03e..d0c6dda10182aa001430d2a56724aba935bc49b8 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado de forma Decreciente. Ordenado de forma Decreciente.\r
-=======  ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  70.42\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 999\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.11\r
-\r
-Shake Sort:\r
-             Comparaciones: 999\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.05\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  35.15\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  34.66\r
-\r
-Insertion Sort:\r
-             Comparaciones: 999\r
-             Intercambios:  333 (999 asignaciones)\r
-             Tiempo (seg):  0.11\r
-\r
-Shell's Sort:\r
-             Comparaciones: 8006\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.60\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 8006\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.55\r
-\r
-Quick Sort:\r
-             Comparaciones: 8010\r
-             Intercambios:  0 (0 asignaciones)\r
-             Tiempo (seg):  0.61\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
+
+INFORME: Generado de forma Decreciente. Ordenado de forma Decreciente.
+=======  ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  70.42
+
+Bubble Sort Mejorado:
+             Comparaciones: 999
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.11
+
+Shake Sort:
+             Comparaciones: 999
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.05
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  35.15
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  34.66
+
+Insertion Sort:
+             Comparaciones: 999
+             Intercambios:  333 (999 asignaciones)
+             Tiempo (seg):  0.11
+
+Shell's Sort:
+             Comparaciones: 8006
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.60
+
+Shell's Sort Mejorado:
+             Comparaciones: 8006
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.55
+
+Quick Sort:
+             Comparaciones: 8010
+             Intercambios:  0 (0 asignaciones)
+             Tiempo (seg):  0.61
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
       manera, un intercambio equivales a 3 asignaciones.
\ No newline at end of file
index 5926d65f5d6c1744354b11a86ac84252a17782d2..53b689348a5c4a9d5c1ad42d6c3bb3fb808ba14f 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado Desordenado. Ordenado de forma Creciente.\r
-=======  ~~~~~~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  242487 (727461 asignaciones)\r
-             Tiempo (seg):  128.08\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 497085\r
-             Intercambios:  242487 (727461 asignaciones)\r
-             Tiempo (seg):  90.68\r
-\r
-Shake Sort:\r
-             Comparaciones: 327945\r
-             Intercambios:  242487 (727461 asignaciones)\r
-             Tiempo (seg):  77.89\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  242487 (727461 asignaciones)\r
-             Tiempo (seg):  90.79\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  989 (2967 asignaciones)\r
-             Tiempo (seg):  37.30\r
-\r
-Insertion Sort:\r
-             Comparaciones: 243480\r
-             Intercambios:  81162 (243486 asignaciones)\r
-             Tiempo (seg):  36.08\r
-\r
-Shell's Sort:\r
-             Comparaciones: 54699\r
-             Intercambios:  7395 (22185 asignaciones)\r
-             Tiempo (seg):  5.71\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 14892\r
-             Intercambios:  7395 (22185 asignaciones)\r
-             Tiempo (seg):  2.80\r
-\r
-Quick Sort:\r
-             Comparaciones: 10400\r
-             Intercambios:  2343 (7029 asignaciones)\r
-             Tiempo (seg):  1.32\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
-      manera, un intercambio equivales a 3 asignaciones.\r
+
+INFORME: Generado Desordenado. Ordenado de forma Creciente.
+=======  ~~~~~~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  242487 (727461 asignaciones)
+             Tiempo (seg):  128.08
+
+Bubble Sort Mejorado:
+             Comparaciones: 497085
+             Intercambios:  242487 (727461 asignaciones)
+             Tiempo (seg):  90.68
+
+Shake Sort:
+             Comparaciones: 327945
+             Intercambios:  242487 (727461 asignaciones)
+             Tiempo (seg):  77.89
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  242487 (727461 asignaciones)
+             Tiempo (seg):  90.79
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  989 (2967 asignaciones)
+             Tiempo (seg):  37.30
+
+Insertion Sort:
+             Comparaciones: 243480
+             Intercambios:  81162 (243486 asignaciones)
+             Tiempo (seg):  36.08
+
+Shell's Sort:
+             Comparaciones: 54699
+             Intercambios:  7395 (22185 asignaciones)
+             Tiempo (seg):  5.71
+
+Shell's Sort Mejorado:
+             Comparaciones: 14892
+             Intercambios:  7395 (22185 asignaciones)
+             Tiempo (seg):  2.80
+
+Quick Sort:
+             Comparaciones: 10400
+             Intercambios:  2343 (7029 asignaciones)
+             Tiempo (seg):  1.32
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
+      manera, un intercambio equivales a 3 asignaciones.
index 48ce920aa41ac84d2935e5ca59a240a120e3c142..2aacad5cf8acd5aa373aaad0c425804205ea0c2a 100644 (file)
@@ -1,54 +1,54 @@
-\r
-INFORME: Generado Desordenado. Ordenado de forma Decreciente.\r
-=======  ~~~~~~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~\r
-\r
-\r
-Bubble Sort:\r
-             Comparaciones: 998001\r
-             Intercambios:  257013 (771039 asignaciones)\r
-             Tiempo (seg):  130.50\r
-\r
-Bubble Sort Mejorado:\r
-             Comparaciones: 498275\r
-             Intercambios:  257013 (771039 asignaciones)\r
-             Tiempo (seg):  93.59\r
-\r
-Shake Sort:\r
-             Comparaciones: 350030\r
-             Intercambios:  257013 (771039 asignaciones)\r
-             Tiempo (seg):  83.21\r
-\r
-Ripple Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  257013 (771039 asignaciones)\r
-             Tiempo (seg):  93.65\r
-\r
-Selection Sort:\r
-             Comparaciones: 499500\r
-             Intercambios:  995 (2985 asignaciones)\r
-             Tiempo (seg):  36.80\r
-\r
-Insertion Sort:\r
-             Comparaciones: 258002\r
-             Intercambios:  86004 (258012 asignaciones)\r
-             Tiempo (seg):  37.85\r
-\r
-Shell's Sort:\r
-             Comparaciones: 53633\r
-             Intercambios:  7079 (21237 asignaciones)\r
-             Tiempo (seg):  5.54\r
-\r
-Shell's Sort Mejorado:\r
-             Comparaciones: 14566\r
-             Intercambios:  7079 (21237 asignaciones)\r
-             Tiempo (seg):  2.58\r
-\r
-Quick Sort:\r
-             Comparaciones: 11319\r
-             Intercambios:  2325 (6975 asignaciones)\r
-             Tiempo (seg):  1.38\r
-\r
-\r
-NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de\r
-====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta\r
-      manera, un intercambio equivales a 3 asignaciones.\r
+
+INFORME: Generado Desordenado. Ordenado de forma Decreciente.
+=======  ~~~~~~~~ ~~~~~~~~~~~~ ~~~~~~~~ ~~ ~~~~~ ~~~~~~~~~~~~
+
+
+Bubble Sort:
+             Comparaciones: 998001
+             Intercambios:  257013 (771039 asignaciones)
+             Tiempo (seg):  130.50
+
+Bubble Sort Mejorado:
+             Comparaciones: 498275
+             Intercambios:  257013 (771039 asignaciones)
+             Tiempo (seg):  93.59
+
+Shake Sort:
+             Comparaciones: 350030
+             Intercambios:  257013 (771039 asignaciones)
+             Tiempo (seg):  83.21
+
+Ripple Sort:
+             Comparaciones: 499500
+             Intercambios:  257013 (771039 asignaciones)
+             Tiempo (seg):  93.65
+
+Selection Sort:
+             Comparaciones: 499500
+             Intercambios:  995 (2985 asignaciones)
+             Tiempo (seg):  36.80
+
+Insertion Sort:
+             Comparaciones: 258002
+             Intercambios:  86004 (258012 asignaciones)
+             Tiempo (seg):  37.85
+
+Shell's Sort:
+             Comparaciones: 53633
+             Intercambios:  7079 (21237 asignaciones)
+             Tiempo (seg):  5.54
+
+Shell's Sort Mejorado:
+             Comparaciones: 14566
+             Intercambios:  7079 (21237 asignaciones)
+             Tiempo (seg):  2.58
+
+Quick Sort:
+             Comparaciones: 11319
+             Intercambios:  2325 (6975 asignaciones)
+             Tiempo (seg):  1.38
+
+
+NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de
+====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta
+      manera, un intercambio equivales a 3 asignaciones.
index 383cfc9360e6cd530fb7315b86c6a167ac3dfd37..faaf2f8cf9fb17b215d6369a0886287b363e5be2 100644 (file)
-program Comparacion_De_Algoritmos_De_Ordenamiento;\r
-\r
-uses\r
-    CRT, DOS;\r
-\r
-const\r
-     MAX_APE = 15;\r
-     RETARDO = 50; { NUMERO DEFINITIVO: 50? }\r
-     VERSION = '1.2.4';\r
-\r
-type\r
-    APELLIDO = string[MAX_APE];\r
-    DOCUMENTO = longint;\r
-    PERSONA = record\r
-                    ap: APELLIDO;\r
-                    dni: DOCUMENTO;\r
-              end;\r
-    HORA = record\r
-                 h,\r
-                 m,\r
-                 s,\r
-                 c: longint;\r
-           end;\r
-    TABLA = array[1..1000] of PERSONA;\r
-    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );\r
-    TIPO_VOCAL = ( TV_AEIOU, TV_EI );\r
-    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );\r
-\r
-(*********************************************************)\r
-\r
- procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );\r
-\r
-    var\r
-       i: integer;\r
-\r
-    begin\r
-         for i:= 1 to tam do\r
-            begin\r
-                 writeln( ar, datos[i].ap );\r
-                 writeln( ar, datos[i].dni );\r
-                 writeln( ar );\r
-            end;\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
- procedure Retardar( centenas: longint );\r
-\r
-    var\r
-       i: integer;\r
-\r
-    begin\r
-         for i:= 1 to centenas * 100 do ;\r
-    end;\r
-\r
-(*********************************************************)\r
-(*********************************************************)\r
-\r
- procedure MenuEvaluar( var datos: TABLA; var arch: text );\r
-\r
-    type\r
-        ORDEN = ( CRECIENTE, DECRECIENTE );\r
-        MEDICION = record\r
-                         Comp,\r
-                         Int,\r
-                         Tiem: longint;\r
-                   end;\r
-    var\r
-       bs, bsm, shs, rs, ss, is, sls, slsm, qs: MEDICION;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure CrearInforme( ord: ORDEN );\r
-\r
-       (*********************************************************)\r
-\r
-       procedure InfMetodo( var info: text; metodo: string; sort: MEDICION );\r
-\r
-          begin\r
-               writeln( info );\r
-               writeln( info, metodo, ':' );\r
-               writeln( info, '             Comparaciones: ', sort.Comp: 1 );\r
-               writeln( info, '             Intercambios:  ', sort.Int div 3: 1, ' (', sort.Int: 1, ' asignaciones)' );\r
-               writeln( info, '             Tiempo (seg):  ', sort.Tiem / 100: 2: 2 );\r
-          end; { procedure InfMetodo }\r
-\r
-       (*********************************************************)\r
-\r
-       var { procedure CrearInforme }\r
-          info: text;\r
-\r
-       begin\r
-            assign( info, 'INFORME.TXT' );\r
-            rewrite( info );\r
-            writeln( info );\r
-            if ord = DECRECIENTE then\r
-              begin\r
-                   writeln( info, 'INFORME: Orden Decreciente.' );\r
-                   writeln( info, '=======  ~~~~~ ~~~~~~~~~~~' );\r
-              end\r
-            else\r
-              begin\r
-                   writeln( info, 'INFORME: Orden Creciente.' );\r
-                   writeln( info, '=======  ~~~~~ ~~~~~~~~~' );\r
-              end;\r
-            writeln( info );\r
-            InfMetodo( info, 'Bubble Sort:', bs );\r
-            InfMetodo( info, 'Bubble Sort Mejorado:', bsm );\r
-            InfMetodo( info, 'Shake Sort:', shs );\r
-            InfMetodo( info, 'Ripple Sort:', rs );\r
-            InfMetodo( info, 'Selection Sort:', ss );\r
-            InfMetodo( info, 'Insertion Sort:', is );\r
-            InfMetodo( info, 'Shell''s Sort:', sls );\r
-            InfMetodo( info, 'Shell''s Sort Mejorado:', slsm );\r
-            InfMetodo( info, 'Quick Sort:', qs );\r
-            writeln( info );\r
-            writeln( info );\r
-            writeln( info, 'NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de' );\r
-            writeln( info, '====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta' );\r
-            writeln( info, '      manera, un intercambio equivales a 3 asignaciones.' );\r
-            close( info );\r
-       end; { procedure CrearInforme }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure NoExisteArch;\r
-\r
-       begin\r
-            clrscr;\r
-            gotoxy( 20, 10 );\r
-            textcolor( LightMagenta + Blink );\r
-            writeln( 'ERROR: No existe el archivo a evaluar!' );\r
-            textcolor( LightGray );\r
-            writeln;\r
-            writeln( '             Creelo seleccionando la opci¢n 1 del Men£ Principal.' );\r
-            delay( 4000 );\r
-       end; { procedure NoExisteArch }\r
-\r
-    (*********************************************************)\r
-\r
-    function ExisteArchivo( nombre: String ): boolean;\r
-                          { funcion extrido de la ayuda del pascal }\r
-       var\r
-          arch: text;\r
-\r
-       begin\r
-            {$I-}\r
-            Assign( arch, nombre );\r
-            FileMode := 0;  { Solo lectura }\r
-            Reset( arch );\r
-            Close( arch );\r
-            {$I+}\r
-            ExisteArchivo := (IOResult = 0) and (nombre <> '');\r
-       end; { function ExisteArchivo }\r
-\r
-    (*********************************************************)\r
-\r
-       procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );\r
-\r
-          var\r
-             i: integer;\r
-             void: string[2];\r
-\r
-          begin\r
-               for i:= 1 to tam do\r
-                  begin\r
-                       readln( ar, datos[i].ap );\r
-                       readln( ar, datos[i].dni );\r
-                       readln( ar, void );\r
-                  end;\r
-          end; { procedure CargarTabla }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Intercambiar( var a, b: PERSONA; var int: longint );\r
-\r
-       var\r
-          aux: PERSONA;\r
-\r
-       begin\r
-            int := int + 1;\r
-            Retardar( RETARDO );\r
-            aux := a;\r
-            int := int + 1;\r
-            Retardar( RETARDO );\r
-            a := b;\r
-            int := int + 1;\r
-            Retardar( RETARDO );\r
-            b := aux;\r
-       end; { procedure Intercambiar }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetHora( var hor: HORA );\r
-\r
-       var\r
-          h, m, s, c: word;\r
-\r
-       begin\r
-            gettime( h, m, s, c );\r
-            hor.h := h;\r
-            hor.m := m;\r
-            hor.s := s;\r
-            hor.c := c;\r
-       end; { procedure GetHora }\r
-\r
-    (*********************************************************)\r
-\r
-    function GetTiempo( h1, h2: HORA ): longint;\r
-\r
-       var\r
-          t: longint;\r
-          aux: HORA;\r
-\r
-       begin\r
-            if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }\r
-              begin\r
-              if h1.h < h2.h then\r
-                begin\r
-                     aux := h1;\r
-                     h1 := h2;\r
-                     h2 := aux;\r
-                end\r
-              end\r
-            else if h1.m <> h2.m then\r
-                   begin\r
-                   if h1.m < h2.m then\r
-                     begin\r
-                          aux := h1;\r
-                          h1 := h2;\r
-                          h2 := aux;\r
-                     end\r
-                   end\r
-                 else if h1.s <> h2.s then\r
-                        begin\r
-                        if h1.s < h2.s then\r
-                          begin\r
-                               aux := h1;\r
-                               h1 := h2;\r
-                               h2 := aux;\r
-                          end\r
-                        end\r
-                      else if h1.c <> h2.c then\r
-                             if h1.c < h2.c then\r
-                               begin\r
-                                    aux := h1;\r
-                                    h1 := h2;\r
-                                    h2 := aux;\r
-                               end;\r
-            t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60  + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );\r
-            GetTiempo := t;\r
-       end; { function GetTiempo }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure EvaluarCre( var datos: TABLA; var arch: text );\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          var\r
-             i, j: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := tam - 1 downto 1 do\r
-               begin\r
-                    for j := tam - 1 downto 1 do\r
-                      begin\r
-                           m.Comp := m.Comp + 1;\r
-                           Retardar( RETARDO );\r
-                           if datos[j].ap > datos[j+1].ap then\r
-                             Intercambiar( datos[j], datos[j+1], m.Int);\r
-                      end;\r
-               end;\r
-             GetHora( h2 );\r
-             m.Tiem := GetTiempo( h1, h2 );\r
-        end; { procedure BubbleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          var\r
-             huboint: boolean;\r
-             i, n: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               n := 1;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               huboint := true;\r
-               while huboint do\r
-                 begin\r
-                      huboint := false;\r
-                      for i := tam - 1 downto n do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[i].ap > datos[i+1].ap then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[i+1], m.Int);\r
-                                    huboint := true;\r
-                               end;\r
-                        end;\r
-                      n := n + 1;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure BubbleSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, d, j, tmp: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               i := 2;\r
-               d := tam;\r
-               tmp := tam;\r
-               repeat\r
-                     for j := d downto i do\r
-                      begin\r
-                       m.Comp := m.Comp + 1;\r
-                       Retardar( RETARDO );\r
-                       if datos[j].ap < datos[j-1].ap then\r
-                         begin\r
-                              Intercambiar( datos[j], datos[j-1], m.Int );\r
-                              tmp := j;\r
-                         end;\r
-                      end;\r
-                     i := tmp + 1;\r
-                     for j := i to d do\r
-                      begin\r
-                       m.Comp := m.Comp + 1;\r
-                       Retardar( RETARDO );\r
-                       if datos[j].ap < datos[j-1].ap then\r
-                         begin\r
-                              Intercambiar( datos[j], datos[j-1], m.Int );\r
-                              tmp := j;\r
-                         end;\r
-                      end;\r
-                     d := tmp - 1;\r
-               until i >= d;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShakeSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, j: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := 1 to tam do\r
-                 begin\r
-                      for j := i + 1 to tam do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[i].ap > datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure RippleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             i, sel, n: integer;\r
-             hubosel: boolean;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for n := 1 to tam - 1 do\r
-                 begin\r
-                      hubosel := false;\r
-                      sel := n;\r
-                      for i := n + 1 to tam do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[sel].ap > datos[i].ap then\r
-                               begin\r
-                                    sel := i;\r
-                                    hubosel := true;\r
-                               end;\r
-                        end;\r
-                      if hubosel then Intercambiar( datos[n], datos[sel], m.Int);\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure SelectionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, j, k: integer;\r
-             tmp: PERSONA;\r
-             terminar: boolean;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := 2 to tam do\r
-                 begin\r
-                      tmp := datos[i];\r
-                      j := i - 1;\r
-                      terminar := false;\r
-                      while ( j >= 1 ) and ( not terminar ) do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if ( tmp.ap < datos[j].ap ) then\r
-                               begin\r
-                                    m.Int := m.Int + 1;\r
-                                    Retardar( RETARDO );\r
-                                    datos[j+1] := datos[j];\r
-                                    j := j - 1;\r
-                               end\r
-                             else terminar := true;\r
-                        end;\r
-                      m.Int := m.Int + 1;\r
-                      Retardar( RETARDO );\r
-                      datos[j+1] := tmp;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure InsertionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             hueco, i, j: integer;\r
-             huboint: boolean;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               hueco := tam;\r
-               while hueco > 1 do\r
-                 begin\r
-                      hueco := hueco div 2;\r
-                      huboint := true;\r
-                      while huboint do\r
-                        begin\r
-                             huboint := false;\r
-                             for i := 1 to tam - hueco do\r
-                               begin\r
-                                    j := i + hueco;\r
-                                    m.Comp := m.Comp + 1;\r
-                                    Retardar( RETARDO );\r
-                                    if ( datos[i].ap > datos[j].ap ) then\r
-                                      begin\r
-                                           Intercambiar( datos[i], datos[j], m.Int );\r
-                                           huboint := true;\r
-                                      end;\r
-                               end;\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShellSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          (*********************************************************)\r
-\r
-          procedure Shell( var datos: TABLA; hueco, i: integer; var comp, int: longint );\r
-             var\r
-                j: integer;\r
-\r
-             begin\r
-                  j := i + hueco;\r
-                  comp := comp + 1;\r
-                  Retardar( RETARDO );\r
-                  if ( datos[i].ap > datos[j].ap ) then\r
-                    begin\r
-                         Intercambiar( datos[i], datos[j], int );\r
-                         if (i - hueco) > 0 then\r
-                           Shell( datos, hueco, i - hueco, comp, int );\r
-                    end;\r
-             end; { procedure Shell }\r
-\r
-          (*********************************************************)\r
-\r
-          var { procedure ShellSortMej }\r
-             h1, h2: HORA;\r
-             hueco, i, j: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               hueco := tam;\r
-               while hueco > 1 do\r
-                 begin\r
-                      hueco := hueco div 2;\r
-                      for i := 1 to tam - hueco do\r
-                        begin\r
-                             j := i + hueco;\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if ( datos[i].ap > datos[j].ap ) then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[j], m.Int );\r
-                                    if (i - hueco) > 0 then\r
-                                      Shell( datos, hueco, i - hueco, m.Comp, m.Int );\r
-                               end;\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShellSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          (*********************************************************)\r
-\r
-          procedure QSort( var datos: TABLA; min, max: integer; var comp, int: longint );\r
-\r
-             var\r
-                i, j: integer;\r
-                sel: PERSONA;\r
-                flag: boolean;\r
-\r
-             begin\r
-                  sel := datos[( min + max ) div 2];\r
-                  i := min;\r
-                  j := max;\r
-                  repeat\r
-                        comp := comp + 1;\r
-                        Retardar( RETARDO );\r
-                        flag := false;\r
-                        while datos[i].ap < sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                                 Retardar( RETARDO );\r
-                                            end\r
-                                       else flag := true;\r
-                               i := i + 1;\r
-                          end;\r
-                        comp := comp + 1;\r
-                        Retardar( RETARDO );\r
-                        flag := false;\r
-                        while datos[j].ap > sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                                 Retardar( RETARDO );\r
-                                            end\r
-                                       else flag := true;\r
-                               j := j - 1;\r
-                          end;\r
-                        if i <= j then\r
-                          begin\r
-                               if i < j then Intercambiar( datos[i], datos[j], int );\r
-                               i := i + 1;\r
-                               j := j - 1;\r
-                          end;\r
-                  until i > j;\r
-                  if min < j then QSort( datos, min, j, comp, int);\r
-                  if i < max then QSort( datos, i, max, comp, int);\r
-             end; { procedure QSort }\r
-\r
-          (*********************************************************)\r
-\r
-          var\r
-             h1, h2: HORA;\r
-\r
-          begin { procedure QuickSort }\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               QSort( datos, 1, 1000, m.Comp, m.Int );\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-            {  rewrite( arch );\r
-               CargarArchivo( datos, arch, 1000 );\r
-               close( arch ); }\r
-          end; { procedure QuickSort }\r
-\r
-       (*********************************************************)\r
-\r
-       begin { procedure EvaluarCre }\r
-            if ExisteArchivo( 'DATOS.TXT' ) then\r
-              begin\r
-                   BubbleSort( arch, datos, 1000, bs );\r
-                   BubbleSortMej( arch, datos, 1000, bsm );\r
-                   ShakeSort( arch, datos, 1000, shs );\r
-                   RippleSort( arch, datos, 1000, rs );\r
-                   SelectionSort( arch, datos, 1000, ss );\r
-                   InsertionSort( arch, datos, 1000, is );\r
-                   ShellSort( arch, datos, 1000, sls );\r
-                   ShellSortMej( arch, datos, 1000, slsm );\r
-                   QuickSort( arch, datos, 1000, qs );\r
-                   CrearInforme( CRECIENTE );\r
-             end\r
-            else\r
-            NoExisteArch;\r
-       end;  { procedure EvaluarCre }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure EvaluarDec( var datos: TABLA; var arch: text );\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          var\r
-             i, j: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := tam - 1 downto 1 do\r
-               begin\r
-                    for j := tam - 1 downto 1 do\r
-                      begin\r
-                           m.Comp := m.Comp + 1;\r
-                           Retardar( RETARDO );\r
-                           if datos[j].ap < datos[j+1].ap then\r
-                             Intercambiar( datos[j], datos[j+1], m.Int);\r
-                      end;\r
-               end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-        end; { procedure BubbleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          var\r
-             huboint: boolean;\r
-             i, n: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               n := 1;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               huboint := true;\r
-               while huboint do\r
-                 begin\r
-                      huboint := false;\r
-                      for i := tam - 1 downto n do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[i].ap < datos[i+1].ap then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[i+1], m.Int);\r
-                                    huboint := true;\r
-                               end;\r
-                        end;\r
-                      n := n + 1;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure BubbleSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, d, j, tmp: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               i := 2;\r
-               d := tam;\r
-               tmp := tam;\r
-               repeat\r
-                     for j := d downto i do\r
-                      begin\r
-                       m.Comp := m.Comp + 1;\r
-                       Retardar( RETARDO );\r
-                       if datos[j].ap > datos[j-1].ap then\r
-                         begin\r
-                              Intercambiar( datos[j], datos[j-1], m.Int );\r
-                              tmp := j;\r
-                         end;\r
-                      end;\r
-                     i := tmp + 1;\r
-                     for j := i to d do\r
-                      begin\r
-                       m.Comp := m.Comp + 1;\r
-                       Retardar( RETARDO );\r
-                       if datos[j].ap > datos[j-1].ap then\r
-                         begin\r
-                              Intercambiar( datos[j], datos[j-1], m.Int );\r
-                              tmp := j;\r
-                         end;\r
-                      end;\r
-                     d := tmp - 1;\r
-               until i >= d;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShakeSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, j: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := 1 to tam do\r
-                 begin\r
-                      for j := i + 1 to tam do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[i].ap < datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure RippleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             i, sel, n: integer;\r
-             hubosel: boolean;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for n := 1 to tam - 1 do\r
-                 begin\r
-                      hubosel := false;\r
-                      sel := n;\r
-                      for i := n + 1 to tam do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[sel].ap < datos[i].ap then\r
-                               begin\r
-                                    sel := i;\r
-                                    hubosel := true;\r
-                               end;\r
-                        end;\r
-                      if hubosel then Intercambiar( datos[n], datos[sel], m.Int);\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure SelectionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, j, k: integer;\r
-             tmp: PERSONA;\r
-             terminar: boolean;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := 2 to tam do\r
-                 begin\r
-                      tmp := datos[i];\r
-                      j := i - 1;\r
-                      terminar := false;\r
-                      while ( j >= 1 ) and ( not terminar ) do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if ( tmp.ap > datos[j].ap ) then\r
-                               begin\r
-                                    m.Int := m.Int + 1;\r
-                                    Retardar( RETARDO );\r
-                                    datos[j+1] := datos[j];\r
-                                    j := j - 1;\r
-                               end\r
-                             else terminar := true;\r
-                        end;\r
-                      m.Int := m.Int + 1;\r
-                      Retardar( RETARDO );\r
-                      datos[j+1] := tmp;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure InsertionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             hueco, i, j: integer;\r
-             huboint: boolean;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               hueco := tam;\r
-               while hueco > 1 do\r
-                 begin\r
-                      hueco := hueco div 2;\r
-                      huboint := true;\r
-                      while huboint do\r
-                        begin\r
-                             huboint := false;\r
-                             for i := 1 to tam - hueco do\r
-                               begin\r
-                                    j := i + hueco;\r
-                                    m.Comp := m.Comp + 1;\r
-                                    Retardar( RETARDO );\r
-                                    if ( datos[i].ap < datos[j].ap ) then\r
-                                      begin\r
-                                           Intercambiar( datos[i], datos[j], m.Int );\r
-                                           huboint := true;\r
-                                      end;\r
-                               end;\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShellSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          (*********************************************************)\r
-\r
-          procedure Shell( var datos: TABLA; hueco, i: integer;\r
-                           var comp: longint; var int: longint );\r
-             var\r
-                j: integer;\r
-\r
-             begin\r
-                  j := i + hueco;\r
-                  comp := comp + 1;\r
-                  Retardar( RETARDO );\r
-                  if ( datos[i].ap < datos[j].ap ) then\r
-                    begin\r
-                         Intercambiar( datos[i], datos[j], int );\r
-                         if (i - hueco) > 0 then\r
-                           Shell( datos, hueco, i - hueco, comp, int );\r
-                    end;\r
-             end; { procedure Shell }\r
-\r
-          (*********************************************************)\r
-\r
-          var { procedure ShellSortMej }\r
-             h1, h2: HORA;\r
-             hueco, i, j: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               hueco := tam;\r
-               while hueco > 1 do\r
-                 begin\r
-                      hueco := hueco div 2;\r
-                      for i := 1 to tam - hueco do\r
-                        begin\r
-                             j := i + hueco;\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if ( datos[i].ap < datos[j].ap ) then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[j], m.Int );\r
-                                    if (i - hueco) > 0 then\r
-                                      Shell( datos, hueco, i - hueco, m.Comp, m.Int );\r
-                               end;\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShellSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          procedure QSort( var datos: TABLA; min, max: integer;\r
-                           var comp: longint; var int: longint );\r
-\r
-             var\r
-                i, j: integer;\r
-                sel: PERSONA;\r
-                flag: boolean;\r
-\r
-             begin\r
-                  sel := datos[( min + max ) div 2];\r
-                  i := min;\r
-                  j := max;\r
-                  repeat\r
-                        comp := comp + 1;\r
-                        Retardar( RETARDO );\r
-                        flag := false;\r
-                        while datos[i].ap > sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                                 Retardar( RETARDO );\r
-                                            end\r
-                                       else flag := true;\r
-                               i := i + 1;\r
-                          end;\r
-                        comp := comp + 1;\r
-                        Retardar( RETARDO );\r
-                        flag := false;\r
-                        while datos[j].ap < sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                                 Retardar( RETARDO );\r
-                                            end\r
-                                       else flag := true;\r
-                               j := j - 1;\r
-                          end;\r
-                        if i <= j then\r
-                          begin\r
-                               if i < j then Intercambiar( datos[i], datos[j], int );\r
-                               i := i + 1;\r
-                               j := j - 1;\r
-                          end;\r
-                  until i > j;\r
-                  if min < j then QSort( datos, min, j, comp, int);\r
-                  if i < max then QSort( datos, i, max, comp, int);\r
-             end; { procedure QSort }\r
-\r
-          (*********************************************************)\r
-\r
-          var\r
-             h1, h2: HORA;\r
-\r
-          begin { procedure QuickSort }\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               QSort( datos, 1, 1000, m.Comp, m.Int );\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure QuickSort }\r
-\r
-       (*********************************************************)\r
-\r
-       begin { procedure EvaluarDec }\r
-            if ExisteArchivo( 'DATOS.TXT' ) then\r
-              begin\r
-                   BubbleSort( arch, datos, 1000, bs );\r
-                   BubbleSortMej( arch, datos, 1000, bsm );\r
-                   ShakeSort( arch, datos, 1000, shs );\r
-                   RippleSort( arch, datos, 1000, rs );\r
-                   SelectionSort( arch, datos, 1000, ss );\r
-                   InsertionSort( arch, datos, 1000, is );\r
-                   ShellSort( arch, datos, 1000, sls );\r
-                   ShellSortMej( arch, datos, 1000, slsm );\r
-                   QuickSort( arch, datos, 1000, qs );\r
-                   CrearInforme( DECRECIENTE );\r
-             end\r
-            else\r
-            NoExisteArch;\r
-       end;  { procedure EvaluarDec }\r
-\r
-    (*********************************************************)\r
-\r
-    var { procedure MenuEvaluar }\r
-       tecla: char;\r
-\r
-    begin\r
-         clrscr;\r
-         textcolor( Yellow );\r
-         gotoxy( 19, 3 );\r
-         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-         gotoxy( 19, 4 );\r
-         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-         textcolor( LightCyan );\r
-         gotoxy( 1, 7 );\r
-         writeln( '  Evaluar Algoritmos:' );\r
-         writeln( '  ------- ----------' );\r
-         textcolor( LightGray );\r
-         writeln;\r
-         writeln;\r
-         writeln( '     1.- Ordenando en forma creciente.' );\r
-         writeln( '     2.- Ordenando en forma decreciente.' );\r
-         writeln( '     0.- Men£ Anterior.' );\r
-         gotoxy( 1, 20 );\r
-         textcolor( White );\r
-         write( '  Ingrese su opci¢n: ' );\r
-         textcolor( Yellow );\r
-         tecla := readkey;\r
-         while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do\r
-           begin\r
-                textcolor( White );\r
-                gotoxy( 1, 20 );\r
-                write( '  Ingrese su opci¢n (1, 2 o 0): ' );\r
-                textcolor( Yellow );\r
-                tecla := readkey;\r
-           end;\r
-         case tecla of\r
-            '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )\r
-                                                 else NoExisteArch;\r
-            '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )\r
-                                                 else NoExisteArch;\r
-            '0': ;\r
-         end;\r
-    end;\r
-\r
-(*********************************************************)\r
-(*********************************************************)\r
-\r
- procedure MenuGenerar( var arch: text );\r
-\r
-    (*********************************************************)\r
-\r
-    function GetRNDApellido( max, min: integer ): APELLIDO;\r
-\r
-       (*********************************************************)\r
-\r
-       function GetVocal( tipo: TIPO_VOCAL ): char;\r
-\r
-         var\r
-            valor: integer;\r
-\r
-         begin\r
-              if tipo = TV_AEIOU then valor := random( 16 )\r
-                                 else valor := random( 6 ) + 5;\r
-              case valor of\r
-                  0..4: GetVocal := 'A';\r
-                  5..7: GetVocal := 'E';\r
-                  8..10: GetVocal := 'I';\r
-                 11..13: GetVocal := 'O';\r
-                 14..15: GetVocal := 'U';\r
-              end;\r
-         end; { function GetVocal }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );\r
-\r
-         var\r
-            valor: integer;\r
-\r
-          begin\r
-              case indic of\r
-                  I_ESQ:\r
-                        begin\r
-                             vocal := 'U';\r
-                             indic := I_ESQU;\r
-                             proxl := TL_VOCAL;\r
-                        end;\r
-                  I_ESQU:\r
-                         begin\r
-                              vocal := GetVocal( TV_EI );\r
-                              indic := I_NADA;\r
-                              proxl := TL_CONSO;\r
-                         end;\r
-                  else\r
-                    begin\r
-                         vocal := GetVocal( TV_AEIOU );\r
-                         indic := I_NADA;\r
-                         if random( 40 ) = 0 then proxl := TL_VOCAL\r
-                                             else proxl := TL_CONSO;\r
-                    end;\r
-                  end;\r
-          end; { procedure GetRNDVocal }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );\r
-\r
-          var\r
-             valor: integer;\r
-\r
-          begin\r
-               proxl := TL_VOCAL;\r
-               indic := I_NADA;\r
-\r
-               case indic of\r
-                  I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';\r
-                  I_ESB: case random( 2 ) of\r
-                             0: conso := 'R';\r
-                             1: conso := 'L';\r
-                         end;\r
-                  I_ESC: case random( 4 ) of\r
-                             0: conso := 'C';\r
-                             1: conso := 'H';\r
-                             2: conso := 'R';\r
-                             3: conso := 'L';\r
-                         end;\r
-                  I_ESL: case random( 6 ) of\r
-                             0: conso := 'T';\r
-                             1..5: conso := 'L';\r
-                         end;\r
-                  I_ESM: case random( 3 ) of\r
-                             0: conso := 'P';\r
-                             1: conso := 'B';\r
-                             2: conso := 'L';\r
-                         end;\r
-                  I_ESN: case random( 3 ) of\r
-                             0: conso := 'R';\r
-                             1: conso := 'V';\r
-                             2: conso := 'C';\r
-                         end;\r
-                  else case random( 55 ) of\r
-                           0..3: begin\r
-                                      conso := 'B';\r
-                                      if random( 10 ) = 0 then begin\r
-                                                                    indic := I_ESB;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                 end;\r
-                           4..7: begin\r
-                                      conso := 'C';\r
-                                      if random( 5 ) = 0 then begin\r
-                                                                    indic := I_ESC;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                 end;\r
-                           8..11: conso := 'D';\r
-                           12..14: begin\r
-                                      conso := 'F';\r
-                                      if random( 10 ) = 0 then begin\r
-                                                                    indic := I_ESF;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                   end;\r
-                           15..17: begin\r
-                                        conso := 'G';\r
-                                        if random( 5 ) = 0 then\r
-                                        begin\r
-                                             indic := I_ESG;\r
-                                             if random( 4 ) = 0 then proxl := TL_CONSO;\r
-                                        end;\r
-                                   end;\r
-                           18..19: conso := 'H';\r
-                           20..22: conso := 'J';\r
-                           23..24: conso := 'K';\r
-                           25..27: begin\r
-                                        conso := 'L';\r
-                                        if random( 15 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESL;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           28..30: begin\r
-                                        conso := 'M';\r
-                                        if random( 5 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESM;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           31..33: begin\r
-                                        conso := 'N';\r
-                                        if random( 5 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESN;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           34..36: conso := 'P';\r
-                           37..38: begin\r
-                                        conso := 'Q';\r
-                                        indic := I_ESQ;\r
-                                   end;\r
-                           39..41: begin\r
-                                        conso := 'R';\r
-                                        if random( 3 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESR;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           42..44: conso := 'S';\r
-                           45..47: begin\r
-                                        conso := 'T';\r
-                                        if random( 10 ) = 0 then\r
-                                          begin\r
-                                               indic := I_EST;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           48..50: conso := 'V';\r
-                           51: conso := 'W';\r
-                           52: conso := 'X';\r
-                           53: conso := 'Y';\r
-                           54: conso := 'Z';\r
-                         end; { case random( 55 ) of }\r
-\r
-                end; { case indic of }\r
-           end; { procedure GetRNDConsonante }\r
-\r
-       (*********************************************************)\r
-\r
-       var { function GetRNDApellido }\r
-          tam, i: integer;\r
-          aux: char;\r
-          apel: APELLIDO;\r
-          indic: INDICADOR;\r
-          proxl: TIPO_LETRA;\r
-\r
-       begin\r
-            if max > MAX_APE then max := MAX_APE;\r
-            tam := random( max + 1 ) + min;\r
-            indic := I_NADA;\r
-            apel := '';\r
-            if random( 5 ) = 0 then proxl := TL_VOCAL\r
-                               else proxl := TL_CONSO;\r
-            for i := 1 to tam do\r
-              begin\r
-                   if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )\r
-                                       else GetRNDVocal( indic, proxl, aux );\r
-                   apel := apel + aux;\r
-              end;\r
-            GetRNDApellido := apel;\r
-       end; { function GetRNDApellido }\r
-\r
-    (*********************************************************)\r
-\r
-    function GetRNDLetra( min, max: char ): char;\r
-\r
-       begin\r
-            GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetOrdApellidos( var ar: text; cant: integer );\r
-\r
-       var\r
-           mil: boolean;\r
-           letra, letra1: char;\r
-           i, j, veces: integer;\r
-           dni: DOCUMENTO;\r
-           ap, ape, apel: APELLIDO;\r
-\r
-       begin\r
-            mil := false;\r
-            if cant = 1000 then mil := true;\r
-            dni := 10000000 + (random( 15000 ) * 100);\r
-            ap := '';\r
-            ape := '';\r
-            apel := '';\r
-            for letra := 'A' to 'Z' do\r
-              begin\r
-                   ap := letra;\r
-                   for letra1 := 'A' to 'Z' do\r
-                      begin\r
-                           if mil then\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':\r
-                                        case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end\r
-                           else\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':\r
-                                        case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end;\r
-                           ape := ap + letra1;\r
-                           for j := 1 to veces do\r
-                               begin\r
-                                    if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )\r
-                                             else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );\r
-                                    dni := dni + random( 50000 ) + 1;\r
-                                    writeln( ar, apel );\r
-                                    writeln( ar, dni );\r
-                                    writeln( ar );\r
-                                    apel := '';\r
-                               end;\r
-\r
-                           ape := '';\r
-\r
-                      end; { for letra1 := 'A' to 'Z' do }\r
-\r
-                   ap := '';\r
-\r
-              end; { for letra := 'A' to 'Z' do }\r
-\r
-       end; { procedure GetOrdApellidos }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetInvOrdApellidos( var ar: text; cant: integer );\r
-\r
-       var\r
-          mil: boolean;\r
-          letra, letra1: char;\r
-          i, j, veces: integer;\r
-          dni: DOCUMENTO;\r
-          ap, ape, apel: APELLIDO;\r
-\r
-       begin\r
-            mil := false;\r
-            if cant = 1000 then mil := true;\r
-            dni := 34000000 + (random( 15000 ) * 100);\r
-            ap := '';\r
-            ape := '';\r
-            apel := '';\r
-            for letra := 'Z' downto 'A' do\r
-              begin\r
-                   ap := letra;\r
-                   for letra1 := 'Z' downto 'A' do\r
-                      begin\r
-                           if mil then\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':\r
-                                        case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end\r
-                           else\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':\r
-                                        case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end;\r
-                           ape := ap + letra1;\r
-                           for j := 1 to veces do\r
-                               begin\r
-                                    if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )\r
-                                              else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );\r
-                                    dni := dni - random( 40000 ) - 1;\r
-                                    writeln( ar, apel );\r
-                                    writeln( ar, dni );\r
-                                    writeln( ar );\r
-                                    apel := '';\r
-                               end;\r
-\r
-                           ape := '';\r
-\r
-                      end; { for letra1 := 'A' to 'Z' do }\r
-\r
-                   ap := '';\r
-\r
-              end; { for letra := 'A' to 'Z' do }\r
-\r
-       end; { GetInvOrdApellidos }\r
-\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       var\r
-          i: integer;\r
-          ap: APELLIDO;\r
-          dni: DOCUMENTO;\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            dni := 10000000 + (random( 15000 ) * 100);\r
-\r
-            for i := 1 to n do\r
-                begin\r
-                     ap := GetRNDApellido( 8, 4 );\r
-                     dni := dni + random( 50000 ) + 1;\r
-                     writeln( arch, ap );\r
-                     writeln( arch, dni );\r
-                     writeln( arch );\r
-                end;\r
-            if reabrir then close( arch );\r
-       end; { procedure GenerarRND }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            GetOrdApellidos( arch, n );\r
-            if reabrir then close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            GetInvOrdApellidos( arch, n );\r
-            if reabrir then close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Generar90Ord( var arch: text );\r
-\r
-       begin\r
-            rewrite( arch );\r
-            GenerarOrd( arch, 900, false );\r
-            GenerarRND( arch, 100, false );\r
-            close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Generar90OrdDec( var arch: text );\r
-\r
-       begin\r
-            rewrite( arch );\r
-            GenerarOrdDec( arch, 900, false );\r
-            GenerarRND( arch, 100, false );\r
-            close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    var { procedure MenuGenerar }\r
-       tecla: char;\r
-\r
-    begin\r
-         clrscr;\r
-         textcolor( Yellow );\r
-         gotoxy( 19, 3 );\r
-         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-         gotoxy( 19, 4 );\r
-         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-         textcolor( LightCyan );\r
-         gotoxy( 1, 7 );\r
-         writeln( '  Generar Archivo (''DATOS.TXT''):' );\r
-         writeln( '  ------- ------- -------------' );\r
-         textcolor( LightGray );\r
-         writeln;\r
-         writeln;\r
-         writeln( '     1.- Con datos desordenados.' );\r
-         writeln( '     2.- Con datos en orden creciente (APELLIDO, DNI).' );\r
-         writeln( '     3.- Con datos en orden decreciente (APELLIDO, DNI).' );\r
-         writeln( '     4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );\r
-         writeln( '     5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );\r
-         writeln( '     0.- Men£ Anterior.' );\r
-         gotoxy( 1, 20 );\r
-         textcolor( White );\r
-         write( '  Ingrese su opci¢n: ' );\r
-         textcolor( Yellow );\r
-         tecla := readkey;\r
-         while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do\r
-           begin\r
-                textcolor( White );\r
-                gotoxy( 1, 20 );\r
-                write( '  Ingrese su opci¢n (1 a 5 o 0): ' );\r
-                textcolor( Yellow );\r
-                tecla := readkey;\r
-           end;\r
-         case tecla of\r
-            '1': GenerarRND( arch, 1000, true );\r
-            '2': GenerarOrd( arch, 1000, true );\r
-            '3': GenerarOrdDec( arch, 1000, true );\r
-            '4': Generar90Ord( arch );\r
-            '5': Generar90OrdDec( arch );\r
-            '0': ;\r
-         end;\r
-    end; { procedure MenuGenerar }\r
-\r
-(*********************************************************)\r
-\r
- procedure PantallaSalida;\r
-\r
-    begin\r
-         writeln;\r
-         NormVideo;\r
-         clrscr;\r
-         writeln;\r
-         textcolor( white );\r
-         writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n ', VERSION, ' <-o-o-> Luca - Soft' );\r
-         NormVideo;\r
-         writeln( '  Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );\r
-         writeln( '  Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );\r
-         writeln;\r
-         textcolor( LightMagenta );\r
-         write( '                lluca@cnba.uba.ar' );\r
-         NormVideo;\r
-         write( '   o   ' );\r
-         textcolor( LightMagenta );\r
-         writeln( 'lluca@geocities.com' );\r
-         NormVideo;\r
-         writeln;\r
-         writeln( '  (c) 1999 - Todos los derechos reservados.' );\r
-         delay( 750 );\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
-var { programa }\r
-    datos: TABLA;\r
-    arch: text;\r
-    tecla: char;\r
-    salir: boolean;\r
-\r
-begin\r
-     randomize;\r
-     assign( arch, 'DATOS.TXT' );\r
-     salir := false;\r
-     textbackground( Blue );\r
-\r
-     while not salir do\r
-       begin\r
-            clrscr;\r
-            textcolor( Yellow );\r
-            gotoxy( 19, 3 );\r
-            writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-            gotoxy( 19, 4 );\r
-            writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-            gotoxy( 1, 7 );\r
-            textcolor( LightCyan );\r
-            writeln( '  Men£ Principal:' );\r
-            writeln( '  ---- ---------' );\r
-            textcolor( LightGray );\r
-            writeln;\r
-            writeln;\r
-            writeln( '     1.- Generar Archivo (''DATOS.TXT'').' );\r
-            writeln( '     2.- Evaluar Algoritmos.' );\r
-            writeln( '     0.- Salir.' );\r
-            gotoxy( 1, 20 );\r
-            textcolor( White );\r
-            write( '  Ingrese su opci¢n: ' );\r
-            textcolor( Yellow );\r
-            tecla := readkey;\r
-            while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do\r
-              begin\r
-                   textcolor( White );\r
-                   gotoxy( 1, 20 );\r
-                   write( '  Ingrese su opci¢n (1, 2 o 0): ' );\r
-                   textcolor( Yellow );\r
-                   tecla := readkey;\r
-              end;\r
-            case tecla of\r
-                 '1': MenuGenerar( arch );\r
-                 '2': MenuEvaluar( datos, arch );\r
-                 '0': salir := true;\r
-            end;\r
-       end;\r
-     PantallaSalida;\r
+program Comparacion_De_Algoritmos_De_Ordenamiento;
+
+uses
+    CRT, DOS;
+
+const
+     MAX_APE = 15;
+     RETARDO = 50; { NUMERO DEFINITIVO: 50? }
+     VERSION = '1.2.4';
+
+type
+    APELLIDO = string[MAX_APE];
+    DOCUMENTO = longint;
+    PERSONA = record
+                    ap: APELLIDO;
+                    dni: DOCUMENTO;
+              end;
+    HORA = record
+                 h,
+                 m,
+                 s,
+                 c: longint;
+           end;
+    TABLA = array[1..1000] of PERSONA;
+    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
+    TIPO_VOCAL = ( TV_AEIOU, TV_EI );
+    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
+
+(*********************************************************)
+
+ procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );
+
+    var
+       i: integer;
+
+    begin
+         for i:= 1 to tam do
+            begin
+                 writeln( ar, datos[i].ap );
+                 writeln( ar, datos[i].dni );
+                 writeln( ar );
+            end;
+    end;
+
+(*********************************************************)
+
+ procedure Retardar( centenas: longint );
+
+    var
+       i: integer;
+
+    begin
+         for i:= 1 to centenas * 100 do ;
+    end;
+
+(*********************************************************)
+(*********************************************************)
+
+ procedure MenuEvaluar( var datos: TABLA; var arch: text );
+
+    type
+        ORDEN = ( CRECIENTE, DECRECIENTE );
+        MEDICION = record
+                         Comp,
+                         Int,
+                         Tiem: longint;
+                   end;
+    var
+       bs, bsm, shs, rs, ss, is, sls, slsm, qs: MEDICION;
+
+    (*********************************************************)
+
+    procedure CrearInforme( ord: ORDEN );
+
+       (*********************************************************)
+
+       procedure InfMetodo( var info: text; metodo: string; sort: MEDICION );
+
+          begin
+               writeln( info );
+               writeln( info, metodo, ':' );
+               writeln( info, '             Comparaciones: ', sort.Comp: 1 );
+               writeln( info, '             Intercambios:  ', sort.Int div 3: 1, ' (', sort.Int: 1, ' asignaciones)' );
+               writeln( info, '             Tiempo (seg):  ', sort.Tiem / 100: 2: 2 );
+          end; { procedure InfMetodo }
+
+       (*********************************************************)
+
+       var { procedure CrearInforme }
+          info: text;
+
+       begin
+            assign( info, 'INFORME.TXT' );
+            rewrite( info );
+            writeln( info );
+            if ord = DECRECIENTE then
+              begin
+                   writeln( info, 'INFORME: Orden Decreciente.' );
+                   writeln( info, '=======  ~~~~~ ~~~~~~~~~~~' );
+              end
+            else
+              begin
+                   writeln( info, 'INFORME: Orden Creciente.' );
+                   writeln( info, '=======  ~~~~~ ~~~~~~~~~' );
+              end;
+            writeln( info );
+            InfMetodo( info, 'Bubble Sort:', bs );
+            InfMetodo( info, 'Bubble Sort Mejorado:', bsm );
+            InfMetodo( info, 'Shake Sort:', shs );
+            InfMetodo( info, 'Ripple Sort:', rs );
+            InfMetodo( info, 'Selection Sort:', ss );
+            InfMetodo( info, 'Insertion Sort:', is );
+            InfMetodo( info, 'Shell''s Sort:', sls );
+            InfMetodo( info, 'Shell''s Sort Mejorado:', slsm );
+            InfMetodo( info, 'Quick Sort:', qs );
+            writeln( info );
+            writeln( info );
+            writeln( info, 'NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de' );
+            writeln( info, '====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta' );
+            writeln( info, '      manera, un intercambio equivales a 3 asignaciones.' );
+            close( info );
+       end; { procedure CrearInforme }
+
+    (*********************************************************)
+
+    procedure NoExisteArch;
+
+       begin
+            clrscr;
+            gotoxy( 20, 10 );
+            textcolor( LightMagenta + Blink );
+            writeln( 'ERROR: No existe el archivo a evaluar!' );
+            textcolor( LightGray );
+            writeln;
+            writeln( '             Creelo seleccionando la opci¢n 1 del Men£ Principal.' );
+            delay( 4000 );
+       end; { procedure NoExisteArch }
+
+    (*********************************************************)
+
+    function ExisteArchivo( nombre: String ): boolean;
+                          { funcion extrido de la ayuda del pascal }
+       var
+          arch: text;
+
+       begin
+            {$I-}
+            Assign( arch, nombre );
+            FileMode := 0;  { Solo lectura }
+            Reset( arch );
+            Close( arch );
+            {$I+}
+            ExisteArchivo := (IOResult = 0) and (nombre <> '');
+       end; { function ExisteArchivo }
+
+    (*********************************************************)
+
+       procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );
+
+          var
+             i: integer;
+             void: string[2];
+
+          begin
+               for i:= 1 to tam do
+                  begin
+                       readln( ar, datos[i].ap );
+                       readln( ar, datos[i].dni );
+                       readln( ar, void );
+                  end;
+          end; { procedure CargarTabla }
+
+    (*********************************************************)
+
+    procedure Intercambiar( var a, b: PERSONA; var int: longint );
+
+       var
+          aux: PERSONA;
+
+       begin
+            int := int + 1;
+            Retardar( RETARDO );
+            aux := a;
+            int := int + 1;
+            Retardar( RETARDO );
+            a := b;
+            int := int + 1;
+            Retardar( RETARDO );
+            b := aux;
+       end; { procedure Intercambiar }
+
+    (*********************************************************)
+
+    procedure GetHora( var hor: HORA );
+
+       var
+          h, m, s, c: word;
+
+       begin
+            gettime( h, m, s, c );
+            hor.h := h;
+            hor.m := m;
+            hor.s := s;
+            hor.c := c;
+       end; { procedure GetHora }
+
+    (*********************************************************)
+
+    function GetTiempo( h1, h2: HORA ): longint;
+
+       var
+          t: longint;
+          aux: HORA;
+
+       begin
+            if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }
+              begin
+              if h1.h < h2.h then
+                begin
+                     aux := h1;
+                     h1 := h2;
+                     h2 := aux;
+                end
+              end
+            else if h1.m <> h2.m then
+                   begin
+                   if h1.m < h2.m then
+                     begin
+                          aux := h1;
+                          h1 := h2;
+                          h2 := aux;
+                     end
+                   end
+                 else if h1.s <> h2.s then
+                        begin
+                        if h1.s < h2.s then
+                          begin
+                               aux := h1;
+                               h1 := h2;
+                               h2 := aux;
+                          end
+                        end
+                      else if h1.c <> h2.c then
+                             if h1.c < h2.c then
+                               begin
+                                    aux := h1;
+                                    h1 := h2;
+                                    h2 := aux;
+                               end;
+            t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60  + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );
+            GetTiempo := t;
+       end; { function GetTiempo }
+
+    (*********************************************************)
+
+    procedure EvaluarCre( var datos: TABLA; var arch: text );
+
+       (*********************************************************)
+
+       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          var
+             i, j: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := tam - 1 downto 1 do
+               begin
+                    for j := tam - 1 downto 1 do
+                      begin
+                           m.Comp := m.Comp + 1;
+                           Retardar( RETARDO );
+                           if datos[j].ap > datos[j+1].ap then
+                             Intercambiar( datos[j], datos[j+1], m.Int);
+                      end;
+               end;
+             GetHora( h2 );
+             m.Tiem := GetTiempo( h1, h2 );
+        end; { procedure BubbleSort }
+
+       (*********************************************************)
+
+       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          var
+             huboint: boolean;
+             i, n: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               n := 1;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               huboint := true;
+               while huboint do
+                 begin
+                      huboint := false;
+                      for i := tam - 1 downto n do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[i].ap > datos[i+1].ap then
+                               begin
+                                    Intercambiar( datos[i], datos[i+1], m.Int);
+                                    huboint := true;
+                               end;
+                        end;
+                      n := n + 1;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure BubbleSortMej }
+
+       (*********************************************************)
+
+       procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, d, j, tmp: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               i := 2;
+               d := tam;
+               tmp := tam;
+               repeat
+                     for j := d downto i do
+                      begin
+                       m.Comp := m.Comp + 1;
+                       Retardar( RETARDO );
+                       if datos[j].ap < datos[j-1].ap then
+                         begin
+                              Intercambiar( datos[j], datos[j-1], m.Int );
+                              tmp := j;
+                         end;
+                      end;
+                     i := tmp + 1;
+                     for j := i to d do
+                      begin
+                       m.Comp := m.Comp + 1;
+                       Retardar( RETARDO );
+                       if datos[j].ap < datos[j-1].ap then
+                         begin
+                              Intercambiar( datos[j], datos[j-1], m.Int );
+                              tmp := j;
+                         end;
+                      end;
+                     d := tmp - 1;
+               until i >= d;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShakeSort }
+
+       (*********************************************************)
+
+       procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, j: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := 1 to tam do
+                 begin
+                      for j := i + 1 to tam do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[i].ap > datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure RippleSort }
+
+       (*********************************************************)
+
+       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             i, sel, n: integer;
+             hubosel: boolean;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for n := 1 to tam - 1 do
+                 begin
+                      hubosel := false;
+                      sel := n;
+                      for i := n + 1 to tam do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[sel].ap > datos[i].ap then
+                               begin
+                                    sel := i;
+                                    hubosel := true;
+                               end;
+                        end;
+                      if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure SelectionSort }
+
+       (*********************************************************)
+
+       procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, j, k: integer;
+             tmp: PERSONA;
+             terminar: boolean;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := 2 to tam do
+                 begin
+                      tmp := datos[i];
+                      j := i - 1;
+                      terminar := false;
+                      while ( j >= 1 ) and ( not terminar ) do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if ( tmp.ap < datos[j].ap ) then
+                               begin
+                                    m.Int := m.Int + 1;
+                                    Retardar( RETARDO );
+                                    datos[j+1] := datos[j];
+                                    j := j - 1;
+                               end
+                             else terminar := true;
+                        end;
+                      m.Int := m.Int + 1;
+                      Retardar( RETARDO );
+                      datos[j+1] := tmp;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure InsertionSort }
+
+       (*********************************************************)
+
+       procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             hueco, i, j: integer;
+             huboint: boolean;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               hueco := tam;
+               while hueco > 1 do
+                 begin
+                      hueco := hueco div 2;
+                      huboint := true;
+                      while huboint do
+                        begin
+                             huboint := false;
+                             for i := 1 to tam - hueco do
+                               begin
+                                    j := i + hueco;
+                                    m.Comp := m.Comp + 1;
+                                    Retardar( RETARDO );
+                                    if ( datos[i].ap > datos[j].ap ) then
+                                      begin
+                                           Intercambiar( datos[i], datos[j], m.Int );
+                                           huboint := true;
+                                      end;
+                               end;
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShellSort }
+
+       (*********************************************************)
+
+       procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          (*********************************************************)
+
+          procedure Shell( var datos: TABLA; hueco, i: integer; var comp, int: longint );
+             var
+                j: integer;
+
+             begin
+                  j := i + hueco;
+                  comp := comp + 1;
+                  Retardar( RETARDO );
+                  if ( datos[i].ap > datos[j].ap ) then
+                    begin
+                         Intercambiar( datos[i], datos[j], int );
+                         if (i - hueco) > 0 then
+                           Shell( datos, hueco, i - hueco, comp, int );
+                    end;
+             end; { procedure Shell }
+
+          (*********************************************************)
+
+          var { procedure ShellSortMej }
+             h1, h2: HORA;
+             hueco, i, j: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               hueco := tam;
+               while hueco > 1 do
+                 begin
+                      hueco := hueco div 2;
+                      for i := 1 to tam - hueco do
+                        begin
+                             j := i + hueco;
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if ( datos[i].ap > datos[j].ap ) then
+                               begin
+                                    Intercambiar( datos[i], datos[j], m.Int );
+                                    if (i - hueco) > 0 then
+                                      Shell( datos, hueco, i - hueco, m.Comp, m.Int );
+                               end;
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShellSortMej }
+
+       (*********************************************************)
+
+       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          (*********************************************************)
+
+          procedure QSort( var datos: TABLA; min, max: integer; var comp, int: longint );
+
+             var
+                i, j: integer;
+                sel: PERSONA;
+                flag: boolean;
+
+             begin
+                  sel := datos[( min + max ) div 2];
+                  i := min;
+                  j := max;
+                  repeat
+                        comp := comp + 1;
+                        Retardar( RETARDO );
+                        flag := false;
+                        while datos[i].ap < sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                                 Retardar( RETARDO );
+                                            end
+                                       else flag := true;
+                               i := i + 1;
+                          end;
+                        comp := comp + 1;
+                        Retardar( RETARDO );
+                        flag := false;
+                        while datos[j].ap > sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                                 Retardar( RETARDO );
+                                            end
+                                       else flag := true;
+                               j := j - 1;
+                          end;
+                        if i <= j then
+                          begin
+                               if i < j then Intercambiar( datos[i], datos[j], int );
+                               i := i + 1;
+                               j := j - 1;
+                          end;
+                  until i > j;
+                  if min < j then QSort( datos, min, j, comp, int);
+                  if i < max then QSort( datos, i, max, comp, int);
+             end; { procedure QSort }
+
+          (*********************************************************)
+
+          var
+             h1, h2: HORA;
+
+          begin { procedure QuickSort }
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               QSort( datos, 1, 1000, m.Comp, m.Int );
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+            {  rewrite( arch );
+               CargarArchivo( datos, arch, 1000 );
+               close( arch ); }
+          end; { procedure QuickSort }
+
+       (*********************************************************)
+
+       begin { procedure EvaluarCre }
+            if ExisteArchivo( 'DATOS.TXT' ) then
+              begin
+                   BubbleSort( arch, datos, 1000, bs );
+                   BubbleSortMej( arch, datos, 1000, bsm );
+                   ShakeSort( arch, datos, 1000, shs );
+                   RippleSort( arch, datos, 1000, rs );
+                   SelectionSort( arch, datos, 1000, ss );
+                   InsertionSort( arch, datos, 1000, is );
+                   ShellSort( arch, datos, 1000, sls );
+                   ShellSortMej( arch, datos, 1000, slsm );
+                   QuickSort( arch, datos, 1000, qs );
+                   CrearInforme( CRECIENTE );
+             end
+            else
+            NoExisteArch;
+       end;  { procedure EvaluarCre }
+
+    (*********************************************************)
+
+    procedure EvaluarDec( var datos: TABLA; var arch: text );
+
+       (*********************************************************)
+
+       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          var
+             i, j: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := tam - 1 downto 1 do
+               begin
+                    for j := tam - 1 downto 1 do
+                      begin
+                           m.Comp := m.Comp + 1;
+                           Retardar( RETARDO );
+                           if datos[j].ap < datos[j+1].ap then
+                             Intercambiar( datos[j], datos[j+1], m.Int);
+                      end;
+               end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+        end; { procedure BubbleSort }
+
+       (*********************************************************)
+
+       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          var
+             huboint: boolean;
+             i, n: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               n := 1;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               huboint := true;
+               while huboint do
+                 begin
+                      huboint := false;
+                      for i := tam - 1 downto n do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[i].ap < datos[i+1].ap then
+                               begin
+                                    Intercambiar( datos[i], datos[i+1], m.Int);
+                                    huboint := true;
+                               end;
+                        end;
+                      n := n + 1;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure BubbleSortMej }
+
+       (*********************************************************)
+
+       procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, d, j, tmp: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               i := 2;
+               d := tam;
+               tmp := tam;
+               repeat
+                     for j := d downto i do
+                      begin
+                       m.Comp := m.Comp + 1;
+                       Retardar( RETARDO );
+                       if datos[j].ap > datos[j-1].ap then
+                         begin
+                              Intercambiar( datos[j], datos[j-1], m.Int );
+                              tmp := j;
+                         end;
+                      end;
+                     i := tmp + 1;
+                     for j := i to d do
+                      begin
+                       m.Comp := m.Comp + 1;
+                       Retardar( RETARDO );
+                       if datos[j].ap > datos[j-1].ap then
+                         begin
+                              Intercambiar( datos[j], datos[j-1], m.Int );
+                              tmp := j;
+                         end;
+                      end;
+                     d := tmp - 1;
+               until i >= d;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShakeSort }
+
+       (*********************************************************)
+
+       procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, j: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := 1 to tam do
+                 begin
+                      for j := i + 1 to tam do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[i].ap < datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure RippleSort }
+
+       (*********************************************************)
+
+       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             i, sel, n: integer;
+             hubosel: boolean;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for n := 1 to tam - 1 do
+                 begin
+                      hubosel := false;
+                      sel := n;
+                      for i := n + 1 to tam do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[sel].ap < datos[i].ap then
+                               begin
+                                    sel := i;
+                                    hubosel := true;
+                               end;
+                        end;
+                      if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure SelectionSort }
+
+       (*********************************************************)
+
+       procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, j, k: integer;
+             tmp: PERSONA;
+             terminar: boolean;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := 2 to tam do
+                 begin
+                      tmp := datos[i];
+                      j := i - 1;
+                      terminar := false;
+                      while ( j >= 1 ) and ( not terminar ) do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if ( tmp.ap > datos[j].ap ) then
+                               begin
+                                    m.Int := m.Int + 1;
+                                    Retardar( RETARDO );
+                                    datos[j+1] := datos[j];
+                                    j := j - 1;
+                               end
+                             else terminar := true;
+                        end;
+                      m.Int := m.Int + 1;
+                      Retardar( RETARDO );
+                      datos[j+1] := tmp;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure InsertionSort }
+
+       (*********************************************************)
+
+       procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             hueco, i, j: integer;
+             huboint: boolean;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               hueco := tam;
+               while hueco > 1 do
+                 begin
+                      hueco := hueco div 2;
+                      huboint := true;
+                      while huboint do
+                        begin
+                             huboint := false;
+                             for i := 1 to tam - hueco do
+                               begin
+                                    j := i + hueco;
+                                    m.Comp := m.Comp + 1;
+                                    Retardar( RETARDO );
+                                    if ( datos[i].ap < datos[j].ap ) then
+                                      begin
+                                           Intercambiar( datos[i], datos[j], m.Int );
+                                           huboint := true;
+                                      end;
+                               end;
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShellSort }
+
+       (*********************************************************)
+
+       procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          (*********************************************************)
+
+          procedure Shell( var datos: TABLA; hueco, i: integer;
+                           var comp: longint; var int: longint );
+             var
+                j: integer;
+
+             begin
+                  j := i + hueco;
+                  comp := comp + 1;
+                  Retardar( RETARDO );
+                  if ( datos[i].ap < datos[j].ap ) then
+                    begin
+                         Intercambiar( datos[i], datos[j], int );
+                         if (i - hueco) > 0 then
+                           Shell( datos, hueco, i - hueco, comp, int );
+                    end;
+             end; { procedure Shell }
+
+          (*********************************************************)
+
+          var { procedure ShellSortMej }
+             h1, h2: HORA;
+             hueco, i, j: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               hueco := tam;
+               while hueco > 1 do
+                 begin
+                      hueco := hueco div 2;
+                      for i := 1 to tam - hueco do
+                        begin
+                             j := i + hueco;
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if ( datos[i].ap < datos[j].ap ) then
+                               begin
+                                    Intercambiar( datos[i], datos[j], m.Int );
+                                    if (i - hueco) > 0 then
+                                      Shell( datos, hueco, i - hueco, m.Comp, m.Int );
+                               end;
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShellSortMej }
+
+       (*********************************************************)
+
+       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          procedure QSort( var datos: TABLA; min, max: integer;
+                           var comp: longint; var int: longint );
+
+             var
+                i, j: integer;
+                sel: PERSONA;
+                flag: boolean;
+
+             begin
+                  sel := datos[( min + max ) div 2];
+                  i := min;
+                  j := max;
+                  repeat
+                        comp := comp + 1;
+                        Retardar( RETARDO );
+                        flag := false;
+                        while datos[i].ap > sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                                 Retardar( RETARDO );
+                                            end
+                                       else flag := true;
+                               i := i + 1;
+                          end;
+                        comp := comp + 1;
+                        Retardar( RETARDO );
+                        flag := false;
+                        while datos[j].ap < sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                                 Retardar( RETARDO );
+                                            end
+                                       else flag := true;
+                               j := j - 1;
+                          end;
+                        if i <= j then
+                          begin
+                               if i < j then Intercambiar( datos[i], datos[j], int );
+                               i := i + 1;
+                               j := j - 1;
+                          end;
+                  until i > j;
+                  if min < j then QSort( datos, min, j, comp, int);
+                  if i < max then QSort( datos, i, max, comp, int);
+             end; { procedure QSort }
+
+          (*********************************************************)
+
+          var
+             h1, h2: HORA;
+
+          begin { procedure QuickSort }
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               QSort( datos, 1, 1000, m.Comp, m.Int );
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure QuickSort }
+
+       (*********************************************************)
+
+       begin { procedure EvaluarDec }
+            if ExisteArchivo( 'DATOS.TXT' ) then
+              begin
+                   BubbleSort( arch, datos, 1000, bs );
+                   BubbleSortMej( arch, datos, 1000, bsm );
+                   ShakeSort( arch, datos, 1000, shs );
+                   RippleSort( arch, datos, 1000, rs );
+                   SelectionSort( arch, datos, 1000, ss );
+                   InsertionSort( arch, datos, 1000, is );
+                   ShellSort( arch, datos, 1000, sls );
+                   ShellSortMej( arch, datos, 1000, slsm );
+                   QuickSort( arch, datos, 1000, qs );
+                   CrearInforme( DECRECIENTE );
+             end
+            else
+            NoExisteArch;
+       end;  { procedure EvaluarDec }
+
+    (*********************************************************)
+
+    var { procedure MenuEvaluar }
+       tecla: char;
+
+    begin
+         clrscr;
+         textcolor( Yellow );
+         gotoxy( 19, 3 );
+         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+         gotoxy( 19, 4 );
+         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+         textcolor( LightCyan );
+         gotoxy( 1, 7 );
+         writeln( '  Evaluar Algoritmos:' );
+         writeln( '  ------- ----------' );
+         textcolor( LightGray );
+         writeln;
+         writeln;
+         writeln( '     1.- Ordenando en forma creciente.' );
+         writeln( '     2.- Ordenando en forma decreciente.' );
+         writeln( '     0.- Men£ Anterior.' );
+         gotoxy( 1, 20 );
+         textcolor( White );
+         write( '  Ingrese su opci¢n: ' );
+         textcolor( Yellow );
+         tecla := readkey;
+         while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
+           begin
+                textcolor( White );
+                gotoxy( 1, 20 );
+                write( '  Ingrese su opci¢n (1, 2 o 0): ' );
+                textcolor( Yellow );
+                tecla := readkey;
+           end;
+         case tecla of
+            '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )
+                                                 else NoExisteArch;
+            '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )
+                                                 else NoExisteArch;
+            '0': ;
+         end;
+    end;
+
+(*********************************************************)
+(*********************************************************)
+
+ procedure MenuGenerar( var arch: text );
+
+    (*********************************************************)
+
+    function GetRNDApellido( max, min: integer ): APELLIDO;
+
+       (*********************************************************)
+
+       function GetVocal( tipo: TIPO_VOCAL ): char;
+
+         var
+            valor: integer;
+
+         begin
+              if tipo = TV_AEIOU then valor := random( 16 )
+                                 else valor := random( 6 ) + 5;
+              case valor of
+                  0..4: GetVocal := 'A';
+                  5..7: GetVocal := 'E';
+                  8..10: GetVocal := 'I';
+                 11..13: GetVocal := 'O';
+                 14..15: GetVocal := 'U';
+              end;
+         end; { function GetVocal }
+
+       (*********************************************************)
+
+       procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
+
+         var
+            valor: integer;
+
+          begin
+              case indic of
+                  I_ESQ:
+                        begin
+                             vocal := 'U';
+                             indic := I_ESQU;
+                             proxl := TL_VOCAL;
+                        end;
+                  I_ESQU:
+                         begin
+                              vocal := GetVocal( TV_EI );
+                              indic := I_NADA;
+                              proxl := TL_CONSO;
+                         end;
+                  else
+                    begin
+                         vocal := GetVocal( TV_AEIOU );
+                         indic := I_NADA;
+                         if random( 40 ) = 0 then proxl := TL_VOCAL
+                                             else proxl := TL_CONSO;
+                    end;
+                  end;
+          end; { procedure GetRNDVocal }
+
+       (*********************************************************)
+
+       procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
+
+          var
+             valor: integer;
+
+          begin
+               proxl := TL_VOCAL;
+               indic := I_NADA;
+
+               case indic of
+                  I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
+                  I_ESB: case random( 2 ) of
+                             0: conso := 'R';
+                             1: conso := 'L';
+                         end;
+                  I_ESC: case random( 4 ) of
+                             0: conso := 'C';
+                             1: conso := 'H';
+                             2: conso := 'R';
+                             3: conso := 'L';
+                         end;
+                  I_ESL: case random( 6 ) of
+                             0: conso := 'T';
+                             1..5: conso := 'L';
+                         end;
+                  I_ESM: case random( 3 ) of
+                             0: conso := 'P';
+                             1: conso := 'B';
+                             2: conso := 'L';
+                         end;
+                  I_ESN: case random( 3 ) of
+                             0: conso := 'R';
+                             1: conso := 'V';
+                             2: conso := 'C';
+                         end;
+                  else case random( 55 ) of
+                           0..3: begin
+                                      conso := 'B';
+                                      if random( 10 ) = 0 then begin
+                                                                    indic := I_ESB;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                 end;
+                           4..7: begin
+                                      conso := 'C';
+                                      if random( 5 ) = 0 then begin
+                                                                    indic := I_ESC;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                 end;
+                           8..11: conso := 'D';
+                           12..14: begin
+                                      conso := 'F';
+                                      if random( 10 ) = 0 then begin
+                                                                    indic := I_ESF;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                   end;
+                           15..17: begin
+                                        conso := 'G';
+                                        if random( 5 ) = 0 then
+                                        begin
+                                             indic := I_ESG;
+                                             if random( 4 ) = 0 then proxl := TL_CONSO;
+                                        end;
+                                   end;
+                           18..19: conso := 'H';
+                           20..22: conso := 'J';
+                           23..24: conso := 'K';
+                           25..27: begin
+                                        conso := 'L';
+                                        if random( 15 ) = 0 then
+                                          begin
+                                               indic := I_ESL;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           28..30: begin
+                                        conso := 'M';
+                                        if random( 5 ) = 0 then
+                                          begin
+                                               indic := I_ESM;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           31..33: begin
+                                        conso := 'N';
+                                        if random( 5 ) = 0 then
+                                          begin
+                                               indic := I_ESN;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           34..36: conso := 'P';
+                           37..38: begin
+                                        conso := 'Q';
+                                        indic := I_ESQ;
+                                   end;
+                           39..41: begin
+                                        conso := 'R';
+                                        if random( 3 ) = 0 then
+                                          begin
+                                               indic := I_ESR;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           42..44: conso := 'S';
+                           45..47: begin
+                                        conso := 'T';
+                                        if random( 10 ) = 0 then
+                                          begin
+                                               indic := I_EST;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           48..50: conso := 'V';
+                           51: conso := 'W';
+                           52: conso := 'X';
+                           53: conso := 'Y';
+                           54: conso := 'Z';
+                         end; { case random( 55 ) of }
+
+                end; { case indic of }
+           end; { procedure GetRNDConsonante }
+
+       (*********************************************************)
+
+       var { function GetRNDApellido }
+          tam, i: integer;
+          aux: char;
+          apel: APELLIDO;
+          indic: INDICADOR;
+          proxl: TIPO_LETRA;
+
+       begin
+            if max > MAX_APE then max := MAX_APE;
+            tam := random( max + 1 ) + min;
+            indic := I_NADA;
+            apel := '';
+            if random( 5 ) = 0 then proxl := TL_VOCAL
+                               else proxl := TL_CONSO;
+            for i := 1 to tam do
+              begin
+                   if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
+                                       else GetRNDVocal( indic, proxl, aux );
+                   apel := apel + aux;
+              end;
+            GetRNDApellido := apel;
+       end; { function GetRNDApellido }
+
+    (*********************************************************)
+
+    function GetRNDLetra( min, max: char ): char;
+
+       begin
+            GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
+       end;
+
+    (*********************************************************)
+
+    procedure GetOrdApellidos( var ar: text; cant: integer );
+
+       var
+           mil: boolean;
+           letra, letra1: char;
+           i, j, veces: integer;
+           dni: DOCUMENTO;
+           ap, ape, apel: APELLIDO;
+
+       begin
+            mil := false;
+            if cant = 1000 then mil := true;
+            dni := 10000000 + (random( 15000 ) * 100);
+            ap := '';
+            ape := '';
+            apel := '';
+            for letra := 'A' to 'Z' do
+              begin
+                   ap := letra;
+                   for letra1 := 'A' to 'Z' do
+                      begin
+                           if mil then
+                              case letra of
+                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
+                                        case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end
+                           else
+                              case letra of
+                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
+                                        case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end;
+                           ape := ap + letra1;
+                           for j := 1 to veces do
+                               begin
+                                    if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
+                                             else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
+                                    dni := dni + random( 50000 ) + 1;
+                                    writeln( ar, apel );
+                                    writeln( ar, dni );
+                                    writeln( ar );
+                                    apel := '';
+                               end;
+
+                           ape := '';
+
+                      end; { for letra1 := 'A' to 'Z' do }
+
+                   ap := '';
+
+              end; { for letra := 'A' to 'Z' do }
+
+       end; { procedure GetOrdApellidos }
+
+    (*********************************************************)
+
+    procedure GetInvOrdApellidos( var ar: text; cant: integer );
+
+       var
+          mil: boolean;
+          letra, letra1: char;
+          i, j, veces: integer;
+          dni: DOCUMENTO;
+          ap, ape, apel: APELLIDO;
+
+       begin
+            mil := false;
+            if cant = 1000 then mil := true;
+            dni := 34000000 + (random( 15000 ) * 100);
+            ap := '';
+            ape := '';
+            apel := '';
+            for letra := 'Z' downto 'A' do
+              begin
+                   ap := letra;
+                   for letra1 := 'Z' downto 'A' do
+                      begin
+                           if mil then
+                              case letra of
+                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
+                                        case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end
+                           else
+                              case letra of
+                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
+                                        case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end;
+                           ape := ap + letra1;
+                           for j := 1 to veces do
+                               begin
+                                    if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
+                                              else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
+                                    dni := dni - random( 40000 ) - 1;
+                                    writeln( ar, apel );
+                                    writeln( ar, dni );
+                                    writeln( ar );
+                                    apel := '';
+                               end;
+
+                           ape := '';
+
+                      end; { for letra1 := 'A' to 'Z' do }
+
+                   ap := '';
+
+              end; { for letra := 'A' to 'Z' do }
+
+       end; { GetInvOrdApellidos }
+
+
+    (*********************************************************)
+
+    procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );
+
+       var
+          i: integer;
+          ap: APELLIDO;
+          dni: DOCUMENTO;
+
+       begin
+            if reabrir then rewrite( arch );
+            dni := 10000000 + (random( 15000 ) * 100);
+
+            for i := 1 to n do
+                begin
+                     ap := GetRNDApellido( 8, 4 );
+                     dni := dni + random( 50000 ) + 1;
+                     writeln( arch, ap );
+                     writeln( arch, dni );
+                     writeln( arch );
+                end;
+            if reabrir then close( arch );
+       end; { procedure GenerarRND }
+
+    (*********************************************************)
+
+    procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );
+
+       begin
+            if reabrir then rewrite( arch );
+            GetOrdApellidos( arch, n );
+            if reabrir then close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );
+
+       begin
+            if reabrir then rewrite( arch );
+            GetInvOrdApellidos( arch, n );
+            if reabrir then close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure Generar90Ord( var arch: text );
+
+       begin
+            rewrite( arch );
+            GenerarOrd( arch, 900, false );
+            GenerarRND( arch, 100, false );
+            close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure Generar90OrdDec( var arch: text );
+
+       begin
+            rewrite( arch );
+            GenerarOrdDec( arch, 900, false );
+            GenerarRND( arch, 100, false );
+            close( arch );
+       end;
+
+    (*********************************************************)
+
+    var { procedure MenuGenerar }
+       tecla: char;
+
+    begin
+         clrscr;
+         textcolor( Yellow );
+         gotoxy( 19, 3 );
+         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+         gotoxy( 19, 4 );
+         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+         textcolor( LightCyan );
+         gotoxy( 1, 7 );
+         writeln( '  Generar Archivo (''DATOS.TXT''):' );
+         writeln( '  ------- ------- -------------' );
+         textcolor( LightGray );
+         writeln;
+         writeln;
+         writeln( '     1.- Con datos desordenados.' );
+         writeln( '     2.- Con datos en orden creciente (APELLIDO, DNI).' );
+         writeln( '     3.- Con datos en orden decreciente (APELLIDO, DNI).' );
+         writeln( '     4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );
+         writeln( '     5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );
+         writeln( '     0.- Men£ Anterior.' );
+         gotoxy( 1, 20 );
+         textcolor( White );
+         write( '  Ingrese su opci¢n: ' );
+         textcolor( Yellow );
+         tecla := readkey;
+         while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do
+           begin
+                textcolor( White );
+                gotoxy( 1, 20 );
+                write( '  Ingrese su opci¢n (1 a 5 o 0): ' );
+                textcolor( Yellow );
+                tecla := readkey;
+           end;
+         case tecla of
+            '1': GenerarRND( arch, 1000, true );
+            '2': GenerarOrd( arch, 1000, true );
+            '3': GenerarOrdDec( arch, 1000, true );
+            '4': Generar90Ord( arch );
+            '5': Generar90OrdDec( arch );
+            '0': ;
+         end;
+    end; { procedure MenuGenerar }
+
+(*********************************************************)
+
+ procedure PantallaSalida;
+
+    begin
+         writeln;
+         NormVideo;
+         clrscr;
+         writeln;
+         textcolor( white );
+         writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n ', VERSION, ' <-o-o-> Luca - Soft' );
+         NormVideo;
+         writeln( '  Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );
+         writeln( '  Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );
+         writeln;
+         textcolor( LightMagenta );
+         write( '                lluca@cnba.uba.ar' );
+         NormVideo;
+         write( '   o   ' );
+         textcolor( LightMagenta );
+         writeln( 'lluca@geocities.com' );
+         NormVideo;
+         writeln;
+         writeln( '  (c) 1999 - Todos los derechos reservados.' );
+         delay( 750 );
+    end;
+
+(*********************************************************)
+
+var { programa }
+    datos: TABLA;
+    arch: text;
+    tecla: char;
+    salir: boolean;
+
+begin
+     randomize;
+     assign( arch, 'DATOS.TXT' );
+     salir := false;
+     textbackground( Blue );
+
+     while not salir do
+       begin
+            clrscr;
+            textcolor( Yellow );
+            gotoxy( 19, 3 );
+            writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+            gotoxy( 19, 4 );
+            writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+            gotoxy( 1, 7 );
+            textcolor( LightCyan );
+            writeln( '  Men£ Principal:' );
+            writeln( '  ---- ---------' );
+            textcolor( LightGray );
+            writeln;
+            writeln;
+            writeln( '     1.- Generar Archivo (''DATOS.TXT'').' );
+            writeln( '     2.- Evaluar Algoritmos.' );
+            writeln( '     0.- Salir.' );
+            gotoxy( 1, 20 );
+            textcolor( White );
+            write( '  Ingrese su opci¢n: ' );
+            textcolor( Yellow );
+            tecla := readkey;
+            while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
+              begin
+                   textcolor( White );
+                   gotoxy( 1, 20 );
+                   write( '  Ingrese su opci¢n (1, 2 o 0): ' );
+                   textcolor( Yellow );
+                   tecla := readkey;
+              end;
+            case tecla of
+                 '1': MenuGenerar( arch );
+                 '2': MenuEvaluar( datos, arch );
+                 '0': salir := true;
+            end;
+       end;
+     PantallaSalida;
 end.
\ No newline at end of file
 end.
\ No newline at end of file
index e69bd46302e79fef75fec3b5f481b7e78a68d08f..887e92da4648424791f1ee12b311fffe710dcced 100644 (file)
-program Comparacion_De_Algoritmos_De_Ordenamiento;\r
-\r
-uses\r
-    CRT, DOS;\r
-\r
-const\r
-     MAX_APE = 15;\r
-     RETARDO = 50;\r
-     VERSION = '1.2.8';\r
-\r
-type\r
-    APELLIDO = string[MAX_APE];\r
-    DOCUMENTO = longint;\r
-    PERSONA = record\r
-                    ap: APELLIDO;\r
-                    dni: DOCUMENTO;\r
-              end;\r
-    TABLA = array[1..1000] of PERSONA;\r
-\r
-(*********************************************************)\r
-\r
- procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );\r
-\r
-    var\r
-       i: integer;\r
-\r
-    begin\r
-         for i:= 1 to tam do\r
-            begin\r
-                 writeln( ar, datos[i].ap );\r
-                 writeln( ar, datos[i].dni );\r
-                 writeln( ar );\r
-            end;\r
-    end; { procedure CargarArchivo }\r
-\r
-(*********************************************************)\r
-\r
- procedure Retardar( centenas: longint );\r
-\r
-    var\r
-       i: integer;\r
-\r
-    begin\r
-         for i:= 1 to centenas * 100 do ;\r
-    end; { procedure Retardar }\r
-\r
-(*********************************************************)\r
-(*********************************************************)\r
-\r
- procedure MenuEvaluar( var datos: TABLA; var arch: text );\r
-\r
-    type\r
-        HORA = record\r
-                     h,\r
-                     m,\r
-                     s,\r
-                     c: longint;\r
-               end;\r
-        ORDEN = ( CRECIENTE, DECRECIENTE );\r
-        MEDICION = record\r
-                         Comp,\r
-                         Int,\r
-                         Tiem: longint;\r
-                   end;\r
-    var\r
-       bs, bsm, shs, rs, ss, is, sls, slsm, qs: MEDICION;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure CrearInforme( ord: ORDEN );\r
-\r
-       (*********************************************************)\r
-\r
-       procedure InfMetodo( var info: text; metodo: string; sort: MEDICION );\r
-\r
-          begin\r
-               writeln( info );\r
-               writeln( info, metodo, ':' );\r
-               writeln( info, '             Comparaciones: ', sort.Comp: 1 );\r
-               writeln( info, '             Intercambios:  ', sort.Int div 3: 1, ' (', sort.Int: 1, ' asignaciones)' );\r
-               writeln( info, '             Tiempo (seg):  ', sort.Tiem / 100: 2: 2 );\r
-          end; { procedure InfMetodo }\r
-\r
-       (*********************************************************)\r
-\r
-       var { procedure CrearInforme }\r
-          info: text;\r
-\r
-       begin\r
-            assign( info, 'INFORME.TXT' );\r
-            rewrite( info );\r
-            writeln( info );\r
-            if ord = DECRECIENTE then\r
-              begin\r
-                   writeln( info, 'INFORME: Orden Decreciente.' );\r
-                   writeln( info, '=======  ~~~~~ ~~~~~~~~~~~' );\r
-              end\r
-            else\r
-              begin\r
-                   writeln( info, 'INFORME: Orden Creciente.' );\r
-                   writeln( info, '=======  ~~~~~ ~~~~~~~~~' );\r
-              end;\r
-            writeln( info );\r
-            InfMetodo( info, 'Bubble Sort', bs );\r
-            InfMetodo( info, 'Bubble Sort Mejorado', bsm );\r
-            InfMetodo( info, 'Shake Sort', shs );\r
-            InfMetodo( info, 'Ripple Sort', rs );\r
-            InfMetodo( info, 'Selection Sort', ss );\r
-            InfMetodo( info, 'Insertion Sort', is );\r
-            InfMetodo( info, 'Shell''s Sort', sls );\r
-            InfMetodo( info, 'Shell''s Sort Mejorado', slsm );\r
-            InfMetodo( info, 'Quick Sort', qs );\r
-            writeln( info );\r
-            writeln( info );\r
-            writeln( info, 'NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de' );\r
-            writeln( info, '====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta' );\r
-            writeln( info, '      manera, un intercambio equivales a 3 asignaciones.' );\r
-            close( info );\r
-       end; { procedure CrearInforme }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure NoExisteArch;\r
-\r
-       begin\r
-            clrscr;\r
-            gotoxy( 20, 10 );\r
-            textcolor( LightMagenta + Blink );\r
-            writeln( 'ERROR: No existe el archivo a evaluar!' );\r
-            textcolor( LightGray );\r
-            writeln;\r
-            writeln( '             Creelo seleccionando la opci¢n 1 del Men£ Principal.' );\r
-            delay( 4000 );\r
-       end; { procedure NoExisteArch }\r
-\r
-    (*********************************************************)\r
-\r
-    function ExisteArchivo( nombre: String ): boolean;\r
-\r
-    { funcion extrida de la ayuda del Turbo Pascal 7 }\r
-\r
-       var\r
-          arch: text;\r
-\r
-       begin\r
-            {$I-}\r
-            Assign( arch, nombre );\r
-            FileMode := 0;  { Solo lectura }\r
-            Reset( arch );\r
-            Close( arch );\r
-            {$I+}\r
-            ExisteArchivo := (IOResult = 0) and (nombre <> '');\r
-       end; { function ExisteArchivo }\r
-\r
-    (*********************************************************)\r
-\r
-       procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );\r
-\r
-          var\r
-             i: integer;\r
-             void: string[2];\r
-\r
-          begin\r
-               for i:= 1 to tam do\r
-                  begin\r
-                       readln( ar, datos[i].ap );\r
-                       readln( ar, datos[i].dni );\r
-                       readln( ar, void );\r
-                  end;\r
-          end; { procedure CargarTabla }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Intercambiar( var a, b: PERSONA; var int: longint );\r
-\r
-       var\r
-          aux: PERSONA;\r
-\r
-       begin\r
-            int := int + 1;\r
-            Retardar( RETARDO );\r
-            aux := a;\r
-            int := int + 1;\r
-            Retardar( RETARDO );\r
-            a := b;\r
-            int := int + 1;\r
-            Retardar( RETARDO );\r
-            b := aux;\r
-       end; { procedure Intercambiar }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetHora( var hor: HORA );\r
-\r
-       var\r
-          h, m, s, c: word;\r
-\r
-       begin\r
-            gettime( h, m, s, c );\r
-            hor.h := h;\r
-            hor.m := m;\r
-            hor.s := s;\r
-            hor.c := c;\r
-       end; { procedure GetHora }\r
-\r
-    (*********************************************************)\r
-\r
-    function GetTiempo( h1, h2: HORA ): longint;\r
-\r
-       var\r
-          t: longint;\r
-          aux: HORA;\r
-\r
-       begin\r
-            if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }\r
-              begin\r
-              if h1.h < h2.h then\r
-                begin\r
-                     aux := h1;\r
-                     h1 := h2;\r
-                     h2 := aux;\r
-                end\r
-              end\r
-            else if h1.m <> h2.m then\r
-                   begin\r
-                   if h1.m < h2.m then\r
-                     begin\r
-                          aux := h1;\r
-                          h1 := h2;\r
-                          h2 := aux;\r
-                     end\r
-                   end\r
-                 else if h1.s <> h2.s then\r
-                        begin\r
-                        if h1.s < h2.s then\r
-                          begin\r
-                               aux := h1;\r
-                               h1 := h2;\r
-                               h2 := aux;\r
-                          end\r
-                        end\r
-                      else if h1.c <> h2.c then\r
-                             if h1.c < h2.c then\r
-                               begin\r
-                                    aux := h1;\r
-                                    h1 := h2;\r
-                                    h2 := aux;\r
-                               end;\r
-            t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60  + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );\r
-            GetTiempo := t;\r
-       end; { function GetTiempo }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure EvaluarCre( var datos: TABLA; var arch: text );\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          var\r
-             i, j: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := tam - 1 downto 1 do\r
-               begin\r
-                    for j := tam - 1 downto 1 do\r
-                      begin\r
-                           m.Comp := m.Comp + 1;\r
-                           Retardar( RETARDO );\r
-                           if datos[j].ap > datos[j+1].ap then\r
-                             Intercambiar( datos[j], datos[j+1], m.Int);\r
-                      end;\r
-               end;\r
-             GetHora( h2 );\r
-             m.Tiem := GetTiempo( h1, h2 );\r
-        end; { procedure BubbleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          var\r
-             huboint: boolean;\r
-             i, n: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               n := 1;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               huboint := true;\r
-               while huboint do\r
-                 begin\r
-                      huboint := false;\r
-                      for i := tam - 1 downto n do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[i].ap > datos[i+1].ap then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[i+1], m.Int);\r
-                                    huboint := true;\r
-                               end;\r
-                        end;\r
-                      n := n + 1;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure BubbleSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, d, j, tmp: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               i := 2;\r
-               d := tam;\r
-               tmp := tam;\r
-               repeat\r
-                     for j := d downto i do\r
-                      begin\r
-                       m.Comp := m.Comp + 1;\r
-                       Retardar( RETARDO );\r
-                       if datos[j].ap < datos[j-1].ap then\r
-                         begin\r
-                              Intercambiar( datos[j], datos[j-1], m.Int );\r
-                              tmp := j;\r
-                         end;\r
-                      end;\r
-                     i := tmp + 1;\r
-                     for j := i to d do\r
-                      begin\r
-                       m.Comp := m.Comp + 1;\r
-                       Retardar( RETARDO );\r
-                       if datos[j].ap < datos[j-1].ap then\r
-                         begin\r
-                              Intercambiar( datos[j], datos[j-1], m.Int );\r
-                              tmp := j;\r
-                         end;\r
-                      end;\r
-                     d := tmp - 1;\r
-               until i >= d;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShakeSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, j: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := 1 to tam do\r
-                 begin\r
-                      for j := i + 1 to tam do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[i].ap > datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure RippleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             i, sel, n: integer;\r
-             hubosel: boolean;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for n := 1 to tam - 1 do\r
-                 begin\r
-                      hubosel := false;\r
-                      sel := n;\r
-                      for i := n + 1 to tam do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[sel].ap > datos[i].ap then\r
-                               begin\r
-                                    sel := i;\r
-                                    hubosel := true;\r
-                               end;\r
-                        end;\r
-                      if hubosel then Intercambiar( datos[n], datos[sel], m.Int);\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure SelectionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, j, k: integer;\r
-             tmp: PERSONA;\r
-             terminar: boolean;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := 2 to tam do\r
-                 begin\r
-                      m.Int := m.Int + 1;\r
-                      Retardar( RETARDO );\r
-                      tmp := datos[i];\r
-                      j := i - 1;\r
-                      terminar := false;\r
-                      while ( j >= 1 ) and ( not terminar ) do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if ( tmp.ap < datos[j].ap ) then\r
-                               begin\r
-                                    m.Int := m.Int + 1;\r
-                                    Retardar( RETARDO );\r
-                                    datos[j+1] := datos[j];\r
-                                    j := j - 1;\r
-                               end\r
-                             else terminar := true;\r
-                        end;\r
-                      m.Int := m.Int + 1;\r
-                      Retardar( RETARDO );\r
-                      datos[j+1] := tmp;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure InsertionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             hueco, i, j: integer;\r
-             huboint: boolean;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               hueco := tam;\r
-               while hueco > 1 do\r
-                 begin\r
-                      hueco := hueco div 2;\r
-                      huboint := true;\r
-                      while huboint do\r
-                        begin\r
-                             huboint := false;\r
-                             for i := 1 to tam - hueco do\r
-                               begin\r
-                                    j := i + hueco;\r
-                                    m.Comp := m.Comp + 1;\r
-                                    Retardar( RETARDO );\r
-                                    if ( datos[i].ap > datos[j].ap ) then\r
-                                      begin\r
-                                           Intercambiar( datos[i], datos[j], m.Int );\r
-                                           huboint := true;\r
-                                      end;\r
-                               end;\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShellSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          (*********************************************************)\r
-\r
-          procedure Shell( var datos: TABLA; hueco, i: integer; var comp, int: longint );\r
-             var\r
-                j: integer;\r
-\r
-             begin\r
-                  j := i + hueco;\r
-                  comp := comp + 1;\r
-                  Retardar( RETARDO );\r
-                  if ( datos[i].ap > datos[j].ap ) then\r
-                    begin\r
-                         Intercambiar( datos[i], datos[j], int );\r
-                         if (i - hueco) > 0 then\r
-                           Shell( datos, hueco, i - hueco, comp, int );\r
-                    end;\r
-             end; { procedure Shell }\r
-\r
-          (*********************************************************)\r
-\r
-          var { procedure ShellSortMej }\r
-             h1, h2: HORA;\r
-             hueco, i, j: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               hueco := tam;\r
-               while hueco > 1 do\r
-                 begin\r
-                      hueco := hueco div 2;\r
-                      for i := 1 to tam - hueco do\r
-                        begin\r
-                             j := i + hueco;\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if ( datos[i].ap > datos[j].ap ) then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[j], m.Int );\r
-                                    if (i - hueco) > 0 then\r
-                                      Shell( datos, hueco, i - hueco, m.Comp, m.Int );\r
-                               end;\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShellSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          (*********************************************************)\r
-\r
-          procedure QSort( var datos: TABLA; min, max: integer; var comp, int: longint );\r
-\r
-             var\r
-                i, j: integer;\r
-                sel: PERSONA;\r
-                flag: boolean;\r
-\r
-             begin\r
-                  sel := datos[( min + max ) div 2];\r
-                  i := min;\r
-                  j := max;\r
-                  repeat\r
-                        comp := comp + 1;\r
-                        Retardar( RETARDO );\r
-                        flag := false;\r
-                        while datos[i].ap < sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                                 Retardar( RETARDO );\r
-                                            end\r
-                                       else flag := true;\r
-                               i := i + 1;\r
-                          end;\r
-                        comp := comp + 1;\r
-                        Retardar( RETARDO );\r
-                        flag := false;\r
-                        while datos[j].ap > sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                                 Retardar( RETARDO );\r
-                                            end\r
-                                       else flag := true;\r
-                               j := j - 1;\r
-                          end;\r
-                        if i <= j then\r
-                          begin\r
-                               if i < j then Intercambiar( datos[i], datos[j], int );\r
-                               i := i + 1;\r
-                               j := j - 1;\r
-                          end;\r
-                  until i > j;\r
-                  if min < j then QSort( datos, min, j, comp, int);\r
-                  if i < max then QSort( datos, i, max, comp, int);\r
-             end; { procedure QSort }\r
-\r
-          (*********************************************************)\r
-\r
-          var\r
-             h1, h2: HORA;\r
-\r
-          begin { procedure QuickSort }\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               QSort( datos, 1, 1000, m.Comp, m.Int );\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure QuickSort }\r
-\r
-       (*********************************************************)\r
-\r
-       begin { procedure EvaluarCre }\r
-            if ExisteArchivo( 'DATOS.TXT' ) then\r
-              begin\r
-                   BubbleSort( arch, datos, 1000, bs );\r
-                   BubbleSortMej( arch, datos, 1000, bsm );\r
-                   ShakeSort( arch, datos, 1000, shs );\r
-                   RippleSort( arch, datos, 1000, rs );\r
-                   SelectionSort( arch, datos, 1000, ss );\r
-                   InsertionSort( arch, datos, 1000, is );\r
-                   ShellSort( arch, datos, 1000, sls );\r
-                   ShellSortMej( arch, datos, 1000, slsm );\r
-                   QuickSort( arch, datos, 1000, qs );\r
-                   CrearInforme( CRECIENTE );\r
-             end\r
-            else\r
-            NoExisteArch;\r
-       end;  { procedure EvaluarCre }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure EvaluarDec( var datos: TABLA; var arch: text );\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          var\r
-             i, j: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := tam - 1 downto 1 do\r
-               begin\r
-                    for j := tam - 1 downto 1 do\r
-                      begin\r
-                           m.Comp := m.Comp + 1;\r
-                           Retardar( RETARDO );\r
-                           if datos[j].ap < datos[j+1].ap then\r
-                             Intercambiar( datos[j], datos[j+1], m.Int);\r
-                      end;\r
-               end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-        end; { procedure BubbleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          var\r
-             huboint: boolean;\r
-             i, n: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               n := 1;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               huboint := true;\r
-               while huboint do\r
-                 begin\r
-                      huboint := false;\r
-                      for i := tam - 1 downto n do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[i].ap < datos[i+1].ap then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[i+1], m.Int);\r
-                                    huboint := true;\r
-                               end;\r
-                        end;\r
-                      n := n + 1;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure BubbleSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, d, j, tmp: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               i := 2;\r
-               d := tam;\r
-               tmp := tam;\r
-               repeat\r
-                     for j := d downto i do\r
-                      begin\r
-                       m.Comp := m.Comp + 1;\r
-                       Retardar( RETARDO );\r
-                       if datos[j].ap > datos[j-1].ap then\r
-                         begin\r
-                              Intercambiar( datos[j], datos[j-1], m.Int );\r
-                              tmp := j;\r
-                         end;\r
-                      end;\r
-                     i := tmp + 1;\r
-                     for j := i to d do\r
-                      begin\r
-                       m.Comp := m.Comp + 1;\r
-                       Retardar( RETARDO );\r
-                       if datos[j].ap > datos[j-1].ap then\r
-                         begin\r
-                              Intercambiar( datos[j], datos[j-1], m.Int );\r
-                              tmp := j;\r
-                         end;\r
-                      end;\r
-                     d := tmp - 1;\r
-               until i >= d;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShakeSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, j: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := 1 to tam do\r
-                 begin\r
-                      for j := i + 1 to tam do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[i].ap < datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure RippleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             i, sel, n: integer;\r
-             hubosel: boolean;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for n := 1 to tam - 1 do\r
-                 begin\r
-                      hubosel := false;\r
-                      sel := n;\r
-                      for i := n + 1 to tam do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if datos[sel].ap < datos[i].ap then\r
-                               begin\r
-                                    sel := i;\r
-                                    hubosel := true;\r
-                               end;\r
-                        end;\r
-                      if hubosel then Intercambiar( datos[n], datos[sel], m.Int);\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure SelectionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             i, j, k: integer;\r
-             tmp: PERSONA;\r
-             terminar: boolean;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := 2 to tam do\r
-                 begin\r
-                      m.Int := m.Int + 1;\r
-                      Retardar( RETARDO );\r
-                      tmp := datos[i];\r
-                      j := i - 1;\r
-                      terminar := false;\r
-                      while ( j >= 1 ) and ( not terminar ) do\r
-                        begin\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if ( tmp.ap > datos[j].ap ) then\r
-                               begin\r
-                                    m.Int := m.Int + 1;\r
-                                    Retardar( RETARDO );\r
-                                    datos[j+1] := datos[j];\r
-                                    j := j - 1;\r
-                               end\r
-                             else terminar := true;\r
-                        end;\r
-                      m.Int := m.Int + 1;\r
-                      Retardar( RETARDO );\r
-                      datos[j+1] := tmp;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure InsertionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-          var\r
-             h1, h2: HORA;\r
-             hueco, i, j: integer;\r
-             huboint: boolean;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               hueco := tam;\r
-               while hueco > 1 do\r
-                 begin\r
-                      hueco := hueco div 2;\r
-                      huboint := true;\r
-                      while huboint do\r
-                        begin\r
-                             huboint := false;\r
-                             for i := 1 to tam - hueco do\r
-                               begin\r
-                                    j := i + hueco;\r
-                                    m.Comp := m.Comp + 1;\r
-                                    Retardar( RETARDO );\r
-                                    if ( datos[i].ap < datos[j].ap ) then\r
-                                      begin\r
-                                           Intercambiar( datos[i], datos[j], m.Int );\r
-                                           huboint := true;\r
-                                      end;\r
-                               end;\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShellSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          (*********************************************************)\r
-\r
-          procedure Shell( var datos: TABLA; hueco, i: integer;\r
-                           var comp: longint; var int: longint );\r
-             var\r
-                j: integer;\r
-\r
-             begin\r
-                  j := i + hueco;\r
-                  comp := comp + 1;\r
-                  Retardar( RETARDO );\r
-                  if ( datos[i].ap < datos[j].ap ) then\r
-                    begin\r
-                         Intercambiar( datos[i], datos[j], int );\r
-                         if (i - hueco) > 0 then\r
-                           Shell( datos, hueco, i - hueco, comp, int );\r
-                    end;\r
-             end; { procedure Shell }\r
-\r
-          (*********************************************************)\r
-\r
-          var { procedure ShellSortMej }\r
-             h1, h2: HORA;\r
-             hueco, i, j: integer;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               hueco := tam;\r
-               while hueco > 1 do\r
-                 begin\r
-                      hueco := hueco div 2;\r
-                      for i := 1 to tam - hueco do\r
-                        begin\r
-                             j := i + hueco;\r
-                             m.Comp := m.Comp + 1;\r
-                             Retardar( RETARDO );\r
-                             if ( datos[i].ap < datos[j].ap ) then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[j], m.Int );\r
-                                    if (i - hueco) > 0 then\r
-                                      Shell( datos, hueco, i - hueco, m.Comp, m.Int );\r
-                               end;\r
-                        end;\r
-                 end;\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure ShellSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );\r
-\r
-          procedure QSort( var datos: TABLA; min, max: integer;\r
-                           var comp: longint; var int: longint );\r
-\r
-             var\r
-                i, j: integer;\r
-                sel: PERSONA;\r
-                flag: boolean;\r
-\r
-             begin\r
-                  sel := datos[( min + max ) div 2];\r
-                  i := min;\r
-                  j := max;\r
-                  repeat\r
-                        comp := comp + 1;\r
-                        Retardar( RETARDO );\r
-                        flag := false;\r
-                        while datos[i].ap > sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                                 Retardar( RETARDO );\r
-                                            end\r
-                                       else flag := true;\r
-                               i := i + 1;\r
-                          end;\r
-                        comp := comp + 1;\r
-                        Retardar( RETARDO );\r
-                        flag := false;\r
-                        while datos[j].ap < sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                                 Retardar( RETARDO );\r
-                                            end\r
-                                       else flag := true;\r
-                               j := j - 1;\r
-                          end;\r
-                        if i <= j then\r
-                          begin\r
-                               if i < j then Intercambiar( datos[i], datos[j], int );\r
-                               i := i + 1;\r
-                               j := j - 1;\r
-                          end;\r
-                  until i > j;\r
-                  if min < j then QSort( datos, min, j, comp, int);\r
-                  if i < max then QSort( datos, i, max, comp, int);\r
-             end; { procedure QSort }\r
-\r
-          (*********************************************************)\r
-\r
-          var\r
-             h1, h2: HORA;\r
-\r
-          begin { procedure QuickSort }\r
-               GetHora( h1 );\r
-               m.Comp := 0;\r
-               m.Int := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               QSort( datos, 1, 1000, m.Comp, m.Int );\r
-               GetHora( h2 );\r
-               m.Tiem := GetTiempo( h1, h2 );\r
-          end; { procedure QuickSort }\r
-\r
-       (*********************************************************)\r
-\r
-       begin { procedure EvaluarDec }\r
-            if ExisteArchivo( 'DATOS.TXT' ) then\r
-              begin\r
-                   BubbleSort( arch, datos, 1000, bs );\r
-                   BubbleSortMej( arch, datos, 1000, bsm );\r
-                   ShakeSort( arch, datos, 1000, shs );\r
-                   RippleSort( arch, datos, 1000, rs );\r
-                   SelectionSort( arch, datos, 1000, ss );\r
-                   InsertionSort( arch, datos, 1000, is );\r
-                   ShellSort( arch, datos, 1000, sls );\r
-                   ShellSortMej( arch, datos, 1000, slsm );\r
-                   QuickSort( arch, datos, 1000, qs );\r
-                   CrearInforme( DECRECIENTE );\r
-             end\r
-            else\r
-            NoExisteArch;\r
-       end;  { procedure EvaluarDec }\r
-\r
-    (*********************************************************)\r
-\r
-    var { procedure MenuEvaluar }\r
-       tecla: char;\r
-\r
-    begin\r
-         clrscr;\r
-         textcolor( Yellow );\r
-         gotoxy( 19, 3 );\r
-         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-         gotoxy( 19, 4 );\r
-         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-         textcolor( LightCyan );\r
-         gotoxy( 1, 7 );\r
-         writeln( '  Evaluar Algoritmos:' );\r
-         writeln( '  ------- ----------' );\r
-         textcolor( LightGray );\r
-         writeln;\r
-         writeln;\r
-         writeln( '     1.- Ordenando en forma creciente.' );\r
-         writeln( '     2.- Ordenando en forma decreciente.' );\r
-         writeln( '     0.- Men£ Anterior.' );\r
-         gotoxy( 1, 20 );\r
-         textcolor( White );\r
-         write( '  Ingrese su opci¢n: ' );\r
-         textcolor( Yellow );\r
-         tecla := readkey;\r
-         while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do\r
-           begin\r
-                textcolor( White );\r
-                gotoxy( 1, 20 );\r
-                write( '  Ingrese su opci¢n (1, 2 o 0): ' );\r
-                textcolor( Yellow );\r
-                tecla := readkey;\r
-           end;\r
-         case tecla of\r
-            '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )\r
-                                                 else NoExisteArch;\r
-            '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )\r
-                                                 else NoExisteArch;\r
-            '0': ;\r
-         end;\r
-    end;\r
-\r
-(*********************************************************)\r
-(*********************************************************)\r
-\r
- procedure MenuGenerar( var arch: text );\r
-\r
-    type\r
-        TIPO_LETRA = ( TL_VOCAL, TL_CONSO );\r
-        TIPO_VOCAL = ( TV_AEIOU, TV_EI );\r
-        INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );\r
-\r
-    (*********************************************************)\r
-\r
-    function GetRNDApellido( max, min: integer ): APELLIDO;\r
-\r
-       (*********************************************************)\r
-\r
-       function GetVocal( tipo: TIPO_VOCAL ): char;\r
-\r
-         var\r
-            valor: integer;\r
-\r
-         begin\r
-              if tipo = TV_AEIOU then valor := random( 16 )\r
-                                 else valor := random( 6 ) + 5;\r
-              case valor of\r
-                  0..4: GetVocal := 'A';\r
-                  5..7: GetVocal := 'E';\r
-                  8..10: GetVocal := 'I';\r
-                 11..13: GetVocal := 'O';\r
-                 14..15: GetVocal := 'U';\r
-              end;\r
-         end; { function GetVocal }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );\r
-\r
-         var\r
-            valor: integer;\r
-\r
-          begin\r
-              case indic of\r
-                  I_ESQ:\r
-                        begin\r
-                             vocal := 'U';\r
-                             indic := I_ESQU;\r
-                             proxl := TL_VOCAL;\r
-                        end;\r
-                  I_ESQU:\r
-                         begin\r
-                              vocal := GetVocal( TV_EI );\r
-                              indic := I_NADA;\r
-                              proxl := TL_CONSO;\r
-                         end;\r
-                  else\r
-                    begin\r
-                         vocal := GetVocal( TV_AEIOU );\r
-                         indic := I_NADA;\r
-                         if random( 40 ) = 0 then proxl := TL_VOCAL\r
-                                             else proxl := TL_CONSO;\r
-                    end;\r
-                  end;\r
-          end; { procedure GetRNDVocal }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );\r
-\r
-          var\r
-             valor: integer;\r
-\r
-          begin\r
-               proxl := TL_VOCAL;\r
-               indic := I_NADA;\r
-\r
-               case indic of\r
-                  I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';\r
-                  I_ESB: case random( 2 ) of\r
-                             0: conso := 'R';\r
-                             1: conso := 'L';\r
-                         end;\r
-                  I_ESC: case random( 4 ) of\r
-                             0: conso := 'C';\r
-                             1: conso := 'H';\r
-                             2: conso := 'R';\r
-                             3: conso := 'L';\r
-                         end;\r
-                  I_ESL: case random( 6 ) of\r
-                             0: conso := 'T';\r
-                             1..5: conso := 'L';\r
-                         end;\r
-                  I_ESM: case random( 3 ) of\r
-                             0: conso := 'P';\r
-                             1: conso := 'B';\r
-                             2: conso := 'L';\r
-                         end;\r
-                  I_ESN: case random( 3 ) of\r
-                             0: conso := 'R';\r
-                             1: conso := 'V';\r
-                             2: conso := 'C';\r
-                         end;\r
-                  else case random( 55 ) of\r
-                           0..3: begin\r
-                                      conso := 'B';\r
-                                      if random( 10 ) = 0 then begin\r
-                                                                    indic := I_ESB;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                 end;\r
-                           4..7: begin\r
-                                      conso := 'C';\r
-                                      if random( 5 ) = 0 then begin\r
-                                                                    indic := I_ESC;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                 end;\r
-                           8..11: conso := 'D';\r
-                           12..14: begin\r
-                                      conso := 'F';\r
-                                      if random( 10 ) = 0 then begin\r
-                                                                    indic := I_ESF;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                   end;\r
-                           15..17: begin\r
-                                        conso := 'G';\r
-                                        if random( 5 ) = 0 then\r
-                                        begin\r
-                                             indic := I_ESG;\r
-                                             if random( 4 ) = 0 then proxl := TL_CONSO;\r
-                                        end;\r
-                                   end;\r
-                           18..19: conso := 'H';\r
-                           20..22: conso := 'J';\r
-                           23..24: conso := 'K';\r
-                           25..27: begin\r
-                                        conso := 'L';\r
-                                        if random( 15 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESL;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           28..30: begin\r
-                                        conso := 'M';\r
-                                        if random( 5 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESM;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           31..33: begin\r
-                                        conso := 'N';\r
-                                        if random( 5 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESN;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           34..36: conso := 'P';\r
-                           37..38: begin\r
-                                        conso := 'Q';\r
-                                        indic := I_ESQ;\r
-                                   end;\r
-                           39..41: begin\r
-                                        conso := 'R';\r
-                                        if random( 3 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESR;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           42..44: conso := 'S';\r
-                           45..47: begin\r
-                                        conso := 'T';\r
-                                        if random( 10 ) = 0 then\r
-                                          begin\r
-                                               indic := I_EST;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           48..50: conso := 'V';\r
-                           51: conso := 'W';\r
-                           52: conso := 'X';\r
-                           53: conso := 'Y';\r
-                           54: conso := 'Z';\r
-                         end; { case random( 55 ) of }\r
-\r
-                end; { case indic of }\r
-           end; { procedure GetRNDConsonante }\r
-\r
-       (*********************************************************)\r
-\r
-       var { function GetRNDApellido }\r
-          tam, i: integer;\r
-          aux: char;\r
-          apel: APELLIDO;\r
-          indic: INDICADOR;\r
-          proxl: TIPO_LETRA;\r
-\r
-       begin\r
-            if max > MAX_APE then max := MAX_APE;\r
-            tam := random( max + 1 ) + min;\r
-            indic := I_NADA;\r
-            apel := '';\r
-            if random( 5 ) = 0 then proxl := TL_VOCAL\r
-                               else proxl := TL_CONSO;\r
-            for i := 1 to tam do\r
-              begin\r
-                   if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )\r
-                                       else GetRNDVocal( indic, proxl, aux );\r
-                   apel := apel + aux;\r
-              end;\r
-            GetRNDApellido := apel;\r
-       end; { function GetRNDApellido }\r
-\r
-    (*********************************************************)\r
-\r
-    function GetRNDLetra( min, max: char ): char;\r
-\r
-       begin\r
-            GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetOrdApellidos( var ar: text; cant: integer );\r
-\r
-       var\r
-           mil: boolean;\r
-           letra, letra1: char;\r
-           i, j, veces: integer;\r
-           dni: DOCUMENTO;\r
-           ap, ape, apel: APELLIDO;\r
-\r
-       begin\r
-            mil := false;\r
-            if cant = 1000 then mil := true;\r
-            dni := 10000000 + (random( 15000 ) * 100);\r
-            ap := '';\r
-            ape := '';\r
-            apel := '';\r
-            for letra := 'A' to 'Z' do\r
-              begin\r
-                   ap := letra;\r
-                   for letra1 := 'A' to 'Z' do\r
-                      begin\r
-                           if mil then\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':\r
-                                        case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end\r
-                           else\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':\r
-                                        case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end;\r
-                           ape := ap + letra1;\r
-                           for j := 1 to veces do\r
-                               begin\r
-                                    if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )\r
-                                             else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );\r
-                                    dni := dni + random( 50000 ) + 1;\r
-                                    writeln( ar, apel );\r
-                                    writeln( ar, dni );\r
-                                    writeln( ar );\r
-                                    apel := '';\r
-                               end;\r
-\r
-                           ape := '';\r
-\r
-                      end; { for letra1 := 'A' to 'Z' do }\r
-\r
-                   ap := '';\r
-\r
-              end; { for letra := 'A' to 'Z' do }\r
-\r
-       end; { procedure GetOrdApellidos }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetInvOrdApellidos( var ar: text; cant: integer );\r
-\r
-       var\r
-          mil: boolean;\r
-          letra, letra1: char;\r
-          i, j, veces: integer;\r
-          dni: DOCUMENTO;\r
-          ap, ape, apel: APELLIDO;\r
-\r
-       begin\r
-            mil := false;\r
-            if cant = 1000 then mil := true;\r
-            dni := 34000000 + (random( 15000 ) * 100);\r
-            ap := '';\r
-            ape := '';\r
-            apel := '';\r
-            for letra := 'Z' downto 'A' do\r
-              begin\r
-                   ap := letra;\r
-                   for letra1 := 'Z' downto 'A' do\r
-                      begin\r
-                           if mil then\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':\r
-                                        case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end\r
-                           else\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':\r
-                                        case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end;\r
-                           ape := ap + letra1;\r
-                           for j := 1 to veces do\r
-                               begin\r
-                                    if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )\r
-                                              else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );\r
-                                    dni := dni - random( 40000 ) - 1;\r
-                                    writeln( ar, apel );\r
-                                    writeln( ar, dni );\r
-                                    writeln( ar );\r
-                                    apel := '';\r
-                               end;\r
-\r
-                           ape := '';\r
-\r
-                      end; { for letra1 := 'A' to 'Z' do }\r
-\r
-                   ap := '';\r
-\r
-              end; { for letra := 'A' to 'Z' do }\r
-\r
-       end; { GetInvOrdApellidos }\r
-\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       var\r
-          i: integer;\r
-          ap: APELLIDO;\r
-          dni: DOCUMENTO;\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            dni := 10000000 + (random( 15000 ) * 100);\r
-\r
-            for i := 1 to n do\r
-                begin\r
-                     ap := GetRNDApellido( 8, 4 );\r
-                     dni := dni + random( 50000 ) + 1;\r
-                     writeln( arch, ap );\r
-                     writeln( arch, dni );\r
-                     writeln( arch );\r
-                end;\r
-            if reabrir then close( arch );\r
-       end; { procedure GenerarRND }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            GetOrdApellidos( arch, n );\r
-            if reabrir then close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            GetInvOrdApellidos( arch, n );\r
-            if reabrir then close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Generar90Ord( var arch: text );\r
-\r
-       begin\r
-            rewrite( arch );\r
-            GenerarOrd( arch, 900, false );\r
-            GenerarRND( arch, 100, false );\r
-            close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Generar90OrdDec( var arch: text );\r
-\r
-       begin\r
-            rewrite( arch );\r
-            GenerarOrdDec( arch, 900, false );\r
-            GenerarRND( arch, 100, false );\r
-            close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    var { procedure MenuGenerar }\r
-       tecla: char;\r
-\r
-    begin\r
-         clrscr;\r
-         textcolor( Yellow );\r
-         gotoxy( 19, 3 );\r
-         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-         gotoxy( 19, 4 );\r
-         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-         textcolor( LightCyan );\r
-         gotoxy( 1, 7 );\r
-         writeln( '  Generar Archivo (''DATOS.TXT''):' );\r
-         writeln( '  ------- ------- -------------' );\r
-         textcolor( LightGray );\r
-         writeln;\r
-         writeln;\r
-         writeln( '     1.- Con datos desordenados.' );\r
-         writeln( '     2.- Con datos en orden creciente (APELLIDO, DNI).' );\r
-         writeln( '     3.- Con datos en orden decreciente (APELLIDO, DNI).' );\r
-         writeln( '     4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );\r
-         writeln( '     5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );\r
-         writeln( '     0.- Men£ Anterior.' );\r
-         gotoxy( 1, 20 );\r
-         textcolor( White );\r
-         write( '  Ingrese su opci¢n: ' );\r
-         textcolor( Yellow );\r
-         tecla := readkey;\r
-         while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do\r
-           begin\r
-                textcolor( White );\r
-                gotoxy( 1, 20 );\r
-                write( '  Ingrese su opci¢n (1 a 5 o 0): ' );\r
-                textcolor( Yellow );\r
-                tecla := readkey;\r
-           end;\r
-         case tecla of\r
-            '1': GenerarRND( arch, 1000, true );\r
-            '2': GenerarOrd( arch, 1000, true );\r
-            '3': GenerarOrdDec( arch, 1000, true );\r
-            '4': Generar90Ord( arch );\r
-            '5': Generar90OrdDec( arch );\r
-            '0': ;\r
-         end;\r
-    end; { procedure MenuGenerar }\r
-\r
-(*********************************************************)\r
-\r
- procedure PantallaSalida;\r
-\r
-    begin\r
-         writeln;\r
-         NormVideo;\r
-         clrscr;\r
-         writeln;\r
-         textcolor( white );\r
-         writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n ', VERSION, ' <-o-o-> Luca - Soft' );\r
-         NormVideo;\r
-         writeln( '  Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );\r
-         writeln( '  Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );\r
-         writeln;\r
-         textcolor( LightMagenta );\r
-         write( '                lluca@cnba.uba.ar' );\r
-         NormVideo;\r
-         write( '   o   ' );\r
-         textcolor( LightMagenta );\r
-         writeln( 'lluca@geocities.com' );\r
-         NormVideo;\r
-         writeln;\r
-         writeln( '  (c) 1999 - Todos los derechos reservados.' );\r
-         delay( 750 );\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
-var { programa }\r
-    datos: TABLA;\r
-    arch: text;\r
-    tecla: char;\r
-    salir: boolean;\r
-\r
-begin\r
-     randomize;\r
-     assign( arch, 'DATOS.TXT' );\r
-     salir := false;\r
-     textbackground( Blue );\r
-\r
-     while not salir do\r
-       begin\r
-            clrscr;\r
-            textcolor( Yellow );\r
-            gotoxy( 19, 3 );\r
-            writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-            gotoxy( 19, 4 );\r
-            writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-            gotoxy( 1, 7 );\r
-            textcolor( LightCyan );\r
-            writeln( '  Men£ Principal:' );\r
-            writeln( '  ---- ---------' );\r
-            textcolor( LightGray );\r
-            writeln;\r
-            writeln;\r
-            writeln( '     1.- Generar Archivo (''DATOS.TXT'').' );\r
-            writeln( '     2.- Evaluar Algoritmos.' );\r
-            writeln( '     0.- Salir.' );\r
-            gotoxy( 1, 20 );\r
-            textcolor( White );\r
-            write( '  Ingrese su opci¢n: ' );\r
-            textcolor( Yellow );\r
-            tecla := readkey;\r
-            while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do\r
-              begin\r
-                   textcolor( White );\r
-                   gotoxy( 1, 20 );\r
-                   write( '  Ingrese su opci¢n (1, 2 o 0): ' );\r
-                   textcolor( Yellow );\r
-                   tecla := readkey;\r
-              end;\r
-            case tecla of\r
-                 '1': MenuGenerar( arch );\r
-                 '2': MenuEvaluar( datos, arch );\r
-                 '0': salir := true;\r
-            end;\r
-       end;\r
-     PantallaSalida;\r
+program Comparacion_De_Algoritmos_De_Ordenamiento;
+
+uses
+    CRT, DOS;
+
+const
+     MAX_APE = 15;
+     RETARDO = 50;
+     VERSION = '1.2.8';
+
+type
+    APELLIDO = string[MAX_APE];
+    DOCUMENTO = longint;
+    PERSONA = record
+                    ap: APELLIDO;
+                    dni: DOCUMENTO;
+              end;
+    TABLA = array[1..1000] of PERSONA;
+
+(*********************************************************)
+
+ procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );
+
+    var
+       i: integer;
+
+    begin
+         for i:= 1 to tam do
+            begin
+                 writeln( ar, datos[i].ap );
+                 writeln( ar, datos[i].dni );
+                 writeln( ar );
+            end;
+    end; { procedure CargarArchivo }
+
+(*********************************************************)
+
+ procedure Retardar( centenas: longint );
+
+    var
+       i: integer;
+
+    begin
+         for i:= 1 to centenas * 100 do ;
+    end; { procedure Retardar }
+
+(*********************************************************)
+(*********************************************************)
+
+ procedure MenuEvaluar( var datos: TABLA; var arch: text );
+
+    type
+        HORA = record
+                     h,
+                     m,
+                     s,
+                     c: longint;
+               end;
+        ORDEN = ( CRECIENTE, DECRECIENTE );
+        MEDICION = record
+                         Comp,
+                         Int,
+                         Tiem: longint;
+                   end;
+    var
+       bs, bsm, shs, rs, ss, is, sls, slsm, qs: MEDICION;
+
+    (*********************************************************)
+
+    procedure CrearInforme( ord: ORDEN );
+
+       (*********************************************************)
+
+       procedure InfMetodo( var info: text; metodo: string; sort: MEDICION );
+
+          begin
+               writeln( info );
+               writeln( info, metodo, ':' );
+               writeln( info, '             Comparaciones: ', sort.Comp: 1 );
+               writeln( info, '             Intercambios:  ', sort.Int div 3: 1, ' (', sort.Int: 1, ' asignaciones)' );
+               writeln( info, '             Tiempo (seg):  ', sort.Tiem / 100: 2: 2 );
+          end; { procedure InfMetodo }
+
+       (*********************************************************)
+
+       var { procedure CrearInforme }
+          info: text;
+
+       begin
+            assign( info, 'INFORME.TXT' );
+            rewrite( info );
+            writeln( info );
+            if ord = DECRECIENTE then
+              begin
+                   writeln( info, 'INFORME: Orden Decreciente.' );
+                   writeln( info, '=======  ~~~~~ ~~~~~~~~~~~' );
+              end
+            else
+              begin
+                   writeln( info, 'INFORME: Orden Creciente.' );
+                   writeln( info, '=======  ~~~~~ ~~~~~~~~~' );
+              end;
+            writeln( info );
+            InfMetodo( info, 'Bubble Sort', bs );
+            InfMetodo( info, 'Bubble Sort Mejorado', bsm );
+            InfMetodo( info, 'Shake Sort', shs );
+            InfMetodo( info, 'Ripple Sort', rs );
+            InfMetodo( info, 'Selection Sort', ss );
+            InfMetodo( info, 'Insertion Sort', is );
+            InfMetodo( info, 'Shell''s Sort', sls );
+            InfMetodo( info, 'Shell''s Sort Mejorado', slsm );
+            InfMetodo( info, 'Quick Sort', qs );
+            writeln( info );
+            writeln( info );
+            writeln( info, 'NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de' );
+            writeln( info, '====  asignaciones, ya que en el Insertion Sort no hay intercambios. De esta' );
+            writeln( info, '      manera, un intercambio equivales a 3 asignaciones.' );
+            close( info );
+       end; { procedure CrearInforme }
+
+    (*********************************************************)
+
+    procedure NoExisteArch;
+
+       begin
+            clrscr;
+            gotoxy( 20, 10 );
+            textcolor( LightMagenta + Blink );
+            writeln( 'ERROR: No existe el archivo a evaluar!' );
+            textcolor( LightGray );
+            writeln;
+            writeln( '             Creelo seleccionando la opci¢n 1 del Men£ Principal.' );
+            delay( 4000 );
+       end; { procedure NoExisteArch }
+
+    (*********************************************************)
+
+    function ExisteArchivo( nombre: String ): boolean;
+
+    { funcion extrida de la ayuda del Turbo Pascal 7 }
+
+       var
+          arch: text;
+
+       begin
+            {$I-}
+            Assign( arch, nombre );
+            FileMode := 0;  { Solo lectura }
+            Reset( arch );
+            Close( arch );
+            {$I+}
+            ExisteArchivo := (IOResult = 0) and (nombre <> '');
+       end; { function ExisteArchivo }
+
+    (*********************************************************)
+
+       procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );
+
+          var
+             i: integer;
+             void: string[2];
+
+          begin
+               for i:= 1 to tam do
+                  begin
+                       readln( ar, datos[i].ap );
+                       readln( ar, datos[i].dni );
+                       readln( ar, void );
+                  end;
+          end; { procedure CargarTabla }
+
+    (*********************************************************)
+
+    procedure Intercambiar( var a, b: PERSONA; var int: longint );
+
+       var
+          aux: PERSONA;
+
+       begin
+            int := int + 1;
+            Retardar( RETARDO );
+            aux := a;
+            int := int + 1;
+            Retardar( RETARDO );
+            a := b;
+            int := int + 1;
+            Retardar( RETARDO );
+            b := aux;
+       end; { procedure Intercambiar }
+
+    (*********************************************************)
+
+    procedure GetHora( var hor: HORA );
+
+       var
+          h, m, s, c: word;
+
+       begin
+            gettime( h, m, s, c );
+            hor.h := h;
+            hor.m := m;
+            hor.s := s;
+            hor.c := c;
+       end; { procedure GetHora }
+
+    (*********************************************************)
+
+    function GetTiempo( h1, h2: HORA ): longint;
+
+       var
+          t: longint;
+          aux: HORA;
+
+       begin
+            if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }
+              begin
+              if h1.h < h2.h then
+                begin
+                     aux := h1;
+                     h1 := h2;
+                     h2 := aux;
+                end
+              end
+            else if h1.m <> h2.m then
+                   begin
+                   if h1.m < h2.m then
+                     begin
+                          aux := h1;
+                          h1 := h2;
+                          h2 := aux;
+                     end
+                   end
+                 else if h1.s <> h2.s then
+                        begin
+                        if h1.s < h2.s then
+                          begin
+                               aux := h1;
+                               h1 := h2;
+                               h2 := aux;
+                          end
+                        end
+                      else if h1.c <> h2.c then
+                             if h1.c < h2.c then
+                               begin
+                                    aux := h1;
+                                    h1 := h2;
+                                    h2 := aux;
+                               end;
+            t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60  + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );
+            GetTiempo := t;
+       end; { function GetTiempo }
+
+    (*********************************************************)
+
+    procedure EvaluarCre( var datos: TABLA; var arch: text );
+
+       (*********************************************************)
+
+       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          var
+             i, j: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := tam - 1 downto 1 do
+               begin
+                    for j := tam - 1 downto 1 do
+                      begin
+                           m.Comp := m.Comp + 1;
+                           Retardar( RETARDO );
+                           if datos[j].ap > datos[j+1].ap then
+                             Intercambiar( datos[j], datos[j+1], m.Int);
+                      end;
+               end;
+             GetHora( h2 );
+             m.Tiem := GetTiempo( h1, h2 );
+        end; { procedure BubbleSort }
+
+       (*********************************************************)
+
+       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          var
+             huboint: boolean;
+             i, n: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               n := 1;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               huboint := true;
+               while huboint do
+                 begin
+                      huboint := false;
+                      for i := tam - 1 downto n do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[i].ap > datos[i+1].ap then
+                               begin
+                                    Intercambiar( datos[i], datos[i+1], m.Int);
+                                    huboint := true;
+                               end;
+                        end;
+                      n := n + 1;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure BubbleSortMej }
+
+       (*********************************************************)
+
+       procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, d, j, tmp: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               i := 2;
+               d := tam;
+               tmp := tam;
+               repeat
+                     for j := d downto i do
+                      begin
+                       m.Comp := m.Comp + 1;
+                       Retardar( RETARDO );
+                       if datos[j].ap < datos[j-1].ap then
+                         begin
+                              Intercambiar( datos[j], datos[j-1], m.Int );
+                              tmp := j;
+                         end;
+                      end;
+                     i := tmp + 1;
+                     for j := i to d do
+                      begin
+                       m.Comp := m.Comp + 1;
+                       Retardar( RETARDO );
+                       if datos[j].ap < datos[j-1].ap then
+                         begin
+                              Intercambiar( datos[j], datos[j-1], m.Int );
+                              tmp := j;
+                         end;
+                      end;
+                     d := tmp - 1;
+               until i >= d;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShakeSort }
+
+       (*********************************************************)
+
+       procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, j: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := 1 to tam do
+                 begin
+                      for j := i + 1 to tam do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[i].ap > datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure RippleSort }
+
+       (*********************************************************)
+
+       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             i, sel, n: integer;
+             hubosel: boolean;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for n := 1 to tam - 1 do
+                 begin
+                      hubosel := false;
+                      sel := n;
+                      for i := n + 1 to tam do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[sel].ap > datos[i].ap then
+                               begin
+                                    sel := i;
+                                    hubosel := true;
+                               end;
+                        end;
+                      if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure SelectionSort }
+
+       (*********************************************************)
+
+       procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, j, k: integer;
+             tmp: PERSONA;
+             terminar: boolean;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := 2 to tam do
+                 begin
+                      m.Int := m.Int + 1;
+                      Retardar( RETARDO );
+                      tmp := datos[i];
+                      j := i - 1;
+                      terminar := false;
+                      while ( j >= 1 ) and ( not terminar ) do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if ( tmp.ap < datos[j].ap ) then
+                               begin
+                                    m.Int := m.Int + 1;
+                                    Retardar( RETARDO );
+                                    datos[j+1] := datos[j];
+                                    j := j - 1;
+                               end
+                             else terminar := true;
+                        end;
+                      m.Int := m.Int + 1;
+                      Retardar( RETARDO );
+                      datos[j+1] := tmp;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure InsertionSort }
+
+       (*********************************************************)
+
+       procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             hueco, i, j: integer;
+             huboint: boolean;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               hueco := tam;
+               while hueco > 1 do
+                 begin
+                      hueco := hueco div 2;
+                      huboint := true;
+                      while huboint do
+                        begin
+                             huboint := false;
+                             for i := 1 to tam - hueco do
+                               begin
+                                    j := i + hueco;
+                                    m.Comp := m.Comp + 1;
+                                    Retardar( RETARDO );
+                                    if ( datos[i].ap > datos[j].ap ) then
+                                      begin
+                                           Intercambiar( datos[i], datos[j], m.Int );
+                                           huboint := true;
+                                      end;
+                               end;
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShellSort }
+
+       (*********************************************************)
+
+       procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          (*********************************************************)
+
+          procedure Shell( var datos: TABLA; hueco, i: integer; var comp, int: longint );
+             var
+                j: integer;
+
+             begin
+                  j := i + hueco;
+                  comp := comp + 1;
+                  Retardar( RETARDO );
+                  if ( datos[i].ap > datos[j].ap ) then
+                    begin
+                         Intercambiar( datos[i], datos[j], int );
+                         if (i - hueco) > 0 then
+                           Shell( datos, hueco, i - hueco, comp, int );
+                    end;
+             end; { procedure Shell }
+
+          (*********************************************************)
+
+          var { procedure ShellSortMej }
+             h1, h2: HORA;
+             hueco, i, j: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               hueco := tam;
+               while hueco > 1 do
+                 begin
+                      hueco := hueco div 2;
+                      for i := 1 to tam - hueco do
+                        begin
+                             j := i + hueco;
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if ( datos[i].ap > datos[j].ap ) then
+                               begin
+                                    Intercambiar( datos[i], datos[j], m.Int );
+                                    if (i - hueco) > 0 then
+                                      Shell( datos, hueco, i - hueco, m.Comp, m.Int );
+                               end;
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShellSortMej }
+
+       (*********************************************************)
+
+       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          (*********************************************************)
+
+          procedure QSort( var datos: TABLA; min, max: integer; var comp, int: longint );
+
+             var
+                i, j: integer;
+                sel: PERSONA;
+                flag: boolean;
+
+             begin
+                  sel := datos[( min + max ) div 2];
+                  i := min;
+                  j := max;
+                  repeat
+                        comp := comp + 1;
+                        Retardar( RETARDO );
+                        flag := false;
+                        while datos[i].ap < sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                                 Retardar( RETARDO );
+                                            end
+                                       else flag := true;
+                               i := i + 1;
+                          end;
+                        comp := comp + 1;
+                        Retardar( RETARDO );
+                        flag := false;
+                        while datos[j].ap > sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                                 Retardar( RETARDO );
+                                            end
+                                       else flag := true;
+                               j := j - 1;
+                          end;
+                        if i <= j then
+                          begin
+                               if i < j then Intercambiar( datos[i], datos[j], int );
+                               i := i + 1;
+                               j := j - 1;
+                          end;
+                  until i > j;
+                  if min < j then QSort( datos, min, j, comp, int);
+                  if i < max then QSort( datos, i, max, comp, int);
+             end; { procedure QSort }
+
+          (*********************************************************)
+
+          var
+             h1, h2: HORA;
+
+          begin { procedure QuickSort }
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               QSort( datos, 1, 1000, m.Comp, m.Int );
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure QuickSort }
+
+       (*********************************************************)
+
+       begin { procedure EvaluarCre }
+            if ExisteArchivo( 'DATOS.TXT' ) then
+              begin
+                   BubbleSort( arch, datos, 1000, bs );
+                   BubbleSortMej( arch, datos, 1000, bsm );
+                   ShakeSort( arch, datos, 1000, shs );
+                   RippleSort( arch, datos, 1000, rs );
+                   SelectionSort( arch, datos, 1000, ss );
+                   InsertionSort( arch, datos, 1000, is );
+                   ShellSort( arch, datos, 1000, sls );
+                   ShellSortMej( arch, datos, 1000, slsm );
+                   QuickSort( arch, datos, 1000, qs );
+                   CrearInforme( CRECIENTE );
+             end
+            else
+            NoExisteArch;
+       end;  { procedure EvaluarCre }
+
+    (*********************************************************)
+
+    procedure EvaluarDec( var datos: TABLA; var arch: text );
+
+       (*********************************************************)
+
+       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          var
+             i, j: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := tam - 1 downto 1 do
+               begin
+                    for j := tam - 1 downto 1 do
+                      begin
+                           m.Comp := m.Comp + 1;
+                           Retardar( RETARDO );
+                           if datos[j].ap < datos[j+1].ap then
+                             Intercambiar( datos[j], datos[j+1], m.Int);
+                      end;
+               end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+        end; { procedure BubbleSort }
+
+       (*********************************************************)
+
+       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          var
+             huboint: boolean;
+             i, n: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               n := 1;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               huboint := true;
+               while huboint do
+                 begin
+                      huboint := false;
+                      for i := tam - 1 downto n do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[i].ap < datos[i+1].ap then
+                               begin
+                                    Intercambiar( datos[i], datos[i+1], m.Int);
+                                    huboint := true;
+                               end;
+                        end;
+                      n := n + 1;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure BubbleSortMej }
+
+       (*********************************************************)
+
+       procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, d, j, tmp: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               i := 2;
+               d := tam;
+               tmp := tam;
+               repeat
+                     for j := d downto i do
+                      begin
+                       m.Comp := m.Comp + 1;
+                       Retardar( RETARDO );
+                       if datos[j].ap > datos[j-1].ap then
+                         begin
+                              Intercambiar( datos[j], datos[j-1], m.Int );
+                              tmp := j;
+                         end;
+                      end;
+                     i := tmp + 1;
+                     for j := i to d do
+                      begin
+                       m.Comp := m.Comp + 1;
+                       Retardar( RETARDO );
+                       if datos[j].ap > datos[j-1].ap then
+                         begin
+                              Intercambiar( datos[j], datos[j-1], m.Int );
+                              tmp := j;
+                         end;
+                      end;
+                     d := tmp - 1;
+               until i >= d;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShakeSort }
+
+       (*********************************************************)
+
+       procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, j: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := 1 to tam do
+                 begin
+                      for j := i + 1 to tam do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[i].ap < datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure RippleSort }
+
+       (*********************************************************)
+
+       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             i, sel, n: integer;
+             hubosel: boolean;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for n := 1 to tam - 1 do
+                 begin
+                      hubosel := false;
+                      sel := n;
+                      for i := n + 1 to tam do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if datos[sel].ap < datos[i].ap then
+                               begin
+                                    sel := i;
+                                    hubosel := true;
+                               end;
+                        end;
+                      if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure SelectionSort }
+
+       (*********************************************************)
+
+       procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             i, j, k: integer;
+             tmp: PERSONA;
+             terminar: boolean;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := 2 to tam do
+                 begin
+                      m.Int := m.Int + 1;
+                      Retardar( RETARDO );
+                      tmp := datos[i];
+                      j := i - 1;
+                      terminar := false;
+                      while ( j >= 1 ) and ( not terminar ) do
+                        begin
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if ( tmp.ap > datos[j].ap ) then
+                               begin
+                                    m.Int := m.Int + 1;
+                                    Retardar( RETARDO );
+                                    datos[j+1] := datos[j];
+                                    j := j - 1;
+                               end
+                             else terminar := true;
+                        end;
+                      m.Int := m.Int + 1;
+                      Retardar( RETARDO );
+                      datos[j+1] := tmp;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure InsertionSort }
+
+       (*********************************************************)
+
+       procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+          var
+             h1, h2: HORA;
+             hueco, i, j: integer;
+             huboint: boolean;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               hueco := tam;
+               while hueco > 1 do
+                 begin
+                      hueco := hueco div 2;
+                      huboint := true;
+                      while huboint do
+                        begin
+                             huboint := false;
+                             for i := 1 to tam - hueco do
+                               begin
+                                    j := i + hueco;
+                                    m.Comp := m.Comp + 1;
+                                    Retardar( RETARDO );
+                                    if ( datos[i].ap < datos[j].ap ) then
+                                      begin
+                                           Intercambiar( datos[i], datos[j], m.Int );
+                                           huboint := true;
+                                      end;
+                               end;
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShellSort }
+
+       (*********************************************************)
+
+       procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          (*********************************************************)
+
+          procedure Shell( var datos: TABLA; hueco, i: integer;
+                           var comp: longint; var int: longint );
+             var
+                j: integer;
+
+             begin
+                  j := i + hueco;
+                  comp := comp + 1;
+                  Retardar( RETARDO );
+                  if ( datos[i].ap < datos[j].ap ) then
+                    begin
+                         Intercambiar( datos[i], datos[j], int );
+                         if (i - hueco) > 0 then
+                           Shell( datos, hueco, i - hueco, comp, int );
+                    end;
+             end; { procedure Shell }
+
+          (*********************************************************)
+
+          var { procedure ShellSortMej }
+             h1, h2: HORA;
+             hueco, i, j: integer;
+
+          begin
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               hueco := tam;
+               while hueco > 1 do
+                 begin
+                      hueco := hueco div 2;
+                      for i := 1 to tam - hueco do
+                        begin
+                             j := i + hueco;
+                             m.Comp := m.Comp + 1;
+                             Retardar( RETARDO );
+                             if ( datos[i].ap < datos[j].ap ) then
+                               begin
+                                    Intercambiar( datos[i], datos[j], m.Int );
+                                    if (i - hueco) > 0 then
+                                      Shell( datos, hueco, i - hueco, m.Comp, m.Int );
+                               end;
+                        end;
+                 end;
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure ShellSortMej }
+
+       (*********************************************************)
+
+       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
+
+          procedure QSort( var datos: TABLA; min, max: integer;
+                           var comp: longint; var int: longint );
+
+             var
+                i, j: integer;
+                sel: PERSONA;
+                flag: boolean;
+
+             begin
+                  sel := datos[( min + max ) div 2];
+                  i := min;
+                  j := max;
+                  repeat
+                        comp := comp + 1;
+                        Retardar( RETARDO );
+                        flag := false;
+                        while datos[i].ap > sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                                 Retardar( RETARDO );
+                                            end
+                                       else flag := true;
+                               i := i + 1;
+                          end;
+                        comp := comp + 1;
+                        Retardar( RETARDO );
+                        flag := false;
+                        while datos[j].ap < sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                                 Retardar( RETARDO );
+                                            end
+                                       else flag := true;
+                               j := j - 1;
+                          end;
+                        if i <= j then
+                          begin
+                               if i < j then Intercambiar( datos[i], datos[j], int );
+                               i := i + 1;
+                               j := j - 1;
+                          end;
+                  until i > j;
+                  if min < j then QSort( datos, min, j, comp, int);
+                  if i < max then QSort( datos, i, max, comp, int);
+             end; { procedure QSort }
+
+          (*********************************************************)
+
+          var
+             h1, h2: HORA;
+
+          begin { procedure QuickSort }
+               GetHora( h1 );
+               m.Comp := 0;
+               m.Int := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               QSort( datos, 1, 1000, m.Comp, m.Int );
+               GetHora( h2 );
+               m.Tiem := GetTiempo( h1, h2 );
+          end; { procedure QuickSort }
+
+       (*********************************************************)
+
+       begin { procedure EvaluarDec }
+            if ExisteArchivo( 'DATOS.TXT' ) then
+              begin
+                   BubbleSort( arch, datos, 1000, bs );
+                   BubbleSortMej( arch, datos, 1000, bsm );
+                   ShakeSort( arch, datos, 1000, shs );
+                   RippleSort( arch, datos, 1000, rs );
+                   SelectionSort( arch, datos, 1000, ss );
+                   InsertionSort( arch, datos, 1000, is );
+                   ShellSort( arch, datos, 1000, sls );
+                   ShellSortMej( arch, datos, 1000, slsm );
+                   QuickSort( arch, datos, 1000, qs );
+                   CrearInforme( DECRECIENTE );
+             end
+            else
+            NoExisteArch;
+       end;  { procedure EvaluarDec }
+
+    (*********************************************************)
+
+    var { procedure MenuEvaluar }
+       tecla: char;
+
+    begin
+         clrscr;
+         textcolor( Yellow );
+         gotoxy( 19, 3 );
+         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+         gotoxy( 19, 4 );
+         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+         textcolor( LightCyan );
+         gotoxy( 1, 7 );
+         writeln( '  Evaluar Algoritmos:' );
+         writeln( '  ------- ----------' );
+         textcolor( LightGray );
+         writeln;
+         writeln;
+         writeln( '     1.- Ordenando en forma creciente.' );
+         writeln( '     2.- Ordenando en forma decreciente.' );
+         writeln( '     0.- Men£ Anterior.' );
+         gotoxy( 1, 20 );
+         textcolor( White );
+         write( '  Ingrese su opci¢n: ' );
+         textcolor( Yellow );
+         tecla := readkey;
+         while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
+           begin
+                textcolor( White );
+                gotoxy( 1, 20 );
+                write( '  Ingrese su opci¢n (1, 2 o 0): ' );
+                textcolor( Yellow );
+                tecla := readkey;
+           end;
+         case tecla of
+            '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )
+                                                 else NoExisteArch;
+            '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )
+                                                 else NoExisteArch;
+            '0': ;
+         end;
+    end;
+
+(*********************************************************)
+(*********************************************************)
+
+ procedure MenuGenerar( var arch: text );
+
+    type
+        TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
+        TIPO_VOCAL = ( TV_AEIOU, TV_EI );
+        INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
+
+    (*********************************************************)
+
+    function GetRNDApellido( max, min: integer ): APELLIDO;
+
+       (*********************************************************)
+
+       function GetVocal( tipo: TIPO_VOCAL ): char;
+
+         var
+            valor: integer;
+
+         begin
+              if tipo = TV_AEIOU then valor := random( 16 )
+                                 else valor := random( 6 ) + 5;
+              case valor of
+                  0..4: GetVocal := 'A';
+                  5..7: GetVocal := 'E';
+                  8..10: GetVocal := 'I';
+                 11..13: GetVocal := 'O';
+                 14..15: GetVocal := 'U';
+              end;
+         end; { function GetVocal }
+
+       (*********************************************************)
+
+       procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
+
+         var
+            valor: integer;
+
+          begin
+              case indic of
+                  I_ESQ:
+                        begin
+                             vocal := 'U';
+                             indic := I_ESQU;
+                             proxl := TL_VOCAL;
+                        end;
+                  I_ESQU:
+                         begin
+                              vocal := GetVocal( TV_EI );
+                              indic := I_NADA;
+                              proxl := TL_CONSO;
+                         end;
+                  else
+                    begin
+                         vocal := GetVocal( TV_AEIOU );
+                         indic := I_NADA;
+                         if random( 40 ) = 0 then proxl := TL_VOCAL
+                                             else proxl := TL_CONSO;
+                    end;
+                  end;
+          end; { procedure GetRNDVocal }
+
+       (*********************************************************)
+
+       procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
+
+          var
+             valor: integer;
+
+          begin
+               proxl := TL_VOCAL;
+               indic := I_NADA;
+
+               case indic of
+                  I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
+                  I_ESB: case random( 2 ) of
+                             0: conso := 'R';
+                             1: conso := 'L';
+                         end;
+                  I_ESC: case random( 4 ) of
+                             0: conso := 'C';
+                             1: conso := 'H';
+                             2: conso := 'R';
+                             3: conso := 'L';
+                         end;
+                  I_ESL: case random( 6 ) of
+                             0: conso := 'T';
+                             1..5: conso := 'L';
+                         end;
+                  I_ESM: case random( 3 ) of
+                             0: conso := 'P';
+                             1: conso := 'B';
+                             2: conso := 'L';
+                         end;
+                  I_ESN: case random( 3 ) of
+                             0: conso := 'R';
+                             1: conso := 'V';
+                             2: conso := 'C';
+                         end;
+                  else case random( 55 ) of
+                           0..3: begin
+                                      conso := 'B';
+                                      if random( 10 ) = 0 then begin
+                                                                    indic := I_ESB;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                 end;
+                           4..7: begin
+                                      conso := 'C';
+                                      if random( 5 ) = 0 then begin
+                                                                    indic := I_ESC;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                 end;
+                           8..11: conso := 'D';
+                           12..14: begin
+                                      conso := 'F';
+                                      if random( 10 ) = 0 then begin
+                                                                    indic := I_ESF;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                   end;
+                           15..17: begin
+                                        conso := 'G';
+                                        if random( 5 ) = 0 then
+                                        begin
+                                             indic := I_ESG;
+                                             if random( 4 ) = 0 then proxl := TL_CONSO;
+                                        end;
+                                   end;
+                           18..19: conso := 'H';
+                           20..22: conso := 'J';
+                           23..24: conso := 'K';
+                           25..27: begin
+                                        conso := 'L';
+                                        if random( 15 ) = 0 then
+                                          begin
+                                               indic := I_ESL;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           28..30: begin
+                                        conso := 'M';
+                                        if random( 5 ) = 0 then
+                                          begin
+                                               indic := I_ESM;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           31..33: begin
+                                        conso := 'N';
+                                        if random( 5 ) = 0 then
+                                          begin
+                                               indic := I_ESN;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           34..36: conso := 'P';
+                           37..38: begin
+                                        conso := 'Q';
+                                        indic := I_ESQ;
+                                   end;
+                           39..41: begin
+                                        conso := 'R';
+                                        if random( 3 ) = 0 then
+                                          begin
+                                               indic := I_ESR;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           42..44: conso := 'S';
+                           45..47: begin
+                                        conso := 'T';
+                                        if random( 10 ) = 0 then
+                                          begin
+                                               indic := I_EST;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           48..50: conso := 'V';
+                           51: conso := 'W';
+                           52: conso := 'X';
+                           53: conso := 'Y';
+                           54: conso := 'Z';
+                         end; { case random( 55 ) of }
+
+                end; { case indic of }
+           end; { procedure GetRNDConsonante }
+
+       (*********************************************************)
+
+       var { function GetRNDApellido }
+          tam, i: integer;
+          aux: char;
+          apel: APELLIDO;
+          indic: INDICADOR;
+          proxl: TIPO_LETRA;
+
+       begin
+            if max > MAX_APE then max := MAX_APE;
+            tam := random( max + 1 ) + min;
+            indic := I_NADA;
+            apel := '';
+            if random( 5 ) = 0 then proxl := TL_VOCAL
+                               else proxl := TL_CONSO;
+            for i := 1 to tam do
+              begin
+                   if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
+                                       else GetRNDVocal( indic, proxl, aux );
+                   apel := apel + aux;
+              end;
+            GetRNDApellido := apel;
+       end; { function GetRNDApellido }
+
+    (*********************************************************)
+
+    function GetRNDLetra( min, max: char ): char;
+
+       begin
+            GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
+       end;
+
+    (*********************************************************)
+
+    procedure GetOrdApellidos( var ar: text; cant: integer );
+
+       var
+           mil: boolean;
+           letra, letra1: char;
+           i, j, veces: integer;
+           dni: DOCUMENTO;
+           ap, ape, apel: APELLIDO;
+
+       begin
+            mil := false;
+            if cant = 1000 then mil := true;
+            dni := 10000000 + (random( 15000 ) * 100);
+            ap := '';
+            ape := '';
+            apel := '';
+            for letra := 'A' to 'Z' do
+              begin
+                   ap := letra;
+                   for letra1 := 'A' to 'Z' do
+                      begin
+                           if mil then
+                              case letra of
+                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
+                                        case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end
+                           else
+                              case letra of
+                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
+                                        case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end;
+                           ape := ap + letra1;
+                           for j := 1 to veces do
+                               begin
+                                    if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
+                                             else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
+                                    dni := dni + random( 50000 ) + 1;
+                                    writeln( ar, apel );
+                                    writeln( ar, dni );
+                                    writeln( ar );
+                                    apel := '';
+                               end;
+
+                           ape := '';
+
+                      end; { for letra1 := 'A' to 'Z' do }
+
+                   ap := '';
+
+              end; { for letra := 'A' to 'Z' do }
+
+       end; { procedure GetOrdApellidos }
+
+    (*********************************************************)
+
+    procedure GetInvOrdApellidos( var ar: text; cant: integer );
+
+       var
+          mil: boolean;
+          letra, letra1: char;
+          i, j, veces: integer;
+          dni: DOCUMENTO;
+          ap, ape, apel: APELLIDO;
+
+       begin
+            mil := false;
+            if cant = 1000 then mil := true;
+            dni := 34000000 + (random( 15000 ) * 100);
+            ap := '';
+            ape := '';
+            apel := '';
+            for letra := 'Z' downto 'A' do
+              begin
+                   ap := letra;
+                   for letra1 := 'Z' downto 'A' do
+                      begin
+                           if mil then
+                              case letra of
+                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
+                                        case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end
+                           else
+                              case letra of
+                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
+                                        case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end;
+                           ape := ap + letra1;
+                           for j := 1 to veces do
+                               begin
+                                    if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
+                                              else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
+                                    dni := dni - random( 40000 ) - 1;
+                                    writeln( ar, apel );
+                                    writeln( ar, dni );
+                                    writeln( ar );
+                                    apel := '';
+                               end;
+
+                           ape := '';
+
+                      end; { for letra1 := 'A' to 'Z' do }
+
+                   ap := '';
+
+              end; { for letra := 'A' to 'Z' do }
+
+       end; { GetInvOrdApellidos }
+
+
+    (*********************************************************)
+
+    procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );
+
+       var
+          i: integer;
+          ap: APELLIDO;
+          dni: DOCUMENTO;
+
+       begin
+            if reabrir then rewrite( arch );
+            dni := 10000000 + (random( 15000 ) * 100);
+
+            for i := 1 to n do
+                begin
+                     ap := GetRNDApellido( 8, 4 );
+                     dni := dni + random( 50000 ) + 1;
+                     writeln( arch, ap );
+                     writeln( arch, dni );
+                     writeln( arch );
+                end;
+            if reabrir then close( arch );
+       end; { procedure GenerarRND }
+
+    (*********************************************************)
+
+    procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );
+
+       begin
+            if reabrir then rewrite( arch );
+            GetOrdApellidos( arch, n );
+            if reabrir then close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );
+
+       begin
+            if reabrir then rewrite( arch );
+            GetInvOrdApellidos( arch, n );
+            if reabrir then close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure Generar90Ord( var arch: text );
+
+       begin
+            rewrite( arch );
+            GenerarOrd( arch, 900, false );
+            GenerarRND( arch, 100, false );
+            close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure Generar90OrdDec( var arch: text );
+
+       begin
+            rewrite( arch );
+            GenerarOrdDec( arch, 900, false );
+            GenerarRND( arch, 100, false );
+            close( arch );
+       end;
+
+    (*********************************************************)
+
+    var { procedure MenuGenerar }
+       tecla: char;
+
+    begin
+         clrscr;
+         textcolor( Yellow );
+         gotoxy( 19, 3 );
+         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+         gotoxy( 19, 4 );
+         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+         textcolor( LightCyan );
+         gotoxy( 1, 7 );
+         writeln( '  Generar Archivo (''DATOS.TXT''):' );
+         writeln( '  ------- ------- -------------' );
+         textcolor( LightGray );
+         writeln;
+         writeln;
+         writeln( '     1.- Con datos desordenados.' );
+         writeln( '     2.- Con datos en orden creciente (APELLIDO, DNI).' );
+         writeln( '     3.- Con datos en orden decreciente (APELLIDO, DNI).' );
+         writeln( '     4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );
+         writeln( '     5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );
+         writeln( '     0.- Men£ Anterior.' );
+         gotoxy( 1, 20 );
+         textcolor( White );
+         write( '  Ingrese su opci¢n: ' );
+         textcolor( Yellow );
+         tecla := readkey;
+         while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do
+           begin
+                textcolor( White );
+                gotoxy( 1, 20 );
+                write( '  Ingrese su opci¢n (1 a 5 o 0): ' );
+                textcolor( Yellow );
+                tecla := readkey;
+           end;
+         case tecla of
+            '1': GenerarRND( arch, 1000, true );
+            '2': GenerarOrd( arch, 1000, true );
+            '3': GenerarOrdDec( arch, 1000, true );
+            '4': Generar90Ord( arch );
+            '5': Generar90OrdDec( arch );
+            '0': ;
+         end;
+    end; { procedure MenuGenerar }
+
+(*********************************************************)
+
+ procedure PantallaSalida;
+
+    begin
+         writeln;
+         NormVideo;
+         clrscr;
+         writeln;
+         textcolor( white );
+         writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n ', VERSION, ' <-o-o-> Luca - Soft' );
+         NormVideo;
+         writeln( '  Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );
+         writeln( '  Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );
+         writeln;
+         textcolor( LightMagenta );
+         write( '                lluca@cnba.uba.ar' );
+         NormVideo;
+         write( '   o   ' );
+         textcolor( LightMagenta );
+         writeln( 'lluca@geocities.com' );
+         NormVideo;
+         writeln;
+         writeln( '  (c) 1999 - Todos los derechos reservados.' );
+         delay( 750 );
+    end;
+
+(*********************************************************)
+
+var { programa }
+    datos: TABLA;
+    arch: text;
+    tecla: char;
+    salir: boolean;
+
+begin
+     randomize;
+     assign( arch, 'DATOS.TXT' );
+     salir := false;
+     textbackground( Blue );
+
+     while not salir do
+       begin
+            clrscr;
+            textcolor( Yellow );
+            gotoxy( 19, 3 );
+            writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+            gotoxy( 19, 4 );
+            writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+            gotoxy( 1, 7 );
+            textcolor( LightCyan );
+            writeln( '  Men£ Principal:' );
+            writeln( '  ---- ---------' );
+            textcolor( LightGray );
+            writeln;
+            writeln;
+            writeln( '     1.- Generar Archivo (''DATOS.TXT'').' );
+            writeln( '     2.- Evaluar Algoritmos.' );
+            writeln( '     0.- Salir.' );
+            gotoxy( 1, 20 );
+            textcolor( White );
+            write( '  Ingrese su opci¢n: ' );
+            textcolor( Yellow );
+            tecla := readkey;
+            while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
+              begin
+                   textcolor( White );
+                   gotoxy( 1, 20 );
+                   write( '  Ingrese su opci¢n (1, 2 o 0): ' );
+                   textcolor( Yellow );
+                   tecla := readkey;
+              end;
+            case tecla of
+                 '1': MenuGenerar( arch );
+                 '2': MenuEvaluar( datos, arch );
+                 '0': salir := true;
+            end;
+       end;
+     PantallaSalida;
 end.
\ No newline at end of file
 end.
\ No newline at end of file
index 9edf442e587029246d38eecaafd3a1e2f532567d..2d2599835e3a42e1cd1bcf74568572d4c464a8d6 100644 (file)
-program Generador_De_Nombres_Ordenados_Alfabeticamente;\r
-\r
-uses\r
-    CRT;\r
-\r
-const\r
-     MAX_APE = 15;\r
-\r
-type\r
-    APELLIDO = string[MAX_APE];\r
-    DOCUMENTO = 10000000..40000000;\r
-    PERSONA = record\r
-                    ap: APELLIDO;\r
-                    dni: DOCUMENTO;\r
-              end;\r
-    TABLA = array[1..1000] of PERSONA;\r
-    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );\r
-    TIPO_VOCAL = ( TV_AEIOU, TV_EI );\r
-    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );\r
-\r
-(*********************************************************)\r
-\r
- function GetVocal( tipo: TIPO_VOCAL ): char;\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        if tipo = TV_AEIOU then valor := random( 16 )\r
-                           else valor := random( 6 ) + 5;\r
-        case valor of\r
-            0..4: GetVocal := 'A';\r
-            5..7: GetVocal := 'E';\r
-            8..10: GetVocal := 'I';\r
-            11..13: GetVocal := 'O';\r
-            14..15: GetVocal := 'U';\r
-        end;\r
-   end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-    begin\r
-        case indic of\r
-            I_ESQ:\r
-                  begin\r
-                       vocal := 'U';\r
-                       indic := I_ESQU;\r
-                       proxl := TL_VOCAL;\r
-                  end;\r
-            I_ESQU:\r
-                   begin\r
-                        vocal := GetVocal( TV_EI );\r
-                        indic := I_NADA;\r
-                        proxl := TL_CONSO;\r
-                   end;\r
-            else\r
-              begin\r
-                   vocal := GetVocal( TV_AEIOU );\r
-                   indic := I_NADA;\r
-                   if random( 40 ) = 0 then proxl := TL_VOCAL\r
-                                       else proxl := TL_CONSO;\r
-              end;\r
-            end;\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        proxl := TL_VOCAL;\r
-        indic := I_NADA;\r
-\r
-        case indic of\r
-            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';\r
-            I_ESB: case random( 2 ) of\r
-                       0: conso := 'R';\r
-                       1: conso := 'L';\r
-                   end;\r
-            I_ESC: case random( 4 ) of\r
-                       0: conso := 'C';\r
-                       1: conso := 'H';\r
-                       2: conso := 'R';\r
-                       3: conso := 'L';\r
-                   end;\r
-            I_ESL: case random( 6 ) of\r
-                       0: conso := 'T';\r
-                       1..5: conso := 'L';\r
-                   end;\r
-            I_ESM: case random( 3 ) of\r
-                       0: conso := 'P';\r
-                       1: conso := 'B';\r
-                       2: conso := 'L';\r
-                   end;\r
-            I_ESN: case random( 3 ) of\r
-                            0: conso := 'R';\r
-                            1: conso := 'V';\r
-                            2: conso := 'C';\r
-                   end;\r
-            else case random( 55 ) of\r
-                    0..3: begin\r
-                               conso := 'B';\r
-                               if random( 10 ) = 0 then begin\r
-                                                             indic := I_ESB;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    4..7: begin\r
-                               conso := 'C';\r
-                               if random( 5 ) = 0 then begin\r
-                                                             indic := I_ESC;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    8..11: conso := 'D';\r
-                    12..14: begin\r
-                               conso := 'F';\r
-                               if random( 10 ) = 0 then begin\r
-                                                             indic := I_ESF;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                            end;\r
-                    15..17: begin\r
-                               conso := 'G';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESG;\r
-                                      if random( 4 ) = 0 then proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    18..19: conso := 'H';\r
-                    20..22: conso := 'J';\r
-                    23..24: conso := 'K';\r
-                    25..27: begin\r
-                               conso := 'L';\r
-                               if random( 15 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESL;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    28..30: begin\r
-                               conso := 'M';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESM;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    31..33: begin\r
-                               conso := 'N';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESN;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    34..36: conso := 'P';\r
-                    37..38: begin\r
-                               conso := 'Q';\r
-                               indic := I_ESQ;\r
-                            end;\r
-                    39..41: begin\r
-                               conso := 'R';\r
-                               if random( 3 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESR;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    42..44: conso := 'S';\r
-                    45..47: begin\r
-                               conso := 'T';\r
-                               if random( 10 ) = 0 then\r
-                                 begin\r
-                                      indic := I_EST;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    48..50: conso := 'V';\r
-                    51: conso := 'W';\r
-                    52: conso := 'X';\r
-                    53: conso := 'Y';\r
-                    54: conso := 'Z';\r
-                 end; { case random( 55 ) of }\r
-\r
-        end; { case indic of }\r
-   end; { procedimiento }\r
-\r
-(*********************************************************)\r
-\r
- function GetRNDApellido( max, min: integer ): APELLIDO;\r
-\r
-    var\r
-       tam, i: integer;\r
-       aux: char;\r
-       apel: APELLIDO;\r
-       indic: INDICADOR;\r
-       proxl: TIPO_LETRA;\r
-\r
-    begin\r
-         if max > MAX_APE then max := MAX_APE;\r
-         tam := random( max + 1 ) + min;\r
-         indic := I_NADA;\r
-         apel := '';\r
-         if random( 5 ) = 0 then proxl := TL_VOCAL\r
-                            else proxl := TL_CONSO;\r
-         for i := 1 to tam do\r
-           begin\r
-                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )\r
-                                    else GetRNDVocal( indic, proxl, aux );\r
-                apel := apel + aux;\r
-           end;\r
-         GetRNDApellido := apel;\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
- function GetRNDLetra( min, max: char ): char;\r
-\r
-    begin\r
-         GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );\r
-    end;\r
-\r
-\r
-(*********************************************************)\r
- procedure GetInvOrdApellidos( var ar: text; cant: integer );\r
-\r
-    var\r
-        mil: boolean;\r
-        letra, letra1: char;\r
-        i, j, veces: integer;\r
-        dni: DOCUMENTO;\r
-        ap, ape, apel: APELLIDO;\r
-\r
-    begin\r
-         mil := false;\r
-         if cant = 1000 then mil := true;\r
-         dni := 34000000 + (random( 15000 ) * 100);\r
-         ap := '';\r
-         ape := '';\r
-         apel := '';\r
-         for letra := 'Z' downto 'A' do\r
-           begin\r
-                ap := letra;\r
-                for letra1 := 'Z' downto 'A' do\r
-                   begin\r
-                        if mil then\r
-                           case letra of\r
-                                'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':\r
-                                     case letra1 of\r
-                                          'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;\r
-                                          else veces := 1;\r
-                                     end;\r
-                                else case letra1 of\r
-                                          'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;\r
-                                          else veces := 1;\r
-                                     end;\r
-                           end\r
-                        else\r
-                           case letra of\r
-                                'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':\r
-                                     case letra1 of\r
-                                          'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;\r
-                                          else veces := 1;\r
-                                     end;\r
-                                else case letra1 of\r
-                                          'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;\r
-                                          else veces := 1;\r
-                                     end;\r
-                           end;\r
-                        ape := ap + letra1;\r
-                        for j := 1 to veces do\r
-                            begin\r
-                                 if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )\r
-                                          else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );\r
-                                 dni := dni - random( 50000 ) - 1;\r
-                                 writeln( ar, apel );\r
-                                 writeln( ar, dni );\r
-                                 writeln( ar );\r
-                                 apel := '';\r
-                            end;\r
-\r
-                        ape := '';\r
-\r
-                   end; { for letra1 := 'A' to 'Z' do }\r
-\r
-                ap := '';\r
-\r
-           end; { for letra := 'A' to 'Z' do }\r
-\r
-    end; { procedure }\r
-\r
-(*********************************************************)\r
-\r
-var\r
-   datos: TABLA;\r
-   arch: text;\r
-   dni: DOCUMENTO;\r
-   i, n: integer;\r
-\r
-begin\r
-     randomize;\r
-\r
-     n := 1000;\r
-     assign( arch, 'DATOS.TXT' );\r
-     rewrite( arch );\r
-     readln( n );\r
-     GetInvOrdApellidos( arch, n );\r
-     close( arch );\r
+program Generador_De_Nombres_Ordenados_Alfabeticamente;
+
+uses
+    CRT;
+
+const
+     MAX_APE = 15;
+
+type
+    APELLIDO = string[MAX_APE];
+    DOCUMENTO = 10000000..40000000;
+    PERSONA = record
+                    ap: APELLIDO;
+                    dni: DOCUMENTO;
+              end;
+    TABLA = array[1..1000] of PERSONA;
+    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
+    TIPO_VOCAL = ( TV_AEIOU, TV_EI );
+    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
+
+(*********************************************************)
+
+ function GetVocal( tipo: TIPO_VOCAL ): char;
+
+   var
+      valor: integer;
+
+   begin
+        if tipo = TV_AEIOU then valor := random( 16 )
+                           else valor := random( 6 ) + 5;
+        case valor of
+            0..4: GetVocal := 'A';
+            5..7: GetVocal := 'E';
+            8..10: GetVocal := 'I';
+            11..13: GetVocal := 'O';
+            14..15: GetVocal := 'U';
+        end;
+   end;
+
+(*********************************************************)
+
+ procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
+
+   var
+      valor: integer;
+
+    begin
+        case indic of
+            I_ESQ:
+                  begin
+                       vocal := 'U';
+                       indic := I_ESQU;
+                       proxl := TL_VOCAL;
+                  end;
+            I_ESQU:
+                   begin
+                        vocal := GetVocal( TV_EI );
+                        indic := I_NADA;
+                        proxl := TL_CONSO;
+                   end;
+            else
+              begin
+                   vocal := GetVocal( TV_AEIOU );
+                   indic := I_NADA;
+                   if random( 40 ) = 0 then proxl := TL_VOCAL
+                                       else proxl := TL_CONSO;
+              end;
+            end;
+    end;
+
+(*********************************************************)
+
+ procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
+
+   var
+      valor: integer;
+
+   begin
+        proxl := TL_VOCAL;
+        indic := I_NADA;
+
+        case indic of
+            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
+            I_ESB: case random( 2 ) of
+                       0: conso := 'R';
+                       1: conso := 'L';
+                   end;
+            I_ESC: case random( 4 ) of
+                       0: conso := 'C';
+                       1: conso := 'H';
+                       2: conso := 'R';
+                       3: conso := 'L';
+                   end;
+            I_ESL: case random( 6 ) of
+                       0: conso := 'T';
+                       1..5: conso := 'L';
+                   end;
+            I_ESM: case random( 3 ) of
+                       0: conso := 'P';
+                       1: conso := 'B';
+                       2: conso := 'L';
+                   end;
+            I_ESN: case random( 3 ) of
+                            0: conso := 'R';
+                            1: conso := 'V';
+                            2: conso := 'C';
+                   end;
+            else case random( 55 ) of
+                    0..3: begin
+                               conso := 'B';
+                               if random( 10 ) = 0 then begin
+                                                             indic := I_ESB;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    4..7: begin
+                               conso := 'C';
+                               if random( 5 ) = 0 then begin
+                                                             indic := I_ESC;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    8..11: conso := 'D';
+                    12..14: begin
+                               conso := 'F';
+                               if random( 10 ) = 0 then begin
+                                                             indic := I_ESF;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                            end;
+                    15..17: begin
+                               conso := 'G';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESG;
+                                      if random( 4 ) = 0 then proxl := TL_CONSO;
+                                 end;
+                            end;
+                    18..19: conso := 'H';
+                    20..22: conso := 'J';
+                    23..24: conso := 'K';
+                    25..27: begin
+                               conso := 'L';
+                               if random( 15 ) = 0 then
+                                 begin
+                                      indic := I_ESL;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    28..30: begin
+                               conso := 'M';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESM;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    31..33: begin
+                               conso := 'N';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESN;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    34..36: conso := 'P';
+                    37..38: begin
+                               conso := 'Q';
+                               indic := I_ESQ;
+                            end;
+                    39..41: begin
+                               conso := 'R';
+                               if random( 3 ) = 0 then
+                                 begin
+                                      indic := I_ESR;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    42..44: conso := 'S';
+                    45..47: begin
+                               conso := 'T';
+                               if random( 10 ) = 0 then
+                                 begin
+                                      indic := I_EST;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    48..50: conso := 'V';
+                    51: conso := 'W';
+                    52: conso := 'X';
+                    53: conso := 'Y';
+                    54: conso := 'Z';
+                 end; { case random( 55 ) of }
+
+        end; { case indic of }
+   end; { procedimiento }
+
+(*********************************************************)
+
+ function GetRNDApellido( max, min: integer ): APELLIDO;
+
+    var
+       tam, i: integer;
+       aux: char;
+       apel: APELLIDO;
+       indic: INDICADOR;
+       proxl: TIPO_LETRA;
+
+    begin
+         if max > MAX_APE then max := MAX_APE;
+         tam := random( max + 1 ) + min;
+         indic := I_NADA;
+         apel := '';
+         if random( 5 ) = 0 then proxl := TL_VOCAL
+                            else proxl := TL_CONSO;
+         for i := 1 to tam do
+           begin
+                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
+                                    else GetRNDVocal( indic, proxl, aux );
+                apel := apel + aux;
+           end;
+         GetRNDApellido := apel;
+    end;
+
+(*********************************************************)
+
+ function GetRNDLetra( min, max: char ): char;
+
+    begin
+         GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
+    end;
+
+
+(*********************************************************)
+ procedure GetInvOrdApellidos( var ar: text; cant: integer );
+
+    var
+        mil: boolean;
+        letra, letra1: char;
+        i, j, veces: integer;
+        dni: DOCUMENTO;
+        ap, ape, apel: APELLIDO;
+
+    begin
+         mil := false;
+         if cant = 1000 then mil := true;
+         dni := 34000000 + (random( 15000 ) * 100);
+         ap := '';
+         ape := '';
+         apel := '';
+         for letra := 'Z' downto 'A' do
+           begin
+                ap := letra;
+                for letra1 := 'Z' downto 'A' do
+                   begin
+                        if mil then
+                           case letra of
+                                'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
+                                     case letra1 of
+                                          'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
+                                          else veces := 1;
+                                     end;
+                                else case letra1 of
+                                          'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
+                                          else veces := 1;
+                                     end;
+                           end
+                        else
+                           case letra of
+                                'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
+                                     case letra1 of
+                                          'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
+                                          else veces := 1;
+                                     end;
+                                else case letra1 of
+                                          'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
+                                          else veces := 1;
+                                     end;
+                           end;
+                        ape := ap + letra1;
+                        for j := 1 to veces do
+                            begin
+                                 if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
+                                          else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
+                                 dni := dni - random( 50000 ) - 1;
+                                 writeln( ar, apel );
+                                 writeln( ar, dni );
+                                 writeln( ar );
+                                 apel := '';
+                            end;
+
+                        ape := '';
+
+                   end; { for letra1 := 'A' to 'Z' do }
+
+                ap := '';
+
+           end; { for letra := 'A' to 'Z' do }
+
+    end; { procedure }
+
+(*********************************************************)
+
+var
+   datos: TABLA;
+   arch: text;
+   dni: DOCUMENTO;
+   i, n: integer;
+
+begin
+     randomize;
+
+     n := 1000;
+     assign( arch, 'DATOS.TXT' );
+     rewrite( arch );
+     readln( n );
+     GetInvOrdApellidos( arch, n );
+     close( arch );
 end.
\ No newline at end of file
 end.
\ No newline at end of file
index 945994aa4ce17f4340fe0941882fd45c35c574f3..77b76418500801f1a6df66fb9357ba24f5b719dc 100644 (file)
-program Generador_De_Nombres_Ordenados_Alfabeticamente;\r
-\r
-uses\r
-    CRT;\r
-\r
-const\r
-     MAX_APE = 15;\r
-\r
-type\r
-    APELLIDO = string[MAX_APE];\r
-    DOCUMENTO = 10000000..40000000;\r
-    PERSONA = record\r
-                    ap: APELLIDO;\r
-                    dni: DOCUMENTO;\r
-              end;\r
-    TABLA = array[1..1000] of PERSONA;\r
-    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );\r
-    TIPO_VOCAL = ( TV_AEIOU, TV_EI );\r
-    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );\r
-\r
-(*********************************************************)\r
-\r
- function GetVocal( tipo: TIPO_VOCAL ): char;\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        if tipo = TV_AEIOU then valor := random( 16 )\r
-                           else valor := random( 6 ) + 5;\r
-        case valor of\r
-            0..4: GetVocal := 'A';\r
-            5..7: GetVocal := 'E';\r
-            8..10: GetVocal := 'I';\r
-            11..13: GetVocal := 'O';\r
-            14..15: GetVocal := 'U';\r
-        end;\r
-   end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-    begin\r
-        case indic of\r
-            I_ESQ:\r
-                  begin\r
-                       vocal := 'U';\r
-                       indic := I_ESQU;\r
-                       proxl := TL_VOCAL;\r
-                  end;\r
-            I_ESQU:\r
-                   begin\r
-                        vocal := GetVocal( TV_EI );\r
-                        indic := I_NADA;\r
-                        proxl := TL_CONSO;\r
-                   end;\r
-            else\r
-              begin\r
-                   vocal := GetVocal( TV_AEIOU );\r
-                   indic := I_NADA;\r
-                   if random( 40 ) = 0 then proxl := TL_VOCAL\r
-                                       else proxl := TL_CONSO;\r
-              end;\r
-            end;\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        proxl := TL_VOCAL;\r
-        indic := I_NADA;\r
-\r
-        case indic of\r
-            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';\r
-            I_ESB: case random( 2 ) of\r
-                       0: conso := 'R';\r
-                       1: conso := 'L';\r
-                   end;\r
-            I_ESC: case random( 4 ) of\r
-                       0: conso := 'C';\r
-                       1: conso := 'H';\r
-                       2: conso := 'R';\r
-                       3: conso := 'L';\r
-                   end;\r
-            I_ESL: case random( 6 ) of\r
-                       0: conso := 'T';\r
-                       1..5: conso := 'L';\r
-                   end;\r
-            I_ESM: case random( 3 ) of\r
-                       0: conso := 'P';\r
-                       1: conso := 'B';\r
-                       2: conso := 'L';\r
-                   end;\r
-            I_ESN: case random( 3 ) of\r
-                            0: conso := 'R';\r
-                            1: conso := 'V';\r
-                            2: conso := 'C';\r
-                   end;\r
-            else case random( 55 ) of\r
-                    0..3: begin\r
-                               conso := 'B';\r
-                               if random( 10 ) = 0 then begin\r
-                                                             indic := I_ESB;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    4..7: begin\r
-                               conso := 'C';\r
-                               if random( 5 ) = 0 then begin\r
-                                                             indic := I_ESC;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    8..11: conso := 'D';\r
-                    12..14: begin\r
-                               conso := 'F';\r
-                               if random( 10 ) = 0 then begin\r
-                                                             indic := I_ESF;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                            end;\r
-                    15..17: begin\r
-                               conso := 'G';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESG;\r
-                                      if random( 4 ) = 0 then proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    18..19: conso := 'H';\r
-                    20..22: conso := 'J';\r
-                    23..24: conso := 'K';\r
-                    25..27: begin\r
-                               conso := 'L';\r
-                               if random( 15 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESL;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    28..30: begin\r
-                               conso := 'M';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESM;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    31..33: begin\r
-                               conso := 'N';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESN;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    34..36: conso := 'P';\r
-                    37..38: begin\r
-                               conso := 'Q';\r
-                               indic := I_ESQ;\r
-                            end;\r
-                    39..41: begin\r
-                               conso := 'R';\r
-                               if random( 3 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESR;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    42..44: conso := 'S';\r
-                    45..47: begin\r
-                               conso := 'T';\r
-                               if random( 10 ) = 0 then\r
-                                 begin\r
-                                      indic := I_EST;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    48..50: conso := 'V';\r
-                    51: conso := 'W';\r
-                    52: conso := 'X';\r
-                    53: conso := 'Y';\r
-                    54: conso := 'Z';\r
-                 end; { case random( 55 ) of }\r
-\r
-        end; { case indic of }\r
-   end; { procedimiento }\r
-\r
-(*********************************************************)\r
-\r
- function GetRNDApellido( max, min: integer ): APELLIDO;\r
-\r
-    var\r
-       tam, i: integer;\r
-       aux: char;\r
-       apel: APELLIDO;\r
-       indic: INDICADOR;\r
-       proxl: TIPO_LETRA;\r
-\r
-    begin\r
-         if max > MAX_APE then max := MAX_APE;\r
-         tam := random( max + 1 ) + min;\r
-         indic := I_NADA;\r
-         apel := '';\r
-         if random( 5 ) = 0 then proxl := TL_VOCAL\r
-                            else proxl := TL_CONSO;\r
-         for i := 1 to tam do\r
-           begin\r
-                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )\r
-                                    else GetRNDVocal( indic, proxl, aux );\r
-                apel := apel + aux;\r
-           end;\r
-         GetRNDApellido := apel;\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
- function GetRNDLetra( min, max: char ): char;\r
-\r
-    begin\r
-         GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );\r
-    end;\r
-\r
-\r
-(*********************************************************)\r
- procedure GetOrdApellidos( var ar: text; cant: integer );\r
-\r
-    var\r
-        mil: boolean;\r
-        letra, letra1: char;\r
-        i, j, veces: integer;\r
-        dni: DOCUMENTO;\r
-        ap, ape, apel: APELLIDO;\r
-\r
-    begin\r
-         mil := false;\r
-         if cant = 1000 then mil := true;\r
-         dni := 10000000 + (random( 15000 ) * 100);\r
-         ap := '';\r
-         ape := '';\r
-         apel := '';\r
-         for letra := 'A' to 'Z' do\r
-           begin\r
-                ap := letra;\r
-                for letra1 := 'A' to 'Z' do\r
-                   begin\r
-                        {\r
-                        writeln( ar, 'ciclo for letra1 := ''A'' to ''Z'' do. letra1: ', letra1 );\r
-                        }\r
-                        if mil then\r
-                           case letra of\r
-                                'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':\r
-                                     case letra1 of\r
-                                          'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;\r
-                                          else veces := 1;\r
-                                     end;\r
-                                else case letra1 of\r
-                                          'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;\r
-                                          else veces := 1;\r
-                                     end;\r
-                           end\r
-                        else\r
-                           case letra of\r
-                                'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':\r
-                                     case letra1 of\r
-                                          'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;\r
-                                          else veces := 1;\r
-                                     end;\r
-                                else case letra1 of\r
-                                          'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;\r
-                                          else veces := 1;\r
-                                     end;\r
-                           end;\r
-                        ape := ap + letra1;\r
-                        for j := 1 to veces do\r
-                            begin\r
-                                 if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )\r
-                                          else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );\r
-                                 dni := dni + random( 50000 ) + 1;\r
-                                 writeln( ar, apel );\r
-                                 writeln( ar, dni );\r
-                                 writeln( ar );\r
-                                 apel := '';\r
-\r
-                                 {writeln( ar, 'apel := NADA' );}\r
-                                 {delay( 500 );}\r
-                            end;\r
-                        ape := '';\r
-\r
-                        {writeln( ar, 'ape := NADA' );}\r
-                        {delay( 500 );}\r
-\r
-                   end; { for letra1 := 'A' to 'Z' do }\r
-\r
-                {writeln( ar, 'En AP: ', ap );}\r
-\r
-                ap := '';\r
-\r
-                {writeln( ar, 'ap := NADA' );}\r
-                {delay( 500 );}\r
-\r
-           end; { for letra := 'A' to 'Z' do }\r
-\r
-    end; { procedure }\r
-\r
-(*********************************************************)\r
-\r
-var\r
-   datos: TABLA;\r
-   arch: text;\r
-   dni: DOCUMENTO;\r
-   i, n: integer;\r
-\r
-begin\r
-     randomize;\r
-\r
-     n := 1000;\r
-     assign( arch, 'DATOS.TXT' );\r
-     rewrite( arch );\r
-     readln( n );\r
-     GetOrdApellidos( arch, n );\r
-     close( arch );\r
+program Generador_De_Nombres_Ordenados_Alfabeticamente;
+
+uses
+    CRT;
+
+const
+     MAX_APE = 15;
+
+type
+    APELLIDO = string[MAX_APE];
+    DOCUMENTO = 10000000..40000000;
+    PERSONA = record
+                    ap: APELLIDO;
+                    dni: DOCUMENTO;
+              end;
+    TABLA = array[1..1000] of PERSONA;
+    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
+    TIPO_VOCAL = ( TV_AEIOU, TV_EI );
+    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
+
+(*********************************************************)
+
+ function GetVocal( tipo: TIPO_VOCAL ): char;
+
+   var
+      valor: integer;
+
+   begin
+        if tipo = TV_AEIOU then valor := random( 16 )
+                           else valor := random( 6 ) + 5;
+        case valor of
+            0..4: GetVocal := 'A';
+            5..7: GetVocal := 'E';
+            8..10: GetVocal := 'I';
+            11..13: GetVocal := 'O';
+            14..15: GetVocal := 'U';
+        end;
+   end;
+
+(*********************************************************)
+
+ procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
+
+   var
+      valor: integer;
+
+    begin
+        case indic of
+            I_ESQ:
+                  begin
+                       vocal := 'U';
+                       indic := I_ESQU;
+                       proxl := TL_VOCAL;
+                  end;
+            I_ESQU:
+                   begin
+                        vocal := GetVocal( TV_EI );
+                        indic := I_NADA;
+                        proxl := TL_CONSO;
+                   end;
+            else
+              begin
+                   vocal := GetVocal( TV_AEIOU );
+                   indic := I_NADA;
+                   if random( 40 ) = 0 then proxl := TL_VOCAL
+                                       else proxl := TL_CONSO;
+              end;
+            end;
+    end;
+
+(*********************************************************)
+
+ procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
+
+   var
+      valor: integer;
+
+   begin
+        proxl := TL_VOCAL;
+        indic := I_NADA;
+
+        case indic of
+            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
+            I_ESB: case random( 2 ) of
+                       0: conso := 'R';
+                       1: conso := 'L';
+                   end;
+            I_ESC: case random( 4 ) of
+                       0: conso := 'C';
+                       1: conso := 'H';
+                       2: conso := 'R';
+                       3: conso := 'L';
+                   end;
+            I_ESL: case random( 6 ) of
+                       0: conso := 'T';
+                       1..5: conso := 'L';
+                   end;
+            I_ESM: case random( 3 ) of
+                       0: conso := 'P';
+                       1: conso := 'B';
+                       2: conso := 'L';
+                   end;
+            I_ESN: case random( 3 ) of
+                            0: conso := 'R';
+                            1: conso := 'V';
+                            2: conso := 'C';
+                   end;
+            else case random( 55 ) of
+                    0..3: begin
+                               conso := 'B';
+                               if random( 10 ) = 0 then begin
+                                                             indic := I_ESB;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    4..7: begin
+                               conso := 'C';
+                               if random( 5 ) = 0 then begin
+                                                             indic := I_ESC;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    8..11: conso := 'D';
+                    12..14: begin
+                               conso := 'F';
+                               if random( 10 ) = 0 then begin
+                                                             indic := I_ESF;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                            end;
+                    15..17: begin
+                               conso := 'G';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESG;
+                                      if random( 4 ) = 0 then proxl := TL_CONSO;
+                                 end;
+                            end;
+                    18..19: conso := 'H';
+                    20..22: conso := 'J';
+                    23..24: conso := 'K';
+                    25..27: begin
+                               conso := 'L';
+                               if random( 15 ) = 0 then
+                                 begin
+                                      indic := I_ESL;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    28..30: begin
+                               conso := 'M';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESM;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    31..33: begin
+                               conso := 'N';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESN;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    34..36: conso := 'P';
+                    37..38: begin
+                               conso := 'Q';
+                               indic := I_ESQ;
+                            end;
+                    39..41: begin
+                               conso := 'R';
+                               if random( 3 ) = 0 then
+                                 begin
+                                      indic := I_ESR;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    42..44: conso := 'S';
+                    45..47: begin
+                               conso := 'T';
+                               if random( 10 ) = 0 then
+                                 begin
+                                      indic := I_EST;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    48..50: conso := 'V';
+                    51: conso := 'W';
+                    52: conso := 'X';
+                    53: conso := 'Y';
+                    54: conso := 'Z';
+                 end; { case random( 55 ) of }
+
+        end; { case indic of }
+   end; { procedimiento }
+
+(*********************************************************)
+
+ function GetRNDApellido( max, min: integer ): APELLIDO;
+
+    var
+       tam, i: integer;
+       aux: char;
+       apel: APELLIDO;
+       indic: INDICADOR;
+       proxl: TIPO_LETRA;
+
+    begin
+         if max > MAX_APE then max := MAX_APE;
+         tam := random( max + 1 ) + min;
+         indic := I_NADA;
+         apel := '';
+         if random( 5 ) = 0 then proxl := TL_VOCAL
+                            else proxl := TL_CONSO;
+         for i := 1 to tam do
+           begin
+                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
+                                    else GetRNDVocal( indic, proxl, aux );
+                apel := apel + aux;
+           end;
+         GetRNDApellido := apel;
+    end;
+
+(*********************************************************)
+
+ function GetRNDLetra( min, max: char ): char;
+
+    begin
+         GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
+    end;
+
+
+(*********************************************************)
+ procedure GetOrdApellidos( var ar: text; cant: integer );
+
+    var
+        mil: boolean;
+        letra, letra1: char;
+        i, j, veces: integer;
+        dni: DOCUMENTO;
+        ap, ape, apel: APELLIDO;
+
+    begin
+         mil := false;
+         if cant = 1000 then mil := true;
+         dni := 10000000 + (random( 15000 ) * 100);
+         ap := '';
+         ape := '';
+         apel := '';
+         for letra := 'A' to 'Z' do
+           begin
+                ap := letra;
+                for letra1 := 'A' to 'Z' do
+                   begin
+                        {
+                        writeln( ar, 'ciclo for letra1 := ''A'' to ''Z'' do. letra1: ', letra1 );
+                        }
+                        if mil then
+                           case letra of
+                                'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
+                                     case letra1 of
+                                          'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
+                                          else veces := 1;
+                                     end;
+                                else case letra1 of
+                                          'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
+                                          else veces := 1;
+                                     end;
+                           end
+                        else
+                           case letra of
+                                'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
+                                     case letra1 of
+                                          'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
+                                          else veces := 1;
+                                     end;
+                                else case letra1 of
+                                          'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
+                                          else veces := 1;
+                                     end;
+                           end;
+                        ape := ap + letra1;
+                        for j := 1 to veces do
+                            begin
+                                 if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
+                                          else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
+                                 dni := dni + random( 50000 ) + 1;
+                                 writeln( ar, apel );
+                                 writeln( ar, dni );
+                                 writeln( ar );
+                                 apel := '';
+
+                                 {writeln( ar, 'apel := NADA' );}
+                                 {delay( 500 );}
+                            end;
+                        ape := '';
+
+                        {writeln( ar, 'ape := NADA' );}
+                        {delay( 500 );}
+
+                   end; { for letra1 := 'A' to 'Z' do }
+
+                {writeln( ar, 'En AP: ', ap );}
+
+                ap := '';
+
+                {writeln( ar, 'ap := NADA' );}
+                {delay( 500 );}
+
+           end; { for letra := 'A' to 'Z' do }
+
+    end; { procedure }
+
+(*********************************************************)
+
+var
+   datos: TABLA;
+   arch: text;
+   dni: DOCUMENTO;
+   i, n: integer;
+
+begin
+     randomize;
+
+     n := 1000;
+     assign( arch, 'DATOS.TXT' );
+     rewrite( arch );
+     readln( n );
+     GetOrdApellidos( arch, n );
+     close( arch );
 end.
\ No newline at end of file
 end.
\ No newline at end of file
index f6d9f8b4a2cce687c8aa48e8d2d0db312cb4a231..27bbecfc6de93bed3dce2b3d33ec79d43812342d 100644 (file)
-program RNDNames;\r
-\r
-const\r
-     MAX_APE = 15;\r
-\r
-type\r
-    APELLIDO = string[MAX_APE];\r
-    DOCUMENTO = 10000000..40000000;\r
-    PERSONA = record\r
-                    ap: APELLIDO;\r
-                    dni: DOCUMENTO;\r
-              end;\r
-    TABLA = array[1..1000] of PERSONA;\r
-    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );\r
-    TIPO_VOCAL = ( TV_AEIOU, TV_EI );\r
-    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );\r
-\r
-(*********************************************************)\r
-\r
- function GetVocal( tipo: TIPO_VOCAL ): char;\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        if tipo = TV_AEIOU then valor := random( 16 )\r
-                           else valor := random( 6 ) + 5;\r
-        case valor of\r
-            0..4: GetVocal := 'A';\r
-            5..7: GetVocal := 'E';\r
-            8..10: GetVocal := 'I';\r
-            11..13: GetVocal := 'O';\r
-            14..15: GetVocal := 'U';\r
-        end;\r
-   end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-    begin\r
-        case indic of\r
-            I_ESQ:\r
-                  begin\r
-                       vocal := 'U';\r
-                       indic := I_ESQU;\r
-                       proxl := TL_VOCAL;\r
-                  end;\r
-            I_ESQU:\r
-                   begin\r
-                        vocal := GetVocal( TV_EI );\r
-                        indic := I_NADA;\r
-                        proxl := TL_CONSO;\r
-                   end;\r
-            else\r
-              begin\r
-                   vocal := GetVocal( TV_AEIOU );\r
-                   indic := I_NADA;\r
-                   if random( 40 ) = 0 then proxl := TL_VOCAL\r
-                                       else proxl := TL_CONSO;\r
-              end;\r
-            end;\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        proxl := TL_VOCAL;\r
-        indic := I_NADA;\r
-\r
-        case indic of\r
-            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';\r
-            I_ESB: case random( 2 ) of\r
-                       0: conso := 'R';\r
-                       1: conso := 'L';\r
-                   end;\r
-            I_ESC: case random( 4 ) of\r
-                       0: conso := 'C';\r
-                       1: conso := 'H';\r
-                       2: conso := 'R';\r
-                       3: conso := 'L';\r
-                   end;\r
-            I_ESL: case random( 6 ) of\r
-                       0: conso := 'T';\r
-                       1..5: conso := 'L';\r
-                   end;\r
-            I_ESM: case random( 3 ) of\r
-                       0: conso := 'P';\r
-                       1: conso := 'B';\r
-                       2: conso := 'L';\r
-                   end;\r
-            I_ESN: case random( 3 ) of\r
-                            0: conso := 'R';\r
-                            1: conso := 'V';\r
-                            2: conso := 'C';\r
-                   end;\r
-            else case random( 55 ) of\r
-                    0..3: begin\r
-                               conso := 'B';\r
-                               if random( 10 ) = 0 then begin\r
-                                                             indic := I_ESB;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    4..7: begin\r
-                               conso := 'C';\r
-                               if random( 5 ) = 0 then begin\r
-                                                             indic := I_ESC;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    8..11: conso := 'D';\r
-                    12..14: begin\r
-                               conso := 'F';\r
-                               if random( 10 ) = 0 then begin\r
-                                                             indic := I_ESF;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                            end;\r
-                    15..17: begin\r
-                               conso := 'G';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESG;\r
-                                      if random( 4 ) = 0 then proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    18..19: conso := 'H';\r
-                    20..22: conso := 'J';\r
-                    23..24: conso := 'K';\r
-                    25..27: begin\r
-                               conso := 'L';\r
-                               if random( 15 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESL;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    28..30: begin\r
-                               conso := 'M';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESM;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    31..33: begin\r
-                               conso := 'N';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESN;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    34..36: conso := 'P';\r
-                    37..38: begin\r
-                               conso := 'Q';\r
-                               indic := I_ESQ;\r
-                            end;\r
-                    39..41: begin\r
-                               conso := 'R';\r
-                               if random( 3 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESR;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    42..44: conso := 'S';\r
-                    45..47: begin\r
-                               conso := 'T';\r
-                               if random( 10 ) = 0 then\r
-                                 begin\r
-                                      indic := I_EST;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    48..50: conso := 'V';\r
-                    51: conso := 'W';\r
-                    52: conso := 'X';\r
-                    53: conso := 'Y';\r
-                    54: conso := 'Z';\r
-                 end; { case random( 55 ) of }\r
-\r
-        end; { case indic of }\r
-   end; { procedimiento }\r
-\r
-(*********************************************************)\r
-\r
- function GetRNDApellido( max, min: integer ): APELLIDO;\r
-\r
-       var\r
-       tam, i: integer;\r
-       aux: char;\r
-       apel: APELLIDO;\r
-       indic: INDICADOR;\r
-       proxl: TIPO_LETRA;\r
-\r
-       begin\r
-         if max > MAX_APE then max := MAX_APE;\r
-         tam := random( max + 1 ) + min;\r
-         indic := I_NADA;\r
-         apel := '';\r
-         if random( 5 ) = 0 then proxl := TL_VOCAL\r
-                            else proxl := TL_CONSO;\r
-         for i := 1 to tam do\r
-           begin\r
-                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )\r
-                                    else GetRNDVocal( indic, proxl, aux );\r
-                apel := apel + aux;\r
-           end;\r
-         GetRNDApellido := apel;\r
-    end;\r
-\r
-var\r
-    n, i: integer;\r
-    arch: text;\r
-    ap: APELLIDO;\r
-    dni: DOCUMENTO;\r
-\r
-begin\r
-     randomize;\r
-     n := 1000;\r
-     assign( arch, 'DATOS.TXT' );\r
-     rewrite( arch );\r
-     dni := 10000000 + (random( 15000 ) * 100);\r
-\r
-     for i := 1 to n do\r
-        begin\r
-             ap := GetRNDApellido( 7, 4 );\r
-             dni := dni + random( 50000 ) + 1;\r
-             writeln( arch, ap );\r
-             writeln( arch, dni );\r
-             writeln( arch );\r
-        end;\r
-     close( arch );\r
-end.\r
+program RNDNames;
+
+const
+     MAX_APE = 15;
+
+type
+    APELLIDO = string[MAX_APE];
+    DOCUMENTO = 10000000..40000000;
+    PERSONA = record
+                    ap: APELLIDO;
+                    dni: DOCUMENTO;
+              end;
+    TABLA = array[1..1000] of PERSONA;
+    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
+    TIPO_VOCAL = ( TV_AEIOU, TV_EI );
+    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
+
+(*********************************************************)
+
+ function GetVocal( tipo: TIPO_VOCAL ): char;
+
+   var
+      valor: integer;
+
+   begin
+        if tipo = TV_AEIOU then valor := random( 16 )
+                           else valor := random( 6 ) + 5;
+        case valor of
+            0..4: GetVocal := 'A';
+            5..7: GetVocal := 'E';
+            8..10: GetVocal := 'I';
+            11..13: GetVocal := 'O';
+            14..15: GetVocal := 'U';
+        end;
+   end;
+
+(*********************************************************)
+
+ procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
+
+   var
+      valor: integer;
+
+    begin
+        case indic of
+            I_ESQ:
+                  begin
+                       vocal := 'U';
+                       indic := I_ESQU;
+                       proxl := TL_VOCAL;
+                  end;
+            I_ESQU:
+                   begin
+                        vocal := GetVocal( TV_EI );
+                        indic := I_NADA;
+                        proxl := TL_CONSO;
+                   end;
+            else
+              begin
+                   vocal := GetVocal( TV_AEIOU );
+                   indic := I_NADA;
+                   if random( 40 ) = 0 then proxl := TL_VOCAL
+                                       else proxl := TL_CONSO;
+              end;
+            end;
+    end;
+
+(*********************************************************)
+
+ procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
+
+   var
+      valor: integer;
+
+   begin
+        proxl := TL_VOCAL;
+        indic := I_NADA;
+
+        case indic of
+            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
+            I_ESB: case random( 2 ) of
+                       0: conso := 'R';
+                       1: conso := 'L';
+                   end;
+            I_ESC: case random( 4 ) of
+                       0: conso := 'C';
+                       1: conso := 'H';
+                       2: conso := 'R';
+                       3: conso := 'L';
+                   end;
+            I_ESL: case random( 6 ) of
+                       0: conso := 'T';
+                       1..5: conso := 'L';
+                   end;
+            I_ESM: case random( 3 ) of
+                       0: conso := 'P';
+                       1: conso := 'B';
+                       2: conso := 'L';
+                   end;
+            I_ESN: case random( 3 ) of
+                            0: conso := 'R';
+                            1: conso := 'V';
+                            2: conso := 'C';
+                   end;
+            else case random( 55 ) of
+                    0..3: begin
+                               conso := 'B';
+                               if random( 10 ) = 0 then begin
+                                                             indic := I_ESB;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    4..7: begin
+                               conso := 'C';
+                               if random( 5 ) = 0 then begin
+                                                             indic := I_ESC;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    8..11: conso := 'D';
+                    12..14: begin
+                               conso := 'F';
+                               if random( 10 ) = 0 then begin
+                                                             indic := I_ESF;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                            end;
+                    15..17: begin
+                               conso := 'G';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESG;
+                                      if random( 4 ) = 0 then proxl := TL_CONSO;
+                                 end;
+                            end;
+                    18..19: conso := 'H';
+                    20..22: conso := 'J';
+                    23..24: conso := 'K';
+                    25..27: begin
+                               conso := 'L';
+                               if random( 15 ) = 0 then
+                                 begin
+                                      indic := I_ESL;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    28..30: begin
+                               conso := 'M';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESM;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    31..33: begin
+                               conso := 'N';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESN;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    34..36: conso := 'P';
+                    37..38: begin
+                               conso := 'Q';
+                               indic := I_ESQ;
+                            end;
+                    39..41: begin
+                               conso := 'R';
+                               if random( 3 ) = 0 then
+                                 begin
+                                      indic := I_ESR;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    42..44: conso := 'S';
+                    45..47: begin
+                               conso := 'T';
+                               if random( 10 ) = 0 then
+                                 begin
+                                      indic := I_EST;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    48..50: conso := 'V';
+                    51: conso := 'W';
+                    52: conso := 'X';
+                    53: conso := 'Y';
+                    54: conso := 'Z';
+                 end; { case random( 55 ) of }
+
+        end; { case indic of }
+   end; { procedimiento }
+
+(*********************************************************)
+
+ function GetRNDApellido( max, min: integer ): APELLIDO;
+
+       var
+       tam, i: integer;
+       aux: char;
+       apel: APELLIDO;
+       indic: INDICADOR;
+       proxl: TIPO_LETRA;
+
+       begin
+         if max > MAX_APE then max := MAX_APE;
+         tam := random( max + 1 ) + min;
+         indic := I_NADA;
+         apel := '';
+         if random( 5 ) = 0 then proxl := TL_VOCAL
+                            else proxl := TL_CONSO;
+         for i := 1 to tam do
+           begin
+                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
+                                    else GetRNDVocal( indic, proxl, aux );
+                apel := apel + aux;
+           end;
+         GetRNDApellido := apel;
+    end;
+
+var
+    n, i: integer;
+    arch: text;
+    ap: APELLIDO;
+    dni: DOCUMENTO;
+
+begin
+     randomize;
+     n := 1000;
+     assign( arch, 'DATOS.TXT' );
+     rewrite( arch );
+     dni := 10000000 + (random( 15000 ) * 100);
+
+     for i := 1 to n do
+        begin
+             ap := GetRNDApellido( 7, 4 );
+             dni := dni + random( 50000 ) + 1;
+             writeln( arch, ap );
+             writeln( arch, dni );
+             writeln( arch );
+        end;
+     close( arch );
+end.
index 4b334c0de8a3711c5732dbff53d606d7b8a5a3e4..7c9d5fb63cb77eed84b7fa326b21164555e5824e 100644 (file)
-{ Updated SORTING.SWG on May 26, 1995 }\r
-\r
-{\r
->I've been programming for a couple years now, but there are certain things\r
->that you seldom just figure out on your own.  One of them is the multitude\r
->of standard sorting techniques.  I did learn these, however, in a class I\r
->took last year in Turbo Pascal.  Let's see, Bubble Sort, Selection Sort,\r
->Quick Sort..  I think that's what they were called.  Anyway, if anyone\r
->has the time and desire I'd appreciate a quick run-down of each and if\r
->possible some source for using them on a linked list.  I remember most of\r
->the code to do them on arrays, but I forget which are the most efficient\r
->for each type of data.\r
-\r
-Here is a program that I was given to demonstrate 8 different types of sorts.\r
-I don't claim to know how they work, but it does shed some light on what the\r
-best type probably is.  BTW, it can be modified to allow for a random number\r
-of sort elements (up to maxint div 10 I believe).\r
-\r
-   ALLSORT.PAS: Demonstration of various sorting methods.\r
-                Released to the public domain by Wayel A. Al-Wohaibi.\r
-\r
-   ALLSORT.PAS was written in Turbo Pascal 3.0 (but compatible with\r
-   TP6.0) while taking a pascal course in 1988. It is provided as is,\r
-   to demonstrate how sorting algorithms work. Sorry, no documentation\r
-   (didn't imagine it would be worth releasing) but bugs are included\r
-   too!\r
-\r
-   ALLSORT simply shows you how elements are rearranged in each\r
-   iteration of each of the eight popular sorting methods.\r
-}\r
-\r
-program SORTINGMETHODS;\r
-uses\r
-  Crt;\r
-\r
-const\r
-  N = 14;                              (* NO. OF DATA TO BE SORTED *)\r
-  Digits = 3;                          (* DIGITAL SIZE OF THE DATA *)\r
-  Range = 1000;                        (* RANGE FOR THE RANDOM GENERATOR *)\r
-\r
-type\r
-  ArrayType = array[1..N] of integer;\r
-  TwoDimension = array[0..9, 1..N] of integer; (* FOR RADIX SORT ONLY *)\r
-\r
-var\r
-  Data : ArrayType;\r
-  D : integer;\r
-\r
-  (*--------------------------------------------------------------------*)\r
-\r
-  procedure GetSortMethod;\r
-  begin\r
-    clrscr;\r
-    writeln;\r
-    writeln('                          CHOOSE:          ');\r
-    writeln('                                           ');\r
-    writeln('                      1 FOR SELECT SORT    ');\r
-    writeln('                      2 FOR INSERT SORT    ');\r
-    writeln('                      3 FOR BUBBLE SORT    ');\r
-    writeln('                      4 FOR SHAKE  SORT    ');\r
-    writeln('                      5 FOR HEAP   SORT    ');\r
-    writeln('                      6 FOR QUICK  SORT    ');\r
-    writeln('                      7 FOR SHELL  SORT    ');\r
-    writeln('                      8 FOR RADIX  SORT    ');\r
-    writeln('                      9 TO EXIT ALLSORT    ');\r
-    writeln('                                           ');\r
-    writeln;\r
-    readln(D)\r
-  end;\r
-\r
-  procedure LoadList;\r
-  var\r
-    I : integer;\r
-  begin\r
-    for I := 1 to N do\r
-      Data[I] := random(Range)\r
-  end;\r
-\r
-  procedure ShowInput;\r
-  var\r
-    I : integer;\r
-  begin\r
-    clrscr;\r
-    write('INPUT :');\r
-    for I := 1 to N do\r
-      write(Data[I]:5);\r
-    writeln\r
-  end;\r
-\r
-  procedure ShowOutput;\r
-  var\r
-    I : integer;\r
-  begin\r
-    write('OUTPUT:');\r
-    for I := 1 to N do\r
-      write(Data[I]:5)\r
-  end;\r
-\r
-  procedure Swap(var X, Y : integer);\r
-  var\r
-    Temp : integer;\r
-  begin\r
-    Temp := X;\r
-    X := Y;\r
-    Y := Temp\r
-  end;\r
-\r
-  (*-------------------------- R A D I X   S O R T ---------------------*)\r
-\r
-  function Hash(Number, H : integer) : integer;\r
-  begin\r
-    case H of\r
-      3 : Hash := Number mod 10;\r
-      2 : Hash := (Number mod 100) div 10;\r
-      1 : Hash := Number div 100\r
-    end\r
-  end;\r
-\r
-  procedure CleanArray(var TwoD : TwoDimension);\r
-  var\r
-    I, J : integer;\r
-  begin\r
-    for I := 0 to 9 do\r
-      for J := 1 to N do\r
-        TwoD[I, J] := 0\r
-  end;\r
-\r
-  procedure PlaceIt(var X : TwoDimension; Number, I : integer);\r
-  var\r
-    J : integer;\r
-    Empty : boolean;\r
-  begin\r
-    J := 1;\r
-    Empty := false;\r
-    repeat\r
-      if (X[I, J] > 0) then\r
-        J := J + 1\r
-      else\r
-        Empty := true;\r
-    until (Empty) or (J = N);\r
-    X[I, J] := Number\r
-  end;\r
-\r
-  procedure UnLoadIt(X : TwoDimension; var Passed : ArrayType);\r
-  var\r
-    I,\r
-    J,\r
-    K : integer;\r
-  begin\r
-    K := 1;\r
-    for I := 0 to 9 do\r
-      for J := 1 to N do\r
-        begin\r
-          if (X[I, J] > 0) then\r
-            begin\r
-              Passed[K] := X[I, J];\r
-              K := K + 1\r
-            end\r
-        end\r
-  end;\r
-\r
-  procedure RadixSort(var Pass : ArrayType; N : integer);\r
-  var\r
-    Temp : TwoDimension;\r
-    Element,\r
-    Key,\r
-    Digit,\r
-    I : integer;\r
-  begin\r
-    for Digit := Digits downto 1 do\r
-      begin\r
-        CleanArray(Temp);\r
-        for I := 1 to N do\r
-          begin\r
-            Element := Pass[I];\r
-            Key := Hash(Element, Digit);\r
-            PlaceIt(Temp, Element, Key)\r
-          end;\r
-        UnLoadIt(Temp, Pass);\r
-        ShowOutput;\r
-        readln\r
-      end\r
-  end;\r
-\r
-  (*-------------------------- H E A P   S O R T -----------------------*)\r
-\r
-  procedure ReHeapDown(var HEAPData : ArrayType; Root, Bottom : integer);\r
-  var\r
-    HeapOk : boolean;\r
-    MaxChild : integer;\r
-  begin\r
-    HeapOk := false;\r
-    while (Root * 2 <= Bottom)\r
-    and not HeapOk do\r
-      begin\r
-        if (Root * 2 = Bottom) then\r
-          MaxChild := Root * 2\r
-        else\r
-          if (HEAPData[Root * 2] > HEAPData[Root * 2 + 1]) then\r
-            MaxChild := Root * 2\r
-          else\r
-            MaxChild := Root * 2 + 1;\r
-        if (HEAPData[Root] < HEAPData[MaxChild]) then\r
-          begin\r
-            Swap(HEAPData[Root], HEAPData[MaxChild]);\r
-            Root := MaxChild\r
-          end\r
-        else\r
-          HeapOk := true\r
-      end\r
-  end;\r
-\r
-  procedure HeapSort(var Data : ArrayType; NUMElementS : integer);\r
-  var\r
-    NodeIndex : integer;\r
-  begin\r
-    for NodeIndex := (NUMElementS div 2) downto 1 do\r
-      ReHeapDown(Data, NodeIndex, NUMElementS);\r
-    for NodeIndex := NUMElementS downto 2 do\r
-      begin\r
-        Swap(Data[1], Data[NodeIndex]);\r
-        ReHeapDown(Data, 1, NodeIndex - 1);\r
-        ShowOutput;\r
-        readln;\r
-      end\r
-  end;\r
-\r
-  (*-------------------------- I N S E R T   S O R T -------------------*)\r
-\r
-  procedure StrInsert(var X : ArrayType; N : integer);\r
-  var\r
-    J,\r
-    K,\r
-    Y : integer;\r
-    Found : boolean;\r
-  begin\r
-    for J := 2 to N do\r
-      begin\r
-        Y := X[J];\r
-        K := J - 1;\r
-        Found := false;\r
-        while (K >= 1)\r
-        and (not Found) do\r
-          if (Y < X[K]) then\r
-            begin\r
-              X[K + 1] := X[K];\r
-              K := K - 1\r
-            end\r
-          else\r
-            Found := true;\r
-        X[K + 1] := Y;\r
-        ShowOutput;\r
-        readln\r
-      end\r
-   end;\r
-\r
-  (*-------------------------- S H E L L   S O R T ---------------------*)\r
-\r
-  procedure ShellSort(var A : ArrayType; N : integer);\r
-  var\r
-    Done : boolean;\r
-    Jump,\r
-    I,\r
-    J : integer;\r
-  begin\r
-    Jump := N;\r
-    while (Jump > 1) do\r
-      begin\r
-        Jump := Jump div 2;\r
-        repeat\r
-          Done := true;\r
-          for J := 1 to (N - Jump) do\r
-            begin\r
-              I := J + Jump;\r
-              if (A[J] > A[I]) then\r
-                begin\r
-                  Swap(A[J], A[I]);\r
-                  Done := false\r
-                end;\r
-            end;\r
-        until Done;\r
-        ShowOutput;\r
-        readln\r
-      end\r
-  end;\r
-\r
-  (*-------------------------- B U B B L E   S O R T -------------------*)\r
-\r
-  procedure BubbleSort(var X : ArrayType; N : integer);\r
-  var\r
-    I,\r
-    J : integer;\r
-  begin\r
-    for I := 2 to N do\r
-      begin\r
-        for J := N downto I do\r
-          if (X[J] < X[J - 1]) then\r
-            Swap(X[J - 1], X[J]);\r
-        ShowOutput;\r
-        readln\r
-      end\r
-  end;\r
-\r
-  (*-------------------------- S H A K E   S O R T ---------------------*)\r
-\r
-  procedure ShakeSort(var X : ArrayType; N : integer);\r
-  var\r
-    L,\r
-    R,\r
-    K,\r
-    J : integer;\r
-  begin\r
-    L := 2;\r
-    R := N;\r
-    K := N;\r
-    repeat\r
-      for J := R downto L do\r
-        if (X[J] < X[J - 1]) then\r
-          begin\r
-            Swap(X[J], X[J - 1]);\r
-            K := J\r
-          end;\r
-      L := K + 1;\r
-      for J := L to R do\r
-        if (X[J] < X[J - 1]) then\r
-          begin\r
-            Swap(X[J], X[J - 1]);\r
-            K := J\r
-          end;\r
-      R := K - 1;\r
-      ShowOutput;\r
-      readln;\r
-    until L >= R\r
-  end;\r
-\r
-  (*-------------------------- Q W I C K   S O R T ---------------------*)\r
-\r
-  procedure Partition(var A : ArrayType; First, Last : integer);\r
-  var\r
-    Right,\r
-    Left : integer;\r
-    V : integer;\r
-  begin\r
-    V := A[(First + Last) div 2];\r
-    Right := First;\r
-    Left := Last;\r
-    repeat\r
-      while (A[Right] < V) do\r
-        Right := Right + 1;\r
-      while (A[Left] > V) do\r
-        Left := Left - 1;\r
-      if (Right <= Left) then\r
-        begin\r
-          Swap(A[Right], A[Left]);\r
-          Right := Right + 1;\r
-          Left := Left - 1\r
-        end;\r
-    until Right > Left;\r
-    ShowOutput;\r
-    readln;\r
-    if (First < Left) then\r
-      Partition(A, First, Left);\r
-    if (Right < Last) then\r
-      Partition(A, Right, Last)\r
-  end;\r
-\r
-  procedure QuickSort(var List : ArrayType; N : integer);\r
-  var\r
-    First,\r
-    Last : integer;\r
-  begin\r
-    First := 1;\r
-    Last := N;\r
-    if (First < Last) then\r
-      Partition(List, First, Last)\r
-  end;\r
-\r
-  (*-------------------------- S E L E C T   S O R T -------------------*)\r
-\r
-  procedure StrSelectSort(var X : ArrayType; N : integer);\r
-  var\r
-    I,\r
-    J,\r
-    K,\r
-    Y : integer;\r
-  begin\r
-    for I := 1 to N - 1 do\r
-      begin\r
-        K := I;\r
-        Y := X[I];\r
-        for J := (I + 1) to N do\r
-          if (X[J] < Y) then\r
-            begin\r
-              K := J;\r
-              Y := X[J]\r
-            end;\r
-        X[K] := X[J];\r
-        X[I] := Y;\r
-        ShowOutput;\r
-        readln\r
-      end\r
-  end;\r
-\r
-  (*--------------------------------------------------------------------*)\r
-\r
-  procedure Sort;\r
-  begin\r
-    case D of\r
-      1 : StrSelectSort(Data, N);\r
-      2 : StrInsert(Data, N);\r
-      3 : BubbleSort(Data, N);\r
-      4 : ShakeSort(Data, N);\r
-      5 : HeapSort(Data, N);\r
-      6 : QuickSort(Data, N);\r
-      7 : ShellSort(Data, N);\r
-      8 : RadixSort(Data, N);\r
-    else\r
-     writeln('BAD INPUT')\r
-    end\r
-  end;\r
-\r
-  (*-------------------------------------------------------------------*)\r
-\r
-BEGIN\r
-  GetSortMethod;\r
-  while (D <> 9) do\r
-    begin\r
-      LoadList;\r
-      ShowInput;\r
-      Sort;\r
-      writeln('PRESS ENTER TO RETURN');\r
-      readln;\r
-      GetSortMethod\r
-    end\r
+{ Updated SORTING.SWG on May 26, 1995 }
+
+{
+>I've been programming for a couple years now, but there are certain things
+>that you seldom just figure out on your own.  One of them is the multitude
+>of standard sorting techniques.  I did learn these, however, in a class I
+>took last year in Turbo Pascal.  Let's see, Bubble Sort, Selection Sort,
+>Quick Sort..  I think that's what they were called.  Anyway, if anyone
+>has the time and desire I'd appreciate a quick run-down of each and if
+>possible some source for using them on a linked list.  I remember most of
+>the code to do them on arrays, but I forget which are the most efficient
+>for each type of data.
+
+Here is a program that I was given to demonstrate 8 different types of sorts.
+I don't claim to know how they work, but it does shed some light on what the
+best type probably is.  BTW, it can be modified to allow for a random number
+of sort elements (up to maxint div 10 I believe).
+
+   ALLSORT.PAS: Demonstration of various sorting methods.
+                Released to the public domain by Wayel A. Al-Wohaibi.
+
+   ALLSORT.PAS was written in Turbo Pascal 3.0 (but compatible with
+   TP6.0) while taking a pascal course in 1988. It is provided as is,
+   to demonstrate how sorting algorithms work. Sorry, no documentation
+   (didn't imagine it would be worth releasing) but bugs are included
+   too!
+
+   ALLSORT simply shows you how elements are rearranged in each
+   iteration of each of the eight popular sorting methods.
+}
+
+program SORTINGMETHODS;
+uses
+  Crt;
+
+const
+  N = 14;                              (* NO. OF DATA TO BE SORTED *)
+  Digits = 3;                          (* DIGITAL SIZE OF THE DATA *)
+  Range = 1000;                        (* RANGE FOR THE RANDOM GENERATOR *)
+
+type
+  ArrayType = array[1..N] of integer;
+  TwoDimension = array[0..9, 1..N] of integer; (* FOR RADIX SORT ONLY *)
+
+var
+  Data : ArrayType;
+  D : integer;
+
+  (*--------------------------------------------------------------------*)
+
+  procedure GetSortMethod;
+  begin
+    clrscr;
+    writeln;
+    writeln('                          CHOOSE:          ');
+    writeln('                                           ');
+    writeln('                      1 FOR SELECT SORT    ');
+    writeln('                      2 FOR INSERT SORT    ');
+    writeln('                      3 FOR BUBBLE SORT    ');
+    writeln('                      4 FOR SHAKE  SORT    ');
+    writeln('                      5 FOR HEAP   SORT    ');
+    writeln('                      6 FOR QUICK  SORT    ');
+    writeln('                      7 FOR SHELL  SORT    ');
+    writeln('                      8 FOR RADIX  SORT    ');
+    writeln('                      9 TO EXIT ALLSORT    ');
+    writeln('                                           ');
+    writeln;
+    readln(D)
+  end;
+
+  procedure LoadList;
+  var
+    I : integer;
+  begin
+    for I := 1 to N do
+      Data[I] := random(Range)
+  end;
+
+  procedure ShowInput;
+  var
+    I : integer;
+  begin
+    clrscr;
+    write('INPUT :');
+    for I := 1 to N do
+      write(Data[I]:5);
+    writeln
+  end;
+
+  procedure ShowOutput;
+  var
+    I : integer;
+  begin
+    write('OUTPUT:');
+    for I := 1 to N do
+      write(Data[I]:5)
+  end;
+
+  procedure Swap(var X, Y : integer);
+  var
+    Temp : integer;
+  begin
+    Temp := X;
+    X := Y;
+    Y := Temp
+  end;
+
+  (*-------------------------- R A D I X   S O R T ---------------------*)
+
+  function Hash(Number, H : integer) : integer;
+  begin
+    case H of
+      3 : Hash := Number mod 10;
+      2 : Hash := (Number mod 100) div 10;
+      1 : Hash := Number div 100
+    end
+  end;
+
+  procedure CleanArray(var TwoD : TwoDimension);
+  var
+    I, J : integer;
+  begin
+    for I := 0 to 9 do
+      for J := 1 to N do
+        TwoD[I, J] := 0
+  end;
+
+  procedure PlaceIt(var X : TwoDimension; Number, I : integer);
+  var
+    J : integer;
+    Empty : boolean;
+  begin
+    J := 1;
+    Empty := false;
+    repeat
+      if (X[I, J] > 0) then
+        J := J + 1
+      else
+        Empty := true;
+    until (Empty) or (J = N);
+    X[I, J] := Number
+  end;
+
+  procedure UnLoadIt(X : TwoDimension; var Passed : ArrayType);
+  var
+    I,
+    J,
+    K : integer;
+  begin
+    K := 1;
+    for I := 0 to 9 do
+      for J := 1 to N do
+        begin
+          if (X[I, J] > 0) then
+            begin
+              Passed[K] := X[I, J];
+              K := K + 1
+            end
+        end
+  end;
+
+  procedure RadixSort(var Pass : ArrayType; N : integer);
+  var
+    Temp : TwoDimension;
+    Element,
+    Key,
+    Digit,
+    I : integer;
+  begin
+    for Digit := Digits downto 1 do
+      begin
+        CleanArray(Temp);
+        for I := 1 to N do
+          begin
+            Element := Pass[I];
+            Key := Hash(Element, Digit);
+            PlaceIt(Temp, Element, Key)
+          end;
+        UnLoadIt(Temp, Pass);
+        ShowOutput;
+        readln
+      end
+  end;
+
+  (*-------------------------- H E A P   S O R T -----------------------*)
+
+  procedure ReHeapDown(var HEAPData : ArrayType; Root, Bottom : integer);
+  var
+    HeapOk : boolean;
+    MaxChild : integer;
+  begin
+    HeapOk := false;
+    while (Root * 2 <= Bottom)
+    and not HeapOk do
+      begin
+        if (Root * 2 = Bottom) then
+          MaxChild := Root * 2
+        else
+          if (HEAPData[Root * 2] > HEAPData[Root * 2 + 1]) then
+            MaxChild := Root * 2
+          else
+            MaxChild := Root * 2 + 1;
+        if (HEAPData[Root] < HEAPData[MaxChild]) then
+          begin
+            Swap(HEAPData[Root], HEAPData[MaxChild]);
+            Root := MaxChild
+          end
+        else
+          HeapOk := true
+      end
+  end;
+
+  procedure HeapSort(var Data : ArrayType; NUMElementS : integer);
+  var
+    NodeIndex : integer;
+  begin
+    for NodeIndex := (NUMElementS div 2) downto 1 do
+      ReHeapDown(Data, NodeIndex, NUMElementS);
+    for NodeIndex := NUMElementS downto 2 do
+      begin
+        Swap(Data[1], Data[NodeIndex]);
+        ReHeapDown(Data, 1, NodeIndex - 1);
+        ShowOutput;
+        readln;
+      end
+  end;
+
+  (*-------------------------- I N S E R T   S O R T -------------------*)
+
+  procedure StrInsert(var X : ArrayType; N : integer);
+  var
+    J,
+    K,
+    Y : integer;
+    Found : boolean;
+  begin
+    for J := 2 to N do
+      begin
+        Y := X[J];
+        K := J - 1;
+        Found := false;
+        while (K >= 1)
+        and (not Found) do
+          if (Y < X[K]) then
+            begin
+              X[K + 1] := X[K];
+              K := K - 1
+            end
+          else
+            Found := true;
+        X[K + 1] := Y;
+        ShowOutput;
+        readln
+      end
+   end;
+
+  (*-------------------------- S H E L L   S O R T ---------------------*)
+
+  procedure ShellSort(var A : ArrayType; N : integer);
+  var
+    Done : boolean;
+    Jump,
+    I,
+    J : integer;
+  begin
+    Jump := N;
+    while (Jump > 1) do
+      begin
+        Jump := Jump div 2;
+        repeat
+          Done := true;
+          for J := 1 to (N - Jump) do
+            begin
+              I := J + Jump;
+              if (A[J] > A[I]) then
+                begin
+                  Swap(A[J], A[I]);
+                  Done := false
+                end;
+            end;
+        until Done;
+        ShowOutput;
+        readln
+      end
+  end;
+
+  (*-------------------------- B U B B L E   S O R T -------------------*)
+
+  procedure BubbleSort(var X : ArrayType; N : integer);
+  var
+    I,
+    J : integer;
+  begin
+    for I := 2 to N do
+      begin
+        for J := N downto I do
+          if (X[J] < X[J - 1]) then
+            Swap(X[J - 1], X[J]);
+        ShowOutput;
+        readln
+      end
+  end;
+
+  (*-------------------------- S H A K E   S O R T ---------------------*)
+
+  procedure ShakeSort(var X : ArrayType; N : integer);
+  var
+    L,
+    R,
+    K,
+    J : integer;
+  begin
+    L := 2;
+    R := N;
+    K := N;
+    repeat
+      for J := R downto L do
+        if (X[J] < X[J - 1]) then
+          begin
+            Swap(X[J], X[J - 1]);
+            K := J
+          end;
+      L := K + 1;
+      for J := L to R do
+        if (X[J] < X[J - 1]) then
+          begin
+            Swap(X[J], X[J - 1]);
+            K := J
+          end;
+      R := K - 1;
+      ShowOutput;
+      readln;
+    until L >= R
+  end;
+
+  (*-------------------------- Q W I C K   S O R T ---------------------*)
+
+  procedure Partition(var A : ArrayType; First, Last : integer);
+  var
+    Right,
+    Left : integer;
+    V : integer;
+  begin
+    V := A[(First + Last) div 2];
+    Right := First;
+    Left := Last;
+    repeat
+      while (A[Right] < V) do
+        Right := Right + 1;
+      while (A[Left] > V) do
+        Left := Left - 1;
+      if (Right <= Left) then
+        begin
+          Swap(A[Right], A[Left]);
+          Right := Right + 1;
+          Left := Left - 1
+        end;
+    until Right > Left;
+    ShowOutput;
+    readln;
+    if (First < Left) then
+      Partition(A, First, Left);
+    if (Right < Last) then
+      Partition(A, Right, Last)
+  end;
+
+  procedure QuickSort(var List : ArrayType; N : integer);
+  var
+    First,
+    Last : integer;
+  begin
+    First := 1;
+    Last := N;
+    if (First < Last) then
+      Partition(List, First, Last)
+  end;
+
+  (*-------------------------- S E L E C T   S O R T -------------------*)
+
+  procedure StrSelectSort(var X : ArrayType; N : integer);
+  var
+    I,
+    J,
+    K,
+    Y : integer;
+  begin
+    for I := 1 to N - 1 do
+      begin
+        K := I;
+        Y := X[I];
+        for J := (I + 1) to N do
+          if (X[J] < Y) then
+            begin
+              K := J;
+              Y := X[J]
+            end;
+        X[K] := X[J];
+        X[I] := Y;
+        ShowOutput;
+        readln
+      end
+  end;
+
+  (*--------------------------------------------------------------------*)
+
+  procedure Sort;
+  begin
+    case D of
+      1 : StrSelectSort(Data, N);
+      2 : StrInsert(Data, N);
+      3 : BubbleSort(Data, N);
+      4 : ShakeSort(Data, N);
+      5 : HeapSort(Data, N);
+      6 : QuickSort(Data, N);
+      7 : ShellSort(Data, N);
+      8 : RadixSort(Data, N);
+    else
+     writeln('BAD INPUT')
+    end
+  end;
+
+  (*-------------------------------------------------------------------*)
+
+BEGIN
+  GetSortMethod;
+  while (D <> 9) do
+    begin
+      LoadList;
+      ShowInput;
+      Sort;
+      writeln('PRESS ENTER TO RETURN');
+      readln;
+      GetSortMethod
+    end
 END.
\ No newline at end of file
 END.
\ No newline at end of file
index f6d9f8b4a2cce687c8aa48e8d2d0db312cb4a231..27bbecfc6de93bed3dce2b3d33ec79d43812342d 100644 (file)
-program RNDNames;\r
-\r
-const\r
-     MAX_APE = 15;\r
-\r
-type\r
-    APELLIDO = string[MAX_APE];\r
-    DOCUMENTO = 10000000..40000000;\r
-    PERSONA = record\r
-                    ap: APELLIDO;\r
-                    dni: DOCUMENTO;\r
-              end;\r
-    TABLA = array[1..1000] of PERSONA;\r
-    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );\r
-    TIPO_VOCAL = ( TV_AEIOU, TV_EI );\r
-    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );\r
-\r
-(*********************************************************)\r
-\r
- function GetVocal( tipo: TIPO_VOCAL ): char;\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        if tipo = TV_AEIOU then valor := random( 16 )\r
-                           else valor := random( 6 ) + 5;\r
-        case valor of\r
-            0..4: GetVocal := 'A';\r
-            5..7: GetVocal := 'E';\r
-            8..10: GetVocal := 'I';\r
-            11..13: GetVocal := 'O';\r
-            14..15: GetVocal := 'U';\r
-        end;\r
-   end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-    begin\r
-        case indic of\r
-            I_ESQ:\r
-                  begin\r
-                       vocal := 'U';\r
-                       indic := I_ESQU;\r
-                       proxl := TL_VOCAL;\r
-                  end;\r
-            I_ESQU:\r
-                   begin\r
-                        vocal := GetVocal( TV_EI );\r
-                        indic := I_NADA;\r
-                        proxl := TL_CONSO;\r
-                   end;\r
-            else\r
-              begin\r
-                   vocal := GetVocal( TV_AEIOU );\r
-                   indic := I_NADA;\r
-                   if random( 40 ) = 0 then proxl := TL_VOCAL\r
-                                       else proxl := TL_CONSO;\r
-              end;\r
-            end;\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        proxl := TL_VOCAL;\r
-        indic := I_NADA;\r
-\r
-        case indic of\r
-            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';\r
-            I_ESB: case random( 2 ) of\r
-                       0: conso := 'R';\r
-                       1: conso := 'L';\r
-                   end;\r
-            I_ESC: case random( 4 ) of\r
-                       0: conso := 'C';\r
-                       1: conso := 'H';\r
-                       2: conso := 'R';\r
-                       3: conso := 'L';\r
-                   end;\r
-            I_ESL: case random( 6 ) of\r
-                       0: conso := 'T';\r
-                       1..5: conso := 'L';\r
-                   end;\r
-            I_ESM: case random( 3 ) of\r
-                       0: conso := 'P';\r
-                       1: conso := 'B';\r
-                       2: conso := 'L';\r
-                   end;\r
-            I_ESN: case random( 3 ) of\r
-                            0: conso := 'R';\r
-                            1: conso := 'V';\r
-                            2: conso := 'C';\r
-                   end;\r
-            else case random( 55 ) of\r
-                    0..3: begin\r
-                               conso := 'B';\r
-                               if random( 10 ) = 0 then begin\r
-                                                             indic := I_ESB;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    4..7: begin\r
-                               conso := 'C';\r
-                               if random( 5 ) = 0 then begin\r
-                                                             indic := I_ESC;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    8..11: conso := 'D';\r
-                    12..14: begin\r
-                               conso := 'F';\r
-                               if random( 10 ) = 0 then begin\r
-                                                             indic := I_ESF;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                            end;\r
-                    15..17: begin\r
-                               conso := 'G';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESG;\r
-                                      if random( 4 ) = 0 then proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    18..19: conso := 'H';\r
-                    20..22: conso := 'J';\r
-                    23..24: conso := 'K';\r
-                    25..27: begin\r
-                               conso := 'L';\r
-                               if random( 15 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESL;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    28..30: begin\r
-                               conso := 'M';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESM;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    31..33: begin\r
-                               conso := 'N';\r
-                               if random( 5 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESN;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    34..36: conso := 'P';\r
-                    37..38: begin\r
-                               conso := 'Q';\r
-                               indic := I_ESQ;\r
-                            end;\r
-                    39..41: begin\r
-                               conso := 'R';\r
-                               if random( 3 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESR;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    42..44: conso := 'S';\r
-                    45..47: begin\r
-                               conso := 'T';\r
-                               if random( 10 ) = 0 then\r
-                                 begin\r
-                                      indic := I_EST;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    48..50: conso := 'V';\r
-                    51: conso := 'W';\r
-                    52: conso := 'X';\r
-                    53: conso := 'Y';\r
-                    54: conso := 'Z';\r
-                 end; { case random( 55 ) of }\r
-\r
-        end; { case indic of }\r
-   end; { procedimiento }\r
-\r
-(*********************************************************)\r
-\r
- function GetRNDApellido( max, min: integer ): APELLIDO;\r
-\r
-       var\r
-       tam, i: integer;\r
-       aux: char;\r
-       apel: APELLIDO;\r
-       indic: INDICADOR;\r
-       proxl: TIPO_LETRA;\r
-\r
-       begin\r
-         if max > MAX_APE then max := MAX_APE;\r
-         tam := random( max + 1 ) + min;\r
-         indic := I_NADA;\r
-         apel := '';\r
-         if random( 5 ) = 0 then proxl := TL_VOCAL\r
-                            else proxl := TL_CONSO;\r
-         for i := 1 to tam do\r
-           begin\r
-                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )\r
-                                    else GetRNDVocal( indic, proxl, aux );\r
-                apel := apel + aux;\r
-           end;\r
-         GetRNDApellido := apel;\r
-    end;\r
-\r
-var\r
-    n, i: integer;\r
-    arch: text;\r
-    ap: APELLIDO;\r
-    dni: DOCUMENTO;\r
-\r
-begin\r
-     randomize;\r
-     n := 1000;\r
-     assign( arch, 'DATOS.TXT' );\r
-     rewrite( arch );\r
-     dni := 10000000 + (random( 15000 ) * 100);\r
-\r
-     for i := 1 to n do\r
-        begin\r
-             ap := GetRNDApellido( 7, 4 );\r
-             dni := dni + random( 50000 ) + 1;\r
-             writeln( arch, ap );\r
-             writeln( arch, dni );\r
-             writeln( arch );\r
-        end;\r
-     close( arch );\r
-end.\r
+program RNDNames;
+
+const
+     MAX_APE = 15;
+
+type
+    APELLIDO = string[MAX_APE];
+    DOCUMENTO = 10000000..40000000;
+    PERSONA = record
+                    ap: APELLIDO;
+                    dni: DOCUMENTO;
+              end;
+    TABLA = array[1..1000] of PERSONA;
+    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
+    TIPO_VOCAL = ( TV_AEIOU, TV_EI );
+    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
+
+(*********************************************************)
+
+ function GetVocal( tipo: TIPO_VOCAL ): char;
+
+   var
+      valor: integer;
+
+   begin
+        if tipo = TV_AEIOU then valor := random( 16 )
+                           else valor := random( 6 ) + 5;
+        case valor of
+            0..4: GetVocal := 'A';
+            5..7: GetVocal := 'E';
+            8..10: GetVocal := 'I';
+            11..13: GetVocal := 'O';
+            14..15: GetVocal := 'U';
+        end;
+   end;
+
+(*********************************************************)
+
+ procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
+
+   var
+      valor: integer;
+
+    begin
+        case indic of
+            I_ESQ:
+                  begin
+                       vocal := 'U';
+                       indic := I_ESQU;
+                       proxl := TL_VOCAL;
+                  end;
+            I_ESQU:
+                   begin
+                        vocal := GetVocal( TV_EI );
+                        indic := I_NADA;
+                        proxl := TL_CONSO;
+                   end;
+            else
+              begin
+                   vocal := GetVocal( TV_AEIOU );
+                   indic := I_NADA;
+                   if random( 40 ) = 0 then proxl := TL_VOCAL
+                                       else proxl := TL_CONSO;
+              end;
+            end;
+    end;
+
+(*********************************************************)
+
+ procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
+
+   var
+      valor: integer;
+
+   begin
+        proxl := TL_VOCAL;
+        indic := I_NADA;
+
+        case indic of
+            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
+            I_ESB: case random( 2 ) of
+                       0: conso := 'R';
+                       1: conso := 'L';
+                   end;
+            I_ESC: case random( 4 ) of
+                       0: conso := 'C';
+                       1: conso := 'H';
+                       2: conso := 'R';
+                       3: conso := 'L';
+                   end;
+            I_ESL: case random( 6 ) of
+                       0: conso := 'T';
+                       1..5: conso := 'L';
+                   end;
+            I_ESM: case random( 3 ) of
+                       0: conso := 'P';
+                       1: conso := 'B';
+                       2: conso := 'L';
+                   end;
+            I_ESN: case random( 3 ) of
+                            0: conso := 'R';
+                            1: conso := 'V';
+                            2: conso := 'C';
+                   end;
+            else case random( 55 ) of
+                    0..3: begin
+                               conso := 'B';
+                               if random( 10 ) = 0 then begin
+                                                             indic := I_ESB;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    4..7: begin
+                               conso := 'C';
+                               if random( 5 ) = 0 then begin
+                                                             indic := I_ESC;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    8..11: conso := 'D';
+                    12..14: begin
+                               conso := 'F';
+                               if random( 10 ) = 0 then begin
+                                                             indic := I_ESF;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                            end;
+                    15..17: begin
+                               conso := 'G';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESG;
+                                      if random( 4 ) = 0 then proxl := TL_CONSO;
+                                 end;
+                            end;
+                    18..19: conso := 'H';
+                    20..22: conso := 'J';
+                    23..24: conso := 'K';
+                    25..27: begin
+                               conso := 'L';
+                               if random( 15 ) = 0 then
+                                 begin
+                                      indic := I_ESL;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    28..30: begin
+                               conso := 'M';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESM;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    31..33: begin
+                               conso := 'N';
+                               if random( 5 ) = 0 then
+                                 begin
+                                      indic := I_ESN;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    34..36: conso := 'P';
+                    37..38: begin
+                               conso := 'Q';
+                               indic := I_ESQ;
+                            end;
+                    39..41: begin
+                               conso := 'R';
+                               if random( 3 ) = 0 then
+                                 begin
+                                      indic := I_ESR;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    42..44: conso := 'S';
+                    45..47: begin
+                               conso := 'T';
+                               if random( 10 ) = 0 then
+                                 begin
+                                      indic := I_EST;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    48..50: conso := 'V';
+                    51: conso := 'W';
+                    52: conso := 'X';
+                    53: conso := 'Y';
+                    54: conso := 'Z';
+                 end; { case random( 55 ) of }
+
+        end; { case indic of }
+   end; { procedimiento }
+
+(*********************************************************)
+
+ function GetRNDApellido( max, min: integer ): APELLIDO;
+
+       var
+       tam, i: integer;
+       aux: char;
+       apel: APELLIDO;
+       indic: INDICADOR;
+       proxl: TIPO_LETRA;
+
+       begin
+         if max > MAX_APE then max := MAX_APE;
+         tam := random( max + 1 ) + min;
+         indic := I_NADA;
+         apel := '';
+         if random( 5 ) = 0 then proxl := TL_VOCAL
+                            else proxl := TL_CONSO;
+         for i := 1 to tam do
+           begin
+                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
+                                    else GetRNDVocal( indic, proxl, aux );
+                apel := apel + aux;
+           end;
+         GetRNDApellido := apel;
+    end;
+
+var
+    n, i: integer;
+    arch: text;
+    ap: APELLIDO;
+    dni: DOCUMENTO;
+
+begin
+     randomize;
+     n := 1000;
+     assign( arch, 'DATOS.TXT' );
+     rewrite( arch );
+     dni := 10000000 + (random( 15000 ) * 100);
+
+     for i := 1 to n do
+        begin
+             ap := GetRNDApellido( 7, 4 );
+             dni := dni + random( 50000 ) + 1;
+             writeln( arch, ap );
+             writeln( arch, dni );
+             writeln( arch );
+        end;
+     close( arch );
+end.
index 91def5d676105943eaafb5f35e59eaae2eb670c1..72bc6796bdbc0523da6ab164f05f0dcbd6030fcf 100644 (file)
-program Comparacion_De_Algoritmos_De_Ordenamiento;\r
-\r
-uses\r
-    CRT, DOS;\r
-\r
-const\r
-     MAX_APE = 15;\r
-\r
-type\r
-    APELLIDO = string[MAX_APE];\r
-    DOCUMENTO = longint;\r
-    PERSONA = record\r
-                    ap: APELLIDO;\r
-                    dni: DOCUMENTO;\r
-              end;\r
-    HORA = record\r
-                 h,\r
-                 m,\r
-                 s,\r
-                 c: longint;\r
-           end;\r
-    TABLA = array[1..1000] of PERSONA;\r
-    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );\r
-    TIPO_VOCAL = ( TV_AEIOU, TV_EI );\r
-    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );\r
-\r
-(*********************************************************)\r
-\r
- procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );\r
-\r
-    var\r
-       i: integer;\r
-\r
-    begin\r
-         for i:= 1 to tam do\r
-            begin\r
-                 writeln( ar, datos[i].ap );\r
-                 writeln( ar, datos[i].dni );\r
-                 writeln( ar );\r
-            end;\r
-    end;\r
-\r
-(*********************************************************)\r
-(*********************************************************)\r
-\r
- procedure MenuEvaluar( var datos: TABLA; var arch: text );\r
-\r
-    (*********************************************************)\r
-\r
-    procedure NoExisteArch;\r
-\r
-       begin\r
-            clrscr;\r
-            gotoxy( 20, 10 );\r
-            textcolor( LightMagenta + Blink );\r
-            writeln( 'ERROR: No existe el archivo a evaluar!' );\r
-            textcolor( LightGray );\r
-            writeln;\r
-            writeln( '             Creelo seleccionando la opci¢n 1 del Men£ Principal.' );\r
-            delay( 4000 );\r
-       end; { procedure NoExisteArch }\r
-\r
-    (*********************************************************)\r
-\r
-    function ExisteArchivo( nombre: String ): boolean;\r
-                          { funcion extrido de la ayuda del pascal }\r
-       var\r
-          arch: text;\r
-\r
-       begin\r
-            {$I-}\r
-            Assign( arch, nombre );\r
-            FileMode := 0;  { Solo lectura }\r
-            Reset( arch );\r
-            Close( arch );\r
-            {$I+}\r
-            ExisteArchivo := (IOResult = 0) and (nombre <> '');\r
-       end; { function ExisteArchivo }\r
-\r
-    (*********************************************************)\r
-\r
-       procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );\r
-\r
-          var\r
-             i: integer;\r
-             void: string[2];\r
-\r
-          begin\r
-               for i:= 1 to tam do\r
-                  begin\r
-                       readln( ar, datos[i].ap );\r
-                       readln( ar, datos[i].dni );\r
-                      readln( ar, void );\r
-                  end;\r
-          end; { procedure CargarTabla }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Intercambiar( var a, b: PERSONA; var int: longint );\r
-\r
-       var\r
-          aux: PERSONA;\r
-\r
-       begin\r
-            int := int + 1;\r
-            aux := a;\r
-            a := b;\r
-            b := aux;\r
-          {  delay( 1 );}\r
-       end; { procedure Intercambiar }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetHora( var hor: HORA );\r
-\r
-       var\r
-          h, m, s, c: word;\r
-\r
-       begin\r
-            gettime( h, m, s, c );\r
-            hor.h := h;\r
-            hor.m := m;\r
-            hor.s := s;\r
-            hor.c := c;\r
-       end; { procedure GetHora }\r
-\r
-    (*********************************************************)\r
-\r
-    function GetTiempo( h1, h2: HORA ): longint;\r
-\r
-       var\r
-          t: longint;\r
-          aux: HORA;\r
-\r
-       begin\r
-            if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }\r
-              begin\r
-              if h1.h < h2.h then\r
-                begin\r
-                     aux := h1;\r
-                     h1 := h2;\r
-                     h2 := aux;\r
-                end\r
-              end\r
-            else if h1.m <> h2.m then\r
-                   begin\r
-                   if h1.m < h2.m then\r
-                     begin\r
-                          aux := h1;\r
-                          h1 := h2;\r
-                          h2 := aux;\r
-                     end\r
-                   end\r
-                 else if h1.s <> h2.s then\r
-                        begin\r
-                        if h1.s < h2.s then\r
-                          begin\r
-                               aux := h1;\r
-                               h1 := h2;\r
-                               h2 := aux;\r
-                          end\r
-                        end\r
-                      else if h1.c <> h2.c then\r
-                             if h1.c < h2.c then\r
-                               begin\r
-                                    aux := h1;\r
-                                    h1 := h2;\r
-                                    h2 := aux;\r
-                               end;\r
-            t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60  + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );\r
-            GetTiempo := t;\r
-       end; { function GetTiempo }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure EvaluarCre( var datos: TABLA; var arch: text );\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer;\r
-                             var comparaciones: longint; var intercambios: longint; var tiempo: longint );\r
-\r
-          var\r
-             i, j: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               comparaciones := 0;\r
-               intercambios := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for i := tam - 1 downto 1 do\r
-               begin\r
-                    for j := tam - 1 downto 1 do\r
-                      begin\r
-                           comparaciones := comparaciones + 1;\r
-                         {  delay( 1 );}\r
-                           if datos[j].ap > datos[j+1].ap then\r
-                             Intercambiar( datos[j], datos[j+1], intercambios);\r
-                      end;\r
-               end;\r
-             GetHora( h2 );\r
-             tiempo := GetTiempo( h1, h2 );\r
-        end; { procedure BubbleSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer;\r
-                                var comparaciones: longint; var intercambios: longint; var tiempo: longint );\r
-\r
-          var\r
-             huboint: boolean;\r
-             i, n: integer;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               comparaciones := 0;\r
-               intercambios := 0;\r
-               n := 1;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               huboint := true;\r
-               while huboint do\r
-                 begin\r
-                      huboint := false;\r
-                      for i := tam - 1 downto n do\r
-                        begin\r
-                             comparaciones := comparaciones + 1;\r
-                           {  delay( 1 );}\r
-                             if datos[i].ap > datos[i+1].ap then\r
-                               begin\r
-                                    Intercambiar( datos[i], datos[i+1], intercambios);\r
-                                    huboint := true;\r
-                               end;\r
-                        end;\r
-                      n := n + 1;\r
-                 end;\r
-               GetHora( h2 );\r
-               tiempo := GetTiempo( h1, h2 );\r
-          end; { procedure BubbleSortMej }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer;\r
-                                var comparaciones: longint; var intercambios: longint; var tiempo: longint );\r
-          var\r
-             i, sel, n: integer;\r
-             hubosel: boolean;\r
-             h1, h2: HORA;\r
-\r
-          begin\r
-               GetHora( h1 );\r
-               comparaciones := 0;\r
-               intercambios := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               for n := 1 to tam - 1 do\r
-                 begin\r
-                      hubosel := false;\r
-                      sel := n;\r
-                      for i := n + 1 to tam do\r
-                        begin\r
-                             comparaciones := comparaciones + 1;\r
-                           {  delay( 1 );  }\r
-                             if datos[sel].ap > datos[i].ap then\r
-                               begin\r
-                                    sel := i;\r
-                                    hubosel := true;\r
-                               end;\r
-                        end;\r
-                      if hubosel then Intercambiar( datos[n], datos[sel], intercambios);\r
-                 end;\r
-               GetHora( h2 );\r
-               tiempo := GetTiempo( h1, h2 );\r
-          end; { procedure SelectionSort }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer;\r
-                            var comparaciones: longint; var intercambios: longint; var tiempo: longint );\r
-\r
-          procedure QSort( var datos: TABLA; min, max: integer;\r
-                           var comp: longint; var int: longint );\r
-\r
-             var\r
-                i, j: integer;\r
-                sel: PERSONA;\r
-                flag: boolean;\r
-\r
-             begin\r
-                  sel := datos[( min + max ) div 2];\r
-                  i := min;\r
-                  j := max;\r
-                  repeat\r
-                        comp := comp + 1;\r
-                      {  delay( 1 );}\r
-                        flag := false;\r
-                        while datos[i].ap < sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                               {  delay( 1 );}\r
-                                            end\r
-                                       else flag := true;\r
-                               i := i + 1;\r
-                          end;\r
-                        comp := comp + 1;\r
-                      {  delay( 1 );}\r
-                        flag := false;\r
-                        while datos[j].ap > sel.ap do\r
-                          begin\r
-                               if flag then begin\r
-                                                 comp := comp + 1;\r
-                                              {   delay( 1 );}\r
-                                            end\r
-                                       else flag := true;\r
-                               j := j - 1;\r
-                          end;\r
-                        if i <= j then\r
-                          begin\r
-                               if i < j then Intercambiar( datos[i], datos[j], int );\r
-                               i := i + 1;\r
-                               j := j - 1;\r
-                          end;\r
-                  until i > j;\r
-                  if min < j then QSort( datos, min, j, comp, int);\r
-                  if i < max then QSort( datos, i, max, comp, int);\r
-             end; { procedure QSort }\r
-\r
-          (*********************************************************)\r
-\r
-          var\r
-             h1, h2: HORA;\r
-\r
-          begin { procedure QuickSort }\r
-               GetHora( h1 );\r
-               comparaciones := 0;\r
-               intercambios := 0;\r
-               reset( arch );\r
-               CargarTabla( arch, datos, 1000 );\r
-               close( arch );\r
-               QSort( datos, 1, 1000, comparaciones, intercambios );\r
-               GetHora( h2 );\r
-               tiempo := GetTiempo( h1, h2 );\r
-               rewrite( arch );\r
-               CargarArchivo( datos, arch, 1000 );\r
-               close( arch );\r
-          end; { procedure QuickSort }\r
-\r
-       (*********************************************************)\r
-\r
-       var { procedure EvaluarCre }\r
-          bsComp, bsInt, bsTiem,\r
-          bsmComp, bsmInt, bsmTiem,\r
-          ssComp, ssInt, ssTiem,\r
-          qsComp, qsInt, qsTiem: longint;\r
-          info: text;\r
-\r
-       begin\r
-            assign( info, 'INFORME.TXT' );\r
-            if ExisteArchivo( 'DATOS.TXT' ) then\r
-              begin\r
-                   BubbleSort( arch, datos, 1000, bsComp, bsInt, bsTiem );\r
-                   BubbleSortMej( arch, datos, 1000, bsmComp, bsmInt, bsmTiem );\r
-                   SelectionSort( arch, datos, 1000, ssComp, ssInt, ssTiem );\r
-                   QuickSort( arch, datos, 1000, qsComp, qsInt, qsTiem );\r
-                   rewrite( info );\r
-                   writeln( info, 'Bubble Sort:' );\r
-                   writeln( info, '             Comparaciones: ', bsComp: 1 );\r
-                   writeln( info, '             Intercambios:  ', bsInt: 1 );\r
-                   writeln( info, '             Tiempo (seg):  ', bsTiem / 100: 2: 2 );\r
-                   writeln( info );\r
-                   writeln( info, 'Bubble Sort Mejorado:' );\r
-                   writeln( info, '             Comparaciones: ', bsmComp: 1 );\r
-                   writeln( info, '             Intercambios:  ', bsmInt: 1 );\r
-                   writeln( info, '             Tiempo (seg):  ', bsmTiem / 100: 2: 2 );\r
-                   writeln( info );\r
-                   writeln( info, 'Selection Sort:' );\r
-                   writeln( info, '             Comparaciones: ', ssComp: 1 );\r
-                   writeln( info, '             Intercambios:  ', ssInt: 1 );\r
-                   writeln( info, '             Tiempo (seg):  ', ssTiem / 100: 2: 2 );\r
-                   writeln( info );\r
-                   writeln( info, 'Quick Sort:' );\r
-                   writeln( info, '             Comparaciones: ', qsComp: 1 );\r
-                   writeln( info, '             Intercambios:  ', qsInt: 1 );\r
-                   writeln( info, '             Tiempo (seg): ', qsTiem / 100: 2: 2 );\r
-                   writeln( info );\r
-                   close( info );\r
-              end\r
-            else\r
-            NoExisteArch;\r
-       end; { procedure EvaluarCre }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure EvaluarDec( var datos: TABLA; var arch: text );\r
-\r
-       var nada: integer;\r
-\r
-       begin\r
-            for nada := 1 to 1000 do\r
-                writeln( datos[nada].ap, ' ', datos[nada].dni );\r
-            delay( 3000 );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    var { procedure MenuEvaluar }\r
-       tecla: char;\r
-\r
-    begin\r
-         clrscr;\r
-         textcolor( Yellow );\r
-         gotoxy( 19, 3 );\r
-         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-         gotoxy( 19, 4 );\r
-         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-         textcolor( LightCyan );\r
-         gotoxy( 1, 7 );\r
-         writeln( '  Evaluar Algoritmos:' );\r
-         writeln( '  ------- ----------' );\r
-         textcolor( LightGray );\r
-         writeln;\r
-         writeln;\r
-         writeln( '     1.- Ordenando en forma creciente.' );\r
-         writeln( '     2.- Ordenando en forma decreciente.' );\r
-         writeln( '     0.- Men£ Anterior.' );\r
-         gotoxy( 1, 20 );\r
-         textcolor( White );\r
-         write( '  Ingrese su opci¢n: ' );\r
-         textcolor( Yellow );\r
-         tecla := readkey;\r
-         while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do\r
-           begin\r
-                textcolor( White );\r
-                gotoxy( 1, 20 );\r
-                write( '  Ingrese su opci¢n (1, 2 o 0): ' );\r
-                textcolor( Yellow );\r
-                tecla := readkey;\r
-           end;\r
-         case tecla of\r
-            '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )\r
-                                                 else NoExisteArch;\r
-            '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )\r
-                                                 else NoExisteArch;\r
-            '0': ;\r
-         end;\r
-    end;\r
-\r
-(*********************************************************)\r
-(*********************************************************)\r
-\r
- procedure MenuGenerar( var arch: text );\r
-\r
-    (*********************************************************)\r
-\r
-    function GetRNDApellido( max, min: integer ): APELLIDO;\r
-\r
-       (*********************************************************)\r
-\r
-       function GetVocal( tipo: TIPO_VOCAL ): char;\r
-\r
-         var\r
-            valor: integer;\r
-\r
-         begin\r
-              if tipo = TV_AEIOU then valor := random( 16 )\r
-                                 else valor := random( 6 ) + 5;\r
-              case valor of\r
-                  0..4: GetVocal := 'A';\r
-                  5..7: GetVocal := 'E';\r
-                  8..10: GetVocal := 'I';\r
-                 11..13: GetVocal := 'O';\r
-                 14..15: GetVocal := 'U';\r
-              end;\r
-         end; { function GetVocal }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );\r
-\r
-         var\r
-            valor: integer;\r
-\r
-          begin\r
-              case indic of\r
-                  I_ESQ:\r
-                        begin\r
-                             vocal := 'U';\r
-                             indic := I_ESQU;\r
-                             proxl := TL_VOCAL;\r
-                        end;\r
-                  I_ESQU:\r
-                         begin\r
-                              vocal := GetVocal( TV_EI );\r
-                              indic := I_NADA;\r
-                              proxl := TL_CONSO;\r
-                         end;\r
-                  else\r
-                    begin\r
-                         vocal := GetVocal( TV_AEIOU );\r
-                         indic := I_NADA;\r
-                         if random( 40 ) = 0 then proxl := TL_VOCAL\r
-                                             else proxl := TL_CONSO;\r
-                    end;\r
-                  end;\r
-          end; { procedure GetRNDVocal }\r
-\r
-       (*********************************************************)\r
-\r
-       procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );\r
-\r
-          var\r
-             valor: integer;\r
-\r
-          begin\r
-               proxl := TL_VOCAL;\r
-               indic := I_NADA;\r
-\r
-               case indic of\r
-                  I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';\r
-                  I_ESB: case random( 2 ) of\r
-                             0: conso := 'R';\r
-                             1: conso := 'L';\r
-                         end;\r
-                  I_ESC: case random( 4 ) of\r
-                             0: conso := 'C';\r
-                             1: conso := 'H';\r
-                             2: conso := 'R';\r
-                             3: conso := 'L';\r
-                         end;\r
-                  I_ESL: case random( 6 ) of\r
-                             0: conso := 'T';\r
-                             1..5: conso := 'L';\r
-                         end;\r
-                  I_ESM: case random( 3 ) of\r
-                             0: conso := 'P';\r
-                             1: conso := 'B';\r
-                             2: conso := 'L';\r
-                         end;\r
-                  I_ESN: case random( 3 ) of\r
-                             0: conso := 'R';\r
-                             1: conso := 'V';\r
-                             2: conso := 'C';\r
-                         end;\r
-                  else case random( 55 ) of\r
-                           0..3: begin\r
-                                      conso := 'B';\r
-                                      if random( 10 ) = 0 then begin\r
-                                                                    indic := I_ESB;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                 end;\r
-                           4..7: begin\r
-                                      conso := 'C';\r
-                                      if random( 5 ) = 0 then begin\r
-                                                                    indic := I_ESC;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                 end;\r
-                           8..11: conso := 'D';\r
-                           12..14: begin\r
-                                      conso := 'F';\r
-                                      if random( 10 ) = 0 then begin\r
-                                                                    indic := I_ESF;\r
-                                                                    proxl := TL_CONSO;\r
-                                                               end;\r
-                                   end;\r
-                           15..17: begin\r
-                                        conso := 'G';\r
-                                        if random( 5 ) = 0 then\r
-                                        begin\r
-                                             indic := I_ESG;\r
-                                             if random( 4 ) = 0 then proxl := TL_CONSO;\r
-                                        end;\r
-                                   end;\r
-                           18..19: conso := 'H';\r
-                           20..22: conso := 'J';\r
-                           23..24: conso := 'K';\r
-                           25..27: begin\r
-                                        conso := 'L';\r
-                                        if random( 15 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESL;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           28..30: begin\r
-                                        conso := 'M';\r
-                                        if random( 5 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESM;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           31..33: begin\r
-                                        conso := 'N';\r
-                                        if random( 5 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESN;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           34..36: conso := 'P';\r
-                           37..38: begin\r
-                                        conso := 'Q';\r
-                                        indic := I_ESQ;\r
-                                   end;\r
-                           39..41: begin\r
-                                        conso := 'R';\r
-                                        if random( 3 ) = 0 then\r
-                                          begin\r
-                                               indic := I_ESR;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           42..44: conso := 'S';\r
-                           45..47: begin\r
-                                        conso := 'T';\r
-                                        if random( 10 ) = 0 then\r
-                                          begin\r
-                                               indic := I_EST;\r
-                                               proxl := TL_CONSO;\r
-                                          end;\r
-                                   end;\r
-                           48..50: conso := 'V';\r
-                           51: conso := 'W';\r
-                           52: conso := 'X';\r
-                           53: conso := 'Y';\r
-                           54: conso := 'Z';\r
-                         end; { case random( 55 ) of }\r
-\r
-                end; { case indic of }\r
-           end; { procedure GetRNDConsonante }\r
-\r
-       (*********************************************************)\r
-\r
-       var { function GetRNDApellido }\r
-          tam, i: integer;\r
-          aux: char;\r
-          apel: APELLIDO;\r
-          indic: INDICADOR;\r
-          proxl: TIPO_LETRA;\r
-\r
-       begin\r
-            if max > MAX_APE then max := MAX_APE;\r
-            tam := random( max + 1 ) + min;\r
-            indic := I_NADA;\r
-            apel := '';\r
-            if random( 5 ) = 0 then proxl := TL_VOCAL\r
-                               else proxl := TL_CONSO;\r
-            for i := 1 to tam do\r
-              begin\r
-                   if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )\r
-                                       else GetRNDVocal( indic, proxl, aux );\r
-                   apel := apel + aux;\r
-              end;\r
-            GetRNDApellido := apel;\r
-       end; { function GetRNDApellido }\r
-\r
-    (*********************************************************)\r
-\r
-    function GetRNDLetra( min, max: char ): char;\r
-\r
-       begin\r
-            GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetOrdApellidos( var ar: text; cant: integer );\r
-\r
-       var\r
-           mil: boolean;\r
-           letra, letra1: char;\r
-           i, j, veces: integer;\r
-           dni: DOCUMENTO;\r
-           ap, ape, apel: APELLIDO;\r
-\r
-       begin\r
-            mil := false;\r
-            if cant = 1000 then mil := true;\r
-            dni := 10000000 + (random( 15000 ) * 100);\r
-            ap := '';\r
-            ape := '';\r
-            apel := '';\r
-            for letra := 'A' to 'Z' do\r
-              begin\r
-                   ap := letra;\r
-                   for letra1 := 'A' to 'Z' do\r
-                      begin\r
-                           if mil then\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':\r
-                                        case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end\r
-                           else\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':\r
-                                        case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end;\r
-                           ape := ap + letra1;\r
-                           for j := 1 to veces do\r
-                               begin\r
-                                    if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )\r
-                                             else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );\r
-                                    dni := dni + random( 50000 ) + 1;\r
-                                    writeln( ar, apel );\r
-                                    writeln( ar, dni );\r
-                                    writeln( ar );\r
-                                    apel := '';\r
-                               end;\r
-\r
-                           ape := '';\r
-\r
-                      end; { for letra1 := 'A' to 'Z' do }\r
-\r
-                   ap := '';\r
-\r
-              end; { for letra := 'A' to 'Z' do }\r
-\r
-       end; { procedure GetOrdApellidos }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GetInvOrdApellidos( var ar: text; cant: integer );\r
-\r
-       var\r
-          mil: boolean;\r
-          letra, letra1: char;\r
-          i, j, veces: integer;\r
-          dni: DOCUMENTO;\r
-          ap, ape, apel: APELLIDO;\r
-\r
-       begin\r
-            mil := false;\r
-            if cant = 1000 then mil := true;\r
-            dni := 34000000 + (random( 15000 ) * 100);\r
-            ap := '';\r
-            ape := '';\r
-            apel := '';\r
-            for letra := 'Z' downto 'A' do\r
-              begin\r
-                   ap := letra;\r
-                   for letra1 := 'Z' downto 'A' do\r
-                      begin\r
-                           if mil then\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':\r
-                                        case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end\r
-                           else\r
-                              case letra of\r
-                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':\r
-                                        case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                                   else case letra1 of\r
-                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;\r
-                                             else veces := 1;\r
-                                        end;\r
-                              end;\r
-                           ape := ap + letra1;\r
-                           for j := 1 to veces do\r
-                               begin\r
-                                    if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )\r
-                                              else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );\r
-                                    dni := dni - random( 40000 ) - 1;\r
-                                    writeln( ar, apel );\r
-                                    writeln( ar, dni );\r
-                                    writeln( ar );\r
-                                    apel := '';\r
-                               end;\r
-\r
-                           ape := '';\r
-\r
-                      end; { for letra1 := 'A' to 'Z' do }\r
-\r
-                   ap := '';\r
-\r
-              end; { for letra := 'A' to 'Z' do }\r
-\r
-       end; { GetInvOrdApellidos }\r
-\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       var\r
-          i: integer;\r
-          ap: APELLIDO;\r
-          dni: DOCUMENTO;\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            dni := 10000000 + (random( 15000 ) * 100);\r
-\r
-            for i := 1 to n do\r
-                begin\r
-                     ap := GetRNDApellido( 8, 4 );\r
-                     dni := dni + random( 50000 ) + 1;\r
-                     writeln( arch, ap );\r
-                     writeln( arch, dni );\r
-                     writeln( arch );\r
-                end;\r
-            if reabrir then close( arch );\r
-       end; { procedure GenerarRND }\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            GetOrdApellidos( arch, n );\r
-            if reabrir then close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );\r
-\r
-       begin\r
-            if reabrir then rewrite( arch );\r
-            GetInvOrdApellidos( arch, n );\r
-            if reabrir then close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Generar90Ord( var arch: text );\r
-\r
-       begin\r
-            rewrite( arch );\r
-            GenerarOrd( arch, 900, false );\r
-            GenerarRND( arch, 100, false );\r
-            close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    procedure Generar90OrdDec( var arch: text );\r
-\r
-       begin\r
-            rewrite( arch );\r
-            GenerarOrdDec( arch, 900, false );\r
-            GenerarRND( arch, 100, false );\r
-            close( arch );\r
-       end;\r
-\r
-    (*********************************************************)\r
-\r
-    var { procedure MenuGenerar }\r
-       tecla: char;\r
-\r
-    begin\r
-         clrscr;\r
-         textcolor( Yellow );\r
-         gotoxy( 19, 3 );\r
-         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-         gotoxy( 19, 4 );\r
-         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-         textcolor( LightCyan );\r
-         gotoxy( 1, 7 );\r
-         writeln( '  Generar Archivo (''DATOS.TXT''):' );\r
-         writeln( '  ------- ------- -------------' );\r
-         textcolor( LightGray );\r
-         writeln;\r
-         writeln;\r
-         writeln( '     1.- Con datos desordenados.' );\r
-         writeln( '     2.- Con datos en orden creciente (APELLIDO, DNI).' );\r
-         writeln( '     3.- Con datos en orden decreciente (APELLIDO, DNI).' );\r
-         writeln( '     4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );\r
-         writeln( '     5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );\r
-         writeln( '     0.- Men£ Anterior.' );\r
-         gotoxy( 1, 20 );\r
-         textcolor( White );\r
-         write( '  Ingrese su opci¢n: ' );\r
-         textcolor( Yellow );\r
-         tecla := readkey;\r
-         while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do\r
-           begin\r
-                textcolor( White );\r
-                gotoxy( 1, 20 );\r
-                write( '  Ingrese su opci¢n (1 a 5 o 0): ' );\r
-                textcolor( Yellow );\r
-                tecla := readkey;\r
-           end;\r
-         case tecla of\r
-            '1': GenerarRND( arch, 1000, true );\r
-            '2': GenerarOrd( arch, 1000, true );\r
-            '3': GenerarOrdDec( arch, 1000, true );\r
-            '4': Generar90Ord( arch );\r
-            '5': Generar90OrdDec( arch );\r
-            '0': ;\r
-         end;\r
-    end; { procedure MenuGenerar }\r
-\r
-(*********************************************************)\r
-\r
-{ procedure MenuPrincipal( var arch: text; var datos: TABLA );}\r
-\r
-    var\r
-       datos: TABLA;\r
-       arch: text;\r
-       tecla: char;\r
-       salir: boolean;\r
-\r
-    begin\r
-     randomize;\r
-     assign( arch, 'DATOS.TXT' );\r
-     salir := false;\r
-     textbackground( Blue );\r
-\r
-     while not salir do\r
-       begin\r
-            clrscr;\r
-            textcolor( Yellow );\r
-            gotoxy( 19, 3 );\r
-            writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );\r
-            gotoxy( 19, 4 );\r
-            writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );\r
-            gotoxy( 1, 7 );\r
-            textcolor( LightCyan );\r
-            writeln( '  Men£ Principal:' );\r
-            writeln( '  ---- ---------' );\r
-            textcolor( LightGray );\r
-            writeln;\r
-            writeln;\r
-            writeln( '     1.- Generar Archivo (''DATOS.TXT'').' );\r
-            writeln( '     2.- Evaluar Algoritmos.' );\r
-            writeln( '     0.- Salir.' );\r
-            gotoxy( 1, 20 );\r
-            textcolor( White );\r
-            write( '  Ingrese su opci¢n: ' );\r
-            textcolor( Yellow );\r
-            tecla := readkey;\r
-            while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do\r
-              begin\r
-                   textcolor( White );\r
-                   gotoxy( 1, 20 );\r
-                   write( '  Ingrese su opci¢n (1, 2 o 0): ' );\r
-                   textcolor( Yellow );\r
-                   tecla := readkey;\r
-              end;\r
-            case tecla of\r
-                 '1': MenuGenerar( arch );\r
-                 '2': MenuEvaluar( datos, arch );\r
-                 '0': salir := true;\r
-            end;\r
-       end;\r
-     writeln;\r
-     NormVideo;\r
-     clrscr;\r
-     writeln;\r
-     textcolor( white );\r
-     writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n 1.1.0 <-o-o-> Luca - Soft' );\r
-     NormVideo;\r
-     writeln( '  Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );\r
-     writeln( '  Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );\r
-     writeln;\r
-     textcolor( LightMagenta );\r
-     write( '                lluca@cnba.uba.ar' );\r
-     NormVideo;\r
-     write( '   o   ' );\r
-     textcolor( LightMagenta );\r
-     writeln( 'lluca@geocities.com' );\r
-     NormVideo;\r
-     writeln;\r
-     writeln( '  (c) 1999 - Todos los derechos reservados.' );\r
-     delay( 750 );\r
-\r
-     {close( arch );}\r
+program Comparacion_De_Algoritmos_De_Ordenamiento;
+
+uses
+    CRT, DOS;
+
+const
+     MAX_APE = 15;
+
+type
+    APELLIDO = string[MAX_APE];
+    DOCUMENTO = longint;
+    PERSONA = record
+                    ap: APELLIDO;
+                    dni: DOCUMENTO;
+              end;
+    HORA = record
+                 h,
+                 m,
+                 s,
+                 c: longint;
+           end;
+    TABLA = array[1..1000] of PERSONA;
+    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
+    TIPO_VOCAL = ( TV_AEIOU, TV_EI );
+    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
+
+(*********************************************************)
+
+ procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );
+
+    var
+       i: integer;
+
+    begin
+         for i:= 1 to tam do
+            begin
+                 writeln( ar, datos[i].ap );
+                 writeln( ar, datos[i].dni );
+                 writeln( ar );
+            end;
+    end;
+
+(*********************************************************)
+(*********************************************************)
+
+ procedure MenuEvaluar( var datos: TABLA; var arch: text );
+
+    (*********************************************************)
+
+    procedure NoExisteArch;
+
+       begin
+            clrscr;
+            gotoxy( 20, 10 );
+            textcolor( LightMagenta + Blink );
+            writeln( 'ERROR: No existe el archivo a evaluar!' );
+            textcolor( LightGray );
+            writeln;
+            writeln( '             Creelo seleccionando la opci¢n 1 del Men£ Principal.' );
+            delay( 4000 );
+       end; { procedure NoExisteArch }
+
+    (*********************************************************)
+
+    function ExisteArchivo( nombre: String ): boolean;
+                          { funcion extrido de la ayuda del pascal }
+       var
+          arch: text;
+
+       begin
+            {$I-}
+            Assign( arch, nombre );
+            FileMode := 0;  { Solo lectura }
+            Reset( arch );
+            Close( arch );
+            {$I+}
+            ExisteArchivo := (IOResult = 0) and (nombre <> '');
+       end; { function ExisteArchivo }
+
+    (*********************************************************)
+
+       procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );
+
+          var
+             i: integer;
+             void: string[2];
+
+          begin
+               for i:= 1 to tam do
+                  begin
+                       readln( ar, datos[i].ap );
+                       readln( ar, datos[i].dni );
+                      readln( ar, void );
+                  end;
+          end; { procedure CargarTabla }
+
+    (*********************************************************)
+
+    procedure Intercambiar( var a, b: PERSONA; var int: longint );
+
+       var
+          aux: PERSONA;
+
+       begin
+            int := int + 1;
+            aux := a;
+            a := b;
+            b := aux;
+          {  delay( 1 );}
+       end; { procedure Intercambiar }
+
+    (*********************************************************)
+
+    procedure GetHora( var hor: HORA );
+
+       var
+          h, m, s, c: word;
+
+       begin
+            gettime( h, m, s, c );
+            hor.h := h;
+            hor.m := m;
+            hor.s := s;
+            hor.c := c;
+       end; { procedure GetHora }
+
+    (*********************************************************)
+
+    function GetTiempo( h1, h2: HORA ): longint;
+
+       var
+          t: longint;
+          aux: HORA;
+
+       begin
+            if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }
+              begin
+              if h1.h < h2.h then
+                begin
+                     aux := h1;
+                     h1 := h2;
+                     h2 := aux;
+                end
+              end
+            else if h1.m <> h2.m then
+                   begin
+                   if h1.m < h2.m then
+                     begin
+                          aux := h1;
+                          h1 := h2;
+                          h2 := aux;
+                     end
+                   end
+                 else if h1.s <> h2.s then
+                        begin
+                        if h1.s < h2.s then
+                          begin
+                               aux := h1;
+                               h1 := h2;
+                               h2 := aux;
+                          end
+                        end
+                      else if h1.c <> h2.c then
+                             if h1.c < h2.c then
+                               begin
+                                    aux := h1;
+                                    h1 := h2;
+                                    h2 := aux;
+                               end;
+            t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60  + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );
+            GetTiempo := t;
+       end; { function GetTiempo }
+
+    (*********************************************************)
+
+    procedure EvaluarCre( var datos: TABLA; var arch: text );
+
+       (*********************************************************)
+
+       procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer;
+                             var comparaciones: longint; var intercambios: longint; var tiempo: longint );
+
+          var
+             i, j: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               comparaciones := 0;
+               intercambios := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for i := tam - 1 downto 1 do
+               begin
+                    for j := tam - 1 downto 1 do
+                      begin
+                           comparaciones := comparaciones + 1;
+                         {  delay( 1 );}
+                           if datos[j].ap > datos[j+1].ap then
+                             Intercambiar( datos[j], datos[j+1], intercambios);
+                      end;
+               end;
+             GetHora( h2 );
+             tiempo := GetTiempo( h1, h2 );
+        end; { procedure BubbleSort }
+
+       (*********************************************************)
+
+       procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer;
+                                var comparaciones: longint; var intercambios: longint; var tiempo: longint );
+
+          var
+             huboint: boolean;
+             i, n: integer;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               comparaciones := 0;
+               intercambios := 0;
+               n := 1;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               huboint := true;
+               while huboint do
+                 begin
+                      huboint := false;
+                      for i := tam - 1 downto n do
+                        begin
+                             comparaciones := comparaciones + 1;
+                           {  delay( 1 );}
+                             if datos[i].ap > datos[i+1].ap then
+                               begin
+                                    Intercambiar( datos[i], datos[i+1], intercambios);
+                                    huboint := true;
+                               end;
+                        end;
+                      n := n + 1;
+                 end;
+               GetHora( h2 );
+               tiempo := GetTiempo( h1, h2 );
+          end; { procedure BubbleSortMej }
+
+       (*********************************************************)
+
+       procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer;
+                                var comparaciones: longint; var intercambios: longint; var tiempo: longint );
+          var
+             i, sel, n: integer;
+             hubosel: boolean;
+             h1, h2: HORA;
+
+          begin
+               GetHora( h1 );
+               comparaciones := 0;
+               intercambios := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               for n := 1 to tam - 1 do
+                 begin
+                      hubosel := false;
+                      sel := n;
+                      for i := n + 1 to tam do
+                        begin
+                             comparaciones := comparaciones + 1;
+                           {  delay( 1 );  }
+                             if datos[sel].ap > datos[i].ap then
+                               begin
+                                    sel := i;
+                                    hubosel := true;
+                               end;
+                        end;
+                      if hubosel then Intercambiar( datos[n], datos[sel], intercambios);
+                 end;
+               GetHora( h2 );
+               tiempo := GetTiempo( h1, h2 );
+          end; { procedure SelectionSort }
+
+       (*********************************************************)
+
+       procedure QuickSort( var arch: text; var datos: TABLA; tam: integer;
+                            var comparaciones: longint; var intercambios: longint; var tiempo: longint );
+
+          procedure QSort( var datos: TABLA; min, max: integer;
+                           var comp: longint; var int: longint );
+
+             var
+                i, j: integer;
+                sel: PERSONA;
+                flag: boolean;
+
+             begin
+                  sel := datos[( min + max ) div 2];
+                  i := min;
+                  j := max;
+                  repeat
+                        comp := comp + 1;
+                      {  delay( 1 );}
+                        flag := false;
+                        while datos[i].ap < sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                               {  delay( 1 );}
+                                            end
+                                       else flag := true;
+                               i := i + 1;
+                          end;
+                        comp := comp + 1;
+                      {  delay( 1 );}
+                        flag := false;
+                        while datos[j].ap > sel.ap do
+                          begin
+                               if flag then begin
+                                                 comp := comp + 1;
+                                              {   delay( 1 );}
+                                            end
+                                       else flag := true;
+                               j := j - 1;
+                          end;
+                        if i <= j then
+                          begin
+                               if i < j then Intercambiar( datos[i], datos[j], int );
+                               i := i + 1;
+                               j := j - 1;
+                          end;
+                  until i > j;
+                  if min < j then QSort( datos, min, j, comp, int);
+                  if i < max then QSort( datos, i, max, comp, int);
+             end; { procedure QSort }
+
+          (*********************************************************)
+
+          var
+             h1, h2: HORA;
+
+          begin { procedure QuickSort }
+               GetHora( h1 );
+               comparaciones := 0;
+               intercambios := 0;
+               reset( arch );
+               CargarTabla( arch, datos, 1000 );
+               close( arch );
+               QSort( datos, 1, 1000, comparaciones, intercambios );
+               GetHora( h2 );
+               tiempo := GetTiempo( h1, h2 );
+               rewrite( arch );
+               CargarArchivo( datos, arch, 1000 );
+               close( arch );
+          end; { procedure QuickSort }
+
+       (*********************************************************)
+
+       var { procedure EvaluarCre }
+          bsComp, bsInt, bsTiem,
+          bsmComp, bsmInt, bsmTiem,
+          ssComp, ssInt, ssTiem,
+          qsComp, qsInt, qsTiem: longint;
+          info: text;
+
+       begin
+            assign( info, 'INFORME.TXT' );
+            if ExisteArchivo( 'DATOS.TXT' ) then
+              begin
+                   BubbleSort( arch, datos, 1000, bsComp, bsInt, bsTiem );
+                   BubbleSortMej( arch, datos, 1000, bsmComp, bsmInt, bsmTiem );
+                   SelectionSort( arch, datos, 1000, ssComp, ssInt, ssTiem );
+                   QuickSort( arch, datos, 1000, qsComp, qsInt, qsTiem );
+                   rewrite( info );
+                   writeln( info, 'Bubble Sort:' );
+                   writeln( info, '             Comparaciones: ', bsComp: 1 );
+                   writeln( info, '             Intercambios:  ', bsInt: 1 );
+                   writeln( info, '             Tiempo (seg):  ', bsTiem / 100: 2: 2 );
+                   writeln( info );
+                   writeln( info, 'Bubble Sort Mejorado:' );
+                   writeln( info, '             Comparaciones: ', bsmComp: 1 );
+                   writeln( info, '             Intercambios:  ', bsmInt: 1 );
+                   writeln( info, '             Tiempo (seg):  ', bsmTiem / 100: 2: 2 );
+                   writeln( info );
+                   writeln( info, 'Selection Sort:' );
+                   writeln( info, '             Comparaciones: ', ssComp: 1 );
+                   writeln( info, '             Intercambios:  ', ssInt: 1 );
+                   writeln( info, '             Tiempo (seg):  ', ssTiem / 100: 2: 2 );
+                   writeln( info );
+                   writeln( info, 'Quick Sort:' );
+                   writeln( info, '             Comparaciones: ', qsComp: 1 );
+                   writeln( info, '             Intercambios:  ', qsInt: 1 );
+                   writeln( info, '             Tiempo (seg): ', qsTiem / 100: 2: 2 );
+                   writeln( info );
+                   close( info );
+              end
+            else
+            NoExisteArch;
+       end; { procedure EvaluarCre }
+
+    (*********************************************************)
+
+    procedure EvaluarDec( var datos: TABLA; var arch: text );
+
+       var nada: integer;
+
+       begin
+            for nada := 1 to 1000 do
+                writeln( datos[nada].ap, ' ', datos[nada].dni );
+            delay( 3000 );
+       end;
+
+    (*********************************************************)
+
+    var { procedure MenuEvaluar }
+       tecla: char;
+
+    begin
+         clrscr;
+         textcolor( Yellow );
+         gotoxy( 19, 3 );
+         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+         gotoxy( 19, 4 );
+         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+         textcolor( LightCyan );
+         gotoxy( 1, 7 );
+         writeln( '  Evaluar Algoritmos:' );
+         writeln( '  ------- ----------' );
+         textcolor( LightGray );
+         writeln;
+         writeln;
+         writeln( '     1.- Ordenando en forma creciente.' );
+         writeln( '     2.- Ordenando en forma decreciente.' );
+         writeln( '     0.- Men£ Anterior.' );
+         gotoxy( 1, 20 );
+         textcolor( White );
+         write( '  Ingrese su opci¢n: ' );
+         textcolor( Yellow );
+         tecla := readkey;
+         while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
+           begin
+                textcolor( White );
+                gotoxy( 1, 20 );
+                write( '  Ingrese su opci¢n (1, 2 o 0): ' );
+                textcolor( Yellow );
+                tecla := readkey;
+           end;
+         case tecla of
+            '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )
+                                                 else NoExisteArch;
+            '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )
+                                                 else NoExisteArch;
+            '0': ;
+         end;
+    end;
+
+(*********************************************************)
+(*********************************************************)
+
+ procedure MenuGenerar( var arch: text );
+
+    (*********************************************************)
+
+    function GetRNDApellido( max, min: integer ): APELLIDO;
+
+       (*********************************************************)
+
+       function GetVocal( tipo: TIPO_VOCAL ): char;
+
+         var
+            valor: integer;
+
+         begin
+              if tipo = TV_AEIOU then valor := random( 16 )
+                                 else valor := random( 6 ) + 5;
+              case valor of
+                  0..4: GetVocal := 'A';
+                  5..7: GetVocal := 'E';
+                  8..10: GetVocal := 'I';
+                 11..13: GetVocal := 'O';
+                 14..15: GetVocal := 'U';
+              end;
+         end; { function GetVocal }
+
+       (*********************************************************)
+
+       procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
+
+         var
+            valor: integer;
+
+          begin
+              case indic of
+                  I_ESQ:
+                        begin
+                             vocal := 'U';
+                             indic := I_ESQU;
+                             proxl := TL_VOCAL;
+                        end;
+                  I_ESQU:
+                         begin
+                              vocal := GetVocal( TV_EI );
+                              indic := I_NADA;
+                              proxl := TL_CONSO;
+                         end;
+                  else
+                    begin
+                         vocal := GetVocal( TV_AEIOU );
+                         indic := I_NADA;
+                         if random( 40 ) = 0 then proxl := TL_VOCAL
+                                             else proxl := TL_CONSO;
+                    end;
+                  end;
+          end; { procedure GetRNDVocal }
+
+       (*********************************************************)
+
+       procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
+
+          var
+             valor: integer;
+
+          begin
+               proxl := TL_VOCAL;
+               indic := I_NADA;
+
+               case indic of
+                  I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
+                  I_ESB: case random( 2 ) of
+                             0: conso := 'R';
+                             1: conso := 'L';
+                         end;
+                  I_ESC: case random( 4 ) of
+                             0: conso := 'C';
+                             1: conso := 'H';
+                             2: conso := 'R';
+                             3: conso := 'L';
+                         end;
+                  I_ESL: case random( 6 ) of
+                             0: conso := 'T';
+                             1..5: conso := 'L';
+                         end;
+                  I_ESM: case random( 3 ) of
+                             0: conso := 'P';
+                             1: conso := 'B';
+                             2: conso := 'L';
+                         end;
+                  I_ESN: case random( 3 ) of
+                             0: conso := 'R';
+                             1: conso := 'V';
+                             2: conso := 'C';
+                         end;
+                  else case random( 55 ) of
+                           0..3: begin
+                                      conso := 'B';
+                                      if random( 10 ) = 0 then begin
+                                                                    indic := I_ESB;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                 end;
+                           4..7: begin
+                                      conso := 'C';
+                                      if random( 5 ) = 0 then begin
+                                                                    indic := I_ESC;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                 end;
+                           8..11: conso := 'D';
+                           12..14: begin
+                                      conso := 'F';
+                                      if random( 10 ) = 0 then begin
+                                                                    indic := I_ESF;
+                                                                    proxl := TL_CONSO;
+                                                               end;
+                                   end;
+                           15..17: begin
+                                        conso := 'G';
+                                        if random( 5 ) = 0 then
+                                        begin
+                                             indic := I_ESG;
+                                             if random( 4 ) = 0 then proxl := TL_CONSO;
+                                        end;
+                                   end;
+                           18..19: conso := 'H';
+                           20..22: conso := 'J';
+                           23..24: conso := 'K';
+                           25..27: begin
+                                        conso := 'L';
+                                        if random( 15 ) = 0 then
+                                          begin
+                                               indic := I_ESL;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           28..30: begin
+                                        conso := 'M';
+                                        if random( 5 ) = 0 then
+                                          begin
+                                               indic := I_ESM;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           31..33: begin
+                                        conso := 'N';
+                                        if random( 5 ) = 0 then
+                                          begin
+                                               indic := I_ESN;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           34..36: conso := 'P';
+                           37..38: begin
+                                        conso := 'Q';
+                                        indic := I_ESQ;
+                                   end;
+                           39..41: begin
+                                        conso := 'R';
+                                        if random( 3 ) = 0 then
+                                          begin
+                                               indic := I_ESR;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           42..44: conso := 'S';
+                           45..47: begin
+                                        conso := 'T';
+                                        if random( 10 ) = 0 then
+                                          begin
+                                               indic := I_EST;
+                                               proxl := TL_CONSO;
+                                          end;
+                                   end;
+                           48..50: conso := 'V';
+                           51: conso := 'W';
+                           52: conso := 'X';
+                           53: conso := 'Y';
+                           54: conso := 'Z';
+                         end; { case random( 55 ) of }
+
+                end; { case indic of }
+           end; { procedure GetRNDConsonante }
+
+       (*********************************************************)
+
+       var { function GetRNDApellido }
+          tam, i: integer;
+          aux: char;
+          apel: APELLIDO;
+          indic: INDICADOR;
+          proxl: TIPO_LETRA;
+
+       begin
+            if max > MAX_APE then max := MAX_APE;
+            tam := random( max + 1 ) + min;
+            indic := I_NADA;
+            apel := '';
+            if random( 5 ) = 0 then proxl := TL_VOCAL
+                               else proxl := TL_CONSO;
+            for i := 1 to tam do
+              begin
+                   if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
+                                       else GetRNDVocal( indic, proxl, aux );
+                   apel := apel + aux;
+              end;
+            GetRNDApellido := apel;
+       end; { function GetRNDApellido }
+
+    (*********************************************************)
+
+    function GetRNDLetra( min, max: char ): char;
+
+       begin
+            GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
+       end;
+
+    (*********************************************************)
+
+    procedure GetOrdApellidos( var ar: text; cant: integer );
+
+       var
+           mil: boolean;
+           letra, letra1: char;
+           i, j, veces: integer;
+           dni: DOCUMENTO;
+           ap, ape, apel: APELLIDO;
+
+       begin
+            mil := false;
+            if cant = 1000 then mil := true;
+            dni := 10000000 + (random( 15000 ) * 100);
+            ap := '';
+            ape := '';
+            apel := '';
+            for letra := 'A' to 'Z' do
+              begin
+                   ap := letra;
+                   for letra1 := 'A' to 'Z' do
+                      begin
+                           if mil then
+                              case letra of
+                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
+                                        case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end
+                           else
+                              case letra of
+                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
+                                        case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end;
+                           ape := ap + letra1;
+                           for j := 1 to veces do
+                               begin
+                                    if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
+                                             else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
+                                    dni := dni + random( 50000 ) + 1;
+                                    writeln( ar, apel );
+                                    writeln( ar, dni );
+                                    writeln( ar );
+                                    apel := '';
+                               end;
+
+                           ape := '';
+
+                      end; { for letra1 := 'A' to 'Z' do }
+
+                   ap := '';
+
+              end; { for letra := 'A' to 'Z' do }
+
+       end; { procedure GetOrdApellidos }
+
+    (*********************************************************)
+
+    procedure GetInvOrdApellidos( var ar: text; cant: integer );
+
+       var
+          mil: boolean;
+          letra, letra1: char;
+          i, j, veces: integer;
+          dni: DOCUMENTO;
+          ap, ape, apel: APELLIDO;
+
+       begin
+            mil := false;
+            if cant = 1000 then mil := true;
+            dni := 34000000 + (random( 15000 ) * 100);
+            ap := '';
+            ape := '';
+            apel := '';
+            for letra := 'Z' downto 'A' do
+              begin
+                   ap := letra;
+                   for letra1 := 'Z' downto 'A' do
+                      begin
+                           if mil then
+                              case letra of
+                                   'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
+                                        case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end
+                           else
+                              case letra of
+                                   'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
+                                        case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
+                                             else veces := 1;
+                                        end;
+                                   else case letra1 of
+                                             'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
+                                             else veces := 1;
+                                        end;
+                              end;
+                           ape := ap + letra1;
+                           for j := 1 to veces do
+                               begin
+                                    if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
+                                              else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
+                                    dni := dni - random( 40000 ) - 1;
+                                    writeln( ar, apel );
+                                    writeln( ar, dni );
+                                    writeln( ar );
+                                    apel := '';
+                               end;
+
+                           ape := '';
+
+                      end; { for letra1 := 'A' to 'Z' do }
+
+                   ap := '';
+
+              end; { for letra := 'A' to 'Z' do }
+
+       end; { GetInvOrdApellidos }
+
+
+    (*********************************************************)
+
+    procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );
+
+       var
+          i: integer;
+          ap: APELLIDO;
+          dni: DOCUMENTO;
+
+       begin
+            if reabrir then rewrite( arch );
+            dni := 10000000 + (random( 15000 ) * 100);
+
+            for i := 1 to n do
+                begin
+                     ap := GetRNDApellido( 8, 4 );
+                     dni := dni + random( 50000 ) + 1;
+                     writeln( arch, ap );
+                     writeln( arch, dni );
+                     writeln( arch );
+                end;
+            if reabrir then close( arch );
+       end; { procedure GenerarRND }
+
+    (*********************************************************)
+
+    procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );
+
+       begin
+            if reabrir then rewrite( arch );
+            GetOrdApellidos( arch, n );
+            if reabrir then close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );
+
+       begin
+            if reabrir then rewrite( arch );
+            GetInvOrdApellidos( arch, n );
+            if reabrir then close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure Generar90Ord( var arch: text );
+
+       begin
+            rewrite( arch );
+            GenerarOrd( arch, 900, false );
+            GenerarRND( arch, 100, false );
+            close( arch );
+       end;
+
+    (*********************************************************)
+
+    procedure Generar90OrdDec( var arch: text );
+
+       begin
+            rewrite( arch );
+            GenerarOrdDec( arch, 900, false );
+            GenerarRND( arch, 100, false );
+            close( arch );
+       end;
+
+    (*********************************************************)
+
+    var { procedure MenuGenerar }
+       tecla: char;
+
+    begin
+         clrscr;
+         textcolor( Yellow );
+         gotoxy( 19, 3 );
+         writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+         gotoxy( 19, 4 );
+         writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+         textcolor( LightCyan );
+         gotoxy( 1, 7 );
+         writeln( '  Generar Archivo (''DATOS.TXT''):' );
+         writeln( '  ------- ------- -------------' );
+         textcolor( LightGray );
+         writeln;
+         writeln;
+         writeln( '     1.- Con datos desordenados.' );
+         writeln( '     2.- Con datos en orden creciente (APELLIDO, DNI).' );
+         writeln( '     3.- Con datos en orden decreciente (APELLIDO, DNI).' );
+         writeln( '     4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );
+         writeln( '     5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );
+         writeln( '     0.- Men£ Anterior.' );
+         gotoxy( 1, 20 );
+         textcolor( White );
+         write( '  Ingrese su opci¢n: ' );
+         textcolor( Yellow );
+         tecla := readkey;
+         while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do
+           begin
+                textcolor( White );
+                gotoxy( 1, 20 );
+                write( '  Ingrese su opci¢n (1 a 5 o 0): ' );
+                textcolor( Yellow );
+                tecla := readkey;
+           end;
+         case tecla of
+            '1': GenerarRND( arch, 1000, true );
+            '2': GenerarOrd( arch, 1000, true );
+            '3': GenerarOrdDec( arch, 1000, true );
+            '4': Generar90Ord( arch );
+            '5': Generar90OrdDec( arch );
+            '0': ;
+         end;
+    end; { procedure MenuGenerar }
+
+(*********************************************************)
+
+{ procedure MenuPrincipal( var arch: text; var datos: TABLA );}
+
+    var
+       datos: TABLA;
+       arch: text;
+       tecla: char;
+       salir: boolean;
+
+    begin
+     randomize;
+     assign( arch, 'DATOS.TXT' );
+     salir := false;
+     textbackground( Blue );
+
+     while not salir do
+       begin
+            clrscr;
+            textcolor( Yellow );
+            gotoxy( 19, 3 );
+            writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
+            gotoxy( 19, 4 );
+            writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
+            gotoxy( 1, 7 );
+            textcolor( LightCyan );
+            writeln( '  Men£ Principal:' );
+            writeln( '  ---- ---------' );
+            textcolor( LightGray );
+            writeln;
+            writeln;
+            writeln( '     1.- Generar Archivo (''DATOS.TXT'').' );
+            writeln( '     2.- Evaluar Algoritmos.' );
+            writeln( '     0.- Salir.' );
+            gotoxy( 1, 20 );
+            textcolor( White );
+            write( '  Ingrese su opci¢n: ' );
+            textcolor( Yellow );
+            tecla := readkey;
+            while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
+              begin
+                   textcolor( White );
+                   gotoxy( 1, 20 );
+                   write( '  Ingrese su opci¢n (1, 2 o 0): ' );
+                   textcolor( Yellow );
+                   tecla := readkey;
+              end;
+            case tecla of
+                 '1': MenuGenerar( arch );
+                 '2': MenuEvaluar( datos, arch );
+                 '0': salir := true;
+            end;
+       end;
+     writeln;
+     NormVideo;
+     clrscr;
+     writeln;
+     textcolor( white );
+     writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n 1.1.0 <-o-o-> Luca - Soft' );
+     NormVideo;
+     writeln( '  Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );
+     writeln( '  Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );
+     writeln;
+     textcolor( LightMagenta );
+     write( '                lluca@cnba.uba.ar' );
+     NormVideo;
+     write( '   o   ' );
+     textcolor( LightMagenta );
+     writeln( 'lluca@geocities.com' );
+     NormVideo;
+     writeln;
+     writeln( '  (c) 1999 - Todos los derechos reservados.' );
+     delay( 750 );
+
+     {close( arch );}
   end.
\ No newline at end of file
   end.
\ No newline at end of file
index aa9abc8c5928b3a59ed60b2ca408408bd6380304..477b68ab862648665e8e4f57b0011d5fdef9ce10 100644 (file)
-program SortDemo ( Input, Output );\r
-uses\r
-   Crt;\r
-\r
-const\r
-   Max = 16;\r
-\r
-type\r
-   ArrayType = array [ 1 .. Max ] of Integer;\r
-\r
-var\r
-   A : ArrayType;\r
-\r
-   procedure DisplayArray ( var A : ArrayType );\r
-   var\r
-      I : Integer;\r
-   begin\r
-      ClrScr;\r
-      GotoXY( 1, 5 );\r
-      Write( '(' );\r
-      for I := 1 to Max do\r
-      begin\r
-         Write( A[ I ] : 3 );\r
-         if I <> Max then\r
-            Write( ',' )\r
-         else\r
-            Write( ')' )\r
-      end\r
-   end;\r
-\r
-   procedure FillArray( var A : ArrayType );\r
-   var\r
-      I : Integer;\r
-   begin\r
-      Randomize;\r
-      for I := 1 to Max do\r
-         A[ I ] := Random( 100 )\r
-   end;\r
-\r
-   procedure WriteLT ( Position : Integer;\r
-                       Level    : Integer );\r
-   begin\r
-      GoToXY( 4 * Position - 2, Level );\r
-      TextColor( White );\r
-      Write( ' >' );\r
-      TextColor( LightGray );\r
-   end;\r
-\r
-   procedure WriteBlank ( Position : Integer;\r
-                          Level    : Integer );\r
-   begin\r
-      GoToXY( 4 * Position - 2, Level );\r
-      TextColor( Black );\r
-      Write( '   ' );\r
-      TextColor( LightGray );\r
-   end;\r
-\r
-   procedure WriteColor ( I     : Integer;\r
-                          Value : Integer;\r
-                          Color : Integer;\r
-                          Row   : Integer );\r
-   var\r
-      X : Integer;\r
-   begin\r
-      X := 4 * I - 2;\r
-      GoToXY( X, Row );\r
-      TextColor( Color );\r
-      Write( Value : 3 );\r
-      TextColor( LightGray )\r
-   end;\r
-\r
-   procedure WriteNormal ( I     : Integer;\r
-                           Value : Integer );\r
-   var\r
-      X : Integer;\r
-   begin\r
-      X := 4 * I - 2;\r
-      TextColor( LightGray );\r
-      GoToXY( X, 5 );\r
-      Write( Value : 3 )\r
-   end;\r
-\r
-\r
-   procedure MergeSort ( var A : ArrayType );\r
-   {V}  var\r
-   {V}     Level : Integer;\r
-   {V}     I : Integer;\r
-\r
-      procedure Transfer( var F, T    : ArrayType;\r
-                              FromFirst,\r
-                              FromLast,\r
-                              ToFirst : Integer );\r
-      var\r
-         I : Integer;\r
-      begin\r
-         for I := FromFirst to FromLast do\r
-            T[ ToFirst + ( I - FromFirst ) ] := F[ I ];\r
-      end;  {Transfer}\r
-\r
-      procedure Merge ( var A    : ArrayType;\r
-                            First,\r
-                            Last : Integer );\r
-      var\r
-         MidPoint,\r
-         Left,\r
-         Right,\r
-         Count  : Integer;\r
-         Temp : ArrayType;\r
-\r
-      {V}   I : Integer;\r
-      {V}   Ch : Char;\r
-\r
-      begin\r
-         Count := First;\r
-         MidPoint := ( First + Last ) div 2;\r
-         Left := First;\r
-         Right := Midpoint + 1;\r
-\r
-         {V}  for I := First to Midpoint do\r
-         {V}     WriteColor( I, A[ I ], LightRed, 5 );\r
-         {V}  for I := Right to Last do\r
-         {V}     WriteColor( I, A[ I ], LightBlue, 5 );\r
-         {V}  Ch := ReadKey;\r
-\r
-         {V}  for I := First to Last do\r
-         {V}     WriteBlank( I, 5 );\r
-         {V}  for I := First to Midpoint do\r
-         {V}     WriteColor( I, A[ I ], LightRed, 10 );\r
-         {V}  for I := Right to Last do\r
-         {V}    WriteColor( I, A[ I ], LightBlue, 11 );\r
-         {V}  Ch := ReadKey;\r
-\r
-         while ( Left <= Midpoint ) and ( Right <= Last ) do\r
-         begin\r
-            if A[ Left ] < A[ Right ] then\r
-            begin\r
-               Temp[ Count ] := A[ Left ];\r
-\r
-               {V}  WriteColor( Count, A[ Left ], LightRed, 5 );\r
-               {V}  WriteBlank( Left, 10 );\r
-               {V}  Ch := ReadKey;\r
-\r
-               Inc( Left );\r
-            end\r
-            else\r
-            begin\r
-               Temp[ Count ] := A[ Right ];\r
-\r
-               {V}  WriteColor( Count, A[ Right ], LightBlue, 5 );\r
-               {V}  WriteBlank( Right, 11 );\r
-               {V}  Ch := ReadKey;\r
-\r
-               Inc( Right );\r
-            end;\r
-            Inc( Count )\r
-         end;\r
-\r
-         if ( Left <= MidPoint ) then\r
-         {V}  begin\r
-            Transfer( A, Temp, Left, Midpoint, Count );\r
-            {V}  for I := Left to Midpoint do\r
-            {V}  begin\r
-            {V}     WriteColor( Count, A[ I ], LightRed, 5 );\r
-            {V}     WriteBlank( I, 10 );\r
-            {V}     Inc( Count );\r
-            {V}     Ch := ReadKey;\r
-            {V}  end;\r
-         {V} end\r
-\r
-         else\r
-         {V}  begin\r
-            Transfer( A, Temp, Right, Last, Count );\r
-            {V}  for I := Right to Last do\r
-            {V}  begin\r
-            {V}     WriteColor( Count, A[ I ], LightBlue, 5 );\r
-            {V}     WriteBlank( I, 11 );\r
-            {V}     Inc( Count );\r
-            {V}     Ch := ReadKey;\r
-            {V}  end;\r
-         {V}   end;\r
-\r
-         Transfer( Temp, A, First, Last, First );\r
-\r
-\r
-      end;  {Merge}\r
-\r
-      procedure MSort ( var A     : ArrayType;\r
-                            First,\r
-                            Last  : Integer );\r
-      var\r
-         MidPoint : Integer;\r
-      {V}   I : Integer;\r
-      {V}   Ch : Char;\r
-      begin\r
-         if First < Last then\r
-         begin\r
-            MidPoint := ( First + Last ) div 2;\r
-            MSort( A, First, MidPoint );\r
-\r
-            {V}  for I := First to MidPoint do\r
-            {V}     WriteLT( I, Level );\r
-            {V}  Inc( Level );\r
-\r
-            MSort( A, MidPoint + 1, Last );\r
-\r
-            {V}  for I := MidPoint + 1 to Last do\r
-            {V}     WriteLT( I, Level );\r
-            {V}  Inc( Level );\r
-\r
-            Merge( A, First, Last );\r
-\r
-            {V}  for I := MidPoint + 1 to Last do\r
-            {V}  begin\r
-            {V}     WriteBlank( I, Level );\r
-            {V}     WriteBlank( I, Level - 1 );\r
-            {V}     WriteLT( I, Level - 2 );\r
-            {V}  end;\r
-            {V}  Dec( Level, 2 );\r
-\r
-            {V}  for I := First to Last do\r
-            {V}     WriteNormal( I, A[ I ] );\r
-            {V}  Ch := ReadKey\r
-         end\r
-      end;  {MSort}\r
-\r
-   begin\r
-      {V}  Level := 6;\r
-\r
-      MSort( A, 1, Max );\r
-\r
-      {V}  for I := 1 to Max do\r
-      {V}     WriteLT( I, Level );\r
-   end;  {MergeSort}\r
-\r
-begin\r
-   FillArray( A );\r
-   DisplayArray( A );\r
-   MergeSort( A );\r
-end.\r
-\r
+program SortDemo ( Input, Output );
+uses
+   Crt;
+
+const
+   Max = 16;
+
+type
+   ArrayType = array [ 1 .. Max ] of Integer;
+
+var
+   A : ArrayType;
+
+   procedure DisplayArray ( var A : ArrayType );
+   var
+      I : Integer;
+   begin
+      ClrScr;
+      GotoXY( 1, 5 );
+      Write( '(' );
+      for I := 1 to Max do
+      begin
+         Write( A[ I ] : 3 );
+         if I <> Max then
+            Write( ',' )
+         else
+            Write( ')' )
+      end
+   end;
+
+   procedure FillArray( var A : ArrayType );
+   var
+      I : Integer;
+   begin
+      Randomize;
+      for I := 1 to Max do
+         A[ I ] := Random( 100 )
+   end;
+
+   procedure WriteLT ( Position : Integer;
+                       Level    : Integer );
+   begin
+      GoToXY( 4 * Position - 2, Level );
+      TextColor( White );
+      Write( ' >' );
+      TextColor( LightGray );
+   end;
+
+   procedure WriteBlank ( Position : Integer;
+                          Level    : Integer );
+   begin
+      GoToXY( 4 * Position - 2, Level );
+      TextColor( Black );
+      Write( '   ' );
+      TextColor( LightGray );
+   end;
+
+   procedure WriteColor ( I     : Integer;
+                          Value : Integer;
+                          Color : Integer;
+                          Row   : Integer );
+   var
+      X : Integer;
+   begin
+      X := 4 * I - 2;
+      GoToXY( X, Row );
+      TextColor( Color );
+      Write( Value : 3 );
+      TextColor( LightGray )
+   end;
+
+   procedure WriteNormal ( I     : Integer;
+                           Value : Integer );
+   var
+      X : Integer;
+   begin
+      X := 4 * I - 2;
+      TextColor( LightGray );
+      GoToXY( X, 5 );
+      Write( Value : 3 )
+   end;
+
+
+   procedure MergeSort ( var A : ArrayType );
+   {V}  var
+   {V}     Level : Integer;
+   {V}     I : Integer;
+
+      procedure Transfer( var F, T    : ArrayType;
+                              FromFirst,
+                              FromLast,
+                              ToFirst : Integer );
+      var
+         I : Integer;
+      begin
+         for I := FromFirst to FromLast do
+            T[ ToFirst + ( I - FromFirst ) ] := F[ I ];
+      end;  {Transfer}
+
+      procedure Merge ( var A    : ArrayType;
+                            First,
+                            Last : Integer );
+      var
+         MidPoint,
+         Left,
+         Right,
+         Count  : Integer;
+         Temp : ArrayType;
+
+      {V}   I : Integer;
+      {V}   Ch : Char;
+
+      begin
+         Count := First;
+         MidPoint := ( First + Last ) div 2;
+         Left := First;
+         Right := Midpoint + 1;
+
+         {V}  for I := First to Midpoint do
+         {V}     WriteColor( I, A[ I ], LightRed, 5 );
+         {V}  for I := Right to Last do
+         {V}     WriteColor( I, A[ I ], LightBlue, 5 );
+         {V}  Ch := ReadKey;
+
+         {V}  for I := First to Last do
+         {V}     WriteBlank( I, 5 );
+         {V}  for I := First to Midpoint do
+         {V}     WriteColor( I, A[ I ], LightRed, 10 );
+         {V}  for I := Right to Last do
+         {V}    WriteColor( I, A[ I ], LightBlue, 11 );
+         {V}  Ch := ReadKey;
+
+         while ( Left <= Midpoint ) and ( Right <= Last ) do
+         begin
+            if A[ Left ] < A[ Right ] then
+            begin
+               Temp[ Count ] := A[ Left ];
+
+               {V}  WriteColor( Count, A[ Left ], LightRed, 5 );
+               {V}  WriteBlank( Left, 10 );
+               {V}  Ch := ReadKey;
+
+               Inc( Left );
+            end
+            else
+            begin
+               Temp[ Count ] := A[ Right ];
+
+               {V}  WriteColor( Count, A[ Right ], LightBlue, 5 );
+               {V}  WriteBlank( Right, 11 );
+               {V}  Ch := ReadKey;
+
+               Inc( Right );
+            end;
+            Inc( Count )
+         end;
+
+         if ( Left <= MidPoint ) then
+         {V}  begin
+            Transfer( A, Temp, Left, Midpoint, Count );
+            {V}  for I := Left to Midpoint do
+            {V}  begin
+            {V}     WriteColor( Count, A[ I ], LightRed, 5 );
+            {V}     WriteBlank( I, 10 );
+            {V}     Inc( Count );
+            {V}     Ch := ReadKey;
+            {V}  end;
+         {V} end
+
+         else
+         {V}  begin
+            Transfer( A, Temp, Right, Last, Count );
+            {V}  for I := Right to Last do
+            {V}  begin
+            {V}     WriteColor( Count, A[ I ], LightBlue, 5 );
+            {V}     WriteBlank( I, 11 );
+            {V}     Inc( Count );
+            {V}     Ch := ReadKey;
+            {V}  end;
+         {V}   end;
+
+         Transfer( Temp, A, First, Last, First );
+
+
+      end;  {Merge}
+
+      procedure MSort ( var A     : ArrayType;
+                            First,
+                            Last  : Integer );
+      var
+         MidPoint : Integer;
+      {V}   I : Integer;
+      {V}   Ch : Char;
+      begin
+         if First < Last then
+         begin
+            MidPoint := ( First + Last ) div 2;
+            MSort( A, First, MidPoint );
+
+            {V}  for I := First to MidPoint do
+            {V}     WriteLT( I, Level );
+            {V}  Inc( Level );
+
+            MSort( A, MidPoint + 1, Last );
+
+            {V}  for I := MidPoint + 1 to Last do
+            {V}     WriteLT( I, Level );
+            {V}  Inc( Level );
+
+            Merge( A, First, Last );
+
+            {V}  for I := MidPoint + 1 to Last do
+            {V}  begin
+            {V}     WriteBlank( I, Level );
+            {V}     WriteBlank( I, Level - 1 );
+            {V}     WriteLT( I, Level - 2 );
+            {V}  end;
+            {V}  Dec( Level, 2 );
+
+            {V}  for I := First to Last do
+            {V}     WriteNormal( I, A[ I ] );
+            {V}  Ch := ReadKey
+         end
+      end;  {MSort}
+
+   begin
+      {V}  Level := 6;
+
+      MSort( A, 1, Max );
+
+      {V}  for I := 1 to Max do
+      {V}     WriteLT( I, Level );
+   end;  {MergeSort}
+
+begin
+   FillArray( A );
+   DisplayArray( A );
+   MergeSort( A );
+end.
+
index f33b5c32d0dc703078fc265ef4d8c1eba128d37f..aeee128df35fde3228a7f8052d2bc0c7b2c5ff1e 100644 (file)
-program SortDemo ( Input, Output );\r
-uses\r
-   Crt;\r
-\r
-const\r
-   Max = 12;\r
-\r
-type\r
-   ArrayType = array [ 1 .. Max ] of Integer;\r
-\r
-var\r
-   A : ArrayType;\r
-\r
-   procedure DisplayArray ( var A : ArrayType );\r
-   var\r
-      I : Integer;\r
-   begin\r
-      ClrScr;\r
-      GotoXY( 1, 5 );\r
-      Write( '(' );\r
-      for I := 1 to Max do\r
-      begin\r
-         Write( A[ I ] : 4 );\r
-         if I <> Max then\r
-            Write( ',' )\r
-         else\r
-            Write( ')' )\r
-      end\r
-   end;\r
-\r
-   procedure FillArray( var A : ArrayType );\r
-   var\r
-      I : Integer;\r
-   begin\r
-      Randomize;\r
-      for I := 1 to Max do\r
-         A[ I ] := Random( 100 )\r
-   end;\r
-\r
-\r
-   procedure WriteColor ( I     : Integer;\r
-                          Value : Integer;\r
-                          Color : Integer );\r
-   var\r
-      X : Integer;\r
-   begin\r
-      X := 5 * I - 3;\r
-      GoToXY( X, 5 );\r
-      TextColor( Color );\r
-      Write( Value : 4 );\r
-      TextColor( LightGray )\r
-   end;\r
-\r
-   procedure WriteChColor ( I, J : Integer );\r
-   var\r
-      X : Integer;\r
-   begin\r
-      X := 5 * I - 1;\r
-      TextColor( White );\r
-      GotoXY( X, 7 );\r
-      Write( 'Lo' );\r
-      X := 5 * J - 1;\r
-      GoToXY( X, 7 );\r
-      Write( 'Hi' );\r
-   end;\r
-\r
-\r
-   procedure WriteNormal ( I     : Integer;\r
-                           Value : Integer );\r
-   var\r
-      X : Integer;\r
-   begin\r
-      X := 5 * I - 3;\r
-      TextColor( LightGray );\r
-      GoToXY( X, 5 );\r
-      Write( Value : 4 )\r
-   end;\r
-\r
-   procedure SetDisplay ( Pivot, Lo, Hi : Integer );\r
-   var\r
-      Ch : Char;\r
-   begin\r
-      GoToXY( 1, 9 );\r
-      TextColor( Green );\r
-      Write( 'Pivot Value = ', Pivot : 3 );\r
-      TextColor( LightRed );\r
-      Write( '        Lo Index = ', Lo : 3 );\r
-      TextColor( LightBlue );\r
-      Write( '        Hi Index = ', Hi : 3 );\r
-      WriteChColor( Lo, Hi );\r
-      Ch := ReadKey;\r
-      GoToXY( 1, 9 );\r
-      ClrEol;\r
-      GoToXY( 1, 7 );\r
-      Write('                                                                  ');\r
-      GoToXY( 1, 8 );\r
-      Write('                                                                  ');\r
-      GoToXY( 1, 9 );\r
-      Write('                                                                  ');\r
-      TextColor( LightGray );\r
-   end;\r
-\r
-   procedure QuickSort ( var A       : ArrayType;\r
-                             Lower,\r
-                             Upper   : Integer );\r
-\r
-   var\r
-      PivotPoint : Integer;\r
-      Ch : Char;\r
-      I : Integer;\r
-\r
-      PPos : Integer;\r
-\r
-      Procedure Partition ( var A          : ArrayType;\r
-                                Lo,\r
-                                Hi         : Integer;\r
-                            var PivotPoint : Integer );\r
-      var\r
-         Pivot : Integer;\r
-      begin\r
-         Pivot := A[ Lo ];\r
-         PPos := Lo;\r
-         WriteColor( PPos, Pivot, Cyan + Black + Blink );\r
-         SetDisplay( Pivot, Lo, Hi );\r
-         while Lo < Hi do\r
-         begin\r
-            while ( Pivot < A[ Hi ] ) and ( Lo < Hi ) do\r
-            begin\r
-               Hi := Hi - 1;\r
-               SetDisplay( Pivot, Lo, Hi );\r
-            end;\r
-            if Hi <> Lo then\r
-            begin\r
-               WriteColor( Lo, A[ Hi ], LightRed );\r
-               A[ Lo ] := A[ Hi ];\r
-               if Lo = PPos then\r
-               begin\r
-                  WriteColor( Hi, Pivot, Cyan + Black + Blink );\r
-                  PPos := Hi;\r
-               end;\r
-               Lo := Lo + 1;\r
-               SetDisplay( Pivot, Lo, Hi );\r
-            end;\r
-\r
-            while ( Pivot > A[ Lo ] ) and ( Lo < Hi ) do\r
-            begin\r
-               Lo := Lo + 1;\r
-               SetDisplay( Pivot, Lo, Hi );\r
-            end;\r
-            if Hi <> Lo then\r
-            begin\r
-               WriteColor( Hi, A[ Lo ], LightBlue );\r
-               A[ Hi ] := A[ Lo ];\r
-               if Hi = PPos then\r
-               begin\r
-                  WriteColor( Lo, Pivot, Cyan + Black + Blink );\r
-                  PPos := Lo;\r
-               end;\r
-               Hi := Hi - 1;\r
-               SetDisplay( Pivot, Lo, Hi );\r
-            end;\r
-\r
-         end;\r
-         WriteColor( Hi, Pivot, Yellow );\r
-         Ch := ReadKey;\r
-         A[ Hi ] := Pivot;\r
-         PivotPoint := Hi\r
-      end;\r
-\r
-   begin\r
-      Partition( A, Lower, Upper, PivotPoint );\r
-      for I := Lower to Upper do\r
-         if I <> PivotPoint then\r
-            WriteNormal( I, A[ I ] );\r
-      if Lower < PivotPoint then\r
-         QuickSort( A, Lower, PivotPoint - 1 );\r
-      if Upper > PivotPoint then\r
-         QuickSort( A, PivotPoint + 1, Upper )\r
-   end;\r
-\r
-begin\r
-  FillArray( A );\r
-  DisplayArray( A );\r
-  QuickSort( A, 1, Max );\r
-  ClrScr\r
-end.\r
-\r
+program SortDemo ( Input, Output );
+uses
+   Crt;
+
+const
+   Max = 12;
+
+type
+   ArrayType = array [ 1 .. Max ] of Integer;
+
+var
+   A : ArrayType;
+
+   procedure DisplayArray ( var A : ArrayType );
+   var
+      I : Integer;
+   begin
+      ClrScr;
+      GotoXY( 1, 5 );
+      Write( '(' );
+      for I := 1 to Max do
+      begin
+         Write( A[ I ] : 4 );
+         if I <> Max then
+            Write( ',' )
+         else
+            Write( ')' )
+      end
+   end;
+
+   procedure FillArray( var A : ArrayType );
+   var
+      I : Integer;
+   begin
+      Randomize;
+      for I := 1 to Max do
+         A[ I ] := Random( 100 )
+   end;
+
+
+   procedure WriteColor ( I     : Integer;
+                          Value : Integer;
+                          Color : Integer );
+   var
+      X : Integer;
+   begin
+      X := 5 * I - 3;
+      GoToXY( X, 5 );
+      TextColor( Color );
+      Write( Value : 4 );
+      TextColor( LightGray )
+   end;
+
+   procedure WriteChColor ( I, J : Integer );
+   var
+      X : Integer;
+   begin
+      X := 5 * I - 1;
+      TextColor( White );
+      GotoXY( X, 7 );
+      Write( 'Lo' );
+      X := 5 * J - 1;
+      GoToXY( X, 7 );
+      Write( 'Hi' );
+   end;
+
+
+   procedure WriteNormal ( I     : Integer;
+                           Value : Integer );
+   var
+      X : Integer;
+   begin
+      X := 5 * I - 3;
+      TextColor( LightGray );
+      GoToXY( X, 5 );
+      Write( Value : 4 )
+   end;
+
+   procedure SetDisplay ( Pivot, Lo, Hi : Integer );
+   var
+      Ch : Char;
+   begin
+      GoToXY( 1, 9 );
+      TextColor( Green );
+      Write( 'Pivot Value = ', Pivot : 3 );
+      TextColor( LightRed );
+      Write( '        Lo Index = ', Lo : 3 );
+      TextColor( LightBlue );
+      Write( '        Hi Index = ', Hi : 3 );
+      WriteChColor( Lo, Hi );
+      Ch := ReadKey;
+      GoToXY( 1, 9 );
+      ClrEol;
+      GoToXY( 1, 7 );
+      Write('                                                                  ');
+      GoToXY( 1, 8 );
+      Write('                                                                  ');
+      GoToXY( 1, 9 );
+      Write('                                                                  ');
+      TextColor( LightGray );
+   end;
+
+   procedure QuickSort ( var A       : ArrayType;
+                             Lower,
+                             Upper   : Integer );
+
+   var
+      PivotPoint : Integer;
+      Ch : Char;
+      I : Integer;
+
+      PPos : Integer;
+
+      Procedure Partition ( var A          : ArrayType;
+                                Lo,
+                                Hi         : Integer;
+                            var PivotPoint : Integer );
+      var
+         Pivot : Integer;
+      begin
+         Pivot := A[ Lo ];
+         PPos := Lo;
+         WriteColor( PPos, Pivot, Cyan + Black + Blink );
+         SetDisplay( Pivot, Lo, Hi );
+         while Lo < Hi do
+         begin
+            while ( Pivot < A[ Hi ] ) and ( Lo < Hi ) do
+            begin
+               Hi := Hi - 1;
+               SetDisplay( Pivot, Lo, Hi );
+            end;
+            if Hi <> Lo then
+            begin
+               WriteColor( Lo, A[ Hi ], LightRed );
+               A[ Lo ] := A[ Hi ];
+               if Lo = PPos then
+               begin
+                  WriteColor( Hi, Pivot, Cyan + Black + Blink );
+                  PPos := Hi;
+               end;
+               Lo := Lo + 1;
+               SetDisplay( Pivot, Lo, Hi );
+            end;
+
+            while ( Pivot > A[ Lo ] ) and ( Lo < Hi ) do
+            begin
+               Lo := Lo + 1;
+               SetDisplay( Pivot, Lo, Hi );
+            end;
+            if Hi <> Lo then
+            begin
+               WriteColor( Hi, A[ Lo ], LightBlue );
+               A[ Hi ] := A[ Lo ];
+               if Hi = PPos then
+               begin
+                  WriteColor( Lo, Pivot, Cyan + Black + Blink );
+                  PPos := Lo;
+               end;
+               Hi := Hi - 1;
+               SetDisplay( Pivot, Lo, Hi );
+            end;
+
+         end;
+         WriteColor( Hi, Pivot, Yellow );
+         Ch := ReadKey;
+         A[ Hi ] := Pivot;
+         PivotPoint := Hi
+      end;
+
+   begin
+      Partition( A, Lower, Upper, PivotPoint );
+      for I := Lower to Upper do
+         if I <> PivotPoint then
+            WriteNormal( I, A[ I ] );
+      if Lower < PivotPoint then
+         QuickSort( A, Lower, PivotPoint - 1 );
+      if Upper > PivotPoint then
+         QuickSort( A, PivotPoint + 1, Upper )
+   end;
+
+begin
+  FillArray( A );
+  DisplayArray( A );
+  QuickSort( A, 1, Max );
+  ClrScr
+end.
+
index 759aaf3192e82ac15798483b4d442d0df2ca55e4..3f9a6216e92f13d36097f18d3768ce0e1f50203a 100644 (file)
@@ -1,57 +1,57 @@
-program qsort;\r
-\r
-uses crt,dos;\r
-\r
-const\r
-     max = 1000;\r
-\r
-type\r
-    list = array[1..max] of integer;\r
-\r
-var\r
-   data : list;\r
-   i : integer;\r
-   h,m,s,hun : word;\r
-\r
- procedure quicksort(var a : list; Lo,Hi: integer);\r
-\r
-    procedure sort(l,r : integer);\r
-\r
-       var\r
-          i,j,x,y : integer;\r
-\r
-       begin\r
-            i := l; j := r; x := a[( l+r ) div 2];\r
-            repeat\r
-                  while a[i] < x do i := i+1;\r
-                  while x < a[j] do j := j-1;\r
-                  if i < j then\r
-                     begin\r
-                          y := a[i]; a[i] := a[j]; a[j] := y;\r
-                          i := i+1; j := j-1;\r
-                     end;\r
-            until i > j;\r
-            if l < j then sort( l , j );\r
-            if i < r then sort( i , r );\r
-       end;\r
-\r
-    begin {quicksort};\r
-         sort( Lo , Hi );\r
-    end;\r
-\r
-\r
-\r
-begin {qsort};\r
-     write('Now generating 1000 random numbers...');\r
-     randomize;\r
-     for i := 1 to max do data[i] := random(30000);\r
-     writeln;\r
-     writeln('Now sorting random numbers...');\r
-     gettime(h,m,s,hun);\r
-     writeln('Start time is : ',h,' : ',m,' : ',s,' : ',hun);\r
-     quicksort( data, 1, max );\r
-     writeln;\r
-     {for i := 1 to max do write(data[i] ); }\r
-     gettime(h,m,s,hun);\r
-     writeln('Finish time is : ',h,' : ',m,' : ',s,' : ',hun);\r
+program qsort;
+
+uses crt,dos;
+
+const
+     max = 1000;
+
+type
+    list = array[1..max] of integer;
+
+var
+   data : list;
+   i : integer;
+   h,m,s,hun : word;
+
+ procedure quicksort(var a : list; Lo,Hi: integer);
+
+    procedure sort(l,r : integer);
+
+       var
+          i,j,x,y : integer;
+
+       begin
+            i := l; j := r; x := a[( l+r ) div 2];
+            repeat
+                  while a[i] < x do i := i+1;
+                  while x < a[j] do j := j-1;
+                  if i < j then
+                     begin
+                          y := a[i]; a[i] := a[j]; a[j] := y;
+                          i := i+1; j := j-1;
+                     end;
+            until i > j;
+            if l < j then sort( l , j );
+            if i < r then sort( i , r );
+       end;
+
+    begin {quicksort};
+         sort( Lo , Hi );
+    end;
+
+
+
+begin {qsort};
+     write('Now generating 1000 random numbers...');
+     randomize;
+     for i := 1 to max do data[i] := random(30000);
+     writeln;
+     writeln('Now sorting random numbers...');
+     gettime(h,m,s,hun);
+     writeln('Start time is : ',h,' : ',m,' : ',s,' : ',hun);
+     quicksort( data, 1, max );
+     writeln;
+     {for i := 1 to max do write(data[i] ); }
+     gettime(h,m,s,hun);
+     writeln('Finish time is : ',h,' : ',m,' : ',s,' : ',hun);
 end.
\ No newline at end of file
 end.
\ No newline at end of file
index 656d8d56af6c08de7cfd9b2cf8224c9e806b8ff2..f7086e86930a1ae6e0fb69bdce92bf558dcb953a 100644 (file)
@@ -1,39 +1,39 @@
-PROCEDURE Shell( Var Item : DataArray; Count: Integer );\r
-\r
-CONST\r
-      N=5;\r
-\r
-VAR\r
-   I,J,K,S,Q : Integer ;\r
-   P : Array[1..N] OF Integer;\r
-   X : DataItem ;\r
-\r
-BEGIN\r
-     P[1] := 9;\r
-     P[2] := 5;\r
-     P[3] := 3;\r
-     P[4] := 3;\r
-     P[5] := 1;\r
-     FOR Q := 1 TO N DO\r
-       BEGIN\r
-            K := P[Q];\r
-            S := K;\r
-            FOR I := K + 1 TO Count DO\r
-              BEGIN\r
-                   X := Item[I] ;\r
-                   J := I - K;\r
-                   IF S = 0;\r
-                     BEGIN\r
-                          S := K;\r
-                          S := S + 1;\r
-                          Item[S] := X;\r
-                     END;\r
-                   WHILE ( X < Item[J] ) and ( J > O ) and ( J <= Count ) DO\r
-                     BEGIN\r
-                          Item[J+K]:=Item[J];\r
-                          J := J - K;\r
-                     END;\r
-                   Item[J+K] := X;\r
-              END;\r
-       END;\r
-     END;\r
+PROCEDURE Shell( Var Item : DataArray; Count: Integer );
+
+CONST
+      N=5;
+
+VAR
+   I,J,K,S,Q : Integer ;
+   P : Array[1..N] OF Integer;
+   X : DataItem ;
+
+BEGIN
+     P[1] := 9;
+     P[2] := 5;
+     P[3] := 3;
+     P[4] := 3;
+     P[5] := 1;
+     FOR Q := 1 TO N DO
+       BEGIN
+            K := P[Q];
+            S := K;
+            FOR I := K + 1 TO Count DO
+              BEGIN
+                   X := Item[I] ;
+                   J := I - K;
+                   IF S = 0;
+                     BEGIN
+                          S := K;
+                          S := S + 1;
+                          Item[S] := X;
+                     END;
+                   WHILE ( X < Item[J] ) and ( J > O ) and ( J <= Count ) DO
+                     BEGIN
+                          Item[J+K]:=Item[J];
+                          J := J - K;
+                     END;
+                   Item[J+K] := X;
+              END;
+       END;
+     END;
index 1dffd190e5abfedee585ac64f54b4b45fbdb8814..d94af894e03f5fb1bc98a8caeb82a7c292431aa5 100644 (file)
@@ -1,40 +1,40 @@
-                {for i := 1 to veces do\r
-                   begin\r
-\r
-                        writeln( ar, 'ciclo for i := 1 to veces do. i: ', i );\r
-                        }\r
-\r
-\r
-                                {if veces1 = 1 then\r
-                                   begin\r
-                                        ape := ap + letra1 + GetRNDApellido( 5, 2 );\r
-                                        dni := dni + random( 50000 ) + 1;\r
-                                        writeln( ar, ap );\r
-                                        writeln( ar, dni );\r
-                                        writeln( ar );\r
-                                        writeln( 'En ape(completo): ', ape,' ', dni );\r
-                                        delay( 500 );\r
-                                   end\r
-                                else\r
-                                   begin}\r
-\r
-                                {if veces1 = 1 then\r
-                                   begin\r
-                                        ape := ap + letra1 + GetRNDApellido( 5, 2 );\r
-                                        dni := dni + random( 50000 ) + 1;\r
-                                        writeln( ar, ap );\r
-                                        writeln( ar, dni );\r
-                                        writeln( ar );\r
-                                        writeln( 'En ape(completo): ', ape,' ', dni );\r
-                                        delay( 500 );\r
-                                   end\r
-                                else\r
-                                   begin}\r
-\r
-\r
-         if cant = 1000 then begin\r
-                                   char1 := 38;\r
-                                   mil := true;\r
-                              end\r
-                         else char1 := 34;\r
-         char2 := char1 + 1;\r
+                {for i := 1 to veces do
+                   begin
+
+                        writeln( ar, 'ciclo for i := 1 to veces do. i: ', i );
+                        }
+
+
+                                {if veces1 = 1 then
+                                   begin
+                                        ape := ap + letra1 + GetRNDApellido( 5, 2 );
+                                        dni := dni + random( 50000 ) + 1;
+                                        writeln( ar, ap );
+                                        writeln( ar, dni );
+                                        writeln( ar );
+                                        writeln( 'En ape(completo): ', ape,' ', dni );
+                                        delay( 500 );
+                                   end
+                                else
+                                   begin}
+
+                                {if veces1 = 1 then
+                                   begin
+                                        ape := ap + letra1 + GetRNDApellido( 5, 2 );
+                                        dni := dni + random( 50000 ) + 1;
+                                        writeln( ar, ap );
+                                        writeln( ar, dni );
+                                        writeln( ar );
+                                        writeln( 'En ape(completo): ', ape,' ', dni );
+                                        delay( 500 );
+                                   end
+                                else
+                                   begin}
+
+
+         if cant = 1000 then begin
+                                   char1 := 38;
+                                   mil := true;
+                              end
+                         else char1 := 34;
+         char2 := char1 + 1;
index e8d77acfbef8c1f23bbb73660bf8a38ba1dce315..df242451bf43bd6ddfc1978e528ca9f9747261f1 100644 (file)
@@ -1,10 +1,10 @@
-#include <iostream.h>\r
-#include <stdlib.h>\r
-#include <time.h>\r
-\r
-int main( void )\r
-{\r
-   srandom( time(0) );\r
-\r
-   cout << random() << "\t" << time(0) << endl;\r
-}\r
+#include <iostream.h>
+#include <stdlib.h>
+#include <time.h>
+
+int main( void )
+{
+   srandom( time(0) );
+
+   cout << random() << "\t" << time(0) << endl;
+}
index 0a438e2f4e00f7fa9801816ae8a517360047fd39..97559f2cce26c0e7f95a9e07c32e972ce5cc60dc 100644 (file)
@@ -1,94 +1,94 @@
-program rndnames;\r
-\r
-uses CRT, DOS;\r
-\r
-type\r
-    HORA = record\r
-                 h,\r
-                 m,\r
-                 s,\r
-                 c: longint;\r
-           end;\r
-\r
-    function GetTiempo( h1, h2: HORA ): longint;\r
-\r
-       var\r
-          t: longint;\r
-          aux: HORA;\r
-\r
-       begin\r
-            if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }\r
-              begin\r
-              if h1.h < h2.h then\r
-                begin\r
-                     aux := h1;\r
-                     h1 := h2;\r
-                     h2 := aux;\r
-                end\r
-              end\r
-            else if h1.m <> h2.m then\r
-                   begin\r
-                   if h1.m < h2.m then\r
-                     begin\r
-                          aux := h1;\r
-                          h1 := h2;\r
-                          h2 := aux;\r
-                     end\r
-                   end\r
-                 else if h1.s <> h2.s then\r
-                        begin\r
-                        if h1.s < h2.s then\r
-                          begin\r
-                               aux := h1;\r
-                               h1 := h2;\r
-                               h2 := aux;\r
-                          end\r
-                        end\r
-                      else if h1.c <> h2.c then\r
-                             if h1.c < h2.c then\r
-                               begin\r
-                                    aux := h1;\r
-                                    h1 := h2;\r
-                                    h2 := aux;\r
-                               end;\r
-            t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60  + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );\r
-            GetTiempo := t;\r
-       end; { function GetTiempo }\r
-\r
-\r
- function GetRNDLetra( min, max: char ): char;\r
-    var i: longint;\r
-    begin\r
-         i :=  ord( max ) - ord( min ) + 1;\r
-         writeln( 'i: ', i );\r
-         GetRNDLetra := chr( random( i ) + ord( min ) );\r
-    end;\r
-\r
-\r
-var\r
-   cad: string;\r
-   i: integer;\r
-   h1, h2: HORA;\r
-   t: longint;\r
-\r
-begin\r
-     randomize;\r
-\r
-     h1.h := 10; h1.m := 10; h1.s := 10; h1.c := 10;\r
-     h2.h := 10; h2.m := 10; h2.s := 9; h2.c := 13;\r
-     t := GetTiempo( h2, h1 );\r
-     writeln( 'T: ', t );\r
-     writeln( 'Numero: ', random( 10 ) );\r
-     writeln( GetRNDLetra( 'A', 'Z' ) );\r
-     for i := 1 to 5 do\r
-     begin\r
-          cad[i] := 'A';\r
-          cad[0] := chr(i);\r
-          writeln( cad );\r
-     end;\r
-     if 'LUCA' > 'LUCALAMIDAS' then\r
-        writeln( '''LUCA'' > ''LUCALAMIDAS''' )\r
-     else\r
-        writeln( '''LUCA'' < ''LUCALAMIDAS''' );\r
-     writeln ('FIN');\r
-end.\r
+program rndnames;
+
+uses CRT, DOS;
+
+type
+    HORA = record
+                 h,
+                 m,
+                 s,
+                 c: longint;
+           end;
+
+    function GetTiempo( h1, h2: HORA ): longint;
+
+       var
+          t: longint;
+          aux: HORA;
+
+       begin
+            if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }
+              begin
+              if h1.h < h2.h then
+                begin
+                     aux := h1;
+                     h1 := h2;
+                     h2 := aux;
+                end
+              end
+            else if h1.m <> h2.m then
+                   begin
+                   if h1.m < h2.m then
+                     begin
+                          aux := h1;
+                          h1 := h2;
+                          h2 := aux;
+                     end
+                   end
+                 else if h1.s <> h2.s then
+                        begin
+                        if h1.s < h2.s then
+                          begin
+                               aux := h1;
+                               h1 := h2;
+                               h2 := aux;
+                          end
+                        end
+                      else if h1.c <> h2.c then
+                             if h1.c < h2.c then
+                               begin
+                                    aux := h1;
+                                    h1 := h2;
+                                    h2 := aux;
+                               end;
+            t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60  + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );
+            GetTiempo := t;
+       end; { function GetTiempo }
+
+
+ function GetRNDLetra( min, max: char ): char;
+    var i: longint;
+    begin
+         i :=  ord( max ) - ord( min ) + 1;
+         writeln( 'i: ', i );
+         GetRNDLetra := chr( random( i ) + ord( min ) );
+    end;
+
+
+var
+   cad: string;
+   i: integer;
+   h1, h2: HORA;
+   t: longint;
+
+begin
+     randomize;
+
+     h1.h := 10; h1.m := 10; h1.s := 10; h1.c := 10;
+     h2.h := 10; h2.m := 10; h2.s := 9; h2.c := 13;
+     t := GetTiempo( h2, h1 );
+     writeln( 'T: ', t );
+     writeln( 'Numero: ', random( 10 ) );
+     writeln( GetRNDLetra( 'A', 'Z' ) );
+     for i := 1 to 5 do
+     begin
+          cad[i] := 'A';
+          cad[0] := chr(i);
+          writeln( cad );
+     end;
+     if 'LUCA' > 'LUCALAMIDAS' then
+        writeln( '''LUCA'' > ''LUCALAMIDAS''' )
+     else
+        writeln( '''LUCA'' < ''LUCALAMIDAS''' );
+     writeln ('FIN');
+end.
index 8bc3d9b156a29faf689e538faea0a9b3ed183354..dae1c4755ac0e1103ed97a7f75f1119c42c635e1 100644 (file)
-program RNDNames;\r
-\r
-const\r
-     MAX_APE = 30;\r
-\r
-type\r
-    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );\r
-    TIPO_VOCAL = ( TV_AEIOU, TV_EI );\r
-    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );\r
-    APELLIDO = string[MAX_APE];\r
-\r
-(*********************************************************)\r
-\r
- function GetVocal( tipo: TIPO_VOCAL ): char;\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        if tipo = TV_AEIOU then valor := random( 16 )\r
-                           else valor := random( 6 ) + 5;\r
-        case valor of\r
-            0..4: GetVocal := 'A';\r
-            5..7: GetVocal :+ 'E';\r
-            8..10: GetVocal :+ 'I';\r
-            11..13: GetVocal :+ 'O';\r
-            14..15: GetVocal :+ 'U';\r
-        end;\r
-   end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-   begin\r
-        proxl := TL_VOCAL;\r
-        indic := I_NADA;\r
-\r
-        case indic of\r
-            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';\r
-            I_ESB: case random( 2 ) of\r
-                       0: conso := 'R';\r
-                       1: conso := 'L';\r
-                   end;\r
-            I_ESC: case random( 4 ) of\r
-                       0: conso := 'C';\r
-                       1: conso := 'H';\r
-                       2: conso := 'R';\r
-                       3: conso := 'L';\r
-                   end;\r
-            I_ESL: case random( 6 ) of\r
-                       0: conso := 'T';\r
-                       1..5: conso := 'L';\r
-                   end;\r
-            I_ESM: case random( 3 ) of\r
-                       0: conso := 'P';\r
-                       1: conso := 'B';\r
-                       2: conso := 'L';\r
-                   end;\r
-            I_ESN: case random( 3 ) of\r
-                            0: conso := 'R';\r
-                            1: conso := 'V';\r
-                            2: conso := 'C';\r
-                   end;\r
-            else case random( 55 ) of\r
-                    0..3: begin\r
-                               conso := 'B';\r
-                               if random( 20 ) = 0 then begin\r
-                                                             indic := I_ESB;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    4..7: begin\r
-                               conso := 'C';\r
-                               if random( 15 ) = 0 then begin\r
-                                                             indic := I_ESC;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                          end;\r
-                    8..11: conso := 'D';\r
-                    12..14: begin\r
-                               conso := 'F';\r
-                               if random( 20 ) = 0 then begin\r
-                                                             indic := I_ESF;\r
-                                                             proxl := TL_CONSO;\r
-                                                        end;\r
-                            end;\r
-                    15..17: begin\r
-                               conso := 'G';\r
-                               if random( 15 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESG;\r
-                                      if random( 4 ) = 0 then proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    18..19: conso := 'H';\r
-                    20..22: conso := 'J';\r
-                    23..24: conso := 'K';\r
-                    25..27: begin\r
-                               conso := 'L';\r
-                               if random( 35 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESL;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    28..30: begin\r
-                               conso := 'M';\r
-                               if random( 15 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESM;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    31..33: begin\r
-                               conso := 'N';\r
-                               if random( 15 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESN;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    34..36: conso := 'P';\r
-                    37..38: begin\r
-                               conso := 'Q';\r
-                               indic := I_ESQ;\r
-                            end;\r
-                    39..41: begin\r
-                               conso := 'R';\r
-                               if random( 10 ) = 0 then\r
-                                 begin\r
-                                      indic := I_ESR;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    42..44: conso := 'S';\r
-                    45..47: begin\r
-                               conso := 'T';\r
-                               if random( 20 ) = 0 then\r
-                                 begin\r
-                                      indic := I_EST;\r
-                                      proxl := TL_CONSO;\r
-                                 end;\r
-                            end;\r
-                    48..50: conso := 'V';\r
-                    51: conso := 'W';\r
-                    52: conso := 'X';\r
-                    53: conso := 'Y';\r
-                    54: conso := 'Z';\r
-                end;\r
-              end;\r
-        end; { case indic of }\r
-   end;\r
-\r
-(*********************************************************)\r
-\r
- procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );\r
-\r
-   var\r
-      valor: integer;\r
-\r
-    begin\r
-        case proxl of\r
-            I_ESQ:\r
-                  begin\r
-                       vocal := 'U';\r
-                       indic := I_ESQU;\r
-                       proxl := TL_VOCAL;\r
-                  end;\r
-            I_ESQU:\r
-                   begin\r
-                        vocal := GetVocal( TV_EI );\r
-                        indic := I_NADA;\r
-                        if random( 25 ) = 0 then proxl := TL_VOCAL\r
-                                           else proxl := TL_CONSO;\r
-                   end;\r
-            else\r
-              begin\r
-                   vocal := GetVocal( TV_AEIOU );\r
-                   indic := I_NADA;\r
-                   if random( 40 ) = 0 then proxl := TL_VOCAL\r
-                                       else proxl := TL_CONSO;\r
-              end;\r
-            end;\r
-    end;\r
-\r
-(*********************************************************)\r
-\r
- function GetRNDApellido( max, min: integer ): APELLIDO;\r
-\r
-       var\r
-       tam, i: integer;\r
-       aux: char;\r
-       apellido: APELLIDO;\r
-       indic: INDICADOR;\r
-       proxl: TIPO_LETRA;\r
-\r
-       begin\r
-         if max > MAX_APE then max := MAX_APE;\r
-         tam := random( max + 1 ) + min;\r
-         indic := I_NADA;\r
-         apellido := '';\r
-         if random( 5 ) = 0 then proxl := TL_VOCAL\r
-                            else proxl := TL_CONSO;\r
-         for i := 1 to tam do\r
-           begin\r
-                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )\r
-                                    else GetRNDVocal( indic, proxl, aux );\r
-                apellido := apellido + aux;\r
-           end;\r
-         GetRNDApellido := apellido;\r
-    end;\r
-\r
-var\r
-   n, i: integer;\r
-\r
-begin\r
-     randomize; (* inicializa la semilla del random *)\r
-\r
-     write( 'Ingrese la cantidad de apellidos a generar: ' );\r
-     readln( n );\r
-     for i := 1 to n do\r
-        writeln( GetRNDApellido( 30, 4 ) );\r
-     writeln;\r
-     writeln( ' FIN!!!' );\r
-end;\r
+program RNDNames;
+
+const
+     MAX_APE = 30;
+
+type
+    TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
+    TIPO_VOCAL = ( TV_AEIOU, TV_EI );
+    INDICADOR = ( I_NADA, I_ESB, I_ESC, I_ESF, I_ESG, I_ESL, I_ESM, I_ESN, I_ESQ, I_ESQU, I_ESR, I_EST );
+    APELLIDO = string[MAX_APE];
+
+(*********************************************************)
+
+ function GetVocal( tipo: TIPO_VOCAL ): char;
+
+   var
+      valor: integer;
+
+   begin
+        if tipo = TV_AEIOU then valor := random( 16 )
+                           else valor := random( 6 ) + 5;
+        case valor of
+            0..4: GetVocal := 'A';
+            5..7: GetVocal :+ 'E';
+            8..10: GetVocal :+ 'I';
+            11..13: GetVocal :+ 'O';
+            14..15: GetVocal :+ 'U';
+        end;
+   end;
+
+(*********************************************************)
+
+ procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
+
+   var
+      valor: integer;
+
+   begin
+        proxl := TL_VOCAL;
+        indic := I_NADA;
+
+        case indic of
+            I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
+            I_ESB: case random( 2 ) of
+                       0: conso := 'R';
+                       1: conso := 'L';
+                   end;
+            I_ESC: case random( 4 ) of
+                       0: conso := 'C';
+                       1: conso := 'H';
+                       2: conso := 'R';
+                       3: conso := 'L';
+                   end;
+            I_ESL: case random( 6 ) of
+                       0: conso := 'T';
+                       1..5: conso := 'L';
+                   end;
+            I_ESM: case random( 3 ) of
+                       0: conso := 'P';
+                       1: conso := 'B';
+                       2: conso := 'L';
+                   end;
+            I_ESN: case random( 3 ) of
+                            0: conso := 'R';
+                            1: conso := 'V';
+                            2: conso := 'C';
+                   end;
+            else case random( 55 ) of
+                    0..3: begin
+                               conso := 'B';
+                               if random( 20 ) = 0 then begin
+                                                             indic := I_ESB;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    4..7: begin
+                               conso := 'C';
+                               if random( 15 ) = 0 then begin
+                                                             indic := I_ESC;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                          end;
+                    8..11: conso := 'D';
+                    12..14: begin
+                               conso := 'F';
+                               if random( 20 ) = 0 then begin
+                                                             indic := I_ESF;
+                                                             proxl := TL_CONSO;
+                                                        end;
+                            end;
+                    15..17: begin
+                               conso := 'G';
+                               if random( 15 ) = 0 then
+                                 begin
+                                      indic := I_ESG;
+                                      if random( 4 ) = 0 then proxl := TL_CONSO;
+                                 end;
+                            end;
+                    18..19: conso := 'H';
+                    20..22: conso := 'J';
+                    23..24: conso := 'K';
+                    25..27: begin
+                               conso := 'L';
+                               if random( 35 ) = 0 then
+                                 begin
+                                      indic := I_ESL;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    28..30: begin
+                               conso := 'M';
+                               if random( 15 ) = 0 then
+                                 begin
+                                      indic := I_ESM;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    31..33: begin
+                               conso := 'N';
+                               if random( 15 ) = 0 then
+                                 begin
+                                      indic := I_ESN;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    34..36: conso := 'P';
+                    37..38: begin
+                               conso := 'Q';
+                               indic := I_ESQ;
+                            end;
+                    39..41: begin
+                               conso := 'R';
+                               if random( 10 ) = 0 then
+                                 begin
+                                      indic := I_ESR;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    42..44: conso := 'S';
+                    45..47: begin
+                               conso := 'T';
+                               if random( 20 ) = 0 then
+                                 begin
+                                      indic := I_EST;
+                                      proxl := TL_CONSO;
+                                 end;
+                            end;
+                    48..50: conso := 'V';
+                    51: conso := 'W';
+                    52: conso := 'X';
+                    53: conso := 'Y';
+                    54: conso := 'Z';
+                end;
+              end;
+        end; { case indic of }
+   end;
+
+(*********************************************************)
+
+ procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
+
+   var
+      valor: integer;
+
+    begin
+        case proxl of
+            I_ESQ:
+                  begin
+                       vocal := 'U';
+                       indic := I_ESQU;
+                       proxl := TL_VOCAL;
+                  end;
+            I_ESQU:
+                   begin
+                        vocal := GetVocal( TV_EI );
+                        indic := I_NADA;
+                        if random( 25 ) = 0 then proxl := TL_VOCAL
+                                           else proxl := TL_CONSO;
+                   end;
+            else
+              begin
+                   vocal := GetVocal( TV_AEIOU );
+                   indic := I_NADA;
+                   if random( 40 ) = 0 then proxl := TL_VOCAL
+                                       else proxl := TL_CONSO;
+              end;
+            end;
+    end;
+
+(*********************************************************)
+
+ function GetRNDApellido( max, min: integer ): APELLIDO;
+
+       var
+       tam, i: integer;
+       aux: char;
+       apellido: APELLIDO;
+       indic: INDICADOR;
+       proxl: TIPO_LETRA;
+
+       begin
+         if max > MAX_APE then max := MAX_APE;
+         tam := random( max + 1 ) + min;
+         indic := I_NADA;
+         apellido := '';
+         if random( 5 ) = 0 then proxl := TL_VOCAL
+                            else proxl := TL_CONSO;
+         for i := 1 to tam do
+           begin
+                if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
+                                    else GetRNDVocal( indic, proxl, aux );
+                apellido := apellido + aux;
+           end;
+         GetRNDApellido := apellido;
+    end;
+
+var
+   n, i: integer;
+
+begin
+     randomize; (* inicializa la semilla del random *)
+
+     write( 'Ingrese la cantidad de apellidos a generar: ' );
+     readln( n );
+     for i := 1 to n do
+        writeln( GetRNDApellido( 30, 4 ) );
+     writeln;
+     writeln( ' FIN!!!' );
+end;