C++コースデザインの主な宿題、追加、削除、確認、変更機能を備えた簡単なアドレス帳をデザインする

このコードは、連絡先を追加、表示、削除、検索、変更、クリアできる単純なアドレス帳プログラムです。以下に、コードの 1 行ごとの説明と概要を示します。

  1. Personまず、名前、性別、年齢、電話番号、住所などの連絡先の情報を表す という名前の構造体が定義されます。

  2. Addressbooks次に、アドレス帳を管理するためのclassというクラスを定義します。このクラスには、連絡先情報を保存するために使用されるpersonArrayという名前のコンテナが含まれていますvector

  3. このクラスではAddressbooks、さまざまな機能を実現するために一連のメンバー関数が定義されています。

    • showMenu()この関数は、メニュー オプションを表示し、ユーザーに実行可能な操作を促すために使用されます。
    • addPerson()連絡先を追加するには関数を使用します。次に、ユーザー入力から連絡先の名前、性別、年齢、電話番号、住所を取得し、連絡先をコンテナに追加しますpersonArray
    • showPerson()連絡先を表示する機能です。personArrayコンテナー内の各連絡先を反復処理し、名前、性別、年齢、電話番号、住所を出力します。
    • deletePerson()連絡先を削除する機能です。personArrayユーザーは、削除する連絡先の名前を入力し、コンテナ内でその連絡先を探し、見つかった場合は削除するように求められます。
    • findPerson()連絡先を検索する機能。ユーザーは、探している連絡先の名前を入力し、personArrayコンテナ内でその連絡先を探し、見つかった場合は詳細を出力するように求められます。
    • modifyPerson()連絡先情報を変更する機能です。変更する連絡先の名前を入力するようユーザーに求め、personArrayコンテナ内で連絡先を探し、見つかった場合はユーザーが名前、性別、年齢、電話番号、住所を変更できるようにします。
    • cleanPerson()この関数は、アドレス帳をクリアする、つまりすべての連絡先を削除するために使用されます。
  4. この関数では、オブジェクトmain()が作成され、無限ループを通じてユーザーが選択できるメニュー オプションが表示されます。ユーザーの選択に従って、対応するクラスのメンバー関数が呼び出され、対応する操作が実行されます。ユーザーがアドレス帳の終了を選択するまで、プログラムは終了します。AddressbooksaddressbooksAddressbooks

全体として、このコードは、連絡先情報を簡単に追加、表示、削除、検索、変更、クリアできるシンプルなアドレス帳管理システムを実装しています。オブジェクト指向設計の使用により、連絡先情報がクラスにカプセル化され、アドレス帳を管理するための一連の操作関数が提供されます。コードは明確に構造化されており、理解や拡張が簡単です。

コードを最適化するときは、次の点を考慮してください。

  1. より適切なデータ構造を使用する: 現在のコードでは配列を使用して連絡先情報を保存しますが、連絡先を挿入および削除するときに配列の要素を移動する必要があり、非効率的です。挿入と削除の効率を向上させるために、動的配列 (std::vector など) またはリンク リスト (LinkedList) を使用して連絡先を保存することを検討できます。

  2. 繰り返しコードの削減: 現在のコードでは、一部の機能 (名前、性別、年齢、電話番号、住所の入力など) に複数の機能で繰り返しコードが含まれています。これらの共通コードを抽出して独立した機能として再利用することで、作業の重複やコードの冗長性を削減できます。

  3. エラー処理メカニズムの導入: 現在のコードは、入力データに対してエラー処理を実行しません。たとえば、不正な性別値や年齢値が入力された場合、プログラムはエラー メッセージを表示しません。適切なエラー処理メカニズムを追加して、ユーザーに正しいデータを入力し、適切なフォールト トレランスを実行することを思い出させることができます。

  4. 検索機能の最適化: 現在のコードで連絡先を検索する方法は、アドレス帳の配列全体を走査することですが、アドレス帳に連絡先が多数ある場合は効率が低くなります。HashMap や Binary Search Tree などのデータ構造を使用して検索機能を最適化し、検索効率を向上させることを検討できます。

  5. 関数パラメータを使用して構造体オブジェクトを渡す: 現在のコードでは、各関数は Addressbooks オブジェクトのポインタをパラメータとして渡す必要があります。Addressbooks オブジェクトをパラメータとして関数に渡すことを検討して、グローバル変数の使用を回避し、コードの可読性と保守性を高めます。

以下は、上記の最適化ポイントに従ってコードを改善する例です。

#include<iostream>
#include<string>
#include<vector>

using namespace std;

// 联系人结构体
struct Person
{
	string m_Name; // 姓名
	int m_Sex; // 性别:1男 2女
	int m_Age; // 年龄
	string m_Phone; // 电话
	string m_Addr; // 住址
};

// 通讯录类
class Addressbooks
{
private:
	vector<Person> personArray; // 通讯录中保存的联系人数组

public:
	// 添加联系人
	void addPerson();

	// 显示联系人
	void showPerson();

	// 删除联系人
	void deletePerson();

	// 查找联系人
	void findPerson();

	// 修改联系人
	void modifyPerson();

	// 清空联系人
	void cleanPerson();
};

// 菜单界面
void showMenu()
{
	cout << "***************************" << endl;
	cout << "*****  1、添加联系人  *****" << endl;
	cout << "*****  2、显示联系人  *****" << endl;
	cout << "*****  3、删除联系人  *****" << endl;
	cout << "*****  4、查找联系人  *****" << endl;
	cout << "*****  5、修改联系人  *****" << endl;
	cout << "*****  6、清空联系人  *****" << endl;
	cout << "*****  0、退出通讯录  *****" << endl;
	cout << "***************************" << endl;
}

// 添加联系人
void Addressbooks::addPerson()
{
	Person person;
	cout << "请输入姓名:" << endl;
	cin >> person.m_Name;
	cout << "请输入性别:(1男 2女)" << endl;
	cin >> person.m_Sex;
	cout << "请输入年龄:" << endl;
	cin >> person.m_Age;
	cout << "请输入电话:" << endl;
	cin >> person.m_Phone;
	cout << "请输入住址:" << endl;
	cin >> person.m_Addr;
	personArray.push_back(person);
	cout << "联系人添加成功!" << endl;
}

// 显示联系人
void Addressbooks::showPerson()
{
	if (personArray.empty())
	{
		cout << "通讯录为空!" << endl;
		return;
	}
	for (const auto& person : personArray)
	{
		cout << "姓名:" << person.m_Name << "\t";
		cout << "性别:" << (person.m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄:" << person.m_Age << "\t";
		cout << "电话:" << person.m_Phone << "\t";
		cout << "住址:" << person.m_Addr << endl;
	}
}

// 删除联系人
void Addressbooks::deletePerson()
{
	if (personArray.empty())
	{
		cout << "通讯录为空!" << endl;
		return;
	}
	string name;
	cout << "请输入要删除的联系人姓名:" << endl;
	cin >> name;
	for (auto it = personArray.begin(); it != personArray.end(); ++it)
	{
		if (it->m_Name == name)
		{
			personArray.erase(it);
			cout << "联系人删除成功!" << endl;
			return;
		}
	}
	cout << "未找到该联系人!" << endl;
}

// 查找联系人
void Addressbooks::findPerson()
{
	if (personArray.empty())
	{
		cout << "通讯录为空!" << endl;
		return;
	}
	string name;
	cout << "请输入要查找的联系人姓名:" << endl;
	cin >> name;
	for (const auto& person : personArray)
	{
		if (person.m_Name == name)
		{
			cout << "姓名:" << person.m_Name << "\t";
			cout << "性别:" << (person.m_Sex == 1 ? "男" : "女") << "\t";
			cout << "年龄:" << person.m_Age << "\t";
			cout << "电话:" << person.m_Phone << "\t";
			cout << "住址:" << person.m_Addr << endl;
			return;
		}
	}
	cout << "未找到该联系人!" << endl;
}

// 修改联系人
void Addressbooks::modifyPerson()
{
	if (personArray.empty())
	{
		cout << "通讯录为空!" << endl;
		return;
	}
	string name;
	cout << "请输入要修改的联系人姓名:" << endl;
	cin >> name;
	for (auto& person : personArray)
	{
		if (person.m_Name == name)
		{
			cout << "请输入姓名:" << endl;
			cin >> person.m_Name;
			cout << "请输入性别:(1男 2女)" << endl;
			cin >> person.m_Sex;
			cout << "请输入年龄:" << endl;
			cin >> person.m_Age;
			cout << "请输入电话:" << endl;
			cin >> person.m_Phone;
			cout << "请输入住址:" << endl;
			cin >> person.m_Addr;
			cout << "联系人修改成功!" << endl;
			return;
		}
	}
	cout << "未找到该联系人!" << endl;
}

// 清空联系人
void Addressbooks::cleanPerson()
{
	personArray.clear();
	cout << "通讯录已清空!" << endl;
}

int main()
{
	Addressbooks addressbooks;
	int select = 0;
	while (true)
	{
		showMenu();
		cin >> select;
		switch (select)
		{
		case 1: // 添加联系人
			addressbooks.addPerson();
			break;
		case 2: // 显示联系人
			addressbooks.showPerson();
			break;
		case 3: // 删除联系人
			addressbooks.deletePerson();
			break;
		case 4: // 查找联系人
			addressbooks.findPerson();
			break;
		case 5: // 修改联系人
			addressbooks.modifyPerson();
			break;
		case 6: // 清空联系人
			addressbooks.cleanPerson();
			break;
		case 0: // 退出通讯录
			cout << "欢迎下次使用!" << endl;
			return 0;
		default:
			cout << "输入有误,请重新输入!" << endl;
			break;
		}
	}

	return 0;
}

おすすめ

転載: blog.csdn.net/dsafefvf/article/details/131488704