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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2016, 10:00   #1
Лакира
Пользователь
 
Регистрация: 17.11.2016
Сообщений: 28
По умолчанию Паскаль. Быстрая сортировка массива записи.

В файле содержатся сведения о веществах: название вещества, удельный вес и проводимость (проводник, полупроводник, диэлектрик).
В новый файл переписать данные, упорядочив их по убыванию удельных весов.

Проблема: сортируется только если 3 записи.


Код:
procedure Alg11(var f2:TFsubstance; a,b:byte);
var i,j,x:integer;t:real;
begin
reset(f2);
while not eof(f2) do begin

i:=a; j:=b;
x:= (filesize(f2)+1)div 2;
repeat 


while (mas[i].uweight>mas[x].uweight) do
inc(i);
while (mas[j].uweight<mas[x].uweight)do
dec(j);
if(a<=b)then begin
t:=mas[i].uweight;
mas[i].uweight:=mas[j].uweight;
mas[j].uweight:=t;
inc(a);
dec(b);end;
until i<j;
if a < j then 
        Alg11(f2, a, j); 
    if i < b then
        Alg11(f2, i, b); 
close(f2);
end;end;

Последний раз редактировалось Лакира; 17.11.2016 в 10:02.
Лакира вне форума Ответить с цитированием
Старый 17.11.2016, 11:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

простите, а зачем Вы засунули цикл по файлу внутрь рекурсивной процедуры сортировки?!
Или Вы не понимаете, что каждый раз, когда идёт вызов
Alg11(f2, a, j);
Alg11(f2, i, b);
в цикле у Вас будет Reset(f2) - это переход к началу файл и новый цикл while not eof(f2)

скажите честно, это Вы сами придумали?
и, главное, зачем это?
Ведь чтения из файла нет, сортируется массив mas (и, кстати, тоже неверно - обменивается только одно поле uweight! если там есть другие поля, то будет каша! ) )

короче, не зачёт!
переделывать нужно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.11.2016, 12:05   #3
Лакира
Пользователь
 
Регистрация: 17.11.2016
Сообщений: 28
По умолчанию

Вот я поправила, но все равно не работает

Код:
procedure Alg11(var f2:TFsubstance);
var i,j,x,a1,b1:integer;t:real;a,b,x1:Tsubstance;
begin
reset(f2);i:=a1; j:=b1;
x:= (filesize(f2)+1)div 2;
for i:=0 to x do
for j:=filesize(f2) to x do begin
seek(f2,i);
read(f2,a);
seek(f2,j);
read(f2,b);
read(f2,x1);
repeat
while (a.uweight<x1.uweight) do
inc(a1);
while (b.uweight>x1.uweight)do
dec(b1);
if(a1<=b1)then begin
t:=a.uweight;
a.uweight:=b.uweight;
b.uweight:=t;
inc(a1);
dec(b1);end;
until a1<b1;

close(f2);
end;end;
Лакира вне форума Ответить с цитированием
Старый 17.11.2016, 12:19   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Лакира Посмотреть сообщение
Вот я поправила, но все равно не работает
что Вы поправили? Убрали алгоритм QuickSort (aka "быстрая сортировка")?
А зачем? И как оно после этого должно работать?
И зачем вы дёргаете файл? куда делся массив mas ?



давайте начнём с начала.
Что Вам дано и что нужно сделать?
Вот прямо дословно и конкретно - какую задачу Вы пытаетесь решить?

p.s. ну и попутно, если Вас интересует конкретный ответ, то:
1) укажите, каким Паскалем Вы пользуетесь
2) приведите код полностью, с описанием типов данных.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.11.2016, 12:31   #5
Лакира
Пользователь
 
Регистрация: 17.11.2016
Сообщений: 28
По умолчанию

В файле содержатся сведения о веществах: название вещества, удельный вес и проводимость (проводник, полупроводник, диэлектрик). В новый файл переписать данные, упорядочив их по убыванию удельных весов.

1) Паскаль АВС
2)
Код:
uses crt;

const n=15;
type Tsubstance = record
name:string[15];
uweight:real;
spend:integer;
end;
TFsubstance = file of Tsubstance;

var sub:Tsubstance;
mas:array[1..15]of Tsubstance;
a:Tsubstance;    


procedure InputRec(var sub:Tsubstance); //Ввод данных в запись
var i:byte;
begin
with sub do begin

writeln('Введите удельный вес ');
readln(uweight);
writeln('Выберете проводимость вещества ');
writeln('1- проводник');
writeln('2- полупроводник');
writeln('3- диэлектрик');
readln(spend);
writeln('Введите название вещества ');
readln(name);

end;
end;

