Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировака метод Шейкера, Непонятка в циклах и типах данных 
V
    Опции темы
Sanek123
Дата 25.4.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



В частности здесь:http://forum.vingrad.ru/topic-142859.html уже поднимался вопрос сортировки данных методом Шейкера, где топикстартер сам ответил на свой вопрос. Но у меня задача несколько иная:
Нужно сортировать не массив чисел, а массив слов (строк). Вобщем беру строку - парсю ее по пробелам, разбиваю на слова и каждое слово присваиваю каждому элементу массива. Потом сортирую... Все бы вроде ничего но помотрите если не трудно гдето в цикле парсинга косячок завелся и не печатает последний элемент массива, один символ в строке воспринимает вместе с пробелом перед ним.
И еще вопрос: закомментированные строчки должны работать но получатся несоответствие типов string и integer. Здесь задача состоит в размещении минимального элемента в начало, наибольшего в конец. Как можно решить сложившуюся проблему.
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;


var
  i,j,k,len,n,p,min,max : integer;
  S : string;
  A : array[0..100]of string;
begin
  S:='Raman was an Indian physicist 13 preeminent in molecular 555 spectroscopy and';
  len:=length(s);
  writeln(S);

i:=0;
j:=0;
k:=1;

{парсинг}

  for i:=0 to len do
  begin
    if S[i]=' ' then
      begin
      j:=j+1;
      A[j]:=Copy(S,k,i-k);
      k:=i+1;
      writeln(A[j]);
      end;
  end;


  for i:=0 to j do
  begin
  Writeln(A[i]);
  end;


{сортировка}
  for i:=1 to j-1 div 2 do
  begin
      if A[i]>A[i+1] then
      begin
      min:=i+1;
      max:=i;
      end
     else
      begin
      min:=i;
      max:=i+1;
      end;

  for j:=i+2 to j-i+1 do
  begin
    if A[j]>A[max] then
      max:=j
     else
    if A[j]<A[Min] then
      Min:=j;
  end;


{обмен элементов}
    //P:=A[i];
    A[i]:=A[min];
    //A[min]:=P;
    if max=i then
    max:=min;
    //P:=A[j-i+1];
    A[j-i+1]:=A[max];
    //A[max]:=P;

  end;

{печать}

  for i:=1 to j do
    begin
    writeln(A[i]);
    end;


  readln;

end.


--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
volvo877
Дата 25.4.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Sanek123, во-первых, насчет парсинга: такая модель, как у тебя работает, если последним символом строки будет проблем. Так что можешь добавить проблем и не париться... Если же хочется поизвращаться - то правим так:

Код
  for i:=1 to len do begin
    if (S[i]=' ') or (i = len) then begin { <--- Добавляем условие окончания строки }
      j:=j+1;
      A[j]:=Copy(S,k,i-k+byte(i = len)); { <--- И корректируем длину последнего слова }
      k:=i+1;
      writeln(A[j]);
    end;
  end;

+ обрати внимание, что у тебя массив строк описывается с индексами от 0, а заполняешь ты его - от 1-цы... Смысл какой?

Второе: чтобы программа работала с любыми типами данных, надо принять определенные меры:
Код

type
  T = string;
var
  // ...
  A : array[1..100] of T;
  p: T;
Теперь тебе достаточно изменить T на Integer, и программа будет сортировать целочисленный массив (если она сортирует правильно сейчас, естественно)

Третье: ты не боишься, что в процессе сортировки J (где, как тебе кажется, хранится число слов) изменяется, и печатать ты будешь бред, а не то, что нужно. Да и сама реализация сортировки не внушает доверия уже отсюда:

Цитата(Sanek123 @  25.4.2009,  14:13 Найти цитируемый пост)
Код

  for j:=i+2 to j-i+1 do
  begin
    if A[j]>A[max] then
      max:=j
     else
    if A[j]<A[Min] then
      Min:=j;
  end;
{обмен элементов}
    //P:=A[i];
    A[i]:=A[min];
    //A[min]:=P;
    if max=i then
    max:=min;
    //P:=A[j-i+1];
    A[j-i+1]:=A[max]; { <--- Стоп... Обращаешься к J ПОСЛЕ выхода из цикла по J ??? }
Не стОит этого делать, значение J может быть совсем не то, но которое ты рассчитываешь...

Исправляй...

Это сообщение отредактировал(а) volvo877 - 25.4.2009, 15:09
PM MAIL   Вверх
Sanek123
Дата 25.4.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Благодарю Вас, volvo877.
Появилось еще пару вопросов:
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  T = string;

var
  i,j,k,len,n,min,max : integer;
  S : string;
  A : array[1..100] of T;
  p: T;

begin

  //S:='highest distinctions in the examinations for';
  S:='56 12 45 78 61 15';
  len:=length(s);
  writeln(S);

i:=0;
j:=0;
k:=1;

  for i:=0 to len do
  begin
    if (S[i]=' ') or (i = len) then begin
      j:=j+1;
      A[j]:=Copy(S,k,i-k+byte(i = len));
      k:=i+1;
      end;
  end;

n:=j;
j:=0;
i:=0;

for i:=1 to n div 2 do
  begin
  if A[i]>A[i+1] then
  begin
    Min:=i+1;
    Max:=i;
  end
  else
  begin
    Min:=i;
    Max:=i+1;
  end;

  for j:=i+2 to n-i+1 do
  begin
  if A[j]>A[Max] then
    Max:=j
  else
  if A[j]<A[Min] then
    Min:=j;


    P:=A[i];
    A[i]:=A[min];
    A[min]:=P;
    if max=i then
    max:=min;
    P:=A[N-i+1];
    A[N-i+1]:=A[max];
    A[max]:=P;

  end;

  end;

writeln(#10);

  for i:=1 to j do
    begin
    write(A[i],' ');
    end;


  readln;

end.


если в строке 
Код

S:='56 12 45 78 61 15';
 будет не 6, а 7 и более чисел
Код

S:='56 12 45 78 61 15 95 23';

Отображаются только первые шесть.
И еще. Текст, я так понимаю сортируется по суммарному колличеству байт в слове (по ASCII), можно сделать типа по длине слова? 
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Sanek123
Дата 25.4.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Не дождался ответа - сделал сам ошибка заключалась в том что массив должен формироваться не с 0 а с 1, ну и еще несколько мелочей.
Рабочй код - мож кому пригодиться.
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  T = string;

var
  i,j,k,len,n,min,max : integer;
  S : string;
  A : array[1..1000] of T;
  p: T;

begin

  S:='ais cool beer soft hard deep trend loock boss var kolt spirt ficha fuck fox';
  len:=length(s);
  writeln(S);

i:=0;
j:=0;
k:=1;

  for i:=1 to len do
  begin
    if (S[i]=' ') or (i = len) then begin
      j:=j+1;
      A[j]:=Copy(S,k,i-k+byte(i = len));
      k:=i+1;
      end;
  end;

n:=j;
j:=0;
i:=0;

for i:=1 to (n div 2) do
  begin
  if A[i]>A[i+1] then
  begin
    Min:=i+1;
    Max:=i;
  end
  else
  begin
    Min:=i;
    Max:=i+1;
  end;

  for j:=i+2 to n-i+1 do
  begin
  if A[j]>A[Max] then
    Max:=j
  else
  if A[j]<A[Min] then
    Min:=j;


    P:=A[i];
    A[i]:=A[min];
    A[min]:=P;
    if max=i then
    max:=min;
    P:=A[N-i+1];
    A[N-i+1]:=A[max];
    A[max]:=P;

  end;

  end;

writeln(#10);

  for i:=1 to n do
    begin
    write(A[i],' ');
    end;

  readln;

end.


Это сообщение отредактировал(а) Sanek123 - 25.4.2009, 20:16
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.