|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | 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  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
 |