質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

1059閲覧

Rubyのwhile文をfor文で書き直したい(キーボードから読み込んだ値の個数だけ*を表示するプログラム)

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

2グッド

1クリップ

投稿2020/03/08 07:38

Ruby

1print "何個*を表示しますか?" 2n = gets.to_i 3if n > 0 4 i = 0 5 while i < n 6 print "*" 7 i += 1 8 end 9end

上のコードをwhileからfor文で書き直したいのですが(下のコードが書き直してみたコードです)

Ruby

1print "何個*を表示しますか?" 2n = gets.to_i 3if n > 0 4 for i in i > n 5 print "*" 6 i += 1 7 end 8end

Traceback (most recent call last):
Chap04/4-11.rb:4:in <main>': undefined method >' for nil:NilClass (NoMethodError)
というエラーが出てしまいます
どうやったら書き直せるでしょうか?

DrqYuto, s.k👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Rubyにおいては、forとwhileは全く別の機能なので常に書き換え可能ではありません。
(作者のC/C++嫌いの表れのひとつと言ってもいいでしょう)

forは微妙にスコープが異なる問題を除きeachとよく似ています。
正直、使い勝手が悪くなっている上にパフォーマンス的にも微妙に劣化していますので
Rubyにおいてforを覚える必要はありません。

投稿2020/03/09 13:04

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/10 00:10

ありがとうございます! 今「解きながら学ぶJava」という問題集をRubyに書き換えるというやりかたでRubyを勉強してるためこういう質問しました<(_ _)> Rubyではforを覚える必要がないというのは少し安心しました(笑)
asm

2020/03/10 06:31

JavaはC++の系列の言語ですが、RubyではアンチC++的な罠がいくつかあり このwhileとforの変換はそのひとつです。 同じキーワードでありながらforの機能が違うので、そもそも無理があります。 ちなみに他にC++系言語に慣れてる人がハマる罠として思いつくものは、 インクリメント演算子の不在 スペースの有無で式の解釈が変化する事がある private/protected 変数は箱ではなく名札 switch-caseとcase-whenは似てはいるが別 ifなどの制御構造も大体は式 あたりです
退会済みユーザー

退会済みユーザー

2020/03/10 06:39

”switch-caseとcase-whenは似てはいるが別” はこれから特にハマりそうなので要チェックしておきます(`・ω・´)ゞ ありがとうございます<(_ _)>
guest

0

inの後には、繰り返す条件じゃなくて、繰り返す対象を書きます。繰り返す条件を書くのはwhileです。

参考:
制御構造 (Ruby 2.7.0 リファレンスマニュアル)

投稿2020/03/08 07:48

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/08 08:04

print "何個*を表示しますか?" n = gets.to_i if n > 0 for i in print "*" i = 0 i += 1 i >= n end end アンサー受けてこういうコードにしました! が動かないっす もうちょいヒントください<(_ _)>
退会済みユーザー

退会済みユーザー

2020/03/08 08:07

print "何個*を表示しますか?" n = gets.to_i if n > 0 i = 0 for i in i += 1 print "*" i >= n end end 今はこんなコードにしました! 何個*を表示しますか?5 Traceback (most recent call last): Chap04/4-11.rb:5:in `<main>': undefined method `each' for 1:Integer (NoMethodError)こんなエラーコードになっています!
otn

2020/03/08 08:40 編集

「繰り返す対象」と書いたのが、やや曖昧な言葉遣いでしたね。 どういえばいいのだろう? for 日 in 一週間  働く end みたいな感じです。 forの場合は、「繰り返しの方法」(1つずつ足していくとか、Nを越えるまでとか)は書きません。
退会済みユーザー

退会済みユーザー

2020/03/10 00:15

丁寧にありがとうございます! わかりやすかったです???? 今「解きながら学ぶJava」という問題集をRubyに書き換えるという勉強をしていて while文をfor文に書き換えよという問題がよく出てくるためつまづいてこのような質問をしました! ”forの場合は、「繰り返しの方法」(1つずつ足していくとか、Nを越えるまでとか)は書きません。” というのはホント助かるなと思いました(笑)
guest

0

1つ目は質問文のコード、2 つ目は for を使ったコード、 3 つ目は for を使わずに書いたコードです。

s.rb

s.rb

1print '何個*を表示しますか?' 2n = gets.to_i 3if n > 0 4 i = 0 5 while i < n 6 print '*' 7 i += 1 8 end 9end 10puts 11 12(1..n).each do |_i| 13 print '*' 14end 15puts 16 17puts('*' * n)

実行例

イメージ説明

投稿2020/03/09 11:42

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

print "何個*を表示しますか?" n = gets.to_i if n > 0 for i in 0..n-1 do print "*" i += 1 end end

入力
3
出力
何個を表示しますか?**

という感じでどうですか?

投稿2020/03/08 08:08

DrqYuto

総合スコア432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/08 08:42

めちゃくちゃ参考になりました Rubyのfor文は配列やハッシュ、範囲オブジェクトじゃないといけないんすね、、 助かったっす
otn

2020/03/08 08:42

i += 1 は、不要だし、ミスリードですね。
DrqYuto

2020/03/08 08:44

otnさん コメントありがとうございます! 勉強し直します…
退会済みユーザー

退会済みユーザー

2020/03/08 08:44

マジだi += 1なくても動いたっす あざっす!
DrqYuto

2020/03/08 08:49

別解として、 ``` print "何個*を表示しますか?" n = gets.to_i if n > 0 0.upto(n-1){ print "*" } end ``` uptoでもできました…
otn

2020/03/08 08:51

> uptoでもできました… 普通は、timesメソッドでしょうか。
DrqYuto

2020/03/08 08:52

なるほど…勉強になります…
DrqYuto

2020/03/08 08:54

たしかに、 ``` print "何個*を表示しますか?" n = gets.to_i if n > 0 n.times{ print "*" } end ``` timesの方がスッキリしますね!
otn

2020/03/08 09:01

不要ということでは、質問のwhile版コードも含め、if n > 0 も不要ですが、これは意図を明示するために残してもいいかと思います。
DrqYuto

2020/03/08 09:04

たしかに、要りませんでしたね! ``` print "何個*を表示しますか?" n = gets.to_i n.times{ print "*" } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問