Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 01.07.2011
Сообщений: 24

Помогите найти и исправить ошибку

03.08.2011, 21:22. Показов 1107. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Прошу помощи. Есть программа с двумя методами сортировки: Шелла и слиянием. Сортировка Шелла работает нормально, а вот слиянием выдает вообще какую-то ерунду. Помогите пожалуйста найти ошибку.
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
109
Program Sort;
uses crt,graph;
const NN:array[1..10] of integer=(20,40,60,80,100,120,140,160,180,200);
type t=array[1..1000] of integer;
var
  aa:t;
  s,c:integer;
  n:integer;
  p:integer;
  u:integer;
  Driver,Mode,Error,i:integer;
  m,l,r,per:integer;
  st:string;
procedure Sort_Shell(var b:t;var m,c,p:integer); {Процедура сортировки Шелла}
var i,j,k,step,l,x:integer;
begin
 l:=m;
 step:=l div 2;
 while step>0 do
 begin
  for i:=1 to l-step do
   begin
    j:=i;
    while (j>=1) and (b[j]>b[j+step]) do
     begin
      inc(c);
      x:=b[j];
      b[j]:=b[j+step];
      b[j+step]:=x;
      dec(j);
     end;
    inc(p);
    end;
  step:=step div 2;
 end;
end;     {Конец процедуры сортировки Шелла}
Procedure sl(var a:t; p,q:integer);{Процедура, сливающая массивы}
 var r,i,j,k:integer;
     b:t;
  begin
   r:=(p+q) div 2;
   i:=p; j:=r+1;
    for k:=p to q do
    if (i<=r) and ((j>q) or (a[i]<a[j])) then
     begin
      inc(u);
      b[k]:=a[i];inc(i);
     end
     else
       begin
        b[k]:=a[j]; inc(j);inc(per);
       end;
     for k:=p to q do
     a[k]:=b[k];
  end;
Procedure sort_slij(var a:t; p,q:integer);
 begin
  if p<q then
   begin
    sort_slij(a,p,(p+q) div 2);
    sort_slij(a,(p+q) div 2+1,q);
    sl(a,p,q);
   end;
 end;
begin
clrscr;
randomize;
for i:=1 to 10 do
 begin
  n:=NN[i];
  writeln('Начальный массив при n= ',n);
  for s:=1 to n do
  begin
   aa[s]:=random(100);
   write(aa[s],' ');
  end;
 writeln;
readln;
end;
clrscr;
{Сортировка массива по методу Шелла}
 writeln('Сортировка массива по методу Шелла:');
 for i:=1 to 10 do
  begin
  n:=NN[i];
  Sort_Shell(aa,n,c,p);
  writeln('Отсортированный массив при n= ',n);
   for s:=1 to n do write(aa[s],' ');
    writeln;
    writeln('Количество сравнений равно ',p);
    writeln('Количество перестановок равно ',c);
    writeln;
    readln;
  end;
{Сортировка массива слиянием}
 writeln('Сортировка массива слиянием');
 for i:=1 to 10 do
  begin
  n:=NN[i]; 
  sort_slij(aa,1,n);
 writeln('Отсортированный массив при n= ',n);
  for s:=1 to n do write(aa[s],' ');
   writeln;
   writeln('Количество сравнений равно ',u);
   writeln('Количество перестановок равно ',per);
   writeln;
   readln;
  end;
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2011, 21:22
Ответы с готовыми решениями:

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

Помогите исправить ошибку
Всем привет!Вот возник вопрос есть программ которая считает сумму между первым и вторым отрицательным числом включительно пример 1 2 -4 6...

помогите, пожалуйста, исправить ошибку
Если задаётся строковая переменная &quot;столбик&quot;-выводить двадцать символов &quot;*&quot; в столбик, &quot;Строка&quot;-двадцать символов &quot;*&quot; в...

8
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
03.08.2011, 21:31
Вот нормальная сортировка слиянием, ищите у себя ошибки сами.
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
program SortSlian;
uses crt;
type mas=array[1..1000] of integer;
procedure Sliv(var a:mas;p,q : integer);
{процедура сливающая массивы, p-начало, q-конец}
var r,i,j,k : integer;
    b:mas;
begin
 r:=(p+q) div 2;{делим массив}
 i:=p;{начало левой половины}
 j:=r+1;{начало правой половины}
 for k:=p to q do{смотрим от начала до конца}
 if (i<=r) and ((j>q) or (a[i]<a[j])) then
 {переставляем элементы из половин в новый массив, упорядочивая пары}
  begin
   b[k]:=a[i];
   i:=i+1;
  end
 else
  begin
   b[k]:=a[j];
   j:=j+1;
  end ;
 for k:=p to q do
 a[k]:=b[k];
end;
{рекурсивная процедура сортировки, проверяет если осталось
меньше одного элемента, повторяет слияние в левой или правой частях массива}
procedure Sort(var a:mas;p,q : integer); {p,q - индексы начала и конца сортируемой части массива}
begin
 if p<q then {массив из одного элемента тривиально упорядочен}
 begin
  Sort(a,p,(p+q) div 2);{сортируем левую половину}
  Sort(a,(p+q) div 2 + 1,q);{правую половину}
  Sliv(a,p,q);{сливаем две половины}
 end;
end;
var a:mas;
    n,i:integer;
begin
 clrscr;
 randomize;
 write('Размер массива n=');
 readln(n); {Определение размера массива A - N) и его заполнение}
 writeln('Исходный массив:');
 for i:=1 to n do
  begin
   a[i]:=random(50);
   write(a[i],' ');
  end;
 writeln;
 writeln;
 {запуск сортирующей процедуры, сортируем от первого до последнего элемента}
 Sort(a,1,N);
 {Вывод отсортированного массива A}
 writeln('Результат сортировки:');
 for i:=1 to n do
 write(a[i],' ');
 readln
end.
0
0 / 0 / 0
Регистрация: 01.07.2011
Сообщений: 24
03.08.2011, 21:46  [ТС]
Уважаемый г-н Puporev!
Спасибо Вам за отклик.
Да, действительно, процедура работает когда переменной n присваиваю одно число (например 10, 20 и т.д.), но когда загоняю в цикл (for i:=1 to n do begin n:=NN[i]), начинает выводить вообще какие-то левые массивы. Прогоните у себя и увидите проблему. Прошу Вас - помогите разобраться, а то я уже голову сломал на этом задании. Заранее благодарен.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
03.08.2011, 21:50
Цитата Сообщение от Денис16 Посмотреть сообщение
for i:=1 to n do begin n:=NN[i]),
А это что за чудо такое? Введите еще 1 переменную и дальше оперируйте с ней
Pascal
1
2
3
4
5
for i:=1 to n do 
 begin
  k:==NN[i]);
  ............
 end;
А разбираться в Вашем коде совсем нет желания, просто лень.
0
0 / 0 / 0
Регистрация: 01.07.2011
Сообщений: 24
03.08.2011, 21:57  [ТС]
Извините, ошибся. Вот так у меня:
for i:= 1 to 10 do
begin
n:= NN[i];
sort_slij(aa,1,n);
.................
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
03.08.2011, 22:02
Я прогнал Вашу программу, никаких неточностей не увидел, все сортирует правильно.
0
0 / 0 / 0
Регистрация: 01.07.2011
Сообщений: 24
03.08.2011, 22:07  [ТС]
Обратите внимание, что выходной массив при сортировке слиянием получается далеко не тот, который формируется изначально.
0
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
03.08.2011, 23:05
используется один и тот-же массив ... читай личку
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
04.08.2011, 06:23
Чтобы было удобнее сравнивать лучше написать так.
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
Program Sort;
uses crt;
const NN:array[1..10] of integer=(20,40,60,80,100,120,140,160,180,200);
type t=array[1..1000] of integer;
var
  aa,bb:t;
  s,c:integer;
  n:integer;
  p:integer;
  u:integer;
  Driver,Mode,Error,i:integer;
  m,l,r,per:integer;
  st:string;
procedure Sort_Shell(var b:t;var m,c,p:integer); {Процедура сортировки Шелла}
var i,j,k,step,l,x:integer;
begin
 l:=m;
 step:=l div 2;
 while step>0 do
 begin
  for i:=1 to l-step do
   begin
    j:=i;
    while (j>=1) and (b[j]>b[j+step]) do
     begin
      inc(c);
      x:=b[j];
      b[j]:=b[j+step];
      b[j+step]:=x;
      dec(j);
     end;
    inc(p);
    end;
  step:=step div 2;
 end;
end;     {Конец процедуры сортировки Шелла}
Procedure sl(var a:t; p,q:integer);{Процедура, сливающая массивы}
 var r,i,j,k:integer;
     b:t;
  begin
   r:=(p+q) div 2;
   i:=p; j:=r+1;
    for k:=p to q do
    if (i<=r) and ((j>q) or (a[i]<a[j])) then
     begin
      inc(u);
      b[k]:=a[i];inc(i);
     end
     else
       begin
        b[k]:=a[j]; inc(j);inc(per);
       end;
     for k:=p to q do
     a[k]:=b[k];
  end;
Procedure sort_slij(var a:t; p,q:integer);
 begin
  if p<q then
   begin
    sort_slij(a,p,(p+q) div 2);
    sort_slij(a,(p+q) div 2+1,q);
    sl(a,p,q);
   end;
 end;
begin
clrscr;
randomize;
for i:=1 to 10 do
 begin
  n:=NN[i];
  writeln('Начальный массив при n= ',n);
  for s:=1 to n do
   begin
    aa[s]:=random(100);
    write(aa[s],' ');
   end;
 writeln;
 readln;
{Сортировка массива по методу Шелла}
 writeln('Сортировка массива по методу Шелла:');
 bb:=aa;
 Sort_Shell(bb,n,c,p);
 writeln('Отсортированный массив при n= ',n);
 for s:=1 to n do write(bb[s],' ');
 writeln;
 writeln('Количество сравнений равно ',p);
 writeln('Количество перестановок равно ',c);
 writeln;
 readln;
 {Сортировка массива слиянием}
 bb:=aa;
 writeln('Сортировка массива слиянием');
 sort_slij(bb,1,n);
 writeln('Отсортированный массив при n= ',n);
 for s:=1 to n do write(bb[s],' ');
 writeln;
 writeln('Количество сравнений равно ',u);
 writeln('Количество перестановок равно ',per);
 writeln;
 readln;
 end;
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2011, 06:23
Помогаю со студенческими работами здесь

Одномерный массив. помогите исправить ошибку
Задача: Сформировать одномерный массив размерности, заданной с клавиатуры, в котором каждый элемент с четным индексом будет заменен...

Помогите исправить ошибку в логическом выражении
Нельзя преобразовать тип real к boolean. Как исправить ошибку. until (y1 = 0) or (b - a) &lt; e(вот здесь выдает ошибку) program fun; ...

Помогите найти ошибку в программе и исправить ее
program laba5; uses wincrt; var t:string; w,max,i,n:byte; begin writeln('Vvodim stroku'); read(t); n:=length(t); w:=1; ...

Помогите пожалуйста найти ошибку и исправить.
помогите пожалоста найти ошибку и исправить!!!!!!!!! програма только умнажает последний столбец а остальние нет program Prg7; uses...

Помогите найти ошибку в программе и исправить её
Program Monte_Carlo; uses crt; var n,i,j,alfa:integer; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru