←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3779

家系図
投稿者---ageha(2005/05/23 20:57:38)


ポインタと構造体を用いて家系図を作りたいと思って、やり始めたのですがまったくとっかかりがなく困っています。ヒントになるようなソースを教えてもらえるとありがたいです。
自分が今考えているのは、http://www.geocities.jp/m_hiroi/rakup/match07.htmlにあるプログラムみたいなのをC言語で書いてみたいと思っています。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:家系図 3780 まきじ 2005/05/23 21:08:04
<子記事> 家系図 後半 3814 ageha 2005/05/27 23:41:49


No.3780

Re:家系図
投稿者---まきじ(2005/05/23 21:08:04)


>ポインタと構造体を用いて家系図を作りたいと思って、やり始めたのですがまったくとっかかりがなく困っています。

双方向リスト構造をうまく使えばできると思います。
struct FAMILY{
    struct FAMILY *mother; //母親へのリンク
    struct FAMILY *father; //父親へのリンク
    char *name; //自分
    struct FAMILY *ko[10]; //子供へのリンク(最高10人)
};

こんなんで、できるかどうか、わかりませんが(^^;


この投稿にコメントする

削除パスワード

No.3781

Re:家系図
投稿者---ageha(2005/05/23 22:05:05)


>>ポインタと構造体を用いて家系図を作りたいと思って、やり始めたのですがまったくとっかかりがなく困っています。

>双方向リスト構造をうまく使えばできると思います。

レスありがとうございます。参考にさせていただきます。
人物をあらわす(名前、性別、子、親、配偶者)構造体を作って、ある人物の夫や息子を求める関数を作ってみてるのですが、なかなかうまくいきません。
あるていど形になったらのせるので、意見お願いします。


この投稿にコメントする

削除パスワード

No.3782

Re:家系図
投稿者---まきじ(2005/05/23 22:28:18)


>なかなかうまくいきません。

何がうまくいかないのでしょうか?

>あるていど形になったらのせるので、意見お願いします。

ソースを見ない事には、私にも分かりませんが。


この投稿にコメントする

削除パスワード

No.3783

Re:家系図
投稿者---たいちう(2005/05/24 09:50:59)


子供へのリンクは長男次弟表現を使った方がスマートかと。単に好みの問題か?
10人までという制限を取り払うことにこだわらなければ、
まきじさんの構造体の方が簡単だと思いますが。


この投稿にコメントする

削除パスワード

No.3813

家系図 前半
投稿者---ageha(2005/05/27 23:39:47)


一応自分なりにつくってみました!
まだまだ改良の余地があると思うので意見お願いします。

条件
1、太郎の息子は一郎と二郎
2、花子の娘は春子と夏子
3、春子の夫は一郎
4、花子の孫は浩一と順子と和江
5、夏子には息子がいない
6、順子の叔母は夏子
7、二郎の娘は和江
8、子供は0〜2人
9、存在しない場合は「該当なし」、存在するかわからない場合は「不明」

#include <stdio.h>
#include <string.h>

#define MAN_MEMBER 11

struct person
{
char name[16];
char gender;
struct person *partner;
struct person *father;
struct person *mother;
struct person *child1;
struct person *child2;
};

char target[100];
char relation[100];

void point_target(struct person *one);
void put_parent_children(struct person *one,char *name_father,char *name_mother,char *name_child1,char *name_child2);
struct person *look_male(struct person *one,struct person *object);
struct person *look_one_pointer_from_name(struct person *one,char *name);
struct person *look_one_brother(struct person *one,char *name);
int look_one_husband(struct person *one, char *name,struct person *return_pointer[]);
int look_one_son(struct person *one, char *name,struct person *return_pointer[]);
int look_one_uncle(struct person *one,char *name,struct person *return_pointer[]);
int look_one_nephew(struct person *one,char *name,struct person *return_pointer[]);
int look_one_grandpa(struct person *one,char *name,struct person *return_pointer[]);
void print_relation(struct person *one,char *target,char *relation);

int main(){
struct person one[MAN_MEMBER]={
{"不明",0,0,0,0,0,0},
{"該当なし",0,0,0,0,0,0},
{"太郎",1,0,0,0,0,0},
{"一郎",1,0,0,0,0,0},
{"二郎",1,0,0,0,0,0},
{"浩一",1,0,0,0,0,0},
{"花子",0,0,0,0,0,0},
{"春子",0,0,0,0,0,0},
{"夏子",0,0,0,0,0,0},
{"順子",0,0,0,0,0,0},
{"和江",0,0,0,0,0,0},
};

/*ポイント先の初期化*/
point_target(one);

/*ポイント先の代入(親子関係の構築)*/
put_parent_children(one,"太郎","不明","一郎","二郎");
put_parent_children(one,"不明","花子","春子","夏子");
put_parent_children(one,"一郎","春子","浩一","順子");
put_parent_children(one,"二郎","夏子","該当なし","和江");

/*関係の入力*/
printf("誰について知りたいですか?\n");
printf("太郎 or 一郎 or 二郎 or 浩一 or 花子 or 春子 or 夏子 or 順子 or 和江>>>");
gets(target);
printf("\nどの関係について知りたいですか?\n");
printf("夫 or 息子 or 叔父 or 甥 or 祖父>>>");
gets(relation);

/*関係の出力*/
print_relation(one,target,relation);

return 1;
}

/*関数;ポイント先の初期化*/
void point_target(struct person *one)
{
int i;
for(i=0;i<MAN_MEMBER;i++)
{
one[i].partner=&one[0];
one[i].father=&one[0];
one[i].mother=&one[0];
one[i].child1=&one[0];
one[i].child2=&one[0];
}
}

/*関数;親子関係の構築*/
void put_parent_children(struct person *one,char *name_father,char *name_mother,char *name_child1,char *name_child2)
{
struct person *father=look_one_pointer_from_name(one,name_father);
struct person *mother=look_one_pointer_from_name(one,name_mother);
struct person *child1=look_one_pointer_from_name(one,name_child1);
struct person *child2=look_one_pointer_from_name(one,name_child2);

//父親データ
if(strcmp(name_father,"不明")!=0)
{
father -> partner=mother;
father -> child1=child1;
father -> child2=child2;
}

//母親データ
if(strcmp(name_mother,"不明")!=0)
{
mother -> partner=father;
mother -> child1=child1;
mother -> child2=child2;
}

//子供1データ
if(strcmp(name_child1,"不明")!=0)
{
child1 -> father=father;
child1 -> mother=mother;
}

//子供2データ
if(strcmp(name_child2,"不明")!=0)
{
child2 -> father=father;
child2 -> mother=mother;
}
}

/*構造体へのポインタ;性別を判定する。*/
struct person *look_male(struct person *one,struct person *object)
{
if(strcmp(object -> name,"不明")==0)
{
return &one[0];
}

if(object -> gender)
{
return object;
}
else
{
return &one[1];
}
}

/*構造体へのポインタ;名前から構造体のアドレスを求める*/
struct person *look_one_pointer_from_name(struct person *one,char *name)
{
int i;
struct person *pointer;

if(strcmp(name,"不明")==0)
{
return &one[0];
}

pointer=&one[0];
for(i=1;i<11;i++)
{
if(strcmp(name,one[i].name)==0)
{
pointer=&one[i];
break;
}
}
return pointer;
}


/*構造体へのポインタ;兄弟への構造体のアドレスを求める*/
struct person *look_one_brother(struct person *one,char *name)
{
struct person *father;
struct person *mother;
struct person *parent;

if(strcmp(name,"不明")==0)
{
return &one[0];
}

father=look_one_pointer_from_name(one,name) -> father;
mother=look_one_pointer_from_name(one,name) -> mother;

if(strcmp(father -> name,"不明")!=0)
{
parent=father;
}
else
{
if(strcmp(mother -> name,"不明")!=0)
{
parent=mother;
}
else
{
return &one[0];
}
}

if(strcmp(parent -> child1 -> name,name)!=0)
{
return parent -> child1;
}
else
{
return parent -> child2;
}
}




この投稿にコメントする

削除パスワード

No.3818

Re:家系図 前半
投稿者---まきじ(2005/05/28 00:13:34)


条件を見て思ったこと。

>4、花子の孫は浩一と順子と和江
花子の孫というのは、春子の子供なのか?夏子の子供なのか?

>6、順子の叔母は夏子
ということは、順子は春子の子供?

>9、存在しない場合は「該当なし」、存在するかわからない場合は「不明」
「存在するかわからない」というのはどういう場合でしょうか?

孫とか叔母とかを使わずに、条件を設定した方が分かりやすいと思います。


この投稿にコメントする

削除パスワード

No.3819

Re:家系図 前半
投稿者---まきじ(2005/05/28 00:28:12)


父親と母親と子供の関係を再帰的に作成していけばできそうですけど。
名前とか入力していく方が楽かもしれないですね。
あと、検索は、母親を検索、父親を検索、祖母を検索、祖父を検索などを作って、祖父なら、「自分の母親の母親」と辿るだけでよいと思う。

実際作ったわけじゃないので、本当にできるかどうか分かりませんが(^^;
あんまり、深くつっこまないで下さいね・・


この投稿にコメントする

削除パスワード

No.3821

Re:家系図 前半
投稿者---まきじ(2005/05/28 00:50:09)


>名前とか入力していく方が楽かもしれないですね。

入力は無理があったかな(^^;
ファイルに予め、母親と父親と子供の関係を記録しとくとかが
良いと思う。

子供(自分):母親:父親
- - - - - - - - - - - -
太郎:花子:次郎
花子:景子:三郎
次郎:敏子:健二

みたいな感じで・・・


この投稿にコメントする

削除パスワード

No.3825

Re:家系図 前半(再投稿代行)
投稿者---紙風船(2005/05/28 11:13:54)


/*
一応自分なりにつくってみました!
まだまだ改良の余地があると思うので意見お願いします。

  条件
  1、太郎の息子は一郎と二郎
  2、花子の娘は春子と夏子
  3、春子の夫は一郎
  4、花子の孫は浩一と順子と和江
  5、夏子には息子がいない
  6、順子の叔母は夏子
  7、二郎の娘は和江
  8、子供は0〜2人
  9、存在しない場合は「該当なし」、存在するかわからない場合は「不明」
*/
#include <stdio.h>
#include <string.h>

#define MAN_MEMBER 11

struct person
{
    char name[16];
    char gender;
    struct person *partner;
    struct person *father;
    struct person *mother;
    struct person *child1;
    struct person *child2;
};

char target[100];
char relation[100]; 

void point_target(struct person *one);
void put_parent_children(struct person *one,char *name_father,char *name_mother,char *name_child1,char *name_child2);
struct person *look_male(struct person *one,struct person *object);
struct person *look_one_pointer_from_name(struct person *one,char *name);
struct person *look_one_brother(struct person *one,char *name);
int look_one_husband(struct person *one, char *name,struct person *return_pointer[]);
int look_one_son(struct person *one, char *name,struct person *return_pointer[]);
int look_one_uncle(struct person *one,char *name,struct person *return_pointer[]);
int look_one_nephew(struct person *one,char *name,struct person *return_pointer[]);
int look_one_grandpa(struct person *one,char *name,struct person *return_pointer[]);
void print_relation(struct person *one,char *target,char *relation);

int main(){
    struct person one[MAN_MEMBER]={
        {"不明",0,0,0,0,0,0},
        {"該当なし",0,0,0,0,0,0},
        {"太郎",1,0,0,0,0,0},
        {"一郎",1,0,0,0,0,0},
        {"二郎",1,0,0,0,0,0},
        {"浩一",1,0,0,0,0,0},
        {"花子",0,0,0,0,0,0},
        {"春子",0,0,0,0,0,0},
        {"夏子",0,0,0,0,0,0},
        {"順子",0,0,0,0,0,0},
        {"和江",0,0,0,0,0,0},
    };
    
    /*ポイント先の初期化*/
    point_target(one);
    
    /*ポイント先の代入(親子関係の構築)*/
    put_parent_children(one,"太郎","不明","一郎","二郎");
    put_parent_children(one,"不明","花子","春子","夏子");
    put_parent_children(one,"一郎","春子","浩一","順子");
    put_parent_children(one,"二郎","夏子","該当なし","和江");
    
    /*関係の入力*/
    printf("誰について知りたいですか?\n");
    printf("太郎 or 一郎 or 二郎 or 浩一 or 花子 or 春子 or 夏子 or 順子 or 和江>>>");
    gets(target);
    printf("\nどの関係について知りたいですか?\n");
    printf("夫 or 息子 or 叔父 or 甥 or 祖父>>>");
    gets(relation);
    
    /*関係の出力*/
    print_relation(one,target,relation);
    
    return 1;
}

/*関数;ポイント先の初期化*/
void point_target(struct person *one)
{
    int i;
    for(i=0;i<MAN_MEMBER;i++)
    {
        one[i].partner=&one[0];
        one[i].father=&one[0];
        one[i].mother=&one[0];
        one[i].child1=&one[0];
        one[i].child2=&one[0];
    }
}

/*関数;親子関係の構築*/
void put_parent_children(struct person *one,char *name_father,char *name_mother,char *name_child1,char *name_child2)
{
    struct person *father=look_one_pointer_from_name(one,name_father);
    struct person *mother=look_one_pointer_from_name(one,name_mother);
    struct person *child1=look_one_pointer_from_name(one,name_child1);
    struct person *child2=look_one_pointer_from_name(one,name_child2);
    
    //父親データ
    if(strcmp(name_father,"不明")!=0)
    {
        father -> partner=mother;
        father -> child1=child1;
        father -> child2=child2;
    }
    
    //母親データ
    if(strcmp(name_mother,"不明")!=0)
    {
        mother -> partner=father;
        mother -> child1=child1;
        mother -> child2=child2;
    }
    
    //子供1データ
    if(strcmp(name_child1,"不明")!=0)
    {
        child1 -> father=father;
        child1 -> mother=mother;
    }
    
    //子供2データ
    if(strcmp(name_child2,"不明")!=0)
    {
        child2 -> father=father;
        child2 -> mother=mother;
    }
}



この投稿にコメントする

削除パスワード

No.3826

Re:家系図 前半(再投稿代行)~2
投稿者---紙風船(2005/05/28 11:15:18)


/*構造体へのポインタ;性別を判定する。*/
struct person *look_male(struct person *one,struct person *object)
{
    if(strcmp(object -> name,"不明")==0)
    {
        return &one[0];
    }
    
    if(object -> gender)
    {
        return object;
    }
    else
    {
        return &one[1];
    }
}

/*構造体へのポインタ;名前から構造体のアドレスを求める*/
struct person *look_one_pointer_from_name(struct person *one,char *name)
{
    int i;
    struct person *pointer;
    
    if(strcmp(name,"不明")==0)
    {
        return &one[0];
    }
    
    pointer=&one[0];
    for(i=1;i<11;i++)
    {
        if(strcmp(name,one[i].name)==0)
        {
            pointer=&one[i];
            break;
        }
    }
    return pointer;
}

/*構造体へのポインタ;兄弟への構造体のアドレスを求める*/
struct person *look_one_brother(struct person *one,char *name)
{
    struct person *father;
    struct person *mother;
    struct person *parent;
    
    if(strcmp(name,"不明")==0)
    {
        return &one[0];
    }
    
    father=look_one_pointer_from_name(one,name) -> father;
    mother=look_one_pointer_from_name(one,name) -> mother;
    
    if(strcmp(father -> name,"不明")!=0)
    {
        parent=father;
    }
    else
    {
        if(strcmp(mother -> name,"不明")!=0)
        {
            parent=mother;
        }
        else
        {
            return &one[0];
        }
    }
    
    if(strcmp(parent -> child1 -> name,name)!=0)
    {
        return parent -> child1;
    }
    else
    {
        return parent -> child2;
    }
}



この投稿にコメントする

削除パスワード

No.3814

家系図 後半
投稿者---ageha(2005/05/27 23:41:49)


続き

/*関数;夫への構造体のアドレスを求める*/
int look_one_husband(struct person *one, char *name,struct person *return_pointer[])
{
int return_member=0;
struct person *pointer;

if(strcmp(name,"不明")==0)
{
return 0;
}

pointer=look_male(one,look_one_pointer_from_name(one,name) -> partner);

if(strcmp(pointer -> name,"不明")==0)
{
return 0;
}

return_pointer[return_member++]=pointer;

return return_member;
}

/*関数;息子への構造体のアドレスを求める*/
int look_one_son(struct person *one, char *name,struct person *return_pointer[])
{
struct person *child1;
struct person *child2;
int return_member=0;

if(strcmp(name,"不明")==0)
{
return 0;
}

child1=look_one_pointer_from_name(one,name) -> child1;
child2=look_one_pointer_from_name(one,name) -> child2;

if((strcmp(child1 -> name,"不明")==0)&&(strcmp(child2 -> name,"不明")==0))
{
return 0;
}

child1=look_male(one,child1);

if(strcmp(child1 -> name,"不明")!=0)
{
return_pointer[return_member++]=child1;
}

child2=look_male(one,child2);

if(strcmp(child2 -> name,"不明")!=0)
{
return_pointer[return_member++]=child2;
}

return return_member;
}

/*関数;叔父への構造体のアドレスを求める*/
int look_one_uncle(struct person *one,char *name,struct person *return_pointer[])
{
struct person *father;
struct person *mother;
struct person *uncle;
int return_member=0;

if(strcmp(name,"不明")==0)
{
return 0;
}

father=look_one_pointer_from_name(one,name) -> father;
mother=look_one_pointer_from_name(one,name) -> mother;

if((strcmp(father -> name,"不明")==0)&&(strcmp(mother -> name,"不明")==0))
{
return 0;
}

uncle=look_male(one,look_one_brother(one,father -> name));

if(strcmp(uncle -> name,"不明")!=0)
{
return_pointer[return_member++]=uncle;
}

uncle=look_male(one,look_one_brother(one,mother -> name));

if(strcmp(uncle -> name,"不明")!=0)
{
return_pointer[return_member++]=uncle;
}

return return_member;
}

/*関数;甥への構造体のアドレスを求める*/
int look_one_nephew(struct person *one,char *name,struct person *return_pointer[])
{
int i;
int return_member=0;
int return_son_member=0;
struct person *pointer;
struct person *pointer_son[MAN_MEMBER];

if(strcmp(name,"不明")==0)
{
return 0;
}

return_son_member=look_one_son(one,look_one_brother(one,name) -> name,pointer_son);

for(i=0;i<return_son_member;i++)
{
pointer=look_male(one,pointer_son[i]);

if(strcmp(pointer -> name,"不明")!=0)
{
return_pointer[return_member++]=pointer;
}
}

return return_member;
}

/*関数;祖父への構造体のアドレスを求める*/
int look_one_grandpa(struct person *one,char *name,struct person *return_pointer[])
{
struct person *father;
struct person *mother;
struct person *grandpa;
int return_member=0;

if(strcmp(name,"不明")==0)
{
return 0;
}

father=look_one_pointer_from_name(one,name) -> father;

if(strcmp(father -> name,"不明")!=0)
{
grandpa=father -> father;

if(strcmp(grandpa -> name,"不明")!=0)
{
return_pointer[return_member++]=grandpa;
}
}

mother=look_one_pointer_from_name(one,name) -> mother;

if(strcmp(mother -> name,"不明")!=0)
{
grandpa=mother -> father;

if(strcmp(grandpa -> name,"不明")!=0)
{
return_pointer[return_member++]=grandpa;
}
}

return return_member;
}

/*関係を出力*/
void print_relation(struct person *one,char *target,char *relation)
{
int i;
int return_member;
struct person *return_pointer[MAN_MEMBER];

printf("\n");

if(strcmp(relation,"夫")==0)
{
return_member=look_one_husband (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
printf("%sの夫は",target);
}
else if(strcmp(relation,"息子")==0)
{
return_member=look_one_son (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
printf("%sの息子は",target);
}

else if(strcmp(relation,"叔父")==0)
{
return_member=look_one_uncle (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
printf("%sの叔父は",target);
}
else if(strcmp(relation,"甥")==0)
{
return_member=look_one_nephew (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
printf("%sの甥は",target);
}
else if(strcmp(relation,"祖父")==0)
{
return_member=look_one_grandpa (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
printf("%sの祖父は",target);
}
else
{
printf("そのような関係は定義されていません。\n",relation);
return;
}

if (return_member==0)
{
printf("不明");
}
else if(return_member==1)
{
printf("%s",return_pointer[0] -> name);
}
else
{
if((strcmp(return_pointer[0] -> name,"該当なし")==0)&&(strcmp(return_pointer[1] -> name,"該当なし")==0))
{
printf("該当なし");
}
else if((strcmp(return_pointer[0] -> name,"該当なし")==0)&&(strcmp(return_pointer[1] -> name,"該当なし")!=0))
{
printf("%s",return_pointer[1] -> name);
}
else if((strcmp(return_pointer[0] -> name,"該当なし")!=0)&&(strcmp(return_pointer[1] -> name,"該当なし")==0))
{
printf("%s",return_pointer[0] -> name);
}
else
{
printf("%s %s",return_pointer[0] -> name,return_pointer[1] -> name);
}

}
printf("です。\n");
}




この投稿にコメントする

削除パスワード

No.3816

Re:家系図 後半
投稿者---まきじ(2005/05/27 23:48:43)


HTML形式にして投稿してください


この投稿にコメントする

削除パスワード

No.3817

Re:家系図 後半
投稿者---ageha(2005/05/27 23:55:05)


>HTML形式にして投稿してください

変換すると文字化けが激しいです・・


この投稿にコメントする

削除パスワード

No.3822

Re:家系図 後半
投稿者---G(2005/05/28 02:01:04)


>変換すると文字化けが激しいです・・

そのようなことはないはずですが…。
ではその文字化けが激しいコードを貼ってみて下さい。


この投稿にコメントする

削除パスワード

No.3827

Re:家系図 後半(再投稿代行)
投稿者---紙風船(2005/05/28 11:16:24)


//続き

/*関数;夫への構造体のアドレスを求める*/
int look_one_husband(struct person *one, char *name,struct person *return_pointer[])
{
    int return_member=0;
    struct person *pointer;
    
    if(strcmp(name,"不明")==0)
    {
        return 0;
    }
    
    pointer=look_male(one,look_one_pointer_from_name(one,name) -> partner);
    
    if(strcmp(pointer -> name,"不明")==0)
    {
        return 0;
    }
    
    return_pointer[return_member++]=pointer;
    
    return return_member;
}

/*関数;息子への構造体のアドレスを求める*/
int look_one_son(struct person *one, char *name,struct person *return_pointer[])
{
    struct person *child1;
    struct person *child2;
    int return_member=0;
    
    if(strcmp(name,"不明")==0)
    {
        return 0;
    }
    
    child1=look_one_pointer_from_name(one,name) -> child1;
    child2=look_one_pointer_from_name(one,name) -> child2;
    
    if((strcmp(child1 -> name,"不明")==0)&&(strcmp(child2 -> name,"不明")==0))
    {
        return 0;
    }
    
    child1=look_male(one,child1);
    
    if(strcmp(child1 -> name,"不明")!=0)
    {
        return_pointer[return_member++]=child1;
    }
    
    child2=look_male(one,child2);
    
    if(strcmp(child2 -> name,"不明")!=0)
    {
        return_pointer[return_member++]=child2;
    }
    
    return return_member;
}

/*関数;叔父への構造体のアドレスを求める*/
int look_one_uncle(struct person *one,char *name,struct person *return_pointer[])
{
    struct person *father;
    struct person *mother;
    struct person *uncle;
    int return_member=0;
    
    if(strcmp(name,"不明")==0)
    {
        return 0;
    }
    
    father=look_one_pointer_from_name(one,name) -> father;
    mother=look_one_pointer_from_name(one,name) -> mother;
    
    if((strcmp(father -> name,"不明")==0)&&(strcmp(mother -> name,"不明")==0))
    {
        return 0;
    }
    
    uncle=look_male(one,look_one_brother(one,father -> name));
    
    if(strcmp(uncle -> name,"不明")!=0)
    {
        return_pointer[return_member++]=uncle;
    }
    
    uncle=look_male(one,look_one_brother(one,mother -> name));
    
    if(strcmp(uncle -> name,"不明")!=0)
    {
        return_pointer[return_member++]=uncle;
    }
    
    return return_member;
}

/*関数;甥への構造体のアドレスを求める*/
int look_one_nephew(struct person *one,char *name,struct person *return_pointer[])
{
    int i;
    int return_member=0;
    int return_son_member=0;
    struct person *pointer;
    struct person *pointer_son[MAN_MEMBER];
    
    if(strcmp(name,"不明")==0)
    {
        return 0;
    }
    
    return_son_member=look_one_son(one,look_one_brother(one,name) -> name,pointer_son);
    
    for(i=0;i<return_son_member;i++)
    {
        pointer=look_male(one,pointer_son[i]);
        
        if(strcmp(pointer -> name,"不明")!=0)
        {
            return_pointer[return_member++]=pointer;
        }
    }
    
    return return_member;
}

/*関数;祖父への構造体のアドレスを求める*/
int look_one_grandpa(struct person *one,char *name,struct person *return_pointer[])
{
    struct person *father;
    struct person *mother;
    struct person *grandpa;
    int return_member=0;
    
    if(strcmp(name,"不明")==0)
    {
        return 0;
    }
    
    father=look_one_pointer_from_name(one,name) -> father;
    
    if(strcmp(father -> name,"不明")!=0)
    {
        grandpa=father -> father;
        
        if(strcmp(grandpa -> name,"不明")!=0)
        {
            return_pointer[return_member++]=grandpa;
        }
    }
    
    mother=look_one_pointer_from_name(one,name) -> mother;
    
    if(strcmp(mother -> name,"不明")!=0)
    {
        grandpa=mother -> father;
        
        if(strcmp(grandpa -> name,"不明")!=0)
        {
            return_pointer[return_member++]=grandpa;
        }
    }
    
    return return_member;
}



この投稿にコメントする

削除パスワード

No.3828

Re:家系図 後半(再投稿代行)~2
投稿者---紙風船(2005/05/28 11:17:27)


/*関係を出力*/
void print_relation(struct person *one,char *target,char *relation)
{
    int return_member;
    struct person *return_pointer[MAN_MEMBER];
    
    printf("\n");
    
    if(strcmp(relation,"夫")==0)
    {
        return_member=look_one_husband (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
        printf("%sの夫は",target);
    }
    else if(strcmp(relation,"息子")==0)
    {
        return_member=look_one_son (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
        printf("%sの息子は",target);
    }
    
    else if(strcmp(relation,"叔父")==0)
    {
        return_member=look_one_uncle (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
        printf("%sの叔父は",target);
    }
    else if(strcmp(relation,"甥")==0)
    {
        return_member=look_one_nephew (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
        printf("%sの甥は",target);
    }
    else if(strcmp(relation,"祖父")==0)
    {
        return_member=look_one_grandpa (one,look_one_pointer_from_name(one,target) -> name,return_pointer);
        printf("%sの祖父は",target);
    }
    else
    {
        printf("そのような関係は定義されていません。\n",relation);
        return;
    }
    
    if (return_member==0)
    {
        printf("不明");
    }
    else if(return_member==1)
    {
        printf("%s",return_pointer[0] -> name);
    }
    else
    {
        if((strcmp(return_pointer[0] -> name,"該当なし")==0)&&(strcmp(return_pointer[1] -> name,"該当なし")==0))
        {
            printf("該当なし");
        }
        else if((strcmp(return_pointer[0] -> name,"該当なし")==0)&&(strcmp(return_pointer[1] -> name,"該当なし")!=0))
        {
            printf("%s",return_pointer[1] -> name);
        }
        else if((strcmp(return_pointer[0] -> name,"該当なし")!=0)&&(strcmp(return_pointer[1] -> name,"該当なし")==0))
        {
            printf("%s",return_pointer[0] -> name);
        }
        else
        {
            printf("%s %s",return_pointer[0] -> name,return_pointer[1] -> name);
        }
        
    }
    printf("です。\n");
}



この投稿にコメントする

削除パスワード

No.3829

Re:家系図 後半(再投稿代行)~2
投稿者---RAPT(2005/05/28 11:23:41)


//■下記のように配列を使うと見やすくなるかも。
void print_relation2(struct person *one,char *target,char *relation)
{
    int return_member;
    struct person *return_pointer[MAN_MEMBER];

    const char *who[] = {"夫","息子","叔父","甥","祖父"};
    typedef int (*PFNLOOKONE)(struct person *, char *, struct person **);
    PFNLOOKONE pfnLookOne[] = {look_one_husband, look_one_son, look_one_uncle, look_one_nephew, look_one_grandpa};
    size_t i, count = sizeof(pfnLookOne) / sizeof(pfnLookOne[0]);

    for(i = 0; i < count; i++){
        if(strcmp(relation, who[i]) == 0){
            return_member = pfnLookOne[i](one, look_one_pointer_from_name(one,target) -> name, return_pointer);
            printf("%sの%sは", target, who[i]);
            if (return_member == 0){
                printf("不明");
            }
            else if(return_member == 1 || strcmp(return_pointer[1] -> name, "該当なし") == 0){
                printf("%s",return_pointer[0] -> name);
            }
            else if(strcmp(return_pointer[0] -> name, "該当なし") == 0){
                printf("%s", return_pointer[1] -> name);
            }
            else{
                printf("%s %s",return_pointer[0] -> name, return_pointer[1] -> name);
            }
            printf("です。\n");
            return;
        }
    }
    printf("そのような関係は定義されていません。\n", relation);
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity