Как найти минимальную сумму в паскале

1 / 1 / 0

Регистрация: 09.01.2011

Сообщений: 20

1

Минимальная сумма подряд идущих чисел?

14.01.2011, 16:25. Показов 3115. Ответов 17


Студворк — интернет-сервис помощи студентам

Кто знает как найти минимальную сумму подряд идущих чисел?

 Комментарий модератора 
Задача сформулирована неверно. Надо уточнить формулировку.
Видимо имеется в виду, что последовательность чисел создаётся несколько раз. И в наборе этих последовательностей надо подсчитать минимальную сумму.

Добавлено через 19 часов 48 минут
Первая строка входного файла содержит n – количество чисел (1 <= n <= 1000). Во второй строке задаются n чисел, каждое из которых по модулю не превосходит 1000 000 000. Выведите минимальную сумму подряд идущих чисел.

Например

Входной файл:


7
-5 10 -2 -3 4 -7 1

Выходной файл:
-8

Комментарий — Минимальная сумма подряд идущих чисел начинается с позиции 3 и заканчивается позицией 6: (-2) + (-3) + 4 + (-7) = -8



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

14.01.2011, 16:25

17

Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

14.01.2011, 18:13

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
procedure TForm1.Button1Click(Sender: TObject);
const
  //Множество разделителей.
  D = ['.', ',', ':', ';', ' ', #9, #10, #13];
  //Величина приращения длины динамического массива.
  Capacity = 10;
var
  Arr : array of Extended;
  S : String;
  i, j, k, Len, Pos1 : Integer;
  Sum, SumMin : Extended;
begin
  //Выделяем числа из текста и формируем массив.
  S := Memo1.Text;
  Len := Length(S);
  Pos1 := 0;
  j := 0;
  for i := 1 to Len do begin
    //Пропускаем разделители.
    if S[i] in D then Continue;
    //Отслеживаем начало записи числа.
    if (i = 1) or (S[i - 1] in D) then Pos1 := i;
    //Отслеживаем конец записи числа.
    if (i = Len) or (S[i + 1] in D) then begin
      //Если требуется, увеличиваем длину массива.
      if j = Length(Arr) then SetLength(Arr, j + Capacity);
      //Добавляем новый элемент в массив.
      Arr[j] := StrToFloat( Copy(S, Pos1, i - Pos1 + 1) );
      //Индекс следующего элемента массива.
      Inc(j);
    end;
  end;
  //Изменяем длину массива в соответствие
  //с количеством добавленных в него элементов.
  if j < Length(Arr) then SetLength(Arr, j);
  //Если массив пуст.
  if j = 0 then begin
    ShowMessage('В тексте числа не найдены. Действие отменно.');
    Exit;
  end;
 
  //Поиск минимальной суммы последовательно идущих чисел.
  SumMin := Arr[0];
  for i := 0 to High(Arr) do
  for j := i to High(Arr) do begin
    Sum := 0;
    for k := i to j do Sum := Sum + Arr[k];
    if Sum < SumMin then SumMin := Sum;
  end;
 
  //Ответ.
  ShowMessage('Минимальная сумма: ' + FloatToStr(SumMin));
end;



1



1 / 1 / 0

Регистрация: 09.01.2011

Сообщений: 20

14.01.2011, 22:36

 [ТС]

3

Это на Дельфи, а как будет на паскале?



0



Фрилансер

Эксперт С++

5845 / 1226 / 499

Регистрация: 23.11.2010

Сообщений: 3,375

Записей в блоге: 1

14.01.2011, 22:37

4

NatawaB, в чем трудности? Delphi и Pascal похожи



0



1 / 1 / 0

Регистрация: 09.01.2011

Сообщений: 20

14.01.2011, 22:39

 [ТС]

5

Дело в том, что у меня еще много задач которые нужно решить к завтрешнему утру, и я не успеваю. Пожалуйста, помогите. Срочно надо.



0



13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

14.01.2011, 22:46

6

В самом деле — раздел-то Pascal… Сейчас на Pascal переведу…



1



1 / 1 / 0

Регистрация: 09.01.2011

Сообщений: 20

14.01.2011, 22:47

 [ТС]

7

Заранее благодарна. Буду ждать



0



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

14.01.2011, 23:03

8

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
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
program Project1;
 
const
  //Множество разделителей.
  D = ['.', ',', ':', ';', ' ', #9, #10, #13];
  //Длина массива.
  N = 100;
var
  Arr : array[1..N] of Extended;
  //Если нужен массив целых чисел:
  //Arr : array[1..N] of Integer;
  S : String;
  i, j, k, Cnt, Len, Pos1 : Integer;
  Sum, SumMin : Extended;
  //Если используем массив целых чисел:
  //Sum, SumMin : Integer;
begin
  Writeln('Задайте последовательность чисел в виде строки:');
  Readln(S);
 
  //Выделяем числа из текста и формируем массив.
  Len := Length(S);
  Pos1 := 0;
  Cnt := 0;
  for i := 1 to Len do begin
    //Пропускаем разделители.
    if S[i] in D then Continue;
    //Отслеживаем начало записи числа.
    if (i = 1) or (S[i - 1] in D) then Pos1 := i;
    //Отслеживаем конец записи числа.
    if (i = Len) or (S[i + 1] in D) then begin
      //Индекс текущего элемента массива.
      Inc(Cnt);
      //Добавляем новый элемент в массив.
      Val( Copy(S, Pos1, i - Pos1 + 1), Arr[Cnt], j );
    end;
  end;
 
  //Поиск минимальной суммы последовательно идущих чисел.
  SumMin := 0;
  if Cnt > 0 then SumMin := Arr[1];
  for i := 1 to Cnt do
  for j := i to Cnt do begin
    Sum := 0;
    for k := i to j do Sum := Sum + Arr[k];
    if Sum < SumMin then SumMin := Sum;
  end;
 
  //Ответ.
  if Cnt > 0 then
    Writeln('Минимальная сумма: ', SumMin)
  else
    Writeln('В тексте числа не обнаружены.')
  ;
  Readln;
end.



1



NatawaB

1 / 1 / 0

Регистрация: 09.01.2011

Сообщений: 20

14.01.2011, 23:14

 [ТС]

9

Цитата
Сообщение от Mawrat
Посмотреть сообщение

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
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
program Project1;
 
const
  //Множество разделителей.
  D = ['.', ',', ':', ';', ' ', #9, #10, #13];
  //Длина массива.
  N = 100;
var
  Arr : array[1..N] of Extended;
  //Если нужен массив целых чисел:
  //Arr : array[1..N] of Integer;
  S : String;
  i, j, k, Cnt, Len, Pos1 : Integer;
  Sum, SumMin : Extended;
  //Если используем массив целых чисел:
  //Sum, SumMin : Integer;
begin
  Writeln('Задайте последовательность чисел в виде строки:');
  Readln(S);
 
  //Выделяем числа из текста и формируем массив.
  Len := Length(S);
  Pos1 := 0;
  Cnt := 0;
  for i := 1 to Len do begin
    //Пропускаем разделители.
    if S[i] in D then Continue;
    //Отслеживаем начало записи числа.
    if (i = 1) or (S[i - 1] in D) then Pos1 := i;
    //Отслеживаем конец записи числа.
    if (i = Len) or (S[i + 1] in D) then begin
      //Индекс текущего элемента массива.
      Inc(Cnt);
      //Добавляем новый элемент в массив.
      Val( Copy(S, Pos1, i - Pos1 + 1), Arr[Cnt], j );
    end;
  end;
 
  //Поиск минимальной суммы последовательно идущих чисел.
  SumMin := 0;
  if Cnt > 0 then SumMin := Arr[1];
  for i := 1 to Cnt do
  for j := i to Cnt do begin
    Sum := 0;
    for k := i to j do Sum := Sum + Arr[k];
    if Sum < SumMin then SumMin := Sum;
  end;
 
  //Ответ.
  if Cnt > 0 then
    Writeln('Минимальная сумма: ', SumMin)
  else
    Writeln('В тексте числа не обнаружены.')
  ;
  Readln;
end.

Почему в 37 строчке ошибка — Must be in 8087 mode to compile this? Что это значит?



0



13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

14.01.2011, 23:27

10

Это надо настроить компилятор Pascal. Сейчас скажу что надо сделать…

В Borland Pascal надо открыть меню: Options — Compiler… — появится окно настроек компилятора. В этом окне справа внизу есть раздел «Numeric Processing». Там надо поставить галочку в строке «8087/80287». — Это подключение математического сопроцессора.



1



1 / 1 / 0

Регистрация: 09.01.2011

Сообщений: 20

14.01.2011, 23:31

 [ТС]

11

Цитата
Сообщение от Mawrat
Посмотреть сообщение

Это надо настроить компилятор Pascal. Сейчас скажу что надо сделать…

В Borland Pascal надо открыть меню: Options — Compiler… — появится окно настроек компилятора. В этом окне справа внизу есть раздел «Numeric Processing». Там надо поставить галочку в строке «8087/80287». — Это подключение математического сопроцессора.

Все СУПЕР! Получилось. Только вот пропустили то, что в первой строке указано количесвто чисел в последовательности. Как это исправить?



0



13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

14.01.2011, 23:35

12

В этом коде это вообще не нужно. Код построен так, что сколько чисел ввели, столько и будет прочитано. Ввод количества элементов может быть нужен только для такого случая: если, например, ввели 15 чисел, а учитывать надо, например, только 10.
Если такое, в самом деле, подразумевается — я подправлю сейчас. Нужно это сделать?



0



NatawaB

1 / 1 / 0

Регистрация: 09.01.2011

Сообщений: 20

14.01.2011, 23:46

 [ТС]

13

Цитата
Сообщение от Mawrat
Посмотреть сообщение

В этом коде это вообще не нужно. Код построен так, что сколько чисел ввели, столько и будет прочитано. Ввод количества элементов может быть нужен только для такого случая: если, например, ввели 15 чисел, а учитывать надо, например, только 10.
Если такое, в самом деле, подразумевается — я подправлю сейчас. Нужно это сделать?

Эта задача решается с использованием входящих и выходящих файлов. И вот, в задаче конкретно говорится, что первая строка указывает на количество чисел в последовательности. Я даже не знаю как это сделать, но может быть настроить программу так чтобы она начала считывать со второй строки? Конечно, если это возможно …

Добавлено через 6 минут
Посмотрите в чем ошибка? Почему он открывает окно для ввода чисел, а не считывает с файла? и не записывает в выходящий файл?

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
program Project1;
 
const
  D = ['.', ',', ':', ';', ' ', #9, #10, #13];
    N = 100;
var
  Arr : array[1..N] of Extended;
  S : String;
 f,f1:text;
  i, j, k, Cnt, Len, Pos1 : Integer;
  Sum, SumMin : Extended;
begin
  assign(f,'c.in');
  reset(f);
  assign(f1, 'c.out');
  rewrite(f1);
   readln(f,s);
   Len := Length(S);
  Pos1 := 0;
  Cnt := 0;
  for i := 1 to Len do begin
    if S[i] in D then Continue;
     if (i = 1) or (S[i - 1] in D) then Pos1 := i;
        if (i = Len) or (S[i + 1] in D) then begin
         Inc(Cnt);
          Val( Copy(S, Pos1, i - Pos1 + 1), Arr[Cnt], j);
    end;
  end;
 
    SumMin := 0;
  if Cnt > 0 then SumMin := Arr[1];
  for i := 1 to Cnt do
  for j := i to Cnt do begin
    Sum := 0;
    for k := i to j do Sum := Sum + Arr[k];
    if Sum < SumMin then SumMin := Sum;
  end;
 
   if Cnt > 0 then
    Writeln(f1, SumMin:1:0)
  else
    Writeln('V texte chisla ne obnarujeni');
  Readln;
close(f);
close(f1);
end.



0



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

14.01.2011, 23:57

14

Цитата
Сообщение от NatawaB
Посмотреть сообщение

Эта задача решается с использованием входящих и выходящих файлов. И вот, в задаче конкретно говорится, что первая строка указывает на количество чисел в последовательности.

Это сделано, возможно, для облегчения задачи по извлечению чисел из строки. В нашей реализации эта информация (количество элементов) — лишняя.
Предлагаю сделать так — первую строку файла просто пропускать через Readln(F);

Сейчас напишу реализацию с файлом…

Вот вариант с файлами:

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
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
program Project1;
 
const
  //Множество разделителей.
  D = ['.', ',', ':', ';', ' ', #9, #10, #13];
  //Длина массива.
  N = 100;
  //Имена файлов.
  Fn1 = 'c.in';
  Fn2 = 'c.out';
var
  F1, F2 : Text;
  Arr : array[1..N] of Extended;
  S : String;
  i, j, k, Cnt, Len, Pos1 : Integer;
  Sum, SumMin : Extended;
begin
  Assign(F1, Fn1);
  Reset(F1);
  Assign(F2, Fn2);
  Rewrite(F2);
 
  Writeln('Входные данные будут взяты из файла: ', Fn1);
 
  //Пропускаем первую строку.
  Readln(F1);
  //Загружаем вторую строку файла.
  Readln(F1, S);
 
  //Выделяем числа из текста и формируем массив.
  Len := Length(S);
  Pos1 := 0;
  Cnt := 0;
  for i := 1 to Len do begin
    //Пропускаем разделители.
    if S[i] in D then Continue;
    //Отслеживаем начало записи числа.
    if (i = 1) or (S[i - 1] in D) then Pos1 := i;
    //Отслеживаем конец записи числа.
    if (i = Len) or (S[i + 1] in D) then begin
      //Индекс текущего элемента массива.
      Inc(Cnt);
      //Добавляем новый элемент в массив.
      Val( Copy(S, Pos1, i - Pos1 + 1), Arr[Cnt], j );
    end;
  end;
 
  //Поиск минимальной суммы последовательно идущих чисел.
  SumMin := 0;
  if Cnt > 0 then SumMin := Arr[1];
  for i := 1 to Cnt do
  for j := i to Cnt do begin
    Sum := 0;
    for k := i to j do Sum := Sum + Arr[k];
    if Sum < SumMin then SumMin := Sum;
  end;
 
  //Ответ.
  if Cnt > 0 then
    Writeln(F2, 'Минимальная сумма: ', SumMin)
  else
    Writeln(F2, 'В тексте числа не обнаружены.')
  ;
  
  //Закрываем файлы.
  Close(F1);
  Close(F2);
  
  Writeln('Расчёт завершён.');
  Writeln('Результат решения записан в файл: ', Fn2);
  Readln;
end.



1



NatawaB

1 / 1 / 0

Регистрация: 09.01.2011

Сообщений: 20

15.01.2011, 00:01

 [ТС]

15

Большое спасибо!!! Выручил!

Mawrat: пожалуйста.

Я там ещё коммент и длину массива изменил:

Pascal
1
2
3
4
const
...
  //Длина массива.
  N = 100;



0



*~<`PIK`>~*

ﻌﺹ ﺦ ﺖﻀ ﺹ ﻙ ﺵﻔ ﺊ ﺘﺝ

607 / 387 / 81

Регистрация: 15.12.2009

Сообщений: 753

15.01.2011, 00:14

16

Вот если нужно подправил код Mawrat‘a чтобы 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
const
  //Ìíîæåñòâî ðàçäåëèòåëåé.
  D = ['.', ',', ':', ';', ' ', #9, #10, #13];
  //Âåëè÷èíà ïðèðàùåíèÿ äëèíû äèíàìè÷åñêîãî ìàññèâà.
  N = 20;
  //Èìåíà ôàéëîâ.
  Fn1 = 'c.in';
  Fn2 = 'c.out';
var
  F1, F2 : Text;
  Arr : array[1..N] of Extended;
  S : String;
  i, j, k, Cnt, Len, Pos1, l : Integer;
  Sum, SumMin : Extended;
begin
  Assign(F1, Fn1);
  Reset(F1);
  Assign(F2, Fn2);
  Rewrite(F2);
 
  Writeln('Âõîäíûå äàííûå áóäóò âçÿòû èç ôàéëà: ', Fn1);
 
  //Ïðîïóñêàåì ïåðâóþ ñòðîêó.
  Readln(F1, l);
  //Çàãðóæàåì âòîðóþ ñòðîêó ôàéëà.
  Readln(F1, S);
 
  //Âûäåëÿåì ÷èñëà èç òåêñòà è ôîðìèðóåì ìàññèâ.
  Len := Length(S);
  Pos1 := 0;
  Cnt := 0;
  for i := 1 to Len do begin
    //Ïðîïóñêàåì ðàçäåëèòåëè.
    if S[i] in D then Continue;
    //Îòñëåæèâàåì íà÷àëî çàïèñè ÷èñëà.
    if (i = 1) or (S[i - 1] in D) then Pos1 := i;
    //Îòñëåæèâàåì êîíåö çàïèñè ÷èñëà.
    if (i = Len) or (S[i + 1] in D) then begin
      //Èíäåêñ òåêóùåãî ýëåìåíòà ìàññèâà.
      Inc(Cnt);
      If Cnt>l then Break;
      //Äîáàâëÿåì íîâûé ýëåìåíò â ìàññèâ.
      Val( Copy(S, Pos1, i - Pos1 + 1), Arr[Cnt], j );
    end;
  end;
 
  //Ïîèñê ìèíèìàëüíîé ñóììû ïîñëåäîâàòåëüíî èäóùèõ ÷èñåë.
  SumMin := 0;
  if Cnt > 0 then SumMin := Arr[1];
  for i := 1 to l do
  for j := i to l do begin
    Sum := 0;
    for k := i to j do Sum := Sum + Arr[k];
    if Sum < SumMin then SumMin := Sum;
  end;
 
  //Îòâåò.
  if Cnt > 0 then
    Writeln(F2, 'Ìèíèìàëüíàÿ ñóììà: ', SumMin)
  else
    Writeln(F2, ' òåêñòå ÷èñëà íå îáíàðóæåíû.')
  ;
  
  //Çàêðûâàåì ôàéëû.
  Close(F1);
  Close(F2);
  
  Writeln('Ðàñ÷¸ò çàâåðø¸í.');
  Writeln('Ðåçóëüòàò ðåøåíèÿ çàïèñàí â ôàéë: ', Fn2);
  Readln;
end.



0



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

15.01.2011, 00:23

17

Только строчки надо переставить и проверку сделать на равенство:

Pascal
1
2
3
4
5
...
      If Cnt = L then Break;
      //Индекс текущего элемента массива.
      Inc(Cnt);
...

Потому что Cnt должно точно соответствовать количеству записанных в массив чисел.



0



ﻌﺹ ﺦ ﺖﻀ ﺹ ﻙ ﺵﻔ ﺊ ﺘﺝ

607 / 387 / 81

Регистрация: 15.12.2009

Сообщений: 753

15.01.2011, 00:29

18

Цитата
Сообщение от Mawrat
Посмотреть сообщение

Cnt должно точно соответствовать количеству записанных в массив чисел

Точно, не подумал.



0



Const m=100;
var
        i,j,min,tempmin,s,k,N,beg,en:integer;
        x:array [1..m] of integer;
begin
Randomize;
writeln('Введите количество чисел');
readln(N);
writeln('Теперь вводите 'n,' чисел');
For i:=1 to N do
        begin
{               x[i]:=random(6);
                write(x[i]:5);}
    readln(x[i]);
        end;
writeln;
for i:= 1 to N do min:=min+x[i];
beg:=1;
en:=N;
for i:= 1 to N-1 do
        begin
                tempMin:=0;
                for j:= i to N do tempMin:=tempMin+x[j];
                        if TempMin<min then min:=TempMin;                       
                tempMin:=0;
                for j:= 1 to i do tempMin:=tempMin+x[j];
                if TempMin<min then     min:=TempMin;           
                for j:= i+1 to n do
                        begin
                                tempMin:=0;                             
                                for k:= i to j do tempMin:=tempMin+x[k];                        
                                if TempMin<min then     min:=TempMin;
                        end;    
        end;
writeln('Минимальная сумма = ',min);
readln;
end.

формать входных данных
первая строка файла содержит количество цифр n , во второй строке задаются n чисел кадое из которых по модулю не превосходит 1000 000 000

тоесть формат входных данных :
7 - количество цифр
-5 10 -2 -3 4 -7 1 - сама последовательность

а вывод должен быть -8
Const m=100;
var
    i,j,min,tempmin,s,k,N,beg,en:integer;
    x:array [1..m] of integer;
begin
Randomize;
writeln('Введите количество чисел');
readln(N);
writeln('Теперь вводите 'n,' чисел');
For i:=1 to N do
    begin
{       x[i]:=random(6);
        write(x[i]:5);}
    readln(x[i]);
    end;
writeln;
for i:= 1 to N do min:=min+x[i];
beg:=1;
en:=N;
for i:= 1 to N-1 do
    begin
        tempMin:=0;
        for j:= i to N do tempMin:=tempMin+x[j];
            if TempMin<min then min:=TempMin;           
        tempMin:=0;
        for j:= 1 to i do tempMin:=tempMin+x[j];
        if TempMin<min then min:=TempMin;       
        for j:= i+1 to n do
            begin
                tempMin:=0;             
                for k:= i to j do tempMin:=tempMin+x[k];            
                if TempMin<min then min:=TempMin;
            end;    
    end;
writeln('Минимальная сумма = ',min);
readln;
end.

Задание:

Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные целые значения. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит номера двух элементов массива, сумма которых минимальна. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.

Паскаль

const N=30; 
var a: array [1..N] of integer; 
    i, j, min, min2, s: integer; 
begin
  for i:=1 to N do readln(a[i]); 
  …
end.

Си

#include<stdio.h> 
int main(void) { 
const int N=30; 
int a[N]; 
int    i, j, min, min2, s; 
for (i=0; i<N; i++)
  scanf(″%d″, &a[i]); 
  …
}

Естественный язык

Объявляем массив A из 30 элементов. Объявляем целочисленные переменные i, j, min, min2, s. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. 

Решение:

Очевидно, что нужно вывести номера минимального элемента массива и «второго» минимума. Храним в переменных min и min2 не значения, а номера элементов):


const N = 30;
var a : array[1..N] of integer;
i, k, min, min2: integer;

begin
for i: = 1 to N do readln(a[i]);
 if a[1] < a[2] then begin
 min : = 1; min2: = 2
 end
 else begin
 min : = 2; min2: = 1
 end;

for i: = 3 to N do
 if a[i] < a[min] then begin
 min2 : = min;
 min: = i
 end
 else if a[i] < a[min2] then min2 : = i;
 writeln(min, ' ', min2)
end.

Основные операции обработки массивов:

  • вычисление суммы элементов массива;
  • поиск максимального или минимального значения в массиве;
  • поиск максимального или минимального среди всех элементов массива, удовлетворяющих некоторому условию;
  • обмен значениями между элементами;
  • реверс — перестановка элементов массива местами в обратном порядке (последний становится первым, первый — последним и т. д.

Рассмотрим подробнее каждую операцию.

Вычислим сумму элементов массива из предыдущей теории — усовершенствуем программу. Цикл, с помощью которого выводился массив, заменим на цикл, который будет прибавлять к переменной (s) каждый последующий элемент массива.

Ответ: (55).

Задачи на поиск в массиве

Поиск максимального значения.

Идея поиска максимального значения заключается в следующем: каждый элемент массива поочерёдно сравнивается со следующим. Если он больше, то некоторой переменной max будет присвоено значение этого элемента. Напишем программу.

Ответ: (100).

Найдём наибольшее число, удовлетворяющее некоторому условию.

Задача: найти максимальное чётное число. Для этого добавим в условие проверку на чётность при помощи операции mod.

Ответ: (8).

Обмен значениями между элементами

Допустим, нам нужно удалить некоторый элемент массива.

Скриншот 15-10-2021 023238.jpg

Удалим элемент с индексом (6). Для этого добавляем ещё одну переменную, которая будет обозначать индекс удаляемого элемента. Далее массив будем выводить по частям. До удаляемого элемента — без изменений, пропустим удаляемый элемент и выведем остаток массива.

Скриншот 15-10-2021 030215.jpg

Скриншот 15-10-2021 030236.jpg

Понравилась статья? Поделить с друзьями:
  • Как найти свой номер телефона в вайбере
  • Ошибка применения безопасности как исправить
  • Mvs91xx sys как исправить
  • Как исправить списание расходов будущих периодов
  • Форма дополнительного соглашение к договору как его составить