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

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

ただいまの
回答率

88.92%

Ruby 変数の定義

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,059

King_of_Flies

score 314

Ruby初心者です。
(初心者を名乗っていいのかすら微妙)

http://www.str.ce.akita-u.ac.jp/~gotou/zyouhou/ruby/#f902

今回、こちらのサイトを使用して、
ユーザのinputを受け付ける簡単なやり方を勉強中です。

まぁreadlineとかeclipseかどっかで見た記憶があるのですぐ使えたのですが、

tanpen=2;cyouhen=1
while tanpen > cyouhen 
 print "長方形の短辺を入力してください。\n"
 tanpen = readline.to_f
 print "長方形の長辺を入力してください。\n"
 cyouhen=readline.to_f
 print "短辺が長辺より長い場合は計算しません。\n"
end 
 menseki=cyouhen*tanpen
 print "長方形の面積は:",menseki,"\n"

まぁ、やりたいことはわかるし whileの使い方は分かったのですけど、
一番最初でtanpen=2;cyouhen=1をこのサイトだと宣言してますが、
こういうwhileの式にたどり着くまでの変数って、値を仮に入れておくのが正しいやり方なのですか?

この場合だったら

print "長方形の短辺を入力してね"
tanpen = readline.to_f
print "長方形の長辺を入力してね"
cyouhen = readline.to_f

while tanpen > cyouhen
  print "短辺が長辺より長いという謎事象が起きてるよ!もう一回入力してね。"
  print "長方形の短辺を入力してね!短辺だよ!"
  tanpen = readline.to_f
 print "長方形の長辺を入力してね!長辺だよ!"
  cyouhen = readline.to_f
end

menseki = tanpen * cyouhen
print "長方形の面積は",menseki,"だよ\n"

のほうが良いと思ったのですけど。

ただRubyって値の代入で変数の型を決めてるみたいなので、
あえてtanpen = 2;cyouhen = 1を入れてintだと宣言してるのかな?と思ったり。

参考にするサイトを間違えているか、
僕が間違えているか。(まぁ僕の適当に作ったので冗長的な感じが否めないけど)

あと 改行に関して 

print "長方形の面積は",menseki,"だよ\n"


でも、

puts "長方形の面積は",menseki,"だよ"


でもいいと思うのですが、一般的にどちらですか?

【追記】
処理結果について質問

今回ユーザの入力で短辺*長辺を計算して面積を出してますが、
出力される面積がdoubleっぽいです。

短辺で5 長辺で6と入力すると、
面積が30.0と出力されます。
30で出力したい場合はどうすればよいですか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

最初に変数宣言してInt型に指定したいと言う思惑があるにすれ、のちの.to_fでfloat型に変換してしまってるのでよくわからないコードですね。
改行を伴う文字列の出力の際には
puts hogehoge
これでいいと思います。

print hogehogeですと文字列が改行されずに横並びに出力されてしまいます。
あとwhileの際に再び

print "長方形の短辺を入力してね!短辺だよ!"
  tanpen = readline.to_f
 print "長方形の長辺を入力してね!長辺だよ!"
  cyouhen = readline.to_f


と記述するのはDRYに反しているので

自分がこのコードを書くとしたら

class Squea
  attr_accessor :tanpen, :cyouhen

  def initialize
    @tanpen = 0
    @cyouhen = 0
  end

  def self.getter
    puts "長方形の短辺を入力してね"
    @tanpen = gets.to_f
    puts "長方形の長辺を入力してね"
    @cyouhen = gets.to_f
  end

  getter
  while @tanpen > @cyouhen
    puts "短辺が長辺より長いという謎事象が起きてるよ!もう一回入力してね。"
    getter
  end

  menseki = @tanpen * @cyouhen
  puts "長方形の面積は#{menseki}だよ"
end

これでいいと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 16:45

    一番やりたいような、コードが記載されていたためBAとします。

    キャンセル

+1

好みの問題かなぁと私は思います。
最初にtanpen=2;cyouhen=1と書くやり方なら
whileの中と同じtanpen = readline.to_fを
書かなくてよいという感じではないでしょうか。

print "長方形の面積は",menseki,"だよ\n"に
ついては特に意味はないと思います。

printは他の言語でも見かける書き方なので
そっちの方が親しみやすいみたいな。
(もしくは'\n'で改行できることを示したかったとか)

補足

ちなみに私なら

# encoding: utf-8

