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


目次
一、設計要求3
(一)機能設計要求3
1.ファイルを作成する3
2.ファイル格納3
3.ファイル3を読み込む
4.学生記録を増やす3
5.レコードの削除4
6.修正記録4
7.クエリーレコード4
8.記録を表示する4
9.レコードのソート4について
10.試験手順5
(二)全体設計5
1.構造階層
エンティティ階層5
(1)第1層:contact_per.h個人情報層
(2)第2層:database.hデータベース層5
(3)第3層:oper.hユーザ操作層5
2つの平行インタラクティブレイヤ(最初の3つのレイヤに関連付けられた)5
(1)menu.hディレクトリ層5
(2)主ソースコード.cppインタフェース層6
2.構造部品実装詳細6
階層1:contact_per.h個人情報層6
携帯電話単体ユーザー6
携帯電話カード単体ユーザー6
第2層:database.hデータベース層6
携帯電話データベース類6
携帯電話カードデータベース類6
階層3:oper.hユーザ操作層7
二、インタフェース設計と各機能モジュール実現9
(一)インタフェース設計9
(二)機能モジュール実現10
四、使用説明及びプログラミング体験10
(一)使用説明10
(二)プログラミング体験10
完全なソース11
エンティティ階層11
2つの平行インタラクティブレイヤ(最初の3つのレイヤに関連付けられた)36
参考文献41
 
一、設計要求
(一)機能設計要求
1.ファイルの作成
(1)プログラムは相対パスでファイルを保存し,プログラムの堅牢性を向上させる.
(2)携帯電話と携帯電話カードの連絡先はそれぞれ工事フォルダの下でソースコードと同じフォルダのPHONE_CONTATTとSD_contactの下.
(3)コンストラクション関数により関数を構築してファイルを開く場合,特別な判定メカニズムにより,ファイルが紛失するとローカルレコード同期プロセスがスキップされ,カード死は発生せず,プログラム終了時に新しいファイルが作成され,2回目の開くと正常に動作する.
(4)ファイルを書くときに同名のファイルが存在する場合は上書きし、データの同期性を確保する.
2.ファイルストレージ
メインメニューに戻るかプログラムを終了すると自動的にファイルに上書きされ、手作業で保存する必要がなく、より人間的になります.
3.ファイルの読み込み
プログラムが起動すると、2つのローカルファイルのローカルレコードが読み込まれ、マルチマッピングに同期した後、ユーザーが閲覧するかどうかを決定し、正式にメインメニューに入ります.
4.学生記録を増やす
(1)携帯電話と携帯電話カードの2つのオプションに分けられ,ファイルを保存する前に,新規コンテンツと読み込んだ元のコンテンツが多重マッピング多重マッピングに保存され,メインメニューに戻るかプログラムを終了すると自動的にファイルに更新される.
(2)最大記憶容量が設定されており、携帯電話のデフォルトは200、携帯電話カードは2000であり、許容できる最大安全容量は27531841件の記録であり、それを超えるとスタックメモリの制限により安全性が保証されない.メインメニューオプション8で変更できます.
5.レコードの削除
(1)すべての連絡先を氏名でリストして任意の形式で削除することができる.
(2)削除を行う前に連絡先の所在を確定し、位置決め操作は二分検索アルゴリズムを採用し、lower_boundとupper_boundは同名記録の範囲を決定する.O(log 2 n)レベルの複雑さは,従来のシーケンスルックアップ方式よりも効率的なアルゴリズム支持を有する.
(2)プログラム中の削除に関するパターンは8種類あります.
1)携帯電話のアドレス帳(同名全記録削除).         
2)携帯電話のカートゥーン.(同じ名前のすべてのレコードを削除します).         
3)携帯電話のアドレス帳.(同じ名前のレコードを削除します).             
4)携帯電話のカートゥーン.(同じ名前のレコードを削除します).          
5)両方のアドレス帳をクリアする(その名前の全記録を抹消する)
6)携帯電話のカートゥーンをクリアする.                              
7)携帯電話の通信録をクリアする
8)全ての記録をクリアする
6.変更記録
(1)すべての連絡先が名前でリストされます
(2)名前を特定し,その名前の下にあるレコードの任意の形式の修正操作を行う.
(3)プログラムにおける修正に関するパターンは2つあります.
携帯電話の記録のいずれかを修正する
携帯電話カードに記録されているいずれかの情報を変更します.
 
7.照会記録
(1)名前を入力すると、携帯電話と携帯電話カードのすべての名前の記録が表示されます.
(2)内蔵位置決めアルゴリズムは二分ルックアップアルゴリズムであり,より高いクエリー速度を有する.
8.記録を表示
(1)「全展示」に分けて「携帯電話通信録」のみ、「携帯電話カートゥーン録」のみの3パターン
(2)メインメニューが表示されたら、5を押していつでも現在のデータベースの情報を表示できます.
(3)記録なしで表示可能であれば,ヒント情報を与える.
9.レコードのソートについて
多重マッピングの本質は赤と黒のツリーであり、キー値に従って自動的に整列するため、メモリに記録されるデフォルトはA->ž辞書順に並べられているので、手動で並べ替える必要はありません.ただし、非ASCIIコード文字については、自動的に記録の一番後ろに追加されます.ディクショナリ・シーケンスの二分アルゴリズムをスムーズに実行するために、ソート・ルールを手動で変更できる操作は設計されていません.
テストプログラム
本プログラムは提出前に各エッジテストに合格し、丈夫性が良好である.
27531841本の記録ではいずれも良好なアルゴリズム性能を示し,多重マッピングのツリー構造が通常の順序容器よりも優れていることを極めて示した.
 
(二)全体設計
1.構造階層の概括
本設計は合計1522行のコードです.
下位データ構造はSTLにおける多重マッピングによって実現される赤と黒のツリーであり,従来のシーケンスコンテナよりも種々のアルゴリズム性能が高い.
組織設計モデルはネットワークのOSIモデル思想を参考にして,下層から上層へのパッケージングを行った.
本設計は5つのファイルから構成される:5つのヘッダファイル(.H)と1つのプライマリソースファイル(.cpp)
合計3つのエンティティ構造階層が低から高にそれぞれ
エンティティ階層
(1)第1層:contact_per.h個人情報層.
このセクションには、次のものが含まれます.
Phone_contact_perとMobile_phone_contacts_per 2つのクラス
携帯電話とカードの中の一人の情報とその操作を保存します
(2)第2層:database.hデータベース層
このセクションには、次のものが含まれます.
DatabasePhoneとDatabaseSDの2つのデータベースクラス.
第1層は多重マッピング多重マッピングによってカプセル化される.
2つの連絡先データベースとその各種操作を格納します.
(3)第3層:oper.hユーザ操作層
このセクションには、ユーザー・クラス
第2層をカプセル化し、ユーザーレベルの各種操作を行う.
 
