ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?
スポンサーサイト(詳細
  • Java個別指導IT-Lab. - 誰でも最初は未経験。個別指導でプロへの道が開けます。随時入校可能

質問

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

今学校で構造体を習っていて、このような問題をやっているのですが
どうすればいいのかよくわかりません。
どなたかご教授よろしくお願いします。
困り度:
  • 困っています
質問投稿日時:
08/05/16 18:50
この質問に対する回答は締め切られました。
最新から表示回答順に表示

回答

ANo.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[ ]配列がすぐにバッファオーバーフローしてしまいます*/
//}
}
回答者:php504
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/17 09:21
この回答への補足なんとか作動はできました!
ありがとうございました!
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

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

単に、「データ入力待ち」で止まっているだけでしょう。
データ入力しましたか?
まだ、バグは残っていて、どこかの象限「だけ」しかカウントされないはずですが。
回答者:AsanoNagi
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/17 06:38
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

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

何をしたとき(コンパイル時?それとも実行時?)に
どんなエラー(正確なエラーメッセージの内容)が出るのか、見ている人にわかるように
具体的に書いてください。
回答者:asuncion
種類:補足要求
どんな人:一般人
自信:参考意見
回答日時:
08/05/16 22:15
この回答への補足すいません、コンパイルしたときには何もエラーはでないのですが、
実際に実行してみると何も反応しないのです(何も表示されない
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.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 を入力 */
}
見たいな感じですかね
回答者:php504
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/16 20:17
この回答への補足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;
}

こんな感じでやってみたのですが、エラーが出てしまいます。。
何処が間違っているのでしょうか?
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.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;
}
回答者:AsanoNagi
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/16 19:48
この回答への補足すいません書き忘れました、Cです。
C++は全く習っていないのですが、Cとは基本的に同じなんですかね・・
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.3 構造体pointの定義は?
int x;
int y;
とかですか?
回答者:yokomaya
種類:補足要求
どんな人:一般人
自信:参考意見
回答日時:
08/05/16 19:03
この回答への補足その通りです!
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.2 丸投げはやめましょう。
考え方が分からないのか、構造体の扱いが分からないのかも不明です。
分かるところまで書いて下さい。

ヒント
・1行ずつ読んで、左右の数字がそれぞれ正か負を見れば象限が決まります。
・点を5種類に分けますが、それぞれ現在何個見つかったかを表す変数 (int count[5];) を用意すると良いでしょう。
回答者:64bit
種類:補足要求
どんな人:経験者
自信:参考意見
回答日時:
08/05/16 19:01
この回答への補足すいません、象限の判定方法はわかるのですが、
struct point table[5][100];の扱いとか、
判定した後にどのように処理すればいいのかとかがわかりません。
というかほとんどわからないかも・・

#include <stdio.h>

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

ここまではやったのですが・・
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 勉強しているのなら何が解らないのかをまず整理して質問することです。
こういう質問をしてコピペで課題提出などだめです。
回答者:Amanjaku
種類:アドバイス
どんな人:専門家
自信:自信あり
回答日時:
08/05/16 19:01
この回答への補足すいません、ほとんどわからないので皆さんに頼ってしまいました・・。
とりあえず上の補足に書いたとおり
#include <stdio.h>

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

ここまではなんとかできました
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示
スポンサーサイト(詳細
  • Java個別指導IT-Lab. - 誰でも最初は未経験。個別指導でプロへの道が開けます。随時入校可能