loop do
  puts '長方形の短辺を入力してね'
  t = gets.chomp.to_f
  puts '長方形の長辺を入力してね'
  y = gets.chomp.to_f

  if t < y
    puts "長方形の面積は:#{t * y}"
    break
  end

  puts '短辺が長辺より長い場合は計算しません。'
end


こんな感じで。

p '1'.to_f # => 1.0
p '1'.to_i # => 1

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 16:44

    to_fって、そういうルールなのかと思ってましたけど、floatの意だったのですね。

    勉強になりました。!

    ・・・。短辺長辺に矛盾合っても、menseki出力されるんじゃ?と思ったのですが気のせいですよね・・?

    キャンセル

  • 2017/05/11 17:53 編集

    next以降は実行されないでloopが回るので、mensekiに矛盾(t > c)がある状態でmensekiが表示されることは恐らく無いと思いますが。

    キャンセル

  • 2017/05/12 15:24

    nextについて調べて、自分の勘違いだったことに気づきました。
    すいません。
    てっきり次の行の処理を飛ばすものだと思っていて不便やなぁと思っていました。

    キャンセル

+1

=begin

自分は、値を受け取る際は、paizaで勉強したgetsを使っています。
コードにすると、#参照1: みたいになりますが、確認したところどっちでも問題なさそうです。
使いやすい方法でやるのがいいと思います(個人的偏見)

また、改行に関してですが、printは開業しないまま出力する。putsは開業して出力する。
pは出力コードをそのまま表示するという違いがあります。

コマンドプロンプト(ターミナル)でやる分には、putsで開業してくれるので問題ないと思います。
もちろん、¥nでもできますので、使いやすい方を利用するといいかと思います!

ちなみに、最初に値に直で変数に入れているのは、多分分かりやすくしているだけかと・・・

一般的にはイメージできているなら  いきなりreadline(gets)でも問題ないと思います。

=end

参照1

print "長方形の短辺を入力して下さい\n"
tanpen=gets.to_f
print "長方形の長辺を入力して下さい\n"
tyouhen=gets.to_f
if tanpen > tyouhen then
print "短辺が長辺より長いので計算しません\n"
else
menseki=tyouhen*tanpen
print "長方形の面積は:",menseki,"\n"
end

補足

ちなみに私はこう書きました。

loop do
  puts "長辺を入力してね"
  tyouhen=gets.chomp.to_f
  puts "短辺を入力してね"
  tanpen=gets.chomp.to_f
  puts "短辺が長辺より長い場合は計算しません"  if tyouhen<tanpen
  puts "短辺より長辺を長くしてください。"  if tyouhen==tanpen
  break if tyouhen>tanpen
end

puts "長方形の面積は#{tyouhen*tanpen}です。"

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こういうのは、N+1/2ループなので、素直に「無限ループ+break」で書くのが良いと思います。

loop do
  print "長方形の短辺を入力してください。\n"
  tanpen = readline.to_f
  print "長方形の長辺を入力してください。\n"
  cyouhen=readline.to_f

  break if tanpen <= cyouhen

  print "短辺が長辺より長いという謎事象が起きてるよ!もう一回入力してね。\n"
end

ループ途中からの脱出機能が無い言語だと、フラグを使うか、takkoさんの書き直したように同じ事を2回書くか迷うところです。

また、

あと 改行に関して 
でもいいと思うのですが、一般的にどちらですか? 

これは表示のされ方が違いますね。putsは引数が複数個の場合に、引数ごとに改行しますので、後者じゃ駄目です。

一般的には、

puts "長方形の面積は#{menseki}だよ"


でしょうか。

あと、入力文字列をto_fでdouble型に変換しているので、計算結果もdoubleになります。
整数で計算したければ、to_fでなくto_iして計算するか、doubleで計算後に整数に丸めます。

getsでなくreadlineを使うあたりも結構独特ですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/11 16:50

    あぁ、こっちをBAにすべきだったのかもしれないと思う程度には完結なプログラムですね・・・。
    説明も分かりやすい。

    BAつけた後に見たので間に合いませんでした。

    あとputsは引数ごとに改行するということを始めて知りました。

    お勉強になりました。

    puts "面積は#{menseki}だよ"
    って記述をすると、引数を一つとしてみてくれるってことでいいですよね?

    高評価させていただきます。
    ありがとう。

    キャンセル

  • 2017/05/11 17:12

    先こされてしまいましたw
    流石ですね…

    変数展開は確かにすごく使いますね…
    ループ分は確かにたくさんあるので、目的によって使い分け。というのがベストプラクティスですよね。。。

    開設の方、勉強になりました!

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る