【C语言课程设计】通讯录(1.0版本)
创始人
2024-05-12 23:06:32
0

前言

相信各位对于通讯录都不是很陌生吧。通讯录我们在学校的大作业,课程设计经常会去使用它。那么今天我们将使用C语言来实现一个简单的通讯录。


目录

前言

一、通讯录的需求

二、工程文件的创建

三、通讯录的声明和定义

四、通讯录各函数的声明和定义

五、通讯录的目录和逻辑

六、通讯录功能实现之初始化通讯录

七、通讯录功能实现之增加联系人

八、通讯录功能实现之删除联系人

九、通讯录功能实现之查找联系人

十、通讯录功能实现之修改联系人

十一、通讯录功能实现之排序

十二、通讯录功能实现之打印通讯录

十三、通讯录完整代码(分文件)

test.c文件

Contact.h文件

Contact.c文件

十四、通讯录完整代码(一个文件)

总结


一、通讯录的需求

首先我们要明白一个通讯录要有什么信息呢?

1.要能够存放人的信息:姓名,年龄,性别,地址,电话

2.通讯录能存放多少个人的信息:我们暂时先定为100个人的信息

3.通讯录的功能:

        1>增加联系人

        2>删除指定联系人

        3>查找指定联系人

        4>修改联系人的信息

        5>显示所有联系人的信息

        6>排序(按照年龄、姓名等排序)

上面这些都是通讯录最最最基本的功能。当然,我们可以增加其他的功能,比如说:通讯录要可以保存、查找某个联系人时可以通过多个信息进行筛选、通讯录可以动态自动增容等等

这些设想我们都可以去实现,但是首先,我们要完成最基本的通讯录。就是以上六个功能,之后,我们在这些功能上进行修改,使得我们的通讯录变得更加强大。

二、工程文件的创建

我们采用分文件的形式来完成这个通讯录,当然我们文末会给出一个文件版本的通讯录

test.c文件用来测试通讯录

Contact.c用来完成通讯录的实现

Contact.h用来实现函数的声明

 

三、通讯录的声明和定义

我们想要创建一个通讯录也就是说,要将很多个人的信息给集合起来。那么这就是一个数组。

而每一个人的信息,他又有了很多个类型,我们需要将这些信息给集合起来,这就是一个结构体。

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 10
#define ADDRESS_MAX 30
#define TELEPHONE_MAX 12//定义一个结构体类型,这里存放人的信息
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char address[ADDRESS_MAX];char telephone[TELEPHONE_MAX];
}PeoInfo;
//所有人的都放到这里
typedef struct Contact
{PeoInfo data[MAX];int size;
}Contact;

如上代码所示,我们利用两个结构体,来实现我们的通讯录的声明

PeoInfo这个结构体存放的是每一个人信息,为了方便我们后续的修改,我们使用了宏

每个人的信息都是一个结构体,我们要存储个人,这些人的类型都是相同的。所以我们要使用一个数组,也就是结构体数组。但是呢,我们肯定还需要知道现在存放了几个人的信息了。所以我们还需要一个变量来确定现在的结构体数组里面存放了几个人的信息了。不妨我们就直接把这个结构体数组和这个变量给集合起来。在创建一个结构体。这样方便我们后续的实现。

四、通讯录各函数的声明和定义

我们想,通讯录要实现六个功能。

        

        1>增加联系人

        2>删除指定联系人

        3>查找指定联系人

        4>修改联系人的信息

        5>显示所有联系人的信息

        6>排序(按照年龄、姓名等排序)

这六个功能,我们不妨先给他们声明一些函数。先不去实现。

//初始化通讯录
void InitContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//删除指定联系人
void DelContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);
//打印通讯录
void ShowContact(const Contact* pc);

需要注意的是,查找和打印并不需要修改通讯录的值,所以我们使用const来保护我们的通讯录

有了这些声明我们假设我们已经实现了,我们可以就来完成一下我们的目录了

五、通讯录的目录和逻辑

void menu()
{printf("*************************\n");printf("****      1.Add      ****\n");printf("****      2.Del      ****\n");printf("****      3.Search   ****\n");printf("****      4.Modify   ****\n");printf("****      5.Show     ****\n");printf("****      6.Sort     ****\n");printf("****      0.exit     ****\n");printf("*************************\n");}
int main()
{int input = 0;Contact con;InitContact(&con);do{menu();printf("请输入你的需求>:");scanf("%d", &input);switch (input){case 1:printf("添加联系人\n");AddContact(&con);break;case 2:printf("删除指定联系人\n");DelContact(&con);break;case 3:printf("查找指定联系人\n");SearchContact(&con);break;case 4:printf("修改指定联系人\n");ModifyContact(&con);break;case 5:printf("打印所有联系人\n");ShowContact(&con);break;case 6:printf("排序联系人\n");SortContact(&con);break;case 0:printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

如上代码所示,我们利用do while语句,就可以来实现我们的通讯录的基本逻辑了。同时也写出了我们的代码

六、通讯录功能实现之初始化通讯录

当我们创建好一个通讯录的时候,我们需要将他初始化。

我们可以简单粗暴的直接使用con={0},但是这种方法太粗暴了。

我们完全可以将其封装成一个函数。来实现他

我们这里先断言pc,防止空指针。然后使用memset函数来置空通讯录

//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);memset(pc->data, 0, sizeof(pc->data));pc->size = 0;
}

七、通讯录功能实现之增加联系人

现在我们来实现通讯的添加联系人。

我们同样先断言,然后我们还需要做的就是判断通讯是否满了。如果满了那么直接返回即可

如果没满,那么就正常使用scanf来添加即可。这里我们的参数必须是指针变量。我们要传地址过去才能修改通讯录的值。

//添加联系人
void AddContact(Contact* pc)
{assert(pc);if (pc->size == MAX){printf("通讯录已满,添加失败\n");return;}printf("请输入联系人的姓名:");scanf("%s", ((pc->data)[pc->size]).name);printf("请输入联系人的年龄:");scanf("%d", &((pc->data)[pc->size].age));printf("请输入联系人的性别:");scanf("%s", (pc->data)[pc->size].sex);printf("请输入联系人的地址:");scanf("%s", (pc->data)[pc->size].address);printf("请输入联系人的电话:");scanf("%s", (pc->data)[pc->size].telephone);pc->size++;printf("恭喜你,添加成功\n");
}

八、通讯录功能实现之删除联系人

添加了联系人,那么与之对应的就是删除操作了

我们删除的基本思路就是,先断言指针,防止空指针

然后如果通讯录空了,那么就不需要删除

我们这里利用姓名来删除联系人。

我们创建一个数组,将输入的联系人姓名放入其中

然后我们创建一个根据名字查找的函数,这个函数的基本思想就是strcmp函数来比较名字,如果名字存在,则返回下标。否则返回-1

我们根据下标来进行删除

删除的时候,我们只需要就后面的元素统一往前挪动一个单位即可,最后不要忘记pc->size--

//在通讯录中通过名字查找一个人,并返回他的下标
int FindByName(const Contact* pc, char* arr)
{assert(pc && arr);int i = 0;for (i = 0; i < pc->size; i++){if (strcmp(pc->data[i].name, arr) == 0){return i;}}return -1;
}
//删除指定联系人
void DelContact(Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法删除\n");return;}printf("请输入你要删除的联系人姓名>:");char arr[NAME_MAX] = { 0 };scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("没有这个人\n");return;}int i = pos;for (i = pos; i < pc->size - 1; i++){pc->data[i] = pc->data[i + 1];}pc->size--;printf("删除成功\n");
}

九、通讯录功能实现之查找联系人

在查找联系人中,我们同样使用名字来查找,这个就又需要使用我们之前的根据名字返回下标函数了。可以将这个封装成一个函数是很有必要的。

我们直接根据这个下标进行格式化打印即可

//查找指定联系人
void SearchContact(const Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法查找\n");return;}char arr[NAME_MAX] = { 0 };printf("请输入你要查找的名字>:");scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("通讯录中不存在这个人\n");return;}printf("%-20s %-4s %-5s %-30s %-12s\n", "姓名", "年龄", "性别", "地址", "电话");printf("%-20s %-4d %-5s %-30s %-12s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].address,pc->data[pos].telephone);
}

十、通讯录功能实现之修改联系人

我们现在实现的是修改联系人的信息

对于这个函数,我们同样还是根据名字来查找到这个联系人的下标,有了下标,那么修改这个就很简单了。

//修改指定联系人
void ModifyContact(Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法修改\n");return;}char arr[NAME_MAX] = { 0 };printf("请输入你要修改的人的名字\n");scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("该联系人不存在\n");return;}printf("请输入联系人的姓名:");scanf("%s", pc->data[pos].name);printf("请输入联系人的年龄:");scanf("%d", &(pc->data[pos].age));printf("请输入联系人的性别:");scanf("%s", pc->data[pos].sex);printf("请输入联系人的地址:");scanf("%s", pc->data[pos].address);printf("请输入联系人的电话:");scanf("%s", pc->data[pos].telephone);printf("修改成功\n");
}

十一、通讯录功能实现之排序

对于排序我们其实比较熟悉的,我们直接使用快速排序即可。因为我们之前已经介绍过快排的基本使用了。我们这里采用了两种方式来排序,可以供使用者进行选择

值得思考的是,我们也可以利用选择的方式,我们在写一个根据年龄查找下标的函数。然后我们就可以选择通过年龄来找到我们需要修改的联系人,并且返回他的下标了。这样我们查找的功能就更加强大了

void cmp_by_name(void* e1, void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void cmp_by_age(void* e1, void* e2)
{return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}
//排序通讯录
void SortContact(Contact* pc)
{assert(pc);int input = 0;printf("请选择你需要按姓名排序还是按照年龄排序\n");printf("按照姓名排序请输入1,按照年龄排序请输入2 :\n");scanf("%d", &input);if (input == 1)qsort(pc, pc->size, sizeof(PeoInfo), cmp_by_name);if (input == 2)qsort(pc, pc->size, sizeof(PeoInfo), cmp_by_age);printf("排序成功\n");
}

十二、通讯录功能实现之打印通讯录

我们对通讯录有了那么多的实现,那么我们也得看到我们的实现后的样子吧,所以我们就很有必要完成一个打印函数。这个函数的实现也很简单,就是利用遍历的思想即可

//打印通讯录
void ShowContact(const Contact* pc)
{assert(pc);int i = 0;printf("%-20s %-4s %-5s %-30s %-12s\n","姓名","年龄","性别","地址","电话");for (i = 0; i < pc->size; i++){printf("%-20s %-4d %-5s %-30s %-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex, pc->data[i].address,pc->data[i].telephone);}}

十三、通讯录完整代码(分文件)

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
void menu()
{printf("*************************\n");printf("****      1.Add      ****\n");printf("****      2.Del      ****\n");printf("****      3.Search   ****\n");printf("****      4.Modify   ****\n");printf("****      5.Show     ****\n");printf("****      6.Sort     ****\n");printf("****      0.exit     ****\n");printf("*************************\n");}
int main()
{int input = 0;Contact con;InitContact(&con);do{menu();printf("请输入你的需求>:");scanf("%d", &input);switch (input){case 1:printf("添加联系人\n");AddContact(&con);break;case 2:printf("删除指定联系人\n");DelContact(&con);break;case 3:printf("查找指定联系人\n");SearchContact(&con);break;case 4:printf("修改指定联系人\n");ModifyContact(&con);break;case 5:printf("打印所有联系人\n");ShowContact(&con);break;case 6:printf("排序联系人\n");SortContact(&con);break;case 0:printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

Contact.h文件

#pragma once
#include
#include
#include
#include
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 10
#define ADDRESS_MAX 30
#define TELEPHONE_MAX 12//定义一个结构体类型,这里存放人的信息
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char address[ADDRESS_MAX];char telephone[TELEPHONE_MAX];
}PeoInfo;
//所有人的都放到这里
typedef struct Contact
{PeoInfo data[MAX];int size;
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//删除指定联系人
void DelContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);
//打印通讯录
void ShowContact(const Contact* pc);

Contact.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);memset(pc->data, 0, sizeof(pc->data));pc->size = 0;
}
//添加联系人
void AddContact(Contact* pc)
{assert(pc);if (pc->size == MAX){printf("通讯录已满,添加失败\n");return;}printf("请输入联系人的姓名:");scanf("%s", ((pc->data)[pc->size]).name);printf("请输入联系人的年龄:");scanf("%d", &((pc->data)[pc->size].age));printf("请输入联系人的性别:");scanf("%s", (pc->data)[pc->size].sex);printf("请输入联系人的地址:");scanf("%s", (pc->data)[pc->size].address);printf("请输入联系人的电话:");scanf("%s", (pc->data)[pc->size].telephone);pc->size++;printf("恭喜你,添加成功\n");
}
//在通讯录中通过名字查找一个人,并返回他的下标
int FindByName(const Contact* pc, char* arr)
{assert(pc && arr);int i = 0;for (i = 0; i < pc->size; i++){if (strcmp(pc->data[i].name, arr) == 0){return i;}}return -1;
}
//删除指定联系人
void DelContact(Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法删除\n");return;}printf("请输入你要删除的联系人姓名>:");char arr[NAME_MAX] = { 0 };scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("没有这个人\n");return;}int i = pos;for (i = pos; i < pc->size - 1; i++){pc->data[i] = pc->data[i + 1];}pc->size--;printf("删除成功\n");
}
//查找指定联系人
void SearchContact(const Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法查找\n");return;}char arr[NAME_MAX] = { 0 };printf("请输入你要查找的名字>:");scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("通讯录中不存在这个人\n");return;}printf("%-20s %-4s %-5s %-30s %-12s\n", "姓名", "年龄", "性别", "地址", "电话");printf("%-20s %-4d %-5s %-30s %-12s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].address,pc->data[pos].telephone);
}
//修改指定联系人
void ModifyContact(Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法修改\n");return;}char arr[NAME_MAX] = { 0 };printf("请输入你要修改的人的名字\n");scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("该联系人不存在\n");return;}printf("请输入联系人的姓名:");scanf("%s", pc->data[pos].name);printf("请输入联系人的年龄:");scanf("%d", &(pc->data[pos].age));printf("请输入联系人的性别:");scanf("%s", pc->data[pos].sex);printf("请输入联系人的地址:");scanf("%s", pc->data[pos].address);printf("请输入联系人的电话:");scanf("%s", pc->data[pos].telephone);printf("修改成功\n");
}
void cmp_by_name(void* e1, void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void cmp_by_age(void* e1, void* e2)
{return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}
//排序通讯录
void SortContact(Contact* pc)
{assert(pc);int input = 0;printf("请选择你需要按姓名排序还是按照年龄排序\n");printf("按照姓名排序请输入1,按照年龄排序请输入2 :\n");scanf("%d", &input);if (input == 1)qsort(pc, pc->size, sizeof(PeoInfo), cmp_by_name);if (input == 2)qsort(pc, pc->size, sizeof(PeoInfo), cmp_by_age);printf("排序成功\n");
}
//打印通讯录
void ShowContact(const Contact* pc)
{assert(pc);int i = 0;printf("%-20s %-4s %-5s %-30s %-12s\n","姓名","年龄","性别","地址","电话");for (i = 0; i < pc->size; i++){printf("%-20s %-4d %-5s %-30s %-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex, pc->data[i].address,pc->data[i].telephone);}}

十四、通讯录完整代码(一个文件)

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 10
#define ADDRESS_MAX 30
#define TELEPHONE_MAX 12//定义一个结构体类型,这里存放人的信息
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char address[ADDRESS_MAX];char telephone[TELEPHONE_MAX];
}PeoInfo;
//所有人的都放到这里
typedef struct Contact
{PeoInfo data[MAX];int size;
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//删除指定联系人
void DelContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);
//打印通讯录
void ShowContact(const Contact* pc);void menu()
{printf("*************************\n");printf("****      1.Add      ****\n");printf("****      2.Del      ****\n");printf("****      3.Search   ****\n");printf("****      4.Modify   ****\n");printf("****      5.Show     ****\n");printf("****      6.Sort     ****\n");printf("****      0.exit     ****\n");printf("*************************\n");}
int main()
{int input = 0;Contact con;InitContact(&con);do{menu();printf("请输入你的需求>:");scanf("%d", &input);switch (input){case 1:printf("添加联系人\n");AddContact(&con);break;case 2:printf("删除指定联系人\n");DelContact(&con);break;case 3:printf("查找指定联系人\n");SearchContact(&con);break;case 4:printf("修改指定联系人\n");ModifyContact(&con);break;case 5:printf("打印所有联系人\n");ShowContact(&con);break;case 6:printf("排序联系人\n");SortContact(&con);break;case 0:printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);memset(pc->data, 0, sizeof(pc->data));pc->size = 0;
}
//添加联系人
void AddContact(Contact* pc)
{assert(pc);if (pc->size == MAX){printf("通讯录已满,添加失败\n");return;}printf("请输入联系人的姓名:");scanf("%s", ((pc->data)[pc->size]).name);printf("请输入联系人的年龄:");scanf("%d", &((pc->data)[pc->size].age));printf("请输入联系人的性别:");scanf("%s", (pc->data)[pc->size].sex);printf("请输入联系人的地址:");scanf("%s", (pc->data)[pc->size].address);printf("请输入联系人的电话:");scanf("%s", (pc->data)[pc->size].telephone);pc->size++;printf("恭喜你,添加成功\n");
}
//在通讯录中通过名字查找一个人,并返回他的下标
int FindByName(const Contact* pc, char* arr)
{assert(pc && arr);int i = 0;for (i = 0; i < pc->size; i++){if (strcmp(pc->data[i].name, arr) == 0){return i;}}return -1;
}
//删除指定联系人
void DelContact(Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法删除\n");return;}printf("请输入你要删除的联系人姓名>:");char arr[NAME_MAX] = { 0 };scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("没有这个人\n");return;}int i = pos;for (i = pos; i < pc->size - 1; i++){pc->data[i] = pc->data[i + 1];}pc->size--;printf("删除成功\n");
}
//查找指定联系人
void SearchContact(const Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法查找\n");return;}char arr[NAME_MAX] = { 0 };printf("请输入你要查找的名字>:");scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("通讯录中不存在这个人\n");return;}printf("%-20s %-4s %-5s %-30s %-12s\n", "姓名", "年龄", "性别", "地址", "电话");printf("%-20s %-4d %-5s %-30s %-12s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].address,pc->data[pos].telephone);
}
//修改指定联系人
void ModifyContact(Contact* pc)
{assert(pc);if (pc->size == 0){printf("通讯录为空,无法修改\n");return;}char arr[NAME_MAX] = { 0 };printf("请输入你要修改的人的名字\n");scanf("%s", arr);int pos = FindByName(pc, arr);if (pos == -1){printf("该联系人不存在\n");return;}printf("请输入联系人的姓名:");scanf("%s", pc->data[pos].name);printf("请输入联系人的年龄:");scanf("%d", &(pc->data[pos].age));printf("请输入联系人的性别:");scanf("%s", pc->data[pos].sex);printf("请输入联系人的地址:");scanf("%s", pc->data[pos].address);printf("请输入联系人的电话:");scanf("%s", pc->data[pos].telephone);printf("修改成功\n");
}
void cmp_by_name(void* e1, void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void cmp_by_age(void* e1, void* e2)
{return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}
//排序通讯录
void SortContact(Contact* pc)
{assert(pc);int input = 0;printf("请选择你需要按姓名排序还是按照年龄排序\n");printf("按照姓名排序请输入1,按照年龄排序请输入2 :\n");scanf("%d", &input);if (input == 1)qsort(pc, pc->size, sizeof(PeoInfo), cmp_by_name);if (input == 2)qsort(pc, pc->size, sizeof(PeoInfo), cmp_by_age);printf("排序成功\n");
}
//打印通讯录
void ShowContact(const Contact* pc)
{assert(pc);int i = 0;printf("%-20s %-4s %-5s %-30s %-12s\n", "姓名", "年龄", "性别", "地址", "电话");for (i = 0; i < pc->size; i++){printf("%-20s %-4d %-5s %-30s %-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].address,pc->data[i].telephone);}}


总结

我们本节实现了一个简单的通讯录,但是要注意的是,这个通讯录其实并不完善。因为他的容量是死的。我们希望可以实现一个可以动态扩容的通讯录。其次他的一个缺陷就是关闭了这个文件之后,在打开就会发现,之前的信息不见了。我们希望可以实现一个不会消失数据的通讯录。这些我们都将在后面的文章中实现

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...