2つの平行インタラクティブレイヤ(最初の3つのレイヤに関連付けられています)
(1)menu.hディレクトリ層
このセクションには、次のものが含まれます.
最初の3つの階層の各種操作のディレクトリとヒント情報は、実行時に平行インタラクティブ層と実体構造階層で絶えずインタラクティブになります.ディレクトリを個別にカプセル化すると、コードがより合理的に見え、読みやすく、修正しやすく、エラーが発生しにくい.
(2)主ソースコード.cppインタフェース層
このセクションには、次のものが含まれます.
プログラム全体のエントリは,各種機能選択的ジャンプを実現する実装部分であり,スイッチ構造を用いて終了するとメインメニューに戻り,上位レベルに戻り,3つのオプションを終了して保存する.
2.構造体実現の詳細
階層1:contact_per.h個人情報層
携帯電話の単一ユーザークラス
class Phone_contact_per
{	
protected:
	string phone_number;//  ,    
public:
	string name;
	Phone_contact_per(string pname="NULL_name",string ptel="NULL_phone");   //            
    void set(string pname="NULL_name",string ptel="NULL_phone");	//  set         
	void modify();  //  modify  ,        
	friend istream &operator>>(istream &in,Phone_contact_per &per);  //  >>,<

携帯電話カード単体ユーザークラス
class Mobile_phone_contacts_per:public Phone_contact_per
{
protected:
	string home_address,qq_number;//      :  ,QQ 
public:
	Mobile_phone_contacts_per(string pname="NULL_name",string ptel="NULL_phone",string phome="NULL_home",string pqq="NULL_qq");
	void set(string pname="NULL_name",string ptel="NULL_phone",string phome="NULL_home",string pqq="NULL_qq");	//  set         
	void modify();  //  modify  ,        
	friend istream &operator>>(istream &in,Mobile_phone_contacts_per &per);  //  >>,<

 
第2層:database.hデータベース層
携帯電話データベースクラス
class DatabasePhone
{
private:
	unsigned long long int Phone_num;//                  
	multimap phone_contact;//     
public:
	DatabasePhone(){Phone_num=0;}
	inline bool check();//        
	void per_out(multimap::iterator &p);//        
	void add();
	void lookUp(string);
	unsigned long long int look_per_howmuch(string);//  SD         
	void del(multimap::iterator &p);
	void modify();
	friend class User;
};

携帯電話カードデータベース類
class DatabaseSD
{
private:
	unsigned long long int SD_num;
	multimap mobile_phone_contact;//SD    
public:
	DatabaseSD(){SD_num=0;}//    SD             
	inline bool check();//  SD     
	void per_out(multimap::iterator &p);//        
	void add();
	void del(multimap::iterator &p);
	void lookUp(string);
	unsigned long long int look_per_howmuch(string);//  SD         
	friend class User;
};

階層3:oper.hユーザ操作層
class User
{
private:
	DatabasePhone phone;//     
	DatabaseSD SDcard;//      
public:
	User();//        
	~User();//        
	Menu menu;//       
	void add();//    
	void look();//    
	void del();//    
	void modify();//    
	void display();//    
	void display_local();//      
	void store();//        
	//       
	void copyToPhone_per();//         
	void copyToPhone();//       
	void copyToSD_per();//        
	void copyToSD();//      
	void copyToSD_one();//         
	void copyToPhone_one();//        
	//       (       ,      )
	void moveToPhone_per();
	void moveToPhone();
	void moveToSD_per();
	void moveToSD();
	void moveToSD_one();
	void moveToPhone_one();
	void modifymax();//        
};

 
二、インタフェースの設計と各機能モジュールの実現
(一)インタフェースの設計
インタフェースデザインはすべてインタラクティブレイヤのメニュークラスに含まれており、具体的には以下のインタフェースが含まれています.
class Menu{  
public:  
    void description();  //      
    void mainmenu();     //   
	void addmenu();      //      
    void remove1menu();  //      
    void changemenu();   //      
    void displaymenu();  //      
    void lookmenu();     //      
    void displaymenu1(); //        
    void displaymenu2(); //        
	void Phone_contact_per_modify();         //        
	void Mobile_phone_contacts_per_modify(); //         
	void modify();      //       
	void copy();        //       
	void move();        //       
	void user_return(); //      
	void sd_read_success();//        
	void sd_read_fail();
	void sd_write_success();
	void sd_write_fail();
	void phone_read_success();
	void phone_read_fail();
	void phone_write_success();
	void phone_write_fail();
	void menumodifymax();//        
}menu;  

ページの問題は、メインメニューのみをリストし、実際の効果は自分で実行することをお勧めします.
 
(二)機能モジュール実現
エンティティ・オペレーション・レイヤ、上位(ユーザー・レイヤ)がマクロ・オペレーションを実行し、下位(データベース・レイヤ)が実際のオペレーションを実行します.
インタラクティブ・レイヤは、さまざまなヒントとプログラム・プロセスのジャンプを担当します.
コードファイルは付録に置いて、具体的な実現が必要で自分で調べることができます
四、使用説明とプログラミング体験
(一)使用説明
インタラクティブレイヤのプロンプト操作プログラムに従ってください.
(二)プログラミング体験
今回のカリキュラムは、自分が学んだ様々な知識を大きく統合し、多くの経験を蓄積しています.多重マッピングの使用をより熟知し,後日大型プログラムを書くための堅固な基礎を築いた.独立して本設計を完成させた後に達成感を得て、本当にプログラムを書く興味を感じました.
先生の普段の指導に感謝して、私に本設計のインスピレーションと知識能力を完成させました.
3日間1522行のコードで、疲れましたが、最終的に成果を出したときは本当に嬉しかったです.次のプロジェクトを楽しみにしています.(プロジェクトを書くのは計画法の試合よりずっと気持ちがいい)
完全なソースコード
エンティティ階層
(1)第1層:contact_per.h個人情報層.
/*
     :
Phone_contact_per Mobile_phone_contacts_per   
            
*/
#ifndef contact_per_h
#define contact_per_h
#include
#include
#include
#include
#include
#include
#include"menu.h"
using namespace std;
char choose='\0';
class Phone_contact_per
{	
protected:
	string phone_number;//  ,    
public:
	string name;
	Phone_contact_per(string pname="NULL_name",string ptel="NULL_phone");   //            
    void set(string pname="NULL_name",string ptel="NULL_phone");	//  set         
	void modify();  //  modify  ,        
	friend istream &operator>>(istream &in,Phone_contact_per &per);  //  >>,<>choose;
	switch (choose)
	{
		case '1':
				{
					cout<>t_name;
					name=t_name;
					cout<>t_num;
					phone_number=t_num;
					cout<>t_name;
					cin>>t_num;
					name=t_name;
					phone_number=t_num;
					cout<>(istream &in,Phone_contact_per &per)
{
	in>>per.name>>per.phone_number;
	return in;
}
ostream &operator<>(istream &in,Mobile_phone_contacts_per &per);  //  >>,<>choose;
	switch (choose)
	{
		case '1':
				{
					cout<>t_name;
					name=t_name;
					cout<>t_num;
					phone_number=t_num;
					cout<>t_address;
					home_address=t_address;
					cout<>t_qq;
					qq_number=t_qq;
					cout<>t_name>>t_tel>>t_addr>>t_qq;
					name=t_name;
					phone_number=t_tel;
					home_address=t_addr;
					qq_number=t_qq;
					cout<>(istream &in,Mobile_phone_contacts_per &per)
{
	in>>per.name>>per.phone_number>>per.home_address>>per.qq_number;
	return in;
}
ostream &operator<

 
(2)第2層:database.hデータベース層
#ifndef datebase_h
#define datebase_h
/*
	           
*/
long long unsigned int max_phone_capacity=200;//         
long long unsigned int max_SDcard_capacity=2000;//   SD     
class DatabasePhone
{
private:
	unsigned long long int Phone_num;//                  
	multimap phone_contact;//     
public:
	DatabasePhone(){Phone_num=0;}
	inline bool check();//        
	void per_out(multimap::iterator &p);//        
	void add();
	void lookUp(string);
	unsigned long long int look_per_howmuch(string);//  SD         
	void del(multimap::iterator &p);
	void modify();
	friend class User;
};
inline bool DatabasePhone::check()
{
		if(Phone_num>max_phone_capacity) 
		{
			cout<>temp;
			phone_contact.insert(pair(temp.name,temp));//        
			Phone_num++;
}
void DatabasePhone::del(multimap::iterator &p)
{
	phone_contact.erase(p);
	cout<::iterator look_itor_head,look_itor_foot;//       
	look_itor_head=phone_contact.equal_range(lookname).first;
	look_itor_foot=phone_contact.equal_range(lookname).second;
	if(look_itor_head==look_itor_foot)
	{
			cout<::iterator i=look_itor_head;i!=look_itor_foot;cout<second<::iterator look_itor_head,look_itor_foot;//       
	look_itor_head=phone_contact.lower_bound(lookname);
	look_itor_foot=phone_contact.upper_bound(lookname);
	return distance(look_itor_head,look_itor_foot);
}
void DatabasePhone::per_out(multimap::iterator &p)
	{
		cout<second.name<second.phone_number< mobile_phone_contact;//SD    
public:
	DatabaseSD(){SD_num=0;}//    SD             
	inline bool check();//  SD     
	void per_out(multimap::iterator &p);//        
	void add();
	void del(multimap::iterator &p);
	void lookUp(string);
	unsigned long long int look_per_howmuch(string);//  SD         
	friend class User;
};
inline bool DatabaseSD::check()
{
		if(SD_num>max_SDcard_capacity) 
		{
			cout<>temp;
			mobile_phone_contact.insert(pair(temp.name,temp));//        
			SD_num++;
}
void DatabaseSD::del(multimap::iterator &p)
{
	mobile_phone_contact.erase(p);
	cout<::iterator look_itor_head,look_itor_foot;//       
	look_itor_head=mobile_phone_contact.lower_bound(lookname);
	look_itor_foot=mobile_phone_contact.upper_bound(lookname);
	if(look_itor_head==look_itor_foot)
	{
			cout<::iterator i=look_itor_head;i!=look_itor_foot;cout<second<::iterator look_itor_head,look_itor_foot;//        
	look_itor_head=mobile_phone_contact.lower_bound(lookname);
	look_itor_foot=mobile_phone_contact.upper_bound(lookname);
	return distance(look_itor_head,look_itor_foot);
}
void DatabaseSD::per_out(multimap::iterator &p)
	{
		cout<second.name<second.phone_number<second.home_address<second.qq_number<

(3)第3層:oper.hユーザ操作層
/*
	            
*/
#include"contact_per.h"
#include"menu.h"
#include"database.h"
#include
using namespace std;
class User
{
private:
	DatabasePhone phone;//     
	DatabaseSD SDcard;//      
public:
	User();//        
	~User();//        
	Menu menu;//       
	void add();//    
	void look();//    
	void del();//    
	void modify();//    
	void display();//    
	void display_local();//      
	void store();//        
	//       
	void copyToPhone_per();//         
	void copyToPhone();//       
	void copyToSD_per();//        
	void copyToSD();//      
	void copyToSD_one();//         
	void copyToPhone_one();//        
	//       (       ,      )
	void moveToPhone_per();
	void moveToPhone();
	void moveToSD_per();
	void moveToSD();
	void moveToSD_one();
	void moveToPhone_one();
	void modifymax();//        
};
User::User()
{
	fstream phone_read("phone_contact",ios::in);
	if(phone_read)
			menu.phone_read_success();
	else {menu.phone_read_fail();return;}
	Phone_contact_per temp_phone;
	phone_read>>temp_phone.name>>temp_phone.phone_number;
	while(!phone_read.eof())
	{
		phone_read>>temp_phone.name>>temp_phone.phone_number;
		phone.phone_contact.insert(pair(temp_phone.name,temp_phone));
		phone.Phone_num++;
	}
	

	fstream SD_read("SD_contact",ios::in);
	if(SD_read) menu.sd_read_success();
	else {menu.sd_read_fail();return;}
	Mobile_phone_contacts_per temp;
	SD_read>>temp.name>>temp.phone_number>>temp.home_address>>temp.qq_number;
	while(!SD_read.eof())
	{
		SD_read>>temp.name>>temp.phone_number>>temp.home_address>>temp.qq_number;
		SDcard.mobile_phone_contact.insert(pair(temp.name,temp));
		SDcard.SD_num++;
	}
	
	SD_read.close();
	display_local();
	
}
User::~User()
{
    ofstream phone_write("phone_contact");
	multimap::iterator itor_phone_head=phone.phone_contact.begin(),itor_foot_phone=phone.phone_contact.end();
	for(;itor_phone_head!=itor_foot_phone;itor_phone_head++)
	{
		if(itor_phone_head->second.name=="NULL_name") continue;
		phone_write<second.name<second.phone_number<::iterator itor_head_sd=SDcard.mobile_phone_contact.begin(),itor_foot_sd=SDcard.mobile_phone_contact.end();
	for(;itor_head_sd!=itor_foot_sd;itor_head_sd++)
	{
		if(itor_head_sd->second.name=="NULL_name") continue;
		SD_write<second.name<second.phone_number<second.home_address<second.qq_number<>tem;
		if(tem=='1')
		{
			phone.add();
			if(phone.check())
			{
				cout<>tem;
				if(tem=='Y'||tem=='y') break;
				else if(tem=='N'||tem=='n') return;
				cout<>ask_name;
	phone.lookUp(ask_name);
	SDcard.lookUp(ask_name);
}
void User::del()
{
	menu.remove1menu();
	cin>>choose;
	multimap::iterator Phone_itor=phone.phone_contact.begin();
			menu.displaymenu1();
			if(!distance(phone.phone_contact.begin(),phone.phone_contact.end()))
				cout<::iterator SDitor=SDcard.mobile_phone_contact.begin();
			menu.displaymenu2();
			for(;SDitor!=SDcard.mobile_phone_contact.end();SDcard.per_out(SDitor),SDitor++);
			if(!distance(SDcard.mobile_phone_contact.begin(),SDcard.mobile_phone_contact.end()))
				cout<>movename;
			phone.phone_contact.erase(movename);
			phone.Phone_num-=phone.look_per_howmuch(movename);
			cout<>movename;
			SDcard.mobile_phone_contact.erase(movename);
			SDcard.SD_num-=SDcard.look_per_howmuch(movename);
			cout<>movename;
			cout<::iterator Phone_itor=phone.phone_contact.equal_range(movename).first,p=Phone_itor,endit=phone.phone_contact.equal_range(movename).second;
			if(!distance(Phone_itor,endit))
			{
				cout<>num;
			for(int i=1;i>movename;
			cout<::iterator SD_itor=SDcard.mobile_phone_contact.equal_range(movename).first,p=SD_itor,endit=SDcard.mobile_phone_contact.equal_range(movename).second;
			if(!distance(SD_itor,endit))
			{
				cout<>num;
			for(int i=1;i>movename;
			phone.phone_contact.erase(movename);
			phone.Phone_num-=phone.look_per_howmuch(movename);
			SDcard.mobile_phone_contact.erase(movename);
			SDcard.SD_num-=SDcard.look_per_howmuch(movename);
			cout<::iterator Phone_itor=phone.phone_contact.begin();
			menu.displaymenu1();
			if(!distance(phone.phone_contact.begin(),phone.phone_contact.end()))
				cout<::iterator SDitor=SDcard.mobile_phone_contact.begin();
			menu.displaymenu2();
			for(;SDitor!=SDcard.mobile_phone_contact.end();SDcard.per_out(SDitor),SDitor++);
			if(!distance(SDcard.mobile_phone_contact.begin(),SDcard.mobile_phone_contact.end()))
				cout<>name;
	phone.lookUp(name);
	SDcard.lookUp(name);
	menu.changemenu();
	cin>>choose;
	if(choose=='1')
	{
		cout<>num;
		multimap::iterator p=phone.phone_contact.equal_range(name).first;
			for(int i=1;isecond.modify();
	}else if(choose=='2')
	{
		cout<>num;
		multimap::iterator p=SDcard.mobile_phone_contact.equal_range(name).first;
		for(int i=1;isecond.modify();
	}
	else return;
}
void User::store()
{
	fstream phone_write("phone_contact",ios::out,ios::trunc);
	multimap::iterator itor_phone_head=phone.phone_contact.begin(),itor_foot_phone=phone.phone_contact.end();
	for(;itor_phone_head!=itor_foot_phone;itor_phone_head++)
		phone_write<second.name<second.phone_number<::iterator itor_head_sd=SDcard.mobile_phone_contact.begin(),itor_foot_sd=SDcard.mobile_phone_contact.end();
	for(;itor_head_sd!=itor_foot_sd;itor_head_sd++)
		SD_write<second.name<second.phone_number<second.home_address<second.qq_number<>copyname;
	multimap::iterator itor_head=SDcard.mobile_phone_contact.begin(),itor_foot=SDcard.mobile_phone_contact.end();
	Phone_contact_per temp;
	if(!phone.look_per_howmuch(itor_head->first)) 
	{
		if(phone.Phone_num>max_phone_capacity) 
		{
			cout<first;
		temp.phone_number=itor_head->second.phone_number;
		while(itor_head!=itor_foot)
		{
			phone.phone_contact.insert(pair(temp.name,temp));
			phone.Phone_num++;
		}
	}
	cout<::iterator itor_head=SDcard.mobile_phone_contact.begin(),itor_foot=SDcard.mobile_phone_contact.end();
	Phone_contact_per temp;
	if(!phone.look_per_howmuch(itor_head->first)) 
	{
		if(phone.Phone_num>max_phone_capacity) 
		{
			cout<first;
		temp.phone_number=itor_head->second.phone_number;
		phone.phone_contact.insert(pair(temp.name,temp));
		phone.Phone_num++;
	}
	cout<>copyname;
	multimap::iterator itor_head=phone.phone_contact.equal_range(copyname).first,itor_foot=phone.phone_contact.equal_range(copyname).second;
	Mobile_phone_contacts_per temp;
	if(!SDcard.look_per_howmuch(itor_head->first)) 
	{
		if(SDcard.SD_num>max_SDcard_capacity) 
		{
			cout<first;
		temp.phone_number=itor_head->second.phone_number;
		temp.home_address="             ";
		temp.qq_number="       QQ     ";
		while(itor_head!=itor_foot)
		{
			SDcard.mobile_phone_contact.insert(pair(temp.name,temp));
			SDcard.SD_num++;
			phone.phone_contact.erase(itor_head);
			phone.Phone_num--;
			itor_head=phone.phone_contact.equal_range(copyname).first,itor_foot=phone.phone_contact.equal_range(copyname).second;
		}
	}
	cout<::iterator itor_head=phone.phone_contact.begin(),itor_foot=phone.phone_contact.end();
	Mobile_phone_contacts_per temp;
	if(!SDcard.look_per_howmuch(itor_head->first)) 
	{
		if(SDcard.SD_num>max_SDcard_capacity) 
		{
			cout<first;
		temp.phone_number=itor_head->second.phone_number;
		temp.home_address="             ";
		temp.qq_number="       QQ     ";
		SDcard.mobile_phone_contact.insert(pair(temp.name,temp));
		SDcard.SD_num++;
	}
	cout<>copyname;
		cout<::iterator Phone_itor=phone.phone_contact.equal_range(copyname).first,p=Phone_itor,endit=phone.phone_contact.equal_range(copyname).second;
		if(!distance(Phone_itor,endit))
		{
			cout<>num;
		for(int i=1;isecond.name;
		temp.phone_number=p->second.phone_number;
		temp.home_address="             ";
		temp.qq_number="             ";
		SDcard.mobile_phone_contact.insert(pair(temp.name,temp));
		SDcard.SD_num++;
		cout<>copyname;
		cout<::iterator sdc_itor=SDcard.mobile_phone_contact.equal_range(copyname).first,p=sdc_itor,endit=SDcard.mobile_phone_contact.equal_range(copyname).second;
		if(!distance(sdc_itor,endit))
		{
			cout<>num;
		for(int i=1;isecond.name;
		temp.phone_number=p->second.phone_number;
		phone.phone_contact.insert(pair(temp.name,temp));
		phone.Phone_num++;
		cout<::iterator itor_head=SDcard.mobile_phone_contact.begin(),itor_foot=SDcard.mobile_phone_contact.end();
	Phone_contact_per temp;
	if(!phone.look_per_howmuch(itor_head->first)) 
	{
		if(phone.Phone_num>max_phone_capacity) 
		{
			cout<first;
		temp.phone_number=itor_head->second.phone_number;
		phone.phone_contact.insert(pair(temp.name,temp));
		phone.Phone_num++;
	}
	cout<>movename;
	multimap::iterator itor_head=SDcard.mobile_phone_contact.begin(),itor_foot=SDcard.mobile_phone_contact.end();
	Phone_contact_per temp;
	if(!phone.look_per_howmuch(itor_head->first)) 
	{
		if(phone.Phone_num>max_phone_capacity) 
		{
			cout<first;
		temp.phone_number=itor_head->second.phone_number;
		while(itor_head!=itor_foot)
		{
			phone.phone_contact.insert(pair(temp.name,temp));
			phone.Phone_num++;
			SDcard.mobile_phone_contact.erase(itor_head);
			phone.Phone_num--;
			itor_head=SDcard.mobile_phone_contact.equal_range(movename).first,itor_foot=SDcard.mobile_phone_contact.equal_range(movename).second;
		}
	}
	cout<>movename;
	multimap::iterator itor_head=phone.phone_contact.equal_range(movename).first,itor_foot=phone.phone_contact.equal_range(movename).second;
	Mobile_phone_contacts_per temp;
	if(!SDcard.look_per_howmuch(itor_head->first)) 
	{
		if(SDcard.SD_num>max_SDcard_capacity) 
		{
			cout<first;
		temp.phone_number=itor_head->second.phone_number;
		temp.home_address="             ";
		temp.qq_number="       QQ     ";
		while(itor_head!=itor_foot)
		{
			SDcard.mobile_phone_contact.insert(pair(temp.name,temp));
			SDcard.SD_num++;
			phone.phone_contact.erase(itor_head);
			phone.Phone_num--;
			itor_head=phone.phone_contact.equal_range(movename).first,itor_foot=phone.phone_contact.equal_range(movename).second;
		}
	}
	cout<>movename;
		cout<::iterator Phone_itor=phone.phone_contact.equal_range(movename).first,p=Phone_itor,endit=phone.phone_contact.equal_range(movename).second;
		if(!distance(Phone_itor,endit))
		{
			cout<>num;
		for(int i=1;isecond.name;
		temp.phone_number=p->second.phone_number;
		temp.home_address="             ";
		temp.qq_number="             ";
			SDcard.mobile_phone_contact.insert(pair(temp.name,temp));
			SDcard.SD_num++;
			phone.phone_contact.erase(p);
			phone.Phone_num--;
		cout<>movename;
		cout<::iterator sdc_itor=SDcard.mobile_phone_contact.equal_range(movename).first,p=sdc_itor,endit=SDcard.mobile_phone_contact.equal_range(movename).second;
		if(!distance(sdc_itor,endit))
		{
			cout<>num;
		for(int i=1;isecond.name;
		temp.phone_number=p->second.phone_number;
		phone.phone_contact.insert(pair(temp.name,temp));
		phone.Phone_num++;
		SDcard.mobile_phone_contact.erase(p);
		SDcard.SD_num--;
		cout<::iterator itor_head=phone.phone_contact.begin(),itor_foot=phone.phone_contact.end();
	Mobile_phone_contacts_per temp;
	if(!SDcard.look_per_howmuch(itor_head->first)) 
	{
		if(SDcard.SD_num>max_SDcard_capacity) 
		{
			cout<first;
		temp.phone_number=itor_head->second.phone_number;
		temp.home_address="             ";
		temp.qq_number="       QQ     ";
		SDcard.mobile_phone_contact.insert(pair(temp.name,temp));
		SDcard.SD_num++;
	}
	cout<>tem;
		if(tem=='1')
		{
			multimap::iterator Phone_itor=phone.phone_contact.begin();
			menu.displaymenu1();
			if(!distance(phone.phone_contact.begin(),phone.phone_contact.end()))
				cout<::iterator SDitor=SDcard.mobile_phone_contact.begin();
			menu.displaymenu2();
			for(;SDitor!=SDcard.mobile_phone_contact.end();SDcard.per_out(SDitor),SDitor++);
			if(!distance(SDcard.mobile_phone_contact.begin(),SDcard.mobile_phone_contact.end()))
				cout<::iterator Phone_itor=phone.phone_contact.begin();
			if(!distance(phone.phone_contact.begin(),phone.phone_contact.end()))
			{
				cout<::iterator SDitor=SDcard.mobile_phone_contact.begin();
			if(!distance(SDcard.mobile_phone_contact.begin(),SDcard.mobile_phone_contact.end()))
			{
				cout<>tem;
				if(tem=='Y'||tem=='y') break;
				else if(tem=='N'||tem=='n') return;
				cout<>s;
		if(s=='Y'||s=='y')
		{
			multimap::iterator Phone_itor=phone.phone_contact.begin();
				menu.displaymenu1();
				if(!distance(phone.phone_contact.begin(),phone.phone_contact.end()))
					cout<::iterator SDitor=SDcard.mobile_phone_contact.begin();
				menu.displaymenu2();
				for(;SDitor!=SDcard.mobile_phone_contact.end();SDcard.per_out(SDitor),SDitor++);
				if(!distance(SDcard.mobile_phone_contact.begin(),SDcard.mobile_phone_contact.end()))
					cout<>s;
		system("cls");
		return;
	}
void User::modifymax()
{
	char temp;
	menu.menumodifymax();
	cin>>temp;
	if(temp=='1')
	{
		cout<>max_phone_capacity;
		cout<>max_SDcard_capacity;
		cout<>max_phone_capacity>>max_SDcard_capacity;
		cout<

2つの平行インタラクティブレイヤ(最初の3つのレイヤに関連付けられています)
(1)menu.hディレクトリレイヤ(wordフォーマットが制限されているため、実際のディレクトリ表示は実物基準)
#ifndef menu_h
#define menu_h
/*
	       
*/
#include"contact_per.h"
#include  
#include
#include
#include
using namespace std;  
char return_choice;
char answer;
class Menu{  
public:  
    void description();  //      
    void mainmenu();     //   
	void addmenu();      //      
    void remove1menu();  //      
    void changemenu();   //      
    void displaymenu();  //      
    void lookmenu();     //      
    void displaymenu1(); //        
    void displaymenu2(); //        
	void Phone_contact_per_modify();         //        
	void Mobile_phone_contacts_per_modify(); //         
	void modify();      //       
	void copy();        //       
	void move();        //       
	void user_return(); //      
	void sd_read_success();//        
	void sd_read_fail();
	void sd_write_success();
	void sd_write_fail();
	void phone_read_success();
	void phone_read_fail();
	void phone_write_success();
	void phone_write_fail();
	void menumodifymax();//        
}menu;  
void Menu::description()
{
	system("color F1");
		cout<";  
}  
void Menu::addmenu()  
{  
    cout<";  
}  
void Menu::remove1menu()  
{  
    cout<"<";  
} 
void Menu::move()  
{  
    cout<";  
} 
void Menu::changemenu()  
{  
    cout<";  
}  
void Menu::lookmenu()  
{  
    cout<";  
}  
void Menu::displaymenu()  
{  
   cout<";  
}  
void Menu::displaymenu1()  
{  
    cout<";   
	}
void Menu::menumodifymax()
	{
	cout<"; 
	}
void Menu::Phone_contact_per_modify()
	{
	cout<";   
	}
void Menu::Mobile_phone_contacts_per_modify()
	{
	cout<";  
	}
void Menu::user_return()
    {
    cout<

 
(2)主ソースコード.cppインタフェース層
#include"contact_per.h"
#include"menu.h"
#include"oper.h"
#include"database.h"
int main()
{
	menu.description();
	User yuheng;
	char choosee;
	mainmenu://     
	yuheng.menu.mainmenu();
	mainmenu1:
		while(true)
		{
			cin>>choosee;
			while(true)//     
			{
				lastmenu:
					switch (choosee)
					{
						case '0':
							return 0;
						case '1':
							yuheng.add();
							menu.user_return();
							cin>>return_choice;
							switch(return_choice)
							{
								case'1':yuheng.store();goto mainmenu;//     
								case'2':goto lastmenu;//       
								case'3':return 0;//    
								default:
									{
										cout<>return_choice;
							switch(return_choice)
							{
							    case'1':yuheng.store();goto mainmenu;//     
								case'2':goto lastmenu;//       
								case'3':return 0;//    
								default:
									{
										cout<>return_choice;
							switch(return_choice)
							{
							    case'1':yuheng.store();goto mainmenu;//     
								case'2':goto lastmenu;//       
								case'3':return 0;//    
								default:
									{
										cout<>return_choice;
							switch(return_choice)
							{
							    case'1':yuheng.store();goto mainmenu;//     
								case'2':goto lastmenu;//       
								case'3':return 0;//    
								default:
									{
										cout<>return_choice;
							switch(return_choice)
							{
							    case'1':yuheng.store();goto mainmenu;//     
								case'2':goto lastmenu;//       
								case'3':return 0;//    
								default:
									{
										cout<>answer;
							switch(answer)
							{
							case'1':yuheng.copyToSD_one();break;
							case'2':yuheng.copyToPhone_one();break;
							case'3':yuheng.copyToSD_one();break;
							case'4':yuheng.copyToPhone_one();break;
							case'5':yuheng.copyToSD();break;
							case'6':yuheng.copyToPhone();break;
								default:
									{
										cout<>return_choice;
							switch(return_choice)
							{
							    case'1':yuheng.store();goto mainmenu;//     
								case'2':goto lastmenu;//       
								case'3':return 0;//    
								default:
									{
										cout<>answer;
							switch(answer)
							{
								case'1':yuheng.moveToSD_one();break;
								case'2':yuheng.moveToPhone_one();break;
								case'3':yuheng.moveToSD_per();break;
								case'4':yuheng.moveToPhone_per();break;
								case'5':yuheng.moveToSD();break;
								case'6':yuheng.moveToPhone();break;
								default:
									{
										cout<>return_choice;
							switch(return_choice)
							{
							    case'1':yuheng.store();goto mainmenu;//     
								case'2':goto lastmenu;//       
								case'3':return 0;//    
								default:
									{
										cout<>return_choice;
								switch(return_choice)
								{
									case'1':yuheng.store();goto mainmenu;//     
									case'2':goto lastmenu;//       
									case'3':return 0;//    
									default:
										{
											cout<

参考文献
「C++STL標準テンプレートライブラリ」
コンピュータネットワーク