• 締切済み

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

構造体型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% (2126/6288)
回答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

  • ファイルから読みこんで構造体に格納する、

    shohinというファイルに RX-100 odango_tsumeawase 3000という のが 五行ならんでいるのですが、 これを読み込んで struct shohin{ char code[10]: char name[40]; int price; } にファイルから読みこんで構造体配列に 格納したいのですが、構造体配列に格納する やりかたがわかりません。 構造体配列は struct shohin list[];というのを宣言しています。 ファイルから一行読み込んで fprintf()を使おうと思うのですが、 それはできますか? メンバ毎に格納したいのですが、 それがわかりません お願いします。

  • ヘッダファイルと構造体

    typedef struct{ float x; float y; float z; }Point; typedef struct { struct Point p1; struct Point p2; }Rect; とヘッダファイルに入力しコンパイルしてみると struct Point p1; struct Point p2; のPointが未定義の構造体とエラーが出ます。 どのように書けばいいのでしょう??

  • 教えてください11

    2次元座標系を構造体を用いて定義し、入力した点のx座標とy座標から、その点が第何象限にあるかを判定する関数を作成せよ。 <実行結果> 点aのx座標を入力してください -->> 1 点aのy座標を入力してください -->> 1 点a(1,1)は第1象限です。

  • C言語:構造体、自作関数についての質問

    こんばんは C言語の問題を提示されてなんとか作成していますが構造体と自作関数の変数の値を返したりするのが上手くいきません。 問題 「(1)x座標およびy座標のペアとして構成される構造体pointを定義せよ(両座標は整数であるとする)  (2)x座標およびy座標のメンバに値を設定し、その構造体を返す関数  struct point pointof(int a,int b){………}を作成せよ。  (3)二つの座標a,b間の距離を計算する関数  double distanceod(struct point a,struct point b); を作成せよ。  ※sqrt関数を使用せよ」 という問題です。メンバについてもいまいちよくわかりません。 どこでintを使うのか、またmainに値を返すやり方も上手くいかずコマンドプロンプトにはねられてばかりです。 どなたか解説おねがいしますm(_ _)m

  • 構造体の問題で・・・

    どなたか以下のC言語-構造体の問題を教えていただけないでしょうか? 問題 構造体 data_t に年齢[int型]の一つのメンバをもつ構造体 info_t を追加し、以下の関数を使用して、平均年齢を出力するプログラムを作成。 [条件] ・年齢は、input関数を使用し、標準入力で設定するものとする。 ・年齢は1~99までの範囲とし、範囲外の年齢が入力された場合はエラー出力しプログラムを終了する。 ・平均年齢の小数点以下は切り捨てる。 [出力例] 社員番号を入力して下さい-> ★15を入力 氏名を入力して下さい->    ★suzukiを入力 年齢を入力して下さい->    ★28を入力 社員番号を入力して下さい-> ★20を入力 氏名を入力して下さい->    ★satouを入力 年齢を入力して下さい->    ★52を入力 社員番号を入力して下さい-> ★25を入力 氏名を入力して下さい->    ★tanakaを入力 年齢を入力して下さい->    ★17を入力 社員番号   氏名    年齢 15      suzuki    28 20       satou    52 25       tanaka     17 [関数] int avetage(struct data _t*);   意味 : 3人分の平均年齢を計算する関数   引数 : data_t配列ポインタ   戻り値: 平均年齢を返却 void output(struct data_t*,int);   意味 : data_t配列に設定された年齢を含むデータ及び、平均年齢を出力する関数。   引数 : data_t配列ポインタ、平均年齢。 ----------------------------- 問題は以上なのですが、どなたか教えていただけないでしょうか? できれば解説が少しでもあれば助かるのですが(><) よろしくお願いします。

  • 構造体の纏めの後について……。

    以前、『構造体の纏め方』と言うタイトルで質問した者です。 早速本題に。 // --------------- 構造体・鋳型宣言 --------------- typedef struct tagABC {    int Dog;    int Cat; } ABC; // ----------------------------------------------- // --------------- 構造体実体宣言 ----------------- ABC Point1[ 20 ][ 20 ] = {   {     { 10 , 11 },     { 20 , 21 },     { 30 , 31 }   },{     { 100 , 101 },     { 200 , 201 }   } },    Point2[ 20 ][ 20 ] = {   {     { 1000 , 1001 },     { 2000 , 2001 }   } }, /************************************************/ /*        『ココが難題!!』        */ /************************************************/    *DBase[] = { Point1[ 0 ] , Point2[ 0 ] }; // ----------------------------------------------- さて、呼び出し側のソースコードは、 Point1[ 1 ][ 0 ] とすれば、 { 100 , 101 } を返してくれます。 *以後、この値が欲しいとして話を進めます しかし、 ( DBase + 0 )[ 1 ][ 0 ] と呼び出した場合、突然予定通りの値を返してくれません。 (コンパイルとビルドは通る) デバッガでメモリ上を見てみると、期待している値(上記)を呼び出す為には、 ( DBase + 0 )[ 0 ][ 20 ] となっており、普通ならばアクセス出来ない場所を指定しなければならなく、とても不思議な現象が起こっています。 因みに、 ( DBase + 0 )[ 1 ][ 0 ] と指定すると、結果的には、 Point2[ 0 ][ 0 ] を参照しているのと同じ現象が起こります。 この現象をどうにかして二次元配列で期待した値を呼び出せる方法を御教授御願いします。 使用コンパイラ:BCC 5.5.1

  • C言語の構造体についてなんですが。

    struct LIST {     struct Num* number;     struct LIST* next;/* 次の要素へのポインタ */ }*root; struct Num{     int a;     struct Num* next; /* 次の要素へのポインタ */ }*numroot; と構造体を定義したときに、 main(){     struct LIST *p;     for(p = root; p != NULL; p = p->next) ; } とすれば、pの先頭からNULLまでを参照していくことは分かるんですが、pのnumberの先頭からNULLまでの参照方法(プログラムのfor文の記述方法)がイマイチわかりません。つまり、構造体の構造体をどのように参照するかということです。 これを実現したい理由は、構造体内での数の格納を配列(固定長)ではなく可変長で格納したいからです。 分かる方は解答をお願いします。

  • 構造体の要素すべてに対する四則演算の方法を教えてください.

    構造体の要素すべてに対する四則演算の方法を教えてください. たとえば、 2点a,bの座標成分x,y,zをそれぞれの座標ごとに足す方法を教えてください. 下のようにx,y,z成分を持ったa,bがあります。 struct point{ int x; int y; int z; }; struct point a; struct point b; struct point c; この場合, c=a+b; と書くことができず, それぞれの成分ごとに以下のように足さなくてはなりません. c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z; この方法でできるのですが, 非常に効率的でないのでなにかもっと簡単に記述する方法を教えてください. お願いいたします.

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • 構造体の中身の2次元配列をファイルに書き込むことができるのでしょうか?

    構造体の中身の2次元配列をファイルに書き込むことができるのでしょうか? 現在、入力したデータをファイルに保存するプログラムを作成しております。 fp = fopen(file_name, "wb"); fwrite( &save_data, sizeof(save_data_t), 1, fp ); このように構造体ごとファイルに書き込んでいるのですが、 fread()で読みだした時に、2次元配列が読み込まれていません。 (おそらく書き込み自体ができていなかったのだとおもいます。) どのようにすれば、構造体の中に含まれている 2次元配列を書き込むことができるのでしょうか? c言語初心者ですので、是非ともよろしくお願いします。 typedef struct Save_Data{ int s_num; char s_page[][260]; }save_data_t; save_data_t save_data;