• ベストアンサー

Javaプログラミング

こんにちは。Javaを最近勉強し始めたJava初心者です。これは2つの数を入力してそれそれの和、差、積、剰余を表示するものです(入力時の妥当性チェックは考慮しない。)。しかし下記のプログラムがうまく動いてくれません。どこが間違っているのかわからないのでわかる方教えて下さい。おねがいします。 import java.io.*; interface plus { int Plus(); } interface sub { int Sub(); } interface mul { int mul(); } interface mod { int Mod(); } class Compute extends plus,sub,mul,mod { int pa,pb; Compute(int a,int b) { this.pa=a; pb=b; } public int Plus() { return(pa+pb); //和を返す } public int Sub() //差を返す { return(pa-pb); } public int Mul() { return(pa*pb); //積を返す } public int Mod() { return(pa%pb); //余を返す } } class calc { public static void main(String args[]) throws IOException { InputStreamReader isp=new InputStreamReader(System.stdin); BufferedReader inp=new BufferedReader(isp); System.out.print("数1="); String sLins=inp.readLine(); //1つめの数値を入力 int a=integer.parseInt(sLine); System.out.print("数2="); String sLins=inp.readLine(); //2つめの数値を入力 int b=integer.parseInt(sLine); Compute c=new Compute(a,b); System.out.println("和:"+c.Plus()+"差:"+c.Sub()+"積:"+c.Mul()+"余:"+c.Mod()); } }

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

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

  • ベストアンサー
  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.2

まず、もう少し質問上手にならないと、何事においても損をしますよ。 「うまく動いてくれません」とだけ書いてソースファイルを付けるのは、状況説明があまりに不足しています。 最初この質問を見た時には、コンパイルは成功したけど思った通りに動かないという意味かと思ったのですが、ソースファイルがこのままだとしたらコンパイルは失敗してますよね。 コンパイルに失敗したとしたらどういうエラーが出たのか、載せるべきだったと思います。コンパイラのエラーメッセージから間違いを見つけるように頑張らないと、これから毎回誰かにチェックしてもらわないといけなくなります。「初心者」とは言っていますが、たとえばスペルミスは注意深く確認すれば解決できますよね。 とりあえず、見つかった間違いは以下のとおりです。スペースが無視されて読みにくくなるのを防ぐため、全角スペースで整形しています。コピーして利用する場合は、全角スペースを除くか半角スペースに置換してください。 ・インターフェイスはextendsではなくimplements    class Compute implements plus,sub,mul,mod ・interface Mulで定義されたmulメソッドだけなぜか小文字で始まっている    interface mulの中で、int Mul(); ・System.stdinではなくSystem.in    InputStreamReader isp=new InputStreamReader(System.in); ・変数名にsLinsとsLineが混在している    これは元々どのようにしたかったのか分からなかったので、一例。    System.out.print("数1=");    String sLine=inp.readLine(); //1つめの数値を入力    int a=Integer.parseInt(sLine);    System.out.print("数2=");    sLine=inp.readLine(); //2つめの数値を入力    int b=Integer.parseInt(sLine); ・integerでなくInteger    int a=Integer.parseInt(sLine);    int b=Integer.parseInt(sLine); Javaでは普通、クラス名は大文字で始め、メソッド名は小文字で始めます。それを知っておけば、Integerはクラス名なので小文字で始めるのはおかしいと気付くはずです。

jun2249
質問者

お礼

プログラミング以外指摘して下さってありがとうございます。良く読んでみたらその通りでした。基本を忘れてしまってました。 それでコンパイルをやり直してみたのですが public static void main(String args[]) throws IOExceptionの部分で内部クラスがstatic宣言を持つことが出来ませんとでてしまいます。 これはどういうことなのでしょうか。知っていたら教えて下さい。 よろしくお願いします。

その他の回答 (3)

  • takaP-
  • ベストアンサー率79% (83/105)
回答No.4

>public static void main(String args[]) throws IOException >の部分で内部クラスがstatic宣言を持つこと>が出来ませんとでてしまいます。 たぶん、最初の質問時のままのソースで再コンパイルしたのでは? implementsにすべきところをextendsにしている為に、 コンパイラがクラスcalcをクラスComputeのインナー クラスと誤って読み取っているのでしょう。 #1さんが指摘した部分を含め、修正してから再度 コンパイルを行えばそのエラーは出なくなります。

jun2249
質問者

お礼

ありがとうございます。 ソースを更新してコンパイルしたのですがなぜか出来ませんでした。ただ、今日再度コンパイルしたときにはなぜかわかりませんがコンパイルが出来ました。

  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.3

私の環境(1.4.1_01)ではエラーになりませんでしたが、おそらく、public class calcにして、ファイルをcalc.javaとして保存すればよいと思います。 以下は参考です。 Javaでは、1つのファイルに、publicなクラスやインターフェイスは1つだけしか定義できませんが、今回の場合のようにpublicでないクラスやインターフェイスは他に定義できます。 しかし、それができるということと、そうすべきかどうかは別問題です。私の考えでは、規模が大きくなるほどどこに何があるのか分からなくなる可能性があるので、例えばComputeクラスはCompute.javaで定義されているようにした方が、ファイル数は増えますが分かりやすいと思います。

jun2249
質問者

お礼

ファイルをcslc.javaにしていたのですがなぜか出てしまいました。今日再度コンパイルしてみたらこのエラーは出なくなっていたのですが今度は String sLine=inp.readLine(); //2つめの数値を入力 の部分で sLineはmain(java.lang.String[])で定義されていますと出ました。 良く見てみてのですが(java.lang.String[])の意味がよくわかわりません。たびたびすみませんがこれはどういう意味をもつのでしょうか。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

「うまく動かない」以前にコンパイルエラーになると思いますが。 とりあえず気がついたところで。 class Compute extends plus,sub,mul,mod → class Compute implements plus,sub,mul,mod インターフェースは拡張ではなく実装します。(しかし、このインターフェースは あまり意味が無さそうな気がする。) integer.parseInt(sLine) → Integer.parseInt(sLine) クラス名なのかインスタンス名なのかを意識しておきましょう。この場合はクラスメソッドなので クラス名(Integer)でアクセスできます。 予め Integer integer; などと定義しておく手もありますが、あまり意味はないでしょう。

jun2249
質問者

お礼

ありがとうございます。基本的なことを忘れてました。

関連するQ&A

  • java コンパイル

    はじめまして。これは2つの数を入力してそれそれの和、差、積、剰余を表示するソースファイル(入力時の妥当性チェックは考慮しない。)なのですがこれがコンパイルエラーになってしまいます。 import java.io.*; interface plus { int Plus(); } interface sub { int Sub(); } interface mul { int Mul(); } interface mod { int Mod(); } class Compute implements plus,sub,mul,mod { int pa,pb; Compute(int a,int b) { this.pa=a; pb=b; } public int Plus() { return(pa+pb); //和を返す } public int Sub() //差を返す { return(pa-pb); } public int Mul() { return(pa*pb); //積を返す } public int Mod() { return(pa%pb); //余を返す } } class calc { public static void main(String args[]) throws IOException { InputStreamReader isp=new InputStreamReader(System.in); BufferedReader inp=new BufferedReader(isp); System.out.print("数1="); String sLine=inp.readLine(); //1つめの数値を入力 int a=Integer.parseInt(sLine); System.out.print("数2="); String sLine=inp.readLine(); //2つめの数値を入力 int b=Integer.parseInt(sLine); Compute c=new Compute(a,b); System.out.println("和:"+c.Plus()+"差:"+c.Sub()+"積:"+c.Mul()+"余:"+c.Mod()); } } というソースファイルなのですが、これが下記のようなエラーが出てしまいます。 String sLine=inp.readLine(); //2つめの数値を入力 の部分で sLineはmain(java.lang.String[])で定義されています と出ました。 良く見てみてのですが(java.lang.String[])の意味がよくわかわりません。これはどういう意味をもつのでしょうか。

    • ベストアンサー
    • Java
  • Javaプログラミング

    Javaプログラミングで分からない課題が出たので、教えてもらえませんか? 実行結果 1つ目の整数を入力してください。 23 2つ目の整数を入力してください。 12 足し算の結果:35 引き算の結果:11 プログラムの大枠はこのようになるのですが public class 〇〇 { public static void main(String[] args) { System.out.println("1つ目の整数を入力してください。"); } public static int add(int a,int b) { return (a + b); public static int sub(int a,int b) { } }

    • ベストアンサー
    • Java
  • javaのプログラミングについての質問です。

    Javaのプログラムについての質問です。長くなってしまいますがご容赦下さい。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。以下が現在までに作成したコードになります。 注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中にコメントを振ってあります。 import java.util.List; import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; class Mylist implements List{   private int Count;   private String Data[];   // コンストラクタ   public Mylist(){    Data = new String[10];    Count = 0;   } /** 実装するaddメソッド @return boolean APIの設定に従う @param e エレメント(要素) **/   public boolean add(E e){    Data[Count] = (String)e;   Count++;   return true;   }   public void add(int i,Object str){   }   public boolean addAll(Collection c){     return false;   }   public boolean addAll(int i,Collection c){     return false;   } /** 実装するclearメソッド **/   public void clear(){     Count = 0;   }   public boolean contains(Object str){     return false;   }   public boolean containsAll(Collection c){     return false;   }   public boolean equals(Object str){     return false;   } /** 実装するgetメソッド @return E エレメント(要素) @param i 指定されたインデックス番号 **/   public E get(int i){      /*     エレメントeに、String型Data[i]を     キャストして格納*/     E e = (E)Data[i];     return e;   }   public int hashCode(){     return -1;   }   public int indexOf(Object str){     return -1;   }   public boolean isEmpty(){     return false;   }   public Iterator iterator(){     return null;   }   public int lastIndexOf(Object str){     return -1;   }   public ListIterator listIterator(){     return null;   }   public ListIterator listIterator(int i){     return null;   }    /**   * 実装するremoveメソッド   * @return E エレメント(要素)   * @param index 指定されたインデックス番号   **/   public E remove(int index){ /* Dataを最大まで回し、iをインクリメントしたData[i++]を String型Dataに格納する*/ for(int i = index; i < Data.length; i++){ Data[i] = Data[index++]; } Count--; E e = (E)Data; return e; } public boolean remove(Object str){ return false; } public boolean removeAll(Collection c){ return false; } public boolean retainAll(Collection c){ return false; } /** * 実装するsetメソッド * @return E エレメント(要素) * @param i 指定されたインデックス番号 * @param element 置き換える要素 **/ public E set(int i,E element){ // String型Dataにelementをキャストして格納 Data[i] = (String)element; // エレメントeにData[i]をキャストして格納 E e = (E)Data[i]; // 値を返す return e; } /** * 実装するsizeメソッド * @return int 指定されたインデックス番号 **/ public int size(){ return Count; } public List subList(int i,int j){ return this; } public Object[] toArray(){ return Data; } public Object[] toArray(Object[] a){ return Data; } } class Main { /** メインメソッド **/ public static void main(String args[]) { Mylist sub = new Mylist(); /* addメソッドを実装し、機体名を要素とする。 addを最大まで回し、getメソッドで要素を取り出して表示する*/ sub.add("ビルドバーニングガンダム"); sub.add("ライトニングガンダム"); sub.add("ウイニングガンダム"); sub.add("ガンダムフェニーチェリナーシタ"); sub.add("R・ギャギャ"); sub.add("ユニコーンガンダム"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // sizeメソッド System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n"); // setメソッド sub.set(0,"ガンダムエピオン"); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // 改行 System.out.println(); // removeメソッド sub.remove(1); for(int i = 0; i < sub.size(); i++){ System.out.println(sub.get(i)); } // clearメソッド sub.clear(); System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです"); } } コンパイルして実行すると、removeメソッドで指定した箇所ではなく、要素の1番最後が削除されています。思うに、removeメソッドを実装する所のfor(int i = index; i < Data.length; i++){の中の条件が違うと思うのですが。。。。 また、現在addには10個箱を作成するようにしていますが、11個目をメインクラス内で用意した場合、例外ではなく新たに箱を作らなければならない、という後だしジャンケン的な事を言われて、思わず「じゃあArrayListでいいじゃないか」と思ってしまいました。 気を取り直してこの3連休で終わらせたいと思っています。ここまでで現状コードの完成は50%かそれ以下だとは思いますが、どなたか上記2点について御教授頂けないでしょうか。よろしくお願い致します。

  • javaのプログラミングについての質問です。

    javaのプログラミングについての質問です。 Appletを用いて、後置記法によるインタラクティブなミニお絵描き言語を設計 し、実現しなさい。たとえば、 100<return>150<return>200<return>250<return>line<return> とキーボード入力すると、 → Applet上に(100,150)から(200,250)への直線が描かれる。 自分で作ったソースコードの一部です。(全部ペーストし切れませんでした) interface Fun { //関数のインターフェース void eval(MyStack s); //演算を実行 boolean iam(String s); //自分の名前がsと等しいかどうかを判定するメソッド // →自分が呼ばれたかどうかを判定する。 } abstract class Draw implements Fun{ public void eval(MyStack s){ int a, b,c,d; //第一引数と第二引数 a = s.pop(); //それぞれpop b = s.pop(); c = s.pop(); d = s.pop(); s.push((int) draw(a,b,c,d)); //実行は抽象メソッドで行う } abstract int draw(int a, int b,int c,int d); } class DrawLine extends Draw{ public boolean iam(String str){return str.equals("line");} int draw(int a, int b,int c,int d){ Graphics.drawLine(a,b,c,d); // ※ここが問題です。 } } ※のところで  Graphics の非 static メソッド drawLine(int, int, int, int) を static 参照することはできません というエラーメッセージが出ます。 どう直したらいいでしょうか

    • ベストアンサー
    • Java
  • プログラミングお願いします(JAVA)

    クラスCalcに、次の5つのメソッドを作成しなさい。メインメソッドでオブジェクトを生成し、メソッドを呼び出して、実行しなさい。 二つの整数を引数にもち、その和を戻り値とする wa (メソッド名はwaであることに注意!以下同様。) 二つの整数を引数にもち、その差を戻り値とする sa 二つの整数を引数にもち、その積を戻り値とする kake 二つの整数を引数にもち、その大きい方を戻り値とする max 二つの整数を引数にもち、その小さい方を戻り値とする min した自分が実行したプログラムです。ここまでしかわからないので簡単にお願いします class Calc { int wa; int sa; int kake; int max; int min; int num; int num1; int getWa() { System.out.println("和を調べました"); return num+num1; } int getSa() { System.out.println("差を調べました"); return sa; } int getKake() { System.out.println("積を調べました"); return kake; } int geMax() { System.out.println("大きいほうを調べました"); return max; } int getMin() { System.out.println("小さいほうを調べました"); return min; } void setwasakakemaxmin(int w,int s ,int k,int ma,int mi) { wa=w; sa=s; kake =k; max=ma; min=mi; System.out.println("和を"+wa+"差を"+sa+"積を"+kake+"大きいほうを"+max+"小さいほうを"+min+"にしました"); } } class Sample3 { public static void main(String[] args)throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Calc car1=new Calc(); String str=br.readLine(); int num = Integer.parseInt(str); String str1=br.readLine(); int num1 = Integer.parseInt(str1); int wa=num+num1; int wa =car1.getWa(); Calc car1 =new Calc(); car1.setWaSaKakeMaxMin(1,2); int wa =car1.getWa(); int sa =car1.getSa(); int kake=car1.getKake(); int max =car1.getMax(); int min=car1.getMin(); System.out.println("Birthdayを調べたところ"); System.out.println("和は"+wa+"差"+sa+"積は"+kake+"大きいほうは"+max+"小さいほうは"+min+"でした"); } }

  • Javaのプログラムの質問です。

    Javaのプログラムについての質問です。 Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。  注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中に番号を振ってあります。 import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; import java.util.List; class LocalList implements List{  private int Count;  private String Data[];  private Iterator ite;  private ListIterator lite;  // コンストラクタ  void mylist(){   Data = new String[10];   Count = 0;  }  (1)  public boolean add(Object str){   if(Count >= 10){    return false;   }   Data[Count ++] = new String((String)str);   return true;  }  public void add(int i,Object str){  }        public boolean addAll(Collection c){   return false;  }        public boolean addAll(int i,Collection c){   return false;  }    (2)  public void clear(){   Count = 0;  }  public boolean contains(Object str){   return false;  }          public boolean containsAll(Collection c){   return false;  }  public boolean equals(Object str){   return false;  }    (3)  public Object get(int i){   return (i >= Count);  }  public int hashCode(){   return -1;  }  public int indexOf(Object str){   return -1;  }  public boolean isEmpty(){   return false;  }  public Iterator iterator(){   return ite;  }     public int lastIndexOf(Object str){   return -1;  }     public ListIterator listIterator(){   return lite;  }     public ListIterator listIterator(int i){   return lite;  }    (4)  public Object remove(int i){   return (i >= Count);  }    public boolean remove(Object str){   return true;  }         public boolean removeAll(Collection c){   return false;  }         public boolean retainAll(Collection c){   return false;  }    (5)  public Object set(int i,Object str){   return Data[i];  }    (6)  public int size(){   return Count;  }  public List subList(int i,int j){   return this;  }  public Object[] toArray(){   return Data;  }  public Object[] toArray(Object[] a){   return Data;  } } class Main {  public static void main(String[] args) {   mylist sub = new mylist();   sub.add("ビルドバーニングガンダム");   sub.add("ライトニングガンダム");   sub.add("ウイニングガンダム");   sub.add("ガンダムフェニーチェリナーシタ");   sub.add("R・ギャギャ");   for(int i = 0; i < sub.size(); i++){      System.out.println(sub.get(i));   }   // 改行   System.out.println();   // setメソッド   sub.set(1,"ガンダムエピオン");   for(int i = 0; i < sub.size(); i++){    System.out.println(sub.get(i));   }   // 改行   System.out.println();   // sizeメソッド   System.out.println("\r\n" + "機体数は" + sub.size() + "です" + "\r\n");   // removeメソッド   sub.remove(1);   for(int i = 0; i < sub.size(); i++){       System.out.println(sub.get(i));   }   // clearメソッド   sub.clear();   System.out.println("\r\n" + "機体数が" + sub.size() + "になったので負けです");    } } setメソッドとremoveメソッド以外は起動するのようになったのですが、この2つがうんともすんとも動きません。ジェネリクス型を使うという考え方もあるらしいのですが、ネットで調べてもピンと来ず寸詰まり状態になってしまっています。後少しだと思うのですが。。。。 どなたかご教授頂けないでしょうか?よろしくお願い致します。

  • javaについて質問です。お願いします><

    javaについて質問です。お願いします>< シーザー暗号を実現するプログラムをじゃいたのですが、import java.io.*; class Prob6_3 { public static void main(String [] args)throws IOException { int key; //キー番号 String orgStr; //ターゲット文字列 String encStr; //暗号化文字列 String decStr; // 復号化文字列 String temp; BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); System.out.print("ターゲット文字列:"); orgStr=br.readLine(); System.out.print("キー番号:"); temp=br.readLine(); key=Integer.parseInt(temp); Cipher cip=new Cipher (); encStr=cip.encrypt(orgStr,key); decStr=cip.decrypt(encStr,key); System.out.println("[Original Code]"+orgStr); System.out.println("[Encrypted Code]"+encStr); System.out.println("[Decrypted Code]"+decStr); } } class Cipher { String encrypt(String str,int key) { String ret="";             //ココです1 for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c+key); ret+=c; } return ret; } String decrypt(String str,int key) { String ret="";              //ここです2 for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); ret+=c; } return ret; } }   とこんな感じになり実行もできるのですが、class CipherのString encrypt(String str,int key)やString decrypt(String str,int key)のところで一つずつ文字をつなげて文字列にするにはStringBufferクラスのインスタンスを利用すると簡単だとききました。だけど記述方法がよくわからなく使用した場合のreturn文の書き方もイマイチわかりません><なのでできるだけ詳しく教えて頂けないでしょうか??お願いします。//ココですと書いてあるところです。お願いします><

    • ベストアンサー
    • Java
  • Java プログラミング エラー

    public class kadai1 { public static void main(String[] arg){ /* Book クラスからインスタンスを生成*/ Book myBook = new Book("The Java Tutorial",55); System.out.println("My book title = " + myBook.getTitle()); System.out.println("My book title = " + myBook.title); System.out.println("My book price = " + myBook.getPrice()); System.out.println("My book price = " + myBook.getYenPrice()); /*Book クラスからインスタンスを生成*/ Book yourBook = new Book("The Java Programming Language",40); System.out.println("Your book title = " + yourBook.getTitle()); System.out.println("Your book price = " + yourBook.getPrice()); } } class Book{ //クラスbook の宣言 String title; //題名 private int price; // 価格(ドル) Book(String t, int p){ //コンストラクタ title = t; //題名の設定 price = p; //価格の設定 } public String getTitle(){ // 題名の取得 return title; } public int getPrice(){ // 価格の取得 return price; } public double getYenPrice(){ return price*111.58; } } このとき「Exception in thread "main" java.lang.NoSuchMethodError: Book.getYenPrice()D」 というエラーがでるんですが、これはgetYenPrice()というメソッドはないといってきてるんでしょうか? 作ってるんですがどういうことなんでしょう。

    • ベストアンサー
    • Java
  • Javaのプログラムについて至急教えてください!

    //Sub.java class Super{ public void A(){} } class Sub extends Super{ /* (1) */ } このプログラムの(1)に入るものを下から2つ選んで他のクラスのメインメソッドから呼び出すのですがどうやってもわかりません。わかる方教えてください! public void A(){} public String A(){ return "pool";} public int A(String str){return Integer.parseInt(st);} public int A(){return 3;} public Object A(){return new Object();}

    • ベストアンサー
    • Java
  • javaのプログラミング(連続する整数の和)

    javaのプログラミング(連続する整数の和) 大学で出た課題です。 「ある自然数nを入力し、n=○+○+…+○と連続する整数の和で表すプログラミングをつくれ。」というものです。 以下に、私が考えたものを載せます。これだと連続する2つの整数の和では表すことができるのですが、3つ以上の整数の和を表すことができません。どうすればよいでしょうか? import java.io.*; public class  n { public static void main(String[] args) { int n; BufferedReader rd = new BufferedReader(new InputStreamReader(System.in)); try{ String line; System.out.print("整数:"); line = rd.readLine(); n = Integer.parseInt(line); } catch(IOException e){ System.out.println("入力エラーが発生しました。"); return; } catch(NumberFormatException e){ System.out.println("整数を入力してください。"); return; } for(int i=1;i<=n;i++){ int k=i+1; if(i+k==n) System.out.println(i+"+"+k); } } }

専門家に質問してみよう