powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Pascal: обработка массива
13 сообщений из 38, страница 2 из 2
Pascal: обработка массива
    #38239844
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexander4321softwarer, спасибо за код! Вечером дома посмотрю. Там в конце кода на else выдает Error in statement
Я просто давно не писал на Паскале. Там в трёх или четырёх местах = вместо := и в паре мест лишние ; перед else, надо исправить синтаксические ошибки.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240092
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexander4321. Я до этого читал, что порядковые номера элементов в массивах начинаются с нуля, а не с единицы. Не подскажете, как начинать считать элементы? Спасибо!паскаль хорош тем, что номер элемента можно начинать не только с любого числа, но и можно использовать любой перечислимый (прочитайте что это такое) тип.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240469
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЯ понимаю, когда со студенческими задачами испытывают проблемы студенты, но куда более странно, когда отвечающие.

А если хоть чуть-чуть применить голову, то
- не заводить никаких массивов
- игнорировать каждое второе введённое число
- в цикле ввода чисел заодно и определить искомый результатДочитывать пост до конца не умеем?
Я привел один из возможных алгоритмов, оптимизация - дело следующих шагов. Тем более, что по условию - исходный массив всё же придётся заводить... Ну или заменяем алгоритм - и да, можно всё решить в один проход, сохраняя-сравнивая два минимума.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240524
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMЯ привел один из возможных алгоритмов, оптимизация - дело следующих шагов.
Выкинуть большую и сложную бяку и написать заново 100% на порядок более простого решения - это не та оптимизация, которую следует откладывать на "следующие шаги", это то, что следует делать в момент выбора решения (и для столь сложной задачи - автоматом и в уме).

AndreTMТем более, что по условию - исходный массив всё же придётся заводить...
Не придётся. Максимум - получать его на вход, если оформлять решение как подпрограмму.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240702
Фотография Человек-триплоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
.......
AndreTMТем более, что по условию - исходный массив всё же придётся заводить...
Не придётся. Максимум - получать его на вход, если оформлять решение как подпрограмму.
Действительно, лучше рандомом.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240719
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Много различных вариантов действий, но мне нужно как-нибудь сделать задание. Пока что на данный момент самое понятное для меня - это отсортировать массив, затем найти минимальный нечетный элемент, сохранить его значение и значение его позиции в массиве в переменные. Далее повторить поиск минимального элемента, но с условием, что его позиция в массиве не будет равна позиции в массиве найденного ранее элемента. За нечетный элемент буду принимать значение, а не позицию в массиве, поэтому тип будет integer. Сортировку я переписал из учебника, а поиск минимального элемента дописывал сам. При выполнении программы выполняется только сортировка, и на экран выводится отсортированный список. Далее никаких действий выполнить невозможно, приходится закрывать программу и открывать по новой. Ошибка явно в дописанной мной части поиска минимального элемента.
Можете подсказать, что там не так? Спасибо заранее!
Код: sql
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.
program Bla_bla;

const
  n = 20;

var
  arr: array [1..n] of Integer;
  middle: Integer;				{средний элемент}
  min, min_2, min_pos, min_2_pos: Integer;	{мин и 2-й мин зл-ты и их позиции}
  temp: Integer;					{буферная перем. для обмена 2-х знач. в массиве}
  sp: Integer;					{указатель на вершину стека}
  i, j: Integer;
  stackl, stackr: array [1..n] of Integer;		{стеки границ фрагментов}
  left, right: Integer;				{границы сортируемого фрагмента}

begin
  writeln('Введите 20 элементов массива');

  for i := 1 to n do
    read(arr[i]);

  sp := 1;
  stackl[1] := 1;
  stackr[1] := n;

  while sp > 0 do
    begin
      {выборка границ фрагмента из стека}

      left := stackl[sp];
      right := stackr[sp];

      dec(sp);

      while left < right do
        begin
          {разделение фрагмента arr[left]..arr[right]:}

          i := left;
          j := right;
          middle := arr[(left + right) div 2];

          while i < j do
            begin
              while arr[i] < middle do
                inc(i);

              while middle < arr[j] do
                dec(j);

              if i <= j then
                begin
                  temp := arr[i];
                  arr[i] := arr[j];
                  arr[j] := temp;

                  inc(i); dec(j);
                end;
            end;

            if i < right then
              begin
                {запись в стек границ правой части фрагмента}

                inc(sp);
                stackl[sp] := i;
                stackr[sp] := right;
              end;

            right := j;

            {теперь left и right ограничивают левую часть}
        end;
  end;

  writeln('Упорядоченный массив: ');

  for i := 1 to n do
     write(arr[i]:8);

  readln;

  {До этого был код из учебника и он выполняется. Далее то, что дописывал сам}

  min := 1;

  for i := n downto 1 do
    if (arr[i] mod 2 <> 0) and (arr[i] > 0) then
      begin
        min := arr[i];
        i := min_pos;
      end;


  min_2 := 1;


  for i := n to min do
    if (arr[i] mod 2 <> 0) and (arr[i] > 0) and (i <> min_pos) then
      begin
        min_2 := arr[i];
        min_2_pos := i;
      end;

  writeln('Второй мин положительный элемент: ', min_2);

  writeln('Его позиция в массиве: ', min_2_pos);
end.

...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240787
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, решил задание.
Код: sql
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.
Program Zadacha;
uses crt;
const
 n = 30;
var
 i,j,min, min_2, min_2_pos:integer;
 a,arr:array[1..n] of integer;
begin
 clrscr;
 randomize;
 for i:=1 to n do begin
   a[i]:=random(40);
   arr:=a;
   write(a[i]:3);
 end;
 writeln;
 for i:=1 to n do begin
   for j:=1 to n do begin
     if (a[i]<a[j]) and (a[i]>0) then
      begin min:=a[i]; a[i]:=a[j]; a[j]:=min; end;
   end;
 end;
 writeln;
 i:=1;
 min:=a[1];
 while (a[i]=min) and (i<=n) do
  begin inc(i); min_2:=a[i]; end;
  if min_2 mod 2 <> 0 then
 writeln('2-i min element: ', min_2)
 else writeln('Vtoroi min element v massive chetnyi:', min_2);
 for i:=1 to n do
 if arr[i]=min_2 then writeln('Ego index v massive: ',i);
 readln;
end.


К сожалению здесь при поиске второго минимального элемента нет проверки на четность, но, если второй минимальный элемент является четным, то выводится сообщение об этом. В общем с огрехами, но работает. Буду так сдавать.
Спасибо всем за помощь!!!!!
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240817
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему все элементы массива - неотрицательные?

Вообще, вот реализация алгоритма, который посоветовал softwarer :
Код: 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.
Program Zadacha;
const
 n = 30;
var
 i,min1pos,min2pos:integer;
 a:array[0..n] of integer;
begin
 randomize;
 writeln('Source Array:');
 for i:=1 to n do begin
  a[i]:=random(100)-50;
  write(a[i]:3,' ');
 end;
 writeln;

 min1pos:=0;
 a[0]:=50;
 min2pos:=0;
 for i:=1 to n do
  if (a[i]>0) and (a[i] mod 2 <> 0) then
   if a[i]<a[min1pos] then begin
    min2pos:=min1pos; min1pos:=i end
   else
    if a[i]<a[min2pos] then min2pos:=i;
 if min2pos=0 then
  writeln('Not found')
 else
  writeln('Second min positive odd element = ',a[min2pos],', in position ',min2pos);
 readln;
end.

...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240830
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTMВообще, вот реализация алгоритма, который посоветовал softwarer :

Ничего большего я сделать не мог. Притянул за уши результат.
Спасибо большое за код! Все работает. Завтра на свежую голову поразбираюсь в нем и воткну в лабораторную.
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240832
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и как можно было решать " по первому варианту", с сортировкой:
Код: 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.
Program Zadacha;
const
 n = 30;
var
 i,j,m,temp:integer;
 arr:array[1..n] of integer;
 a:array[1..n,1..2] of integer;
begin
 randomize;
 writeln('Source Array:');
 for i:=1 to n do begin
  arr[i]:=random(100)-50;
  write(arr[i]:3,' ');
 end;
 writeln;

 m:=0;
 for i:=1 to n do
  if (arr[i]>0) and (arr[i] mod 2 <> 0) then begin
   inc(m); a[m,1]:=arr[i]; a[m,2]:=i end;

 if m>1 then begin
  for i:=1 to m-1 do
   for j:=i to m do
    if a[j,1]<a[i,1] then begin
     temp:=a[i,1]; a[i,1]:=a[j,1]; a[j,1]:=temp;
     temp:=a[i,2]; a[i,2]:=a[j,2]; a[j,2]:=temp;
    end;
  writeln('Second min positive odd element = ',a[2,1],', in position ',a[2,2]);
  end
 else
  writeln('Not found');
 readln;
end.

...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240845
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, косячок, - надо:
Код: pascal
1.
 for j:=i+1 to m do
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38240849
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и совсем, чтобы добить быстродействие:
Код: pascal
1.
2.
  for i:=1 to 2 do
   for j:=i+1 to m do
...
Рейтинг: 0 / 0
Pascal: обработка массива
    #38242282
alexander4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Pascal: обработка массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]