C语言通讯录系统——结构体数组(3)

200 阅读3分钟

「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

主函数

main是主函数,里面仅包含三条语句。第一句执行test函数,第二句执行冻结屏幕,最后进行返回。
咱们看看主要的test函数的内容,首先定义用户选择input,这个用int类型的变量进行表示
定义通讯录后调用初始化函数。用do while语句执行用户输入,接收到用户输入后根据Switch分支判断执行对应函数。ADD对应添加,DEL对应删除,SHOW对应显示,SEARCH对应查找,MODIFY对应修改,SORT对应按姓名首字母进行排序,EMPTY对应清空通讯录,EXIT对应退出通讯录系统,其他输入则显示选择错误让用户重新进行选择。

int main()
{
    test();
    system("pause");//冻结屏幕,用户按任意键结束
    return 0;
}

void test()
{
    int input=0;
    Contact con;//定义通讯录
    InitContact(&con);//初始化
    do
    {
            menu();
            printf("请选择:>");
            scanf("%d", &input);
            switch (input)
            {
            case ADD:
                    AddContact(&con);
                    break;
            case DEL:
                    DelContact(&con);
                    break;
            case SHOW:
                    ShowContact(&con);
                    break;
            case SEARCH:
                    SearchContact(&con);
                    break;
            case MODIFY:
                    ModifyContact(&con);
                    break;
            case SORT:
                    SortContact(&con);
                    break;
            case EMPTY:
                    EmptyContact(&con);
            case EXIT:
                    SaveContact(&con);
                    DestroyContact(&con);
                    printf("退出!\n");
                    break;
            default:
                    printf("选择错误!\n");
                    break;	
            }
    } while (input);
}

初始化函数

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。
如果不为空则不用进行初始化,为空的时候首先把有效数量定义置0,然后为数据分配内存空间

void InitContact(Contact *pcon)
{
	assert(pcon != NULL);
	pcon->sz = 0;
	pcon->data = (Info*)malloc(3 * sizeof(Info));//为数据分配内存空间
	if (pcon->data == NULL)
	{
		perror("InitContact::use malloc");
		exit(EXIT_FAILURE);//退出程序
	}
	pcon->capacity = 3;
	//加载文件中的保存信息
	LoadContact(pcon);
}

增容函数

对通讯录进行增容,增容成功后给出提示。

int Check_Capacity(Contact *pcon)
{
	assert(pcon);
	if (pcon->capacity == pcon->sz)
	{
		//扩容
		Info *ptr= realloc(pcon->data, (pcon->capacity + 2)*sizeof(Info));
		if (ptr != NULL)
		{
			pcon->data = ptr;
			printf("增容成功!");
			return 1;
		}
	}
	return 1;
}

显示菜单函数

这个是纯输入给用户进行提示的,如果对提示页面不满意可以进行修改。

void menu()
{
	printf("*************************************\n");
	printf("*************** 通讯录 **************\n");
	printf("***        1.add     2.del        ***\n");
	printf("***        3.search  4.modify     ***\n");
	printf("***        5.show    6.sort       ***\n");
	printf("***        7.empty   0. exit      ***\n");
	printf("*************************************\n");
}

添加用户信息

传入一个指针,assert用法在之前讲过就不赘述,注释内容可以对通讯录进行大小限制。先判断增容是否成功,如果失败给出提示:"增容失败,无法添加",如果成功则给出提示让用户进行添加用户信息。名字、电话号码、街道、城市、省份、邮编均用字符串进行记录。

void AddContact(Contact *pcon)
{
	assert(pcon != NULL);
	/*if (pcon->sz == MAX)
	{
		printf("通讯录已满,无法添加!\n");
	}*/
	if (0 == Check_Capacity(pcon))
	{
		printf("增容失败,无法添加");
		return;
	}
	else
	{
		printf("请输入名字:> ");
		scanf("%s", pcon->data[pcon->sz].name);
		printf("请输入电话:> ");
		scanf("%s", pcon->data[pcon->sz].tele);
		printf("请输入街道;> ");
		scanf("%s", pcon->data[pcon->sz].addr);		
		printf("请输入城市:> ");
		scanf("%s", pcon->data[pcon->sz].city);
		printf("请输入省份:> ");
		scanf("%s", pcon->data[pcon->sz].province);
		printf("请输入邮编:> ");
		scanf("%s", pcon->data[pcon->sz].postcode);
		pcon->sz++;
	}
}