Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 20.01.2017
Сообщений: 10

Почему процедура быстрой сортировки не позволяет вставлять в нее другие процедуры

04.07.2017, 08:17. Показов 1548. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, скопировал программу из книги "песни о паскале". Попытался внести в нее изменения: в процедуру сортировки вставить внутрь цикла процедуру ShowArray по выводу на экран массива (чтобы наблюдать перестановку элементов массива в процессе сортировки). Но компилятор сообщает об ошибке "неизвестное имя ShowArray". Почему так?

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
{ P_43_2 QuickSort – Быстрая сортировка }
const
  CSize = 10;{ размер массива }
 
type
  TNumbers = array [1..CSize] of Integer;
 
var
  Arr: TNumbers;
{ Процедура быстрой сортировки }
procedure QuickSort(var arg: TNumbers; aL, aR: Integer);
var
  L, R: integer; { левый и правый индексы }
  M, T, n, k: Integer;{ среднее значение и временное хранилище }
begin
  { Начальные значения левого и правого индексов }
  L := aL; R := aR;
  { Вычисляем среднее по трём (порог для сравнения ) }
  M := (arg[L] + arg[(L + R) div 2] + arg[R]) div 3;
  repeat{ Цикл встречного движения }
    { Пока левый элемент меньше среднего,
    двигаем левый индекс вправо }
    while arg[L] < M do L := L + 1;
    { Пока правый элемент больше среднего,
    двигаем правый индекс влево }
    while arg[R] > M do R := R - 1;
      { После остановки сравниваем индексы }
    if L <= R then begin
      { Здесь индексы ещё не "встретились", поэтому,
      если левый элемент оказался больше правого,
      меняем их местами }
      if arg[L] > arg[R] then begin
        t := arg[L]; arg[L] := arg[R]; arg[R] := t;
      end;
      { Индексы «делают шаг» навстречу друг другу }
      L := L + 1; R := R - 1;
    end;
  until L > R; { пока индексы не "встретятся" }
  { если левая часть не отсортирована, то сортируем её }
  if R > aL then QuickSort(arg, aL, R);
  { если правая часть не отсортирована, то её тоже сортируем }
  if L < aR then QuickSort(arg, L, aR);
  { выход после сортировки обеих частей }
end;
{ Процедура распечатки массива, arg – строка сообщения }
procedure ShowArray(const arg: string);
var
  i: integer;
begin
  Writeln(arg);
  for i := 1 to CSize do Writeln(Arr[i]);
  Readln;
end;
 
var
  i: integer;
 
begin{--- Главная программа ---}
  { Заполняем массив случайными числами }
  for i := 1 to CSize do Arr[i] := 1 + Random(1000);
  ShowArray('До сортировки:');
  QuickSort(Arr, 1, CSize);
  ShowArray('После сортировки:');
end.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2017, 08:17
Ответы с готовыми решениями:

Процедуры и функции: Процедура быстрой сортировки элементов массива по убыванию
Составьте текст программы обработки одномерного массива (тип элементов массива выбирается в соответствии с вариантом), содержащий: 1)...

Процедура быстрой сортировки
Доброго времени суток. Нужна опять Ваша помощь, в принципе вопрос не сложный, но я никак не могу в нем разобраться. Итак, дан массив...

Процедура быстрой сортировки числового массива сортирует только первую часть
const Csize=10; type TNumbers=arrayof integer; var Arr:Tnumbers; procedure Quicksort (var arg:Tnumbers;aL,aR:integer); var...

3
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
04.07.2017, 10:36
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
{ P_43_2 QuickSort – Быстрая сортировка }
uses crt;
const
  CSize = 10;{ размер массива }
 
type
  TNumbers = array [1..CSize] of Integer;
 
var
  Arr: TNumbers;
  k:integer;
{ Процедура распечатки массива, k – номер прохода }
procedure ShowArray(k:integer);
var
  i: integer;
begin
  Writeln('Проход ',k);
  for i := 1 to CSize do Write(Arr[i]:4);
  Readln;
end;
{ Процедура быстрой сортировки }
procedure QuickSort(var arg: TNumbers; aL, aR: Integer);
var
  L, R: integer; { левый и правый индексы }
  M, t: Integer;{ среднее значение и временное хранилище }
begin
  { Начальные значения левого и правого индексов }
  L := aL; R := aR;
  { Вычисляем среднее по трём (порог для сравнения ) }
  M := (arg[L] + arg[(L + R) div 2] + arg[R]) div 3;
  repeat{ Цикл встречного движения }
    { Пока левый элемент меньше среднего,
    двигаем левый индекс вправо }
    while arg[L] < M do L := L + 1;
    { Пока правый элемент больше среднего,
    двигаем правый индекс влево }
    while arg[R] > M do R := R - 1;
      { После остановки сравниваем индексы }
    if L <= R then begin
      { Здесь индексы ещё не "встретились", поэтому,
      если левый элемент оказался больше правого,
      меняем их местами }
      if arg[L] > arg[R] then begin
        t := arg[L]; arg[L] := arg[R]; arg[R] := t;
      end;
      { Индексы «делают шаг» навстречу друг другу }
      L := L + 1; R := R - 1;
    end;
  until L > R; { пока индексы не "встретятся" }
  inc(k);
  ShowArray(k);
 { если левая часть не отсортирована, то сортируем её }
  if R > aL then QuickSort(arg, aL, R);
  { если правая часть не отсортирована, то её тоже сортируем }
  if L < aR then QuickSort(arg, L, aR);
  { выход после сортировки обеих частей }
 
end;
 
 
var
  i: integer;
 
begin{--- Главная программа ---}
{ Заполняем массив случайными числами }
writeln('Исходный массив');
for i := 1 to CSize do
 begin
  Arr[i] := 1 + Random(1000);
  write(Arr[i]:4);
 end;
writeln;
write('Для показа проходов нажимайте Enter');
readln;
QuickSort(Arr, 1, CSize);
writeln('Сортировка завершена');
end.
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
05.07.2017, 11:22
Лучший ответ Сообщение было отмечено climb99 как решение

Решение

Цитата Сообщение от climb99 Посмотреть сообщение
Почему так?
Во время комилирования кода, компилятор требует, чтобы всё, что используется было уже предопределено(т.е. указаны типы, описаны подпрограммы и т.п.). Иногда нужно, чтобы одна подпрограмма вызывала другую, ещё как бы не известную компилятору, в таких случаях используется дериктива forward, которая сообщает компилятору, что сама подпрограмма будет дальше.
Pascal
1
2
procedure ShowArray(const arg: string);forward;
procedure QuickSort(var arg: TNumbers; aL, aR: Integer);
Измените само описание таким образом, а саму процедуру можно не перемещать.
1
0 / 0 / 0
Регистрация: 20.01.2017
Сообщений: 10
06.07.2017, 02:00  [ТС]
всем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.07.2017, 02:00
Помогаю со студенческими работами здесь

Осознание быстрой сортировки. Почему при while можно писать i < j, а при if так нельзя?
/// &lt;summary&gt; /// Сортирует входную коллекцию по неубыванию с использованием указанного компаратора. ///...

Wordpress не позволяет ни записи вставлять, ни миниатюры
Джентльмены! (Не знаю, отн.вопрос к разделу РНР?) На каком-то этапе &quot;натягивания&quot; блога по видеоуроку на вордпресс он(вордпресс) на...

Разработайте рекурсивную процедуру сортировки последовательности методом быстрой сортировки Хоара
Помогите!!!! Дана последовательность чисел a1, a2, ... , an. Разработайте рекурсивную процедуру сортировки последовательности методом...

Пример быстрой сортировки массива строк и сортировки методом выбора
Добрый вечер. Скиньте пожалуйста пример быстрой сортировки массива строк и сортировки массива строк методом выбора. Очень срочно надо,...

Написать программу сортировки данных в массиве методом быстрой сортировки по возрастанию номеров маршрутов
Описать класс с именем Route, содержащий следующие поля: start (название начального пункта маршрута), end (название конечного пункта...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru