• 締切済み

Ruby初心者です。

以下の練習問題をやっているのですが、どうもうまくいきません。 (1)担当名が"end"になる迄、担当名と売上を入力する。 (2)売上合計を求める。 (3)各担当の売上が売上合計の何%になるかの比率の計算を行う。 (4)担当名、売上、比率を表示する。 どこがいけないのがご教授頂けますでしょうか。 よろしくお願い致します。 *********************************** #! ruby -E Windows-31J:utf-8 # coding: utf-8 kensu = 0 uriage = 0 goukei = 0 uriage_t = [20] tanto = [10] tanto = [20][10] puts("担当名がendで終了") print(kensu = kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") print("売上") uriage = $stdin.gets.chomp!.to_i while tanto != "end" kensu = kensu goukei = goukei + uriage uriage_t = uriage tanto_t = tanto print(kensu = kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") if tanto != "end" print("売上") uriage = $stdin.gets.chomp!.to_i end end kensu = kensu + 1 goukei = goukei + uriage uriage_t = uriage tanto_t = tanto, "合計" puts "________________________________________" puts "  担当      売上  比率  " puts "________________________________________" for i in kensu kensu += i ritu = uriage * 100 / goukei puts "担当名は#{tanto} 売上は#{uriage_t}円 比率は#{ritu}%" end

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

できるだけ質問者様が書かれたソースをもとに作り直してみました。 以下のようにしてください。 ---------------------------------------------------- #! ruby -E Windows-31J:utf-8 # coding: utf-8 kensu = 0 goukei = 0 uriage_t = Array.new tanto_t = Array.new puts("担当名がendで終了") while true print(kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") if tanto == "end" break end print("売上") uriage = $stdin.gets.chomp!.to_i kensu = kensu + 1 goukei = goukei + uriage uriage_t << uriage tanto_t << tanto end kensu = kensu + 1 uriage_t << goukei tanto_t << "合計" puts "________________________________________" puts "  担当      売上  比率  " puts "________________________________________" (0...tanto_t.size).each do |i| if goukei > 0 ritu = uriage_t[i] * 100 / goukei else ritu = 0 end puts "担当名は#{tanto_t[i]} 売上は#{uriage_t[i]}円 比率は#{ritu}%" end --------------------------------------------------------- 尚、合計が0円の時に、異常終了しますので、異常終了しないように プログラムを修正しています。

全文を見る
すると、全ての回答が全文表示されます。
  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

配列の使い方を理解できれば動くようになると思います。 気になる無駄な処理がかなりありますが、それは他人の書いたプログラムを見て勉強すれば徐々に見やすいプログラムを書けるようになると思います。 ぱっと見で分かる範囲で uriage_t = [20] tanto = [10] tanto = [20][10] 同じ変数名が並んでいます、下の方はtanto_tなのでしょうね。 それと配列を確保したいのだと思うのですが、 uriage_t = [20]では20個の要素を確保するのではなく、20という数値1個が入った配列が代入されます。 このような場合は uriage_t = [] とするのが良いと思います。 先に書いた3行は uriage_t = [] tanto_t = [] とします。 tanto = [10]は後でtantoに代入されますので必要ありません。 uriage_t に保存したいとすると uriage_t << uriage で配列に追加されていきます。 あとは省略しますが、考えてみてください。 Ruby用のデバッガを使えば、一行ずつ実行して結果を確認することができますので、 利用してみてください。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.1

何もかもおかしい。あなたにはその問題は難しすぎます。 とりあえず、 (1) 以下を繰り返す (2) 数字を入力する。0が入力されたら今までの合計を表示して終わる (3) 入力された数字を合計する をやってみてください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • rubyで標準入力とファイルからのgets

    ActiveScriptRuby v1.8.5でやっています。 実行時にコマンドラインでファイル名を与えてファイルの内容を取得した後、氷人出力からも入力をとろうとしています。しかしファイルの内容を読み出したあとのgetsがnilを返すだけで標準入力から入力をとれません。以下のようなコードでやっています。 ##stdin.rb while line = gets do print line break if line.chomp.empty? end puts' - ' print gets #ここで標準入力から文字をとりたい 実行時は ruby stdin.rb moji.txt という感じで読ませたいファイル名を渡しています。 マニュアルには 最後まで ARGF を読み込んだ後、再度 ARGF から内容を読むと (ARGV が空なので)標準入力からの読み込みとなります。 とありますが、どこがおかしいのかさっぱりわかりません。 アドバイスなどよろしくお願いします

  • Rubyの引数が理解できません。(初心者です)

    プログラミング言語を覚えたいと考え、諸々の事情からRubyを独学したいとおもっております。 先日、「14歳からはじめるRuby…」という本を購入し、早速勉強を始めたのですが、引数でいきなり躓いてしまいました。 以下のような例文がありましたが、原理(理屈?)が理解できません。ご教唆お願いします。 001 def syomei s 002  puts "" 003  puts "============" 004  puts "" + s 005  puts "============" 006 end 007 puts "What's your name?" 008 name = gets.chomp 009 puts "Hello," + name + "!" 010 syomei name なぜ、これでメソッドの中へ変数が引き渡されるのかが理解できません。 「008 name」で初めて出てくるnameと引数"s"が何故イコールになるのでしょうか? 例えば(全くのデタラメですが)、「010 syomei name.s」であったり「010 syomei name = s」などのように定義付けされているのであれば、納得できるのですが…。 初歩中の初歩なのはわかっているのですが、理屈を理解したいと思ってます。よろしくお願いします。

  • SQLについて質問します

    VB2010 とSQL Server2008 R2 で開発をしています。 担当者テーブル(table_tanto)と売上明細テーブル(table_uriage_meisai)があります。 各テーブルのカラムは以下です。 table_tanto ・tanto_id ・tanto_name table_uriage_meisai ・meisai_id ・tanto_id ・kingaku ・date ある期間の担当者別の売上実績を一覧で出力したいと考えています。 「table_uriage_meisai」の「date」で範囲指定したいと思います。 結果はこんな形を望んでいます。 担当者ID 担当者名 売上合計 0001   ○○○   ****** 0002   □□□      0 0003   △△△   ****** 0004   ●●●   ****** 2点質問があります。 売上の無かった担当者も含めてすべての担当者の一覧を出したいと考えています。 そのSQlがわからないのと、売上がなかった担当者はその列がNullになってしまうと思うんですが、後の計算で困ります。 Nullのときゼロを返すようにするにはどうしたらよいでしょうか。 以上2点について教えて下さい。 よろしくお願いします。

  • Ruby 暗号化したファイルの復号について

    Rubyでファイルを暗号化し、それを復号したいのですがうまくいかないため、 質問させていただきます。 Ruby 1.9.3を使用しています。 ・ファイルの暗号化 encrypt.rb ------------------------------------------------- # encoding: cp932 require 'openssl' def encrypt(file, pass)   enc = OpenSSL::Cipher::AES256.new('CBC')   enc.encrypt   enc.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.sec", 'wb') do |fout|       while buff = fin.read(8000)         fout.write(enc.update(buff))       end       fout.write(enc.final)     end   end   enc.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       encrypt(arg, pass)       puts "#{arg}を暗号化したファイル#{arg}.secを作りました。"     rescue       puts "#{arg}の暗号化に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- ・ファイルの復号 decrypt.rb ------------------------------------------------- # encoding: cp932 def decrypt(file, pass)   dec = OpenSSL::Cipher::AES256.new('CBC')   dec.decrypt   dec.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.plain", 'wb') do |fout|       while buff = fin.read(512)         fout.write(dec.update(buff))       end       fout.write(dec.final)     end   end   dec.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       decrypt(arg, pass)       puts "#{arg}を復号したファイル#{arg}.plainを作りました。"     rescue       puts "#{arg}の復号に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- コマンドプロンプトでencrypt.rb自身を暗号化し、encrypt.rb.secの作成はできるのですが、 decrypt.rbを実行してパスワードを入力しても復号ができません。 どのようにすれば復号できるのか教えていただけますでしょうか。

    • ベストアンサー
    • Ruby
  • Rubyの初心者ですが壁にぶちあたっております

    『初めてのプログラミング』を読んでRubyを勉強しています。その中にある問題でp.127の『ローマ数字をアラビア数字に変換するプログラム』を書け、というのがありまして、最初に入力したローマ数字を弾く部分を書いているのですが…(以下コード) puts 'Enter roman numeral.' roman = gets.chomp.upcase roman_array = roman.to_a def char_checker(char) parts = ['I', 'V', 'X', 'L', 'C', 'D', 'M'] parts.each do |part| if part != char char = false elsif part == char char = true return char end end puts char_checker('X') (以上コード) このchar_checker, なぜかpartsを返してきます。返してほしいのはcharのtrueかfalseなのに泣 書いたコードに間違いがあるのはわかっているのですが、どこで間違っているのかがどうしてもわかりません。わかる方回答よろしくお願いします。ちなみに環境はMac OS X 10.5.4でrubyのバージョンはバンドルされている1.8.6です。

  • 検索対象を変数に与えてマッチング

    Rubyの初心者です。次のサンプルがマッチングできない、 書き方を教えてくださいませんか。 #!/usr/bin/env ruby key = "キーワード" while gets $_.chomp! puts $_ if $_ =~ /"#{key}"/ end puts 文を puts $_ if $_ =~ /キーワード/ に書き買えば、検索はできますが、変数に与えてマッチング することはできないでしょうか。 ご教示を宜しくお願いします。

    • ベストアンサー
    • Ruby
  • Rubyでの比較 (Float)

    Ruby初心者です。 簡単な比較を行いたいんですが、エラーが出てしまいます。 ファイルに ex. ruby_test.rb 0 12.3243 32 112.233 0.33123 とあり、このファイルを読み込んで比較しようとしています。 以下のコードで比較しようとしました。 ----------------------------------------------------------- fp = open("c:/ruby_test.txt") aaa = Array.new while line2 = fp.gets line2.chomp! bbb = line2.split(/\t/) aaa << bbb[1] if ( bbb[2] < 1.301029996 ) then       ※11行目 print "aaa\n" elsif ( bbb[2] < 8.164943898 ) then print "bbb\n" elsif ( bbb[2] >= 8.164943898 ) then print "ccc\n" end end fp.close -------------------------------------------- 実行すると ( ※ **** はファイル名 ) C:/ruby/*******.rb:11:in'<': comparison of String with Float failed (Argument Error) というエラーが出ます。 比較する  bbb[2] < 1.301029996  を bbb[2] < "1.301029996" すれば 動きますが、これでは文字列としての比較になってしまいますよね?? Floatは数字として比較するにはどうしたらよいのでしょうか? どなたか宜しくお願いします。

  • Rubyのgets関数について

    以下のプログラムを実行して、コマンドプロンプトからsと入力してEnterを押すと、differentと表示されます。sameと表示されることを期待しています。何が原因なのでしょうか?環境はWindows2000です。よろしくお願いします。 i = gets t = "s" if i == t print "same" else print "different" end

  • なぜRuby1.9が日本語処理できない問題

    次の簡単なRubyプログラム(test.rb)ですが、 #!/usr/bin/env ruby # -*- coding: utf-8 -*- while gets $_.chomp! tmp = $_.split(/ /) s0 = tmp[0] s1 = tmp[1] s2 = tmp[2] puts "line #{s0}\t#{s1}\t#{s2}" end 入力テキストファイル(hello.txt)は次の2行です。 1 hello, everybody! 2 皆さん、 こんにちは。 test.rb hello.txt を実行すると、Ruby 1.8.7 は問題なく正常ですが。Ruby 1.9.3は次のエラーになりました。 line 1 hello, everybody! k1.rb:7:in `split': invalid byte sequence in US-ASCII (ArgumentError) from k1.rb:7:in `<main>' 何故でしょうか。詳しい方に教えて頂けるでしょうか。 どうぞ宜しくお願いします。

    • ベストアンサー
    • Ruby
  • RubyによるExcelファイル出力

    お世話になります。現在、以下のプログラムにて、指定対象のセル範囲を画面出力しております。また、画面出力以外で、プログラム対象となったファイル名がExcelにて出力されるようにしておりますが、 "puts sheet.Range('C15:C50').value" にて表示している内容を出力エクセルにも記載したいと考えているのですが、うまい方法はないでしょうか。 ご教示頂ければ幸いです。 # excel_data_gets.rb t = Time.new create_inf = t.strftime("%Y%m%d%H%M") log_a = ".xls" out_log = ("#{log_a}#{log_d}") chk_value_log = File.open(out_log,"w") # require 'win32ole' def getAbsolutePath file fso = WIN32OLE.new('Scripting.FileSystemObject') fso.GetAbsolutePathName(file) end def getFuncData file file = getAbsolutePath(file) $excel.visible = FALSE book = $excel.Workbooks.Open(file) sheet = book.Worksheets(1) puts sheet.Range('C15:C50').value book.Close end $excel = WIN32OLE.new('excel.Application') ARGV.each{|file| if file.length > 0 chk_value_log.print file.sub(/\.xls/,"") + "\n" # -> ワイルドカード展開用 chk_value_log.print getFuncData(file) end } $excel.Quit chk_value_log.close