C++カリキュラム設計報告書

9708 ワード

カリキュラム設計報告書の前に書いたので、発表し忘れました...
C++でしばらく勉強した後、私たちはカリキュラム設計に入りました.私が選んだテーマは「新入生基本情報統計ソフト」です.学生の名前、性別、専門、生年月日、家庭の住所、英語の入学成績など、新入生が報告されます.チェーンテーブルクラスを設計して実現し、学生数を統計する必要があります.テキストインタフェース:
  • 新規学生情報
  • 学生情報
  • を削除
  • 学生情報(保存済みファイル情報)
  • をインポートする.
  • 学生情報検索(名前別)
  • 学生情報統計(専門または性別または年齢---年齢は自動的に計算する)
  • 英語成績別
  • 学生情報保存
  • 最初にいくつかの簡単な文法を学んだ後、一つの工事を完成するのはまだ難しいと感じました.カリキュラム設計の核心は、チェーンテーブルの操作であり、動的チェーンテーブルの増加、削除、変更、調査を実現することだと思います.また対象と向き合う思想を体現し,C言語の構造体に比べてクラスの概念を導入した. カリキュラムのデザインを書くときは、一気に打ち上げるよりも、モジュールを分けて、機能を分けてステップ的に書きます.クラスの作成には、学生情報を格納するためのstudentクラスと、さまざまな機能を実現するためのstudentmanageクラスの2つのクラスが作成されます.Studentmanageの関数は、実質的にstudentを指すクラスポインタです.例えば、Student*Studentmanage::creat()です.

  • これは制御可能な長さのチェーンテーブルで、ある終了条件が現れるまで、絶えず新しい申請空間に頼っています.例えば、私の学生の名前が#のとき、現在のサイクルを飛び出して、入力を停止します.最初のノードでは特殊な処理が必要であり,すなわちヘッダノードを初期化し,その後申請空間,初期化,ポインタをずらすループが往復した.ポイントは最後のノードの後継者が空(NULL)になることです.
  • この機能は、形成されたチェーンテーブルに確立されているので、チェーンテーブルが空であれば飛び出します.空でない場合は、スペースを申請して初期化します.これは元のチェーンテーブルの最後に差し込むのではなく、頭のノードの後ろを探して、新しく追加したものを両者の間に置いたのです.
  • 削除は増加と同様に、削除要求はもともとチェーンテーブルが存在する.名前に従って削除し、削除する名前を比較します.2つのケースがあります.1つは、ヘッドポインタを直接下に移動させ、元のノードfreeを落とすことです.もう1つの場合:他のノードは、p 1ポインタを先に後ろに移動させ、削除する必要がない場合は、毎回後ろに移動します.削除するノードが現れるまで、ポインタの前のnextを次のnextに掛けて、それを隔ててfreeを落とします.
  • 改、この2つの原理の差が少ないことを調べて、一緒に話します.すべて遍歴を通じて、必要なノードを見つけて、ただ1つ見つけてから再入力して、元のデータを上書きします;もう一つは表示だけです.便利さとコードの簡潔さのために、ここでdisplaynode()関数を書きました.表示と改善のたびに便利になります.
  • ファイルを保存し、
  • ファイルを読みます.
    これは難点と言えますが、まずファイルを書き込むということです.すなわち、現在のブラックボックス---->txtファイルではofstream、ファイル出力ストリームクラス、openのtxtが使われています.なければ新しいものを作成し、もともとあれば上書きします.p 1に頭を付与した後、p 1が値を格納する限り、outが新しく作成したファイルに書き込み、p 1を次のファイルに移動させる.ファイルを読む過程は新しいチェーンテーブルを作る過程で、まず頭を空にして、ここにstudentクラスと同じデータがあって、ファイルを開くことに成功した後、中のデータを一つ一つ読んで、p 1に値を与えます.ここではチェーンテーブルの作成と同様に説明します.
  • ソート
  • 思想:もし、元のチェーンテーブルは無秩序で、私の最終的な目的は秩序を創造することです.そして、私はこの中の最大または最小の(遍歴すればいい)を見つける能力があります.では、私は新しいチェーンテーブルを作成しませんか.それは元のチェーンテーブルから取り出されたノードで構成されています.それは必然的に秩序があります.他の操作の最初と同様に,ヘッダとその後の一連のチェーンテーブルが伝達され,従来とは異なり,今回は直接ヘッダポインタの操作が開始された.(366と367は、空のヘッダが入ってくるのを防ぐためです.コアコードはwhiteのループです.第1のレイヤのループは、ヘッダを後ろに繰り返すことを目的としていますが、今回の目的は、終点までループすることです.期間中に1回実行するたびに、定義したポインタを再び同じブロックに向けさせます.第2のレイヤのループは、ヘッダです.の遍歴は、後が前より大きい場合は、後がmaxになると同時に前のノードを位置決めし、このようにマークした後、pを後ろに推進し続け、サイクル後に最大のフィルタリングを実現するために、見つけたらどうなるか、次の操作を見てみましょう.最初のif(379)他の場合、前のステップ(371 while)でmaxが見つかった以上、ここでそれを外し、マークした前の項目(pre)がmaxの後継者を指し、maxと元のテーブルとのつながりを切断する.2番目のif(387)私の目的はそれをその新しいチェーン時計の頭にすることです.前のいくつかのステップで、私たちはそれぞれmaxを見つけて、maxを分離して、ついにこのステップでmaxのために1つの着地を探します.もちろん、ifは初めて実行されるに違いない(上からpnewを空にしたので)、私たちは最大のノードを新しいチェーンテーブルの最初のノードにしました.それでは、その後の数回のサイクルで、毎回elseが実行され、中で新しく取り出したmaxがチェーンテーブルの後ろに一つ一つつながっていることがわかります.最後に、その大きなループがあることを忘れないでください.それは毎回中の内容を実行します.たとえば、元の無秩序チェーンテーブルでは、ノード(最大ノード)が1つずつ少なくなり、新しい秩序チェーンテーブルでは1つずつ多くなります.    元チェーンテーブルが終了した日、すなわち新しいチェーンテーブルが生成された時.その時、循環も完全に終わったので、頭の針をその新生チェーンテーブル(394)に向け、この秩序あるチェーンテーブルを共に指さして、伝えればいいのです.
  • 主関数の選択機能
  • ここには2つのブロックが含まれており、まずメニューインタフェースmenuであり、その戻り値は文字型であり、最後のcinによって書き込まれる.次にmain関数のswitchの選択機能に続き,intをcharで使わないのはユーザの乱送によるエラーを回避するためである.
    以下、ソースコードを添付します.
    #include
    #include   //      
    #include   //   
    #include//     ,     。
    #include //new,free
    using namespace std;
    int n=0;
    
    
    /*
        1.  head  ,   add,display        ? ok 
        (            ??)
        2.free         ? ok 
        3.          
        4.      ok 
        5.      ok  
    */
        char stop[12]={"#"};
        char name[12];
    class Student {
        public:     
            char name[12];
            char sex[3];
            char study[12];     
            char addr[12];
            int birth[3];
            int engli;
            Student *next;
    };
    class Studentmanage {
        
        private:
            Student *head,*p1,*p2,*p3;
        public:
            Studentmanage () {};
            Student *creat();
            Student *add(Student *head);
            Student *delet(Student *head);
            void *search(Student *head);
            Student *modify(Student *head);
            Student *sort(Student*head);
            void display(Student *head);
            void displaynode(Student *head);
            void write_file(Student *head);
            
            Student * read_file();
            ~Studentmanage () {};
    };
        Studentmanage s;
    Student *Studentmanage::creat() {
        p1=p2=new Student;
        head=NULL;
    
        cout<>p1->name;
            if( strcmp(stop,p1->name)==0 ) {
                break;
            }
            cout<>p1->sex;
            
            cout<>p1->study;
            
            cout<>p1->addr;
            
            cout<>p1->birth[0];      
            cout<> p1->birth[1];
            cout<>p1->birth[2];
            
            cout<>p1->engli;
            system("cls");
            
            n=n+1;
            if(n==1)
                head=p1;
            else
                p2->next=p1;
            p2=p1;
            p1=new Student;
        }
        p2->next=NULL;
        return head;
    }
    
    
    Student *Studentmanage::add(Student *head) {
        p1=p3=new Student;  
        p1=head;
            if(p1==NULL)
            {cout<>p3->name;
            cout<>p3->sex;   
            cout<>p3->study;     
            cout<>p3->addr;      
            cout<>p3->birth[0];      
            cout<> p3->birth[1];
            cout<>p3->birth[2];      
            cout<>p3->engli;
            cout<next=p1->next;
    p1->next=p3;
    
    
    
        cout<>name;
        p2=p1=head;
        int j=0;
        if( ( strcmp(name,head->name)==0 ) && (head!=NULL))
        {
            head=head->next;
            free(p1);
            j=1;    
        } 
        else 
        {
            p1=head->next;
            while(p1!=NULL) {
                if(strcmp(name,p1->name)==0) {
                    p2->next=p1->next;
                    free(p1);
                    j=1;            
                    break;
                } else {
                    p2=p1;
                    p1=p2->next;
                }
            }
        }
    
        if(j==0)
            cout<>name;
        p1=head;
        int j=0;
        while(p1!=NULL) {
            if( strcmp(name,p1->name)==0   ) {
            
            s.displaynode(p1);
    
                break;
            }
            p1=p1->next;
        }
        if(j==0)
            cout<>name;
    
        if(strcmp( name, head->name)==0) {
            cout<>name1;
            cout<>sex;   
            cout<>study;     
            cout<>addr;      
            cout<>birth[0];      
            cout<>birth[1];
            cout<>birth[2];      
            cout<>engli;     
                    strcpy(head->name,name1);
                    strcpy(head->sex,sex);
                    strcpy(head->study,study);
                    strcpy(head->addr,addr);
                    head->birth[0]=birth[0];
                head->birth[1]=birth[1];
                head->birth[2]=birth[2];
                head->engli=engli;      
            j=1;
        } else {
            p1=head->next;
            while(p1!=NULL) {
                if(strcmp(p1->name,name)==0)    
                    cout<>name1;
            cout<>sex;   
            cout<>study;     
            cout<>addr;      
            cout<>birth[0];      
            cout<>birth[1];
            cout<>birth[2];      
            cout<>engli;         
                    strcpy(p1->name,name1);
                    strcpy(p1->sex,sex);
                    strcpy(p1->study,study);
                    strcpy(p1->addr,addr);
                    p1->birth[0]=birth[0];
                    p1->birth[1]=birth[1];
                    p1->birth[2]=birth[2];
                    p1->engli=engli;
                    j=1;
                break;          
            }
        }
        if(j==0)
            cout<next;        
            }
        }
    }
    void Studentmanage::displaynode(Student *head) {
        p1=head;
        if(p1==NULL)
            cout<name<sex<study;          
                cout<addr<birth[0]<birth[1]<birth[2]<birth[0]<engli<>name2>>sex>>study>>addr>>birth[0]>>birth[1]>>birth[2]>>engli) 
        {       
            strcpy(p1->name,name2);
            strcpy(p1->sex,sex);
            strcpy(p1->study,study);
            strcpy(p1->addr,addr);
            p1->birth[0]=birth[0];
            p1->birth[1]=birth[1];
            p1->birth[2]=birth[2];
            p1->engli=engli;
            i++;
            if(i==1) {
                head=p2=p1;
            } else {
                p2->next=p1;
            }
            p2=p1;
            p1=new Student;
            p1->next=NULL;  
        }
    cout<name<sex<study<addr<birth[0]<birth[1]<birth[2]<engli<next;
        }
        out.close();
        cout<next!=NULL) {
                p=pmax=ppre=head;
    
                while(p->next!=NULL) {
                    if(p->next-> birth[0] > pmax->birth[0]) {
                        pmax=p->next;
                        ppre=p;
                    }
                    p=p->next;
                }
    
                if(head==pmax) {
                    head=head->next;
                    pmax->next=NULL;
                } else {
                    ppre->next=pmax->next;
                    pmax->next=NULL;
                }
    
                if(pnew==NULL) {
                    pnew=pmax;
                } else {
                    pmax->next=pnew;
                    pnew=pmax;
                }
            }
            head->next=pnew;
            pnew=head;
            return head;
        }
    }
    
    
    
    char menu() {
        system("cls");
        char ch;
            
        cout<>ch;
        return ch;
    }
    
    int main ()
     {
        Studentmanage s;
        Student *head;
        head=NULL;
        int n=0;
        char c;
        cout<