Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 27.12.2010, 22:07   #1 (permalink)
Major_Pain
Новичок
 
Регистрация: 27.12.2010
Сообщений: 9
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Сортировка массива

Помогите найти ошибку:
Дан одномерный массив a. Записать в массив z все порядковые номера отрицательных элементов массива a. Затем упорядочить по убыванию элементы массива a, расположенные между первыми двумя отрицательными элементами .

Решение:: program c;const n=10;
var
a:array[1..n] of real;
z:array[1..n] of integer;
i,j,max1,k:integer; max,t:real;
begin
for i:=1 to n do
begin
a[i]:=random(10)-20;
end;
for i:=1 to n do
for j:=1 to n do
begin
if a[i]<0 then
z[j]:=i;
k:=z[j];
end;
begin
max:=-1000;
for k:=1 to n do
begin
if a[k]>max then
begin
max:=a[k];
max1:=k;
end;
end;
t:=a[max1];
a[max1]:=a[k];
a[k]:=t;
end; for k:=1 to n do
writeln('t=',t);
end.

заранее спасбо
Major_Pain вне форума   Ответить с цитированием

Старый 27.12.2010, 22:07
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Пока в вашей теме не появились ответы, можете посмотреть эти

Сортировка по алфавиту
Сортировка по алфавиту(помогите)
Сортировка в Паскале
Сортировка в Pascal
Сортировка одномерного массива
Сортировка одномерного массива-метод выбора и перестановки

Старый 27.12.2010, 23:48   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Major_Pain Посмотреть сообщение
Помогите найти ошибку:
Дан одномерный массив a. Записать в массив z все порядковые номера отрицательных элементов массива a. Затем упорядочить по убыванию элементы массива a, расположенные между первыми двумя отрицательными элементами .
Ошибку, говорите? А думаете, она тут одна? О, нет - их тут таки полно. Ну, поехали:
Цитата:
program c;const n=10;
var
a:array[1..n] of real;
z:array[1..n] of integer;
i,j,max1,k:integer; max,t:real;
begin
for i:=1 to n do
begin
a[i]:=random(10)-20;
end;
До сих пор всё правильно. За исключением того, что, во-первых, не запущен генератор случайных чисел, а во-вторых, при такой выборке ВСЕ члены массива а будут отрицательными! Еще брать в операторные скобки begin-end единственный оператор не обязательно, ну да это дело вкуса.
Цитата:
for i:=1 to n do
for j:=1 to n do
begin
if a[i]<0 then
z[j]:=i;
k:=z[j];
end;
А вот этот блок я решительно понимать отказываюсь. Что-то он творит маловразумительное. Зачем-то, если попадается отрицательный элемент массива a[i], то значением этого самого i заполняется весь массив z, причем массив z полностью перезаписывается для каждого отрицательного a[i]. И к чему бы?
Цитата:
begin
А это еще зачем?
Цитата:
max:=-1000;
for k:=1 to n do
begin
if a[k]>max then
begin
max:=a[k];
max1:=k;
end;
end;
Так - нашли максимальный элемент массива а и его номер. Зачем - непонятно: в условии этого не требуется. Но нашли.
Цитата:
t:=a[max1];
a[max1]:=a[k];
a[k]:=t;
Ничего не понимаю. В результате этих манипуляций значение найденного максимума присвоено переменной t, а также последнему (n-ному) элементу массива a. И что?
Цитата:
end;
Бессмысленный end для вставленного выше бессмысленного begin.
Цитата:
for k:=1 to n do
writeln('t=',t);
end.
Блестяще! В конце n раз выводим значение одного и того же числа t.
[/QUOTE]заранее спасбо[/QUOTE]
Незчто.
Предлагаю Вам свой вариант программы. Полностью отлаженный. Попробуйте разобраться:
Код:
const
 n=10;
var
 a,z:array[1..n] of Integer;
 i,j,n_neg,n_b,k1,k2,dummy:integer;

BEGIN
{Формируем массив а и выводим его на экран}
 Randomize;
 for i:=1 to n do
  begin
   a[i]:=random(20)-3;
   write(a[i]:4);
  end;
 writeln;
 writeln;

{Считаем число отрицательных элементов 
и формируем из их номеров массив z, 
который выводим на экран}
 n_neg:=0;
 for i:=1 to n do
  if a[i]<0 then
   begin
    n_neg:=n_neg+1;
    z[n_neg]:=i;
   end;
 for i:=1 to n_neg do
  write(z[i]:4);
 writeln;
 writeln;

{Ищем первый и второй отрицательные элементы 
массива а. Если их нет или таковой всего один - 
выводим соответствующее сообщение. Если есть 
по крайней мере два отрицательных элемента - 
упорядочиваем методом пузырька числа между ними. 
При этом если отрицательные элементы - соседние, 
т.е. между ними элементов нет, то выводим сообщение 
об этом. Результат выводим на экран.}
 k1:=0;
 k2:=0;
 i:=0;
 repeat
  i:=i+1;
  if (a[i]<0) and (k1=0) then k1:=i;
  if (a[i]<0) and (k1>0) and (i>k1) and (k2=0) then k2:=i;
 until ((k1>0) and (k2>0)) or (i=n);
 If (i=n) and (k2=0) then
  writeln('Only 1 or 0 negative element! Run the program once more!')
 else
  begin
   k1:=k1+1;
   k2:=k2-1;
   if k1>k2 then
    writeln('The array between two first negative elements is empty!')
   else
   if k1=k2 then
    writeln(a[k1])
   else
    begin
     for i:=1 to k2-k1-1 do
      for j:=k1 to k2-i do
       if a[j]<a[j+1] then
        begin
         dummy:=a[j];
         a[j]:=a[j+1];
         a[j+1]:=dummy;
        end;
     for i:=k1 to k2 do
      write(a[i]:4);
     writeln;
    end;
  end;
 readln;
END.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 16:30.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.