質問 |
||
| 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) { ここまではなんとかできました |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |