Задача 7-4: Циклы, не могу понять не получается отобразить обратно

[А] Анатолий Шалобасов, 21 июля 2016, 19:51 , 2 подписчика

Посмотрел ответ, я его понял. Но я пытался делать через цикл while и немного не понимаю, почему у меня не получается.

Я смотрю размер массива и передаю его в число, затем этому числу меняю знак и прибавляя 1 дохожу до последнего элемента, попутно добавляя все эти элементы в массив.

Т.е. по сути как и надо, я беру последний элемент и добавляю его в новый массив, затем предпоследний и т.д. Но не понимаю почему все таки у меня не выдает второй массив и получается не работает второй цикл. Хотя это я все расписал слова наверное вы сразу увидите ошибку в коде.

Обсуждение (5)


Michael Butlitsky Учитель

[M]

Очень хорошо, что ищите свое решение. В реальной работе часто лучше взять готовое проверенное, но для обучения полезнее научиться сперва делать свое.

Ниже код программы с моими комментариями (#MB:), изучите их и попробуйте еще раз.

# первая часть как раньше у нас были задачи , я просто создаю массив с неизвестным размером
puts "введи число N"
chislo = gets.to_i
array = []
i = 0
array1 =[]

#  этой переменной беру размер массива
y = array.size.to_i 
#MB: size уже integer, не нужно to_i делать 
#MB: в данный момент array пуст, нет смысла его размер брать

while i< chislo do
      array << rand(100)
      i += 1
end

# вот в этой части пытаюсь сделать так, чтобы перебором каждый элемент из массива брался, а пото в цикле while же конкретно брался послежний элемент , потом предпоследний и т.д.

# MB: вот этот цикл внешний вообще к чему? 
for item in array do

y = array.size # MB: вот тут теперь y имеет смысл, т.к. array теперь заполнен

# MB: это условие всегда false, поэтому цикл ни разу не выполнится 
# можно while y >= 0 и в теле цикла идти на уменьшение y, cм. ниже 
    while y < 0 
                #MB: y -= 1
                #MB: array1 << array[y]
        array1 << array[-y] 
            y += 1
    end

end

#вывожу массивы но выводяться опять же только начальный массив и пустой массив. Понимаю почему выдается пустой массив но не понимаю почему второй цикл не работает!
 puts "исходный массив: " + array.to_s
 puts "новый массив, полученный из исходного: " + array1.to_s

Попробуйте теперь с моими подсказками сами переписать программу и расскажите что вышло.


Анатолий Шалобасов

[А]

Спасибо понял. Да про массив

for item in array do

немного затупил, но честно говоря тут уже перебором пробовал может хоть что сработает. Очень здорово понял про то что размер массива надо брать , когда он уже наполнился! Только из ваших комментарий одного не понял, почему условие будет всегда ложно?Ведь размер массива изначально положителен и получается что я просто дохожу до того момента когда он становиться 0, отнимаю от него еще раз 1 и он получается отрицательным?Или я не прав? while y < 0 И сделал программу по вашим комментариям , да все верно и все получилось кроме одного момента while y >= 0 тут надо брать строго while y > 0 и тогда будет выдавать все как надо! Спасибо большое!!!


Michael Butlitsky Учитель

[M]

while y < 0 — означает "пока игрек меньше нуля", а если игрек у нас гуляет в интервале от 0 до длины массивы, то отрицательным он не может быть.

Все верно, надо while y > 0 т. к. в теле цикла сначала уменьшаем на единичку, а потом берем массив.


Анатолий Шалобасов

[А]

А теперь понял, да согласен. Извините что задаю такие иногда глупые вопросы, смотрю так сказать не туда куда надо. Если бы сразу понимал то , тогда сразу бы по вашим комментариям понял. Спасибо большое за разъяснения!


Michael Butlitsky Учитель

[M]

Это не глупые вопросы, это вопросы новичка :)