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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2009, 21:01   #1
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
Вопрос Сортировка-метод вставок

Приветик всем!

Вот мое задание
сортировка массивов - вставками:
1. создать исходный массив случайных целых чисел с заданным числом элементов
2. вывод исходного массива на экран
3. исходный массив должен обрабатываться с подсчетом и выводом фактического числа выполненных сравнений и пересылок. Все действия оформляются как подпрограммы.

Я практически все сделала, только не знаю как сделать третий пункт.

Подскажите пожалуста, как это сделать

Код:
program Project_Sort;

const
  max=10000;
type
  TMassivInt=array [1..max] of integer;
var
  massiv: TMassivInt;
  key: byte;
  x:integer;

{сгенерировать исходный массив}
Procedure Create(var massiv: TMassivInt; n:integer);
var
  i: integer;
begin
  writeln ('Sozdat massiv');
  write ('Zadat chislo elementov v massive: ');
  readln (n);
  Randomize;
  for i := 1 to n do massiv[i]:=random (100);{генерация массива случайных чисел}
  writeln ('sozdan!');
  writeln;
end;

{вывод}
Procedure Show(var massiv: TMassivInt; n:integer);
var
  i: integer;
begin
  writeln ('Prosmotr massiva');
  write ('Vvesti chislo elementov v massive: ');
  readln (n);
  write ('Prosmotr: ');
  for i := 1 to n do Write (massiv[i],' ');{вывод на экран}
  writeln;
  writeln;
end;

{сортировка метод: вставок }
procedure Sort(var massiv: TMassivInt; n:integer );
var
  i, j, temp:integer;
begin
  writeln ('Sortirovka massiva');
  write ('Vvesti chislo elementov v massive: ');
  readln (n);
  for i:=2 to n do
  begin
   temp:=massiv[i];
   j:=i-1;
    while (j>=1) and (massiv[j]>temp) do
     begin
      massiv[j+1]:=massiv[j];
      j:=j-1;
     end;
   massiv[j+1]:=temp;
  end;
end;

BEGIN
 Repeat
 Writeln ('===================');
 Writeln ('PROGRAM Sortirovka');
 Writeln ('===================');
 Writeln ('1: Sozdat massiv');
 Writeln ('2: Prosmotr massiva');
 Writeln ('3: Sortirovka massiva');
 Writeln ('0: Exit');
 Writeln ('===================');
 Write('Vibrat kommandu: ');
 Readln (key);
   case key of
    1: Create (massiv, x);
    2: Show (massiv, x);
    3: Sort (massiv, x);
   end;
 until key=0;
end.

Последний раз редактировалось diliana; 14.07.2009 в 17:34.
diliana вне форума Ответить с цитированием
Старый 14.07.2009, 09:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
с подсчетом и выводом фактического числа выполненных сравнений и пересылок.
Насколько я понял, тебе просто нужно подсчитывать сколько раз выполнится строка massiv[j+1]:=massiv[j];
Т.е. введи туда переменку:
Код:
var cnt:integer;
...
 while (j>=1) and (massiv[j]>temp) do
     begin
      massiv[j+1]:=massiv[j];
      inc(cnt);
      j:=j-1;
     end;
...
Write('фактическое число выполненных сравнений и пересылок',cnt);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 10:45   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Write('фактическое число выполненных сравнений и пересылок',cnt);
Количество сравнений и пересылок это не одно и тоже. Например в отсортированном в нужном направлении массиве из 10 элементов сравнений будет 9, а пересылок 0, в массиве отсортированном в обратном направлении сравнений тоже будет 9, а пересылок 63.
puporev вне форума Ответить с цитированием
Старый 14.07.2009, 10:46   #4
Anatole
Форумчанин
 
Аватар для Anatole
 
Регистрация: 07.04.2009
Сообщений: 245
По умолчанию

diliana Разрешите небольшой совет: Сделайте описание процедуры следующим образом:
Код:
Procedure Create(var massiv: TMassivInt; var n:integer);
Тогда привыходе из процедуры у вас сохранится значение количества введённых элементов в основной программе и отпадёт необходимость в каждой последующей процедуре его спрашивать заново.
Всякое безобразие должно быть единообразным. Тогда это называется порядком.
Anatole вне форума Ответить с цитированием
Старый 14.07.2009, 10:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
puporev
Лады. Тогда так:
Код:
  
Var Cnt,Cnt2:integer;
...
for i:=2 to n do
  begin
   temp:=massiv[i];
   j:=i-1;
   inc(cnt1);
    while (j>=1) and (massiv[j]>temp) do
     begin
      massiv[j+1]:=massiv[j];
      j:=j-1;
   inc(cnt2);
     end;
   massiv[j+1]:=temp;
  end;
...
Write('фактическое число выполненных сравнений ',cnt2,' и пересылок',cnt1);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 12:32   #6
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

puporev
Anatole
Stilet
спасибо вам за внимание и помощь

а вот так правильно?

Код:
{сортировка методом вставок}
procedure Sort(var massiv: TMassivInt; var n:integer );

Последний раз редактировалось diliana; 14.07.2009 в 17:33. Причина: удален неверный код
diliana вне форума Ответить с цитированием
Старый 14.07.2009, 13:37   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а вот так правильно?
Результат выдает правильный? Если да то танцуй
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 13:37   #8
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

Цитата:
а вот так правильно?
себе же отвечаю - нет неправильно!
diliana вне форума Ответить с цитированием
Старый 14.07.2009, 13:42   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Здесь
massiv[j+1]:=temp;
добавить
inc(pr);
Сравнения пишем 1 раз, когда идем по массиву, а присваивания 2 раза, пому что сначала присваиваем значение одному элементу другого, а потом наоборот.
puporev вне форума Ответить с цитированием
Старый 14.07.2009, 13:43   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот подкрутил:
Код:
program Project1;

uses
  Crt;

const
  max=10000;
type
  TMassivInt=array [1..max] of integer;
var
  massiv: TMassivInt;
  key: byte;
  x:integer;

{сгенерировать исходный массив}
Procedure Create(var massiv: TMassivInt; n:integer);
var
  i: integer;
begin
  //readln (n);
begin
  //readln (n);
  Randomize;
  for i := 1 to n do massiv[i]:=random (100);{генерация массива случайных чисел}
  writeln ('sozdan!');
  writeln;
end;

{вывод}
Procedure Show(var massiv: TMassivInt; n:integer);
var
  i: integer;
begin
  for i := 1 to n do Write (massiv[i],' ');{вывод на экран}
  writeln;
  writeln;
end;

{сортировка метод: вставок }
procedure Sort(var massiv: TMassivInt; n:integer );
var
  q,w,i, j, temp:integer;
begin  q:=0;w:=0;
  for i:=2 to n do
  begin     inc(q);
   temp:=massiv[i];
   j:=i-1;
    while (j>=1) and (massiv[j]>temp) do
     begin  inc(w);
      massiv[j+1]:=massiv[j];
      j:=j-1;
     end;
   massiv[j+1]:=temp;
  end;
  writeln;write('itterrations=',q,' whiles=',w);writeln;
end;

BEGIN
  x:=5;
    Create (massiv, x);
    Show (massiv, x);
    Sort (massiv, x);
    Show (massiv, x);
    readln;
end.
Увидела свои ошибки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08
Метод итераций и метод Зейделя prikolist Общие вопросы C/C++ 40 18.06.2009 17:40
Сортировка массива методом вставок Pascal bpystep Помощь студентам 5 22.04.2009 01:13
Помогите отсортировать массив методом бинарных вставок zhorzh2407 Помощь студентам 1 19.11.2008 17:19
Нужна помошь в реализации ассемблерных вставок!!! Cherpak Помощь студентам 1 02.06.2008 13:44