Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/33: Рейтинг темы: голосов - 33, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30

Чтение из внешнего файла массива и сортировка его

24.04.2010, 23:28. Показов 6214. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи, уважаемые программисты........
я больше не могу, я два дня сижу не отходя от компьютера, глазки в кучку, но ничего не помогает........
нужно разработать программу которая читала бы из внешнего файла, сортировала по возрастанию и распечатывала как одномерный массив в столбик числа( они в файле записаны в столбик).....
помогите пожалуйста.....

Добавлено через 2 минуты
вот код, который смогла написать...
Delphi
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
procedure TForm1.Button2Click(Sender: TObject);
var f:TextFile; {описание используемых переменных}
    ch,n,p,m,j,t,i,k :integer;
    a:array of integer;
    s: string;
  begin
 If OpenDialog1.Execute        //открыть диалог для поиска файла
         then begin
   AssignFile(f,OpenDialog1.FileName); {установка связи}
    Reset(f); {направление передачи данных- чтение}
    i:=0;
     While Not Eof(F) do        //пока не конец файла
Begin
inc(i);
    Read(F, ch);    //считать строку
    a[i]:=ch;
        End;
    for i := 0 to n - 1 do begin
    m:= a[i];
    p:= i;
    for j := i + 1 to n do
      if a[j] < m then begin
        m:= a[j];
        p:= j;
      end;
    t:=a[i];
    a[i] := a[p];
    a[p] :=t;
  end;
end;
for i:=1 to n do
Label5.caption:=label5.caption+' '+IntTostr(a[i]);
     CloseFile(f); {закрытие файла}
   end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2010, 23:28
Ответы с готовыми решениями:

Чтение элементов массива из файла, запись в листбокс и сортировка массива
Здравствуйте, помогите решить проблему..шарп только начали изучать, пояснений толковых никаких не дали Нужно считать элементы массива,...

Чтение массива из файла и вывод его на экран
Необходимо прочитать матрицу 16*4 из файла dk.dat и вывести её на экран. Вот код: #include &lt;stdio.h&gt; #define Q 16 #define...

Чтение из внешнего файла.
Надо составить матрицу размерностью NxN, и записать во внешний файл. Потом прочитать сначала главную, а потом побочную диагональ, и...

21
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
25.04.2010, 00:08
На форме должны быть: кнопка, компонент типа TOpenDialog и компонент типа TMemo.
Файл - текстовый. В конце текстового файла должно быть не более одной пустой строки.
Delphi
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
procedure TForm1.Button1Click(Sender: TObject);
const
  //Величина приращения длины динамического массива.
  Capacity = 10;
var
  //Файловая переменная.
  F : TextFile;
  //Динамический массив.
  Arr : array of Integer;
  i, j, Num : Integer;
begin
  //Диалог выбора файла.
  if not OpenDialog1.Execute then Exit;
  //Связываем файловую переменную с именем файла.
  AssignFile(F, OpenDialog1.FileName);
  //Открываем файл для чтения.
  Reset(F);
 
  //Переписываем элементы файла в массив.
  i := 0;
  while not Eof(F) do begin
    //Если требуется, увеличиваем длину массива.
    if i = Length(Arr) then SetLength(Arr, i + Capacity);
    //Читаем очередной элемент файла в массив.
    Readln(F, Arr[i]);
    //Индекс следующего элемента массива.
    Inc(i);
  end;
 
  //Корректируем длину массива в соответствие с количеством добавленных в него
  //элементов.
  SetLength(Arr, i);
 
  //Закрываем файл.
  CloseFile(F);
 
  //Сортируем массив по возрастанию. Метод сортировки - сортировка вставками.
  for i := 0 + 1 to High(Arr) do begin
    j := i;
    Num := Arr[i];
    while ( j > 0 ) and ( Num < Arr[j - 1] ) do begin
      Arr[j] := Arr[j - 1];
      Dec(j);
    end;
    Arr[j] := Num;
  end;
 
  Memo1.Clear;
 
  //Распечатываем массив в Мемо.
  Memo1.Lines.Add('Отсортированный массв:');
  for i := 0 to High(Arr) do begin
    Memo1.Lines.Add( IntToStr(Arr[i]) );
  end;
  
end;
2
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
25.04.2010, 00:36  [ТС]
Mawrat, вы просто чудо)))
Золото)))
Цены вам нет)))
Спасибо огромнейшее)))
Вы не представляете, что вы для меня сделали)))

Добавлено через 6 минут
Можно вам маленький вопросик?

Для чего нам нужна //Величина приращения длины динамического массива//??
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
25.04.2010, 01:20
Цитата Сообщение от Дашук Посмотреть сообщение
Спасибо огромнейшее)))
Пожалуйста. Рад, что помог.
Цитата Сообщение от Дашук Посмотреть сообщение
Можно вам маленький вопросик?
Для чего нам нужна //Величина приращения длины динамического массива//??
Сейчас расскажу. ...
Мы используем динамический массив. В этот массив мы записываем элементы, прочитанные из файла. Но мы не знаем заранее, сколько всего элементов в файле. Поэтому мы заранее не знаем какой длины понадобится массив. Именно поэтому использован динамический массив - т. к. его длину можно изменять. Действуем так - в начале длина массива Arr нулевая. Если в файле есть хотябы один элемент, то длина массива увеличивается на величину Capacity - т. е. в данном случае на 10:
Delphi
1
2
    //Если требуется, увеличиваем длину массива.
    if i = Length(Arr) then SetLength(Arr, i + Capacity);
Далее в массив записывается первый элемент. Потом читается второй элемент из файла и в массив записывается второй элемент. Т. к. длина массива равна 10, то пока его длины хватает и увеличивать её не надо. Но вот когда мы прочитали 11-ый элемент из файла, вот здесь уже длины массива не хватает. Тогда мы опять увеличиваем длину массива на 10 - получаем длину = 20 элементам. И опять продолжаем читать элементы из файла и записывать их в массив. Если на каком-то этапе опять окажется, что длины массива не хвататет, то опять увеличиваем её на 10 элементов - т. е. на величину Capacity.
В конце, когда мы прочитали все элементы из файла, выходим из цикла. В этот момент может оказаться, что длина массива больше количества элементов, которые в него записаны. Т. е., например, пускай на каком-то этапе длина массива равна 30 элементам. Если мы прочитали из файла 31-й элемент, то согласно алгоритму, мы увеличим длину массива на 10 и его длина станет равной 40 элементам. Потом, например, мы ещё пару элементов прочитали и записали их в массив. Получили в массиве 33 элемента. И тут мы достигли конца файла. Таким образом получилось, что в массив мы записали 33 элемента, а его длина равна 40 элементам. Вот поэтому после цикла идёт эта строка:
Delphi
1
2
3
  //Корректируем длину массива в соответствие с количеством добавленных в него
  //элементов.
  SetLength(Arr, i);
2
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
26.04.2010, 07:21  [ТС]
Вот это да)))
Вот это вам огромнейшее спасибо)))


Добавлено через 19 часов 18 минут
Извените, но опять нужна ваша помощь.......
Если у меня в файле находятся числа с запятой, то программа не работае((((
Что делать???Где исправлять???

Я исправляла тип массива на string? тогда программа не вылетает - работает, но не правильно сортирует((
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.04.2010, 09:40
Цитата Сообщение от Дашук Посмотреть сообщение
Если у меня в файле находятся числа с запятой, то программа не работае((((
Что делать???Где исправлять???
Я исправляла тип массива на string? тогда программа не вылетает - работает, но не правильно сортирует((
Процедуры Read() и Readln() в таком случае не опознают число. Т. е. они будут читать число вместе с запятой. Поэтому числа в файле должны разделяться знаками:
пробел (#32), горизонтальная табуляция (#9), знак конца строки (#10), знак перевода строки (#13).
Если использование запятой - это необходимо по каким-то причинам, тогда придётся делать самостоятельный разбор. Т. е. читаем строку, потом анализируем её и выделяем из неё число. В этом случае, если формат простой, например - в каждой строке идёт число, за ним без пробелов следует запятая и строка заканчивается - в этом случае анализ простой.
Легче убрать из входного файла запятые (т. е. не записывать их в него на этапе создания). Тогда код изменять не придётся.
Если запятые очень нужны, тогда так:
Предположим в каждой строке файла расположено одно число, после которого следует одна запятая, далее - строка заканчивается. Тогда:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  ...
  StrTmp : String;
  ...
begin
...
  //Переписываем элементы файла в массив.
  i := 0;
  while not Eof(F) do begin
    //Если требуется, увеличиваем длину массива.
    if i = Length(Arr) then SetLength(Arr, i + Capacity);
    //Читаем очередную строку файла.
    Readln(F, StrTmp);
    //Извлекаем число и помещаем его в массив.
    Arr[i] := StrToInt( Copy( StrTmp, 1, Length(StrTmp) - 1 ) );
    //Индекс следующего элемента массива.
    Inc(i);
  end;
...
end;
Тип массива надо оставить, какой был прежде - т. е. Integer.
0
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
26.04.2010, 18:46  [ТС]
Что здесь не так, я не понимаю(((

Добавлено через 10 минут
Delphi
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
procedure TForm1.Button2Click(Sender: TObject);
const
 Dl= 10;  //Величина приращения длины динамического массива.
var
F : TextFile;
A : array of integer;
Num : integer;
StrTmp: string;
Begin
    if  OpenDialog1.Execute then
    AssignFile(F, OpenDialog1.FileName);
    Reset(F);
    i := 0;
  while not Eof(F) do begin
    //Если требуется, увеличиваем длину массива.
    if i = Length(A) then SetLength(A, i + Dl);
    Readln(F, StrTmp);
    A[i]:=StrToInt(Copy (StrTmp, 1, Length(StrTmp)-1));
    Inc(i);
  end;
  //Корректируем длину массива в соответствие с количеством добавленных в него элементов
  SetLength(A, i);
  CloseFile(F);
 
  //Сортируем массив по возрастанию. Метод сортировки - сортировка вставками.
  for i := 0 + 1 to High(A) do begin
    j := i;
    Num := A[i];
    while ( j > 0 ) and ( Num < A[j - 1] ) do begin
      A[j] := A[j - 1];
      Dec(j);
    end;
    A[j] := Num;
  end;
  Memo1.Clear;
  for i := 0 to High(A) do begin
    Memo1.Lines.Add( IntToStr(A[i]));
    end;
Теперь у меня так, но всё равно происходит аварийное завершение((
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.04.2010, 19:05
Дашук, предлагаю сделать так. Выложи сюда текстовый файл, из которого надо данные брать. И я код соответствующий сформирую.
0
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
26.04.2010, 19:34  [ТС]
У меня просто есть программа которая сначала записывает в файл данные из StringGrid в столбик, а потом из этого документа я должна считать данные и отсортировать по возрастанию.

Delphi
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Grids;
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Label2: TLabel;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    Button1: TButton;
    Button2: TButton;
    Label3: TLabel;
    Button3: TButton;
    SaveDialog1: TSaveDialog;
    Label4: TLabel;
    OpenDialog1: TOpenDialog;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure LabeledEdit1KeyPress(Sender: TObject; var Key: Char);
    procedure LabeledEdit2KeyPress(Sender: TObject; var Key: Char);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  var
    Form1: TForm1;
implementation
 
var i,j,k:integer;
 
{$R *.dfm}
 
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9': ;
#8,'-',',':;
'.': Key:=',';
else Key:=#0;
end;
end;
 
procedure InputInt(var Simb:char; Str:string );
begin
case Simb of
'0'..'9': ;
#8:;
else Simb:=#0;
end;
end;
 
procedure TForm1.LabeledEdit1KeyPress(Sender: TObject; var Key: Char);
begin
InputInt(key,LabeledEdit1.text)
end;
 
procedure TForm1.LabeledEdit2KeyPress(Sender: TObject; var Key: Char);
begin
InputInt(key,LabeledEdit2.text);
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if LabeledEdit1.Text='' then
begin ShowMessage('Введите число строк'); exit; end;
if LabeledEdit2.Text='' then
begin ShowMessage('Введите число столбцов'); exit; end;
With StringGrid1 do
begin
ColCount:=StrToInt(LabeledEdit2.Text)+1;
RowCount:=StrToInt(LabeledEdit1.Text)+1;
for i:=1 to ColCount-1 do
Cells[i,0]:=IntToStr(i);
for j:=1 to RowCount-1 do
Cells[0,j]:=IntToStr(j);
end;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
Var  f:TextFile;
begin
for  k:=1 to StringGrid1.RowCount-1  do
   for i:=1 to StringGrid1.ColCount-1  do
  If StringGrid1.Cells[i, k] = '' then
          begin
            ShowMessage('Введите значения в пустые ячейки');
            exit;
          end;
   if SaveDialog1.Execute
      then begin
         AssignFile(f,SaveDialog1.FileName);
 Rewrite(f);
 Append(f);
 for k:=1 to StringGrid1.RowCount-1  do
 begin
 for i:=1 to StringGrid1.ColCount-1  do
 begin
 Writeln(f,StringGrid1.Cells[i,k]);
 end;
     end;
 CloseFile(f);
end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
const
 Dl= 10;  //Величина приращения длины динамического массива.
var
F : TextFile;
A : array of integer;
Num : integer;
StrTmp: string;
Begin
    if  OpenDialog1.Execute then
    AssignFile(F, OpenDialog1.FileName);
    Reset(F);
    i := 0;
  while not Eof(F) do begin
    //Если требуется, увеличиваем длину массива.
    if i = Length(A) then SetLength(A, i + Dl);
    Readln(F, StrTmp);
    A[i]:=StrToInt(Copy (StrTmp, 1, Length(StrTmp)-1));
    Inc(i);
  end;
  //Корректируем длину массива в соответствие с количеством добавленных в него элементов
  SetLength(A, i);
  CloseFile(F);
 
  //Сортируем массив по возрастанию. Метод сортировки - сортировка вставками.
  for i := 0 + 1 to High(A) do begin
    j := i;
    Num := A[i];
    while ( j > 0 ) and ( Num < A[j - 1] ) do begin
      A[j] := A[j - 1];
      Dec(j);
    end;
    A[j] := Num;
  end;
  Memo1.Clear;
  for i := 0 to High(A) do begin
    Memo1.Lines.Add( IntToStr(A[i]));
    end;
    end;
    end.
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.04.2010, 19:49
Судя по коду запятых в файле быть не должно. В каждую ячейку таблицы записывается только одно число?
Дашук, выложи сам файл, который программа формирует. - Я посмотрю. Или всю программу выложи. Можешь прямо здесь к сообщению присоединить. Или можешь залить на какой-нибудь файлообменник и мне в личку кинь ссылку и пароль.
---
Полное условие значит какое? - В таблицу пользователь записывает какие-то целые числа. Потом жмёт кнопку. Эти числа записываются в файл. Потом жмёт другую кнопку - эти числа читаются, записываются в массив. Этот массив сортируется и выводится в Мемо. Так?
0
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
26.04.2010, 19:54  [ТС]
Да, в таблице только одно число, но когда я описываю
Delphi
1
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
я же тут подразумеваю, что в ячейки могут вводится и запятые!!!
Вложения
Тип файла: rar программочка.rar (206.7 Кб, 20 просмотров)
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.04.2010, 20:02
Ясно. Надо уточнить - значит в одной ячейке может быть несколько чисел, разделённых запятыми? Или только одно число?
---
В общем - в каждой ячейке одно число. На этом остановимся. Так, собственно, и должно быть.
---
Прогу я подправлю и выложу здесь сегодня попозже.
1
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
26.04.2010, 20:07  [ТС]
Ну как, вот ожет быть (3), может быть (3,5) ну как бы не целое число три а три с половиной!!!
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.04.2010, 20:36
Ну тогда значит, массив надо описать не как Integer, а как Extended. Поэтому и проблемы, значит были. И функции тогда использовать не IntToStr() и StrToInt, а: FloatToStr() и StrToFloat().
1
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.04.2010, 21:14
В общем, вот рабочий вариант.
Delphi
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    StringGrid1: TStringGrid;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
//Óñòàíîâêà ðàçìåðîâ òàáëèöû.
procedure TForm1.Button1Click(Sender: TObject);
var
  Rows, Cols : Integer;
begin
  Rows := StringGrid1.FixedRows + StrToInt(Edit1.Text);
  Cols := StringGrid1.FixedCols + StrToInt(Edit2.Text);
  StringGrid1.RowCount := Rows;
  StringGrid1.ColCount := Cols;
end;
 
//Çàïèñü ÷èñåë èç òàáëèöû â ôàéë.
procedure TForm1.Button2Click(Sender: TObject);
var
  F : TextFile;
  i, j: Integer;
  Num : Extended;
begin
  if SaveDialog1.InitialDir = '' then
    SaveDialog1.InitialDir := OpenDialog1.InitialDir
  ;
  if SaveDialog1.InitialDir = '' then
    SaveDialog1.InitialDir := ExtractFilePath( Application.ExeName )
  ;
 
  if not SaveDialog1.Execute then Exit;
 
  AssignFile(F, SaveDialog1.FileName);
  Rewrite(F);
 
  for i := StringGrid1.FixedRows to StringGrid1.RowCount - 1 do begin
    for j := StringGrid1.FixedCols to StringGrid1.ColCount - 1 do begin
      try
        Num := StrToFloat(StringGrid1.Cells[j, i]);
      except
        on e : Exception do begin
          ShowMessage(
            'Îáíàðóæåíî ñîäåðæèìîå ÿ÷åéêè îòëè÷íîå îò çàïèñè ÷èñëà.' + #10
            + 'Äåéñòâèå ïðåðâàíî. Ïðîâåðüòå äàííûå â òàáëèöå.'
          );
          CloseFile(F);
          Exit;
        end;
      end;
      Writeln(F, Num);
    end;
  end;
 
  CloseFile(F);
end;
 
//×òåíèå ÷èñåë èç ôàéëà â ìàññèâ, ñîðòèðîâêà è âûâîä â Ìåìî.
procedure TForm1.Button3Click(Sender: TObject);
const
  //Âåëè÷èíà ïðèðàùåíèÿ äëèíû äèíàìè÷åñêîãî ìàññèâà.
  Capacity = 10;
var
  //Ôàéëîâàÿ ïåðåìåííàÿ.
  F : TextFile;
  //Äèíàìè÷åñêèé ìàññèâ.
  Arr : array of Extended;
  i, j : Integer;
  Num : Extended;
begin
  if OpenDialog1.InitialDir = '' then
    OpenDialog1.InitialDir := SaveDialog1.InitialDir
  ;
  if OpenDialog1.InitialDir = '' then
    OpenDialog1.InitialDir := ExtractFilePath( Application.ExeName )
  ;
 
  //Äèàëîã âûáîðà ôàéëà.
  if not OpenDialog1.Execute then Exit;
  //Åñëè ôàéëà íå ñóùåñòâóåò - âûõîäèì.
  if not FileExists(OpenDialog1.FileName) then begin
    ShowMessage('Óêàçàííûé ôàéë íå íàéäåí. Äåéñòâèå îòìåíåíî.');
    Exit;
  end;
 
  //Ñâÿçûâàåì ôàéëîâóþ ïåðåìåííóþ ñ èìåíåì ôàéëà.
  AssignFile(F, OpenDialog1.FileName);
  //Îòêðûâàåì ôàéë äëÿ ÷òåíèÿ.
  Reset(F);
 
  //Ïåðåïèñûâàåì ýëåìåíòû ôàéëà â ìàññèâ.
  i := 0;
  while not Eof(F) do begin
    //Åñëè òðåáóåòñÿ, óâåëè÷èâàåì äëèíó ìàññèâà.
    if i = Length(Arr) then SetLength(Arr, i + Capacity);
    //×èòàåì î÷åðåäíîé ýëåìåíò ôàéëà â ìàññèâ.
    Readln(F, Arr[i]);
    //Èíäåêñ ñëåäóþùåãî ýëåìåíòà ìàññèâà.
    Inc(i);
  end;
 
  //Êîððåêòèðóåì äëèíó ìàññèâà â ñîîòâåòñòâèå ñ êîëè÷åñòâîì äîáàâëåííûõ â íåãî
  //ýëåìåíòîâ.
  SetLength(Arr, i);
 
  //Çàêðûâàåì ôàéë.
  CloseFile(F);
 
  //Ñîðòèðóåì ìàññèâ ïî âîçðàñòàíèþ. Ìåòîä ñîðòèðîâêè - ñîðòèðîâêà âñòàâêàìè.
  for i := 0 + 1 to High(Arr) do begin
    j := i;
    Num := Arr[i];
    while ( j > 0 ) and ( Num < Arr[j - 1] ) do begin
      Arr[j] := Arr[j - 1];
      Dec(j);
    end;
    Arr[j] := Num;
  end;
 
  Memo1.Clear;
 
  //Ðàñïå÷àòûâàåì ìàññèâ â Ìåìî.
  Memo1.Lines.Add('Îòñîðòèðîâàííûé ìàññâ:');
  for i := 0 to High(Arr) do begin
    Memo1.Lines.Add( FloatToStr(Arr[i]) );
  end;
end;
 
//Î÷èñòêà Ìåìî.
procedure TForm1.Button4Click(Sender: TObject);
begin
  Memo1.Clear;
end;
 
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    '0'..'9', '-', #8 : ;
    else begin
      if Key <> DecimalSeparator then Key := #0;
    end;
  end;
end;
 
end.
Если вопросы возникнут - спрашивай.
Вложения
Тип файла: rar Project01.rar (201.9 Кб, 32 просмотров)
1
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
26.04.2010, 21:43  [ТС]
Спасибо вам огромное)))
Вы на самом деле лучший)))
Как вам так удается всё)))

Вопросик)))

Зачем и что означает это?

Delphi
1
2
3
4
5
6
7
8
 try
        Num := StrToFloat(StringGrid1.Cells[j, i]);
      except
        on e : Exception do begin
          ShowMessage(
            'Обнаружено содержимое ячейки отличное от записи числа.' + #10
            + 'Действие прервано. Проверьте данные в таблице.'
          );
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.04.2010, 21:56
Это перехват исключений (т. е. перехват ошибок). Если при выполнении строки:
Delphi
1
  Num := StrToFloat(StringGrid1.Cells[j, i]);
Произойдёт ошибка - если в ячеёке записано не число. То эта ошибка будет перехвачена и произойдет выполнение блока операторов:
Delphi
1
2
3
4
5
6
          ShowMessage(
            'Обнаружено содержимое ячейки отличное от записи числа.' + #10
            + 'Действие прервано. Проверьте данные в таблице.'
          );
          CloseFile(F);
          Exit;
Если этот механизм вы ещё не проходили, тогда можно заменить этот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
      try
        Num := StrToFloat(StringGrid1.Cells[j, i]);
      except
        on e : Exception do begin
          ShowMessage(
            'Обнаружено содержимое ячейки отличное от записи числа.' + #10
            + 'Действие прервано. Проверьте данные в таблице.'
          );
          CloseFile(F);
          Exit;
        end;
      end;
на упрощённую версию:
Delphi
1
2
3
4
5
6
7
8
9
10
      if StringGrid1.Cells[j, i] <> '' then begin
        Num := StrToFloat(StringGrid1.Cells[j, i]);
      end else begin
        ShowMessage(
          'Обнаружено содержимое ячейки отличное от записи числа.' + #10
          + 'Действие прервано. Проверьте данные в таблице.'
        );
        CloseFile(F);
        Exit;
      end;
Этот код делает только самую простую проверку - на тот случай, если ячейка пустая. Но этого я думаю достаточно, если вы ещё механизмы перехвата исключительных ситуаций не проходили.
1
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
26.04.2010, 22:39  [ТС]
Спасиииииибоооооооо))
Только вот ещё вопрос)))
Простите если уже надоела вам(

А как сделать чтобы в файл выводил в нормальном виде, а то он сохраняет

-5.60000000000000E+0001
9.80000000000000E-0001
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.04.2010, 22:51
Цитата Сообщение от Дашук Посмотреть сообщение
Простите если уже надоела вам(
Если бы меня что-то раздражало, я бы на этом сайте не появлялся.
---
Можно управлять форматом чисел при записи в файл. Например:
Delphi
1
      Writeln(F, Num:7:3);
Это означает, что в файл будут записываться вещественные числа в формате: 7 знаков на всё число, включая знак "-" и десятичную точку (если они имеются). Из этих 7 знаков 3 будут использоваться для записи дробной части. Соответственно 7 - 1 - 3 = 3 знака будут отведены для записи целой части положительно чилса. Либо 7 - 1 - 1 - 3 = 2 знака будут отведены записи целой части отрицательного числа.
1
0 / 0 / 0
Регистрация: 23.04.2010
Сообщений: 30
26.04.2010, 23:00  [ТС]
Спасибо)))
Но это только так???
А других вариантов нет, чтобы сохранял прямо как число и есть на самом дела!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.04.2010, 23:00
Помогаю со студенческими работами здесь

Чтение данных из внешнего файла
Есть значит сторонняя программа (экспорт из этой программы формирование всех документов их много) формируется txt фаил в нём данные...

Чтение массива из файла, его преобразование и запись в другой файл
Всем привет. Есть вот такой код: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;fstream&gt; #include &lt;string&gt; ...

Чтение массива из файла в textbox и сохранение его в виде матрицы
Здравствуйте! Читаю массив из файла, после чего пихаю его в текстбокс, после чего надо сохранить прочтённый массив в виде матрицы, для...

Считывание одномерного массива из файла и его сортировка
Ребята, помогите. мне нужно считать из файла одномерный массив, например (2 3 4 5 1 5) и вывести в едит. потом при нажатии другого баттона...

Чтение внешнего файла программой (.dat/.asm)
Вот есть код , он создает файл и открывает этот файл без проблем, но если файл попробовать открыть после перезапуска программы (т.е. уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru