Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 20000 рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2021, 17:23   #1
Quatrefoil
Новичок
Джуниор
 
Регистрация: 08.05.2021
Сообщений: 2
По умолчанию Определить количество перестановок и сравнений в сортировке прямого выбора

У меня есть программа, упорядочивающая массив, но я не знаю, как в ней подсчитать количество перестановок и сортировок
Код:
uses crt;
const Nmax=100;
label restart;
type MasType=array[1..Nmax] of integer;

procedure Swap(var a,b:integer);
var tmp:integer;
begin
 tmp:=a;
 a:=b;
 b:=tmp;
end;

function IndMin(mas:MasType; start:integer):integer;
var i,imin:integer;
begin
 imin:=start;
 for i:=start+1 to Nmax do
  if mas[i]<mas[imin] then imin:=i;
 IndMin:=imin;
end;

function Max(mas:MasType):integer;
var i,m:integer;
begin
 m:=mas[1];;
 for i:=2 to Nmax do
  if mas[i]>m then m:=mas[i];
  Max:=m;
end;

procedure Sort_Choice2(imas:MasType; var nmas:MasType);
var i,im:integer;
begin
 for i:=1 to Nmax do
 begin
  im:=IndMin(imas,1);
  nmas[i]:=imas[im];
  imas[im]:=Max(imas)+1;
 end;
end;

procedure Sort_Choice1(var mas:MasType);
var i:integer;
begin
 for i:=1 to Nmax-1 do
  Swap(mas[IndMin(mas,i)],mas[i]);
end;

procedure PrintArray(mas:MasType);
var i:integer;
begin
 for i:=1 to Nmax do write(mas[i]:4);
 writeln();
end;

{Основная программа}
var X,Y:MasType;
    num,i,sr,per,t:integer;
    q:char;
begin
  clrscr;
  randomize;
  for i:=1 to Nmax do
    begin
      X[i]:=random(100);
    end;
  writeln('Исходный массив:');
  PrintArray(X);
  restart:
  writeln('Выберите метод сортировки:');
  writeln('1 - метод прямого выбор (способ 1)');
  writeln('2 - метод прямого выбор (способ 2)');
  readln(num);
  writeln('Отсортированный массив:');
  case num of
   1: begin Sort_Choice1(X); PrintArray(X); end;
   2: begin Sort_Choice2(X,Y); PrintArray(Y); end;
  end;
  write('Завершить работу программы? (y/n)');
  readln(q);
  if (q='n') then goto restart
             else writeln('Программа завершена!');
end.
Quatrefoil вне форума Ответить с цитированием
Старый 09.05.2021, 01:46   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 6,176
По умолчанию

Проще всего завести 2 глобальные переменные (счетчики). В Swap увеличивать количество перестановок. Для сравнения завести свою функцию Compare и использовать её. В ней увеличивать количество сравнений. Не забывать обнулять глобальные счетчики перед вызовом сортировки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.05.2021, 10:04   #3
Alex314
Новичок
Джуниор
 
Регистрация: 14.04.2014
Сообщений: 3
По умолчанию

Мой бог, где-то еще пишут на Turbo Pascal? По коду видно, что он из прошлого века...
Alex314 вне форума Ответить с цитированием
Старый 09.05.2021, 13:36   #4
Quatrefoil
Новичок
Джуниор
 
Регистрация: 08.05.2021
Сообщений: 2
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Проще всего завести 2 глобальные переменные (счетчики). В Swap увеличивать количество перестановок. Для сравнения завести свою функцию Compare и использовать её. В ней увеличивать количество сравнений. Не забывать обнулять глобальные счетчики перед вызовом сортировки.
Как завести глобальные переменные?Как их обнулять потом?Как в функции увеличивать количество сравнений?
Quatrefoil вне форума Ответить с цитированием
Старый 09.05.2021, 16:03   #5
ViktorR
Участник клуба
 
Регистрация: 23.10.2010
Сообщений: 1,864
По умолчанию

1. Уберите метку restart. Использовать метки подобным образом - это плохо.
Тут можно вставить цикл While и добавить в ваше "меню" ещё одну строчку типа:
Код:
writeln('3 - завершить работу');
...
3: break;
...
2. Глобальные переменные опиши в разделе var, который размести сразу после раздела uses или type.
Операции с этими переменными ничем не отличаются от операций с локальными:
Код:
{Основная программа}
var X,Y:MasType;
    num,i,sr,per,t:integer;
    q:char;
begin
...
PS: Имена глобальных и локальных переменных (тех, которые ты описал для программы) не должны совпадать. Будет лучше, если они не будут совпадать и с локальными переменными твоих функций.
Почитай Т.А. Павловскую, Программирование на ЯВУ. Паскаль.
Электронная книжка была в списке литературы этого раздела.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посчитать количество сравнений и перестановок в сортировке бинарными вставками EDWIN503 Общие вопросы C/C++ 4 04.03.2017 13:16
C++, проблема, число перестановок > числа сравнений Evielle Помощь студентам 1 12.06.2012 14:26
Посчитать количество сравнений в сортировке Хоара(паскаль) semak Помощь студентам 0 24.11.2010 10:17
Кол-во перестановок и сравнений при сортировках Peek-a-boo Помощь студентам 0 04.11.2010 12:04
Процедура сортировки с подсчётом перестановок и сравнений (Паскаль) Паскалька^^ Помощь студентам 0 17.10.2010 22:35


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS