Объединить файлы в новый файл, сохранив упорядоченность элементов - Turbo Pascal
Формулировка задачи:
Решение задачи: «Объединить файлы в новый файл, сохранив упорядоченность элементов»
const Name1 = 'dat1.dat'; Name2 = 'dat2.dat'; Name3 = 'dat3.dat'; procedure CreateFile(Size, minVal, maxVal : Integer; Name : String); var F : File of Integer; A : array [0..1000] of Boolean; i, N : Integer; begin for N := 0 to 1000 do A[N] := False; repeat N := Random(maxVal - minVal + 1) + minVal; if Not A[i] then begin Dec(Size); A[N] := True; end; until Size = 0; Assign(F, Name); Rewrite(F); for i := 0 to 1000 do if A[i] then Write(F, i); Close(F); end; procedure OutFile(Msg, Name : String); var F : File of Integer; N : Integer; begin Write(Msg, #32, Name, ':'); Assign(F, Name); Reset(F); while Not EOF(F) do begin Read(F, N); Write(#32, N); end; Close(F); WriteLn; end; var F1, F2, F3 : File of Integer; S1, S2 : Integer; N1, N2 : Integer; begin Randomize; CreateFile(10, 10, 99, Name1); OutFile('Создан файл', Name1); CreateFile(10, 10, 99, Name2); OutFile('Создан файл', Name2); /// Объединение файлов /// Assign(F1, Name1); Reset(F1); S1 := FileSize(F1); Assign(F2, Name2); Reset(F2); S2 := FileSize(F2); Assign(F3, Name3); Rewrite(F3); Read(F1, N1); S1 -= 1; Read(F2, N2); S2 -= 1; repeat if N1 < N2 then begin if S1 > 0 then begin Write(F3, N1); Read(F1, N1); S1 -= 1; end else begin Write(F3, N1); N1 := MaxInt; end; end else begin if S2 > 0 then begin Write(F3, N2); Read(F2, N2); S2 -= 1; end else begin Write(F3, N2); N2 := MaxInt; end; end; until (N1 = MaxInt) and (N2 = MaxInt); Close(F1); Close(F2); Close(F3); OutFile('Создан файл', Name3); end.
Объяснение кода листинга программы
const Name1 = 'dat1.dat'; Name2 = 'dat2.dat'; Name3 = 'dat3.dat'; procedure CreateFile(Size: Integer; minVal: Integer; maxVal: Integer; Name: String); var F: File of Integer; A: array [0..1000] of Boolean; i, N: Integer; begin for N := 0 to 1000 do A[N] := False; repeat N := Random(maxVal — minVal + 1) + minVal; if Not A[i] then begin Dec(Size); A[N] := True; end; until Size = 0; Assign(F, Name); Rewrite(F); for i := 0 to 1000 do if A[i] then Write(F, i); Close(F); end; procedure OutFile(Msg: String; Name: String); var F: File of Integer; N: Integer; begin Write(Msg, #32, Name, ':'); Assign(F, Name); Reset(F); while Not EOF(F) do begin Read(F, N); Write(#32, N); end; Close(F); end; var F1, F2, F3: File of Integer; S1, S2: Integer; N1, N2: Integer; begin Randomize; CreateFile(10, 10, 99, Name1); OutFile('Создан файл', Name1); CreateFile(10, 10, 99, Name2); OutFile('Создан файл', Name2); // Объединение файлов // Assign(F1, Name1); Reset(F1); S1 := FileSize(F1); Assign(F2, Name2); Reset(F2); S2 := FileSize(F2); Assign(F3, Name3); Rewrite(F3); Read(F1, N1); S1 -= 1; Read(F2, N2); S2 -= 1; repeat if N1 < N2 then begin if S1 > 0 then begin Write(F3, N1); Read(F1, N1); S1 -= 1; end else begin Write(F3, N1); N1 := MaxInt; end; end else begin if S2 > 0 then begin Write(F3, N2); Read(F2, N2); S2 -= 1; end else begin Write(F3, N2); N2 := MaxInt; end; end; until (N1 = MaxInt) and (N2 = MaxInt); Close(F1); Close(F2); Close(F3); OutFile('Создан файл', Name3); end;