1月31日の業務報告

こんばんは、B2の栗山です。
日陰の道がスケートリンクみたいになっていて、自転車通学に苦労しています。
みなさん、スリップしないように気をつけましょう!
さて、本日の質問と回答です。
===============================
<プログラミング演習II>
Q1. (レポートに関して)、ファイルをプログラム内でどのように読み込めばいいか。
A1. 今回の課題では、リダイレクトでファイルを読み込むことになっているので、プログラムの中でファイルを読み込む必要がないということを伝えました。また、リダイレクトについても一緒に確認しました。
Q2. (レポートに関して)、価格の数字の部分だけ取り出すにはどうしたらいいか。
A2. 教科書のp275, p276を確認してもらったところ、質問者の方が思いついてくれました。
Q3. (レポートに関して)、日本円に変換した価格をハッシュを用いて表示したいが、タイトルと価格が一致しない。
A3. タイトルをキー、日本円に変換した価格を値のハッシュを作成していました。しかし、”日本円の場合”、ハッシュに格納するプログラムが書かれていなかったので、日本円の本に関する表示がおかしくなっていることを指摘しました。
Q4. (レポートに関して)、価格を日本円に変換するメソッドを作ってみたが、エラーがでる。何がおかしいでしょうか。
A4. メソッド定義の仕方とメソッドの呼び出し方が間違っていたので、メソッドについて説明を行いました。
Q5. (レポートに関して)、グループ記号を返すメソッドを作ってみたが、エラーが出てしまう。
A5. 定義したメソッドは正しく動作していました。表示するときに呼び出す配列の変数名が間違っていることが原因でした。
(回答 Q1-Q2:森川、Q3-Q5:栗山)
===============================
今日もプログラミング演習に関する質問が多かったです。
レポート課題も重要ですが、チェック項目も忘れずに取り組んでいきましょう!
プログラミングで躓いた時は、LCに足を運んでみて下さいね。
(文責:栗山)

1月30日の業務報告

こんばんは,M1澤木です。
寒さに耐えられず,炬燵もあるというのに暖房を日常的に入れるようになってしまいました。
さて,今日あった質問は以下の通りです。
======================================
<プログラミング演習II>
Q1. レポート課題の最後の出力する段階で、合計金額を出そうとするとエラーが出る
A1. 文字列と数値を足そうとした際に起きるエラーだと説明しました。コードを見てみたところ、価格を配列に格納して行く際に、日本円への変換の計算が要らなかった場合に文字列のまま格納してしまっていたためにエラーが出ていました。
Q2. ソートをしても実行結果がソートされたものにならない
A2. ハッシュの中身をソートするタイミングがおかしかったのが原因でした。また教科書に載っているソートをしている例をそのまま使っていたが意味はよくわかっていなかったようなので、解説しました。
Q3. 6-11で実行すると正しく結果が出るが、プログラムの作り方が合ってるかわからない(1行読み取って、それをsplitで分割して配列にし、その配列を別に用意した配列に格納していってそれを返す、というやり方でいいのか)
A3. テキストを見たところ、説明がわかりにくかったがおそらくその解釈で大丈夫だろうと返答しました。
Q4. (レポートに関して)、日本円の合計の求め方が分からない。どうしたらよいか。
A4. while内で1行読み込む毎に、価格を日本円に変換しているのでそれを用いて合計を求めることができないか考えてもらいました。教科書p93を参照してもらい、合計を求めるにはどのようなプログラムを書いたらよいか質問者に尋ねたところ、正しいプログラムを思いついてくれました。
Q5. (レポートに関して)、米ドルの合計価格を小数2桁で表示するのに、.roundメソッドを用いたがエラーがでてしまった。
A5. 教科書p503でエラーメッセージの意味を理解してもらい、roundメソッドがprintメソッドの中で用いることができないのかもしれないとアドバイスしました。その後、roundメソッドを用いた値は別の変数に代入すれば表示できるかもしれないことと、printメソッドの中で出力形式を指定するには、sprintfメソッドがあることを説明しました。
Q6. (レポート課題について)ハッシュの中身をタイトルでソートして表示したいが,ソートしてもきちんとソートされず,また,繰り返し文の外で表示を行おうとすると,最後の行の中身しか表示されない。
A6. ソートについては,同様のプログラムを書いてその場で試してみたところ,Hash#sort_byを使うことで解決できそうでした。
 表示の問題については,元々の表示の際のプログラムが,while文の中でのみ有効な変数(繰り返す毎に値を入れ替えてしまうような変数)を利用していたので,そのせいと思われます。while文の外での表示方法に困っていたようだったので,二重ハッシュを調べてみては,と提案しました。
Q7. (レポート課題について)新しいチェックデジットを付け足すのがうまくいかない。concatがうまく動かない。
A7. concatを使うときに変数のままで繋げようとしていたので式展開してみたのですが,別のところでエラーが出ました。本人には,問題の部分のコードのみのプログラムで試して,それでもだめだったら別の部分が絡んでいるのでは,と話しました。
Q8. (レポート課題について)小数点以下2桁,というのは四捨五入していいのか。表示が指定のフォーマット通りにならない。
A8. 小数点以下2桁に関しては特に指定が書かれていなかったので,それでいいのでは,と答えました。
 表示に関しては,ISBNより後の要素をすべてwhile文の中でのみ出力していたので,while文の外でも出力できるよう,変数に値を保存していくときに,二重ハッシュを利用する等の工夫をしては,と提案しました。
回答者:Q1~Q3 北原,Q4~Q5 栗山,Q6~Q8 澤木
======================================
必修科目である「プログラミング演習II」の課題提出締め切りが1週間後に迫っており,その関係の質問が多くなっていました。再履修もできますが,2学期にやった内容が頭に残っている今年のうちに単位を取得できればその方がいいと思います。
がんばってください。
(文責:澤木)

1月27日の業務報告

こんばんは,M1の安永です。
本日の質問と回答です。
===============================================================================
【プログラミング演習II】
Q1.(レポートに関して)チェックデジットの置換ができない。
A1.正規表現を使って変数Aを変数Bに置換しようとしていたのですが,そのときエラーが起きているようでした。元々の文字列を,一度splitで配列にしていたので,その配列を使ってみては?と提案しました。
Q2.文字列の先頭を大文字にするcapitalizeというメソッドはどこでつかえばよいか。
A2.まず,そのメソッドを使いたい文字列はどれか確認しました。その上で,その文字列を変数(ここではハッシュ)に格納する前にメソッドを使うか,変数に格納した後に表示する時に使うかについては,元の文字列を使う操作がないならば前者,あるならば後者がよいと思います,と回答しました。
Q3.本のタイトルのアルファベット順に並べ替える行程を、本のデータを読み込んで分割、変換する行程のなかに入れるとエラーがおきるのはなぜか
A3.並び替えるには、並び替えたいデータが揃う必要がありますよね、と回答しました。
回答者:Q1澤木 Q2-3西野
===============================================================================
待ちに待った金曜日の夜です。
土日にしっかり休んで来週もがんばりたい安永です。
(文責:安永)

1月26日の業務報告

こんばんは,M1の安永です。
春日講義棟の南東側はまだまだ雪が残っていますね。お昼に側を通ったら,講義棟の影と雪の輪郭が同じで,太陽の力ってすごいんだなあ,と実感しました。
本日の質問と回答です。
==================================================================================
【プログラミング演習II】
Q1.(課題に関して)計算したチェックデジットに置換することができない。
A1.後方参照の部分をもう一度見直してみるよう答えました。
Q2.(課題に関して)チェックデジットの計算結果がうまく表示されない。
A2.sortメソッド内でprintメソッドを使用していたため、余計な数字が出力されていることを指摘しました。
Q3.(課題に関して)グループ記号が全て「英語圏」になってしまう
A3.比較元の変数が文字列であるのに対し、変数名 == 0 のようにしていたので、文字か数字に統一しないと正しく条件分岐できないと指摘しました。
また、if 変数 == “0” || “1” と記述していたため、正しくは、if 変数 == “0” || 変数 == “1” と記述する必要があります。
Q4.(課題に関して)チェックデジットの表示が必要以上に何度も繰り返されてしまう。
A4.繰り返し文中のeachの中で表示させていたが原因でしたが、質問者が途中で気付き解決しました。
Q5.(課題に関して)チェックデジットを新しく計算したものと入れ替えたいが、gsubメソッドを使っても上手く行かない
A5.gsubメソッドでは指定した部分全てを入れ替えるので、最後の13桁目だけ入れ替えたい時は「文字列の最後だけ」のような正規表現での指定が必要になります。
Q6.(課題に関して)チェックデジットを新しく計算したものと入れ替えたいが、$13=新しいチェックデジット としても動かない。
A6.後方参照の変数に代入しても元の文字列は変わらないので、元の文字列を置換する必要があると伝えました。
Q7.文字列を分割する方法がわからない
A7.教科書の索引や目次から適したメソッドがないか探してもらいました。
Q8.(課題に関して)ISBNのコードの行末を旧チェックデジットから新チェックデジットに変更したくて,isbn.sub!(/\z/, new_check) としたら,can’ convert Fixnum into String というエラーが出てしまう。
A8.エラーの意味を調べてもよく分からなかったということなので,convert into という英語の意味,Fixnum の意味,String の意味を確認しました。そして,コード中の変数が数値なのか,文字列なのか,を確認しました。
Q9.数値を文字列に変換する方法はありますか
A9.「ruby 数値 文字列 変換」などの単語で検索してみて下さい,と回答しました。
Q10.ソートしたハッシュが1つづつ増えながら表示される(回答者補足:期待する出力はABC, 実際の出力はAABABC)
A10.プログラムを順に説明してもらい,ハッシュに要素を追加するwhile内でハッシュを表示していることに気づいてもらいました。
Q11.ハッシュをソートしてプリントしたら,ソートされてない。
A11.プログラムを順に説明してもらい,ハッシュに値を追加する直前にハッシュを初期化していることが分かったので,どう変更するか考えてもらいました。
回答者 Q1-Q2:森川 Q3-Q7:鈴木 Q8-Q11:安永
==================================================================================
似た質問いくつか出てくるようになりましたね。皆が課題に取り組んでいるんだなーと実感がわきます。質問前にこのブログを見ると,自分で解決できることもあるかもしれませんね。
(文責:安永)

1月25日の業務報告

こんばんは、M1の三津石です。
つくばは本当に寒いですね…。春を心待ちにしております。
本日の質問と回答です。
=======================
<プログラミング演習II>
Q1. (レポートに関して)チェックデジットが計算できない
A1. String#[]メソッド及び、Array#sortメソッドの使い方がよく理解できていないようだったので、メソッドの前後での変数の状態の変化を表示させることでメソッドの挙動を理解してもらうようアドバイスをしました。
Q2. (レポートに関して)ISBNの13桁目とは何かが分からない
A2. ISBNの12桁目までの数字を使って計算されるチェックデジットという数字であることを説明しました。
Q3. (レポートに関して)joinメソッドでのエラーの原因が分からない
A3. 配列に対してjoinメソッドを使おうとしているつもりが、数値に対して使っていたのでNoMethodErrorが発生していましたので、そのことを指摘しました。
Q4. (レポートに関して)チェックデジットを計算すると0になる原因が分からない
A4. “12桁の数字の文字列(例えば””123456789012″”)から後方参照によって各桁の数字の文字列を取得しようとしているつもりが、12桁の数字を格納している変数名をダブルクオートで括ってしまっている結果、予期せぬ挙動を起こしていましたので指摘しました。
# example
num = “123456789012”
/(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)/ =~ “num” # 変数名をダブルクオートで括ってしまっている
p $1.to_i #=> 0″
Q5. (レポートに関して)出力の順序を指定通りにすることができない。
A5. ファイルから読み込んだ行を、配列やハッシュにそのまま格納してあとで利用するという方法があることを指摘しました。
Q6. (レポートに関して)チェックデジットの計算方法がよく分からない
A6. modは剰余を求めるという意味であることを説明し、例を用いてチェックデジットの計算方法についても説明しました。