1 program Comparacion_De_Algoritmos_De_Ordenamiento;
\r
12 APELLIDO = string[MAX_APE];
\r
13 DOCUMENTO = longint;
\r
18 TABLA = array[1..1000] of PERSONA;
\r
20 (*********************************************************)
\r
22 procedure CargarArchivo( var datos: TABLA; var ar: text; tam: integer );
\r
30 writeln( ar, datos[i].ap );
\r
31 writeln( ar, datos[i].dni );
\r
34 end; { procedure CargarArchivo }
\r
36 (*********************************************************)
\r
38 procedure Retardar( centenas: longint );
\r
44 for i:= 1 to centenas * 100 do ;
\r
45 end; { procedure Retardar }
\r
47 (*********************************************************)
\r
48 (*********************************************************)
\r
50 procedure MenuEvaluar( var datos: TABLA; var arch: text );
\r
59 ORDEN = ( CRECIENTE, DECRECIENTE );
\r
66 bs, bsm, shs, rs, ss, is, sls, slsm, qs: MEDICION;
\r
68 (*********************************************************)
\r
70 procedure CrearInforme( ord: ORDEN );
\r
72 (*********************************************************)
\r
74 procedure InfMetodo( var info: text; metodo: string; sort: MEDICION );
\r
78 writeln( info, metodo, ':' );
\r
79 writeln( info, ' Comparaciones: ', sort.Comp: 1 );
\r
80 writeln( info, ' Intercambios: ', sort.Int div 3: 1, ' (', sort.Int: 1, ' asignaciones)' );
\r
81 writeln( info, ' Tiempo (seg): ', sort.Tiem / 100: 2: 2 );
\r
82 end; { procedure InfMetodo }
\r
84 (*********************************************************)
\r
86 var { procedure CrearInforme }
\r
90 assign( info, 'INFORME.TXT' );
\r
93 if ord = DECRECIENTE then
\r
95 writeln( info, 'INFORME: Orden Decreciente.' );
\r
96 writeln( info, '======= ~~~~~ ~~~~~~~~~~~' );
\r
100 writeln( info, 'INFORME: Orden Creciente.' );
\r
101 writeln( info, '======= ~~~~~ ~~~~~~~~~' );
\r
104 InfMetodo( info, 'Bubble Sort', bs );
\r
105 InfMetodo( info, 'Bubble Sort Mejorado', bsm );
\r
106 InfMetodo( info, 'Shake Sort', shs );
\r
107 InfMetodo( info, 'Ripple Sort', rs );
\r
108 InfMetodo( info, 'Selection Sort', ss );
\r
109 InfMetodo( info, 'Insertion Sort', is );
\r
110 InfMetodo( info, 'Shell''s Sort', sls );
\r
111 InfMetodo( info, 'Shell''s Sort Mejorado', slsm );
\r
112 InfMetodo( info, 'Quick Sort', qs );
\r
115 writeln( info, 'NOTA: La cantidad de intercambios medida se tom¢ a partir de la cantidad de' );
\r
116 writeln( info, '==== asignaciones, ya que en el Insertion Sort no hay intercambios. De esta' );
\r
117 writeln( info, ' manera, un intercambio equivales a 3 asignaciones.' );
\r
119 end; { procedure CrearInforme }
\r
121 (*********************************************************)
\r
123 procedure NoExisteArch;
\r
128 textcolor( LightMagenta + Blink );
\r
129 writeln( 'ERROR: No existe el archivo a evaluar!' );
\r
130 textcolor( LightGray );
\r
132 writeln( ' Creelo seleccionando la opci¢n 1 del Men£ Principal.' );
\r
134 end; { procedure NoExisteArch }
\r
136 (*********************************************************)
\r
138 function ExisteArchivo( nombre: String ): boolean;
\r
140 { funcion extrida de la ayuda del Turbo Pascal 7 }
\r
147 Assign( arch, nombre );
\r
148 FileMode := 0; { Solo lectura }
\r
152 ExisteArchivo := (IOResult = 0) and (nombre <> '');
\r
153 end; { function ExisteArchivo }
\r
155 (*********************************************************)
\r
157 procedure CargarTabla( var ar: text; var datos: TABLA; tam: integer );
\r
164 for i:= 1 to tam do
\r
166 readln( ar, datos[i].ap );
\r
167 readln( ar, datos[i].dni );
\r
168 readln( ar, void );
\r
170 end; { procedure CargarTabla }
\r
172 (*********************************************************)
\r
174 procedure Intercambiar( var a, b: PERSONA; var int: longint );
\r
181 Retardar( RETARDO );
\r
184 Retardar( RETARDO );
\r
187 Retardar( RETARDO );
\r
189 end; { procedure Intercambiar }
\r
191 (*********************************************************)
\r
193 procedure GetHora( var hor: HORA );
\r
199 gettime( h, m, s, c );
\r
204 end; { procedure GetHora }
\r
206 (*********************************************************)
\r
208 function GetTiempo( h1, h2: HORA ): longint;
\r
215 if h1.h <> h2.h then { pone al menor como h2 y al mayor como h1 }
\r
217 if h1.h < h2.h then
\r
224 else if h1.m <> h2.m then
\r
226 if h1.m < h2.m then
\r
233 else if h1.s <> h2.s then
\r
235 if h1.s < h2.s then
\r
242 else if h1.c <> h2.c then
\r
243 if h1.c < h2.c then
\r
249 t := ( ( ( h1.h - h2.h ) * 60 + ( h1.m - h2.m ) ) * 60 + ( h1.s - h2.s ) ) * 100 + ( h1.c - h2.c );
\r
251 end; { function GetTiempo }
\r
253 (*********************************************************)
\r
255 procedure EvaluarCre( var datos: TABLA; var arch: text );
\r
257 (*********************************************************)
\r
259 procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
270 CargarTabla( arch, datos, 1000 );
\r
272 for i := tam - 1 downto 1 do
\r
274 for j := tam - 1 downto 1 do
\r
276 m.Comp := m.Comp + 1;
\r
277 Retardar( RETARDO );
\r
278 if datos[j].ap > datos[j+1].ap then
\r
279 Intercambiar( datos[j], datos[j+1], m.Int);
\r
283 m.Tiem := GetTiempo( h1, h2 );
\r
284 end; { procedure BubbleSort }
\r
286 (*********************************************************)
\r
288 procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
301 CargarTabla( arch, datos, 1000 );
\r
307 for i := tam - 1 downto n do
\r
309 m.Comp := m.Comp + 1;
\r
310 Retardar( RETARDO );
\r
311 if datos[i].ap > datos[i+1].ap then
\r
313 Intercambiar( datos[i], datos[i+1], m.Int);
\r
320 m.Tiem := GetTiempo( h1, h2 );
\r
321 end; { procedure BubbleSortMej }
\r
323 (*********************************************************)
\r
325 procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
328 i, d, j, tmp: integer;
\r
335 CargarTabla( arch, datos, 1000 );
\r
341 for j := d downto i do
\r
343 m.Comp := m.Comp + 1;
\r
344 Retardar( RETARDO );
\r
345 if datos[j].ap < datos[j-1].ap then
\r
347 Intercambiar( datos[j], datos[j-1], m.Int );
\r
354 m.Comp := m.Comp + 1;
\r
355 Retardar( RETARDO );
\r
356 if datos[j].ap < datos[j-1].ap then
\r
358 Intercambiar( datos[j], datos[j-1], m.Int );
\r
365 m.Tiem := GetTiempo( h1, h2 );
\r
366 end; { procedure ShakeSort }
\r
368 (*********************************************************)
\r
370 procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
380 CargarTabla( arch, datos, 1000 );
\r
382 for i := 1 to tam do
\r
384 for j := i + 1 to tam do
\r
386 m.Comp := m.Comp + 1;
\r
387 Retardar( RETARDO );
\r
388 if datos[i].ap > datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
\r
392 m.Tiem := GetTiempo( h1, h2 );
\r
393 end; { procedure RippleSort }
\r
395 (*********************************************************)
\r
397 procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
399 i, sel, n: integer;
\r
408 CargarTabla( arch, datos, 1000 );
\r
410 for n := 1 to tam - 1 do
\r
414 for i := n + 1 to tam do
\r
416 m.Comp := m.Comp + 1;
\r
417 Retardar( RETARDO );
\r
418 if datos[sel].ap > datos[i].ap then
\r
424 if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
\r
427 m.Tiem := GetTiempo( h1, h2 );
\r
428 end; { procedure SelectionSort }
\r
430 (*********************************************************)
\r
432 procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
444 CargarTabla( arch, datos, 1000 );
\r
446 for i := 2 to tam do
\r
448 m.Int := m.Int + 1;
\r
449 Retardar( RETARDO );
\r
453 while ( j >= 1 ) and ( not terminar ) do
\r
455 m.Comp := m.Comp + 1;
\r
456 Retardar( RETARDO );
\r
457 if ( tmp.ap < datos[j].ap ) then
\r
459 m.Int := m.Int + 1;
\r
460 Retardar( RETARDO );
\r
461 datos[j+1] := datos[j];
\r
464 else terminar := true;
\r
466 m.Int := m.Int + 1;
\r
467 Retardar( RETARDO );
\r
471 m.Tiem := GetTiempo( h1, h2 );
\r
472 end; { procedure InsertionSort }
\r
474 (*********************************************************)
\r
476 procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
479 hueco, i, j: integer;
\r
487 CargarTabla( arch, datos, 1000 );
\r
492 hueco := hueco div 2;
\r
497 for i := 1 to tam - hueco do
\r
500 m.Comp := m.Comp + 1;
\r
501 Retardar( RETARDO );
\r
502 if ( datos[i].ap > datos[j].ap ) then
\r
504 Intercambiar( datos[i], datos[j], m.Int );
\r
511 m.Tiem := GetTiempo( h1, h2 );
\r
512 end; { procedure ShellSort }
\r
514 (*********************************************************)
\r
516 procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
518 (*********************************************************)
\r
520 procedure Shell( var datos: TABLA; hueco, i: integer; var comp, int: longint );
\r
527 Retardar( RETARDO );
\r
528 if ( datos[i].ap > datos[j].ap ) then
\r
530 Intercambiar( datos[i], datos[j], int );
\r
531 if (i - hueco) > 0 then
\r
532 Shell( datos, hueco, i - hueco, comp, int );
\r
534 end; { procedure Shell }
\r
536 (*********************************************************)
\r
538 var { procedure ShellSortMej }
\r
540 hueco, i, j: integer;
\r
547 CargarTabla( arch, datos, 1000 );
\r
552 hueco := hueco div 2;
\r
553 for i := 1 to tam - hueco do
\r
556 m.Comp := m.Comp + 1;
\r
557 Retardar( RETARDO );
\r
558 if ( datos[i].ap > datos[j].ap ) then
\r
560 Intercambiar( datos[i], datos[j], m.Int );
\r
561 if (i - hueco) > 0 then
\r
562 Shell( datos, hueco, i - hueco, m.Comp, m.Int );
\r
567 m.Tiem := GetTiempo( h1, h2 );
\r
568 end; { procedure ShellSortMej }
\r
570 (*********************************************************)
\r
572 procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
574 (*********************************************************)
\r
576 procedure QSort( var datos: TABLA; min, max: integer; var comp, int: longint );
\r
584 sel := datos[( min + max ) div 2];
\r
589 Retardar( RETARDO );
\r
591 while datos[i].ap < sel.ap do
\r
595 Retardar( RETARDO );
\r
601 Retardar( RETARDO );
\r
603 while datos[j].ap > sel.ap do
\r
607 Retardar( RETARDO );
\r
614 if i < j then Intercambiar( datos[i], datos[j], int );
\r
619 if min < j then QSort( datos, min, j, comp, int);
\r
620 if i < max then QSort( datos, i, max, comp, int);
\r
621 end; { procedure QSort }
\r
623 (*********************************************************)
\r
628 begin { procedure QuickSort }
\r
633 CargarTabla( arch, datos, 1000 );
\r
635 QSort( datos, 1, 1000, m.Comp, m.Int );
\r
637 m.Tiem := GetTiempo( h1, h2 );
\r
638 end; { procedure QuickSort }
\r
640 (*********************************************************)
\r
642 begin { procedure EvaluarCre }
\r
643 if ExisteArchivo( 'DATOS.TXT' ) then
\r
645 BubbleSort( arch, datos, 1000, bs );
\r
646 BubbleSortMej( arch, datos, 1000, bsm );
\r
647 ShakeSort( arch, datos, 1000, shs );
\r
648 RippleSort( arch, datos, 1000, rs );
\r
649 SelectionSort( arch, datos, 1000, ss );
\r
650 InsertionSort( arch, datos, 1000, is );
\r
651 ShellSort( arch, datos, 1000, sls );
\r
652 ShellSortMej( arch, datos, 1000, slsm );
\r
653 QuickSort( arch, datos, 1000, qs );
\r
654 CrearInforme( CRECIENTE );
\r
658 end; { procedure EvaluarCre }
\r
660 (*********************************************************)
\r
662 procedure EvaluarDec( var datos: TABLA; var arch: text );
\r
664 (*********************************************************)
\r
666 procedure BubbleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
677 CargarTabla( arch, datos, 1000 );
\r
679 for i := tam - 1 downto 1 do
\r
681 for j := tam - 1 downto 1 do
\r
683 m.Comp := m.Comp + 1;
\r
684 Retardar( RETARDO );
\r
685 if datos[j].ap < datos[j+1].ap then
\r
686 Intercambiar( datos[j], datos[j+1], m.Int);
\r
690 m.Tiem := GetTiempo( h1, h2 );
\r
691 end; { procedure BubbleSort }
\r
693 (*********************************************************)
\r
695 procedure BubbleSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
708 CargarTabla( arch, datos, 1000 );
\r
714 for i := tam - 1 downto n do
\r
716 m.Comp := m.Comp + 1;
\r
717 Retardar( RETARDO );
\r
718 if datos[i].ap < datos[i+1].ap then
\r
720 Intercambiar( datos[i], datos[i+1], m.Int);
\r
727 m.Tiem := GetTiempo( h1, h2 );
\r
728 end; { procedure BubbleSortMej }
\r
730 (*********************************************************)
\r
732 procedure ShakeSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
735 i, d, j, tmp: integer;
\r
742 CargarTabla( arch, datos, 1000 );
\r
748 for j := d downto i do
\r
750 m.Comp := m.Comp + 1;
\r
751 Retardar( RETARDO );
\r
752 if datos[j].ap > datos[j-1].ap then
\r
754 Intercambiar( datos[j], datos[j-1], m.Int );
\r
761 m.Comp := m.Comp + 1;
\r
762 Retardar( RETARDO );
\r
763 if datos[j].ap > datos[j-1].ap then
\r
765 Intercambiar( datos[j], datos[j-1], m.Int );
\r
772 m.Tiem := GetTiempo( h1, h2 );
\r
773 end; { procedure ShakeSort }
\r
775 (*********************************************************)
\r
777 procedure RippleSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
787 CargarTabla( arch, datos, 1000 );
\r
789 for i := 1 to tam do
\r
791 for j := i + 1 to tam do
\r
793 m.Comp := m.Comp + 1;
\r
794 Retardar( RETARDO );
\r
795 if datos[i].ap < datos[j].ap then Intercambiar( datos[i], datos[j], m.Int );
\r
799 m.Tiem := GetTiempo( h1, h2 );
\r
800 end; { procedure RippleSort }
\r
802 (*********************************************************)
\r
804 procedure SelectionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
806 i, sel, n: integer;
\r
815 CargarTabla( arch, datos, 1000 );
\r
817 for n := 1 to tam - 1 do
\r
821 for i := n + 1 to tam do
\r
823 m.Comp := m.Comp + 1;
\r
824 Retardar( RETARDO );
\r
825 if datos[sel].ap < datos[i].ap then
\r
831 if hubosel then Intercambiar( datos[n], datos[sel], m.Int);
\r
834 m.Tiem := GetTiempo( h1, h2 );
\r
835 end; { procedure SelectionSort }
\r
837 (*********************************************************)
\r
839 procedure InsertionSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
851 CargarTabla( arch, datos, 1000 );
\r
853 for i := 2 to tam do
\r
855 m.Int := m.Int + 1;
\r
856 Retardar( RETARDO );
\r
860 while ( j >= 1 ) and ( not terminar ) do
\r
862 m.Comp := m.Comp + 1;
\r
863 Retardar( RETARDO );
\r
864 if ( tmp.ap > datos[j].ap ) then
\r
866 m.Int := m.Int + 1;
\r
867 Retardar( RETARDO );
\r
868 datos[j+1] := datos[j];
\r
871 else terminar := true;
\r
873 m.Int := m.Int + 1;
\r
874 Retardar( RETARDO );
\r
878 m.Tiem := GetTiempo( h1, h2 );
\r
879 end; { procedure InsertionSort }
\r
881 (*********************************************************)
\r
883 procedure ShellSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
886 hueco, i, j: integer;
\r
894 CargarTabla( arch, datos, 1000 );
\r
899 hueco := hueco div 2;
\r
904 for i := 1 to tam - hueco do
\r
907 m.Comp := m.Comp + 1;
\r
908 Retardar( RETARDO );
\r
909 if ( datos[i].ap < datos[j].ap ) then
\r
911 Intercambiar( datos[i], datos[j], m.Int );
\r
918 m.Tiem := GetTiempo( h1, h2 );
\r
919 end; { procedure ShellSort }
\r
921 (*********************************************************)
\r
923 procedure ShellSortMej( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
925 (*********************************************************)
\r
927 procedure Shell( var datos: TABLA; hueco, i: integer;
\r
928 var comp: longint; var int: longint );
\r
935 Retardar( RETARDO );
\r
936 if ( datos[i].ap < datos[j].ap ) then
\r
938 Intercambiar( datos[i], datos[j], int );
\r
939 if (i - hueco) > 0 then
\r
940 Shell( datos, hueco, i - hueco, comp, int );
\r
942 end; { procedure Shell }
\r
944 (*********************************************************)
\r
946 var { procedure ShellSortMej }
\r
948 hueco, i, j: integer;
\r
955 CargarTabla( arch, datos, 1000 );
\r
960 hueco := hueco div 2;
\r
961 for i := 1 to tam - hueco do
\r
964 m.Comp := m.Comp + 1;
\r
965 Retardar( RETARDO );
\r
966 if ( datos[i].ap < datos[j].ap ) then
\r
968 Intercambiar( datos[i], datos[j], m.Int );
\r
969 if (i - hueco) > 0 then
\r
970 Shell( datos, hueco, i - hueco, m.Comp, m.Int );
\r
975 m.Tiem := GetTiempo( h1, h2 );
\r
976 end; { procedure ShellSortMej }
\r
978 (*********************************************************)
\r
980 procedure QuickSort( var arch: text; var datos: TABLA; tam: integer; var m: MEDICION );
\r
982 procedure QSort( var datos: TABLA; min, max: integer;
\r
983 var comp: longint; var int: longint );
\r
991 sel := datos[( min + max ) div 2];
\r
996 Retardar( RETARDO );
\r
998 while datos[i].ap > sel.ap do
\r
1000 if flag then begin
\r
1002 Retardar( RETARDO );
\r
1004 else flag := true;
\r
1008 Retardar( RETARDO );
\r
1010 while datos[j].ap < sel.ap do
\r
1012 if flag then begin
\r
1014 Retardar( RETARDO );
\r
1016 else flag := true;
\r
1021 if i < j then Intercambiar( datos[i], datos[j], int );
\r
1026 if min < j then QSort( datos, min, j, comp, int);
\r
1027 if i < max then QSort( datos, i, max, comp, int);
\r
1028 end; { procedure QSort }
\r
1030 (*********************************************************)
\r
1035 begin { procedure QuickSort }
\r
1040 CargarTabla( arch, datos, 1000 );
\r
1042 QSort( datos, 1, 1000, m.Comp, m.Int );
\r
1044 m.Tiem := GetTiempo( h1, h2 );
\r
1045 end; { procedure QuickSort }
\r
1047 (*********************************************************)
\r
1049 begin { procedure EvaluarDec }
\r
1050 if ExisteArchivo( 'DATOS.TXT' ) then
\r
1052 BubbleSort( arch, datos, 1000, bs );
\r
1053 BubbleSortMej( arch, datos, 1000, bsm );
\r
1054 ShakeSort( arch, datos, 1000, shs );
\r
1055 RippleSort( arch, datos, 1000, rs );
\r
1056 SelectionSort( arch, datos, 1000, ss );
\r
1057 InsertionSort( arch, datos, 1000, is );
\r
1058 ShellSort( arch, datos, 1000, sls );
\r
1059 ShellSortMej( arch, datos, 1000, slsm );
\r
1060 QuickSort( arch, datos, 1000, qs );
\r
1061 CrearInforme( DECRECIENTE );
\r
1065 end; { procedure EvaluarDec }
\r
1067 (*********************************************************)
\r
1069 var { procedure MenuEvaluar }
\r
1074 textcolor( Yellow );
\r
1076 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
1078 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
1079 textcolor( LightCyan );
\r
1081 writeln( ' Evaluar Algoritmos:' );
\r
1082 writeln( ' ------- ----------' );
\r
1083 textcolor( LightGray );
\r
1086 writeln( ' 1.- Ordenando en forma creciente.' );
\r
1087 writeln( ' 2.- Ordenando en forma decreciente.' );
\r
1088 writeln( ' 0.- Men£ Anterior.' );
\r
1090 textcolor( White );
\r
1091 write( ' Ingrese su opci¢n: ' );
\r
1092 textcolor( Yellow );
\r
1094 while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
\r
1096 textcolor( White );
\r
1098 write( ' Ingrese su opci¢n (1, 2 o 0): ' );
\r
1099 textcolor( Yellow );
\r
1103 '1': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarCre( datos, arch )
\r
1104 else NoExisteArch;
\r
1105 '2': if ExisteArchivo( 'DATOS.TXT' ) then EvaluarDec( datos, arch )
\r
1106 else NoExisteArch;
\r
1111 (*********************************************************)
\r
1112 (*********************************************************)
\r
1114 procedure MenuGenerar( var arch: text );
\r
1117 TIPO_LETRA = ( TL_VOCAL, TL_CONSO );
\r
1118 TIPO_VOCAL = ( TV_AEIOU, TV_EI );
\r
1119 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
1121 (*********************************************************)
\r
1123 function GetRNDApellido( max, min: integer ): APELLIDO;
\r
1125 (*********************************************************)
\r
1127 function GetVocal( tipo: TIPO_VOCAL ): char;
\r
1133 if tipo = TV_AEIOU then valor := random( 16 )
\r
1134 else valor := random( 6 ) + 5;
\r
1136 0..4: GetVocal := 'A';
\r
1137 5..7: GetVocal := 'E';
\r
1138 8..10: GetVocal := 'I';
\r
1139 11..13: GetVocal := 'O';
\r
1140 14..15: GetVocal := 'U';
\r
1142 end; { function GetVocal }
\r
1144 (*********************************************************)
\r
1146 procedure GetRNDVocal( var indic: INDICADOR; var proxl: TIPO_LETRA; var vocal: char );
\r
1157 proxl := TL_VOCAL;
\r
1161 vocal := GetVocal( TV_EI );
\r
1163 proxl := TL_CONSO;
\r
1167 vocal := GetVocal( TV_AEIOU );
\r
1169 if random( 40 ) = 0 then proxl := TL_VOCAL
\r
1170 else proxl := TL_CONSO;
\r
1173 end; { procedure GetRNDVocal }
\r
1175 (*********************************************************)
\r
1177 procedure GetRNDConsonante( var indic: INDICADOR; var proxl: TIPO_LETRA; var conso: char );
\r
1183 proxl := TL_VOCAL;
\r
1187 I_ESF, I_ESR, I_ESG, I_EST: conso := 'R';
\r
1188 I_ESB: case random( 2 ) of
\r
1192 I_ESC: case random( 4 ) of
\r
1198 I_ESL: case random( 6 ) of
\r
1200 1..5: conso := 'L';
\r
1202 I_ESM: case random( 3 ) of
\r
1207 I_ESN: case random( 3 ) of
\r
1212 else case random( 55 ) of
\r
1215 if random( 10 ) = 0 then begin
\r
1217 proxl := TL_CONSO;
\r
1222 if random( 5 ) = 0 then begin
\r
1224 proxl := TL_CONSO;
\r
1227 8..11: conso := 'D';
\r
1230 if random( 10 ) = 0 then begin
\r
1232 proxl := TL_CONSO;
\r
1237 if random( 5 ) = 0 then
\r
1240 if random( 4 ) = 0 then proxl := TL_CONSO;
\r
1243 18..19: conso := 'H';
\r
1244 20..22: conso := 'J';
\r
1245 23..24: conso := 'K';
\r
1248 if random( 15 ) = 0 then
\r
1251 proxl := TL_CONSO;
\r
1256 if random( 5 ) = 0 then
\r
1259 proxl := TL_CONSO;
\r
1264 if random( 5 ) = 0 then
\r
1267 proxl := TL_CONSO;
\r
1270 34..36: conso := 'P';
\r
1277 if random( 3 ) = 0 then
\r
1280 proxl := TL_CONSO;
\r
1283 42..44: conso := 'S';
\r
1286 if random( 10 ) = 0 then
\r
1289 proxl := TL_CONSO;
\r
1292 48..50: conso := 'V';
\r
1297 end; { case random( 55 ) of }
\r
1299 end; { case indic of }
\r
1300 end; { procedure GetRNDConsonante }
\r
1302 (*********************************************************)
\r
1304 var { function GetRNDApellido }
\r
1309 proxl: TIPO_LETRA;
\r
1312 if max > MAX_APE then max := MAX_APE;
\r
1313 tam := random( max + 1 ) + min;
\r
1316 if random( 5 ) = 0 then proxl := TL_VOCAL
\r
1317 else proxl := TL_CONSO;
\r
1318 for i := 1 to tam do
\r
1320 if proxl = TL_CONSO then GetRNDConsonante( indic, proxl, aux )
\r
1321 else GetRNDVocal( indic, proxl, aux );
\r
1322 apel := apel + aux;
\r
1324 GetRNDApellido := apel;
\r
1325 end; { function GetRNDApellido }
\r
1327 (*********************************************************)
\r
1329 function GetRNDLetra( min, max: char ): char;
\r
1332 GetRNDLetra := chr( random( ord( max ) - ord( min ) + 1 ) + ord( min ) );
\r
1335 (*********************************************************)
\r
1337 procedure GetOrdApellidos( var ar: text; cant: integer );
\r
1341 letra, letra1: char;
\r
1342 i, j, veces: integer;
\r
1344 ap, ape, apel: APELLIDO;
\r
1348 if cant = 1000 then mil := true;
\r
1349 dni := 10000000 + (random( 15000 ) * 100);
\r
1353 for letra := 'A' to 'Z' do
\r
1356 for letra1 := 'A' to 'Z' do
\r
1360 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
\r
1362 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
\r
1365 else case letra1 of
\r
1366 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
\r
1372 'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
\r
1374 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
\r
1377 else case letra1 of
\r
1378 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
\r
1382 ape := ap + letra1;
\r
1383 for j := 1 to veces do
\r
1385 if j = 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
\r
1386 else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
\r
1387 dni := dni + random( 50000 ) + 1;
\r
1388 writeln( ar, apel );
\r
1389 writeln( ar, dni );
\r
1396 end; { for letra1 := 'A' to 'Z' do }
\r
1400 end; { for letra := 'A' to 'Z' do }
\r
1402 end; { procedure GetOrdApellidos }
\r
1404 (*********************************************************)
\r
1406 procedure GetInvOrdApellidos( var ar: text; cant: integer );
\r
1410 letra, letra1: char;
\r
1411 i, j, veces: integer;
\r
1413 ap, ape, apel: APELLIDO;
\r
1417 if cant = 1000 then mil := true;
\r
1418 dni := 34000000 + (random( 15000 ) * 100);
\r
1422 for letra := 'Z' downto 'A' do
\r
1425 for letra1 := 'Z' downto 'A' do
\r
1429 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T':
\r
1431 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'Z': veces := 2;
\r
1434 else case letra1 of
\r
1435 'A', 'B', 'C', 'E', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T': veces := 2;
\r
1441 'A', 'B', 'C', 'D', 'E', 'F', 'I', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'V':
\r
1443 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U', 'V': veces := 2;
\r
1446 else case letra1 of
\r
1447 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'U': veces := 2;
\r
1451 ape := ap + letra1;
\r
1452 for j := 1 to veces do
\r
1454 if j <> 1 then apel := ape + GetRNDLetra( 'A', 'M' ) + GetRNDApellido( 6, 1 )
\r
1455 else apel := ape + GetRNDLetra( 'N', 'Z' ) + GetRNDApellido( 6, 1 );
\r
1456 dni := dni - random( 40000 ) - 1;
\r
1457 writeln( ar, apel );
\r
1458 writeln( ar, dni );
\r
1465 end; { for letra1 := 'A' to 'Z' do }
\r
1469 end; { for letra := 'A' to 'Z' do }
\r
1471 end; { GetInvOrdApellidos }
\r
1474 (*********************************************************)
\r
1476 procedure GenerarRND( var arch: text; n: integer; reabrir: boolean );
\r
1484 if reabrir then rewrite( arch );
\r
1485 dni := 10000000 + (random( 15000 ) * 100);
\r
1487 for i := 1 to n do
\r
1489 ap := GetRNDApellido( 8, 4 );
\r
1490 dni := dni + random( 50000 ) + 1;
\r
1491 writeln( arch, ap );
\r
1492 writeln( arch, dni );
\r
1495 if reabrir then close( arch );
\r
1496 end; { procedure GenerarRND }
\r
1498 (*********************************************************)
\r
1500 procedure GenerarOrd( var arch: text; n: integer; reabrir: boolean );
\r
1503 if reabrir then rewrite( arch );
\r
1504 GetOrdApellidos( arch, n );
\r
1505 if reabrir then close( arch );
\r
1508 (*********************************************************)
\r
1510 procedure GenerarOrdDec( var arch: text; n: integer; reabrir: boolean );
\r
1513 if reabrir then rewrite( arch );
\r
1514 GetInvOrdApellidos( arch, n );
\r
1515 if reabrir then close( arch );
\r
1518 (*********************************************************)
\r
1520 procedure Generar90Ord( var arch: text );
\r
1524 GenerarOrd( arch, 900, false );
\r
1525 GenerarRND( arch, 100, false );
\r
1529 (*********************************************************)
\r
1531 procedure Generar90OrdDec( var arch: text );
\r
1535 GenerarOrdDec( arch, 900, false );
\r
1536 GenerarRND( arch, 100, false );
\r
1540 (*********************************************************)
\r
1542 var { procedure MenuGenerar }
\r
1547 textcolor( Yellow );
\r
1549 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
1551 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
1552 textcolor( LightCyan );
\r
1554 writeln( ' Generar Archivo (''DATOS.TXT''):' );
\r
1555 writeln( ' ------- ------- -------------' );
\r
1556 textcolor( LightGray );
\r
1559 writeln( ' 1.- Con datos desordenados.' );
\r
1560 writeln( ' 2.- Con datos en orden creciente (APELLIDO, DNI).' );
\r
1561 writeln( ' 3.- Con datos en orden decreciente (APELLIDO, DNI).' );
\r
1562 writeln( ' 4.- Con 90% datos en orden creciente (APELLIDO, DNI) + 10% desordenado.' );
\r
1563 writeln( ' 5.- Con 90% datos en orden decreciente (APELLIDO, DNI) + 10% desordenado.' );
\r
1564 writeln( ' 0.- Men£ Anterior.' );
\r
1566 textcolor( White );
\r
1567 write( ' Ingrese su opci¢n: ' );
\r
1568 textcolor( Yellow );
\r
1570 while ( ( tecla < '1' ) or ( tecla > '5' ) ) and ( tecla <> '0' ) do
\r
1572 textcolor( White );
\r
1574 write( ' Ingrese su opci¢n (1 a 5 o 0): ' );
\r
1575 textcolor( Yellow );
\r
1579 '1': GenerarRND( arch, 1000, true );
\r
1580 '2': GenerarOrd( arch, 1000, true );
\r
1581 '3': GenerarOrdDec( arch, 1000, true );
\r
1582 '4': Generar90Ord( arch );
\r
1583 '5': Generar90OrdDec( arch );
\r
1586 end; { procedure MenuGenerar }
\r
1588 (*********************************************************)
\r
1590 procedure PantallaSalida;
\r
1597 textcolor( white );
\r
1598 writeln( ' COMPARACION DE ALGORITMOS DE ORDENAMIENTO versi¢n ', VERSION, ' <-o-o-> Luca - Soft' );
\r
1600 writeln( ' Desarrollado por Leandro Lucarella para la Facultad de Ingenier¡a de la' );
\r
1601 writeln( ' Universidad de Buenos Aires. Consultas, sugerencias y/o reprobaciones a:' );
\r
1603 textcolor( LightMagenta );
\r
1604 write( ' lluca@cnba.uba.ar' );
\r
1607 textcolor( LightMagenta );
\r
1608 writeln( 'lluca@geocities.com' );
\r
1611 writeln( ' (c) 1999 - Todos los derechos reservados.' );
\r
1615 (*********************************************************)
\r
1625 assign( arch, 'DATOS.TXT' );
\r
1627 textbackground( Blue );
\r
1629 while not salir do
\r
1632 textcolor( Yellow );
\r
1634 writeln( 'COMPARACION DE ALGORITMOS DE ORDENAMIENTO' );
\r
1636 writeln( '~~~~~~~~~~~ ~~ ~~~~~~~~~~ ~~ ~~~~~~~~~~~~' );
\r
1638 textcolor( LightCyan );
\r
1639 writeln( ' Men£ Principal:' );
\r
1640 writeln( ' ---- ---------' );
\r
1641 textcolor( LightGray );
\r
1644 writeln( ' 1.- Generar Archivo (''DATOS.TXT'').' );
\r
1645 writeln( ' 2.- Evaluar Algoritmos.' );
\r
1646 writeln( ' 0.- Salir.' );
\r
1648 textcolor( White );
\r
1649 write( ' Ingrese su opci¢n: ' );
\r
1650 textcolor( Yellow );
\r
1652 while ( ( tecla < '1' ) or ( tecla > '2' ) ) and ( tecla <> '0' ) do
\r
1654 textcolor( White );
\r
1656 write( ' Ingrese su opci¢n (1, 2 o 0): ' );
\r
1657 textcolor( Yellow );
\r
1661 '1': MenuGenerar( arch );
\r
1662 '2': MenuEvaluar( datos, arch );
\r
1663 '0': salir := true;
\r