Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
coL.froD`(A)
5 / 4 / 0
Регистрация: 20.02.2010
Сообщений: 93
1

Выполнить циклический сдвиг элементов массива влево так, чтобы минимальный элемент переместился на первое место

20.02.2010, 20:11. Просмотров 2878. Ответов 3
Метки нет (Все метки)

Дан массив целых чисел а1, ...., аn . Выполнить циклический сдвиг элементов массива влево так, чтобы минимальный элемент переместился на первое место.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
i:=1;
  while i<=n do
  begin
    a[i]:=strtoint(g1.Cells[i-1,0]);
    i:=i+1;
  end;
  nom:=1;
  min:=a[i];
  i:=1;
  while i<=n do
  begin
    if a[i]<min then
    i:=i+1;
  end;
  k:=1;
  while k<=nom-1 do
  begin
    temp:=a[1];
    i:=1;
    while i<=n-1 do
    begin
      a[i]:=a[i+1];
      i:=i+1;
    end;
    a[n]:=temp;
    k:=k+1;
  end;
  i:=1;
  while i<=n do
  begin
    g2.Cells[i-1,0]:=inttostr(a[i]);
    i:=i+1;
Какая ошибка в коде? Решить нужно с while в Visual Delphi
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2010, 20:11
Ответы с готовыми решениями:

Выполнить сдвиг элементов так, чтобы по горизонтали все элементы сдвигались влево на одну позицию
Дан массив из n (n=&lt;10) элементов, заполненный цифрами. Выполнить сдвиг элементов так, чтобы по...

Сдвиг элементов каждой строки матрицы так, чтобы максимальный элемент встал на первое место
Задана матрица размером NxM. Передвинуть циклическим сдвигом элементы каждой строки так, чтобы...

Выполнить циклический сдвиг элементов массива влево и вправо
Дан массив размера N и число k (0 &lt; k &lt; 5, k &lt; N). Осуществить циклический сдвиг элементов массива...

Выполнить кольцевой сдвиг элементов массива так чтобы его первый максимальный элемент оказался на k-том месте
Дан одномерный массив размерность n и число k. Если в исходном массиве чисел больше, чем k, то в...

Выполнить циклический сдвиг массива на К чисел влево
Добрый день форумчане. Такое во дело, дали условие : выполнить циклический сдвиг массива на к чисел...

3
Mawrat
12859 / 5763 / 1701
Регистрация: 19.09.2009
Сообщений: 8,807
22.02.2010, 01:27 2
Вот программа, выполняющая циклический сдвиг массива (влево и вправо). Величину сдвига представляет переменная Shift. Если Shift < 0 - сдвиг влево, Shift > 0 - сдвиг вправо. Т. е. в алгоритм нужно добавить код, выполняющий поиск индекса минимального элемента. Этот индекс следует поместить в переменную Shift и выполнить инверсию знака: Shift := -Shift (чтобы выполнить сдвиг именно влево). Остальные действия в программе уже реализованы.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    Label2: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  //Динамический массив.
  Arr     : array of Integer;
  //Величина сдвига.
  Shift   : Integer;
  //Переменные для индексации элементов массива.
  i, j    : Integer;
  //Строка для алгоритма распечатки.
  StrTmp  : String;
  //Ссылка на таблицу.
  Sg      : TStringGrid;
begin
 
  Sg := StringGrid1;
 
  //Распечатываем исходные данные:
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Массив до сдвига:');
  StrTmp := '';
  for i := 0 to Sg.ColCount - 1 do begin
    if StrTmp <> '' then begin
      StrTmp := StrTmp + Char(9);
    end;
    StrTmp := StrTmp + Sg.Cells[i, 0];
  end;
  Memo1.Lines.Add(StrTmp);
 
  //Читаем сведения о величине сдвига.
  Shift := StrToInt(Edit1.Text) mod Sg.ColCount;
 
  Memo1.Lines.Add('Сдвиг = ' + Edit1.Text);
 
  //Выделяем память для динамического массива.
  SetLength(Arr, Sg.ColCount);
 
  //Помещаем в массив результат сдвига.
 
  if Shift >= 0 then begin
    j := 0;
    for i := High(Arr) - (Shift - 1) to High(Arr) do begin
      Arr[j] := StrToInt(Sg.Cells[i, 0]);
      Inc(j);
    end;
 
    j := Shift;
    for i := 0 to High(Arr) - Shift do begin
      Arr[j] := StrToInt(Sg.Cells[i, 0]);
      Inc(j);
    end;
  end else begin
    Shift := -Shift;
 
    j := High(Arr) - (Shift - 1);
    for i := 0 to Shift - 1 do begin
      Arr[j] := StrToInt(Sg.Cells[i, 0]);
      Inc(j);
    end;
 
    j := 0;
    for i := Shift to High(Arr) do begin
      Arr[j] := StrToInt(Sg.Cells[i, 0]);
      Inc(j);
    end;
  end;
 
  //Переписываем значения из массива в таблицу.
  for i := 0 to High(Arr) do begin
    Sg.Cells[i, 0] := IntToStr(Arr[i]);
  end;
 
  //Распечатываем результат:
  Memo1.Lines.Add('Массив после сдвига:');
  StrTmp := '';
  for i := 0 to Sg.ColCount - 1 do begin
    if StrTmp <> '' then begin
      StrTmp := StrTmp + Char(9);
    end;
    StrTmp := StrTmp + Sg.Cells[i, 0];
  end;
  Memo1.Lines.Add(StrTmp);
 
  //Освобождаем память из под динамического массива.
  //В данном случае это делать не обязательно.
  //Finalize применять нужно в тех случаях, когда элементами
  //массива являются динамические переменные - другие
  //динамические массивы или строки.
  Finalize(Arr);
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Clear;
end;
 
end.
1
Вложения
Тип файла: rar ArrCycleShift.rar (191.7 Кб, 42 просмотров)
coL.froD`(A)
5 / 4 / 0
Регистрация: 20.02.2010
Сообщений: 93
23.02.2010, 13:10  [ТС] 3
Цитата Сообщение от Mawrat Посмотреть сообщение
Вот программа, выполняющая циклический сдвиг массива (влево и вправо). Величину сдвига представляет переменная Shift. Если Shift < 0 - сдвиг влево, Shift > 0 - сдвиг вправо. Т. е. в алгоритм нужно добавить код, выполняющий поиск индекса минимального элемента. Этот индекс следует поместить в переменную Shift и выполнить инверсию знака: Shift := -Shift (чтобы выполнить сдвиг именно влево). Остальные действия в программе уже реализованы.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    Label2: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  //Динамический массив.
  Arr     : array of Integer;
  //Величина сдвига.
  Shift   : Integer;
  //Переменные для индексации элементов массива.
  i, j    : Integer;
  //Строка для алгоритма распечатки.
  StrTmp  : String;
  //Ссылка на таблицу.
  Sg      : TStringGrid;
begin
 
  Sg := StringGrid1;
 
  //Распечатываем исходные данные:
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Массив до сдвига:');
  StrTmp := '';
  for i := 0 to Sg.ColCount - 1 do begin
    if StrTmp <> '' then begin
      StrTmp := StrTmp + Char(9);
    end;
    StrTmp := StrTmp + Sg.Cells[i, 0];
  end;
  Memo1.Lines.Add(StrTmp);
 
  //Читаем сведения о величине сдвига.
  Shift := StrToInt(Edit1.Text) mod Sg.ColCount;
 
  Memo1.Lines.Add('Сдвиг = ' + Edit1.Text);
 
  //Выделяем память для динамического массива.
  SetLength(Arr, Sg.ColCount);
 
  //Помещаем в массив результат сдвига.
 
  if Shift >= 0 then begin
    j := 0;
    for i := High(Arr) - (Shift - 1) to High(Arr) do begin
      Arr[j] := StrToInt(Sg.Cells[i, 0]);
      Inc(j);
    end;
 
    j := Shift;
    for i := 0 to High(Arr) - Shift do begin
      Arr[j] := StrToInt(Sg.Cells[i, 0]);
      Inc(j);
    end;
  end else begin
    Shift := -Shift;
 
    j := High(Arr) - (Shift - 1);
    for i := 0 to Shift - 1 do begin
      Arr[j] := StrToInt(Sg.Cells[i, 0]);
      Inc(j);
    end;
 
    j := 0;
    for i := Shift to High(Arr) do begin
      Arr[j] := StrToInt(Sg.Cells[i, 0]);
      Inc(j);
    end;
  end;
 
  //Переписываем значения из массива в таблицу.
  for i := 0 to High(Arr) do begin
    Sg.Cells[i, 0] := IntToStr(Arr[i]);
  end;
 
  //Распечатываем результат:
  Memo1.Lines.Add('Массив после сдвига:');
  StrTmp := '';
  for i := 0 to Sg.ColCount - 1 do begin
    if StrTmp <> '' then begin
      StrTmp := StrTmp + Char(9);
    end;
    StrTmp := StrTmp + Sg.Cells[i, 0];
  end;
  Memo1.Lines.Add(StrTmp);
 
  //Освобождаем память из под динамического массива.
  //В данном случае это делать не обязательно.
  //Finalize применять нужно в тех случаях, когда элементами
  //массива являются динамические переменные - другие
  //динамические массивы или строки.
  Finalize(Arr);
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Clear;
end;
 
end.
Большое спасибо, но мне нужно исправить мой код, а не новая программа.
Если кому не лень то помогите!!!
Заранее спасибо.
0
Mawrat
12859 / 5763 / 1701
Регистрация: 19.09.2009
Сообщений: 8,807
23.02.2010, 14:08 4
CoL.froD`[A], в твоём коде только поиск минимума надо подправить:
Delphi
1
2
3
4
5
6
7
8
9
10
...
  nom:=1;
  //min:=a[i]; //Эта переменная не нужна.
  i:=nom + 1;
  while i<=n do
  begin
    if a[i]<a[nom] then nom := i;
    i:=i+1;
  end;
...
Для проверки написал вариант близкий к твоему коду, но на основе дин. массивов:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
var
  Arr : array of Integer;
  TmpInt : Integer;
  i, IMin, j : Integer;
begin
  //Выделяем память для массива.
  SetLength(Arr, StringGrid1.ColCount);
  //Заполняем массив значениями из таблицы.
  i := 0;
  while i < Length(Arr) do begin
    Arr[i] := StrToInt( StringGrid1.Cells[i, 0] );
    i := i + 1;
  end;
  //Ищем индекс минимального элемента.
  IMin := 0;
  i := IMin + 1;
  while i < Length(Arr) do begin
    if Arr[i] < Arr[IMin] then begin
      IMin := i;
    end;
    i := i + 1;
  end;
  //Выполняем циклический сдвиг элементов массива на IMin позиций влево.
  //В этом случае минимальный элемент, расположенный на позиции IMin, окажется
  //на позиции 0 (ноль).
  //Циклический сдвиг элементов массива влево на IMin позиций спроектируем в виде
  //IMin сдвигов влево на 1 позицию.
  i := 0;
  while i < IMin do begin
    j := 0;
    TmpInt := Arr[0];
    while j < High(Arr) do begin
      Arr[j] := Arr[j + 1];
      j := j + 1;
    end;
    Arr[ High(Arr) ] := TmpInt;
    i := i + 1;
  end;
  //Переписываем получившийся в результате сдвига миссив в таблицу.
  StringGrid2.ColCount := StringGrid1.ColCount;
  i := 0;
  while i < Length(Arr) do begin
    StringGrid2.Cells[i, 0] := IntToStr( Arr[i] );
    i := i + 1;
  end;
 
  //Задача решена.
end;
1
23.02.2010, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2010, 14:08

Выполнить циклический сдвиг массива влево без первого элемента
Пожалуйста, помогите решить вот эту задачу. Заполнить массив из 10 элементов случайными числами...

Выполнить циклический сдвиг списка на N элементов вправо или влево
Помогите пожалуйста Организация:очередь Создать список из заданного количества элементов....

Выполнить циклический сдвиг всех элементов заданного двухмерного массива вправо на один элемент
Выполнить циклический сдвиг всех элементов заданного двухмерного массива вправо на один элемент....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru