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

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

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

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
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
Ответы с готовыми решениями:

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

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

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

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

8
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
03.08.2011, 21:31 2
Вот нормальная сортировка слиянием, ищите у себя ошибки сами.
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  [ТС] 3
Уважаемый г-н Puporev!
Спасибо Вам за отклик.
Да, действительно, процедура работает когда переменной n присваиваю одно число (например 10, 20 и т.д.), но когда загоняю в цикл (for i:=1 to n do begin n:=NN[i]), начинает выводить вообще какие-то левые массивы. Прогоните у себя и увидите проблему. Прошу Вас - помогите разобраться, а то я уже голову сломал на этом задании. Заранее благодарен.
0
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
03.08.2011, 21:50 4
Цитата Сообщение от Денис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  [ТС] 5
Извините, ошибся. Вот так у меня:
for i:= 1 to 10 do
begin
n:= NN[i];
sort_slij(aa,1,n);
.................
0
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
03.08.2011, 22:02 6
Я прогнал Вашу программу, никаких неточностей не увидел, все сортирует правильно.
0
0 / 0 / 0
Регистрация: 01.07.2011
Сообщений: 24
03.08.2011, 22:07  [ТС] 7
Обратите внимание, что выходной массив при сортировке слиянием получается далеко не тот, который формируется изначально.
0
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
03.08.2011, 23:05 8
используется один и тот-же массив ... читай личку
0
Почетный модератор
64305 / 47602 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
04.08.2011, 06:23 9
Чтобы было удобнее сравнивать лучше написать так.
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
04.08.2011, 06:23
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 laba5; uses wincrt; var t:string; w,max,i,n:byte; begin writeln('Vvodim stroku');...

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

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

Помогите пожалуйста найти и исправить ошибку вывода и оператор "and"
Здравствуйте! Помогите пожалуйста найти и исправить ошибку вывода и оператор &quot;and&quot; !!! Не понимаю...

помогите исправить ошибку
uses crt; const epsilon=10; {$f+} type func=function(x:real):real; var z,y:real; function...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru