template 関数で氏名を検索

template 関数に氏名構造体と成績構造体を渡して、成績表を表示します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. func() 関数に氏名構造体と成績構造体を渡して、氏名と成績を表示します。
    学籍番号と氏名の構造体(Name,Name2)と、学籍番号と成績の構造体(Mark,Mark2)を宣言します。
    class で定義していますが、実質的には構造体です。
    typedef class
    { public:
        int     num;
        char    name[24];
    } Name;
    typedef class
    { public:
        int     num;
        char    addr[10];
        char    name[24];
    } Name2;
    
    typedef class
    { public:
        int     num;
        int     ten1;
        int     ten2;
        int     ten3;
    } Mark;
    typedef class
    { public:
        int     num;
        int     ten4;
        int     ten5;
        int     ten1;
        int     ten2;
        int     ten3;
    } Mark2;
    
  2. Name,Name2 と Mark,Mark2 を配列にして、初期値を設定します。
    Name    name[] =
    { {1005, "愛知 大五郎"}, {1007, "大阪 雅美子"}, {1012, "神戸 佳奈子"}, 
      {1028, "奈良 信一郎"}, {1032, "滋賀 真唯子"}, {999, "*"} };
    Name2   name2[] =
    { {1005, "愛知県", "愛知 大五郎"}, {1007, "大阪府", "大阪 雅美子"}, {1012, "神戸市", "神戸 佳奈子"}, 
      {1028, "奈良県", "奈良 信一郎"}, {1032, "滋賀県", "滋賀 真唯子"}, {9999, "***", "*"} };
    Mark    mark[] =
    { {1005,20,30,40}, {1012,80,90,95}, {1007,96,92,87} };
    Mark2   mark2[] =
    { {1028,50,60,70,80,90}, {1032,84,85,86,87,88}, {1007,96,95,94,93,92} };
    
  3. template 関数 func() を呼び出す main() 関数です。
    一人分の Mark 構造体と、学籍番号と氏名の構造体を配列で定義した name[] を渡します。
    次に Mark2 構造体と、学籍番号と氏名の構造体を配列で定義した name2[] を渡します。
    int main()
    {
        for(int i=0; i<3; i++)  Func(mark[i], name);
        cout << endl;
        for(int i=0; i<3; i++)  Func(mark2[i], name2);
        return 0;
    }
    
  4. mark と name[] を受け取って、成績表を表示する Func() 関数です。
    <class Type1, class Type2> で呼び出し側から渡された二種類の型を受け取ります。
    Type1 が mrk の型で、Type2 が nam[] の型です。
    mrk.num をキーにして、nam[] の氏名を検索します。
    見つけた氏名と成績を表示します。
    template
    void  Func(Type1 mrk, Type2 nam[])
    {   int i;
        for(i=0; nam[i].num!=mrk.num && nam[i].num!=999; i++);
        cout << nam[i].name << "  " << mrk.ten1 << "  " << mrk.ten2 << "  " << mrk.ten3 << endl;
    }
    
  5. このプログラムを実行すると印字の結果はどうなるでしょう。
    template 関数に構造体を渡したときの扱われ方を確認して下さい。

超初心者のプログラム入門(C/C++)