Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 07.04.2009, 00:25   #1
Dem6
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 24
Репутация: 10
По умолчанию Сортировка файла

Код:
procedure voice;
begin
clrscr;
rewrite(res_f);
   reset(info_f);
   while not eof(info_f) do begin
   read(info_f,info);
    reset(pynkt_f);
      while not eof(pynkt_f) do begin
         read(pynkt_f,obl);
         write(info.fio , '(' , info.part , ') : '  ,obl.pynkt,  ' -> ');
         readln(votes);
         writeln(res_f,info.fio:35,' |',info.part:10,' |',obl.pynkt:10,' |',votes:10, '|');
      end;
      end;
    close(res_f);
end;
Файл RES_F не типизированный.
После ввода данных получаем вот такой файл
Код:
          ФИО                        Партия    Нас. пункт    Кол-во
                                                                        голосов
--------------------------------------------------------------------------------
                               Дем1 |      КПСС |        Смела |        45 |
                               Дем1 |      КПСС |   Черкассы |        45 |
                               Дем2 |      КПСС |        Смела |        50 |
                               Дем2 |      КПСС |   Черкассы |        51 |
--------------------------------------------------------------------------------
Меня интересует как можно этот файл отсортировать до вида:
Код:
            ФИО                        Партия    Нас. пункт    Кол-во
                                                                         голосов
--------------------------------------------------------------------------------
                               Дем2 |      КПСС |  Черкассы |        51 |
                               Дем2 |      КПСС |       Смела |        50 |
                               Дем1 |      КПСС |       Смела |        45 |
                               Дем1 |      КПСС |  Черкассы |        45 |
--------------------------------------------------------------------------------
Dem6 вне форума   Ответить с цитированием
Старый 07.04.2009, 08:11   #2
Лубышев
ZlojDeveloper
Профессионал
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Адрес: Самара
Сообщений: 1,027
Репутация: 235

skype: zlojvirus89
По умолчанию

Вот один из способов.

(не помню можно ли создавать динамический массив в Паскале?)

Открываем файл на чтение.
Устанавливаем курсор в нужную строку (пропускаем шапку).
Копируем все "записи" в буффер - массив строк.
Закрываем файл.
Сортируем массив по "методу пузырька" (хотя бы) - обсуждалось
Открываем файл на запись.
Перезаписываем.
Дописываем шапку.
Цикл (от 0 до конца массива) по записыванию записей, хронящихся в буфере
Закрываем файл.
Готово.
__________________
Писано по д'Эльфийски
Лубышев вне форума   Ответить с цитированием
Старый 07.04.2009, 09:05   #3
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
Репутация: 221
По умолчанию Более конкретно

Код:
function Sorting(List: TStringList; Index1, Index2: Integer): Integer;
var
  S1, S2 : string;
begin
  //здесь сортировка по кол-ву голосов (размещенных в конце строк), но никто не мешает сделать по-другому
  S1 := Copy(List[Index1], Length(List[Index1])-10, 255);
  S2 := Copy(List[Index2], Length(List[Index2])-10, 255);
  Result := 0;
  if S1 = S2 then Exit;
  if S1 < S2 then Result := 1
             else Result := -1
end;

procedure voice;
var SL : TStringList;
begin
clrscr;
rewrite(res_f);
   reset(info_f);
   while not eof(info_f) do begin
   read(info_f,info);
    reset(pynkt_f);
      while not eof(pynkt_f) do begin
         read(pynkt_f,obl);
         write(info.fio , '(' , info.part , ') : '  ,obl.pynkt,  ' -> ');
         readln(votes);
         writeln(res_f,info.fio:35,' |',info.part:10,' |',obl.pynkt:10,' |',votes:10, '|');
      end;
      end;
    close(res_f);

  SL := TStringList.Create;
  try
    SL.LoadFromFile(<имя файла res_f>);
    SL.Sorted := False;
    SL.CustomSort(@Sorting);
    SL.SaveToFile(<имя файла res_f>);
  finally
    SL.Free;
  end;
end;
Скандербег вне форума   Ответить с цитированием
Старый 07.04.2009, 11:46   #4
Dem6
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 24
Репутация: 10
По умолчанию

Я создал новую процедуру:
Код:
procedure sort;
var
   s:array[1..100] of string;
   i:integer;
  st:string;
begin
 reset(res_f);
 i:=1;
   while not eof(res_f) do begin
     readln(res_f,votes);
     st:=copy(votes,62,10);
     s[i]:=st;
     inc(i);
   end;
end;
И как только я её запустил у меня выбила ошибка
Код:
Error 202: stack overflow error
Может я что-то в процедуре не так написал?
Буду очень благодарен если поможете дописать мою процедуру.

Последний раз редактировалось Dem6; 07.04.2009 в 11:49.
Dem6 вне форума   Ответить с цитированием
Старый 07.04.2009, 11:57   #5
Dem6
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 24
Репутация: 10
По умолчанию

После того когда я поменял
Код:
 s:array[1..100] of string;
на
Код:
 s:array[1..50] of string;
ошибку перестало выбивать.
Dem6 вне форума   Ответить с цитированием
Старый 07.04.2009, 12:23   #6
Dem6
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 24
Репутация: 10
По умолчанию

Вот делаю по книжному примеру(метод пузырька):
Код:
procedure sort;
var
   s:array[1..50] of integer;
 l, amin,i,n,j:integer;
  st:string;
  vote: longint;
  err: integer;
begin
 reset(res_f);
  n:=1;
   while not eof(res_f) do begin
   readln(res_f,votes);
     val(copy(votes,62,10),vote,err);
     s[i]:=vote;
     writeln(s[i]);
     inc(n);
   end;
  for i:=1 to n do begin
    amin:=s[i];
    l:=i;
    J:=i+1;
    while j<=n do begin
      if amin>s[j] then
        begin
          amin:=s[j];
          l:=j;
        end;
      j:=J+1;
    end;
    s[l]:=s[i];
    s[i]:=amin;
  end;
  writeln('После сортровки');
  for i:=1 to n do writeln(s[i]);
end;
А вот мой результат:
Код:
45
45
50
51
После сортровки
51
522
522
4102
25456
Вместо 4 элементов я получаю 5. И где берутся такие числа?
Первый элемент отсортировало правильно, а остальных я вообще не вижу
Dem6 вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal - сортировка массива(файла?) kossner Помощь студентам 14 05.12.2008 15:57
Сортировка строчек из txt файла mmka Общие вопросы C/C++ 26 24.11.2008 18:47
Не могу понять почему не идет сортировка файла, помогите пожалуйста Taisja Помощь студентам 2 15.06.2008 20:37
Типизированные файлы.Создание, удаление, редактирование, сортировка записей типизированного файла.Паскаль Студент Шиза Помощь студентам 6 08.12.2007 14:41
Сортировка файла dbf Jon_1981 БД в Delphi 7 11.06.2007 10:57


19:05.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.