powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Pascal: обработка массива
25 сообщений из 38, страница 1 из 2
Pascal: обработка массива
    #38237430
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Требуется в одномерном массиве, состоящем из n вещественных элементов, вычислить:
1) второй (по величине) минимальный положительный нечетный элемент и его позицию.

На первом проходе определяю минимальный элемент, а на втором уже определяю второй минимальный элемент и его позицию в массиве. Так вот, в первом проходе минимальный элемент нормально находится. А вот во втором значения переменным, содержащим информацию о самом элементе и его позиции, не присваиваются.
Не посмотрите, в чем ошибка? Спасибо!
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237432
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Одну минуту, что-то скриншот с текстом программы не прикрепляется, сейчас так набью.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237441
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Одну строчку исправил
Код: sql
1.
if (a[i] < pred) and (i <> imin) and (a[i] mod 2 > 0)  then begin pred := a[i]; i_pred := i; end;


Там переменная не на том месте стояла. Но это ничего не дало.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237446
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй проход, он такой же как и первый, только пропуская найденный минимальный элемент.
А в коде, есть разница:
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237449
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
черт, не то подчеркнул :)
нижняя красная линия слева, на одну строку выше :)
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237453
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexander4321
Код: sql
1.
...and (a[i] mod 2 > 0) 


а вот это зачем?
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237455
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это неопределенность в условии со словом "нечётный". ТС считает, что именно значение элемента должно быть нечётным. Да, и ещё я не обнаружил проверку на "положительность".
Впрочем, по сравнению с исходным нарушением постановки задачи "n вещественных элементов" <-> array of integer - вышеперечисленное выглядит семечками...
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237459
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S.G., там в задании было сказано, что нужно вычислить "второй (по величине) минимальный положительный нечетный элемент и его позицию".
Нечетный определяю
Код: sql
1.
a[i] mod 2 <> 0

, а т. к. нужен положительный, то оставляю просто
Код: sql
1.
a[i] mod 2 > 0
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237463
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S.G.,
Код я исправил
Код: sql
1.
if (a[i] < pred) and (i <> imin) and (a[i] mod 2 > 0)  then begin pred := a[i]; i_pred := i; end;


Но результат остался тем же.
А как можно пропустить найденный в первом проходе минимальный элемент?
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237469
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMА это неопределенность в условии со словом "нечётный". ТС считает, что именно значение элемента должно быть нечётным. Да, и ещё я не обнаружил проверку на "положительность".
Впрочем, по сравнению с исходным нарушением постановки задачи "n вещественных элементов" <-> array of integer - вышеперечисленное выглядит семечками...
Уже вижу, что не туда пошел, в том числе и с проверкой на положительность. Можете сказать, как во втором проходе пропустить найденный в первом проходе минимальный элемент?
Сейчас буду все переписывать. По поводу нечетного элемента... Не буду себе даже голову забивать, буду проверять на нечетность значение элемента.
Спасибо!
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237473
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, поскольку вам надо определить второй элемент по некоторому условию, то и первый элемент должен определяться сначала по тому же условию. То есть не просто минимальный, а первый минимальный положительный нечетный .
Во-вторых, если вы не хотите выносить поиск по массиву в отдельную процедуру (это я по поводу пропуска предыдущего элемента) - то при втором поиске в основное условие добавляется ещё и сравнение индексов (с первым найденным).
В-третьих, такая операция называется ранжированием. И я бы вам посоветовал сделать проще - сначала отсортировать массив...
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38237601
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку понятие "четное число" применимо только к целым числам, то видимо в задании имелось в виду, что четным должно быть не само число, а его номер в массиве.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239197
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM И я бы вам посоветовал сделать проще - сначала отсортировать массив...
Прикладываю скриншот сортировки массива. Согласен с MasterZiv, что за нечетный элемент правильно будет взять не само значение, а его номер в массиве.
Тогда в отсортированном массиве нужно будет проверить элементы с нечетными порядковыми номерами (пропустив первый нечетный) до тех пор, пока не будет выполнено, что он больше нуля. Кстати, во всех примерах кода Паскаль пишут
Код: sql
1.
... for i := 1 to n do ...

. Я до этого читал, что порядковые номера элементов в массивах начинаются с нуля, а не с единицы. Не подскажете, как начинать считать элементы? Спасибо!
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239292
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда вы делаете сортировку - вы перемещаете элементы в массиве на другие позиции... и что тогда считать "нечетной позицией" - нечетный номер в отсортированном массиве? нечетный номер исходной позиции?.. Так что не всё в порядке в королевстве датском

Если все же подойти строго, то алгоритм должен быть примерно таким:
- завести одномерный массив Arr: array [1..n] of real, заполнить его исходными данными
- завести одномерный массив с исходными номерами элементов ArrPos: array [1..n] of integer, заполнить его числами от 1 до N
- отсортировать данные в Arr[] по возрастанию, одновременно изменяя данные в массиве позиций ArrPos[]
- найти нужный элемент по условию:
-- двигаясь по Arr[] слева направо, находим первый положительный элемент, такой, что его номер в ArrPos[] нечетный
-- двигаясь дальше направо от найденного элемента в Arr[], находим такой элемент, что его номер в ArrPos[] тоже нечетный
Найденное значение и будет нужным нам...

Кстати, имеется много возможностей по оптимизации алгоритма, но всё зависит от исходных ограничений - на память, на быстродействие и т.п. Например, для "непосредственной работы" можно использовать массив структур; или список; можно условие наложить сразу - отобрать в отдельный массив только положительные значения с нечётных позиций исходного массива, и отсортировать уже его, получив ответ сразу; можно...
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239366
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю, когда со студенческими задачами испытывают проблемы студенты, но куда более странно, когда отвечающие.

AndreTMЕсли все же подойти строго, то алгоритм должен быть примерно таким:
- завести одномерный массив Arr: array [1..n] of real, заполнить его исходными данными
- завести одномерный массив с исходными номерами элементов ArrPos: array [1..n] of integer, заполнить его числами от 1 до N
А если хоть чуть-чуть применить голову, то

- не заводить никаких массивов
- игнорировать каждое второе введённое число
- в цикле ввода чисел заодно и определить искомый результат
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239397
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за схему сортировки. Честно говоря, чтобы выполнить все правильно, у меня уйдет слишком много времени (пока каждую процедуру поймешь, как писать).
Так как в задании все равно есть неопределенность, то этим и воспользуюсь: буду искать нечетное значение элемента больше нуля.
К выложенному выше скриншоту программы дописал код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
min := 1;
begin
        for i := n downto 1 do
        if arr[i] mod 2 <> 0 and arr[i] > 0 then
        begin min := arr[i]; i := min_pos;end;
end;
min_2 := 1;
begin
      for i := n downto 1 do
      if arr[i] mod 2 <> 0 then 
      begin min_2 := arr[i]; min_2_pos := i; end;
end;
write('Второй мин положительный элемент: ', min_2);
writeln;
write('Его позиция в массиве: ', min_2_pos);
end.


downto использую потому, что предполагаю, что при таком переборе массива, программа остановится на последнем найденном элементе. В данном случае самом левом. Но при нажатии Alt+ F9 выдает, что "Operate types do not match operator". Прилагаю скриншот. Причем, когда комментирую приведенный выше код, то ошибок не выдает.
Не подскажете, что не так с mod 2<> 0??? Спасибо!
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239438
Олдфаг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexander4321,

Код: pascal
1.
arr[i] mod 2 <> 0 -> (arr[i] mod 2) <> 0
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239474
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олдфагalexander4321,

Код: pascal
1.
arr[i] mod 2 <> 0 -> (arr[i] mod 2) <> 0


А можно целиком всю строку написать? У меня все равно выдает сообщение, что оператор не подходит операции.
Спасибо!
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239491
Олдфаг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexander4321А можно целиком всю строку написать? У меня все равно выдает сообщение, что оператор не подходит операции.


код целиком выложи, пока время есть посмотрю...
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239622
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
program bla_bla;
const n = 20;
var arr: array [1..n] of real;
     middle: real;{средний элемент}
     min, min_2, min_pos, min_2_pos: real;{мин и 2-й мин зл-ты и их позиции}
      temp: real; {буферная перем. для обмена 2-х знач. в массиве}
      sp: integer; {указатель на вершину стека}
      i, j: integer;
      stackl, stackr: array [1..n] of integer;{стеки границ фрагментов}
      left, right: integer; {границы сортируемого фрагмента}
begin
     writeln('Введите 20 элементов массива');
     for i := 1 to n do read(arr[i]);
     sp := 1; stackl[1] := 1; stackr[1] := n;
     while sp > 0 do begin
     {выборка границ фрагмента из стека}
     left := stackl[sp];
     right := stackr[sp];
     dec(sp);
     while left < right do begin
     {разделение фрагмента arr[left]..arr[right]:}
      i := left; j := right;
      middle := arr[(left + right) div 2];
      while i < j do begin
            while arr[i] < middle do inc(i);
            while middle < arr[j] do dec(j);
            if i <= j then begin
            temp := arr[i]; arr[i] := arr[j]; arr[j] := temp;
            inc(i); dec(j);
            end;
        end;
        if i < right then begin
        {запись в стек границ правой части фрагмента}
        inc(sp);
        stackl[sp] := i;
        stackr[sp] := right;
        end;
        right := j;
        {теперь left и right ограничивают левую часть}
        end;
end;
writeln('Упорядоченный массив: ');
for i := 1 to n do write(arr[i]:8:2);
writeln;readln;readln
{До этого был код из учебника и он выполняется. Далее то, что дописывал сам}
min := 1;
begin
      for i := n dowto 1 do
      if (arr[i] mod 2 <> 0) and (arr[i] > 0) then begin min := arr[i]; i := min_pos; end;
end;
min_2 := 1;
begin    
       for i := n to min do 
       if (arr[i] mod 2 <> 0) and (arr[i] > 0) then begin min_2 := arr[i]; min_2_pos := i; end;
write('Второй мин положительный элемент: ', min_2);
writeln;
write('Его позиция в массиве: ', min_2_pos);
end.


Вижу свою ошибку, что второй мин элемент будет равен просто минимальному (нужно будет сделать проверку, что позиции в массиве этих двух элементов не равны). Но до этого не могу еще добраться из-за ошибки.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239679
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexander4321, дарю. П.С. Написано в блокноте, не проверял. Копировать не обязательно, а вот идеи можете почерпнуть. Обратите внимание, что существует традиционная проблема со сравнением вещественных чисел на равенство, а также постановка задачи дырява в плане "что делать, если в массиве несколько одинаковых чисел", ну и нигде не специфицировано, индексируется ли массив с нуля или с единицы. Если препод умный, эти моменты стоит выделить в ответе - тот оценит вдумчивость к постановке. Если глупый, то обидится.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
program SecondItem;

var
  N, posMin, posSecond, err: integer;
  S: string[255];
  value, min, second: real;

begin
  WriteLn('Введите элементы массива, завершите ввод пустой строкой');
  N := 0;
  posMin = -1; 
  posSecond := -1;
  repeat
    ReadLn(S);
    if S = '' break;
    Val(S, value, err);
    if err > 0 then
    begin
      WriteLn('Неправильное число, повторите ввод!');
      continue;
    end;
    N := N + 1;
    if value <= 0.0 then continue;
    if N mod 2 = 0 then continue;
    if posMin < 0 then
      begin
        min = value;
        posMin = N;
      end
    else if value < min then
      begin
        second := min;
        posSecond := posMin;
        min := value;
        posMin := N;
      end
    else if (value > min) and ((posSecond < 0) or (value < second)) then
      begin
        second := value;
        posSecond := N;
      end;
  until false;
  if N < 2 then
    WriteLn('Введено слишком мало элементов!');
  else if posSecond < 0 then
    WriteLn('Нет элемента, соответствующего условиям задачи');
  else
    WriteLn('Второй по величине минимальный положительный нечётный элемент: ', second, ' находится в позиции #', posSecond);
end.

...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239694
Олдфаг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexander4321Вижу свою ошибку


Ошибок дохрена. Логику не смотрел вообще, довел до стадии успешной компиляцЫи и запуска. Тип элементов массива сменил на Integer.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
program Bla_bla;

const
  n = 20;

var
  arr: array [1..n] of Integer;
  middle: Integer;				{средний элемент}
  min, min_2, min_pos, min_2_pos: Integer;	{мин и 2-й мин зл-ты и их позиции}
  temp: Integer;					{буферная перем. для обмена 2-х знач. в массиве}
  sp: Integer;					{указатель на вершину стека}
  i, j: Integer;
  stackl, stackr: array [1..n] of Integer;		{стеки границ фрагментов}
  left, right: Integer;				{границы сортируемого фрагмента}

begin
  writeln('Введите 20 элементов массива');

  for i := 1 to n do
    read(arr[i]);

  sp := 1;
  stackl[1] := 1;
  stackr[1] := n;

  while sp > 0 do
    begin
      {выборка границ фрагмента из стека}

      left := stackl[sp];
      right := stackr[sp];

      dec(sp);

      while left < right do
        begin
          {разделение фрагмента arr[left]..arr[right]:}

          i := left;
          j := right;
          middle := arr[(left + right) div 2];

          while i < j do
            begin
              while arr[i] < middle do
                inc(i);

              while middle < arr[j] do
                dec(j);

              if i <= j then
                begin
                  temp := arr[i];
                  arr[i] := arr[j];
                  arr[j] := temp;

                  inc(i); dec(j);
                end;
            end;

            if i < right then
              begin
                {запись в стек границ правой части фрагмента}

                inc(sp);
                stackl[sp] := i;
                stackr[sp] := right;
              end;

            right := j;

            {теперь left и right ограничивают левую часть}
        end;
  end;

  writeln('Упорядоченный массив: ');

  for i := 1 to n do
     write(arr[i]:8);

  readln;

  {До этого был код из учебника и он выполняется. Далее то, что дописывал сам}

  min := 1;

  for i := n downto 1 do
    if (arr[i] mod 2 <> 0) and (arr[i] > 0) then
      begin
        min := arr[i];
        i := min_pos;
      end;


  min_2 := 1;


  for i := n to min do
    if (arr[i] mod 2 <> 0) and (arr[i] > 0) then
      begin
        min_2 := arr[i];
        min_2_pos := i;
      end;

  writeln('Второй мин положительный элемент: ', min_2);

  writeln('Его позиция в массиве: ', min_2_pos);
end.


...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239765
Олдфаг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нарыл на диске прогу от 2010 года. За каким хреном писал - не помню.

Сам проект.

TestApp


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
{$APPTYPE CONSOLE}

program TestApp;

uses
  uPoints, uMetricProcs, uMetricLessProcs, uSorting;

const
  cRand_max = 32767;
  cArraySize = 10000000;

type
  TLargeInteger = Int64;
  
function QueryPerformanceCounter(var ALargeInteger: TLargeInteger): Boolean;
  stdcall; external 'kernel32.dll' name 'QueryPerformanceCounter';

function QueryPerformanceFrequency(var ALargeInteger: TLargeInteger): Boolean;
  stdcall; external 'kernel32.dll' name 'QueryPerformanceFrequency';

function OldPointInit: TOldPoint;
begin
  with Result do
    begin
      fX := Random(cRand_max);
      fY := Random(cRand_max);
    end;
end;

function NewPointInit(const AOldPoint: TOldPoint): TNewPoint;
begin
  with Result do
    begin
      fX := AOldPoint.fX / cRand_max;
      fY := AOldPoint.fY / cRand_max;
    end;
end;

var
  iCount: Integer;
  
  fOldPoint: array of TOldPoint;
  fNewPoint: array of TNewPoint;

  perfBegin: TLargeInteger;
  perfRandomized: TLargeInteger;
  perfConverted: TLargeInteger;
  perfSorted: TLargeInteger;
  perfFreq: TLargeInteger;

begin
  Randomize;

  QueryPerformanceCounter(perfBegin);

  SetLength(fOldPoint, cArraySize);

  for iCount := Low(fOldPoint) to High(fOldPoint) do
    fOldPoint[iCount] := OldPointInit;

  QueryPerformanceCounter(perfRandomized);

  SetLength(fNewPoint, cArraySize);

  for iCount := Low(fNewPoint) to High(fNewPoint) do
    fNewPoint[iCount] := NewPointInit(fOldPoint[iCount]);

  QueryPerformanceCounter(perfConverted);

  QuickSort(fNewPoint, Low(fNewPoint), High(fNewPoint), MetricLess);

  QueryPerformanceCounter(perfSorted);

  QueryPerformanceFrequency(perfFreq);

  perfFreq := perfFreq div 1000;

  with fNewPoint[Low(fNewPoint)] do
    Writeln('Min: ', Metric(fNewPoint[Low(fNewPoint)]), ' [', fX, '; ', fY, ']');

  with fNewPoint[High(fNewPoint)] do
    Writeln('Max: ', Metric(fNewPoint[High(fNewPoint)]), ' [', fX, '; ', fY, ']');

  Writeln('Randomization: ', (perfRandomized - perfBegin) div perfFreq, ' ms');
  Writeln('Conversion:    ', (perfConverted - perfRandomized) div perfFreq, ' ms');
  Writeln('Sort:          ', (perfSorted - perfConverted) div perfFreq, ' ms');
  Writeln('Overall:       ', (perfSorted - perfBegin) div perfFreq, ' ms');

  Readln;
end.




Используемые модули. Конечно, можно было запихать все в один проект, но зачем-то разнес все по юнитам. То ли с dll хотел замутить, то ли еще чо-то, не помню уже :)

uPoints


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
unit uPoints;

interface

type
  TOldPoint = record
    fX, fY: Integer;
  end;

  TNewPoint = record
    fX, fY: Double;
  end;

implementation

initialization

finalization

end.




uMetricProcs


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
unit uMetricProcs;

interface

uses
  uPoints;

function Metric(const ANewPoint: TNewPoint): Double;

implementation

function Metric(const ANewPoint: TNewPoint): Double;
begin
  with ANewPoint do
    Result := fX * fX + fY * fY;
end;

initialization

finalization

end.




uMetricLessProcs


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
unit uMetricLessProcs;

interface

uses
  uPoints;

function MetricLess(const ALeftPart, ARightPart: TNewPoint): Boolean;

implementation

uses
  uMetricProcs;

function MetricLess(const ALeftPart, ARightPart: TNewPoint): Boolean;
begin
  Result := Metric(ALeftPart) < Metric(ARightPart);
end;

initialization

finalization

end.




uSorting


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
unit uSorting;

interface

uses
  uPoints, uMetricLessTypes;

procedure QuickSort(var ANewPoint: array of TNewPoint;
  const ALoPoint, AHiPoint: Integer; AMetricLess: TMetricLess);

implementation

procedure QuickSort(var ANewPoint: array of TNewPoint;
  const ALoPoint, AHiPoint: Integer; AMetricLess: TMetricLess);
var
  LoPoint: Integer;
  HiPoint: Integer;

  Middle: TNewPoint;
  Temp: TNewPoint;

begin
  LoPoint := ALoPoint;
  HiPoint := AHiPoint;

  Middle := ANewPoint[(LoPoint + HiPoint) div 2];

  repeat
    while AMetricLess(ANewPoint[LoPoint], Middle) do
      Inc(LoPoint);

    while AMetricLess(Middle, ANewPoint[HiPoint]) do
      Dec(HiPoint);

    if LoPoint <= HiPoint then
      begin
        Temp := ANewPoint[LoPoint];
        ANewPoint[LoPoint] := ANewPoint[HiPoint];
        ANewPoint[HiPoint] := Temp;
        Inc(LoPoint);
        Dec(HiPoint);
      end;

  until LoPoint > HiPoint;

  if HiPoint > ALoPoint then
    QuickSort(ANewPoint, ALoPoint, HiPoint, AMetricLess);

  if LoPoint < AHiPoint then
    QuickSort(ANewPoint, LoPoint, AHiPoint, AMetricLess);
end;

initialization

finalization

end.




До TJ7 не дотягивает, конечно, но что уж есть. Разбирайся, вопчем.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239800
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer, спасибо за код! Вечером дома посмотрю. Там в конце кода на else выдает Error in statement. Попробую поэкспериментировать, может какими-нибудь другими способами выведу сообщения.


Олдфаг, спасибо за помощь! Тоже вечерком посижу, покопаюсь. Один вопрос по исправленному тобой моему коду:
код компилируется, но в процессе выполнения программы выводятся результаты только по сортировке массива. Не выводится сообщение о втором минимальном элементе. Более того, программа зависает на черном окне, т. е. не могу выйти из черного окна опять к коду программы. Приходится закрывать и по новой открывать. Не сталкивался, чем это может быть вызвано?
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38239843
Олдфаг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexander4321softwarer, спасибо за код! Вечером дома посмотрю. Там в конце кода на else выдает Error in statement. Попробую поэкспериментировать, может какими-нибудь другими способами выведу сообщения.


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


Код: pascal
1.
i := min_pos; // ты меняешь счетчик внутри цЫкла. голимый баг.
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Pascal: обработка массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]