Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
7 / 7 / 0
Регистрация: 02.12.2009
Сообщений: 102
1

Найти номера первого и последнего минимального элемента из данного набора

03.07.2011, 00:22. Просмотров 1697. Ответов 11
Метки нет (Все метки)

Дано целое число N и набор из N целых чисел. Нужно в Delphi, найти номера первого и последнего минимального элемента из данного набора и вывести их в указанном порядке.

Данная программа есть на языке Pascal

Pascal
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
uses crt;
var n,i,a,mn,i1,ip:integer;
begin
clrscr;
repeat
write('Количество элементов в наборе n>0 n=');
readln(n);
until n>0;
writeln('Введите ',n,' целых чисел:');
readln(mn);
i1:=1;
ip:=1;
for i:=2 to n do
 begin
  readln(a);
  if a<mn then
   begin
    mn:=a;
    i1:=i;
   end
  else if a=mn then ip:=i;
 end;
writeln('Минимум=',mn);
writeln('Номер первого=',i1);
if ip=1 then write('В массиве 1 минимальный')
else write('номер последнего=',ip);
readln
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons, Grids;
type
  TForm1 = class(TForm)
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    lbl4: TLabel;
    edt1: TEdit;
    lbl6: TLabel;
    lbl7: TLabel;
    pnl2: TPanel;
    pnl3: TPanel;
    pnl4: TPanel;
    btn1: TBitBtn;
    btn2: TBitBtn;
    StringGrid1: TStringGrid;
    btn3: TBitBtn;
    procedure btn1Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  a:array of Integer; //ãëîáàëüíûå ïåðåìåííûå äèíàìè÷åñêèé ìàññèâ
  n:Integer;//è åãî ðàçìåð
 
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
 
begin
repeat
n:=StrToInt(edt1.text);
until n>0;
 
StringGrid1.ColCount:=n;
StringGrid1.RowCount:=1;
 
StringGrid1.Options:=StringGrid1.Options+[goEditing];
Setlength(a,n);
end;
 
procedure TForm1.btn3Click(Sender: TObject);
var n,i,mn,i1,ip:integer;
begin
i1:=1;
ip:=1;
for i:=2 to n do
 begin
 a[i]:=StrToInt(StringGrid1.Cells[i,0]);
  if a<mn then //где и как вводить mn?
  //(блин, тут же ещё одновременно типы array & integer..)
   begin
    mn:=a;
    i1:=i;
   end
  else if a=mn then ip:=i;
 end;
pnl2.Caption:=IntToStr(mn);
pnl3.Caption:=IntToStr(i1);
if ip=1 then pnl4.Caption:='В массиве 1 минимальный' else pnl4.Caption:='Номер последнего = '+IntTostr(ip);
 
end;
 
end.
0
Вложения
Тип файла: rar minmax8.rar (172.0 Кб, 22 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2011, 00:22
Ответы с готовыми решениями:

Дано целое число N и набор из N целых чисел. Найти номера первого и последнего минимального элемента из данного набора
Дано целое число N и набор из N целых чисел. Найти номера первого и последнего минимального...

Найти номера первого и последнего минимального элемента из данного набора
#include &lt;stdio.h&gt; int main(void) { int i,n,ni,minn1,minn2,min1,min2; printf(&quot;N:&quot;); ...

Найти номера первого минимального и последнего максимального элемента из данного набора
Мальчики и девушки, помогите пожалуйста решить задачку на С++.... Дано целое число N и набор из N...

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

11
13058 / 5844 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
03.07.2011, 00:40 2
Можно решать так:
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
procedure TForm1.Button1Click(Sender: TObject);
const
  M = 15;
var
  Arr : array[1..M] of Integer;
  i, IMin1, IMin2 : Integer;
begin
  //Заполнение массива.
  //...
  //...
  //...
 
  //Решение задачи.
  IMin1 := 1;
  IMin2 := 0;
  for i := 2 to M do begin
    if Arr[i] < Arr[IMin1] then begin
      IMin1 := i;
      IMin2 := 0;
    end else if Arr[i] = Arr[IMin1] then begin
      IMin2 := i;
    end;
  end;
 
  if IMin2 = 0 then begin
    Memo1.Lines.Add('В массиве только один минимальный элемент. Его индекс: ' + IntToStr(IMin1));
  end else begin
    Memo1.Lines.Add('Индекс первого минимального элемента: ' + IntToStr(IMin1));
    Memo1.Lines.Add('Индекс последнего минимального элемента: ' + IntToStr(IMin2));
  end;
end;
Можно в код добавить ввод количества значащих элементов массива - N. N можно вводить через Edit. И заполнение массива надо добавить.
1
7 / 7 / 0
Регистрация: 02.12.2009
Сообщений: 102
03.07.2011, 00:51  [ТС] 3
Цитата Сообщение от Mawrat Посмотреть сообщение
//Заполнение массива.
//...
//...
//...
Как заполнить массив? Или он был таким образом (строками выше) заполнен?


Цитата Сообщение от Mawrat Посмотреть сообщение
Можно в код добавить ввод количества значащих элементов массива - N. N можно вводить через Edit.
Т.е. через M, мы задаем размер массива, (например после 16 строки)?
А где и как ввести в массив набор из N целых чисел?
0
13058 / 5844 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
03.07.2011, 01:42 4
Можно сделать так:
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
procedure TForm1.Button1Click(Sender: TObject);
const
  M = 15;
var
  Arr : array[1..M] of Integer;
  i, j, IMin1, IMin2 : Integer;
  S : String;
begin
  //Очистка Мемо2.
  Memo2.Clear;
 
  //Заполнение массива из Мемо1.
  j := 0;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    if Memo1.Lines[i] <> '' then begin
      Inc(j);
      Arr[j] := StrToInt(Memo1.Lines[i]);
    end;
    if j = M then begin
      ShowMessage('Достигнута граница массива: ' + IntToStr(M) + ' элементов.');
      Break;
    end;
  end;
 
  if j < M then begin
    ShowMessage(
      'Значения недостающих элементов массива в количестве: ' + IntToStr(M - j)
      + ' заданы случайным образом.'
    );
    Randomize;
    for i := j + 1 to M do begin
      Arr[i] := Random(21); //0..20.
    end;
  end;
 
  //Распечатка исходного массива.
  Memo2.Lines.Add('Исходный массив:');
  S := '';
  for i := 1 to M do begin
    if S <> '' then S := S + ', ';
    S := S + IntToStr(Arr[i]);
  end;
  Memo2.Lines.Add(S);
 
  //Решение задачи.
  IMin1 := 1;
  IMin2 := 0;
  for i := 2 to M do begin
    if Arr[i] < Arr[IMin1] then begin
      IMin1 := i;
      IMin2 := 0;
    end else if Arr[i] = Arr[IMin1] then begin
      IMin2 := i;
    end;
  end;
 
  //Ответ распечатываем в Мемо2.
  if IMin2 = 0 then begin
    Memo2.Lines.Add('В массиве только один минимальный элемент. Его индекс: ' + IntToStr(IMin1));
  end else begin
    Memo2.Lines.Add('Индекс первого минимального элемента: ' + IntToStr(IMin1));
    Memo2.Lines.Add('Индекс последнего минимального элемента: ' + IntToStr(IMin2));
  end;
end;
В Мемо1 вводятся элементы массива - каждый элемент на отдельной строке. Если какие-то строки в Мемо1 оказываются пустыми - они пропускаются при заполнении массива. Если в Мемо1 задано меньше элементов, чем может поместиться в массив, то значения оставшихся элементов задаются случайным образом с помощью вызова функции Random(). Если элементов в Мемо1 введено больше, чем размер массива, тогда в массив будет записано столько элементов, сколько поместится. При этом будет выведено соответствующее сообщение.
Исходный массив и результаты решения задачи выводятся в Мемо2.
1
7 / 7 / 0
Регистрация: 02.12.2009
Сообщений: 102
03.07.2011, 02:27  [ТС] 5
Mawrat, все ввел в делфи, расставил все панели, спасибо вам большое, программа класс.
Многое для себя узнал.

---
Mawrat: Пожалуйста.


Добавлено через 14 минут
Mawrat, наверное не получится сделать так, что бы можно было вводить размер массива M?
Т.е. я убираю const M = 15; Присваиваю тип для M:integer; Вывожу на кнопку M:=StrToInt(edt1.text); но делфи ругается на данную строчку Arr : array[1..M] of Integer; Только я вот не пойму почему так происходит.. Хотя может быть это нельзя сделать, т.к. далее везде M считывается везде как константа..
0
28 / 28 / 5
Регистрация: 29.06.2011
Сообщений: 61
03.07.2011, 02:37 6
это можно реализовать, используя динамические массивы. пример:
Delphi
1
2
3
4
5
var My_Array : array of integer;
begin
SetLength(My_Array,10); //определение массива длинной в 10 элементов (равносильно тому что бы
//массив был определён изначально след образом My_Array : array[0..9] of integer разница, это можно применить в любой момент.)
end;
1
13058 / 5844 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
03.07.2011, 02:44 7
Можно сделать так, чтобы размер можно было задавать. Здесь можно пойти двумя путями:
1. - Решение на основе статического массива. - Можно задать статический массив достаточно большого размера - т. е., задать M таким, чтобы хватало для решения задачи. А пользователь будет вводить количество значимых элементов - N. И обработка элементов будет вестись в диапазоне индексов: 1..N. При этом, в коде должна быть проверка - чтобы не позволить вводить N большее, чем M - чтобы не произошло переполнение массива.
2. - Решение на основе динамического массива. В этом случае, размер массива можно задавать во время работы программы. И размер этого массива будет ограничен только размером непрерывного участка динамической памяти, который доступен программе.
---
Вот, Kellendros, уже написал подсказку про динамический массив.

Добавлено через 5 минут
Вот как будет выглядеть решение с динамическим массивом:
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
procedure TForm1.Button1Click(Sender: TObject);
var
  Arr : array of Integer;
  i, j, IMin1, IMin2 : Integer;
  S : String;
begin
  //Очистка Мемо2.
  Memo2.Clear;
 
  //Заполнение массива из Мемо1.
  j := -1;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    if Memo1.Lines[i] <> '' then begin
      Inc(j);
      SetLength(Arr, j + 1);
      Arr[j] := StrToInt(Memo1.Lines[i]);
    end;
  end;
 
  //Распечатка исходного массива.
  Memo2.Lines.Add('Исходный массив:');
  S := '';
  for i := 0 to High(Arr) do begin
    if S <> '' then S := S + ', ';
    S := S + IntToStr(Arr[i]);
  end;
  Memo2.Lines.Add(S);
 
  //Решение задачи.
  IMin1 := 1;
  IMin2 := 0;
  for i := 1 to High(Arr) do begin
    if Arr[i] < Arr[IMin1] then begin
      IMin1 := i;
      IMin2 := 0;
    end else if Arr[i] = Arr[IMin1] then begin
      IMin2 := i;
    end;
  end;
 
  //Ответ распечатываем в Мемо2.
  Memo2.Lines.Add('Индексация в массиве принята от нуля.');
  if IMin2 = 0 then begin
    Memo2.Lines.Add('В массиве только один минимальный элемент. Его индекс: ' + IntToStr(IMin1));
  end else begin
    Memo2.Lines.Add('Индекс первого минимального элемента: ' + IntToStr(IMin1));
    Memo2.Lines.Add('Индекс последнего минимального элемента: ' + IntToStr(IMin2));
  end;
end;
1
28 / 28 / 5
Регистрация: 29.06.2011
Сообщений: 61
03.07.2011, 02:46 8
кстати, я только что написал прогу которая увеличивает размер массива по таймеру, и результатом стало создание массива на 30000000 ячеек, все integer, затраты памяти около 150мб и ошибок нет... можно сделать вывод что динам массив ограничен только параметрами компа, вывод лучше использовать динам массив. (а 300000000 стрингов - это 1,3 гига, и опять же тишина)))
0
7 / 7 / 0
Регистрация: 02.12.2009
Сообщений: 102
03.07.2011, 02:51  [ТС] 9
Всё таки я решил оставить прогу без ввода размера. Ну очень уж мне понравились окошки showmessage.

Всем большое спасибо
0
28 / 28 / 5
Регистрация: 29.06.2011
Сообщений: 61
03.07.2011, 02:52 10
думаю можно закрывать тему
0
13058 / 5844 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
03.07.2011, 03:20 11
Ну и ещё выложу одно решение - вариант с динамическим массивом и с предварительным вводом длины массива. Там длина массива читается из Edit. Индексация элементов в динамических массивах идёт от нуля. Здесь количество элементов массива равно M - это число задаёт пользователь через элемент Edit1. Таким образом, индекс последнего элемента массива будет равен: (M - 1).
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
procedure TForm1.Button1Click(Sender: TObject);
var
  Arr : array of Integer;
  i, j, M, IMin1, IMin2 : Integer;
  S : String;
begin
  //Очистка Мемо2.
  Memo2.Clear;
 
  //Читаем сведения о длине массива.
  M := StrToInt(Edit1.Text);
  if M < 1 then begin
    ShowMessage('Задайте длину массива положительным целым числом.');
    Exit;
  end;
  //Задаём длину массива.
  SetLength(Arr, M);
 
  //Заполнение массива из Мемо1.
  j := -1;
  for i := 0 to Memo1.Lines.Count - 1 do begin
    if Memo1.Lines[i] <> '' then begin
      Inc(j);
      Arr[j] := StrToInt(Memo1.Lines[i]);
    end;
    if j = (M - 1) then begin
      ShowMessage('Достигнута граница массива: ' + IntToStr(M) + ' элементов.');
      Break;
    end;
  end;
 
  if j < (M - 1) then begin
    ShowMessage(
      'Значения недостающих элементов массива в количестве: ' + IntToStr(M - 1 - j)
      + ' созданы случайным образом.'
    );
    Randomize;
    for i := j + 1 to M - 1 do begin
      Arr[i] := Random(21); //0..20.
    end;
  end;
 
  //Распечатка исходного массива.
  Memo2.Lines.Add('Исходный массив:');
  S := '';
  for i := 0 to M - 1 do begin
    if S <> '' then S := S + ', ';
    S := S + IntToStr(Arr[i]);
  end;
  Memo2.Lines.Add(S);
 
  //Решение задачи.
  IMin1 := 0;
  IMin2 := -1;
  for i := 1 to M - 1 do begin
    if Arr[i] < Arr[IMin1] then begin
      IMin1 := i;
      IMin2 := -1;
    end else if Arr[i] = Arr[IMin1] then begin
      IMin2 := i;
    end;
  end;
 
  //Ответ распечатываем в Мемо2.
  Memo2.Lines.Add('Индексация в массиве принята от нуля.');
  if IMin2 = -1 then begin
    Memo2.Lines.Add('В массиве только один минимальный элемент. Его индекс: ' + IntToStr(IMin1));
  end else begin
    Memo2.Lines.Add('Индекс первого минимального элемента: ' + IntToStr(IMin1));
    Memo2.Lines.Add('Индекс последнего минимального элемента: ' + IntToStr(IMin2));
  end;
end;
Для справки:
Индекс первого элемента любого массива (статического и динамического) можно определить с помощью функции: Low(Arr). Индекс последнего элемента массива: High(Arr). Длина массива (количество элементов): Length(Arr).
---
Цитата Сообщение от Kellendros Посмотреть сообщение
можно сделать вывод что динам массив ограничен только параметрами компа,
Размер будет ограничен так: <максимальный объём памяти, который может быть выделен приложению в системе> - <данные программы (статические и динамические)>.
Вернее, под массив может быть отдано не всё это оставшееся пространство, а наибольший непрерывный участок в этом пространстве. В 32 битных системах под управлением Win XP 32, максимально, приложению система может выделить, обычно - 2 ГБайта. Но может и больше - до 4 Гбайт, вроде - если это специальным образом запрограммировано в приложении.
1
7 / 7 / 0
Регистрация: 02.12.2009
Сообщений: 102
03.07.2011, 03:30  [ТС] 12
Mawrat, WoW, спасибо за программу с дин. массивом и с указаниями showmessage, я как раз подумал о том чтобы был и дин. массив и showmessage
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2011, 03:30

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

Найти номера первого и последнего минимального элемента из данного набора, и вывести их в указанном порядке
Помогите пожалуйста. Я не могу понять как найти этот нормер. Получается есть набор из чисел....

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

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

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


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

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

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