|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Чтение из файла и сортировка
НЕ получается толком провести сортировку в результате выводит дикие числа - отсортированные. Я так полагаю что сортирует он мусор, который перезаписывает в массив, который ранее выводится.
Подскажите люди де ошибка, если кто знает или сталкивался с этим: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Menus; type TForm1 = class(TForm) Label2: TLabel; GroupBox1: TGroupBox; Label1: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; GroupBox2: TGroupBox; Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; Label8: TLabel; Button4: TButton; MainMenu1: TMainMenu; Memo1: TMemo; Memo2: TMemo; N1: TMenuItem; Label9: TLabel; N2: TMenuItem; Label10: TLabel; OpenDialog1: TOpenDialog; procedure Button4Click(Sender: TObject); procedure N1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; i,k,Num,j: Integer; implementation {$R *.dfm} procedure TForm1.Button4Click(Sender: TObject); begin Close; end; procedure TForm1.N1Click(Sender: TObject); var b:array[1..10]of integer; t:textfile; sum:Integer; begin If OpenDialog1.Execute then begin assignfile(t, OpenDialog1.FileName); reset(t); end; While NOT EOF(t) do begin read(t,b[i]); Memo1.Lines.Add(IntToStr(b[i])); k:=k+1; Label10.Caption:=IntToStr(k); end; CloseFile(t); for i:=1 to 10 do begin j:=i; Num:=b[i]; while (j>0) and (Num<b[j-1]) do begin b[j]:=b[j-1]; Dec(j); end; b[j]:=Num; end; Memo2.Clear; for i:=1 to 10 do begin Memo2.Lines.Add(IntToStr(b[i])); end; end; end. Последний раз редактировалось Admin, 01.06.2010 в 14:54. |
#2
|
||||
|
||||
Ну вы и окрошку сотворили.
1. Вы файл открываете какой? Текстовый. Так какого... вы читаете из него целое? Это совершенно разные по способу хранения данные. Читать надо в строковую переменную, преобразовывать ее в число по необходимости. 2. На кой вы заполняете мемо таким способом? У мемо есть внутренний метод за загрузки текста из файла. Memo1.Lines.LoadFromFile Исправите это - продолжим разговор. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Хммм....ща попробую из окрошки зделать суп))
|
#4
|
|||
|
|||
Я в тупике, хочу попробовать через type, record зделать и не знаю как! Может хоть намекнёте как там начало, а дальше покопаю...)
|
#5
|
||||
|
||||
Да вам там и ничего особо и не надо изобретать. Убрать все упоминания файла t, слегка переделать этот блок:
Код:
While NOT EOF(t) do begin read(t,b[i]); Memo1.Lines.Add(IntToStr(b[i])); k:=k+1; Label10.Caption:=IntToStr(k); end; Код:
Memo1.Lines.LoadFromFile(OpenDialog1.FileName); Label10.Caption:=IntToStr(Memo1.Lines.Count); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
Эм, ну я сначала хотел пузырьком, но воспользовался вставкой. Напишите свой если есть желание лишним не будет, буду знать ещё метод))
хотел ещё через type попробовать) |
#7
|
||||
|
||||
Я так понимаю, вы на Паскале учились. Так вам теперь основательно переучиваться придется.
В родном классе TStringList который очень хорошо совместим со свойством Memo.List есть уже встроенная сортировка. Делается это примерно так: Код:
Var SL: TStringList; ... SL := TStringList.Create; SL.Sorted := True; SL.LoadFromFile(OpenDialog1.FileName); Memo1.Lines := SL; SL.Free; Но надо принимать в расчет, что сортировка будет происходить по правилам сортировки текста. Но и это тоже не проблема если внедрить свой метод сортировки. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 01.06.2010 в 16:31. |
#8
|
|||
|
|||
Благодарю! Сейчас попроую. Да, паскаль)) бум переучиывться.
|
#9
|
||||
|
||||
А если вам все-же захочется сортировать список по правилам сортировки чисел, то делается так:
Код:
function NumberSort(List: TStringList; Index1, Index2: Integer): Integer; begin Result := 0; if StrToInt(List.Strings[Index1]) > StrToInt(List.Strings[Index2]) then Result := 1; if StrToInt(List.Strings[Index1]) < StrToInt(List.Strings[Index2]) then Result := -1; end; ... Var SL: TStringList; begin SL := TStringList.Create; SL.LoadFromFile(OpenDialog1.FileName); SL.CustomSort(@NumberSort); Memo1.Lines := SL; SL.Free; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#10
|
|||
|
|||
Спасибо! Попробую сейчас осилить и погляжу что выйдет у меня))
|
#11
|
|||
|
|||
А фот функцию описывать отдельно от всего? Мне прост интересно как она будет сортировать? Как я понял это функция и упорядочит значения в Мемо1 по порядку, но при каком условии или автоматически? Вот...
|
#12
|
|||
|
|||
А если точно, то мне надо слепить прогу, которая будет читать из файла числа, заносить их в массив и после сортировать, п оатом находить то число, которое ввожу или говорить что его нети если нходи, то показывает этот элемент и номер элемента в массиве...вот я там плясал, плясал и... посик нужен бинарный, ну хотя его принцип я знаю и сам сделать смогу...
|
#13
|
||||
|
||||
Сделать-то конечно все можно, но зачем тратить свое время на изобретение велосипеда? Дельфи тем и удобен, что в нем уже разработаны и предоставлены пользователю базовые средства, почти под любой ваш запрос. На мой взгляд, лучше потратить свой энтузизим на изучение этих самых средств, а вот когда вы обнаружите, что они вас чем-то не устраивают, тогда вы действительно сможете сделать что-то полезное.
Что касается как работает функция в моем примере, то все очень просто: Когда вы вызываете метод CustomSort, то в качестве параметра туда передается адрес функции, задача которой сравнить два элемента из списка и вернуть один из 3 вариантов (больше,меньше,равно). Компонент уже сам прогоняет весь список используя эту функцию, тем самым сортируя по схеме предложенной вами. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#14
|
|||
|
|||
Что-то не робит по вашей сортировке, выводит в строку содержимое файла и всё, может всё таки где то я кривой)):
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Menus; type TForm1 = class(TForm) Label2: TLabel; GroupBox1: TGroupBox; Label1: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; GroupBox2: TGroupBox; Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; Label8: TLabel; Button4: TButton; MainMenu1: TMainMenu; Memo1: TMemo; Memo2: TMemo; N1: TMenuItem; Label9: TLabel; N2: TMenuItem; Label10: TLabel; OpenDialog1: TOpenDialog; Label11: TLabel; Label12: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure N1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const n=20; var Form1: TForm1; implementation {$R *.dfm} function NumberSort(List: TStringList; Index1, Index2: Integer): Integer; begin Result := 0; if StrToInt(List.Strings[Index1]) > StrToInt(List.Strings[Index2]) then Result := 1; if StrToInt(List.Strings[Index1]) < StrToInt(List.Strings[Index2]) then Result := -1; end; procedure TForm1.N1Click(Sender: TObject); var b:array[1..10]of integer; t:textfile; SL: TStringList; sum:Integer; begin SL := TStringList.Create(); SL.LoadFromFile('ms.txt'); SL.CustomSort(@NumberSort); Memo1.Lines := SL; SL.Free; end; end. |
#15
|
||||
|
||||
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |