Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 08.02.2013
Сообщений: 26
1

Сортировка массива с использованием указателей.

28.09.2013, 16:52. Показов 3176. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, господа и дамы.
Есть у меня следующая программа:

Кликните здесь для просмотра всего текста
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
TYPE
  RealPtr = ^REAL;
FUNCTION MaxArray(p: RealPtr; n: WORD; VAR adr: RealPtr): REAL;
VAR
  max: REAL;
  i: WORD;
BEGIN
  max := p^;
  adr := p;
  FOR i := 2 TO n DO
    BEGIN
      Inc(p);
      IF p^ > max THEN
      max := p^;
    END;
  MaxArray := max;
END;
 
 
{MAIN PRO}
VAR
  a: ARRAY[1..4] OF REAL;
  maxi: REAL;
  adr: RealPtr;
BEGIN
  a[1] := 2.5; a[2] := -5.5; a[3] := -3.5; a[4] := 4.5;
  maxi:= MaxArray(@a, 5, adr);
  WriteLn(maxi:10:2, adr^:18:2);
END.


Как вы уже поняли, она находит максимальный элемент массива и указывает его адрес.
Так вот, к этой программе необходимо пришпилить еще самую простую сортировку элементов массива. Пытался это осуществить через написание дополнительной процедуры сортировки, но запутался в край. В процедуре по сортировке, также нужны 2 указателя(проходим эту тему), один будет указывать на расположение, другой..хм...другой. Дело в том, что я еще забыл зачем нужен другой ) Мне бы кусочек правильно написанной процедуры с указателями, вот. И чтоб не слишком замудренно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2013, 16:52
Ответы с готовыми решениями:

Сортировка динамического массива методом выбора с использованием указателей
Помогите пожалуйста! Нужно сделать сортировку одномерного динамического массива размерностью N...

Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива
//Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива...

Сортировка масива с использованием указателей
Здраствуйте, я не могу розобраться з сортировкой массива через указатели. У меня вроде он...

Быстрая» сортировка (разделением) с использованием указателей
У меня не принимают работу, так как говорят, что не по заданию. В чем ошибка? #include...

3
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
28.09.2013, 21:01 2
В функции MaxArray() много лишних параметров. Предлагаю сделать так:
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
program Project1;
 
type
  TData = Double;
  TPData = ^TData;
 
{Поиск первого наибольшего элемента в массиве и возвращение указателя на него.
Так как параметр aArr отмечен спецификатором var, то в процедуру будет передан
указатель на объект aArr, а не сам объект aArr. Это называется - передача
параметра по ссылке.
Параметр aArr объявлен, как параметр типа "открытый массив". Через такой
параметр в процедуру можно передавать массивы разных размеров. При этом,
в теле процедуры индексация элементов открытого массива всегда начинается
от нуля: Low(aArr) = 0 - не зависимо от того, как определён диапазон индексов
в вызывающем коде.
Верхний индекс aArr определяется обычным образом через вызов High(aArr).
Нижний индекс Low(aArr), как уже говорилось, для открытого массива
всегда равен нулю.}
function FirstPMax(var aArr : array of TData) : TPData;
var
  PCur, PMax : TPData;
  i : Integer;
begin
  PMax := @aArr;
  PCur := PMax;
  for i := 0 + 1 to High(aArr) do begin
    Inc(PCur);
    if PCur^ > PMax^ then PMax := PCur;
  end;
  FirstPMax := PMax;
end;
 
{Сортировка массива методом пузырька по возрастанию.}
procedure SortAsc(var aArr : array of TData);
var
  PStart, PEnd, PCur, PNext : TPData;
  Data : TData;
begin
  PStart := @aArr;           {Указатель на первый элемент массива.}
  PEnd := @aArr[High(aArr)]; {Указатель на последний элемент массива.}
  while PStart <> PEnd do begin
    PCur := PStart; {Указатель на текущий элемент.}
    PNext := PCur;
    Inc(PNext);     {PNext - указатель на следующий элемент.}
    while PCur <> PEnd do begin
      if PCur^ > PNext^ then begin
        Data := PCur^;
        PCur^ := PNext^;
        PNext^ := Data;
      end;
      {Получаем указатели на следующую пару элементов.}
      Inc(PCur);
      Inc(PNext);
    end;
    Dec(PEnd); {Неотсортированная часть массива уменьшилась на 1 элемент.}
  end;
end;
 
const
  M = 8; {Количество элементов в массиве.}
var
  Arr : array[1..M] of TData;
  PMax : TPData;
  i : Integer;
  S : String;
begin
  repeat
    {Заполняем массив случайными целыми числами и выполняем распечатку.}
    Writeln('Исходный массив:');
    Randomize;
    for i := 1 to High(Arr) do begin
      Arr[i] := Random * 10; {0..9}
      if i > 1 then Write(#9);
      Write(Arr[i]:0:3);
    end;
    Writeln;
 
    {Поиск первого наибольшего элемента.}
    PMax := FirstPMax(Arr);
    Writeln('Первый наибольший элемент: ', PMax^:0:3, ', адрес: ', Longint(PMax));
 
    {Сортировка по возрастанию.}
    SortAsc(Arr);
    Writeln('Массив после сортировки по возрастанию:');
    for i := 1 to High(Arr) do begin
      if i > 1 then Write(#9);
      Write(Arr[i]:0:3);
    end;
    Writeln;
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
1
1 / 1 / 0
Регистрация: 08.02.2013
Сообщений: 26
29.09.2013, 20:23  [ТС] 3
Маврат, спасибо, конечно, но это слишком круто для меня. Функция одобрена и подправлено лично преподавателем, поэтому я не хочу ее менять. Мне именно к этой программе нужна процедура.

Но эту прогу я тоже сохраню, спасибо.
---
Вопрос все еще актуален.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
29.09.2013, 21:02 4
Т. е., нужна функция сортировки массива, но без использования указателей?

Добавлено через 6 минут
В первоначальной функции поиска наибольшего можно немного изменить код. Там нет смысла копировать из массива значения в переменную max. Достаточно иметь указатель на текущий наибольший элемент.
Изменить можно так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
FUNCTION MaxArray(p: RealPtr; n: WORD; VAR adr: RealPtr): REAL;
VAR
  i: WORD;
BEGIN
  adr := p;
  FOR i := 2 TO n DO
    BEGIN
      Inc(p);
      IF p^ > adr^ THEN
        adr := p;
    END;
  MaxArray := adr^;
END;
0
29.09.2013, 21:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2013, 21:02
Помогаю со студенческими работами здесь

Простая сортировка выбором с использованием указателей
Всем доброго времени суток! Прошу участников форума подсказать как доработать программу, чтобы ее...

Сортировка с использованием указателей на поле структуры
Доброго времени суток! На данный момент пишу работу и никак не могу понять как работать с...

Быстрая» сортировка (разделением) с использованием указателей
У меня не принимают работу, так как говорят, что не по заданию. В чем ошибка? #include &quot;stdafx.h&quot;...

Заполнение массива с использованием указателей
Необходимо заполлнить массив a с использовнием ничего не возвращающей функии и указателей. Однако...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru