Паскаль АВС. Задача с массивами
Помогите решить задачу. Условие:
Поменять местами первое положительное число с последним отрицательным в одномерном массиве из целых чисел. Менять местами желательно используя дополнительную переменную :tehnari_ru_942: Я бы скинул вам свой вариант, но мне нельзя размещать ссылки, и по величине не подходит изображение. |
Вложений: 1
Цитата:
Код:
Const |
Спасибо, я понимаю, что это для вас просто, но я 9 класс, и вот только месяц мы изучаем массивы.
Ещё раз спасибо. |
Цитата:
А Вам - успехов. Обращайтесь, если что - поможем. |
Мой вариант таков:
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. Скажите пожалуйста, в чём недочёт, не проходит по времени. |
Сергей, у Вас в программе две грубейших ошибки, одна техническая, вторая - смысловая. Обе они в строках:
Цитата:
1. Вместо того, чтобы при выполнении условия присвоить переменным p и o значения переменной цикла i, Вы поступаете ровно наоборот: переменной цикла присваиваете значения p и o, изначально не заданные и, следовательно, по умолчанию нулевые. Результат: цикл летит в тар-тарары. 2. Это уже серьёзней. Ведь не зря в моей программе применен не for..to..do, а repeat..until. Сделано это отнюдь не по скудоумию моему, как Вы, очевидно, решили, а вот зачем: как только в первом цикле программа находит положительное число, а во втором - отрицательное, циклы необходимо прервать. Иначе перезапись будет продолжаться до конца, и в результате программа найдет ПОСЛЕДНЕЕ положительное и ПЕРВОЕ отрицательное числа. В принципе прерывание можно организовать и в циклах for..to..do, хотя я подобным стараюсь не пользоваться, так как полагаю такой стиль программирования изрядно дурным. Но, если угодно, то пожалуйста: вот исправленный вариант: Код:
Var Код:
Var |
Спасибо, я понял. И по моему, всё таки, когда мы просматриваем элементы массива, компьютер находит первый элемент, соответствующий условию и запоминает именно его, а остальные не смотрит. при выполнении программы получилось именно так.
И я не в коем случае не думаю, что вы плохо знаете программирование. :tehnari_ru_942: |
Значит я исправил первую ошибку. И всё получилось отлично. Просто переменным присвоил значение индексов, а не наоборот, как было сначала.
На счёт нюансов с числами одинаковых знаков: спасибо за замечание, но пока мне это не обязательно. Спасибо. |
Вложений: 1
Цитата:
Ладно. Запустил Вашу программу, исправив лишь присваивание значений 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. А вот результат, полюбуйтесь: Вложение 111085 И что, это, по-Вашему ПЕРВЫЙ положительный и ПОСЛЕДНИЙ отрицательный элементы? А по-моему, всё с точностью до наоборот. Что я Вам и пытался объяснить. Но, впрочем, если Вы обладаете магическим даром заставить компьютер считать не так, как предписано программой, а так, как хочется Вам - в добрый час! :D P.S. Прошу прощения, изначально не тот рисунок вставил. Исправлено. |
Ну это всё моя невнимательность. Извиняюсь :)
|
Часовой пояс GMT +4, время: 08:07. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.