procedure Alg1(var f1,f2:TFsubstance);
var i,j:integer; t:Tsubstance;
begin
reset(f1);
rewrite(f2);
while not eof(f1) do begin
read(f1,sub);
write(f2,sub);
end;close(f1);close(f2);
end;

procedure Alg11(var f2:TFsubstance);
var i,j,x,a1,b1:integer;t:real;a,b,x1:Tsubstance;
begin
reset(f2);i:=a1; j:=b1;
x:= (filesize(f2)+1)div 2;
for i:=0 to x do
for j:=filesize(f2) to x do begin
seek(f2,i);
read(f2,a);
seek(f2,j);
read(f2,b);
read(f2,x1);
repeat
while (a.uweight<x1.uweight) do
inc(a1);
while (b.uweight>x1.uweight)do
dec(b1);
if(a1<=b1)then begin
t:=a.uweight;
a.uweight:=b.uweight;
b.uweight:=t;
inc(a1);
dec(b1);end;
until a1<b1;

close(f2);
end;end;


var f1,f2:TFsubstance;,fn1,fn2:string;
begin //алгоритм 1
write('Введите имя исходного файла');
readln(fn1);
if FileExists (fn1)then begin
writeln('Введите имя результирующего файла');
readln(fn2);
assign(f1,fn1);
assign(f2,fn2);
Alg1(f1,f2);
Alg11(f2);

end
else
writeln('Файл с таким именем не существует');

Последний раз редактировалось Лакира; 17.11.2016 в 12:35.
Лакира вне форума Ответить с цитированием
Старый 17.11.2016, 13:40   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так, потихоньку проясняется...

надеюсь, что Вы эту программу сами писали.

Тогда вот ещё на три моих вопроса ответьте, пожалуйста.
1) откуда в теме появилась "быстрая сортировка"? Это просто так или это требование задания?
2) для чего описан массив записей mas:array[1..15]of Tsubstance; ?!
3) для чего процедура InputRec(var sub:Tsubstance); ?! Она же нигде не вызывается!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.11.2016, 13:48   #7
Лакира
Пользователь
 
Регистрация: 17.11.2016
Сообщений: 28
По умолчанию

3) InputRec(var sub:Tsubstance) вызывается перед алгоритмом 1(тут у меня ошибка)
2) изначально пробовала сделать сортировку через массив записей, после редактирования не удалила
1)Желательно выполнить быстрой сортировкой

Или покажите, пожалуйста, сортировку пузырьком для записи

Вот вариант сортировки пузырьком, который тоже не рабочий

Код:
procedure Alg111(var f1:TFsubstance);
var i,j:integer;n:real;
begin
reset(f1);
for i:=0 to 10 do
       for j:=1 to 9 do
       begin
        if mas[i].uweight<mas[j].uweight then
        begin
        n:=mas[i].uweight;
        mas[i].uweight:=mas[j].uweight;
        mas[j].uweight:=n;
        end;
          end;close(f1);end;

Последний раз редактировалось Аватар; 17.11.2016 в 14:30.
Лакира вне форума Ответить с цитированием
Старый 17.11.2016, 14:18   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ладно. давайте поступим так.

вот Вам рабочий код:
Код:
const
  MaxRecordInfile = 500;

type
  Tsubstance = record
    name: string[15];
    uweight: real;
    spend: integer;
  end;
  TFsubstance = file of Tsubstance;
  TSubstanceArray = array[1..MaxRecordInfile]of Tsubstance;

procedure CreateDemoFile(fname:string);
var f : TFsubstance;
  r : Tsubstance;
begin
  Assign(f, fname);
  Rewrite(f);
  with r do begin
     name:='Бетта'; uweight:=34.223; spend:=2;
     Write(f, r);
     name:='Gamma'; uweight:=14.122; spend:=3;
     Write(f, r);
     name:='Zet'; uweight:=2.789; spend:=1;
     Write(f, r);
     name:='Alpha'; uweight:=1.089; spend:=1;
     Write(f, r);
     name:='Yota'; uweight:=22.089; spend:=2;
     Write(f, r);
  end;
  Close(f);
  WriteLn('Демо файл с именем '+fname+' успешно создан.')
end;

procedure ReadFileToArray(fname:string; var A : TSubstanceArray; var CountOfRec : integer);
var f : TFsubstance;
  r : Tsubstance;
begin
  CountOfRec := 0;
  if FileExists(fname) then begin
    Assign(f, fname);
    Reset(f);
    while not eof(f) do begin
      Inc(CountOfRec);
      Read(f, A[CountOfRec]);
    end;
    Close(f);
  end;
  WriteLn('из файла '+fname+' считано в память ',CountOfRec,' запись(ей).')
end;

procedure PrintFile(fname:string);
var f : TFsubstance;
  r : Tsubstance;
begin
  if Not FileExists(fname) then WriteLn('Файл '+fname+' не найден.')
  else begin
    WriteLn('содержимое файла '+fname);
    Assign(f, fname);
    Reset(f);
    while not eof(f) do begin
      Read(f, r);
      WriteLn('name=',r.name,' weight=',r.uweight:0:4,' spend=',r.spend);
    end;
    WriteLn('-----------------------');
    Close(f);
  end;
end;


procedure swap(var a,b: Tsubstance);
var v: Tsubstance;
begin
  v:=a;   a:=b;   b:=v
end;

procedure QuickSort(var A: TSubstanceArray; n: integer);
  procedure sort(l,r: integer);
  var
    i,j: integer;
    x: Tsubstance;
  begin
    i:=l; j:=r;
    x:=A[(l+r) div 2];
    repeat
      while A[i].uweight<x.uweight do Inc(i); // ищем первый элемент >= x
      while A[j].uweight>x.uweight do Dec(j); // ищем последний элемент <= x
      if i<=j then
      begin
        swap(A[i],A[j]);
        Inc(i);
        Dec(j);
      end;
    until i>j;
    if l<j then sort(l,j);
    if i<r then sort(i,r)
  end;

begin
  sort(1,n)
end;


procedure WriteArrayToFile(fname:string; A: TSubstanceArray; n: integer);
var i : integer;
  f : TFsubstance;
  r : Tsubstance;
begin
  Assign(f, fname);
  Rewrite(f);
  for i:=1 to n do Write(f, A[i]);
  Close(f);
  WriteLn('Файл ',fname,' успешно записан.');
end;



var
  fn1, fn2: string;
  sArray : TSubstanceArray;
  n : integer;
  
begin
  write('Введите имя исходного файла: ');
  readln(fn1);
  if Not FileExists(fn1) then CreateDemoFile(fn1);
  
  ReadFileToArray(fn1, sArray, n);
  
  WriteLn('Сортируем записи алгоритмом "Быстрая сортировка"');
  QuickSort(sArray, n);

  
  writeln('Введите имя результирующего файла: ');
  readln(fn2);

  WriteArrayToFile(fn2, sArray, n);
  
  PrintFile(fn2);

end.
погоняйте его хорошо, разберите.
будут вопросы - обращайтесь!

Последний раз редактировалось Serge_Bliznykov; 17.11.2016 в 14:20.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.11.2016, 19:40   #9
Лакира
Пользователь
 
Регистрация: 17.11.2016
Сообщений: 28
По умолчанию

Не очень понимаю как работают эти строки. Поясните,пожалуйста.


Код:
 if l<j then sort(l,j);
    if i<r then sort(i,r)
Лакира вне форума Ответить с цитированием
Старый 17.11.2016, 21:42   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Лакира Посмотреть сообщение
Не очень понимаю как работают эти строки. Поясните,пожалуйста.


Код:
 if l<j then sort(l,j);
    if i<r then sort(i,r)
это рекурсивный вызов процедуры с подмножеством - частью массива либо слева от значения, либо справа.

кратенько:
Цитата:
Сообщение от википедия
Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы со значением меньшим или равным опорному элементу, оказались слева от него, а все элементы, превышающие по значению опорный — справа от него. Обычный алгоритм операции:
Два индекса — l и r, приравниваются к минимальному и максимальному индексу разделяемого массива, соответственно.
Вычисляется значение опорного элемента m по одной из стратегий.
Индекс l последовательно увеличивается до тех пор, пока l-й элемент не окажется больше или равен опорному.
Индекс r последовательно уменьшается до тех пор, пока r-й элемент не окажется меньше или равен опорному.
Если r = l — найдена середина массива — операция разделения закончена, оба индекса указывают на опорный элемент.
Если l < r — найденную пару элементов нужно обменять местами и продолжить операцию разделения с тех значений l и r, которые были достигнуты. Следует учесть, что если какая-либо граница (l или r) дошла до опорного элемента, то при обмене значение m изменяется на r-й или l-й элемент соответственно, так же изменяется индекс опорного элемента и алгоритм продолжает своё выполнение.
Рекурсивно упорядочиваем подмассивы, лежащие слева и справа от опорного элемента.
подробнее:
Быстрая сортировка (algolist)


Быстрая сортировка (википедия)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
Задача в turboDelphi на записи,сортировка, создание нового массива , через процедуры. mg4577 Фриланс 1 30.01.2012 20:20
Быстрая сортировка массива по двум параметрам. С#. Necare Помощь студентам 2 14.09.2011 19:01
quickSort, Быстрая сортировка массива kzht91 Помощь студентам 1 17.04.2010 00:30
быстрая сортировка настолько быстрая Serg12 Помощь студентам 8 28.03.2010 21:31