質問: total-(total-5000)*(int)0.2-(total-1000)*(int)0.1 ; } return total; System.out.println("割引後の支払金額:" +total+"円"); } } ``` JAVA ### 試したこと 変数を入れ替えるなどしましたが、エラー解消ができません。今の状態が最もエラーの少ない形です。
回答: まず**エラーメッセージぐらいは読みましょう**。 エラーメッセージは怒声でも暴言でも罵倒でもハラスメントでもなく、 コンパイラ等からのメッセージです。 つまり今の状態は『相手の話を聞かずに逆ギレしている人』です。 そんな人はコミュニケーションなんて取れませんよね。 ``` Ex1_14_2.java:53: エラー: シンボルを見つけられません total= Integer.parseInt( args[i] ); ^ シンボル: 変数 i 場所: クラス Ex1_14_2 ``` これは『宣言されていない変数等を使っていることが原因』です。 Ex1_14_2.javaの53行目を見てください。 どうやら、discountメソッドの中らしいですね。 args とはなんでしょうか。 そもそもdiscountメソッドから見える範囲にはありません。 ローカル変数としても存在しないし、フィールドとしても存在しない。(仮にフィールドとしてあっても staticなメソッドだからstaticじゃないとアクセスできないが) 居もしない人を『呼んでくれ』と言っているようなものです。 居ないんだから呼びようがない。呼びようがないから、『んー、太郎って誰?』みたいなコメントをしているのです。 i も同様に。 ``` Ex1_14_2.java:65: エラー: シンボルを見つけられません System.out.plintln("割引後の支払金額:" +total+"円"); ^ シンボル: メソッド plintln(String) ``` これも意味的には同じ。『存在しないメソッドを呼び出している』ことが原因。 System.out.plintln メソッドとはなんでしょうか。 System.out.printlnでは無いでしょうか。 たかが一字間違いでも機械からすれば大事です。 人間なら『おそらくこれが言いたいのだろう』という推測が出来ますが、機械にはそんな芸当はできません。 ほんのちょっとの間違いで意味が相当違うので、大惨事です。 数学と一緒です。 たかだか桁を一つ間違えただけでも意味を考えると相当違います。 コーラ一本100円のときと、10000円(一万円)では相当違います。 たかが二ケタ違うだけで印象が違う。 ちゃんと書きましょう。 つか、基礎が出来ればいればあり得ない問題。 [追記1] 私の過去回答を参考にしてください。 [追記2] > > 今、直面している問題は、変数iの扱いについてです。変数のシンボルが見つからないのは、mainメソッドのtotalPrice += Integer.parseInt( args[i] )でiが定義されてるからでしょうか? > > > mainメソッドから呼び出されていますが、それぞれのメソッドやクラスは別物です。 **スコープ**を意識しましょう。 メソッドから使えるのは、ローカル変数(メソッド内部で宣言しているやつ) と、フィールドだけです。 別のメソッド内にある変数は使えません。 同じ変数名を宣言する事はできますが、別物です。 つか、データの状態を考えればわかるはずです。 [追記3] > > main以外でコマンドライン引数を受け取ることはできますか?実際にコマンドライン引数から文字を受けるときには、public static void main(String args[])というコードを打ち、mainの部分をメソッド名に変えることを実行しましたが、totalのシンボルが見つかりませんとエラーが出ました。 > > > まずは**基礎をやりましょう**。 上記で挙げた過去回答にも書きましたが、『入門書等にあるものは「道具」です』。 ■ メソッド ■ 引数 ■ 戻り値 この辺が分かっていないと無理です。 調べてください。調べない人には教える事はできません。 足し算すら理解していない人に微積分を説明するようなものなので。 [追記4] 何となく私も「基礎が出来ていない状態なのかな」と思っています。 **まずは基礎をやりましょう**。 基礎をないがしろにする人は**大成しません**。 これは100%断言できます。 今の状態は『包丁の使い方がまったくわかりませんが、かつら剥きを極めたいです。やり方を教えてください』というようなものです。 かつら剥きって、相当難易度高いと思います。 みじん切りや角切りとかなら適当に切っても出来そうですが、かつら剥きはうすーーーーく切らないといけませんし、続けないといけません。 でも包丁の使い方すらわかっていないと、下手すれば自分の手や指を切りますし、 良くても、かつら剥きは厳しいと思います。 確かに包丁の使い方程度ならほぼ一瞬で教えることが出来ますが、この包丁の使い方が たとえばこの道ウン十年の人しかできないっていうようなレベルのものだとどうでしょうか。 そもそもその基礎である包丁の使い方ですら教えきることができませんね。 なので「基礎である、包丁の使い方からやるように!!」と言っても、 「俺様はかつら剥きがしたいんだ!!! 包丁の使い方ぐらい、簡単に教えろよ!!!」というようなものです。 「あー、君、無理だからやめといた方がいいよ?」と言いたくなりますよね。 そういうレベルです。 まずは基礎からやり直しましょう。 **基礎が出来て初めて応用が出来るのです**。 [追記5] > > 確かに基礎がないがしろの状態で教えていただこうとすることは、とても失礼な行為であると反省しています。基礎の復習とともに質問の仕方についても学んでいこうと思います。また回答者様が調べもの(コードの書き方に悩んだとき)をされる際に気を付けられている点などはございますでしょうか?差し支えなければご教授願いたいです。 > > > んー、場合によりますが、絶対的に「質問は**最終手段**」ですね。 質問をする場合、相手もその時間を使いますし、"安易に質問をすること"に慣れてしまうと、 毎回聞くはめになるし、検索力もつきません。 つまりその場限りの付け焼き刃でしかなく、場合によっては回答者だけに負担をかけることになります。 質問しかしないなら「俺様が良ければどーでもいい」という発想になりそうですが、 私の場合は基本的に回答者になるので、「俺がこういう質問されたらいやだなぁ」と思うような質問はしないように心がけています。 仮に質問をするとしても、「**第三者が再現できるように書く**」でしょうか。 たとえば、『自分なりの根拠』とか、『自分なりのコード』、『参考文献』、 『試したこととその結果』とかですね。 これらがあるのとないのとでは雲泥の差です。 無い場合は回答者も無駄な労力(だって質問者がやったこともすべてやるから)だし、 下手すると「君、本当に自分でやったの?」となります。 でも「どのようにやった」とかみたいにある程度再現率が高くなるような情報を付与するだけでも、 「んー、この可能性はないな。ってーことは...○○じゃないかな?」とある程度可能性を絞れます。 そして、検索について。 まずは思いつくキーワードを挙げていく。 今回の場合は「言語名」「エラーメッセージ(の内容)」とかですね。 ファイル名や行番号, "total= Integer.parseInt( args[i] );" とかみたいに常に同じにならないものは省いて、 "エラー: シンボルを見つけられません" の部分とか。 そうすると、「**Java "エラー: シンボルを見つけられません"**」とかがキーワードになりますね。 ディレクトリ(フォルダ)内にあるファイルをすべて連番にするとかのような処理をしたいなら、 ``` 1. ディレクトリ内にあるファイルをすべて列挙する 1.1. ファイル名を変更する ``` 的なロジックになるはずです。 で、(1)がよくわからないので、「ファイル 列挙」という二つのキーワードが出てくるので、これを検索キーワードとする。 「**Java ファイル 列挙**」 あるいは、文字から整数にすることもありますね。(例: '1' -> 1 ) その場合、「**Java 文字 整数 変換**」とかで検索しますが、 大抵は「文字列」の場合もヒットします。 (例: "123" -> 123 ) 邪魔(ノイズ)なので文字列のヤツは省いちゃいましょう。 Googleなんかだと "-" や "+" とかを使って排除したり追加したりできます。 今回は排除なので "-" を使う。 「**Java 文字 整数 変換 -"文字列"**」とかみたいに。 で、ノイズだと思ったものを -... で省く。 新たに必要だと思ったキーワードはそのまま追加するか +... とかみたいに追加していく。 こうやって範囲を狭めていけば最終的にヒットします。 後はできれば公式リファレンスを読むことですね。 Javaならここ ですね。 C#ならここですね。 ということで、「質問方法を工夫すること」と「検索力を磨くこと」ですね。 詳しい事は私の過去回答(上記で挙げたもの)を参考にしてください。