Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 710

/ вопрос открыт /

Здравствуйте!
Помогите пожалуйтса с написанием программы задание которого звучит следующим образом: "Упорядочить часть линейного массива между максимальным и минимальным элементом в порядке возрастания"

Erzhan_Zhanashovich Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Erzhan_Zhanashovich (статус: Посетитель)
Вопрос отправлен: 8 ноября 2010, 12:29
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Только в качестве зарядки для мозгов делал:

program p4710;
 
{$APPTYPE CONSOLE}
 
const
  N = 20;
 
type
  TMyArray = array[0..N - 1] of Integer;
 
// Заполнение массива случайными числами.
procedure RandomArray(var X: TMyArray);
var
  Index: Integer;
begin
  for Index:= 0 to N - 1 do
    X[Index]:= Random(100);
end;
 
// Вывод массива на экран.
procedure OutArray(const X: TMyArray);
var
  Index: Integer;
begin
  Write('  ');
  for Index:= 0 to N - 1 do
    Write(X[Index]: 3);
  WriteLn(#13#10);
end;
 
// Поиск минимального и максимального элементов массива.
// Функция возвращает True, если между этими индексами не менее 2 элементов.
function FindMinMax(const X: TMyArray; var MinIndex, MaxIndex: Integer): Boolean;
var
  Index, Min, Max: Integer;
begin
  MinIndex:= 0;
  MaxIndex:= 0;
  Min:=      X[0];
  Max:=      X[0];
 
  for Index:= 1 to N - 1 do
    begin
      if X[Index] < Min
        then begin
               Min:= X[Index];
               MinIndex:= Index;
             end;
 
      if X[Index] > Max
        then begin
               Max:= X[Index];
               MaxIndex:= Index;
             end;
    end;
 
  Result:= Abs(MinIndex - MaxIndex) > 2;
end;
 
// Перестановка двух элементов массива
procedure Exchange(var X: TMyArray; const Index1, Index2: Integer);
var
  Temp: Integer;
begin
  Temp:= X[Index1];
  X[Index1]:= X[Index2];
  X[Index2]:= Temp;
end;
 
// Сортировка массива по возрастанию начиная с элемента номер AFrom и до ATo.
procedure SortArray(var X: TMyArray; const AFrom, ATo: Integer);
var
  Index, j, Min, MinIndex: Integer;
begin
  for Index:= AFrom + 1 to ATo - 1 do
    begin
      MinIndex:= Index;
      Min:= X[Index];
 
      // Поиск минимального элемента среди элементов Index... ATo - 1
      for j:= Index + 1 to ATo - 1 do
        if X[j] < Min
          then begin
                 MinIndex:= j;
                 Min:= X[j];
               end;
 
      // Перестановка
      if MinIndex <> Index
        then Exchange(X, MinIndex, Index);
    end;
end;
 
 
var
  X: TMyArray;
  MinIndex, MaxIndex, AFrom, ATo, Total: Integer;
  Reason: Boolean;
 
begin
  Randomize();
  RandomArray(X);
  OutArray(X);
 
  Reason:= FindMinMax(X, MinIndex, MaxIndex);
  WriteLn('  Min: X[', MinIndex, '] = ', X[MinIndex]);
  WriteLn('  Max: X[', MaxIndex, '] = ', X[MaxIndex]);
 
  if Reason
    then begin
           if MinIndex < MaxIndex
             then begin
                    AFrom:= MinIndex;
                    ATo:= MaxIndex;
                  end
             else begin
                    AFrom:= MaxIndex;
                    ATo:= MinIndex;
                  end;
 
           Total:= ATo - AFrom - 1;
           SortArray(X, AFrom, ATo);
           WriteLn(#13#10'  Sorted array between X[', AFrom, '] = ', X[AFrom], ' and X[', ATo, '] = ', X[ATo], ' (Total:
', Total, '):');
           OutArray(X);
         end
    else WriteLn('  Nothing to sorting.');
 
  WriteLn(#13#10' Press ENTER to exit...');
  ReadLn;
end.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 9 ноября 2010, 09:17
Оценка за ответ: 5

Комментарий к оценке: Очень хорошая работа, но еще лучше было бы, если бы она была выполнена в форме....

Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 10 ноября 2010, 11:11; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 8 ноября 2010, 12:46 [#1]:

Что не получается? В чём проблема?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

8 ноября 2010, 12:52: Вопрос перемещён из тематического раздела Delphi » Прочее в раздел Лабораторный практикум » Delphi модератором Ерёмин А.А.

Erzhan_Zhanashovich

Erzhan_Zhanashovich (статус: Посетитель), 8 ноября 2010, 18:57 [#2]:

Короче, найти минимум и максимум получилось, а сортировку я не умею.... И если вас не затруднит, не могли бы вы написать программу полностью...
Егор

Егор (статус: 10-ый класс), 8 ноября 2010, 21:13 [#3]:

смотрим сюда
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
6ruse

6ruse (статус: 1-ый класс), 9 ноября 2010, 05:51 [#4]:

procedure Sorting(Down: boolean; var Data: Variant);
var
Skach, m, n: integer;
St: boolean;
Tmp: Variant;
begin
Skach := VarArrayHighBound(Data, 1) - 1;
while Skach > 0 do
begin
Skach := Skach div 2;
repeat
St := True;
for m := 0 to VarArrayHighBound(Data, 1) - 1 - Skach do
begin
n := m + Skach;
if (Down and (Data[n] < Data[m]))
or ((not Down) and (Data[n] > Data[m])) then
begin
Tmp := Data[m];
Data[m] := Data[n];
Data[n] := Tmp;
St := False;
end;
end;
until St;
end;
end;
// пример использования
procedure TForm1.SortingClick(Sender: TObject);
var
A: Variant;
i: integer;
begin
A := VarArrayCreate([0, Memo1.Lines.Count - 1], varVariant);
for i := 0 to Memo1.Lines.Count - 1 do
A[i] := Memo1.Lines.Strings[i];
Sorting(True, A);
for i := 0 to Memo1.Lines.Count - 1 do
Memo1.Lines.Strings[i] := A[i];
end;
min@y™

min@y™ (статус: Доктор наук), 9 ноября 2010, 13:07 [#5]:

Сделал из консольного приложение с формой.
Качай отсюдова и проверяй.
З.Ы. Где моя оценка за ответ?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 10 ноября 2010, 10:59 [#6]:

Цитата (Erzhan_Zhanashovich):

Комментарий к оценке: Очень хорошая работа, но еще лучше было бы, если бы она была выполнена в форме....

Так я уже сделал в форме. И залил в инет, и ссылку дал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Erzhan_Zhanashovich

Erzhan_Zhanashovich (статус: Посетитель), 10 ноября 2010, 11:07 [#7]:

В том-то и дело, что ссылка окрывается пустой....
Может ты мне просто на почту скинешь ее...) damansc@mail.ru
min@y™

min@y™ (статус: Доктор наук), 10 ноября 2010, 11:11 [#8]:

Цитата (Erzhan_Zhanashovich):

В том-то и дело, что ссылка окрывается пустой....

Неправда! Щас попробовал - всё качается!
А ты каким браузером пользуешься?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.03 сек.