IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Одномерный массив из ЕГЭ, определить значение переменной
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 1
Пол: Мужской

Репутация: -  0  +


В одной из книжек с демоверсиями ЕГЭ я нашел простенькую на первый взгляд задачку:
Дан одномерный целочисленный массив А с индексами от 1 до 10.
Фрагмент программы:
 for i:=1 to 10 do
A[i]:=i-1;
for i:=1 to 10 do
A[i]:=A[11-i];

Необходимо выяснить, как будет выглядеть массив после изменения значений его элементов.

Как определить элементы в первом цикле ясно: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
И как получить первую половину чисел после выполнения второго цикла тоже понятно: 9, 8, 7, 6, 5.
Но вот потом при прогонке этого фрагмента на компьютере результат начинает увеличиваться, следующие пять цифр получаются 5, 6, 7, 8, 9. Почему? Почему это 11-i дает такой результат? Почему элементы массива уменьшаются только до половины? Никак не пойму... Может ли кто-нибудь объяснить пошагово поведение этого алгоритма? Заранее благодарен.

Сообщение отредактировано: Tom -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 195
Пол: Мужской
Реальное имя: Сергей

Репутация: -  2  +


Всё очень даже просто, стоит только пробежаться по шагам и посмотреть то, как будет изменяться массив во втором цикле:
после первого цикла мы имеем следующую последовательность: "0 1 2 3 4 5 6 7 8 9"
1) Далее a[1] := a[11-1], то есть будет "9 1 2 3 4 5 6 7 8 9"
2) a[2] := a[11-2], будет "9 8 2 3 4 5 6 7 8 9"
и т.д. до середины будет происходить изменение "9 8 7 6 5 5 6 7 8 9"
Во всех остальных случаях будут сравниться одинаковые элементы массива 6-6, 7-7 и т.д.


--------------------
♣♣♣
"Себя великим не считай, гордясь величьем предков,
Величья не добудешь ты и золота ценою!
Хоть светит на небе луна, но отраженным светом -
Чужою славой не живи, не будь второй луною!!!"
♣♣♣
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Все правильно, только тут:
Цитата(Cheburashka @ 27.01.2011 21:44) *
Во всех остальных случаях будут сравниться одинаковые элементы массива 6-6, 7-7 и т.д.
- ты, наверное, имел в виду "присваиваться"..

У меня сложилось впечатление, что автор топика не совсем понимает саму операцию присваивания. Хотя, может, я и не прав. Но я встречался с такой ошибкой и раньше. Сейчас попробую объяснить, что я имею в виду..

Допустим, у тебя есть два кармана. Это массив, назовем его K, и в нем 2 элемента. Левый карман - это элемент K[1], а правый - элемент K[2]. Допустим, у тебя в левом (то есть первом) кармане апельсин, а в правом (втором) - яблоко. Причем, в каждый карман помещается только один фрукт (нельзя записать два числа в один элемент массива типа integer).

Допустим, ты делаешь присваивание:

K[1] := K[2];

Что это означает?
В реальной жизни ты вынимаешь из второго кармана то, что там лежит, то есть яблоко (при этом карман остается пустой), и пытаешься его засунуть в первый карман - но оно не лезет туда, поскольку там уже лежит апельсин. Если это действительно РЕАЛЬНАЯ ситуация, в которой тебе НУЖНО переложить яблоко из одного кармана в другой, то ты вынешь апельсин из первого кармана и положишь туда яблоко. Но апельсин пока остается в руках.. Куда его деть? Ну, второй карман же свободен! Положим его туда smile.gif.

Таким образом, мы получили неявно совершённый ОБМЕН содержимым. И это совершенно нормально для реальной жизни - не обращать внимание на то, что на самом деле кроме перекладывания яблока была совершена еще одна операция - перекладывание апельсина. Но в программировании все совсем не так..

Когда совершается операция присваивания, то:
1. В переменной, ИЗ которой присваивается, содержимое НЕ ИСЧЕЗАЕТ. Это эквивалентно тому, что ты берешь яблоко из кармана, а в кармане все равно остается яблоко. Переменная никогда вообще не бывает ПУСТОЙ.
2. В переменную, уже содержащую число, другое число положить МОЖНО. Но при этом первое число исчезнет. Оно будет затерто новым чилом. Это как если бы ты клал яблоко в карман, где уже лежит апельсин, и после этого а этом кармане лежало бы яблоко (без апельсина).

Теперь переходим к числам. Пусть в K[1] лежит 1, а в K[2] лежит 2:

1 2

Выполняем присваивание:

K[1] := K[2];

После этого в K[1] лежит 2 И в K[2] тоже по-прежнему лежит 2:

2 2

При этом 1 не лежит нигде. Это число стерто и потеряно.
Последующее присвоение в обратном порядке:

K[2] := K[1];

- не изменит абсолютно ничего: число 2 будет переложено и заменено на точно такую же 2-ку. То есть в обеих переменных (элементах массива) лежат 2-ки:

2 2

Если задаться целью все-таки ПОМЕНЯТЬ местами содержимое переменных, то нужны некоторые специальные действия (например, перкладывание через буферную переменную).

Это рассмотрение было с массивом меньшего размера (не 10, а только 2), но принцип остается тот же. Вообще, очень рекомендую при решении задачи ее максимально упрощать (не теряя при этом сути, конечно).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 18:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name