# 情報処理実習 第13回 質問回答ページ ## リンク * [repl.it](https://repl.it/~) - [webEx] ## 質問&回答について 個別で来る質問・コメント等には答えることが出来ず, 授業時間内の質問フォームを通して質問・回答を行うという形式で統一されました. (授業時間外の質問は,次回の授業時間内に質問フォームを通してお願いします) 授業時間ギリギリの質問に気づかないことがあります. 我々が質問に気づいていないと思われる場合は, 次回の授業時間中に再度質問を投稿してください. ### 質問内容に必ず書くこと 質問の際は,必ず下の4点を書いてください. - どの課題に関する質問か - わかっていること - 試してこと - そのうえでわからないこと 「どうしたらいいか?」という質問に答えることは出来ません. 自身で原因を探って意図通りに動くようにするのが実習内容です. 殆どのエラーはググれば説明が出てきます. わからないことが起きた時はGoogle等で検索することを推奨します. 質問の内容によっては,「もう少し自力で考えてほしい(教科書・配布資料をよく読んでほしい,試行錯誤しながら自分のコードを触ってほしい)」「回答を控える」マークを回答状況ページにつける場合があります. 「質問番号n」の形で見出しをつけます. 基本的には新しい回答ほど上位に表示されます. 回答状況ページで回答状況を確認後, Ctrl+F,Cmd+Fで自分の質問番号をページ内検索してください. ただし,回答状況のH列は「回答書き込み完了」ではなく「**今から回答を行います**」の印です. 質問量に依っては「重複した質問」欄の更新が止まる場合があります. そのため,重複した質問は回答の場所を検索出来ないことがあります. また,質問する前に必ずこのページを見て,**類似の質問がないことを確認**してからGoogleフォームで質問を投稿してください. 質問と回答の例は以下の通りです. ### 質問番号0 >hogeがhogehogeの場合,hogehogehogeはhogeですか? <!--質問は引用の形で書いてください--> ```C: main.c #include <stdio.h> int main(void) { printf("Hello World\n"); return 0; } ``` <!--必要に応じてコードや,エラーメッセージを書いてください--> XXXがYYYなのでZZZをAAAするとBBBがCCCです. 重複した質問:質問番号i, 質問番号j,質問番号k <!--学生さんが検索しやすいように, 「重複した質問」欄も「質問番号n」の形で 質問番号を書いてください.--> <!--回答の手間を省くため,回答者と「質問」「回答」の見出しは不要です--> --- <!--他の教員・TAさんと回答が重複することは全く問題ありません. 文量は多いに越したことないので, 気にせず回答をガシガシ書いてください--> <!--基本的にはFIFOで回答をお願いします--> <!--新しい質問に回答した時だけでなく, 「重複した質問」欄に質問番号を追加しただけの場合も, スプレッドシートの「回答者」欄にチェックを入れてください.--> <!--同じ質問が複数の箇所で回答されていることに気づいた方は 積極的にマージしていってください.--> <!--回答を書き終わったタイミングではなく, 回答に取り掛かる段階で「回答者」欄にチェックを入れてください. そちらの方が教員・TAにとって楽だと思います.--> <!--古いものほど下位に表示されるよう,最新の回答を この下に書いてください--> # 質問番号6 > 上から1行ずつ解釈したのですが、どこが間違っているのかわかりません ```[c] for (i=0;i<n;i++) { for (j=n;j<1;j--){ ``` ↑を見てください. iは0からnまでカウントアップしたくて, jはnから1までカウントダウンしたいのだと思います. しかし,そうするとfor文中のi<nとj<1のどちらかは間違っているような気がしてきませんか..? i<nは,「i<nが真(True)の間」という意図で使っているように見えますし, j<1は「j<1が偽(False)の間」という意図で使っているように見えるので, 少なくともどちらか一方は間違っていそうな雰囲気です. for文の使い方について,教科書等で再確認してみてください. # 質問番号5 > このプログラムを実行したのですが何も表示されません。これはなぜなのでしょうか? ```[c] #include<stdio.h> int main(){ int number, i, j ; printf ("0 より大きい数字を入力すると図形を表示\n") ; printf ("数字を入力してください\n") ; scanf ("%d", &number); if(number<=0){ printf("0以下の数値が入力されました\n"); } else{ for(i=number;i<=1;i--){ for(j=i;j<=1;j--){ ~~~略~~~ ``` 答えを書くことは出来ないので,一般的なバグの見つけ方の話です. まず怪しい部分はif-else文のところですが, -1を入力すると「0以下の数値が入力されました」と出力されることから, if-else文は正しく動いていそうなことがわかります. 次に怪しいのはfor文です. 1つめのfor文と2重目のfor文の間にprintf("a")を入れるなどして 1重目のfor文が正しく動いているかを確認してみてください. もしこれで動かなければ1重目のfor文に何かのミスがあることが予想されますし, これで動くなら原因は2重目のfor文以降です. 教科書・過去資料・Google検索で,for文の書き方を再確認してみてください. # 質問番号4 > scanfで実行画面に数字を打ち込むときに今までは入力できていたのが今回は入力ができませんプログラムの方に問題があるのでしょうか プログラムの方に問題があると思います. ```[c] scanf("%d\n",&x); ``` scanf()の使い方について,過去の資料をもう一度見てみてください. # 質問番号3 > 最初の逸話だと1,2,4粒の順番なのですが回答例だと1,3,7,粒の順になっているのですがどちらが正しいですか? 出力は,「n日目に受け取った米粒」ではなく, 「1日目からn日目までに受け取った米粒の合計」をお願いします. 2日目は,1+2で3粒, 3日目は,1+2+4で7粒という意味です. # 質問番号2 > inchとcmの初期値を宣言しても反映されない. ```[c] #include <stdio.h> int main(void) { int inch=40; double cm=101.60; while(cm!=0.00){ 〜〜〜略〜〜〜 ``` コンソール(右側の黒い画面)を上の方にスクロールしていただいたら分かる通り, inchは40,cmhは101.60で初期化されています. ただ,cm==0のタイミングで正しくwhileから抜けることが出来ていません. これは丸め誤差に依るものだと思います. 10進数で10/3が3.3333333・・・となるのと同じイメージで, コンピュータ内部で使われている2進数だと上手く計算できない場合があり, (例えば2進数では,10進数の1/10を割り切ることが出来ないです.) 今回もたまたまcmが0ちょうどにならなかったのだと思います(printf()すると -0.00 と表示され, 0ではないこと(例えば-0.00000001とか)が予想されます.). ですので,cm==0とならなかった場合もあなたの意図通りに動かすためにはどうすればよいかを考えてみてください. # 質問番号1 > if文で作らなければいけませんか? (課題3) 使う使わない、どちららでも問題ありません。 >高澤先生 ありがとうございます.(すぎのうち)