Advertisement
vana_shimko

Лаба 3.3

Nov 22nd, 2014
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.76 KB | None | 0 0
  1. {$mode objfpc}
  2. program RadixLSD;
  3.  
  4. uses
  5.     Math, SysUtils;
  6.    
  7. type
  8.     TDigit = 0..9;
  9.     TResultPos = -1..high(word);
  10.     TArray = array of longword;
  11.    
  12. var
  13.     inputFile: text;
  14.     size: word;
  15.     arrToSort: TArray;
  16.    
  17. procedure Swap (var a, b : longword);
  18. var
  19.     temp: integer;
  20. begin
  21.     temp:=a;
  22.     a:=b;
  23.     b:=temp;
  24. end;
  25.  
  26. procedure PrintError;
  27. begin
  28.     writeln;
  29.     writeln('Возникла ошибка во время обработки входного файла!');
  30.     writeln;
  31. end;
  32.  
  33. procedure PrintHelp;
  34. begin
  35.     writeln;
  36.     writeln('      Справка по формату входного файла      ');
  37.     writeln;   
  38.     writeln('В первой строке входного файла должно содержаться количество элементов массива для сортировки');
  39.     writeln('Будет прочитано лишь указанное количество элементов.');
  40.     writeln('В следующей строке должны содержаться элементы данного массива, разделенные одним пробелом.'); 
  41.     writeln('Поддерживаются только целые положительные числа, посторонние символы в файле не допускаются.');
  42.     writeln;
  43.     writeln;
  44. end;
  45.    
  46.  
  47. procedure PrintArray (const arrToPrint: TArray; currentNumberOfDigit: byte = 0);
  48. var
  49.     i: word;
  50. begin
  51.     if (currentNumberOfDigit <> 0) then
  52.         writeln('Сортировка по ',currentNumberOfDigit,' разряду:')
  53.     else
  54.         writeln('Исходный массив:');
  55.        
  56.     for i:= low(arrToPrint) to high(arrToPrint)-1 do
  57.             write(arrToPrint[i],' ');
  58.         writeln(arrToPrint[high(arrToPrint)]);
  59.         writeln;   
  60. end;
  61.  
  62. function GetDigit(number: longword; numberOfDigit: byte): TDigit;
  63. var
  64.     i: byte;
  65. begin
  66.     for i:= 1 to numberOfDigit - 1 do
  67.         number:= number div 10;
  68.        
  69.     result:=number mod 10;
  70. end;
  71.  
  72. procedure RadixSort (var arrToSort: TArray; maxNumberOfDigit: byte);
  73. var
  74.     numberOfDigit: byte;
  75.     currentDigit: TDigit;
  76.     resultPos: TResultPos;
  77.     i: word;
  78.    
  79. begin
  80.         for numberOfDigit:= 1 to maxNumberOfDigit do
  81.         begin
  82.             resultPos:= -1;
  83.  
  84.             for currentDigit:= 0 to 9 do      
  85.                     for i:= low(arrToSort) to high(arrToSort) do    
  86.                             if ( GetDigit(arrToSort[i],numberOfDigit) = currentDigit) then
  87.                             begin
  88.                                 inc(resultPos);
  89.                                 swap(arrToSort[resultPos], arrToSort[i]);
  90.                             end;
  91.             PrintArray(arrToSort,numberOfDigit);
  92.         end;
  93.  
  94. end;
  95.  
  96. function ProcArray (var arrToProc: TArray): byte;
  97. var
  98.     maxNumberOfDigits, numberOfDigits: byte;
  99.     i: word;
  100. begin
  101.     reset(inputFile);
  102.     readln(inputFile);
  103.    
  104.     maxNumberOfDigits:= 0; 
  105.    
  106.     for i:= low(arrToProc) to high(arrToProc) do
  107.     begin
  108.             read(inputFile,arrToProc[i]);
  109.            
  110.             try
  111.                 numberOfDigits:= trunc(ln(arrToProc[i])/ln(10))+1;
  112.             except
  113.                 numberOfDigits:=0;
  114.             end;
  115.            
  116.             if (numberOfDigits > maxNumberOfDigits) then
  117.                     maxNumberOfDigits:= numberOfDigits;
  118.     end;
  119.    
  120.     PrintArray(arrToProc);
  121.    
  122.     result:= maxNumberOfDigits;
  123.    
  124.     close(inputFile);
  125. end;
  126.  
  127. function GetSize(var f: text): word;
  128. begin
  129.     reset(f);
  130.    
  131.     try
  132.         readln(inputFile,result);
  133.     except
  134.         PrintError;
  135.         PrintHelp;
  136.         result:=0;
  137.     end;
  138.    
  139.     close(f);
  140. end;
  141.  
  142. procedure ChooseFile(var f: text);
  143. var
  144.     fileName: ansistring;
  145.     isExisting: boolean;
  146. begin
  147.     repeat
  148.         write('Введите имя файла с исходными данными: ');
  149.         readln(fileName);
  150.        
  151.         isExisting := FileExists(fileName);
  152.         assign(f,fileName);
  153.        
  154.         if not isExisting then
  155.             writeln('Такого файла не существует!')
  156.     until isExisting;
  157. end;
  158.  
  159. begin
  160.     ChooseFile(inputFile);
  161.     size:= GetSize(inputFile);
  162.     setlength(arrToSort, size);    
  163.     RadixSort(arrToSort, ProcArray(arrToSort));
  164. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement