• ベストアンサー

初心者によるプログラム

最近学校のパソコンの授業で、Javaをやるようになったのですが、イマイチ分かりません。課題が出るので、自分でソースを作って、コンパイルしてみるのですが、エラーが出てしまいます。自分でエラーの内容が理解できたものもあったのですが、分からないのもありました。そこで、次の問題を教えていただきたいのです。 「学生番号と自分の誕生日の月をinetger型の変数に代入して、それらの変数を用いて学生番号を誕生日の月で割った値をdouble型の変数に型変換するプログラムを作りなさい」 という問題なのです。以下のソースは、自分でできる限り作ってみたものです。学生番号は12345678で、誕生日の月が11とします。 class kadai100{ public static void main(String args[]){ inetger number=12345678; //inetger型に学生番号を代入 inetger birth=11; //inetger型に生年月日の月を代入 double a; //型の宣言 inetger answer=number/birth; //answerは学生番号を月で割った値 a=(int)answer; //answerをaの型より小さくして、aに代入 System .out.println(a); } } コンパイルすると、3、4、6行目に関してのエラーが出ます。一体、何で間違えなのでしょうか?教えてください。あと、inetgerという型についても教えてください。ネットで調べてみたのですが、基本的データ型というのしかなくて、その中には入っていませんでした。

  • Java
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
noname#99638
noname#99638
回答No.4

a-kumaさん 補足返しありがとうございます~。 cosmopolitanさんが抱えている課題は 「学籍番号と誕生日の月をそれぞれIntegerオブジェクトで管理して、学籍番号÷誕生日の月をdouble型に代入するようなプログラムを書く」 ということですか? でしたら、、、 class kadai100{ public static void main(String args[]){ Integer number= new Integer(12345678); //Interger型に学生番号を代入 Integer birth= new Integer(11); //Interger型に生年月日の月を代入 double answer; //double型の変数の宣言 answer = number.doubleValue()/birth.doubleValue(); //a-kumaさんの回答をいただきました System.out.println(answer);//answerの表示 } } ではいかが? ちなみにキャストというのは、 double answer; int a;  : a = (int)answer; のようにある型のデータを別の型に変えることをいいます。 この場合は、double型のanswerに格納されている値をとりだして、int型にして(小数部分を切捨てて)からaに代入しています。 (answer自身はdouble型のままで変わりません(切捨てもされません)。ご注意) ちなみに answer = a; もキャストです。 この場合は、answer = (double)a; とはしなくてもいいことになっています。 う~ん。もう少し何処まで理解しているかがわかれば、適切に答えられるのだけど。 Javaについてちゃんと理解したいのか、とりあえず課題ができればいいのかとかもね。 (授業の課題ということでですので、授業で何か習ったはずなのに、何処まで理解してらっしゃるのかが全然見えなかったので…) ちょっと小言みたいになってしまってお気を悪くされたらすみません。 これを機会にJavaをちゃんと勉強してほしいな~という気持ちと、 学生さんだからJava以外にもたくさん勉強することがあるから課題が出きればいいのかなという気持ちの 両方があるので、ちょっと書いてみました。 ではがんばって下さい。

cosmopolitan
質問者

お礼

型を変えることは知ってたのですが、そのことをキャストと呼ぶということは知りませんでした。私の理解は、ホントにまだまだ浅いです。一応、型変換のことは知っていましたが。それと、Javaについては、ちゃんと理解していきたいと思っています。課題ができても、納得がいかないと気が済まないタイプですし、Javaにはかなり興味があるので頑張ってみたいと思っています。あと、これは授業の課題なのですが、授業はただプリントを配るだけで終わりなのです。しかも、そのプリントが分かりにくくて・・・。ネットで検索しても、専門用語みたいのばかりで分からなくて。また、いろいろと質問を書き込むと思いますが、その時はどうかよろしくお願いします。今回はありがとうございました。

その他の回答 (3)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

# 補足返しっ > kana-tanさんがおっしゃるとおりに修正してからコンパイルしてのですが、それでもエラーが出てしまいました エラーメッセージの通り、Integer というクラスには、割り算の演算子 / が使えませんし、 基本データ型である int へのキャストもできません。 > Integer answer=number/birth; //answerは学生番号を月で割った値 演算をするには、Integer クラスから値を取り出す必要があります。また、Integer クラスの新しいインスタンスを利用するには、学生番号のところと同じように new してあげる必要があります。 Integer answer = new Integer(number.intValue()/birth.intValue()); > a=(int)answer; Java のクラスは、派生関係に無いとキャストできません。先の行と同じように Integer クラスから値を取り出す、ということになります。 a = answer.doubleValue(); > それと「int→doubleのキャストをする必要があると思う」という意味が分かりません 「学生番号がつきで割り切れないときはどうするの?」ということなんです。 整数同士の割り算は、演算をした時点で余りがあると切り捨てられます。 せっかく実数(double)の変数 a に値を入れても、その前にまるめられてしまいます。 とはいうものの、質問のソースのコメントに「answerをaの型より小さくして、aに代入」と ありますから、まるめられること自体は、題意に沿っているのかもしれません。 でも、それは割り算をした時点で丸められているので、キャストの必要はないです。 kana-tan が心配している「キャストの必要がある」という、割り切れないとき にも、なるべくその精度を保つ場合には、こんな感じになります。 ★ int を使う場合 double answer = (double)number/(double)birth; ★ Integer を使う場合 double answer = number.doubleValue()/birth.doubleValue(); 余談ですが、Java のクラスのマニュアルは、Internet で参照できます(→参考URL)。 良い時代になったもんです :-)

参考URL:
http://java.sun.com/j2se/1.3/ja/docs/ja/api/index.html
cosmopolitan
質問者

お礼

Javaって難しいです。まだ、完璧には理解できませんが、大体分かってきました。ありがとうございました。それにしてもIntegerの使い方って複雑ですね。

noname#99638
noname#99638
回答No.2

a-kumaさんの回答に少し補足させていただきます。 >スペルを間違っているから。整数を表すクラスは int か Integer です。 という部分ですが int は基本データ型 Integer はクラス といったほうがいいかなと思います。 で、Integerを使いたいのでしたら Integer number = new Integer(12345678); でしょうか。 補足終わり。 ここからcosmopolitanさんへアドバイス。 このソース、コンパイルは通っても題意通りにできてませんね。 (キャストの使い方が変です。多分問題では、int→doubleのキャストをする必要があると思うのですが…) ついでにもうひとつ。この問題がほんとに「~inetger型の変数に~」と書いてあったのでしょうか。単なる転記ミスなのでしょうか? それが気になります。

cosmopolitan
質問者

補足

回答ありがとうございました。それで、kana-tanさんがおっしゃるとおりに修正してからコンパイルしてのですが、それでもエラーが出てしまいました。修正後のソースは以下の通りです。 class kadai100{ public static void main(String args[]){ Integer number=new Integer(12345678); //inetger型に学生番号を代入 Integer birth=new Integer(11); //inetger型に生年月日の月を代入 double a; Integer answer=number/birth; //answerは学生番号を月で割った値 a=(int)answer; System .out.println(a); } } これでコンパイルすると、6行目に「演算子/はIntegerに適応できません。」というのと、7行目に「変換できない型」と表示されてしまいます。どうすればよいのでしょうか?それと「int→doubleのキャストをする必要があると思う」という意味が分かりません。キャストというもの自体良く分かりません。よろしかったら、また教えていただけないでしょうか?

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> 一体、何で間違えなのでしょうか? スペルを間違っているから。整数を表すクラスは int か Integer です。 > inetger number=12345678; という形で、宣言をしたいのであれば、 int number = 12345678; となります。

cosmopolitan
質問者

お礼

ありがとうございました。ということは、プリントの記載が間違えていたということですね。

関連するQ&A

  • 整数xxxが大き過ぎますというエラーメッセージ(Java)

    最近javaを始めた者です。 javaの初歩的なプログラミングなのですが、long型の変数を定義して例えば10個の数字1234567890をその変数に代入してやるとエラーなくコンパイルされるのですが、 11個以上の数字、例えば12345678900を代入してコンパイルしようとすると質問タイトルのようなエラーメッセージが表示されてしまいます。 long型の変数を使えば11個の数字なら問題なく代入できると理解しているのですが、これは間違っているのでしょうか。 エラーがでる理由がわからなくて困っています。このエラーについて、また、どのようにすれば11個以上の数字が代入できるのか教えてください。お願いします。

    • ベストアンサー
    • Java
  • 初心者の私にプログラムを教えてください。

    以前、No.685451で質問したのですが、自分の質問が悪かったため、あまり理解できなかったので、また教えていただけないでしょうか? 質問は 下の例にもあるように、32ビットのIPアドレス(unsigned long型)と32ビットのハッシュ値(unsigned long型)をビットインターリーブして64ビットの値を作りたいのですが、どのようにプログラムしたらよいでしょうか? また、ビットインターリーブした値が64ビットになり、64ビットの値を格納できる型も分かりません。 このような場合、doubleやlong doubleでビットインターリーブ値を格納するのでしょうか? 質問が多くて申し訳ないのですが、できれば解説などもしてもらえるとありがたいです。よろしくお願いします。 ーーーーーーーーーーーーーーーーーーーーーーーー 例  IPアドレス:192.168.23.5 ⇒(11000000101010000001011100000101) ハッシュ値:11110000101010100101010100001111 ビットインターリーブ(※IPアドレスは奇数ビット、ハッシュ値は偶数ビットとします) :1111010100000000110011001100010000010011001110110000000001110111 ーーーーーーーーーーーーーーーーーーーーーーーー

  • VC++、超初心者です。

    intで宣言した変数と変数の足し算を行い、intの変数に代入すると、 シンタックスエラーを起こしてしまいます。 例) int A; int B; int C; C = A + B C2061: 構文エラー : 識別子 'C' がシンタックスエラーを起こしました。

  • C言語のキャストについて

    C言語のキャストについて こんばんわ、質問です。 『キャスト』と言われる型を合わせるルールがあると思います。 あれはコンパイラに 「違う型の変数への代入だけど、これは意図したことですよ」 ってことを分かってもらうための手段という認識でよろしいでしょうか? コンパイル後、実行時には変数の型情報は使われない(残ってない?)と 思っていますが、その道を極めている方、教えてください。 キャストが何に使われるのか知りたいです。

  • fortran プログラミング

    ifortでは問題なくコンパイルできたプログラムを、gfortranで コンパイルしたところ、次のようなエラーが出ました。 DATA ENDWRD /' $END '/ 1 Error: Incompatible types in assignment at (1), CHARACTER(1) to REAL(8) Eが頭文字の変数をdouble precisionにするようにしてあるので、 多分double precisionにcharacterを代入しようとしているのが gfortranでは駄目なんだろうと思いますが、これを解消する方法 があれば教えていただけると助かります。よろしくお願いします。

  • キャスト演算子について

    初心者の初歩的な質問ですが、変数の型を変換するキャスト演算子がありますが本を読んでいて思ったのですが変換した式の型はその後どうなるのでしょう? 例で(前略) ----------------------------   int A =0; /*A=0*/ double B =2; /*B=2.000000*/ A = (int)B; B = 3; ----------------------------- とするとA=2 となりますがこの時のBの型はどうなるのでしょう? キャストを使用すると最初に宣言したdoubleがintになってしまうのか?後で代入した3は最初に宣言したdouble型の「3.000000」?それとも変換したint型「3」? 多分最初のままのような気はしますが。よろしくお願いします。

  • C#のTextboxについて

    string a; a="Textbox1" double b =double.Parse(a)-10.0 上記のようにプログラムを書きました。 bという変数に(Textbox1に記載してある数値-10)を代入したいのですがエラーが出てしまいました。 間違いがわかりません。 わかるかたがいましたら、教えていただけないでしょうか? よろしくお願いいたします。

  • 商、余り

    はじめまして。 以下のプログラムでコンパイルするとエラーがでます。 変数aをintにして%dですれば成功しますが 変数floatではなぜ失敗するのでしょうか?? #include<stdio.h> int main() { float a; a=13; printf("%f",a%2); return(0); } コンパイルすると エラー6: 浮動小数点の不正な使用(関数 main ) 警告 8: 'a' に代入した値は使われていない(関数 main ) とでます。 初歩的な質問ですがよろしくお願いします。

  • VBAのRows.Selectについて

    すみません。知っていれば教えてください。 Rows.Selectで、行をしてしたいと考えています。 行番号は変数gyouに代入されています。 そこで、普通であれば、Rows("4:4").select で指定できると思うのですが、今回、Rows("gyou:gyou").select にしたいです。 ただ、””でくくっているので、Gyouを数字ではなく文字列で認識するらしく、型がちがいますというエラーがでてきます。 どうすれば、変数で指定できのでしょうか? すみませんが、教えてください。

  • 精度が落ちている可能性のエラー

    コンパイル時に 検出値 : double 期待値 : float a = 2.0; 部分に精度が落ちている可能性のエラーがでます。 //Exercise1.java class Exercise1 { public static void main (String args []){ float a; a = 2.0; System.out.println("変数aの値は" + a + "です。"); } } 変数の宣言部分をfloatからdoubleに変えるとエラーは出ません。本の例題としてはfloatなのです。 どういう事なのでしょう? よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう