• 締切済み

構造体の問題なのですが・・

構造体型point の次の2次元配列を使って、入力した点がどの象限に含まれるかを数えるプログラムを作成せよ。 struct point table[5][100]; ただし、入力データの最大個数は100とする。 座標軸上の点はどの象限にも属さないとして、table[0]に格納するものとする。 また、下のような実行例を想定する。 http://www9.uploader.jp/user/kadaishu/images/kadaishu_uljp00005.jpg 今学校で構造体を習っていて、このような問題をやっているのですが どうすればいいのかよくわかりません。 どなたかご教授よろしくお願いします。

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.8

実行例の画像ではファイルから入力してるので入力待ちではないと思います。 ./a.out < point-data.txt int i, j, x, y, s, num[5] = {0}; /* num[ ]は0で初期化しないとだめです */ while (scanf("%d %d", &x, &y) != EOF) { //for(i=0;i<100;i++){ /* 100回も繰り返す必要はありません メインのエラー原因はこれです(後述のバッファーオーバーフロー)*/ if(x>0 && y>0) s=1; if(x<0 && y>0) s=2; if(x<0 && y<0) s=3; if(x>0 && y<0) s=4; else s=0; /* これだとsは4か0にしかならないです 2番目以降の if を else if にするか または s = 0;を最初にして最後のelse s=0;を削除 */ table[s][num[s]++].x = x; table[s][num[s]++].y = y; /* num[s]が2回インクリメントされてます。最初の++は不要。 1個のデータでnum[s]が200ずつ増えるためtable[ ]配列がすぐにバッファオーバーフローしてしまいます*/ //} }

shueruje
質問者

補足

なんとか作動はできました! ありがとうございました!

回答No.7

> すいません、コンパイルしたときには何もエラーはでないのですが、 単に、「データ入力待ち」で止まっているだけでしょう。 データ入力しましたか? まだ、バグは残っていて、どこかの象限「だけ」しかカウントされないはずですが。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.6

> こんな感じでやってみたのですが、エラーが出てしまいます。。 何をしたとき(コンパイル時?それとも実行時?)に どんなエラー(正確なエラーメッセージの内容)が出るのか、見ている人にわかるように 具体的に書いてください。

shueruje
質問者

補足

すいません、コンパイルしたときには何もエラーはでないのですが、 実際に実行してみると何も反応しないのです(何も表示されない

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

言語はCでしょうかC++でしょうか とりあえずCということでファイルからデータを入力するのは int x, y, quadrant; while (fscanf(stdin, "%d %d", &x, &y) != EOF) { /* x と yの符号で象限を決める */ if (x > 0 && y > 0) { quadrant = 1; } else if (穴埋め) { quadrant = 2; } else if (穴埋め) { quadrant = 3; } else if (穴埋め) { quadrant = 4; } else { quadrant = 0; } /* table[quadrant]構造体にx y を入力 */ } 見たいな感じですかね

shueruje
質問者

補足

Cです。すいません。 皆さんの意見を参考にして #include <stdio.h> struct point{ int x; int y; }; int main(void){ struct point table[5][100]; int i, j, x, y, s, num[5]; while (scanf("%d %d", &x, &y) != EOF) { for(i=0;i<100;i++){ if(x>0 && y>0) s=1; if(x<0 && y>0) s=2; if(x<0 && y<0) s=3; if(x>0 && y<0) s=4; else s=0; table[s][num[s]++].x = x; table[s][num[s]++].y = y; } } for(i=1;i<=4;i++){ printf("第%d象限の個数 %d\n", i, num[i]); for(j=0;j<num[i];j++){ printf("(%d, %d)\n", table[i][j].x, table[i][j].y); } } return 0; } こんな感じでやってみたのですが、エラーが出てしまいます。。 何処が間違っているのでしょうか?

回答No.4

もしかしたら、こんなの。 動作未確認です。 ひとおりはあるので、ちゃんとアレンジしてみてください。 あと、C++で書いてしまったので、ファイルからの読み込みや、表示のところは、全面的に変更必要ということで。 #include <fstream> struct point { int x; int y; }; int select_axia(struct point pos) { if (pos.x > 0 && pos.y > 0) return 1; if (pos.x < 0 && pos.y > 0) return 2; if (pos.x < 0 && pos.y < 0) return 3; if (pos.x > 0 && pos.y < 0) return 4; return 0; } int main() { struct point table[5][100]; struct point pos; int counts[5] = {0}; std::ifstream inf("pint-data.txt"); for( int i = 0; i < 100; i++) { inf >> pos.x >> pos.y; if (! inf) break; int axia = select_axia(pos); table[axia][counts[axia]] = pos; counts[axia]++; } for (int i = 1; i <= 4; i++) { std::cout << "第" << i << "象限の個数 " << counts[i] << "\n"; for (int j = 0; j < counts[i]; j++) std::cout << "(" << table[i][j].x << ", " << table[i][j].y << ")\n"; } return 0; }

shueruje
質問者

補足

すいません書き忘れました、Cです。 C++は全く習っていないのですが、Cとは基本的に同じなんですかね・・

  • yokomaya
  • ベストアンサー率40% (147/366)
回答No.3

構造体pointの定義は? int x; int y; とかですか?

shueruje
質問者

補足

その通りです!

  • 64bit
  • ベストアンサー率51% (45/88)
回答No.2

丸投げはやめましょう。 考え方が分からないのか、構造体の扱いが分からないのかも不明です。 分かるところまで書いて下さい。 ヒント ・1行ずつ読んで、左右の数字がそれぞれ正か負を見れば象限が決まります。 ・点を5種類に分けますが、それぞれ現在何個見つかったかを表す変数 (int count[5];) を用意すると良いでしょう。

shueruje
質問者

補足

すいません、象限の判定方法はわかるのですが、 struct point table[5][100];の扱いとか、 判定した後にどのように処理すればいいのかとかがわかりません。 というかほとんどわからないかも・・ #include <stdio.h> struct point { int x; int y; }; int main(void) { ここまではやったのですが・・

  • Amanjaku
  • ベストアンサー率30% (219/716)
回答No.1

勉強しているのなら何が解らないのかをまず整理して質問することです。 こういう質問をしてコピペで課題提出などだめです。

shueruje
質問者

補足

すいません、ほとんどわからないので皆さんに頼ってしまいました・・。 とりあえず上の補足に書いたとおり #include <stdio.h> struct point { int x; int y; }; int main(void) { ここまではなんとかできました

関連するQ&A

専門家に質問してみよう