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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.06.2010, 14:30
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
Сообщение Чтение из файла и сортировка

НЕ получается толком провести сортировку в результате выводит дикие числа - отсортированные. Я так полагаю что сортирует он мусор, который перезаписывает в массив, который ранее выводится.
Подскажите люди де ошибка, если кто знает или сталкивался с этим:
Код:
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: Пользуемся тегами, иначе последуют санкции!

Последний раз редактировалось Admin, 01.06.2010 в 14:54.
Ответить с цитированием
  #2  
Старый 01.06.2010, 14:57
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну вы и окрошку сотворили.
1. Вы файл открываете какой? Текстовый. Так какого... вы читаете из него целое? Это совершенно разные по способу хранения данные.
Читать надо в строковую переменную, преобразовывать ее в число по необходимости.
2. На кой вы заполняете мемо таким способом? У мемо есть внутренний метод за загрузки текста из файла. Memo1.Lines.LoadFromFile
Исправите это - продолжим разговор.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 01.06.2010, 15:06
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Хммм....ща попробую из окрошки зделать суп))
Ответить с цитированием
  #4  
Старый 01.06.2010, 15:33
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Я в тупике, хочу попробовать через type, record зделать и не знаю как! Может хоть намекнёте как там начало, а дальше покопаю...)
Ответить с цитированием
  #5  
Старый 01.06.2010, 15:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Да вам там и ничего особо и не надо изобретать. Убрать все упоминания файла 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  
Старый 01.06.2010, 16:03
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Эм, ну я сначала хотел пузырьком, но воспользовался вставкой. Напишите свой если есть желание лишним не будет, буду знать ещё метод))
хотел ещё через type попробовать)
Ответить с цитированием
  #7  
Старый 01.06.2010, 16:28
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Я так понимаю, вы на Паскале учились. Так вам теперь основательно переучиваться придется.
В родном классе 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  
Старый 01.06.2010, 16:43
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Благодарю! Сейчас попроую. Да, паскаль)) бум переучиывться.
Ответить с цитированием
  #9  
Старый 01.06.2010, 17:03
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А если вам все-же захочется сортировать список по правилам сортировки чисел, то делается так:
Код:
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  
Старый 02.06.2010, 10:14
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Спасибо! Попробую сейчас осилить и погляжу что выйдет у меня))
Ответить с цитированием
  #11  
Старый 02.06.2010, 10:45
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

А фот функцию описывать отдельно от всего? Мне прост интересно как она будет сортировать? Как я понял это функция и упорядочит значения в Мемо1 по порядку, но при каком условии или автоматически? Вот...
Ответить с цитированием
  #12  
Старый 02.06.2010, 10:51
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

А если точно, то мне надо слепить прогу, которая будет читать из файла числа, заносить их в массив и после сортировать, п оатом находить то число, которое ввожу или говорить что его нети если нходи, то показывает этот элемент и номер элемента в массиве...вот я там плясал, плясал и... посик нужен бинарный, ну хотя его принцип я знаю и сам сделать смогу...
Ответить с цитированием
  #13  
Старый 02.06.2010, 11:27
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

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

Что касается как работает функция в моем примере, то все очень просто:
Когда вы вызываете метод CustomSort, то в качестве параметра туда передается адрес функции, задача которой сравнить два элемента из списка и вернуть один из 3 вариантов (больше,меньше,равно). Компонент уже сам прогоняет весь список используя эту функцию, тем самым сортируя по схеме предложенной вами.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #14  
Старый 02.06.2010, 11:43
Add_Mod Add_Mod вне форума
Прохожий
 
Регистрация: 08.05.2010
Сообщения: 18
Репутация: 10
По умолчанию

Что-то не робит по вашей сортировке, выводит в строку содержимое файла и всё, может всё таки где то я кривой)):
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  
Старый 02.06.2010, 12:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
...выводит в строку содержимое файла...
Настораживает меня это. Пример вашего файлика скиньте.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter