• 締切済み

Java言語プログラミングに関して質問です

以下の問いでソースを作りました。 問.2次元上の円と長方形を表すデータファイルが与えられたとき、以下の処理を行うプログラムを作成せよ。ただし、長方形は必ず座標軸に並行変を持つとする。 1.全図形の合計面積を表示せよ 2.一番面積の大きい図形データを表示せよ 3.周の長さ順に図形データを表示せよ 4.重なり合ってるすべての円のペアを列挙せよ 5.重なり合っているすべての図形のペアも列挙せよ 図形データの例 1. 1, 50.0, 50.0, 50.0 2. 2, -100.0, 100.0, 0.0, 0.0 3. 1, 0.0, 0.0, 10.0 4. 1, 50.0, 0.0, 30.0 5. 2, -75.0, 75.0, -25.0, 25.0 class Shape{ int id; int type; public double getArea() { return 0.0; } public double getPerimeter() { return 0.0; } } class Circle extends Shape{ double cx,cy; double r; Circle(int id, int type, double cx, double cy, double r){ this.id = id; this.type = type; this.cx = cx; this.cy = cy; this.r = r; } public double getArea(){ return 3.14159265 * r * r; } public double getPerimeter(){ return 3.14159265 * 2 * r; } } class Rectangle extends Shape{ double lx,ly,rx,ry; Rectangle(int id,int type,double lx,double ly,double rx,double ry){ this.id = id; this.type = type; this.lx = lx; this.ly = ly; this.rx = rx; this.ry = ry; } public double getArea(){ return (rx - lx) * (ly - ry); } public double getPerimeter(){ return 2 * (ly - ry) + 2* (lx - rx); } } class ShapeTest{ public static void main(String[] args) { Shape shapes[] = new Shape[5]; shapes[0] = new Circle(1, 1, 50.0, 50.0, 50.0); shapes[1] = new Rectangle(2, 2, -100.0, 100.0, 0.0, 0.0); shapes[2] = new Circle(3, 1, 0.0, 0.0, 10.0); shapes[3] = new Circle(4, 1, 50.0, 0.0, 30.0); shapes[4] = new Rectangle(5, 2, -75.0, 75.0, -25.0, 25.0); double sum = 0.0; for(int i=0;i<shapes.length;i++){ sum += shapes[i].getArea(); } System.out.println("合計面積は " +sum); Shape maxShape = shapes[0]; for(int i=1;i<shapes.length;i++){ if(shapes[i].getArea() > maxShape.getArea()){ maxShape = shapes[i]; } } System.out.println("一番面積の大きい図形は ID=" + maxShape.id); for(int i=0;i<shapes.length-1;i++){ for(int j=i+1;j<shapes.length;j++){ if(shapes[j].getArea() > shapes[i].getArea()){ Shape tmp = shapes[i]; shapes[i] = shapes[j]; shapes[j] = tmp; } } } System.out.println("周の長さの大きい順は "); for(int i=0;i<shapes.length;i++){ System.out.print(" " +shapes[i].id); } System.out.println(); } } //実行結果 合計面積は 23495.574275 一番面積の大きい図形は ID=2 周の長さの大きい順は 2 1 4 5 3 この問題ですが、周の長さの大きい順は2→1→5→4→3になり、問4、5ができていません。どうしたらよろしいですか?教えてください。解説とソースをお願いします。

  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

プログラムを見ると for(int i=0;i<shapes.length-1;i++){ for(int j=i+1;j<shapes.length;j++){ if(shapes[j].getArea() > shapes[i].getArea()){ Shape tmp = shapes[i]; shapes[i] = shapes[j]; shapes[j] = tmp; } } } ここで、getArea()の値でソートしているようですが、上の定義を見ると、getAreaは面積を求めるメソッドではないでしょうか? 「周の長さ順に図形データを表示せよ」なのに、面積で並びかえても意味はないでしょう。 4,5は、まずは数学(算数?)の問題として解いて、それをプログラムで表現してみましょう。 # 余談ですけど、Math.PI ってのがあるんだから、使ったらどうです? # http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#PI

関連するQ&A

  • Java言語プログラミングについて質問です

    以下の問で以下のようなソースを作りました。 問.2次元上の円と長方形を表すデータファイルが与えられたとき、以下の処理を行うプログラムを作成せよ。ただし、長方形は必ず座標軸に並行変を持つとする。 1.全図形の合計面積を表示せよ 2.一番免責の大きい図形データを表示せよ 3.周の長さ順に図形データを表示せよ 4.重なり合ってるすべての円のペアを列挙せよ class Shape{ int id; int type; public double getArea() { return 0.0; } public double getPerimeter() { return 0.0; } } class Circle extends Shape{ double cx,cy; double r; Circle(int id, int type, double cx, double cy, double r){ this.id = id; this.type = type; this.cx = cx; this.cy = cy; this.r = r; } public double getArea(){ return 3.14159265 * r * r; } public double getPerimeter(){ return 3.14159265 * 2 * r; } } class Rectangle extends Shape{ double lx,ly,rx,ry; Rectangle(int id,int type,double lx,double ly,double rx,double ry){ this.id = id; this.type = type; this.lx = lx; this.ly = ly; this.rx = rx; this.ry = ry; } public double getArea(){ return (rx - lx) * (ly - ry); } public double getPerimeter(){ return 2 * (ly - ry) + 2* (lx - rx); } } class ShapeTest{ public static void main(String[] args) { Shape shapes[] = new Shape[5]; shapes[0] = new Circle(1, 1, 50.0, 50.0, 50.0); shapes[1] = new Rectangle(2, 2, -100.0, 100.0, 0.0, 0.0); shapes[2] = new Circle(3, 1, 0.0, 0.0, 10.0); shapes[3] = new Circle(4, 1, 50.0, 0.0, 30.0); shapes[4] = new Rectangle(5, 2, -75.0, 75.0, -25.0, 25.0); double sum = 0.0; for(int i=0;i<shapes.length;i++){ sum += shapes[i].getArea(); } System.out.println("合計面積は " +sum); Shape maxShape = shapes[0]; for(int i=1;i<shapes.length;i++){ if(shapes[i].getArea() > maxShape.getArea()){ maxShape = shapes[i]; } } System.out.println("一番面積の大きい図形は ID=" + maxShape.id); for(int i=0;i<shapes.length-1;i++){    for(int j=i+1;j<shapes.length;j++){     if(shapes[j].getArea() > shapes[i].getArea()){      Shape tmp = shapes[i];      shapes[i] = shapes[j];       shapes[j] = tmp;      }     }    } System.out.println("周の長さの大きい順は "); for(int i=0;i<shapes.length;i++){ System.out.print(" " +shapes[i].id); } System.out.println(); } } 合計面積は 23495.574275 一番面積の大きい図形は ID=2 周の長さの大きい順は 2 1 4 5 3 問3まではできたのですが、問4がわかりません。どうしたらいいのですか?解説とソースをお願いします。汚いソースで買得も難しいと思いますがよろしくお願いします。

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

    次の問題をどう組んだらいいかわかりません。教えてください。 問.2次元上の円と長方形を表すデータファイルが与えられたとき、以下の処理を行うプログラムを作成せよ。ただし、長方形は必ず座標軸に並行変を持つとする。 1.全図形の合計面積を表示せよ 2.一番免責の大きい図形データを表示せよ 3.周の長さ順に図形データを表示せよ 4.重なり合ってるすべての円のペアを列挙せよ 5.重なり合っているすべての図形のペアも列挙せよ 図形データのフォーマットは以下のようなCSV形式で与えられているとする。 円  ID、1、中心点のX座標(double型)、中心点のY座標(double型)、半径(double型) 長方形 ID、2、左上の点のX座標(double型)、左上の点のY座標(double型)、右下の点のX座標(double型)、右下の点のY座標(double型) ただし、IDは図形間でユニークな整数値であるとする。 図形データの例 1. 1, 50, 0, 50, 0, 50.0 2. 2, -100, 0, 100, 0, 0, 0, 0, 0 3. 1, 0, 0, 0, 0, 10.0 4. 1, 50, 0, 0, 0, 30.0 5. 2, -75, 0, 75.0, -25.0, 25.0 まだ自分に知識がないので、この問題をどう組んだらいいかわかりません。教えてください。よろしくお願いします。解説とソースをお願いします。

  • javaのreturnはどんなことをするんですか?

    javaのreturnはどんなことをするんですか? この内容でthisも知りたいですが 簡単に教えてください!!!!! public class Circle3 { int r ; public Circle3(){ this(0); } public Circle3(int r){ this.r = r; } public double getCircumference(){ return 3.14 * 2* r; } public double getArea(){ return 3.14*r*r; } public int getRadius(){ return r; } public void setRadius(int r) { this.r = r; } }

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

    C言語において、区分求積法・台形公式・シンプソンの公式を行いたいのですがうまくいきません。 1/1+x*xを求めたいと思います。以下が途中まで作ったプログラムです。 #include <stdio.h> #define FROM 0.0 #define TO 1.0 double func(double x) { double out; out = 1.0 / ( 1.0 + x * x ); return (out); } double kubun(double start, double end, int num) { int i; double h, s; h = ( end - start ) / num; s = 0.0; for(i=0; i<num; i++) s += func( start + i * h + h / 2.0 ); return ( s * h ); } double daikei(double start,double end,int num) { int i; double h,s; h = ( end - start ) / num; s = 0.0; for(i=1; i<num-1; i++) s += func( i * h ); return ((start / 2.0 + s + end / 2.0) * h ); } double simpson(double start,double end,int num) { int i; double h,s; h = ( end - start ) / num; s = 0.0; for(i=1; i<num-1; i++) if(i%2 == 0){ s = 2 * func(i * h); }else{ s = 4 * func(i * h); } return ( (start + s + end) / 3 ); } 区分求積法はあったていると思いますが、不安なのでのせときます。 よろしくお願いします。

  • c言語プログラミングについて

    ニュートン法でx^2-2の根を初期値2、試行回数を200回までで求めるプログラムを作成しているのですがうまくいきません。 どなたかご教授お願いいたします。 #include<stdio.h> #include<math.h> int main() { int i; int N = 200; double x = 2.0; double xnew; double eps = 1e-16; for (i = 0; i < N; i++) { xnew = x - ( x * x - 2.0 ) / 2.0 * x; if (fabs(x - xnew) < eps) break; x = xnew; } printf("x=%.20lf\n", xnew); return(0); }

  • C言語プログラミングについて

    「要素数10の配列を準備する。 配列の各要素に0.0~1.0の乱数を入れる。 各配列に入力された乱数を出力する。 配列をオリジナル関数hanteiに渡す。 数hantei内において,各要素の値が0.5以上であれば1 , 0.5未満であれば0を出力する。」 C言語でこのような問題があるのですがどのように作ればよろしいのでしょうか? ちなみに以下のように作ってみて、「argcは一度も使用されていない」「argvは一度も使用されていない」とエラー(警告)が出てしまいました。修正、もしくは正しいプログラムを教えてくれませんか? #include <stdio.h> #include <time.h> #include <stdlib.h> #define SIZE 10 int hantei(double num) { return num>=0.5; } int main(int argc,char *argv[]) { double number[SIZE]; int i; srand((unsigned)time(NULL)); for(i=0;i<SIZE;i++) number[i]=(double)rand() / RAND_MAX; //手抜き乱数 for(i=0;i<SIZE;i++) { printf("%f %d\n",number[i], hantei(number[i])); } return 0; }

  • C言語のプログラムなのですが、2点の座標(SとR)を指定して片方からも

    C言語のプログラムなのですが、2点の座標(SとR)を指定して片方からもう片方への道筋を座標でcsvファイルに記述していくプログラムを作りたいのですが、うまく動きません。 参照渡しの所が間違っている様な気もするのですがわかりません。わかる方いましたらご指摘ください! エラー内容:Segmentation Fault(core dumped) #include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h> int Fugo(int); void Flooding(int *,int *,int *,int *); typedef struct{ int id; int dX; int dY; }NodeStates; NodeStates Node1[50]; NodeStates Node2[50]; int main(void) { int SX1,SY1; int RX1,RY1; int SX2,SY2; int RX2,RY2; int i=1; int j=1; FILE *fp; fp=fopen("test.csv","w"); if(fp!=NULL){ printf("S1 Node PointX>>"); scanf("%d",&SX1); printf("S1 Node PointY>>"); scanf("%d",&RX1); printf("R1 Node PointY>>"); scanf("%d",&RY1); Node1[0].id = 1; Node1[0].dX = SX1; Node1[0].dY = SY1; printf("S2 Node PointX>>"); scanf("%d",&SX2); printf("S2 Node PointY>>"); scanf("%d",&SY2); printf("R2 Node PointX>>"); scanf("%d",&RX2); printf("R2 Node PointY>>"); scanf("%d",&RY2); Node2[0].id=1; Node2[0].dX=SX2; Node2[0].dY=SY2; srand((unsigned int)time(NULL)); fprintf(fp,"First\n"); fprintf(fp,"NodeID,X,Y\n"); fprintf(fp,"%d,%d,%d\n",Node1[0].id, SX1, SY1); while(!(SX1==RX1 && SY1==RY1)){ Flooding(&SX1, &SY1, &RX1, &RY1); Node1[i].dX=SX1; Node1[i].dY=SY1; Node1[i].id=i+1; fprintf(fp,"%d,%d,%d\n",Node1[i].id,Node1[i].dX,Node1[i].dY); i++; } fprintf(fp,"Second\n"); fprintf(fp,"NodeID,X,Y\n"); fprintf(fp,"%d,%d,%d\n",Node2[0].id, SX2, SY2); while(!(SX2==RX2 && SY2==RY2)){ Flooding(&SX2,&SY2,&RX2,&RY2); Node2[j].dX=SX2; Node2[j].dY=SY2; Node2[j].id=j+1; fprintf(fp,"%d,%d,%d\n",Node2[j].id,SX2,SY2); j++; } } fclose(fp); return 0; } void Flooding(int *a,int *b,int *c,int *d){ int *e,*f,r; *a=*a-*c; *b=*b-*d; *e=Fugo(*a); *f=Fugo(*b); *a=abs(*a); *b=abs(*b); r=rand()%3; if(*a!=0&&*b!=0){ if(r==0){ *a=*a-1; } else if(r==1){ *a=*a-1; *b=*b-1; } else *b=*b-1; } else if(*a==0)*b=*a-1; else if(*b==0)*a=*b-1; *a=*a**e+*c; *b=*b**f+*d; } int Fugo(int a){ int n; if(a>=0){ n=1; } else{ n=-1; } return n; }

  • プログラミング

    以下のC++で書かれた以下のプログラムのコンパイルができません。理由を教えてください。 #include <iostream> #include <vector> #include <algorithm> istream& read(istream&, std::vector<double>&); double median(std::vector<double>); int main(){ std::vector<double> a; read(std::cin, a); std::vector<double>::iterator itr; while(itr != a.end()){ std::cout << *itr; } std::cout << median(a) << std::endl; } istream& read(istream& is, std::vector<double>& v){ double b; if(is){ while(in >> b) v.push_back(b); } return is; } double median(std::vector<double> a){ int i; if(a.size() == 0) { return -1; } i = a.size() / 2; if(a.size()%2 == 1) return (a[i]); else return ((a[i] + a[i-1])/2); }

  • C言語から質問です。

    C言語から質問です。 /* main関数の中で初期化した配列 data[10]={60,30,70,25,20,9,92,55,20,10}; を関数 keisan() に引数として渡して、関数keisan()内で 平均値、最大値,最小値 を求め、その結果をmain関数に戻し、main関数内で 平均値、最大値,最小値を表示させるプログラムを作成せよ。 int keisan(const int data[], int data_kosuu, double answer[]) { return 0; } とする。 (注) プロトタイプ宣言を用いよ。 ヒント:平均値,最大値,最小値の3つの値を main関数に戻すやり方として、配列answer[]を使うとよい。 data_kosuu は、配列の要素数を与えるものです。 ヒント: (int型の変数)/(int型の変数)=int型の値です。 int型同士の割り算の答えANSWERをdoubleにしたい場合は、  ANSWER=(double)(int型の変数)/(int型の変数);    と(double) キャストという操作をする必要がある */ #include <stdio.h> int keisan(const int data[], int data_kosuu, double answer[]); int main(void) { int i; int a[10]={60,30,70,25,20,9,92,55,20,10}; // この値を使ってください double ans[3]; keisan(a,10); /* keisan関数に配列と配列要素数を引数で与える */ for(i=0; i<10 ; i++) printf("a[%d]=%d\n",i,a[i]); printf("平均=%lf 最小値=%d 最大値=%d\n",ans[0],ans[1],ans[2]); return 0; } /* 合計・最大値・最小値を求める関数 */ int keisan(const int data[], int data_kosuu, double answer[]) { int i; int sum; int min,max; min=10; /* min の初期化 */ max=10; /* max の初期化 */ sum=0; /* 合計値の初期化 */ for (i=0; i<10 ; i++){ sum = sum+data[i]; if(data[i] > max) max=data[i]; if(data[i] < min) min=data[i]; } sum=sum/10; answer[0]=sum; answer[1]=min; answer[2]=max; } エラー error C2198: 'keisan' : 呼び出しに対する引数が少なすぎます。 とでて先に進めません。 教科書などを見ても間違いがわかりません; 虫食いになってるところを自分なりにやってみたため、 根本的に間違ってるかもしれませんが、 どうかアドバイスや指摘などをお願いします。

  • c言語についての質問です

    #include<stdio.h> #define N 3 void inputAns(int *row,int *col,int data[][N]); void printAns(int ID,int data[][N]); int main(){ int row[N]={2,3,6},col[N]={8,5,3},answer[N][N]; int i,ID; printf("Input your ID number :\n"); scanf("%d",&ID);inputAns(row,col,answer); printAns(ID,answer); return(1); } void inputAns(int *row,int *col,int data[][N]){ int i,j; printf(" Input Answers of matrxi Q :\n"); for(i=0;i<N;i++){ for(j=0; j<N; j++){ printf("%2d+%2d=",row[i],col[j]); scanf("%d",&data[i][j]); } } } void printAns(int ID, int data[][N]){ FILE *fp; int i,j; fp=fopen("ans.dat","a+t"); fprintf(fp,"%d\n",ID); for(i=0; i<N; i++){ for(j=0; j<N; j++) fprintf(fp," %3d",data[i][j]); fprintf(fp,"\n"); } fclose(fp); } この百マス計算のプログラムの28行目からを書き換えて以下のような画面出力を求めたいです。 >./a.exe ID=50413001 [ 9/9 ] ID=50413002 [ 5/9 ] ID=50413003 [ 7/9 ] ID=50413004 [ 6/9 ] ID=50413005 [ 5/9 ] == correct rate === 4/5 3/5 5/5 5/5 1/5 4/5 4/5 1/5 5/5 =================== > 読み込むファイル(ans.dat)は以下のものです。 50413001 10 7 5 11 8 6 14 11 9 50413002 10 7 5 11 9 5 13 10 9 50413003 10 7 5 11 5 6 14 10 9 50413004 10 11 5 11 5 6 14 10 9 50413005 9 11 5 11 5 6 14 10 9 読み込みから集計がうまくいかず困っています。 どなたか教えてくれませんか?

専門家に質問してみよう