質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Java

    14470questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コンパイルエラーが解決できません

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 232

keita135

score 4

 前提・実現したいこと

f(x)=ax^s+b型の素数を探すプログラムを作っています。
最初に、ソースコードPrimeを作りましたが、Prime2にして機能をつけたそうとしたら自分では対応できないコンパイルerrorがでてきました。
Prime2は、f(x)をある数(ここではstra[0])までで最も高い素数の生成割合を調べる機能を追加したいです。

 発生している問題・エラーメッセージ

class,interfaceまたはenumがありません。(大量)
式の開始が不正です。(1つ)

 該当のソースコード

以下がPrime2

import java.io.*;

public class Prime2{
 static int ss = 0;
 static int[][] a = new int[50][20];
 static int[] data = new int[3];
 static String[] str10a;
 static String[] stra;
 static long drive = 1;
 public static void main(String []args) throws IOException {
  BufferedReader input = new BufferedReader (new InputStreamReader (System.in));
  System.out.println("初期設定を行います。");
  System.out.println("本ソフトでは主にan^s+bの計算を行います。");
  startSetting();
  calcu();
 }
 public static void startSetting()throws IOException {
  BufferedReader input = new BufferedReader (new InputStreamReader (System.in));
  System.out.println("a,s,bを入力してください。例えば3n^5+1にしたいならば、");
  System.out.println("3 5 1");
  System.out.println("と入力します。");
  String str10 = input.readLine( );
  System.out.println("数字指定ならば大文字A。\n全数指定ならば大文字B。\n素数探索ならば大文字C。\n素数含有量測定ならば大文字D。\n素数導出式探索ならば大文字Eを入力してください。");
  System.out.println("また、スペースを入力して、調査対象の数を入力してください。例えば17の全数指定は、");
  System.out.println("B 17");
  System.out.println("と入力します。");
  String str = input.readLine( );
  String[] wind = str.split(" ");
  String[] wind2 = str10.split(" ");
  str10a = new String[wind2.length];
  stra = new String[wind.length];
  for(int i = 0;i < stra.length;i++){
   stra[i] = wind[i];
  }
  for(int i = 0;i < str10a.length;i++){
   str10a[i] = wind2[i];
  }
  for(int anc = 1;anc <= stra.length - 1;anc++){
   a[ss][anc - 1] = Integer.parseInt(stra[anc]);
  }
  for(int anc = 0;anc < 3;anc++){
   data[anc] = Integer.parseInt(str10a[anc]); 
  }
 }
 public static void calcu(){
   if(stra[0].equals("A")){
    long s;
    for(int i = 0;i < 20;i++){
     if(!(a[ss][i] == 0)){
      drive = 1;
      for(int anc = 0;anc < data[1];anc++){
       drive = (drive * a[ss][i]);
      }
      s = drive * data[0] + data[2];
      if(isPrime(s)==true){
       System.out.println(a[ss][i] + "の計算結果:" + s + "素数");
      }
      else{
       System.out.println(a[ss][i] + "の計算結果:" + s + "合成数");
      }
     }
    }
   }
   else if(stra[0].equals("B")){
    long grow;
    for(int r = 1;r <= a[ss][0];r++){
     drive = 1;
     for(int anc = 0;anc < data[1];anc++){
      drive = drive * r;
     }
     grow = drive * data[0] + data[2];
     if(isPrime(grow)==true){
      System.out.println(r + "の計算結果:" + grow + "素数");
     }
     else{
      System.out.println(r + "の計算結果:" + grow + "合成数");
     }
    }
   }
   else if(stra[0].equals("C")||stra[0].equals("D")||stra[0].equals("E")){
    if(stra[0].equals("C")||stra[0].equals("D")){
     syca(data[0],data[1],data[2]);
    }else{
     double[][][] gman = new double[stra[0]][stra[0]][stra[0]];
     for(long dn = 1;stra[0] >= dn;dn++){
      for(long dn2 = 1;stra[0] >= dn2;dn2++){
       for(long dn3 = 1;stra[0] >= dn3;dn3++){
        gman[dn][dn2][dn3] = syca(dn,dn2,dn3);
       }
      }
     }
     double tta;
     for(long dn = 0;gman.length > dn;dn++){
      for(long dn2 = 0;gman[dn].length > dn2;dn2++){
       for(long dn3 = 0;gman[dn][dn2].length > dn3;dn3++){
        if((dn == 0)&&(dn2 == 0)&&(dn3 == 0)){
         tta = gman[dn][dn2][dn3];
        }else{
         tta = Math.max(gman[dn][dn2][dn3],tta);
        }
       }
      }
     }
     System.out.println(tta + "%");
    }
    public static void syca(long nn1,long nn2,long nn3){
     long wq;
     long ggh = 0;
     double ggh2;
     for(int gm = 1;gm <= a[ss][0];gm++){
      drive = 1;
      for(int anc = 0;anc < nn2;anc++){
       drive = drive * gm;
      }
      wq = drive * nn1 + nn3;
      if(isPrime(wq)==true){
       if(stra[0].equals("D")||stra[0].equals("E")){
        ggh++;
       }else{
        System.out.println(gm + ":" + wq);
       }
      }
     }
     if(stra[0].equals("D")){
      ggh2 = ((double)ggh / (double)a[ss][0]) * 100;
      System.out.println("素数含有量:" + ggh + "個");
      System.out.println("素数割合:" + ggh2 + "%");
     }else if(stra[0].equals("E")){
      ggh2 = ((double)ggh / (double)a[ss][0]) * 100;
      return ggh2;
     }
    }
   }
   else{
    System.out.println("error AとB以外を入力している可能性");
   }
   ss++;
   try{
    repeat();
   }
   catch(IOException e){
    System.out.println("error");
   }
  }
 }
//以下Prime同様(省略)


以下Prime

import java.io.*;

public class Prime{
 static int ss = 0;
 static int[][] a = new int[50][20];
 static int[] data = new int[3];
 static String[] str10a;
 static String[] stra;
 static long drive = 1;
 public static void main(String []args) throws IOException {
  BufferedReader input = new BufferedReader (new InputStreamReader (System.in));
  System.out.println("初期設定を行います。");
  System.out.println("本ソフトでは主にan^s+bの計算を行います。");
  startSetting();
  calcu();
 }
 public static void startSetting()throws IOException {
  BufferedReader input = new BufferedReader (new InputStreamReader (System.in));
  System.out.println("a,s,bを入力してください。例えば3n^5+1にしたいならば、");
  System.out.println("3 5 1");
  System.out.println("と入力します。");
  String str10 = input.readLine( );
  System.out.println("数字指定ならば大文字A。全数指定ならば大文字B。素数探索ならば大文字C。素数含有量測定ならば大文字Dを入力してください。");
  System.out.println("また、スペースを入力して、調査対象の数を入力してください。例えば17の全数指定は、");
  System.out.println("B 17");
  System.out.println("と入力します。");
  String str = input.readLine( );
  String[] wind = str.split(" ");
  String[] wind2 = str10.split(" ");
  str10a = new String[wind2.length];
  stra = new String[wind.length];
  for(int i = 0;i < stra.length;i++){
   stra[i] = wind[i];
  }
  for(int i = 0;i < str10a.length;i++){
   str10a[i] = wind2[i];
  }
  for(int anc = 1;anc <= stra.length - 1;anc++){
   a[ss][anc - 1] = Integer.parseInt(stra[anc]);
  }
  for(int anc = 0;anc < 3;anc++){
   data[anc] = Integer.parseInt(str10a[anc]); 
  }
 }
 public static void calcu(){
   if(stra[0].equals("A")){
    long s;
    for(int i = 0;i < 20;i++){
     if(!(a[ss][i] == 0)){
      drive = 1;
      for(int anc = 0;anc < data[1];anc++){
       drive = (drive * a[ss][i]);
      }
      s = drive * data[0] + data[2];
      if(isPrime(s)==true){
       System.out.println(a[ss][i] + "の計算結果:" + s + "素数");
      }
      else{
       System.out.println(a[ss][i] + "の計算結果:" + s + "合成数");
      }
     }
    }
   }
   else if(stra[0].equals("B")){
    long grow;
    for(int r = 1;r <= a[ss][0];r++){
     drive = 1;
     for(int anc = 0;anc < data[1];anc++){
      drive = drive * r;
     }
     grow = drive * data[0] + data[2];
     if(isPrime(grow)==true){
      System.out.println(r + "の計算結果:" + grow + "素数");
     }
     else{
      System.out.println(r + "の計算結果:" + grow + "合成数");
     }
    }
   }
   else if(stra[0].equals("C")||stra[0].equals("D")){
    long wq;
    long ggh = 0;
    double ggh2;
    for(int gm = 1;gm <= a[ss][0];gm++){
     drive = 1;
     for(int anc = 0;anc < data[1];anc++){
      drive = drive * gm;
     }
     wq = drive * data[0] + data[2];
     if(isPrime(wq)==true){
      if(stra[0].equals("D")){
       ggh++;
      }else{
       System.out.println(gm + ":" + wq);
      }
     }
    }
    if(stra[0].equals("D")){
     ggh2 = ((double)ggh / (double)a[ss][0]) * 100;
     System.out.println("素数含有量:" + ggh + "個");
     System.out.println("素数割合:" + ggh2 + "%");
    }
   }
   else{
    System.out.println("error AとB以外を入力している可能性");
   }
   ss++;
   try{
    repeat();
   }
   catch(IOException e){
    System.out.println("error");
   }
 }
 public static void repeat()throws IOException{
  try{
   BufferedReader input = new BufferedReader (new InputStreamReader (System.in));
   System.out.println("同じa,s,bでnを変えて実行するならば大文字A。(計算モード変更可能)");
   System.out.println("a,s,bを再設定するならば大文字B。");
   System.out.println("終了ならば大文字C。");
   String repeat = input.readLine( );
   if(repeat.equals("A")){
    System.out.println("数字指定ならば大文字A。全数指定ならば大文字B。素数探索ならば大文字Cを入力してください。");
    System.out.println("また、スペースを入力して、調査対象の数を入力してください。例えば17の全数指定は、");
    System.out.println("B 17");
    System.out.println("と入力します。");
    String str = input.readLine( );
    String[] wind = str.split(" ");
    stra = new String[wind.length];
    for(int i = 0;i < stra.length;i++){
     stra[i] = wind[i];
    }
    for(int anc = 1;anc <= stra.length - 1;anc++){
     a[ss][anc - 1] = Integer.parseInt(stra[anc]);
    }
    calcu();
   }
   else if(repeat.equals("B")){
    startSetting();
    calcu();
   }
   else if(repeat.equals("C")){
    return;
   }
   else{
    System.out.println("error");
   }
  }
  catch(IOException e){
   System.out.println("error");
  }
 }
 public static boolean isPrime(long num) {
  if (num < 2) return false;
  else if (num == 2) return true;
  else if (num % 2 == 0) return false; 
  double sqrtNum = Math.sqrt(num);
  for (int i = 3; i <= sqrtNum; i += 2){
   if (num % i == 0){
    return false;
   }
  }
  return true;
 }
}

 試したこと

括弧の対応はできるだけ探しました。

 補足情報(FW/ツールのバージョンなど)

java 9.0.1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2018/04/24 00:16

    「以下Primeと同様」というのは、どこからどう「同様」なのでしょうか?

    キャンセル

  • keita135

    2018/04/24 18:02 編集

    文字数的に入りきらなかったため、省略しました。Prime2のコメントを入れた部分からPrimeのコードのコメントを入れたところに当たる文までまったく同じです。

    キャンセル

  • swordone

    2018/04/24 18:26

    「Primeのコードのコメントを入れたところ」とはどこですか?

    キャンセル

回答 4

checkベストアンサー

+2

まだ全部見れていませんが、この手のエラーは往々にして{}の対応が取れておらず、メソッドの外側に処理を書いてしまっているパターンがほとんどです。

怪しいのは、calcuメソッドの中にsycaメソッドがあるように見えるところですが…

 追記 Eclipseに転記してみた

コード転記
calcuメソッドまで転記してみました。赤線はまたisPrimeメソッドを宣言してなかったり、配列インデックスにStringを指定(!?)していたりするためですが…
一番下の}は、クラス作成時に出るクラスを閉じる}です。112行目の}がcalcuメソッド最後の}、あるいはsycaメソッドの直前の}です。これは90行目のelseを閉じる}であり、calcuメソッドはまだ終わっていません。
この続きにsycaメソッドが記述されていることになり、やはりメソッドの中にメソッドを宣言しているためのエラーだと思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/24 18:10

    https://www.javadrive.jp/start/method/index2.html
    を見るとメソッドの中にメソッドはいいという感じで書かれているのですが。どうすればいいのでしょう。

    キャンセル

  • 2018/04/24 18:49

    何処の記述でしょうか?

    キャンセル

  • 2018/04/24 22:41

    > https://www.javadrive.jp/start/method/index2.html
    を見る限り、メソッド内にメソッドの宣言は無いようです。
    まずは、sycaメソッドをcalcuメソッドの外側におきましょう。

    キャンセル

  • 2018/04/24 23:04

    メソッドの呼び出しと混同していませんか?
    メソッドの中でメソッドを呼び出すことはできますが、メソッドを宣言することはできません。

    キャンセル

  • 2018/04/25 16:26

    納得です。ありがとうございます。

    キャンセル

+1

ざっと見た限り、括弧はあってそうな雰囲気ですが、、、
エラーメッセージの最初と最後の数行を見てみましょう。
どちらかに大元の原因となるエラーがある筈です。
まあ、一つとは限りませんが、一つエラーを取るとエラー数が大幅に減る事が多いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

ざっと見て気づいたことを書きますね。
ご参考になれば。

(1)
void なのに何かを返すそうとしている。
戻り値を削るか、voidを戻したい型にするか。

public static void syca(long nn1, long nn2, long nn3) {
…
            return ggh2;
…
}


(2)
上記のsycaメソッドは引数がlongなのに、intで渡している箇所がある。
longかintのどちらかに揃えるか、渡す前にlong型に変換を。

    static int[] data = new int[3];
…
     syca(data[0],data[1],data[2]);


(3)
Stringを配列サイズにして初期化しようとしている。
Stringに入っている要素を数字として扱いたいなら、Integer.parseInt()とかで型変換を。

    static String[] stra;
…
    double[][][] gman = new double[stra[0]][stra[0]][stra[0]];


(4)
Stringとlongを演算子>=で比較しようとしている。
Stringに入っている要素を数字として扱いたいなら(以下略)

    static String[] stra;
…
     for(long dn = 1;stra[0] >= dn;dn++){
      for(long dn2 = 1;stra[0] >= dn2;dn2++){
       for(long dn3 = 1;stra[0] >= dn3;dn3++){

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

swordoneさんも書かれていますが、calcuメソッドの閉じ括弧が足りない気がします。
もしこんな感じをイメージされていましたら、最後に括弧が2つ追加する必要があると思います。

    public static void calcu() {
        if (stra[0].equals("A")) {
…
        } else if (stra[0].equals("B")) {
…
        } else if (stra[0].equals("C") || stra[0].equals("D") || stra[0].equals("E")) {
            if (stra[0].equals("C") || stra[0].equals("D")) {
…
            } else {
…
                double tta;
                for (long dn = 0; gman.length > dn; dn++) {
                    for (long dn2 = 0; gman[(int) dn].length > dn2; dn2++) {
                        for (long dn3 = 0; gman[(int) dn][(int) dn2].length > dn3; dn3++) {
                            if ((dn == 0) && (dn2 == 0) && (dn3 == 0)) {
                                tta = gman[(int) dn][(int) dn2][(int) dn3];
                            } else {
                                tta = Math.max(gman[(int) dn][(int) dn2][(int) dn3], tta);
                            }
                        }
                    }
                }
                System.out.println(tta + "%");
            }
        }
    }


あと上記のdouble ttaは宣言時に初期化しておかないと、
後続のMath.maxやprintlnの引数で使えないためご注意を。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14470questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。