• ベストアンサー

構造体(問題→回答)

えっと、昨日先生に 「構造体を作れ!」と言われて 全然出来ませんでした。 本とかを見て理解するのではなくて、 実際に自分で何も見ないで 出来るようになりたいのです。 で、何でもいいので、 何か問題を出して欲しいのです。 昨日の先生の例:四角形を作れ! #include <stdio.h> struct Sikaku{ int x1; int y1; int x2; int y2; }; main() { struct Sikaku s[100]; s[0].x1 = 20; s[0].y1 = 20; s[0].x2 = 40; s[0].y2 = 40; } 何か問題を出したら、考えて回答を書きますので、よろしくお願いします。 いっぱい出してください。 お願いします。

noname#2624
noname#2624

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> 本とかを見て理解するのではなくて、 > 実際に自分で何も見ないで出来るようになりたいのです。 その考えは根本的に間違っていると思いますよ。 本を見て、試行錯誤して、失敗して、ヘルプを見て、先人に聞いて、 そして又本を見て…。 言語はそれを繰り返して覚えていくものだと思います。 ⇒もちろんそうでない人もいますが。 ちなみに本にある例題は全てこなしているのですよね? では例題など、 クライアント/サーバ型通信モジュールを作成し、 通信電文を構造体に格納して電文の内容を確認せよ。 プロトコルはTCP/IPを使用する事。

noname#2624
質問者

補足

僕もよく分からないのですが、 昨日はいきなり作れと言われたので、 「本とか見ないと出来ないです」 と言ったら、 「お前は基礎的なことをいちいち本とか見ないと 出来ないのかよ」 と言われてショックでした。 ですので、基礎的な例題でいいので 何か出してください。

その他の回答 (5)

  • tb4104
  • ベストアンサー率32% (9/28)
回答No.6

本を見ないで作る方がいたら相当すごい人だと思いますよ。 私なんか、スペルがかけなくて、辞書を引いたりよくしています。 No1.での「お前は基礎的なことをいちいち本とか見ないと 出来ないのかよ」というのは、良いようにとったら、 あまりにも初歩的なとこがわかっていないのでは、 たとえば、「struct」のスペルが わかないとか、変数をどのように宣言(intやfloat)すればいいのか わからないとかそう言ったものではないでしょうかね? でも、先生が出された例って、こんな例しか使っていないのであれば、 教えようとする人間でも一生懸命ではないでしょうね。 こんな問題に、こんな解答はおかしいとは思うのですが・・・・ さて本題に入ります。 問題としていくつかあげておきますのでやってみてはどうでしょう? 1. クラスの生徒の出席番号と名前を入れ、それをprintfで表示しなさい。 2. CDのアルバム名を構造体で宣言し、中に曲名をいれ、それをprintfで表示しなさい。 3. (応用)三角形の頂点を代入し、その中心を求める。 以上、このようなものでよろしいでしょうか?

  • nagata
  • ベストアンサー率33% (10/30)
回答No.5

プログラムは「つまらない例題」で「勉強」しようとすると失敗する可能性大です。 今作ってるプログラムが実際に動いたときに自分が嬉しいかどうか。 1、プログラムが動いた→だけどそれが何? 2、プログラムが動いた→おお、スゲー感動! 1と2だと上達の速度が256倍違います。 プログラムが出来たとき、だけどそれが何?と思ったら要注意。 まずは自分が興味をもっているものを題材に選ぶのが良いと思います。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.4

ご自分でも例題は作れますよ。例えば、 ・所有しいてるCDのデータ(タイトル・アーティスト)を格納する構造体 ・住所録 ・スケジュールを格納する構造体(日付、期間、場所、内容など) 基本的に構造体はデータベースの1レコードとしてとらえればいくらでも例題は転がっています(それだけではないですけど)。身近にあるもので自分の興味のあるデータを構造体化(というのか^^;)してみれば面白いと思います。 ただ、実際のプログラミングでは構造体を作ることは主体ではなく、データを効率よく操作できるように構造体を設計することが主眼ですから、まずは何をしたいのかということから考えないと、ですね(例えばCDのタイトルは何文字格納できるようにしようとか、アーティスト名は名前を直接入れるか番号で管理しようかとか、スケジュールの日付は文字列にしようか数字にしようかとか...きりがないですが)

  • ichigota
  • ベストアンサー率18% (7/38)
回答No.3

こんなのはどうでしょう? Q1. あるゲームで、高得点を取得した上位20名のスコアラーの名前 (ASCIIで15文字以内)とその得点(符号なし整数)を保持したい。 これを実現しうる構造体としてどのようなものが考えられるか。 Q2. やはり、あるゲームで、平面上を任意の方向に等速直線運動する ミサイルが存在する。このミサイル1個の現在の座標と移動方向を保持する 構造体としてとしてどのようなものが考えられるか。 あんまりその先生の仰った事は気にしないほうがいいです。 最初のうちはだれだって本見ながら、その言語を実際に使いながら 覚えるものだと思います。

  • callhiro
  • ベストアンサー率35% (54/152)
回答No.2

なんか根本的に間違ってませんか? >「お前は基礎的なことをいちいち本とか見ないと出来ないのかよ」 >と言われてショックでした。 とありますが、 これは、「今すぐ本を何も見ずに作りなさい」と言ってるのではなく、 「そのぐらい基礎的なことは本を見ずに作れるレベルに早くなりなさい」 と言ってるんです。 つまり、今構造体をわかっていないpowan1さんは、 なおさら本を見て勉強する必要があると思いますよ。 しかもこの場で私に例題を与えてくださいというのも変な話です。 まずは本の例題ぐらい解けるようになりましょう。

関連するQ&A

  • 構造体の配列を関数に渡すには

    構造体の配列を関数の引数として渡そうとすると エラーになってしまいます ネットで調べてもいまいちわからなかったので ここで質問させてもらいます #include<stdio.h> struct A{   ・    ・    ・ }; void func(struct A *p); int main(void) { struct A x[3][4] = {     ・     ・     ・ }; func(x); return 0; } void func(struct A *p){     ・     ・    ・ } どうすれば渡すことができるのでしょうか? どなたか助言お願いします。

  • 複数のライブラリをリンクするときに構造体が衝突する

    C++,開発環境はVisual Studio Professional 2013です, ライブラリ1にxy座標の構造体 struct point { int x; int y; }; を定義しています. ライブラリ2にも全く同じ構造体を定義しています. ここで,あるプロジェクトからこれら2つのライブラリをリンクしようとしたら, error C2011: 'point' : 'struct' 型の再定義 というコンパイルエラーが出ます. ライブラリ1とライブラリ2にpoint構造体が記述された共通用のヘッダを参照させるという方法をとれば解決できるのでしょうが,この方法以外でこのエラーをなんとか回避する方法はないでしょうか. 構造体宣言は只の宣言であって実体をもたないため,中身が同じであればいくら記述が重複しても問題はないと聞いたことがあったので大丈夫だと思っていました. また,ライブラリ1とライブラリ2のpoint構造体の名前それぞれpoint1,point2にするなど違うものにするという方法でも回避できるのでしょうが,下記のメインコード内でコメントアウトされている部分のように,構造体の中身が全く同じなので互換性を持たせられるようにしたいのです. ちなみに,ライブラリ1,2はコンソールアプリケーション・空のプロジェクトで作成したあと,ソリューションのプロパティで「構成の種類」を「スタティックライブラリ(.lib)」にするという手順で作成しています. 以下,簡略コード ====ライブラリ1==== ----lib1.h---- #ifndef _H1_ #define _H1_ struct point { int x; int y; }; void print_lib1(struct point p); #endif ----lib1.cpp---- #include "lib1.h" #include <iostream> void print_lib1(struct point p) { std::cout << "lib1 : " << p.x << ", " << p.y << std::endl; } =====ライブラリ2====== ----lib2.h---- #ifndef _H2_ #define _H2_ struct point { int x; int y; }; void print_lib2(struct point p); #endif ----lib2.cpp---- #include "lib2.h" #include <iostream> void print_lib2(struct point p) { std::cout << "lib2 : " << p.x << ", " << p.y << std::endl; } ===メインコード=== ----main.cpp---- #include "../../lib1/lib1/lib1.h" #include "../../lib2/lib2/lib2.h" int main(void) { struct point val; val.x = 2; val.y = 3; print_lib1(val); //print_lib2(val); }

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • 構造体の型について

    ある構造体をxxxと名づける以下のプログラムを作成しました。 ーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx aaa; strcpy(aaa.variable,"bbb"); printf("%s\n",aaa.variable); } ーーーーーーーーーーー これは動き、bbbと表示されます。 しかしながら、構造体のポインタを使用した 以下のプログラムではコンパイルはとおりますが実行時にコアダンプして落ち ます。 ーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx* aaa; strcpy(aaa->variable,"bbb"); printf("%s\n",aaa->variable); } ーーーーーーーーーーーーーーーーーーーーーーー 両プログラムの意図はまったく同じなのに何故いけないのでしょうか。

  • プログラミング 構造体に関する質問です

    4人を個別で平均点を求めるプログラミングを作りたいのですが外部関数にする方法がいまいちわかりません。あとこのプログラムもなぜかエラーがでてしまいます。どなたかご教授お願いします #include<stdio.h> typedef struct{ char name[4]; int point[4]; }tokutenn; int main(void) { int x, y; int sum[5] = {0}; double ave[5] = {0.0}; tokutenn sd[5] = {{"kou", {55, 44, 33,34}}, {"mei", {34, 74, 67,56}}, {"sai", {72, 36, 68,35}}, {"kai",{34, 82, 73,56}}, for(x = 0; x < 4; x++){ for(y = 0; y < 3; y++){ sum[x] += sd[x].point[y]; } } for(y = 0; y < 4; y++){ ave[y] = sum[y] / 3.0; } for(y = 0; y < 4; y++){ printf( "%sの平均は%.10f点\n",&sd[y].name[0], ave[y]); } return 0; }

  • ポインタを使った構造体のプログラム

    ポインタを使ってメンバに値を入力して表示するプログラムを作ったのですが、mainのstruct XYZ aというオブジェクトと*bというそれを指すポインタを使ってプログラムを表示するにはどうすればいいのでしょうか。 これがプログラムです。 #include <stdio.h> struct XYZ { int x; long int y; double z; }; void set_xyz(struct XYZ *p,int x,long int y,double z) { p->x=x; p->y=y; p->z=z; } //void set_xyz(struct XYZ *,int,long int,double); int main() { struct XYZ a = {12,999999,1.41421356},*b; //ここのポインタ変数bでエラーが表示されます。 set_xyz(b,a.x,a.y,a.z); printf("a.x = %d\na.y = %d\na.z = %lf\n",b->x,b->y,b->z); return 0; } エラーの内容は「初期化されていないローカル変数 'b' が使用されます」となっています。 初歩的な質問ですみません・・・。

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • C言語 構造体と関数

    三つの複素数α、β、γの実数部、虚数部の値(実数)をそれぞれ入力して、 (α+γ)(β+γ) を求めて表示せよ。 という問題ですが、 #include〈stdio. h〉 #include 〈string. h〉 int main void{ struct vector{ double α; double β; double γ; }; このあと、実数部と虚数部はわけて入力する式を作るのでしょうか? c_ add()、c_mul()を使うのですが、よくわかりません(*_*) また、sとtを複素数を表す構造体としたとき、c_ add(s、t)、c_mul(s、t)と呼び出すと、それぞれ戻り値として、sとtを加算またはsとtを乗算した結果である複素数の構造体を返す、というのはどういうことでしょうか?

  • 構造体?

    以下は、あるC++のサンプルプログラムの頭の部分なのですが、構造体associateの中に、再びassociateが2回も出てきます。何をしている記述なのか教えてください。 #include <vector> #include <algorithm> #include <functional> #include <iostream> using namespace std; struct associate { int num; char chr; associate(int n, char c) : num(n), chr(c) {};←この業は何? associate() : num(0), chr('\0'){};←この行は何? }; bool operator<(const associate &x, const associate &y) { return x.num < y.num; } ostream& operator<<(ostream &s, const associate &x) { return s << "<" << x.num << ";" << x.chr << ">"; } int main () { vector<associate>::iterator i, j, k; associate arr[20] = {associate(-4, ' '), associate(16, ' '), ・ ・ ・ associate(-3, 'e'), associate(15, ' ')};

  • 構造体の使い方

    構造体の基本的な使い方を練習しようと思ったのですが、 なかなかスムーズにいきません。 p.d=10; の部分がおかしいようなのですが、色々試してもコンパイルできませんでした。 正しい使い方を教えていただけないでしょうか ソース ↓ #include<stdio.h> struct type{ int a; float b;  double c; }var,*p; main(){ c=9.87;      p=&var; p.d=10; p->b=1.2; printf("int:%d\n",*p); printf("float:%.1f\n",&p); printf("double:%.3lf\n",c); return 0; }