最近在复习C语言,写了一个简单的通讯录管理系统,最后会附上全部源码。
知识点:
- 结构体
- 结构体指针
- 数组的基本操作
- 数组的增删改查
0、功能展示
主界面展示
界面如下,打开会提示输入0添加联系人,输入1查找联系人,输入2删除联系人,输入3列出所有联系人(我知道界面很丑,不要打我)
功能一:添加联系人
按照提示输入新联系人姓名、性别、年龄、手机号即可创建新联系人。
功能二: 查找联系人
输入你想查找的姓名即会输出此人的所有信息,如果查无此人则会输出"Nothing Found!"。
功能三:删除联系人
输入你想删除的名字即可删除联系人,因为删除联系人这里调用了查找联系人的代码,所以会重复弹一条提示出来。
功能四:列出所有联系人
1、初始化结构体数组
一个联系人由四个成员组成,分别是姓名、性别、年龄、电话号码。
struct Contacts { // 定义联系人结构体
string name;
string sex;
int age;
string phone;
};
联系人的初始化如下,用遍历的方法将整个联系人结构体数组初始化,对每个成员赋初值
void initContacts(Contacts* c) { // 初始化联系人结构体
for (int i = 0; i < 99; i++) c[i] = { "NULL", "NULL", 0, "NULL" };
}
2、添加联系人功能实现
这一部分很简单,首先cin输入各种数据,然后用传地址的方式直接修改原始结构体数组中的数据,你如果熟悉函数的两种传参方法就不会太难。
void addContact(struct Contacts *c, int num) { // 定义增加联系人函数,将输入的信息填入num下标的联系人中
cout << "Please Enter Name" << endl;
string name;
cin >> name;
c->name = name;
cout << "Please Enter Sex" << endl;
string sex;
cin >> sex;
c->sex = sex;
cout << "Please Enter Age" << endl;
int age;
cin >> age;
c->age = age;
cout << "Please Enter Phone Number" << endl;
string phone;
cin >> phone;
c->phone = phone;
}
3、查找联系人功能实现
遍历所有联系人,用名称匹配
int searchContacts(Contacts* c) { // 搜索联系人,遍历所有联系人
cout << "Please enter the name you want to search" << endl;
string name;
cin >> name;
for (int i = 0; i < lengthOfContacts(c); i++)
{
if (c[i].name == name) {
return i;
break;
}
}
cout << "Nothing found" << endl;
return -1;
}
4、删除联系人功能实现
首先使用查找功能找到目标,再对目标下标后的所有元素前移一位来覆盖目标,达到删除的效果,最后将数组最后一位初始化。
void deleteContacts(Contacts* c) { // 删除联系人,遍历所有联系人后找到目标,将其后的元素全部前移一位,再将最后一位还原为空
cout << "Please enter the name you want to delete" << endl;
int deleteNum = searchContacts(c);
for (int i = deleteNum; i < 98; i++) c[i] = c[i + 1];
c[99] = { "NULL", "NULL", 0, "NULL" };
}
5、列出所有联系人功能实现
直接遍历所有有效的联系人下标
void listAllContacts(Contacts* c) { // 输出所有联系人
for (int i = 0; i < lengthOfContacts(c); i++) {
cout << "Index is " << i;
cout << " Name is " << c[i].name;
cout << " Age is " << c[i].age;
cout << " Number is " << c[i].phone << endl;
}
}
6、判断联系人是否有效
因为在初始化联系人时已经将所有联系人设为{"NULL", "NULL", 0, "NULL"},所以判断联系人是否有效使用的方法是判断联系人某成员是否为初始值。
这段代码就是用了这种方法,去遍历每一个成员,最后返回的值即是有效联系人的数量。
有人可能会问,如果有效的联系人在数组中不连续该怎么办呢?其实根本不会出现这种情况,因为删除联系人函数的操作就已经杜绝了这种情况的出现。
int lengthOfContacts(Contacts* c) { // 返回有效长度,即最后一个电话号非NULL的下标
int t = 0;
while (c[t].phone != "NULL") t++;
return t;
}
7、完整代码
粘贴到任意编辑器中编译即可运行
#include<iostream>
#include<stdio.h>
using namespace std;
struct Contacts { // 定义联系人结构体
string name;
string sex;
int age;
string phone;
};
void addContact(struct Contacts *c, int num) { // 定义增加联系人函数,将输入的信息填入num下标的联系人中
cout << "Please Enter Name" << endl;
string name;
cin >> name;
c->name = name;
cout << "Please Enter Sex" << endl;
string sex;
cin >> sex;
c->sex = sex;
cout << "Please Enter Age" << endl;
int age;
cin >> age;
c->age = age;
cout << "Please Enter Phone Number" << endl;
string phone;
cin >> phone;
c->phone = phone;
}
void initContacts(Contacts* c) { // 初始化联系人结构体
for (int i = 0; i < 99; i++) c[i] = { "NULL", "NULL", 0, "NULL" };
}
int lengthOfContacts(Contacts* c) { // 返回有效长度,即最后一个电话号非NULL的下标
int t = 0;
while (c[t].phone != "NULL") t++;
return t;
}
int searchContacts(Contacts* c) { // 搜索联系人,遍历所有联系人
cout << "Please enter the name you want to search" << endl;
string name;
cin >> name;
for (int i = 0; i < lengthOfContacts(c); i++)
{
if (c[i].name == name) {
return i;
break;
}
}
cout << "Nothing found" << endl;
return -1;
}
void deleteContacts(Contacts* c) { // 删除联系人,遍历所有联系人后找到目标,将其后的元素全部前移一位,再将最后一位还原为空
cout << "Please enter the name you want to delete" << endl;
int deleteNum = searchContacts(c);
for (int i = deleteNum; i < 98; i++) c[i] = c[i + 1];
c[99] = { "NULL", "NULL", 0, "NULL" };
}
void listAllContacts(Contacts* c) { // 输出所有联系人
for (int i = 0; i < lengthOfContacts(c); i++) {
cout << "Index is " << i;
cout << " Name is " << c[i].name;
cout << " Age is " << c[i].age;
cout << " Number is " << c[i].phone << endl;
}
}
int main() {
Contacts c[100];
initContacts(c);
while (1) {
cout << "Welcome to Contact Manager, press 0 to add contact, press 1 to search contact, press 2 to delete contact, press 3 to list all contacts"
<< endl;
int input;
int nameNum;
cin >> input;
switch (input) { // 数字键代表操作
case 0:
addContact(&c[lengthOfContacts(c)], 0);
cout << "You just created a contact, name is: " << c[0].name;
cout << ", age is " << c[0].age;
cout << ", sex is " << c[0].sex;
cout << ", number is " << c[0].phone << endl;
break;
case 1:
nameNum = searchContacts(c); // 如果返回值不为-1,则判断找到目标联系人,输出数据
if (nameNum != -1) {
cout << "Name is " << c[nameNum].name <<endl;
cout << "Age is " << c[nameNum].age << endl;
cout << "Sex is " << c[nameNum].sex << endl;
cout << "Number is " << c[nameNum].phone << endl;
}
break;
case 2:
deleteContacts(c);
break;
case 3:
listAllContacts(c);
break;
}
}
}