С Новым годом! Форум программистов, компьютерный форум, киберфорум
Ruby
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 8

Цикл для массива

16.12.2015, 03:25. Показов 5201. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, форумчане. Начал изучение Ruby, стараюсь закреплять пройденное задачками, попалась одна, никак не могу понять где я ошибся.
Задание следующее: Программа просит ввести сколько угодно слов (пока не нажмешь энтер на пустой строке), а затем выводит их в алфавитном порядке.
Принцип я понимаю: нужен массив, в который будут записываться вводимые слова, цикл, который будет их туда записывать, условие выхода из цикла и метод сортировки. Вот мой кусок кода, поясните почему не работает, пожалуйста.
Возможно проблема в строке с методом push, но я по разному пробовал записать, все равно не работало. После ввода любого значения и нажатия энтер программа закрывается.
Ruby
1
2
3
4
5
6
7
8
mass = []
puts 'Enter words: '
mass = gets.chomp
while mass != ''
    mass.push mass
end
puts mass.sort
system("pause")
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.12.2015, 03:25
Ответы с готовыми решениями:

Почему не работает цикл while для заполнения и do while для вывода массива?
//--------------------------------------------------------------------------- #include <vcl.h> #include <conio.h> #include...

Цикл для массива
Нужен цикл который начиная со 2 строчки 6 столбца будет вставлять формулу (например суммеслимн) и сразу заменять её на значение и так...

Описать цикл для массива
for i:=1 to 10 do for i1:=1 to 10 do for i2:=1 to 10 do for i3:=1 to 10 do for s:='A' to 'J' do ...

9
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
16.12.2015, 08:15
Цитата Сообщение от MrJinn Посмотреть сообщение
пока не нажмешь энтер на пустой строке
Вообще, в таких случаях в нормальных консольных программах принято ожидать EOF.

Цитата Сообщение от MrJinn Посмотреть сообщение
Возможно проблема в строке с методом push, но я по разному пробовал записать, все равно не работало.
Проблема в том, что у тебя в разных частях программы mass сначала трактуется как массив слов, потом как строка, потом опять как массив. Ну или в том, что ввод строки у тебя происходит только один раз.

btw
Code
1
ruby -ne 'BEGIN{$arr = []; puts "Enter words: "}; $arr << $_.chomp; END{puts "Words sorted: "; puts $arr.sort}'
0
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 8
16.12.2015, 20:28  [ТС]
Вообще, в таких случаях в нормальных консольных программах принято ожидать EOF.
Погуглил, но так и не понял как это реализовать в коде. Я пока что совсем нуб, пусть будет энтер на пустой строке.
Проблема в том, что у тебя в разных частях программы mass сначала трактуется как массив слов, потом как строка, потом опять как массив. Ну или в том, что ввод строки у тебя происходит только один раз.
Я вроде поправил что б везде был массив был массивом, а не переменной. Ниже прокомментировал каждую строку как я считаю что она делает. Я знаю, что где-то ошибся, но не знаю где. И почему ввод строки происходит только раз?

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
mass = [] #пустой массив
puts 'Enter words: ' #просим ввести слова
mass = gets # принимаем значем с клавиатуры и записываем в массив
if mass != [] # проверяем что б значение не было пустой строкой
    while mass != [] #запускаем цикл с условием, что массив не пустой 
        mass.push mass #добавляем в конец массива значение, принятое с клавиатуры
    next #начинаем цикл заново
    end #выход из цикла когда введется пустая строка
else #условие для вывода отсортированного массива
    puts mass.sort.to_s #выводим отсортированный массив
end #выход из условия
system("pause") #пауза что б приложение не закрылось сразу по завершению
Добавлено через 1 минуту
Ах да. С таким кодом программа делает следующее: Просит ввести слова, я ввожу одно, нажимаю энтер, она закрывается с ошибкой (которую не знаю как прочитать, ведь закрывается моментально )
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
16.12.2015, 20:49
Лучший ответ Сообщение было отмечено MrJinn как решение

Решение

Цитата Сообщение от MrJinn Посмотреть сообщение
Погуглил, но так и не понял как это реализовать в коде.
Когда программа получает EOF, gets возвращает nil.

Цитата Сообщение от MrJinn Посмотреть сообщение
Ниже прокомментировал каждую строку как я считаю что она делает.
Ну тогда так: пусть вводится слово 'ruby'.
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mass = [] # в переменной mass хранится пустой массив []
puts 'Enter words: '
mass = gets # пользователь вводит слово 'ruby'. Теперь переменная mass — это строка 'ruby\n'
# проверяем, что строка 'ruby\n' (содержимое mass) не равно пустому массиву
# это условие будет ВСЕГДА истинным, т.к. 'ruby\n' != []
if mass != [] 
    # запускаем цикл с условием, что массив не пустой 
    # (напоминаю, что на данный момент mass — это НЕ массив, а строка)
    while mass != [] # см. комментарий про if
        # тут мы натыкаемся на ошибку: 
        # вызываем несуществующий метод #push класса String (т.к. mass — строка 'ruby\n')
        mass.push mass
    next
    end 
else 
    puts mass.sort.to_s 
end
# чтобы приложение не закрывалось, нужно запускать его из консоли
# system здесь — костыль
system("pause")
Цитата Сообщение от MrJinn Посмотреть сообщение
И почему ввод строки происходит только раз?
А сколько раз у тебя в программе происходит вызов gets?

Цитата Сообщение от MrJinn Посмотреть сообщение
она закрывается с ошибкой (которую не знаю как прочитать, ведь закрывается моментально )
Там будет что-то типа такой ошибки:
Code
1
/tmp/main.rb:6:in `<main>': undefined method `push' for "sfasdfaf\n":String (NoMethodError)



Какую могу дать подсказку: если ты присваиваешь переменной строку — то эта переменная становится строкой, а не массивом, и не важно, что до этого ты присваивал ей массив.

Попробуй еще в разных местах своей программы поставить отладочную печать содержимого mass, это сможет многое прояснить:
Ruby
1
puts "mass content (#{mass.class}): #{mass.inspect}"
2
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 8
16.12.2015, 22:55  [ТС]
Ур-ра, товарисчи! Оно живое! Единственное что я не понял это как передать nil. В гугле вроде написано что для винды это Ctrl+Z, но я получаю только ^Z и программа закрывается при нажатии энтер. А с пустой строкой все работает, как в задачке) Прикрепляю рабочий код если кто тоже заинтересуется. Наверное можно это решить проще, но главное что работает.
Спасибо большое, Nameless One за советы, благодаря ним и додуплил.

P.S. Безумно рад что работает, хотя это только начало)

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
mass = [] 
str = ''
puts 'Enter words: ' 
str = gets.chomp
while str != '' or nil
    mass.push str
    str = gets.chomp
end 
if str == '' or nil
    puts mass.sort
end
system("pause")
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
16.12.2015, 23:23
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
mass = [] 
str = '' # это здесь ни к чему
puts 'Enter words: ' 
str = gets.chomp
while str != '' or nil
    mass.push str
    str = gets.chomp
end 
if str == '' or nil # проверка тоже не нужна т. к. у вас это условие является выходом из цикла while
    puts mass.sort
end
system("pause") # выше уже отписали мнение, поддержу
1
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 8
17.12.2015, 00:14  [ТС]
Спасибо, на радостях не обратил внимание на лишние строки)
system убрал, запускаю через консоль
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
17.12.2015, 07:10
Цитата Сообщение от MrJinn Посмотреть сообщение
Единственное что я не понял это как передать nil. В гугле вроде написано что для винды это Ctrl+Z, но я получаю только ^Z и программа закрывается при нажатии энтер.
В Windows для генерации сигнала EOF нужно с начала новой строки нажать Ctrl+Z, затем Enter (ещё в гугле пишут что-то про F6, но я сейчас не могу проверить). В других системах — просто Ctrl+D с начала новой строки.

Условие str != '' or nil эквивалентно str != ('' or nil), что, в свою очередь, эквивалентно str != ''. Если ты хочешь отлавливать ещё и EOF, то условие должно быть примерно таким: str != '' && str != nil.

Только с твоим кодом это опять будет вызывать ошибку. Когда gets получит EOF, он вернёт nil. Далее, будет попытка вызвать несуществующий метод #chomp у nil:NilClass, что приведёт к исключению.

Один из вариантов решения (возможно, не самый лучший) — просто подавить исключение с помощью rescue:

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
 
arr = []
puts 'Enter words: '
str = gets.chomp rescue nil
while str != '' && str != nil
  arr.push str
  str = gets.chomp rescue nil
end
 
puts arr.sort
Или так:
Ruby
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
 
arr = []
puts 'Enter words: '
 
while gets && $_.chomp != ''
  arr << $_.chomp
end
 
puts arr.sort
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 1
05.10.2016, 19:35
все намного проще ведь
Ruby
1
2
3
4
5
6
7
8
mass = []
puts 'Enter words:'
str  = gets.chomp
while str != '' do
   mass.push str
   str = gets.chomp
end
puts mass.sort
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
05.10.2016, 21:57
kotnetrezviy, прокомментируйте, чем ваше решение проще чем
Цитата Сообщение от Nameless One Посмотреть сообщение
Ruby
1
2
3
4
5
6
7
8
#!/usr/bin/env ruby 
# -*- coding: utf-8 -*- 
arr = []
puts 'Enter words: ' 
while gets && $_.chomp != '' 
  arr << $_.chomp 
end 
puts arr.sort
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.10.2016, 21:57
Помогаю со студенческими работами здесь

Цикл для вывода массива
Добрый день, всем. У меня тут появилась проблема, хотел попросить объяснить что я делаю не так. Есть база данных с таблицей grid. Там...

Цикл для сложения элементов целочисленного массива
помогите написать цикл для сложения элементов целочисленного массива, типа a^1+b^2+c^3+...+k^n. при этом все элементы массива могут быть...

Сделать цикл для перебора элемента массива
Добрый день. Помогите, пожалуйста, с проблемой. Ни разу не сталкивался с VB, не судите строго если есть косяки. Проблема такова: есть...

Куда вставить цикл for для количества массива?
У меня двумерный массив. Вызывается он функцией Show. Есть отдельная функция, в которой пользователь указывает кол-во массивов. Вопрос вот...

Не работает цикл для массива (причина в замыкании)
Добрый день. Не могу разобраться с замыканиями в JS/Jquery. В коде необходимо после клика на определенный объект на экране...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru