JAVAの話。

投稿アップデート情報  追記(9/27)

 TODOSでの話だが, JAVA のプログラミングについて,初歩の初歩の質問があって,回答のプログラムを書いた。こんなの ( Enzan.java )。

 何しろ,生まれて初めて,ネットを拾い読みしつつ組んだプログラムなので,引き算の答えが負になる場合の処理とか,エラー処理とかなにもやっていないが,まあ,初歩の初歩の回答としては,そのほうがゴチャゴチャしないでわかりやすいかもしれない。プログラムのチェックは, jdk-7u40-nb-7_3_1-windows-i586.exe でやった。

 で,昨日,次のものとして, for 文の使い方についての質問があった。 TODOS に回答を書けばいいようなものの,スレッドの流れからどうも書きにくくなってて,JAVA の勉強にはなるから,ここに書いてしまおうかと。

 ところで,質問文中に「実行結果があやふやなことになりました」とあるが,締めくくりの } が2つないのもさることながら,これでは,実行以前にコンパイルが通らないと思うのだが,実行というのをコンパイルの意味で使っているのだろうか。しかし,コンパイルでははっきりエラーメッセージが出るはずだから,「あやふや」という表現は当たらないよなあ。

 質問文中のプログラムには,まず,何よりもまず最後に } が2つ必要である。さらに,変数の型宣言が for ループの中に入ってしまっているから,これを外に出さないといけない。こんな具合 ( Sample1.java )。これで,コンパイルは通る。これは,私の間違い。もう一度確認してみた。型宣言が中にあっても,一般には通る。しかし, for ループの中が空のときは通らないようだ。
 さらに,追記(汗)―― Sample2_1 は通るが, Sample2_2 は通らない。考えるに, JAVA のコンパイラはお利口さんで, for ループが空だと実質何も行わずに無視するのだろう。したがって,インデックスの宣言と値代入が同位置だと, for ループが空の場合,そこが無視されているから,型宣言が行われていないことになって,あとの print 文の変数が未宣言になってエラーが出ると見た。多分,これで正解。したがって,通常は,インデックスの型宣言は for 文の中で構わないことになる。――追記,ここまで。

 しかし, (int i=1; 1/i<=500; i++) ってどういう意味だろう。多分,条件と for ループの中でやるべき処理とがごっちゃになったんだろう。しかし, 1/i で i が int だと計算結果も int で 1/2 からはずっと 0 になるわけだから,ナンジャラホイということになってしまう。プログラムを実行可能にするためには,せめて, (int i=1; i<=500; i++) じゃないといけない ( Sample2.java )。

 さて,空っぽの for ループの中になにか処理することを入れないといけない。 i をインクリメントさせて, 1/i を加えていくわけだから,計算結果を記憶させる変数が必要だ。彼の考えに沿って行くと, int j=0; を宣言しておいて使うということになるだろう ( Sample3.java )。しかし,これの実行結果は, 1 になる。ここまで来て,「実行結果があやふやなことになりました」というんなら納得できるんだけどな。なんでこんな結果になるかというと,型が int だからだ。 i が整数型だから, JAVA だと, Sample3.java の 1/i の場合, 1/1 以外はすべて 0 になるはずだ。

 追記(9/26): (float)i と明示的に書いてやると, 1/(float)i の結果が float になることを知った。

 この手の計算なら,小数を扱う必要があるから, float か double を使うべきだろう。桁落ちの発生する float や double での 1 + 1/2 + 1/3 + … + 1/500 の計算結果は,誤差が大きくなって大変にまずいわけだが,初級レベルのプログラミングの for 文の使い方でそんなところまで要求するとは思えないから, float でも使っておけばいい。実行結果は, 6.7928243 になる ( Sample4.java )。

 しかし,今回の質問の文章にも,彼は全く悪びれたところがない。この間,りりさんが,「このまま去れられると、別のご相談をしたくなったとき、もう、ここでは応えて貰えないと思いますよ。」と書かれていたのに,この書き方ということは,彼の中では,もう一度来たから「このまま去った」わけではないということなんだろうな。よー分からんが,そういうことなんだろう。

 初心者の場合,相談後,教えてもらったことを使って実際の手順がうまくいっても,掲示板の今後の利用者のために結果を詳細に報告と言われても,どう書けばいいかわからないということはある。だから,「解決しました」しか書かない,いや書けない投稿者も存在する。だからそれはそれでいいのだが,前回の文章に「ありがとうございました」の一文を入れるか,今回の文章に「この間は,失礼しました。遅くなりましたが,改めてお礼申します。ありがとうございました」とか書いてから,今回の質問を書けば何も問題ないんだが。そこがないので,私は流れ上スレッドの続きを書きづらい。

 私としては,もう一度彼に注意を促しながら,回答をしてもいいのだが。 JAVA の勉強にいい機会だと思って付き合いだしたのだが,なんともすっきりしないことになってきたワイ。

追記(9/27):
 りりさんの提案で,彼の投稿をネタに TODOS でトライをやった。「何十も見つかった」という話だったのだが,重複が多かったらしく,9度で打ち止め。9個並べてリンクを貼っておきます。

 「その23」以降は,「JAVAの話-#2。」にリンクしてある。

「JAVAの話。」への11件のフィードバック

  1. o6asanさん、お世話様です。
    あの…その方ですけど、宿題のプログラムをもう何十もヤフー知恵袋で聞いているようです。他のサイトでも聞けそうな所はどこでても…マルチポストの注意も受けていました
    質問リストみたら、まー、いろいろな宿題があって。
    最初の頃は、文字入力もせず、宿題のプリントの写真を載せているのよ。地域的にo6asanさん在住方面の学生寮にお住まいのようですが、あのまま受講しいていくには無理がありますね。
    教授陣が対策しないとダメじゃないかと思っています。
    宿題リストは面白かったですよ。o6asan さんだったら、「自分ならこう書く」とかトライしたくなるて゛しょう。
    そういうコーナー、つくりましょうか?

    1. りりさん,おはようございます。

      > 宿題のプログラムをもう何十もヤフー知恵袋で聞いているようです。

      やれやれ,何十もですか。初めから宿題の丸投げではないかと思ったんです。本人がはっきり否定したので,まあ,初回は信じてあげたわけですが……

      > 最初の頃は、文字入力もせず、宿題のプリントの写真を載せているのよ。

      ハハハ,もともとは文字入力もできなかったのでしょうか。本人なりにそれなりの進歩はしているわけですか!
      あるいは,こちらのほうがありそうですが,そこまでズルをしていると誰も答えてくれなくなったので,そこだけ変えたとか。

      > 教授陣が対策しないとダメじゃないかと思っています。

      そうですね。このまま,卒業させたらえらいことですが,いいかげんな学校もありますからねぇ。

      > そういうコーナー、つくりましょうか?

      りりさんは,そんなにたくさん宿題例を集めたんですか!! 私は,正規にプログラムの勉強をしていませんので,どの言語を使うにしても変な書き方のところがあると思っています。そういうコーナーで書けば,添削をしてくださる方が現れるかも知れませんネ。

  2. では、さっそく、最初の方の画像から問題を書き起こしてみました。この質問には、さすがに皆さんあきれたのか、回答はついていません。
    http://todos.xsrv.jp/2patiopro/todos.cgi?no=52

    もしかしたら
    パソコン好きで、その系統の学科を選んでしまったけど、適性がちょっと…

    私も、あれだけ説明したのに、
    WIIMAXとPLC、どっちが安い?と聞かれて、もー無理っーーと、思ってしまって。
    論理的に考えるのが不得意なのかな。単位とるの難しいですよね…

    1. > WIIMAXとPLC、どっちが安い?と聞かれて、もー無理っーーと、思ってしまって。

      なんか初め(この質問の書き方ことです)から,うーん,ちょっとと思う人でしたよね。JAVAに興味があったので,思わずレスしてしまいましたが。

  3. よくよく見たら、文字入力をして、質問し直していました。
    あちらにリンクすると、さすがに嫌みですので、こちらで。
    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10108845485
    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11108905921
    最初のでダメだったのか、同じ質問をしていて。
    質問一覧を見ると、毎回、教えて貰おうとしているようです。
    また時間をあけて、別スレッドに次の問題を載せていきますね。
    すぐ書くと、o6asan さんのことですから、すぐ解きたくなるでしょうから、時間を適当にに空けますね。

    1. こんばんは。

      > あちらにリンクすると、さすがに嫌みですので、こちらで。

      いやいやいや,あちらほどでなくても,こちらでも,やはり。(苦笑)

      > すぐ書くと、o6asan さんのことですから、すぐ解きたくなるでしょうから、時間を適当にに空けますね。

      ハハ,よくお分かりで。

  4. えっ?でも、なかなかここまでは、いらっしゃらないかと…
    甘いかな…
    メールで…とも思ったのですが、TODOSとo6asan さん方、両方訪問される方には、参照できると良いかと思いまして…
    JAVAの質問の主、本当は、もう一度1からo6asan さんに教え直して貰おうと、考えを改めていただければ、o6asan さんがこちらに書かれている回答も、いずれ役立てていただけるのではと思うのですが……
    じゃ、問題が面白いので、また随時写していきますね。
    気が向いたらで良いですから。

    私も昔、三種類、5時間程ずつ、プログラミング研修というのを受けたのですが、いつも合計とか平均とか、順位づけとかで、また、これかーーー表計算ですぐできること面白くないなーと興味を失いました。本当は、そういう基礎からちゃんと身につけないとダメなんでしょうけど。

    1. お返事を書いていて,誤って2度消してしまいました。(苦)
      かなり長いものだったので,3度目を書く元気がありません。

      その気がわいてきたらそのうち書きますので,ご容赦のほど。

    2. りりさん,こんばんは。

      書き直しました。この長さのものが終わり近くになって,2度消えた,私のがっくりをご想像ください。2度目は,今やっているように,コメント欄に直接をやめて,エディタに変えてれは,再度痛い目に合うことはなかったんですが(泣)。

      ===================================================
      > えっ?でも、なかなかここまでは、いらっしゃらないかと…

      いや,ここまで来るとか来ないとかの問題ではなく,私がこの元記事を書いただけでも,かなり嫌味かなと思っていたもので。(^^;)

      > 本当は、そういう基礎からちゃんと身につけないとダメなんでしょうけど。

      言わずもがなですが,なんによらず,基礎は大切でしょう。
      しかし,巷で我々が触れる機会のあるコンピュータは,まず間違いなく,ノイマン型です。これにわかる形で指示を書くために,高級言語なるものがあるわけです。私たちのほうは,0と1で指示を書かなくてはいけないとなると,死んじゃいたくなりますモン。まっしかし,初期のころは,開発だけでなく応用の現場でも,それをやったわけです。その大変さから高級言語が生まれてきたわけですから。

      その昔(35年くらい前の話)お世話になったミニコンは,電源を入れたら,ローダーをキー入力で教えてやらないといけませんでした。これは,キーのオン・オフが決まっていて,3本ずつ組になっていたので,多分,8ビットの指令を出してたんだと思います。

      閑話休題。

      すべて,ノイマン型がもとですから,高級言語のコンセプトの大本は同じです。言語的には,いまだに英語が基本のものが大半ですし。しかし,枝葉がいろいろと違うわけで,今,JAVAをやっているのも,これに慣れようとしているわけです。枝葉とは言うものの,実際にプログラミングすることになると,この違いによる差は大きいです。

      例えば,演算子の論理和・論理積の考え方は同じでも, or || and && など,どの記号を使うか知らないと,それだけでエラーが出ます。

      > いつも合計とか平均とか、順位づけとかで、また、これかーーー

      ここのところを過ぎれば,その高級言語の基本的な叙述形式には慣れます。だから,ある高級言語について,一度これを学習してしっかり身に着けておけば――ノイマン型の演算の仕組みとかも含めてですが――他の言語の習得は非常楽になります。今のように,さまざまな情報に簡単にアクセスできるインターネットがある時代なら,なおさらです。

      しっかり身に着けるには何が必要かですが,それはそれで何をやるのかですよね,趣味にしろ仕事にしろ。これがないと,その先の学習をしようという意欲が生まれませんから,習熟するところまで行きません。ある程度,習熟が進んだ段階まで達していれば,かなり長い間隔をあけた後でも,「昔取った杵柄」で,後に利用が可能ですが,そこまで行ってなければ,研修を受けた直後は簡単なプログラムは組めるようになっていたのに,もう忘れちゃったということになると思います。学生が授業で習う場合も同じじゃないですか?

      市販のアプリなど簡単に手に入らない25年くらい前,子供たちのために,お絵かきソフトや落ちものゲームを作ったことがあります。お絵かきといっても,カラーモニタなど身近にない時代で,例の緑の画面でした。
      今のように,かなり高機能のアプリが簡単に手に入るようになると,自分でそういうものから作って使おうという気はなくなりますが,今どきのお絵かきソフトを使っているときでも,この辺りはこんな風にやってるのではないか,人間の考えることは,基本的にあまり変わらないなとか思うことがあります。またヘルプを見なくても,こういう操作をしたら,こうなるんじゃないかという予想もつきます。
      落ちものゲームについては,連帳に打ち出して忘れていたものを,遊びに来た子が参考になるからともって帰りました。作ってから,10年以上たっていたと思いますが,昔そのゲームで遊んでいた子で,そっちの方面に進み,プログラムのある部分の判断・処理に興味をひかれたようです。
      プログラミング言語自体の種類は変わっても,そういう判断・処理のモデルというものは,参考になるものなんでしょう。

      長広舌をふるってしまいましたが,彼にもこれを読む機会があってそれで何かを感じ,学習に真剣に取り組んでくれるようになると,嬉しいんですが……

  5. こっそりですけど、メールより、もしかしたら興味を持っている方は、見ても良いかなと…

    あのJAVAの先生、この方らしい
    http://jkoba.net/jkoba-wiki/
    PukiWikiでサイト作られているわね。
    略歴みると、とても優秀な方
    ロボット工学専門みたいなのだけど、制御プログラムとJAVAとか関係しているのか?
    あるいはプログラミングの基礎としてのJAVA学習なのか?

    驚いたのは、こんなプログラミングの初歩から教授するの?

    もしかしたら基本線は定めて助手とかが実際は行っているかもしれないけれど?

    それにしても、そういうレベルの中にうっかり入っちゃったら苦しいですよね…

    1. そうですねぇ。K工大の准教授の方ですか。ただ,例のネタの彼はK工大ではなくて,非常勤で教えに行かれている別の大学の学生のようですネ。

      > それにしても、そういうレベルの中にうっかり入っちゃったら苦しいですよね…

      まぁ,でも教え方がうまくてもよくわかってない先生に習うより,若干ぶっきら棒でもよくわかっている先生に教わるほうが断然いいと,私は思いますけどね。大学レベルなら,実習には助手も入るでしょうから,聞こうと思えば,楽に質問できるでしょう。もっとも,そのためには,わからないところがわかっていないといけないので,そのハードルは高いですよねぇ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください