14.12.2012, 18:58 | #1 (permalink) |
Новичок
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Паскаль АВС. Задача с массивами
Поменять местами первое положительное число с последним отрицательным в одномерном массиве из целых чисел. Менять местами желательно используя дополнительную переменную Я бы скинул вам свой вариант, но мне нельзя размещать ссылки, и по величине не подходит изображение. |
14.12.2012, 18:58 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Эти темы ждут, пока вы их прочитаете Задача Паскаль Паскаль с массивами, ошибка Задача на Паскаль |
14.12.2012, 19:58 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Вообще-то с подобными пустяками уровня подготовительной группы детсада для умственно-отсталых я посылаю куда подале, ведь на чем же еще учиться (если, конечно, есть таковое намерение), как не на подобной ерунде? Но ладно, . Получите. Но это, правда, 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. |
14.12.2012, 20:42 | #4 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
А Вам - успехов. Обращайтесь, если что - поможем. |
|
14.12.2012, 20:46 | #5 (permalink) |
Новичок
Регистрация: 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. Скажите пожалуйста, в чём недочёт, не проходит по времени. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
15.12.2012, 09:38 | #6 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Сергей, у Вас в программе две грубейших ошибки, одна техническая, вторая - смысловая. Обе они в строках:
Цитата:
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. Код:
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. |
|
15.12.2012, 19:40 | #7 (permalink) |
Новичок
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо, я понял. И по моему, всё таки, когда мы просматриваем элементы массива, компьютер находит первый элемент, соответствующий условию и запоминает именно его, а остальные не смотрит. при выполнении программы получилось именно так.
И я не в коем случае не думаю, что вы плохо знаете программирование. |
15.12.2012, 19:55 | #8 (permalink) |
Новичок
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Значит я исправил первую ошибку. И всё получилось отлично. Просто переменным присвоил значение индексов, а не наоборот, как было сначала.
На счёт нюансов с числами одинаковых знаков: спасибо за замечание, но пока мне это не обязательно. Спасибо. |
15.12.2012, 20:03 | #9 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Ладно. Запустил Вашу программу, исправив лишь присваивание значений 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. А вот результат, полюбуйтесь: И что, это, по-Вашему ПЕРВЫЙ положительный и ПОСЛЕДНИЙ отрицательный элементы? А по-моему, всё с точностью до наоборот. Что я Вам и пытался объяснить. Но, впрочем, если Вы обладаете магическим даром заставить компьютер считать не так, как предписано программой, а так, как хочется Вам - в добрый час! P.S. Прошу прощения, изначально не тот рисунок вставил. Исправлено. |
|
15.12.2012, 22:33 | #10 (permalink) |
Новичок
Регистрация: 14.12.2012
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Ну это всё моя невнимательность. Извиняюсь
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|