Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2008, 01:14   #1
Isthmus
Пользователь
 
Регистрация: 21.04.2008
Сообщений: 21
Смущение Сортировка в текстовом файле

Ситуация такая. Пишу прогу без динамики. Использую списки, которые загоняються в файл методом:

while not eof(f) do
writeln('Имя :'); readln(st.Imya);
writeln('Номер: '); readln(st.Nomer);
write(f,st);

Короче говоря основа базы данных. Вопрос следующий, как сделать сортировку по имени???

Спасибо заранее всем за идеи и помощь.
Isthmus вне форума Ответить с цитированием
Старый 21.04.2008, 08:27   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Isthmus Посмотреть сообщение
Вопрос следующий, как сделать сортировку по имени???
Нужно делать ввод данных в память. Например, хранение списка в массиве. В процессе ввода можно сразу сортировать - вставлять новый элемент в нужное место списка. Только после этого сохранять в файл.

Надеюсь, приведенный код только схема, потому как условие окончания цикла не соответствует условию задачи и нет begin/end;
alexBlack вне форума Ответить с цитированием
Старый 21.04.2008, 11:12   #3
nikleb
Форумчанин
 
Регистрация: 04.04.2007
Сообщений: 131
По умолчанию

Была у меня практика, там нужно было такое делать. Если хочеш могу выложить, но меню там на латышском потомучто живу в латвии и учусь в латышской школе

Последний раз редактировалось nikleb; 21.04.2008 в 11:26.
nikleb вне форума Ответить с цитированием
Старый 21.04.2008, 12:49   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Сортиртировка по имени делается также как любая сортировка, методом сравнения величин элементов. Видимо имена у вас строкового типа, а строки тоже сравниваются и сортируются. Например по алфавиту. У вас видимо есть массив записей, тогда это делается например так:
Код:
for i:=1 to n-1 do
for j:=1 to n-1 do
if st[j].Imya<st[j+1].Imya then
    begin
      x:=st[j].Imya;
      st[j].Imya:=st[j+1].Imya;
      st[j+1].Imya:=x;
    end;
где х - буфер,переменная строкового типа.
Если по имени нужно отсортировать весь массив записей, то пишем:
Код:
for i:=1 to n-1 do
for j:=1 to n-1 do
if st[j].Imya<st[j+1].Imya then
    begin
      x:=st[j];
      st[j]:=st[j+1];
      st[j+1]:=x;
    end;
где х - буфер,переменная типа записи, то что у вас написано перед словом record.
Потом выводим на экран или в файл уже отсортированную запись.
puporev вне форума Ответить с цитированием
Старый 22.04.2008, 10:18   #5
Isthmus
Пользователь
 
Регистрация: 21.04.2008
Сообщений: 21
По умолчанию

Хмм... у меня была идея так попробовать, но будет это работать, если при вводе данных в файл я не использовал циклы i и j. Или прога всё равно будет брать по одному элементу и сравнивать?

Вечером попробую, просто сейчас в универ ухожу.
Isthmus вне форума Ответить с цитированием
Старый 22.04.2008, 22:48   #6
Isthmus
Пользователь
 
Регистрация: 21.04.2008
Сообщений: 21
По умолчанию

В общем ничего не получилось.

Вот мой тип, который рекорд:


Код:
Type ykazatel=record

Termin:string[30];
Straniza:integer;
End;
А вот сама процедура:

Код:
Procedure Sortirovka;
Var
  i,j:integer;
  x:string;
  st:ykazatel;
Begin
  clrscr;
  assign(f,filename);
  reset(f);
  writeln('Сортировка по названию термина');
  readln;
  while not eof(f) do
    Begin
      for i:=1 to n-1 do   
      for j:=1 to n-1 do   
        if st[j].Termin<st[j+1].Termin then   
           begin   
             x:=st[j].Termin;   
             st[j].Termin:=st[j+1].Termin;   
             st[j+1].Termin:=x;   
           end; 
    end;
End;

Компилятор выдаёт ошибку на месте где встречаеться st[j].Termin : Error 121: Invalid qualifier.

Последний раз редактировалось Isthmus; 22.04.2008 в 22:49. Причина: не правильно написал
Isthmus вне форума Ответить с цитированием
Старый 22.04.2008, 23:14   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Ну Вы даете. Прежде чем сортировать МАССИВ записей, его не плохо было бы сначала объявить, например
st:array[1..50] of ykazatel;
потом наполнить содержимым, типа
n:=1;
while not eof(f) do
Begin
readln(f,st[n]);
n:=n+1;
end;

А вот потом, благословлясь, можно этот массив и посортировать слегка.
puporev вне форума Ответить с цитированием
Старый 22.04.2008, 23:42   #8
MusicMan
Пользователь
 
Аватар для MusicMan
 
Регистрация: 19.04.2008
Сообщений: 66
По умолчанию

Ну и чехорда... Если Isthmus хочешь, то могу написать функцию
с тем что надо (только с применением указателей) и с входными параметрами. А дальше сам разгребёшь. Не всё же халява .
Ну как?
Нет таких проблем, которых мы не можем себе создать
MusicMan вне форума Ответить с цитированием
Старый 23.04.2008, 00:15   #9
Isthmus
Пользователь
 
Регистрация: 21.04.2008
Сообщений: 21
По умолчанию

2 MusicMan: нет, спасиб. Я лучше без указателей помучаюсь
Isthmus вне форума Ответить с цитированием
Старый 23.04.2008, 01:26   #10
Isthmus
Пользователь
 
Регистрация: 21.04.2008
Сообщений: 21
По умолчанию

Всё равно не пашет. Может есть у кого ещё предложения???

Код:
Procedure Sortirovka;
var
  n,i,j:integer;
  st:array[1..5] of ykazatel;
  x:string;
Begin
  clrscr;
  assign(f,filename);
  reset(f);
  writeln('Сортировка');
  readln;
  n:=1;
  while not eof(f) do
    Begin
      read(f,st[n]);
      n:=n+1;
    End;

    Begin
      For i:=1 to 5 do
        Begin
          For j:=1 to 5 do
            If st[j].Termin>st[j+1].Termin then
              Begin
                x:=st[j].Termin;
                st[j].Termin:=st[j+1].Termin;
                st[j+1].Termin:=x;
              End;
        End;
    End;
  rewrite(f);
  For j:=1 to 5 do
    write(f,st[j]);
End;
Isthmus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск символов в текстовом файле. Uomo Общие вопросы Delphi 8 24.10.2007 15:57
Поиск чисел в текстовом файле Homka Паскаль, Turbo Pascal, PascalABC.NET 4 25.06.2007 19:15
Поиск данных в текстовом файле BizON Помощь студентам 1 06.06.2007 18:17