Rubyの繰り返し処理の仕方とは?

このQ&Aのポイント
  • rubyの繰り返し処理について教えてください。
  • rubyを使ったプログラムで、表の書き換えをするための繰り返し処理がわかりません。
  • お店の番号を表から探すための繰り返し処理のスコープや変数の使い方がわかりません。
回答を見る
  • ベストアンサー

rubyの繰り返し処理の仕方を教えてください

rubyの繰り返し処理の仕方がわかりません rubyを使ってのプログラムを勉強してます。最終的には表の書き換えをする プログラムがつくりたいのですが最初でコケましたruby イテレーター ネストで検索してもわからなかったので質問します。どなたか お時間あれ ば教えてください。 お店の番号SA003とSA005を次の "SA001",0,10,20,10 "SA003",0,10,20,20 "SA004",0,10,20,100 "SA005",0,10,20,50 の表なかから探すプログラムを作成しようとしましたが。 繰り返し処理の仕方がわかりません変数のスコープが外れていると思いますし dataの行数は4とはかぎらないので 4.times は使えないのはわかるのですが とりあえずイメージ的に描いたプログラムです。よろしくお願いいたします。 ====testimage.rb======== class Shop_number def initialize @mise=["SA003","SA005"] end def tenposuu() return @mise.size end def tenpo_no(n) return @mise[n] end end data =[["SA001",0,10,20,10],["SA003",0,10,20,20],["SA004",0,10,20,100],["SA005",0,10,20,50]] obj = Shop_number.new obj.tenposuu.times do |i| 4.times do |j| if data[j][0]=~/{obj.tenpo_no(i)}/ then puts data end end ======================= =>["SA003",0,10,20,20] =>["SA005",0,10,20,50] と出したいのですが・・・

  • Ruby
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

「何回繰り返す」と考えているのがおかしいです。「このデータすべてについて繰り返す」という風に考えてください。 class Shop_number def initialize @mise=["SA003","SA005"] end def each(&proc) @mise.each(&proc) end end data =[["SA001",0,10,20,10],["SA003",0,10,20,20],["SA004",0,10,20,100],["SA005",0,10,20,50]] obj = Shop_number.new obj.each do |i| data.each do |j| if j[0] == i p j end end end 元のプログラムを出来るだけ変えないとすると、クラス定義はそのままで、メイン部分を、 data =[["SA001",0,10,20,10],["SA003",0,10,20,20],["SA004",0,10,20,100],["SA005",0,10,20,50]] obj = Shop_number.new obj.tenposuu.times do |i| data.size.times do |j| if data[j][0] == obj.tenpo_no(i) p data[j] end end end

yn0323
質問者

お礼

notnot様  ループの考え方を変えるclassの作り方がとても参考になりclass をうまく作るととても便利なのがわかりrubyの勉強すすみそうです ご教授ありがとうございました。

関連するQ&A

  • Rubyでテキストから読みこんで計算するには

    Rubyプログラムを勉強中のものです。 openでテキストを読みこみ、そのテキストの中にある数字を使い、 defで計算するにはどのようなプログラムを作ればよいのでしょうか? 例えばnum.txtがあり、この中には 1.りんご 100円 2.みかん 80円 3.梨 120円 という内容が書き込まれているとします。 これを open("num.txt", "r") do |mise| で開く処理をし、 def fee (fru) fru * 0.5 end fruのなかにテキストに書かれている数字をいれて計算させるにはどのようにしたらよいでしょうか?

  • Rubyのプログラムについて

    Rubyのプログラムについて、宜しければ教えてください。 def fct(n, f=1) if n<=1 then f else fct(n-1, n*f) end end def factorial(n) (1..n).inject{|x,y| x*y} end def factorial(n) eval( [*(1..n)].join("*") ) end このプログラムが、階乗を計算するメソッドになっているみたいなのですが、なぜコレだけで階乗が計算できるのでしょうか? 宜しければ教えてください><

    • ベストアンサー
    • Ruby
  • rubyの誤差

    rubyのプログラムで例えば -------------------------- t=0.00 100.times do t += 0.01 print t, "\n" end -------------------------- のようなプログラムを実行したとき 0.01 0.02 0.03 ......... 0.80 0.81 0.820000000000001 0.830000000000001 ......... 0.990000000000001 1.0 と出力されたのですが、00000000000001の部分を正常に出力するにはどうすればいいのでしょうか?また、このように出力されることが丸め誤差なのでしょうか? どなたか教えてください。

    • ベストアンサー
    • Ruby
  • Ruby バブルソート

    バブルソートのプログラムでわからないところがあるため、 質問させていただきます。 Rubyは1.9.3を使用しています。 <プログラム> --------------------------------------------------- def bsort(data)   while true     # swapped変数は数値の入れ替えを記憶     swapped = false     for i in 0..data.size-2       if data[i] > data[i+1]         temp = data[i]         data[i] = data[i+1]         data[i+1] = temp         swapped = true       end     end     return if !swapped   end end data = [10, 9, 8, 7, 6] bsort(data) puts "ソート結果#{data}" --------------------------------------------------- return if !swapped のところで、 なぜwhileのループから抜けられるのかがよくわかりません。 return if swapped == false と書き換えて実行しても同じ結果が得られたのですが、 数値の入れ替えがなければ swapped = false であるため、 !swappedはtrueとはならないのでしょうか。

  • クラスをシリアライズする(ruby)

     質問はクラスのオブジェクトを、シリアライズしてファイルに保存するプログラムを作成したいのと、シリアライズしたデータベースのオブジェクトを、ファイルから読み込んで復元するプログラムを作成したいと思っています。 そこで、下記のプログラムを使って作りたいのですが、どのように作成したらいいか教えて欲しいです。 是非とも、よろしくお願いします。 class AddressFile def initialize(file) @original = file @meibo = {} fo = open("address_list.txt", "r") lines = fo.readlines fo.close for aLine in lines data = aLine.split @meibo[data[0]] = data[1] end end attr_accessor :meibo def search(name) @meibo[name] end def add(name,address) @meibo[name] = address end def update(name, address) @meibo[name] = address end end 動作環境はruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]になります。 よろしく、お願いします

    • ベストアンサー
    • Ruby
  • rubyの特異メソッド

    Rubyプログラミング入門という本を読んでいた際、 フィボナッチ数列を求めるプログラムが例としてありました。 以下はソースと実行結果です。 def (Fib = [0, 1]).[](n) super || Fib[n] = Fib[n-1] + Fib[n-2] end p fib(30)[0] #=>832040 このプログラムを理解するキーワードは特異メソッドと明記されていましたが、 (Fib = [0, 1]).[](n) や super || Fib[n] の部分がわかりません。 ご教授よろしくお願いします。

  • 【Ruby】マルチスレッドでなくマルチプロセスで

    以下の様なプログラムをマルチスレッドでなくマルチプロセスで実現したいです。 #!/usr/bin/ruby require 'thread' q=Queue.new data=%w(a * * * b * * c * * d * *) data.each do |d| q.push d end (1..4).each do |n| Thread.start { while 1 do d=q.shift break if d!='*' end puts n.to_s+' '+d.to_s }.join end rubyのバーションは ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin10.0] です。バージョンをあげる事は、できれば避けたいです。 実際には上記プログラムの【puts n.to_s+' '+d.to_s】してる所は、ネットに繋いで云々の時間のかかる処理なのですが、まったくパラレルに行なっている様子が無いので、マルチプロセス化したら早くなるかなと思いました。 子プロセスを生成して親プロセスとはパイプで繋いで、、などとするのかなあと試行錯誤したのですが、どうもうまくできません。 ご指導の程、よろしくお願い申し上げます。

    • ベストアンサー
    • Ruby
  • Ruby の 文法に困ってます。

    以下のようなソースの場合、to_sメソッドは何時呼ばれているのでしょうか。またどういう意味を成しているのでしょうか。 Ruby初心者のためご教授頂けないでしょうか。 よろしくお願いします。 class Vector   attr_accessor :x, :y   def initialize(x=0, y=0)     @x = x     @y = y   end   def length     Math::sqrt(@x ** 2 + @y ** 2)   end   def to_s      "(#{@x},#{@y})"   end   def <=> other     length <=> other.length   end end arr =[] arr << Vector.new(2,2) arr << Vector.new(3,2) arr << Vector.new arr.sort.each do |item|   puts item end 結果は以下になります。 (0,0) (2,2) (3,2)

    • ベストアンサー
    • Ruby
  • Ruby での計算

    お世話になります。 Ruby の初心者です。 以下のコードをノートパッドで作成して実行したいのですが、ロードしたのちに数値を代入するとエラーが表示されてしまいます。どこがいけないのでしょうか。 よろしくお願いいたします。 def triarea(w, h) s=(w*h)/2 return s end

  • javaへの変換

    class Integer def prime? n = self.abs() return true if n == 2 return false if n == 1 || n & 1 == 0 d = n-1 d >>= 1 while d & 1 == 0 20.times do a = rand(n-2) + 1 t = d y = ModMath.pow(a,t,n) while t != n-1 && y != 1 && y != n-1 y = (y * y) % n t <<= 1 end return false if y != n-1 && t & 1 == 0 end return true end end module ModMath def ModMath.pow(base, power, mod) result = 1 while power > 0 result = (result * base) % mod if power & 1 == 1 base = (base * base) % mod power >>= 1; end result end end 上記プログラムをjavaで書き直して頂きたく投稿いたしました。 もしよろしければお願いします。

専門家に質問してみよう