Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2016, 22:21   #1
юля123321
Пользователь
 
Регистрация: 28.11.2016
Сообщений: 15
По умолчанию Почему не работают сортировки массива?

В сортировке пузырьком и в сортировке выбором: Program1.pas(69) : Ошибка времени выполнения: Индекс находился вне границ массива.
На всякий случай задание: Разработать диалоговую программную систему, позволяющую оценить время выполнения различных алгоритмов упорядочения числовых массивов. Алгоритмы сортировки оформить в виде подпрограмм.

Код:
program sravnenie;
const
  Nmax = 10000;
  Np = 10;
  Smax = 6;

type
  Tvector = array[1..Nmax] of word;
  Tstring = array[1..Smax] of string;
  Tindex = 1..Nmax;

const
  masstr: TString = ('input', 'bubble', 'insert', 'choice', 'output', 'exit');


function menu(s: TString; ns: word): word;
var
  i: word;
  k: word;
begin
  for i := 1 to ns do
    writeln(s[i]);
  writeln('Введите номер пункта');
  readln(k);
  result := k;
end;







procedure input(var a: Tvector; n: word);
var
  i: word;
  c, d, e: Tvector;
begin
  randomize;
  writeln('Введите количество элементов массива');
  readln(n);
  for i := 1 to n do
    a[i] := random(10000);
  writeln('unsort.arr.');
  for i := 1 to Np do
    write(a[i]:8);
  writeln;
  c[i] := a[i];
  d[i] := a[i];
  e[i] := a[i];
end;


procedure bubble(var c: Tvector; n: word);
var
  z: Tvector;
  flag: boolean;
  i, b: word;
  t1, t2, time_bubble: real;
begin
  t1 := Milliseconds;
  flag := true;
  while flag = true do
  begin
    flag := false;
    for i := 1 to n - 1 do
    begin
      if c[i] > c[i + 1] then
      begin
        flag := true;
        b := c[i];
        c[i] := c[i + 1];
        c[i + 1] := b;
      end;
    end;
  end;
  t2 := Milliseconds;
  time_bubble := t2 - t1;
  
  writeln('После сортировки пузырьком: ');
  
  for i := 1 to Np do
    write(c[i], ' ');
  writeln;    
  writeln('Время сортировки пузырьком: ', time_bubble, 'ms');
  z := c;
end;



procedure insert(var d: Tvector; n: word);
var
  i, R, k: word;
  z: Tvector;
  t3, t4, time_insert: real;
begin
  t3 := Milliseconds;
  for i := 2 to n do
    if d[i - 1] > d[i] then
    begin
      R := d[i];
      k := k - 1;
      while (k > 0) and (d[k] > R) do
      begin
        d[k + 1] := d[k];
        k := k - 1;
      end;
      d[k + 1] := R;
      t4 := Milliseconds;
      time_insert := t4 - t3;
    end;
  
  writeln('После сортировки вставками: ');
  
  for i := 1 to Np do
    write(d[i], ' ');
  writeln; 
  writeln('Время сортировки вставками: ', time_insert, 'ms');
  z := d;
end;



procedure choice(var e: Tvector; n: word);
var
  j, index: word;
  min, i: word;
  z: Tvector;
  t5, t6, time_choice: real;
begin
  t5 := Milliseconds;
  for i := 1 to n - 1 do
  begin
    min := e[i];
    for j := i to n do
      if e[j] < min then
      begin
        min := e[j];
        index := j;
      end;
    e[index] := e[i];
    e[i] := min;
  end;
  t6 := Milliseconds;
  time_choice := t6 - t5;
  
  
  writeln('После сортировки выбором: ');
  
  for i := 1 to Np do
    write(e[i], ' ');
  writeln; 
  writeln('Время сортироки выбором: ', time_choice, 'ms');
  z := e;
end;


procedure output(var a, z: Tvector; Table: word);
var
  i: word;
  time_choice, time_insert, time_bubble: real;
begin
  writeln('unsort_arr:');
  for i := 1 to Np do
    write(a[i]:8);
  writeln;
  
  begin
    writeln(z);
    writeln('Тип сортировки', '          ', 'Время работы');
    writeln(z, '           ', (time_bubble):10,  'ms');
    writeln(z, '           ', (time_insert):10,  'ms');
    writeln(z, '           ', (time_choice):10,  'ms');
  end;
  
  
  begin
    write('sort_arr:');
    for i := 1 to Np do
      write(z[i]:8);
    writeln; 
  end;
end;



var
  k, n, Table: word;
  a, c, d, e, z: TVector;

begin
  
  repeat
    k := menu(masstr, Smax);
    case k of
      1: input(a, n);
      2: bubble(c, n);
      3: insert(d, n);
      4: choice(e, n);
      5: output(a, z, Table);
      6: exit;
    end;
  until k = Smax;
  
end.

Последний раз редактировалось юля123321; 05.12.2016 в 22:45.
юля123321 вне форума Ответить с цитированием
Старый 05.12.2016, 22:45   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Цитата:
Сообщение от юля123321 Посмотреть сообщение
Program1.pas(69) : Ошибка
Предлагаете отсчитывать 69-ю строку, чтобы понять где именно ошибка? Если вам неохота, то другим тем более.
type_Oleg вне форума Ответить с цитированием
Старый 05.12.2016, 22:52   #3
юля123321
Пользователь
 
Регистрация: 28.11.2016
Сообщений: 15
По умолчанию

В procedure bubble

if c[i] > c[i + 1] then
юля123321 вне форума Ответить с цитированием
Старый 05.12.2016, 23:10   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

У вас при вызове этой bubble не определена переменная n. Скорее всего она =0. От этого и индексы 0 и 65535.
Надо наверное вставить волшебное слово var в заголовке
Код:
procedure input(var a: Tvector;var n: word);
чтобы эта input сохраняла введенное n

Последний раз редактировалось type_Oleg; 05.12.2016 в 23:18.
type_Oleg вне форума Ответить с цитированием
Старый 05.12.2016, 23:12   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,375
По умолчанию

Так, для понимания:
Код:
procedure input(var a: Tvector; n: word);
var
  i: word;
  c, d, e: Tvector;
begin
  randomize;
  writeln('Введите количество элементов массива');
  readln(n);
  for i := 1 to n do
    a[i] := random(10000);
  writeln('unsort.arr.');
  for i := 1 to Np do
    write(a[i]:8);
  writeln;
  c[i] := a[i];
  d[i] := a[i];
  e[i] := a[i];
end;
И почему вы думаете, что массивы c, d, e будут доступны в самой программе или в одной из используемых вами процедур?
Прочитайте о глобальных и локальных переменных.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.12.2016, 23:13   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от юля123321 Посмотреть сообщение
В procedure bubble
Код:
 if c[i] > c[i + 1] then
а при вызове procedure bubble чему равно n ?
ну и заодно. а массив С кто-нибудь перед процедурой заполнять должен или то, что там мусор Вас вполне себе устраивает?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему сортировки массива не работают? юля123321 Помощь студентам 0 04.12.2016 22:35
Почему в ассемблерной вставке не работают метки mseshuk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 18.10.2015 15:06
Почему не работают макросы на защищенном листе Робин Microsoft Office Excel 6 06.07.2012 13:44
2 задачи на массивы. почему не работают ??? (((( ProgFrog Microsoft Office Excel 3 21.05.2012 21:07
Почему не работают сессии? Яр|/||< (^_^) PHP 6 14.07.2010 12:36