重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

構造体型point の次の2次元配列を使って、入力した点がどの象限に含まれるかを数えるプログラムを作成せよ。
struct point table[5][100];
ただし、入力データの最大個数は100とする。
座標軸上の点はどの象限にも属さないとして、table[0]に格納するものとする。
また、下のような実行例を想定する。
http://www9.uploader.jp/user/kadaishu/images/kad …

今学校で構造体を習っていて、このような問題をやっているのですが
どうすればいいのかよくわかりません。
どなたかご教授よろしくお願いします。

A 回答 (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[ ]配列がすぐにバッファオーバーフローしてしまいます*/
//}
}

この回答への補足

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

補足日時:2008/05/17 13:54
    • good
    • 0

> すいません、コンパイルしたときには何もエラーはでないのですが、



単に、「データ入力待ち」で止まっているだけでしょう。
データ入力しましたか?
まだ、バグは残っていて、どこかの象限「だけ」しかカウントされないはずですが。
    • good
    • 0

> こんな感じでやってみたのですが、エラーが出てしまいます。



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

この回答への補足

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

補足日時:2008/05/16 22:24
    • good
    • 0

言語は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 を入力 */
}
見たいな感じですかね

この回答への補足

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;
}

こんな感じでやってみたのですが、エラーが出てしまいます。。
何処が間違っているのでしょうか?

補足日時:2008/05/16 22:04
    • good
    • 0

もしかしたら、こんなの。


動作未確認です。
ひとおりはあるので、ちゃんとアレンジしてみてください。
あと、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;
}

この回答への補足

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

補足日時:2008/05/16 21:11
    • good
    • 0

構造体pointの定義は?


int x;
int y;
とかですか?

この回答への補足

その通りです!

補足日時:2008/05/16 19:16
    • good
    • 0

丸投げはやめましょう。


考え方が分からないのか、構造体の扱いが分からないのかも不明です。
分かるところまで書いて下さい。

ヒント
・1行ずつ読んで、左右の数字がそれぞれ正か負を見れば象限が決まります。
・点を5種類に分けますが、それぞれ現在何個見つかったかを表す変数 (int count[5];) を用意すると良いでしょう。

この回答への補足

すいません、象限の判定方法はわかるのですが、
struct point table[5][100];の扱いとか、
判定した後にどのように処理すればいいのかとかがわかりません。
というかほとんどわからないかも・・

#include <stdio.h>

struct point {
int x;
int y;
};
int main(void) {

ここまではやったのですが・・

補足日時:2008/05/16 19:17
    • good
    • 0

勉強しているのなら何が解らないのかをまず整理して質問することです。


こういう質問をしてコピペで課題提出などだめです。

この回答への補足

すいません、ほとんどわからないので皆さんに頼ってしまいました・・。
とりあえず上の補足に書いたとおり
#include <stdio.h>

struct point {
int x;
int y;
};
int main(void) {

ここまではなんとかできました

補足日時:2008/05/16 19:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!