|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Исправить программу
Добрый день. Помогите, пожалуйста, написать программу.
В строках текстового файла содержатся целые числа. Преобразовать строки файла следующим образом: вначале должны идти четные числа, упорядоченные по возрастанию, а затем нечетные, упорядоченные по убыванию. Их надо записать в другой файл. Есть программа, но она выдаёт мне ошибки. Код:
Program files; type mas= array[1..100] of integer; var f1, f2: text; a, b, d:mas; k, p, i, j: integer; procedure Readfile (f1:text; var a:mas; var k: integer); begin p:=0; k:=0; while not eof (f1) do begin readln (f1,a[k]); k:=k+1; end; end; Procedure Check (var a:mas; p: integer); var k, i, j: integer; b, d: mas; begin i:=1; j:=1; for k:=1 to p do begin if (a[k] mod 2=0) then begin b[i]:=a[k]; i:=i+1; end else begin d[j]:=a[k]; j:=j+1; end; end; end; procedure Regularise(Var b,d: mas; var i, j: integer; f2:text); var H,Y : integer; begin assign(f2, 'C:\Users\User\Desktop\f2.txt'); rewrite(f2); H:=0; Y:=0; while i<>High(b)+1 do begin if b[i]> b[i+1]then begin H:=b[i]; b[i]:=b[i+1]; b[i+1]:=H; readln (f2, b[i]); end; end; while j<>High(d)+1 do begin if d[j]< d[j+1]then begin Y:=d[j]; d[j]:=d[j+1]; d[j+1]:=Y; readln (f2, d[j]); end; end; close (f2); end; begin assign(f1, 'C:\Users\User\Desktop\f1.txt'); reset(f1); Readfile(f1, a, k); Check(a, p); assign(f2, 'C:\Users\User\Desktop\f2.txt'); rewrite(f2); Regularise(b, d, i, j, f2); closefile(f1); closefile(f2); end. lmikle: пользуемся тегами. Последний раз редактировалось lmikle, 20.12.2016 в 20:06. |
#2
|
|||
|
|||
Ну и будет выдавать ошибки.
1. Это чистый паскаль, не delphi. В delphi кое-что поменялось, плюс надо директиву соотв. добавить для создания консольного приложения. 2. Ну, как мне кажется, имплементация слишком сложная. Сначала читаем все, а потом что-то делаем с этим. Тут я бы, как минимум, при чтении сразу бы делил данные на 2 массива - четные или нечетный. Потом отсортировать соотв. образом оба массива, потом записать их в файл. В общем, как-то так: Код:
program numbers; {$APPTYPE CONSOLE} type TIntArray : Array Of Integer; var aODD, aEVEN : TIntArray; procedure ReadNumbers(AFileName : String;); var N : Integer; F : TextFile; begin SetLength(aODD,0); SetLength(aEVEN,0); AssignFile(F, AFileName); Reset(F); While Not Eof(F) Do Begin Read(F,N); If (N mod 2) = 0 Then begin SetLength(aEVEN,Length(aEVEN)+1); aEVEN[High(aEVEN)] := N; end Else begin SetLength(aODD,Length(aODD)+1); aODD[High(aODD)] := N; end; End; Close(F); end; procedure WriteNumbers(AFileName : String); var F : TextFile; begin AssighFile(F,AFileName); Rewrite(F); WriteArray(F,aEVEN); WriteArray(F,aODD); CloseFile(F); end; procedure WriteArray(F : TextFile; A : TIntArray); var I : Integer; begin For I := Low(A) To High(A) Do WriteLn(F,A[i]); end; procedure SortNumbers(var A : TIntArray; IsAsc : Boolean); var I, J : Integer; N : Integer; F : Boolean; begin For I := Low(A) To High(A)-1 Do For J := I+1 To High(A) Do Begin F := A[i] > A[J]; If Not IsAsc Then F := Not F; If F Then Begin N := A[i]; A[i] := A[J]; A[J] := N; End; End; end; begin ReadNumbers('C:\Users\User\Desktop\f1.txt'); SortNumbers(aEVEN,True); SortNumbers(aODD,False); WriteNumbers('C:\Users\User\Desktop\f2.txt'); end. ЗЫ. Не проверял. Может потребуется что-нить поправить слегка. ЗЗЫ. Для особо умных. Да. можно было сразу сделать сортировку вставкой, но это бы существенно усложнило бы понимание кода. И так совместил процедуры сортировки. Так же можно было бы сделать класс для храниения, клас-ридер для чтения и вообще накрутить кучу всего. Но для школьного задания это излишне. |