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

Delphi Sources



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

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

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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,106
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну и будет выдавать ошибки.
1. Это чистый паскаль, не delphi. В delphi кое-что поменялось, плюс надо директиву соотв. добавить для создания консольного приложения.
2. Ну, как мне кажется, имплементация слишком сложная. Сначала читаем все, а потом что-то делаем с этим. Тут я бы, как минимум, при чтении сразу бы делил данные на 2 массива - четные или нечетный. Потом отсортировать соотв. образом оба массива, потом записать их в файл.

В общем, как-то так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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, время: 04:12.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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