オブジェクトを定義してからの計算が出来ない

このQ&Aのポイント
  • オブジェクトを定義してからの計算ができないエラーが発生します。
  • mathクラスのaddメソッドで互換性のない型のエラーが発生します。
  • 解決方法がわからず、詳しい方に助けを求めています。
回答を見る
  • ベストアンサー

オブジェクトを定義してからの計算が出来ない

質問内容はタイトルどおりです。 まず、以下のようなソースを書きました。 class math{ public int ma; public int mb; math(){ ma=0; mb=0; } math(int n){ ma=n; mb=0; } math(int n,int m){ ma=n; mb=m; } int add(int num){ math omath=new math(); omath.ma=this.ma+num; omath.mb=this.mb*num; omath=omath.ma+omath.mb; return omath; } } これで実際にコンパイルすると下のようなエラーが出てしまいました。 math.java:25: 互換性のない型 検出値 : int 期待値 : math omath=omath.ma+omath.mb; ^ math.java:27: 互換性のない型 検出値 : math 期待値 : int return omath; ^ エラー 2 個 参考書等も何冊か読んでみたのですがいい解決法が見つかりません。 詳しい方がいましたら教えていただけるとありがたいです。 よろしくお願い致します。

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

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

  • ベストアンサー
  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.3

クラス、コンストラクタ、メソッドがパッケージプライベートで、 クラスレベル変数がパブリックになっているのは、非常に不自然です。 何かの誤解があるのだと思われます。 そこで、クラス、コンストラクタ、メソッドをパブリックにして、 クラスレベル変数をプライベートにして、パブリックなsetter/getterで アクセスするように作り直してみました。 --- Math2.java --- public class Math2{  private int ma;  private int mb;  public Math2(){   setMa( 0 );   setMb( 0 );  }  public Math2(int ma){   setMa( ma );   setMb( 0 );  }  public Math2(int ma, int mb){   setMa( ma );   setMb( mb );  }  public int getMa(){   return ma;  }  public void setMa(int ma){   this.ma = ma;  }  public int getMb(){   return mb;  }  public void setMb(int mb){   this.mb = mb;  }  public int add(int num){   return ma+num + mb*num;  } } そして、これを以下のメインクラスから実行してみてください。 所望の結果が得られるのではないかと思います。 --- Math2Main.java --- public class Math2Main{  public static void main(String[] args) {   Math2 math2 = new Math( 3, 4 );   int ans = math2.add( 5 );   System.out.println( ans );  } } プログラミングの入力には、Eclipse等の統合開発環境を入手して 使用されることをお勧めします。 高性能な入力アシスタント機能がありますので、初歩的なレベルの 間違いは、的確な修正候補も表示してくれるでしょう。

newjava
質問者

お礼

回答ありがとうございます。 おっしゃられた通りにやってみると通りました。 まだ細かい部分では理解できていないところも多いですが、 今後学習していけば分かると思います。 丁寧な説明ありがとうございました。

その他の回答 (2)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.2

>maとmbの合計値を入力した値を出力として出したい それだけですか? それなら、new omath 自体の必要性がわからなくなります。 int add(int num){ math omath=new math(); omath.ma=this.ma+num; omath.mb=this.mb*num; omath=omath.ma+omath.mb; return omath; } これは int add(int num){ return (this.ma+num+this.mb*num); } これだけではないですか?

newjava
質問者

お礼

回答ありがとうございます。 無理やりオブジェクトを定義しようとしていたのが間違いだったんですね。 参考書を見ながら見よう見真似で作ったのでおかしなことになって混乱してしまいました。 返事が送れて申し訳ありませんが、本当に助かりました。 ありがとうございました。

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.1

結論として、どういう値をomathに入れたいのですか? というか、そもそも omathというのは、mathという形をした入れ物なので、 maやmbという値をそれぞれの変数に入れることはできますが、 入れ物そのものであるomathに値を設定できないということです。 (容器に水を入れることはできるが水を容器にはできないという事) 何がしたいのか、頭の整理ができてないように思われます。

newjava
質問者

お礼

回答ありがとうございます。 やりたいこととしましては、maとmbの合計値を入力した値を出力として出したいと考えてます。 オブジェクト生成後に変数を加えるというのは不可能ということは分かりましたが、実際にどのような構文をくめばうまくいくのかがいまいちまだ分かってない状態です。

関連するQ&A

  • ガウスの消去法:C言語

    連立方程式をガウスの消去法を用いて解くプログラミングをVisual Studioで作成したいのですが、ビルドがうまくいきません ビルドをすると、 ・リンケージ指定子がグローバル スコープで宣言されていません ・直前のエラーを修復できません。コンパイルを中止します。 と表示されデバックできません。 どなたかご教授願います。 ちなみに、C++ win32コンソールアプリケーションを使用しています。 ソースコード↓ #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { #include <stdio.h> #include <math.h> #define EPS 1.0e-5 #define N 10 void DATAIN(char name[], int nr, int nc, double ma[]); void RESULT(char name[], int nr, int nc, double ma[]); int PIVOT(int *num, int nr, int k, double ma[]); int GAUSS(int nr, double ma[], double mb[], double mx[]); int main(void) { int nr,nc; int flag; double ma[N*N],mb[N],mx[N]; printf("方程式の数 nr="); scanf("%d",&nr); nc=nr; printf("\n配列maのデータ%d*%d=%d",nr,nr,nr*nr); printf("個を入力"); DATAIN("ma",nr,nc,ma); printf("\n配列mbのデータ %d 個を",nr); printf("入力してください"); DATAIN("mb",nr,1,mb); flag=GAUSS(nr,ma,mb,mx); if(flag) printf("計算不能"); else RESULT("mx",nr,1,mx); return (0); } void DATAIN(char name[], int nr, int nc, double ma[]) { int i,j; printf("\n---入力データ---\n"); for(i=0; i<nr; i++) { for(j=0; j<nc; j++) { printf(" %s[%d%d] = ",name,i+1,j+1); scanf("%lf",&ma[nc*i+j]); } } } void RESULT(char name[], int nr, int nc, double ma[]) { int i,j; printf("\n---計算結果---\n"); for(i=0; i<nr; i++) { for(j=0; j<nc; j++) printf(" %s[%d] = %8.5lf",name,i+1,ma[nc*i+j]); printf("\n"); } } int PIVOT(int *num, int nr, int k, double ma[]) { int i; double aa,bb; *num=k; aa=fabs(ma[nr*k+k]); for(i=k+1; i<nr; i++) { if (fabs(ma[nr*i+k])>aa) { *num=i; aa=fabs(ma[nr*i+k]); } } if(fabs(aa)<=EPS) return (1); if(*num==k) return (0); for(i=k; i<nr; i++) { bb=ma[nr*k+i]; ma[nr*k+i]=ma[nr*(*num)+i]; ma[nr*(*num)+i]=bb; } return (0); } int GAUSS(int nr, double ma[], double mb[], double mx[]) { int i,j,k; int num; double cc; for(k=0; k<nr-1; k++) { if(PIVOT(&num,nr,k,ma)!=0) return (1); if(num!=k) { cc=mb[num]; mb[num]=mb[k]; mb[k]=cc; } for(i=k+1; i<nr; i++) { cc=ma[nr*i+k]/ma[nr*k+k]; for(j=k+1; j<nr; j++) ma[nr*i+j]=ma[nr*i+j]-cc*ma[nr*k+j]; mb[i]=mb[i]-cc*mb[k]; } } for(k=nr-1; k>=0; k--) { if(fabs(ma[nr*k+k])<=EPS) return(1); cc=0.0; for(j=k+1; j<nr; j++) cc+=ma[nr*k+j]*mx[j]; mx[k]=(mb[k]-cc)/ma[nr*k+k]; } return (0); } return 0; }

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

  • C言語で行列の積を計算できるような関数を作って疑問に思ったことがありま

    C言語で行列の積を計算できるような関数を作って疑問に思ったことがあります。 まず↓のような2x3行列と3x2行列が計算できる関数を作りました、、 #include <stdio.h> void mul(const int ma[2][3],const int mb[3][2],int mc[2][2]) { int i,j,k; for(i = 0; i < 2; i++) for(j = 0;j < 2;j++) for(k=0;k<3;k++) mc[i][j]+=ma[i][k]*mb[k][j]; } int main(void) { int i,j; int ma[2][3] ={{1,2,3},{4,5,6}}; int mb[3][2] ={{7,8},{9,0},{1,2}}; int mc[2][2] ={0}; mul(ma,mb,mc); for(i = 0;i < 2; i++) { for(j = 0;j < 2;j++) printf("%4d",mc[i][j]); putchar('\n'); } eturn(0); } ---------------------------------- これをmxn,nxp行列で計算できるような関数にしたいと思い 下のようにしたのですがエラーになります。どうしたらいいでしょうか・・? #include <stdio.h> void mul(const int ma[int m][int n],const int mb[int n][int p],int mc[m][p]) { int i,j,k; for(i=0;i<m;i++) for(j=0;j<p;j++) for(k=0;k<n;k++) mc[i][j]+=ma[i][k]*mb[k][j]; } int main(void) {int i,j; int ma[2][3] ={{1,2,3},{4,5,6}}; int mb[3][2] ={{7,8},{9,0},{1,2}}; int mc[2][2] ={0}; mul(ma,mb,mc); for(i = 0;i < 2; i++) {for(j = 0;j < 2;j++) printf("%4d",mc[i][j]); putchar('\n');} return(0);}

  • 困ってます…nCrを求めるC言語プログラミング

    nCr、つまりn個のうちr個を取り出すときの場合の数を求めるプログラミングを作りたいのですが、どうもうまくいきません。 関数combinationを作って求めるという指定もあり、自分で出来るとこまで作ってみたのですが訳がわからなくなってしまい、かなり困っています…; コンパイルは出来るのですが実行してもセグメントエラーが出るばかりで… すみませんがご指摘していただけないでしょうか…? #include<stdio.h> //階乗を計算する関数 int fact(int num){ int i; if(num < 0){ return -1; } else if(num == 0){ return 1; } else if(num == 1){ return 1; } else { i = num * fact(num - 1); return i; } } //コンビネーションを計算 int combination(int n, int r) { int fact(int num); int i; i=fact(n)/fact(r)/fact(n-r); return combination(n-1, r-1)-combination(n,r-1); } int main(void) { int n, r; while ( printf("n r を入力して下さい。"), scanf("%d%d", &n, &r) == 2 ) { printf("nCr(%d,%d)=%d\n", n, r, combination(n, r)); } return 0; }

  • ポインタ渡しについて

    関数の引数をint型のポインタで出力し、その関数を呼び出し側で値を取得するにはどうしたらいいのでしょうか? 一応ソースを作成しました(下記参照)が、ほしい値が出てきません。 よろしくお願い致します。 ----------------------------------------------- #include <stdio.h> int check(int *num){ int n=10; num = &n; return 0; } int main() { int m_num; check(&m_num); printf("%d\n",m_num); return 0; } ----------------------------------------- m_numに、10が格納されません。 check()でアドレス渡しをしたのですが・・・。 どうすれば、main関数で、数値を扱うことが出来ますか? よろしくお願い致します。

  • 数独解答判定プログラム

    数独の解答判定プログラムを作成しているのですが、完成しません。下に僕の作ったプログラムを載せておくので間違い等の指摘をお願いします。 #include <stdio.h> #define row 9 #define column 9 int question[row][column]={ 915284376, 273916584, 468753912, 396178245, 742365891, 851492637, 629847153, 587631429, 134529768, }; int num; int singlenumber(void); int saferow(int, int); int safecolumn(int, int); int safebox(int, int, int); int main(void){ int judge; for(num = 1; num <= 9; num++){ int singlenumber(void); } if(judge == 0){ printf("おめでとう!! 正解です。"); }else{ printf("残念!! 不正解です。"); } return 0; } int singlenumber(void){ int i, j; int row_judge; int column_judge; int box_judge; int judge; for(i = 0; i < row; i++){ int saferow(int i, int num); } for(j = 0; j < column; j++){ int safecolumn(int j, int num); } for(i = 0; i < row; i++){ for(j = 0; j < column; j++){ int safebox(int i, int j, int num); } } if(row_judge == 0 && column_judge == 0 && box_judge == 0){ judge = 0; }else{ judge = 1; } return judge; } int saferow(int i, int num){ int k; int row_judge; for(k = 0; k < column; k++){ if(num == question[i][k]){ row_judge = 0; }else{ row_judge = 1; } } return row_judge; } int safecolumn(int j, int num){ int l; int column_judge; for(l = 0; l < row; l++){ if(num == question[l][j]){ column_judge = 0; }else{ column_judge = 1; } } return column_judge; } int safebox(int i, int j, int num){ int m, n; int box_judge01, box_judge02, box_judge03; int box_judge11, box_judge12, box_judge13; int box_judge21, box_judge22, box_judge23; int box_judge0, box_judge1, box_judge2, box_judge; for(m = 0; m < row ; m++){ if(m / 3 == 0){ for(n = 0; n < 3; n++){ if(num == question[m][n]){ box_judge01 = 0; }else{ box_judge01 = 1; } } for(n = 3; n < 6; n++){ if(num == question[m][n]){ box_judge02 = 0; }else{ box_judge02 = 1; } } for(n = 6; n < 9; n++){ if(num == question[m][n]){ box_judge03 = 0; }else{ box_judge03 = 1; } } } if(box_judge01 == 0 && box_judge02 == 0 && box_judge03 == 0){ box_judge0 = 0; }else{ box_judge0 = 1; } if(m / 3 == 1){ for(n = 0; n < 3; n++){ if(num == question[m][n]){ box_judge11 = 0; }else{ box_judge11 = 1; } } for(n = 3; n < 6; n++){ if(num == question[m][n]){ box_judge12 = 0; }else{ box_judge12 = 1; } } for(n = 6; n < 9; n++){ if(num == question[m][n]){ box_judge13 = 0; }else{ box_judge13 = 1; } } } if(box_judge11 == 0 && box_judge12 == 0 && box_judge13 == 0){ box_judge1 = 0; }else{ box_judge1 = 1; } if(m / 3 == 2){ for(n = 0; n < 3; n++){ if(num == question[m][n]){ box_judge21 = 0; }else{ box_judge21 = 1; } } for(n = 3; n < 6; n++){ if(num == question[m][n]){ box_judge22 = 0; }else{ box_judge22 = 1; } } for(n = 6; n < 9; n++){ if(num == question[m][n]){ box_judge23 = 0; }else{ box_judge23 = 1; } } } if(box_judge21 == 0 && box_judge22 == 0 && box_judge23 == 0){ box_judge2 = 0; }else{ box_judge2 = 1; } if(box_judge0 == 0 && box_judge1 == 0 && box_judge2 == 0){ box_judge = 0; }else{ box_judge = 1; } } return box_judge; }

  • コードの意味を解説して頂けないでしょうか。

    【問題文】addメソッドはNumberクラスの参照を引数にとり、 自分の数との合計値をフィールドに持つ新しいオブジェクトを作成して返します。 (わかりやすいjavaオブジェクト指向入門編 P135より) package ex6_2; public class Number { private int n; public Number(int n){this.n = n;} public int getN(){return n;} public Number copy(){ Number num = new Number(n); return num; } public Number add(Number m){ return new Number(n+m.n); } } package ex6_2; public class Exec { public static void main(String[] args) { Number a = new Number(10); Number b = new Number(100); Number c = a.add(b); System.out.println("a + b =" + c.getN()); } } 実行結果 a + b = 110 「return new Number(n+m.n);」と「Number c = a.add(b);」が問題の空欄部分です。 前者の「Number(n+m.n)」が何を意味しているのか全く分かりません。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • Java

    Javaでマップデータを作成しています。 クラス図が下記で クラス名:MapData 属性:-data:int[][] 操作:+MapData(data:int[][]) +MapData(line:int,column:int)int コードにすると class MapData{ private int[][] data; public MapData(int data[][]){ this.data=data; } public int getMapData(int line,int column){ return data; } } になると思うのですが、returnの部分で互換性のない型 期待値:int 検出値: int[]:[] とでます。なぜでしょうか? ご指摘、ご指南お願い致します。

  • 10の302乗の計算またはDoubeのキャストについて教えて下さい。

    java言語で質問があります。よろしくお願い致します。 次のプログラムを作成し、2点質問をさせて下さい。 まずは10の302乗を計算したいときとキャストを調べたところdouble型はできないのでどう対処すればいいでしょうか。どうぞアドバイス下さい。class Enzanshi{ public static main(String args[]){ int num1; double num = num1*10^302; } } エラー内容はこうです。 C:\java>javac Enzanshi.java Enzanshi.java:2: メソッドの宣言が不正です。戻り値の型が必要です。 public static main(String args[]){ ^ Enzanshi.java:3: \65307 は不正な文字です。 int num1; ^ Enzanshi.java:4: \65307 は不正な文字です。 double num = num1*10^302; ^ エラー 3 個

  • 矩形法プログラムの計算値と計算誤差の求め方

    下記の矩形法の計算値を求めるプログラムで、区間分割数nを10から100まで10ずつ増やして計算値を求めるプログラムを作成したいのですが、どのようにしたらいいのか分かりません。Java初心者なのでJavaプログラムが詳しい人は至急ご連絡をお願いします。 *ちなみにこの矩形法プログラムのの計算誤差も分かる人はお願いしたいのですが・・・・・・  計算誤差の求め方は    計算誤差=(計算値ー真値)/真値×100(%) (真値=0.68269とする) public class Kukei { static double f(double x) { // ここに任意の被積分関数を記述 double y = Math.exp(- x * x / 2) / Math.sqrt(2.0 * Math.PI); return y; } public static void main(String[] args) { double a = - 1.0, b = 1.0; // 積分範囲 int n = 100; // 区間分割数 double h = (b - a) / (double)n; // 分割幅 double s = 0.0; for (int i=0; i < n; i++) { s += f(a + i * h); } s *= h; System.out.println("区間分割数 =" + n); System.out.println("矩形法による計算値 =" + s); } }

    • ベストアンサー
    • Java

専門家に質問してみよう