Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.12.2016, 17:00
Luka_Megurine Luka_Megurine вне форума
Прохожий
 
Регистрация: 20.12.2016
Сообщения: 1
Версия Delphi: ABC Pascal
Репутация: 10
По умолчанию Исправить программу

Добрый день. Помогите, пожалуйста, написать программу.
В строках текстового файла содержатся целые числа. Преобразовать строки файла следующим образом: вначале должны идти четные числа, упорядоченные по возрастанию, а затем нечетные, упорядоченные по убыванию. Их надо записать в другой файл.
Есть программа, но она выдаёт мне ошибки.

Код:
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  
Старый 20.12.2016, 20:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну и будет выдавать ошибки.
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.

ЗЫ. Не проверял. Может потребуется что-нить поправить слегка.
ЗЗЫ. Для особо умных. Да. можно было сразу сделать сортировку вставкой, но это бы существенно усложнило бы понимание кода. И так совместил процедуры сортировки. Так же можно было бы сделать класс для храниения, клас-ридер для чтения и вообще накрутить кучу всего. Но для школьного задания это излишне.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter