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


Ответ
 
Опции темы Опции просмотра
Старый 14.12.2012, 18:58   #1 (permalink)
Серёга_IV
Новичок
 
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Паскаль АВС. Задача с массивами

Помогите решить задачу. Условие:
Поменять местами первое положительное число с последним отрицательным в одномерном массиве из целых чисел.

Менять местами желательно используя дополнительную переменную

Я бы скинул вам свой вариант, но мне нельзя размещать ссылки, и по величине не подходит изображение.
Серёга_IV вне форума   Ответить с цитированием

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

Эти темы ждут, пока вы их прочитаете

Задача Паскаль
Паскаль с массивами, ошибка
Задача на Паскаль

Старый 14.12.2012, 19:58   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,278
Сказал(а) спасибо: 290
Поблагодарили 508 раз(а) в 166 сообщениях
Репутация: 92003
По умолчанию

Цитата:
Сообщение от Серёга_IV Посмотреть сообщение
Помогите решить задачу.
Вообще-то с подобными пустяками уровня подготовительной группы детсада для умственно-отсталых я посылаю куда подале, ведь на чем же еще учиться (если, конечно, есть таковое намерение), как не на подобной ерунде? Но ладно, Название: 42324.gif
Просмотров: 368

Размер: 939 байт. Получите. Но это, правда, Free Pascal. Вроде без разницы.
Код:
Const
 N=20;
Var
 A:Array[1..N] of Integer;
 i1,i2,i,D:Integer;
Begin
 Randomize;
 Writeln('Old array:');
 For i:=1 to N do
  begin
   A[i]:=10-Random(20);
   Write(A[i]:4);
  end;
 Writeln;
 i1:=1;
 If A[i1]<=0 then
  Repeat
   Inc(i1);
  Until (A[i1]>0) or (i1=N);
 i2:=N;
 If A[i2]>=0 then
  Repeat
   Dec(i2);
  Until (A[i2]<0) or (i2=1);
 If (A[i1]>0) and (A[i2]<0) then
  begin
   D:=A[i1];
   A[i1]:=A[i2];
   A[i2]:=D;
   writeln('New array:');
   for i:=1 to N do Write(A[i]:4);
  end
 else
 If A[i1]<=0 then
  Writeln('No positives!')
 else
 If (A[i2]>=0) then
  Writeln('No negatives!');
 Readln
End.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 14.12.2012, 20:36   #3 (permalink)
Серёга_IV
Новичок
 
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо, я понимаю, что это для вас просто, но я 9 класс, и вот только месяц мы изучаем массивы.
Ещё раз спасибо.
Серёга_IV вне форума   Ответить с цитированием
Старый 14.12.2012, 20:42   #4 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,278
Сказал(а) спасибо: 290
Поблагодарили 508 раз(а) в 166 сообщениях
Репутация: 92003
По умолчанию

Цитата:
Сообщение от Серёга_IV Посмотреть сообщение
Спасибо, я понимаю, что это для вас просто, но я 9 класс, и вот только месяц мы изучаем массивы. Ещё раз спасибо.
О, тогда - приношу глубочайшие извинения. Всё нормально. Я-то думал - очередной студент-лоботряс семестр пробездельничал, а перед сессией спохватился. Я таких... как бы это... несколько недолюбливаю.
А Вам - успехов. Обращайтесь, если что - поможем.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 14.12.2012, 20:46   #5 (permalink)
Серёга_IV
Новичок
 
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Мой вариант таков:
Program z_1;
Var g:array[1..10] of integer;
p,o,d,i:integer;
Begin
for i:= 1 to 10 do g[i]:=random (21)-10;
for i:= 1 to 10 do write(g[i],',');
writeln;
for i:= 1 to 10 do if g[i]>0 then i:=p;
for i:= 10 downto 1 do if g[i]<0 then i:=o;
d:=g[p];
g[p]:=g[o];
g[o]:=d;
for i:= 1 to 10 do write (g[i]:4);
End.

Скажите пожалуйста, в чём недочёт, не проходит по времени.
Серёга_IV вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 15.12.2012, 09:38   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,278
Сказал(а) спасибо: 290
Поблагодарили 508 раз(а) в 166 сообщениях
Репутация: 92003
По умолчанию

Сергей, у Вас в программе две грубейших ошибки, одна техническая, вторая - смысловая. Обе они в строках:
Цитата:
Сообщение от Серёга_IV Посмотреть сообщение
for i:= 1 to 10 do if g[i]>0 then i:=p;
for i:= 10 downto 1 do if g[i]<0 then i:=o;
Давайте разбираться.
1. Вместо того, чтобы при выполнении условия присвоить переменным p и o значения переменной цикла i, Вы поступаете ровно наоборот: переменной цикла присваиваете значения p и o, изначально не заданные и, следовательно, по умолчанию нулевые. Результат: цикл летит в тар-тарары.
2. Это уже серьёзней. Ведь не зря в моей программе применен не for..to..do, а repeat..until. Сделано это отнюдь не по скудоумию моему, как Вы, очевидно, решили, а вот зачем: как только в первом цикле программа находит положительное число, а во втором - отрицательное, циклы необходимо прервать. Иначе перезапись будет продолжаться до конца, и в результате программа найдет ПОСЛЕДНЕЕ положительное и ПЕРВОЕ отрицательное числа. В принципе прерывание можно организовать и в циклах for..to..do, хотя я подобным стараюсь не пользоваться, так как полагаю такой стиль программирования изрядно дурным. Но, если угодно, то пожалуйста: вот исправленный вариант:
Код:
Var
 g:array[1..10] of integer;
 p,o,d,i:integer;
Begin
 Randomize;
 for i:= 1 to 10 do
  g[i]:=random (21)-10;
 for i:= 1 to 10 do write(g[i]:4);
 writeln;
 for i:= 1 to 10 do
  if g[i]>0 then
   begin
    p:=i;
    break;
   end;
 for i:= 10 downto 1 do
  if g[i]<0 then
   begin
    o:=i;
    break;
   end;
 d:=g[p];
 g[p]:=g[o];
 g[o]:=d;
 for i:= 1 to 10 do write (g[i]:4);
 readln
End.
В принципе, можно и без прерываний. Но тогда циклы надо пустить в обратную сторону: пусть положительное число ищет, начиная с КОНЦА, а отрицательное - с НАЧАЛА, перезаписывая найденные значения p и o. Тогда остановится на нужных. Это так:
Код:
Var
 g:array[1..10] of integer;
 p,o,d,i:integer;
Begin
 Randomize;
 for i:= 1 to 10 do
  g[i]:=random (21)-10;
 for i:= 1 to 10 do write(g[i]:4);
 writeln;
 for i:= 10 downto 1 do if g[i]>0 then p:=i;
 for i:= 1 to 10 do if g[i]<0 then o:=i;
 d:=g[p];
 g[p]:=g[o];
 g[o]:=d;
 for i:= 1 to 10 do write (g[i]:4);
 readln
End.
И еще. Вот Вы выбросили проверку наличия хоть одного положительного и хоть одного отрицательного элементов массива. Ну что же - дело Ваше, только мне кажется, лучше всё-таки предусмотреть ситуации, когда все члены массива оказываются либо положительными, либо отрицательными. Хотя бы во избежание каверзных вопросов учителя. Впрочем, как хотите.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 15.12.2012, 19:40   #7 (permalink)
Серёга_IV
Новичок
 
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо, я понял. И по моему, всё таки, когда мы просматриваем элементы массива, компьютер находит первый элемент, соответствующий условию и запоминает именно его, а остальные не смотрит. при выполнении программы получилось именно так.
И я не в коем случае не думаю, что вы плохо знаете программирование.
Серёга_IV вне форума   Ответить с цитированием
Старый 15.12.2012, 19:55   #8 (permalink)
Серёга_IV
Новичок
 
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Значит я исправил первую ошибку. И всё получилось отлично. Просто переменным присвоил значение индексов, а не наоборот, как было сначала.
На счёт нюансов с числами одинаковых знаков: спасибо за замечание, но пока мне это не обязательно.

Спасибо.
Серёга_IV вне форума   Ответить с цитированием
Старый 15.12.2012, 20:03   #9 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,278
Сказал(а) спасибо: 290
Поблагодарили 508 раз(а) в 166 сообщениях
Репутация: 92003
По умолчанию

Цитата:
Сообщение от Серёга_IV Посмотреть сообщение
Спасибо, я понял. И по моему, всё таки, когда мы просматриваем элементы массива, компьютер находит первый элемент, соответствующий условию и запоминает именно его, а остальные не смотрит. при выполнении программы получилось именно так.
И я не в коем случае не думаю, что вы плохо знаете программирование.
Не, ну вот ведь Фома Неверующий!
Ладно. Запустил Вашу программу, исправив лишь присваивание значений o и p и добавив вывод этих параметров и соответствующих им элементов массивов на экран. Вот листинг:

Var g:array[1..10] of integer;
p,o,d,i:integer;
Begin
for i:= 1 to 10 do g[i]:=random (21)-10;
for i:= 1 to 10 do write(g[i]:4);
writeln;
for i:= 1 to 10 do if g[i]>0 then p:=i;
for i:= 10 downto 1 do if g[i]<0 then o:=i;
writeln('p= ',p:2,' g[p]= ',g[p]:3);
writeln('o= ',o:2,' g[o]= ',g[o]:3);
d:=g[p];
g[p]:=g[o];
g[o]:=d;
for i:= 1 to 10 do write (g[i]:4);
End.

А вот результат, полюбуйтесь:
fp01.jpg
И что, это, по-Вашему ПЕРВЫЙ положительный и ПОСЛЕДНИЙ отрицательный элементы? А по-моему, всё с точностью до наоборот. Что я Вам и пытался объяснить. Но, впрочем, если Вы обладаете магическим даром заставить компьютер считать не так, как предписано программой, а так, как хочется Вам - в добрый час!

P.S. Прошу прощения, изначально не тот рисунок вставил. Исправлено.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 15.12.2012, 22:33   #10 (permalink)
Серёга_IV
Новичок
 
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Ну это всё моя невнимательность. Извиняюсь
Серёга_IV вне форума   Ответить с цитированием
Ads

Яндекс

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

Опции темы
Опции просмотра

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

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




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

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