C++カリキュラム設計通信録管理システム

14213 ワード

  • テーマ分析
  • 携帯電話の通信録システムを構築します.携帯電話の連絡先の情報は、携帯電話にも携帯電話カードにも、同時に2つの場所にも格納できます.携帯電話カードに保存されている連絡先の情報には、ユーザー名と電話番号の2つの情報しか含まれていません.携帯電話に保存されている連絡先の情報には、名前、電話番号、QQ番号、出身地が含まれています.タイトルの要求に応じて機能を実現する.
    携帯電話カードの連絡先ファイルと携帯電話の連絡先ファイルは事前に書いてあり、名前はそれぞれPhoneCardとPhoneで、フォーマットはテキストファイルです.
    私が作った通信録管理システムには全部で7つのクラスが含まれています.
    最初の2つのクラスは情報クラスで、それぞれ携帯電話カードの連絡先と携帯電話の連絡先の情報で、2番目のクラスは3番目のクラスを継承します.
    3番目のクラスは、増加、削除、検索、変更、ブラウズの虚関数を含む虚ベースクラスです.
    4番目のクラスは3番目の虚基クラスを継承し、携帯電話カードの連絡先の操作クラスである.データ・メンバーは、最初のクラスの動的オブジェクトの配列であり、マッピング・コンテナは、動的配列の場所で連絡先の名前と連絡先を関連付けます.メンバー関数には、追加、削除、検索、変更、ブラウズが含まれます.ダイナミック配列は通常のオブジェクト配列に比べて操作が簡単で、STLのvectorクラスの関数を直接呼び出すことができ、コンテナをマッピングする応用は検索要素の操作を比較的簡単にします.このクラスのコンストラクション関数とコンストラクション関数には、ファイルの読み出しと書き込みが含まれます.このクラスのDelete関数は、実際にはオブジェクト配列から削除されず、bool型配列vis[001]が設定されているだけであり、要素配列を削除するvis値をtrue(アクセス済み)に設定し、ファイルを書き込む際にvis値がfalseの配列のみを書き込むことで削除を実現する.
    5番目のクラスは4番目のクラスと完全に似ており、携帯電話の連絡先に対する操作クラスです.
    6番目のクラスはユーザクラスであり,このクラスで3番目のクラスが利用され,マルチステートが実現される.データ・メンバーは、4番目のクラスと5番目のクラスのオブジェクトです.クラスで選択操作を行い、携帯電話カードの連絡先を操作するか、携帯電話の連絡先を操作するかを決定します.前の2つのクラスの追加、削除、検索、変更、閲覧操作に加えて、携帯電話カードと携帯電話の連絡先からの双方向移動と双方向複製操作関数も含まれています.
    7番目のクラスはメニュークラスで、ユーザーインタフェースを表示して操作します.
    二、実現コード
    //PhoneCard.h
    
    // codeblocks     include     PhoneCard.h
    
    //        
    
    #ifndef PHONECARD_H
    
    #define PHONECARD_H
    
    #include
    
    #include
    
    
    
    using namespace std;
    
    
    
    
    
    class PhoneCard
    
    {
    
        protected:
    
            string Name;
    
            string PhoneNumber;
    
    
    
        public:
    
            void setName(string name);
    
            void setPhoneNumber(string phonenumber);
    
    
    
            string getName();
    
            string getPhoneNumber();
    
    
    
            PhoneCard();
    
            PhoneCard(string name,string phonenumber);
    
    
    
            friend istream&operator>>(istream&input,PhoneCard&phoneC);
    
            friend ostream&operator<>(istream&input,PhoneCard&phoneC)
    
    {
    
        input>>phoneC.Name>>phoneC.PhoneNumber;
    
        return input;
    
    }
    
    ostream&operator<
    
    #include
    
    #include"PhoneCard.h"
    
    
    
    using namespace std;
    
    
    
    
    
    class Phone : public PhoneCard
    
    {
    
        private:
    
            string QQnumber;
    
            string Address;
    
    
    
        public:
    
            void setQQnumber(string qq);
    
            void setAddress(string address);
    
    
    
            string getQQnumber();
    
            string getAddress();
    
    
    
            Phone();
    
            Phone(string name,string phonenumber,string qq,string address);
    
    
    
            friend istream&operator>>(istream&input,Phone&p);
    
            friend ostream&operator<>(istream&input,Phone&p)
    
    {
    
        input>>p.Name>>p.PhoneNumber>>p.QQnumber>>p.Address;
    
        return input;
    
    }
    
    ostream&operator<
    
    #include"PhoneCard.h"
    
    #include
    
    #include
    
    #include
    
    #include
    
    #include
    
    #include
    
    
    
    using namespace std;
    
    
    
    
    
    class PhoneCardUser : public Use
    
    {
    
        private:
    
            vectorusers;//             
    
            bool vis[1001];//                
    
            multimapMap;//                        
    
            multimap::iterator it;//   ,      
    
    
    
        public:
    
            PhoneCardUser();
    
            ~PhoneCardUser();
    
    
    
            void Add();
    
            void Delete();
    
            void Change();
    
            void Query();
    
            void Read();
    
            void Zero();
    
            void Set(PhoneCard &p);
    
    
    
    };
    
    
    
    #endif // PHONECARDUSER_H
    
    
    
    
    
    //PhoneCardUser.cpp
    
    //src     PhoneCardUser.cpp
    
    //     cpp  
    
    #include "PhoneCardUser.h"
    
    
    
    
    
    PhoneCardUser::PhoneCardUser()//    ,   
    
    {
    
        string Name,PhoneNumber;
    
        memset(vis,false,sizeof(vis));//   vis        0,      
    
        cout<>Name)
    
        {
    
            if(Name=="0")
    
                break;
    
            ist>>PhoneNumber;
    
            PhoneCard p(Name,PhoneNumber);//          
    
            users.push_back(p);//           
    
            Map.insert(pair(Name,users.size()-1));//       Map Name   
    
        }
    
        ist.close();
    
    }
    
    PhoneCardUser::~PhoneCardUser()//                  
    
    {
    
        cout<1000)
    
        {
    
            cout<>p;
    
        users.push_back(p);//          
    
        Map.insert(pair(p.getName(),users.size()-1));//  map       
    
    }
    
    void PhoneCardUser::Delete()
    
    {
    
        cout<>name;
    
        it=Map.find(name);//  
    
        if(it!=Map.end())
    
        {
    
            vis[it->second]=true;//       ,         
    
        }
    
        else
    
            cout<>name;
    
        it=Map.find(name);
    
        if(it!=Map.end()&&!vis[it->second])
    
        {
    
            cout<>p;
    
                users[it->second]=p;//                
    
            }
    
        }
    
        else
    
            cout<>name;
    
        it=Map.find(name);
    
        if(it!=Map.end()&&!vis[it->second])
    
        {
    
            cout<second]<(p.getName(),users.size()-1));
    
    }//              
    
    
    
    /*
    
              
    
                   users、      Map,Map                     ,multimap       
    
                ,         ;                    
    
         、 、 、 、  、Set        、Zero    
    
    */
    
    
    
    //               
    
    // Phone.h
    
    //include     Phone.h
    
    //        
    
    #ifndef PHONEUSER_H
    
    #define PHONEUSER_H
    
    
    
    #include 
    
    #include
    
    #include
    
    #include
    
    #include
    
    #include
    
    #include
    
    #include
    
    #include"Phone.h"
    
    
    
    using namespace std;
    
    
    
    
    
    class PhoneUser : public Use
    
    {
    
        private:
    
            vectorusers;
    
            bool vis[1001];
    
            multimapMap;
    
            multimap::iterator it;
    
    
    
        public:
    
            PhoneUser();
    
            ~PhoneUser();
    
            void Add();
    
            void Delete();
    
            void Change();
    
            void Query();
    
            void Read();
    
            void Zero();
    
            void Set(Phone&p);
    
    };
    
    
    
    #endif // PHONEUSER_H
    
    
    
    
    
    // PhoneUser.cpp
    
    //src     PhoneUser.cpp
    
    //     cpp  
    
    #include "PhoneUser.h"
    
    
    
    
    
    
    
    PhoneUser::PhoneUser()
    
    {
    
        memset(vis,false,sizeof(vis));
    
        cout<>Name)
    
        {
    
            if(Name=="0")  break;
    
            ist>>PhoneNumber>>QQnumber>>Address;
    
            Phone p(Name,PhoneNumber,QQnumber,Address);
    
            users.push_back(p);
    
            Map.insert(pair(Name,users.size()-1));
    
        }
    
        ist.close();
    
    }
    
    PhoneUser::~PhoneUser()
    
    {
    
        cout<>p;
    
        users.push_back(p);
    
        Map.insert(pair(p.getName(),Map.size()-1));
    
    }
    
    void PhoneUser::Delete()
    
    {
    
        cout<>name;
    
        it=Map.find(name);
    
        if(it!=Map.end())
    
        {
    
            vis[it->second]=true;
    
        }
    
        else
    
            cout<>Name;
    
        it=Map.find(Name);
    
        if(it!=Map.end()&&!vis[it->second])
    
        {
    
            cout<>p;
    
            users[it->second]=p;
    
        }
    
        else
    
            cout<>name;
    
        it=Map.find(name);
    
        if(it!=Map.end()&&!vis[it->second])
    
        {
    
            cout<second]<(p.getName(),users.size()-1));
    
    }
    
    
    
    /*
    
           ,          
    
    */
    
    
    
    //        
    
    //Manager.h
    
    //include     Manager.h
    
    //        
    
    #ifndef MANAGER_H
    
    #define MANAGER_H
    
    
    
    #include"PhoneCardUser.h"
    
    #include"PhoneUser.h"
    
    #include
    
    #include
    
    #include
    
    #include
    
    #include
    
    
    
    using namespace std;
    
    
    
    class Manager
    
    {
    
        private:
    
            PhoneCardUser PCU;//       
    
            PhoneUser PU;//       
    
        public:
    
            Manager();
    
            void Add();
    
            void Delete();
    
            void Change();
    
            void Query();
    
            void Read();
    
            void MovePhoneToPhoneCard();
    
            void MovePhoneCardToPhone();
    
            void CopyPhoneToPhoneCard();
    
            void CopyPhoneCardToPhone();
    
    
    
    };
    
    
    
    
    
    
    
    #endif // MANAGER_H
    
    
    
    //Manager.cpp
    
    //src     Manager.cpp
    
    //     cpp  
    
    #include "Manager.h"
    
    
    
    
    
    Manager::Manager(){}
    
    void Manager::Add()//                         
    
    {
    
        Use*u;
    
        int num;
    
        cout<>num;
    
        if(num==1)
    
        {
    
            u=&PCU;//          ,    
    
            u->Add();
    
        }
    
        else
    
        {
    
            u=&PU;
    
            u->Add();
    
        }
    
    }
    
    void Manager::Delete()
    
    {
    
        Use*u;
    
        int num;
    
        cout<>num;
    
        if(num==1)
    
        {
    
            u=&PCU;
    
            u->Delete();
    
        }
    
        else
    
        {
    
            u=&PU;
    
            u->Delete();
    
        }
    
    }
    
    void Manager::Change()
    
    {
    
        Use*u;
    
        int num;
    
        cout<>num;
    
        if(num==1)
    
        {
    
            u=&PCU;
    
            u->Change();
    
        }
    
        else
    
        {
    
            u=&PU;
    
            u->Change();
    
        }
    
    }
    
    void Manager::Query()
    
    {
    
        Use*u;
    
        int num;
    
        cout<>num;
    
        if(num==1)
    
        {
    
            u=&PCU;
    
            u->Query();
    
        }
    
        else
    
        {
    
            u=&PU;
    
            u->Query();
    
        }
    
    }
    
    void Manager::Read()
    
    {
    
        Use*u;
    
        int num;
    
        cout<>num;
    
        if(num==1)
    
        {
    
            cout<Read();
    
        }
    
        if(num==2)
    
        {
    
            cout<Read();
    
        }
    
    }
    
    void Manager::MovePhoneToPhoneCard()//       ,       
    
    {
    
        string name,PhoneNumber,QQnumber,Address;
    
        ifstream ist("Phone.txt",ios::in);
    
        if(!ist)
    
        {
    
            cout<>name)
    
        {
    
            if(name=="0")  break;
    
            ist>>name>>PhoneNumber>>QQnumber>>Address;
    
            PhoneCard p(name,PhoneNumber);
    
            PCU.Set(p);//     
    
        }
    
        PU.Zero();
    
        ist.close();
    
    }
    
    void Manager::MovePhoneCardToPhone()
    
    {
    
        string name,PhoneNumber;
    
        ifstream ist("PhoneCard.txt",ios::in);
    
        if(!ist)
    
        {
    
            cout<>name)
    
        {
    
            if(name=="0") break;
    
            ist>>PhoneNumber;
    
            Phone p(name,PhoneNumber,"","");
    
            PU.Set(p);
    
        }
    
        PCU.Zero();
    
        ist.close();
    
    }
    
    void Manager::CopyPhoneToPhoneCard()//    ,       
    
    {
    
        string name,PhoneNumber,QQnumber,Address;
    
        cout<>name)
    
        {
    
            if(name=="0")  break;
    
            ist>>name>>PhoneNumber>>QQnumber>>Address;
    
            PhoneCard p(name,PhoneNumber);
    
            PCU.Set(p);
    
        }
    
        ist.close();
    
    }
    
    void Manager::CopyPhoneCardToPhone()
    
    {
    
        string name,PhoneNumber;
    
        ifstream ist("PhoneCard.txt",ios::in);
    
        if(!ist)
    
        {
    
            cout<>name)
    
        {
    
            if(name=="0") break;
    
            ist>>PhoneNumber;
    
            Phone p(name,PhoneNumber,"","");
    
            PU.Set(p);
    
        }
    
        ist.close();
    
    }
    
    
    
    
    
    /*
    
         ,                  
    
                           
    
              ,       
    
    */
    
    
    
    
    
    //Terminal.h
    
    //include     Terminal.h
    
    //          
    
    #ifndef TERMINAL_H
    
    #define TERMINAL_H
    
    
    
    #include
    
    
    
    class Terminal
    
    {
    
        public:
    
            int choice;
    
            Manager M;
    
    
    
            void start();
    
            void Menue();
    
    
    
    };
    
    
    
    
    
    #endif // TERMINAL_H
    
    
    
    //Terminal.cpp
    
    //src     Terminal.cpp
    
    //     cpp  
    
    #include "Terminal.h"
    
    
    
    
    
    int choice;
    
    Manager M;//       
    
    
    
    void Terminal::start()
    
    {
    
        while(1)
    
        {
    
            Menue();
    
            cout<>choice;
    
            if(choice==10)   return;
    
            switch(choice)
    
            {
    
            case 1:
    
                M.Add();
    
                break;
    
            case 2:
    
                M.Delete();
    
                break;
    
            case 3:
    
                M.Change();
    
                break;
    
            case 4:
    
                M.Query();
    
                break;
    
            case 5:
    
                M.Read();
    
                break;
    
            case 6:
    
                M.MovePhoneToPhoneCard();
    
                break;
    
            case 7:
    
                M.MovePhoneCardToPhone();
    
                break;
    
            case 8:
    
                M.CopyPhoneToPhoneCard();
    
                break;
    
            case 9:
    
                M.CopyPhoneCardToPhone();
    
                break;
    
            default:
    
                break;
    
            }
    
            system("pause");
    
            system("cls");
    
        }
    
    }
    
    void Terminal::Menue()
    
    {
    
        cout<

    三、まとめ
    大学1年生の時に書いたC++カリキュラムのデザインは、当時2日ほど書いていたが、やはり人を鍛えていた.
    カリキュラム設計週間の前の週末に、私は大体問題を見て、具体的な考え方を構築しました.后ろの先生の书く考えを见ていない前に、私は2つの情报の类を创立することを考えて、1つの総括的な操作の类(実现していないで、操作が繁すぎます)、ターミナルのメニューの类、多态の要求について、私は长い间考えてもどのように実现することを思いませんでした.そして問題後の実現過程の分析を見て、私が考えている総操作類を4つの類に分けて、構想がはっきりしていて、自然に多態を実現しました.個人的に実現システムが最も難しいのは実現過程の分析であり、具体的な過程を分析することは既知であり、このプログラムの難易度はすでに半分下がった.
    前に友達が書いた選択システムはvectorとmapを使いました.STLを習ってからと思うと、もう長い間中のテンプレートを使っていないようです.sortソートやvectorがたまに使うほか、mapやqueueなどは何なのか忘れてしまいます.私は彼女のmultimapの使い方を参考にして、この知識を振り返った.vectorは削除要素を追加するのに有利で、メモリスペースを節約します.Multimapは反復器を設定して要素を検索するのに便利です.だからカリキュラムデザインにvectorとmapを使いたいです.
    考え方と応用方法が確定し、月曜日からプログラムを書き始めました.月曜日の午前中に4番目のクラスと5番目のクラスを書いたとき、クラスのメンバー関数がmapとvectorを具体的に適用するときはしばらく引っかかっていたので、mapとvectorの具体的なアプリケーションを何度も見て、使いました.主にforループで遍歴したくないので、面倒で、特に要素を削除するときは、面倒で、間違いやすいです.STLという時間と労力を節約するテンプレートは無駄に使わない.
    月曜日の午後はたぶんプログラムをノックして、コンパイルして、具体的に運行して問題があります.考えに沿っていると、私は不思議に3つ目のクラスを省略したことに気づいた.それを使ったことがないようで、約束した多態はないようだ.幸いなことに、サブクラスオブジェクトを加えて親ポインタに割り当てるのは面倒ではありません.夜に機能ごとに実行して、いくつかの小さなエラーを調整しました.追加削除してブラウズ操作を変更しても大丈夫で、コンソールで出力しても大丈夫ですが、データはファイルに読めません.
    火曜日の午前中に書類の書き込み操作を変更し、何度も繰り返し見たが、間違いが見つからず、辛抱強く消耗し、ほとんど崩壊した.プログラムも何度か略読し、ついでにcout出力ヒントの単語のスペルミスもいくつか選びましたが、ファイルはまだ読めません.昼に帰って人に手伝ってもらって见て、事実は私がそんなに何度もファイルの部分のプログラムを読むのが确かに间违いないことを证明して、前の少し小さい问题が出て、例えば判断==賦値=、小さい间违いは绝えません.人の助けを得て、やっとプログラムを調整した.本当に大変で、心が疲れています.
    その後、いくつかのプログラムを調整して、ほとんどが操作クラスでエラーが発生していることに気づきました.自分でプログラムを書くのと他の人のプログラムを調整するのとは本当に違って、書くよりずっと疲れています.いくつかの問題を解決するのに役立ちましたが、ファイルを読むエラーが出ていません.私と書く差は多くないと思います.できません.オブジェクト配列に新しく作成されたオブジェクトがあります.プログラムとファイルの接続も問題ありません.しかし、ファイルに書くことはできません.演算子の運用に問題があると推測されます.
    今回のカリキュラムの設計の収穫はやはり大きく、忍耐力を大きく鍛えた.類の具体的な応用能力も大きく向上し、利益を得た.