C语言程序设计—通讯录实现

这篇具有很好参考价值的文章主要介绍了C语言程序设计—通讯录实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇文章主要是实现一个简易的通讯录:

功能如下:

  1. 添加用户
  2. 修改用户
  3. 删除用户
  4. 查找用户(可重名)
  5. 按名字或年龄排序
  6. 显示用户
  7. 保存通讯录
  8. 日志追加

 有如下知识点:

  1. 动态数组
  2. 结构体
  3. 枚举
  4. 自定义标识符和宏
  5. 文件打开与存储
  6. 函数
  7. 指针
  8. 循环 
  9. 排序

简述特点:

  1. 将人员信息放在一个PeoInf的结构体中,再创建一个结构体List,用于存放peoinf这个结构体的指针,和容量与目前通讯录人员数量。
  2. 再用realloc动态开辟以结构体peoinf为大小的内存,用于实现动态内存开辟。
  3. 程序运行后,初始化这段空间,并查询是否有“contact.txt”的文件存在,如果存在,则读取文件里的内容,并放到peoinf的结构体“数组”中,并实时监控是否需要扩容。如果不存在就创建文件。
  4. 随后就可以添加、修改、查找、删除用户,每一次增删改查都会被记录到一个“contact_log.txt”的文件里,这里使用了时间戳。
  5. 用qsort进行名字或年龄进行排序
  6. 程序会知道本次是否进行修改,如果修改后就退出会提示是否需要保存,当然也可以自己手动保存。
  7. 程序以“rb”和“wb”进行文件的读写。
  8. 程序实现了重名查找,在有重名的情况下会进行选择。
  9. (代码可直接运行,复制到编译器vs2019即可)

代码部分

  1. contact.h
    #pragma once
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <assert.h>
    #include <time.h>
    #include <sys/stat.h>
    
    #define MAX_10 10
    #define MAX_20 20
    //#define LOG_PRINT(x) fprintf(pf, "In %s %s ,user %s name calling %s\n",__DATE__,__TIME__,(x),(list->pl+num)->name)
    typedef struct PeoInf
    {
    	char name[MAX_20];
    	int age;
    	char sex[5];
    	char tel[12];
    	char addr[30];
    }PeoInf;
    //定义通讯录结构体,嵌套PeoInf
    typedef struct List
    {
    	//动态内存分配
    	PeoInf* pl;
    	int count;
    	int capacity;//容量
    }List;
    //定义一个枚举变量,用于存储菜单所有选择
    enum select_all
    {
    	EXIT,//0
    	ADD,
    	DEL,
    	SELECT,
    	MODIFY,
    	SORT,
    	SHOW,
    	SAVE
    };
    //菜单函数
    void menu();
    //定义初始化list函数
    void initialise_list(List* list);
    //定义添加信息函数
    void add_peoinf(List* list);
    //定义显示函数
    void show_list(List* list);
    //定义删除函数
    void del_peoinf(List* list);
    //定义通过找名字查找人的函数(已实现重名查找)
    int find_byname(const List* list);
    //定义查找人
    void sele_peoinf(const List* list);
    //定义修改人信息函数
    void modify_peoinf(List* list);
    //定义删除和修改已找到下标的信息函数
    void del_havefond(List* list, int position);
    void modify_havefond(List* list, int position);
    //定义排序函数
    void sort_peoinf(List* list);
    //定义文件保存函数
    void file_save(List* list);
    //定义扩容函数
    void expand_list(List* list);
  2. actualize.c
    #include "contact.h"
    //实现菜单函数
    void menu(){
    	printf("----------------------------------------\n");
    	printf("--------1. add      2. del--------------\n");
    	printf("--------3. select   4. modify-----------\n");
    	printf("--------5. sort     6. show-------------\n");
    	printf("--------------7. save-------------------\n");
    	printf("--------------0. exit-------------------\n");
    	printf("----------------------------------------\n");
    }
    //实现初始化list函数
    void initialise_list(List* list){
    	PeoInf* ptr = (PeoInf*)calloc(3, sizeof(PeoInf));//默认开辟三个人的存储空间
    	if (ptr == NULL) {
    		printf("%s", strerror(errno));
    		return ;
    	}
    	list->pl = ptr;
    	list->count = 0;
    	list->capacity = 3;
    	FILE* pf = NULL;
    	struct stat buffer;//判断文件是否存在
    	if (stat("contact.txt", &buffer) != 0) {//不存在就创建文件
    		pf = fopen("contact.txt", "wb");
    		fclose(pf);
    		pf = NULL;
    		return;
    	}
    	pf = fopen("contact.txt", "rb");
    	if (pf != NULL) {
    		for (int i = 0; fread(list->pl + i, sizeof(PeoInf), 1, pf) != 0; i++) {
    			if (list->count == list->capacity - 1) {
    				expand_list(list);
    			}
    			list->count++;
    		}
    		fclose(pf);
    	}
    	pf = NULL;
    }
    //扩容函数
    void expand_list(List* list) {
    	PeoInf* ptr =(PeoInf*) realloc(list->pl, (list->capacity + 2)*sizeof(PeoInf));//每次增加两个
    	if (ptr == NULL) {
    		printf("%s", strerror(errno));
    		return;
    	}
    	list->pl = ptr;
    	list->capacity += 2;
    }
    //实现添加日志功能
    /*
    * return 0 失败
    * return 1 成功
    */
    int add_log(List* list,char* moving,int num) {
    	//打开文件
    	FILE* pf=NULL;
    	//判断写入模式是否要追加
    	if (list->count == 0) {
    		pf = fopen("contact_log.txt", "w");
    	}
    	else {
    		pf = fopen("contact_log.txt", "a");
    	}
    	//如果打开失败,报错
    	if (pf == NULL) {
    		perror("fopen:");
    		return 0;
    	}
    	//获取时间戳
    	time_t rawtime;
    	struct tm* timeinfo;
    	time(&rawtime);
    	timeinfo = localtime(&rawtime);
    	fprintf(pf, "In %s \tuser %s name calling %s.\n", asctime(timeinfo), moving, (list->pl + num)->name);
    	fclose(pf);
    	pf = NULL;
    	return 1;
    }
    //实现添加信息功能
    void add_peoinf(List* list) {
    	assert(list);//断言
    	//判断是否需要扩容
    	if (list->count == list->capacity) {
    		expand_list(list);//内部函数,不必去头文件里定义
    		printf("Automatic capacity expansion is successful,\n and the current address book capacity is %d\n", list->capacity);
    	}
    	printf("Please enter the name\n->");
    	scanf("%s", (list->pl+list->count)->name);
    	printf("Please enter age\n->");
    	scanf("%d", &(list->pl + list->count)->age);
    	printf("Please enter sex\n->");
    	scanf("%s", (list->pl + list->count)->sex);
    	printf("Please enter the telephone\n->");
    	scanf("%s", (list->pl + list->count)->tel);
    	printf("Please enter the address\n->");
    	scanf("%s", (list->pl + list->count)->addr);
    	//添加日志log功能
    	if (!add_log(list,"add",list->count)) {
    		printf("log fail,please find excause.\n");
    	}
    	list->count++;
    	printf("succeed!\n");
    }
    //实现显示函数
    void show_list(List* list) {
    	assert(list);
    	printf("name\tage\tsex\ttelephone\taddr\n");
    	for (int i = 0; i < (list->count); i++) {
    		printf("%s\t%d\t%s\t%s\t\t%s\n", (list->pl + i)->name,
    			(list->pl + i)->age, (list->pl + i)->sex, (list->pl + i)->tel, (list->pl + i)->addr);
    	}
    }
    //实现通过寻找名字,找到这个人
    //重名默认存放数组为10,如需变大可改为动态扩容实现
    int find_byname(const List* list) {
    	char s_name[MAX_20] = { 0 };
    	int count = 0;
    	int find_result[MAX_10] = { 0 };
    	printf("Please enter the name that you want \n->");
    	scanf("%s", s_name);
    	for (int i = 0; i < list->count; i++) {
    		if (strcmp((list->pl + i)->name, s_name)==0) {
    			//找到了
    			if (count == 0) {
    				printf("Find the information, please confirm\n");
    				printf("number\tname\tage\tsex\ttelephone\taddr\n");
    			}
    			printf("%d\t%s\t%d\t%s\t%s\t\t%s\n", count+1,(list->pl + i)->name,
    				(list->pl + i)->age, (list->pl + i)->sex, (list->pl + i)->tel, (list->pl + i)->addr);
    			find_result[count] = i;//将找到的坐标存入数组中
    			count++;//判断是否有重复
    		}
    	}
    	if (count == 0) {
    		//找不到
    		printf("Check no such person, please confirm after the input!\n");
    		return -1;
    	}
    	else if (count == 1) {
    		return find_result[0];
    	}
    	else {//两个以上
    		int select_num = 0;
    		while (1) {
    			printf("Please select the object serial number that you want to operate on\n->");
    			scanf("%d", &select_num);
    			if (select_num >= 1 && select_num <= count) {//输入正确序号,方可返回
    				return find_result[select_num - 1];
    			}
    			else {
    				printf("error,please reenter\n");
    			}
    		}
    	}
    }
    //实现删除函数
    void del_peoinf(List* list) {
    	assert(list);
    	int del_num = find_byname(list);
    	if (del_num < 0) return;//查找失败
    	for (int i = 0; i < list->count - del_num - 1; i++) {
    		*(list->pl + del_num + i) = *(list->pl + del_num + 1 + i);
    	}
    	list->count--;
    	printf("delet successfully\n");
    	if (!add_log(list, "delet", del_num)) {
    		printf("log fail,please find excause.\n");
    	}
    }
    void del_havefond(List* list,int position) {
    	assert(list);
    	for (int i = 0; i < list->count - position - 1; i++) {
    		*(list->pl + position + i) = *(list->pl + position + 1 + i);
    	}
    	list->count--;
    	printf("delet successfully\n");
    	if (!add_log(list, "delet", position)) {
    		printf("log fail,please find excause.\n");
    	}
    }
    //实现查找信息功能
    void sele_peoinf(const List* list) {
    	assert(list);
    	int find_num = find_byname(list);
    	if (find_num < 0) return;//查找失败
    	printf("The information is as follows\n");
    	printf("name\tage\tsex\ttelephone\taddr\n");
    	printf("%s\t%d\t%s\t%s\t\t%s\n", (list->pl + find_num)->name,
    		(list->pl + find_num)->age, (list->pl + find_num)->sex, (list->pl + find_num)->tel, (list->pl + find_num)->addr);
    	int input_find = 0;
    	do {
    		printf("--------------------------------\n");
    		printf("--------------------------------\n");
    		printf("-----1. del-------2. modif------\n");
    		printf("------------0. exit-------------\n");
    		printf("--------------------------------\n");
    		printf("--------------------------------\n");
    		printf("please enter what you want\n->");
    		scanf("%d", &input_find);
    		if (input_find == 1) {
    			del_havefond(list, find_num);
    			return;
    		}
    		else if (input_find == 2) {
    			modify_havefond(list, find_num);
    			return;
    		}
    		else if (input_find != 0) {
    			printf("Input is wrong, please reagain\n");
    		}
    	} while (input_find);
    
    }
    void modify_havefond(List* list,int position) {
    	assert(list);
    	printf("Please enter the new name\n->");
    	scanf("%s", (list->pl + position)->name);
    	printf("Please enter new age\n->");
    	scanf("%d", &(list->pl + position)->age);
    	printf("Please enter new sex\n->");
    	scanf("%s", (list->pl + position)->sex);
    	printf("Please enter the new telephone\n->");
    	scanf("%s", (list->pl + position)->tel);
    	printf("Please enter the new address\n->");
    	scanf("%s", (list->pl + position)->addr);
    	printf("Modified successfully\n");
    	if (!add_log(list, "modify", position)) {
    		printf("log fail,please find excause.\n");
    	}
    }
    //实现修改信息
    void modify_peoinf(List* list) {
    	assert(list);
    	int mod_num = find_byname(list);
    	if (mod_num < 0) return;//查找失败
    	printf("Please enter the new name\n->");
    	scanf("%s", (list->pl + mod_num)->name);
    	printf("Please enter new age\n->");
    	scanf("%d", &(list->pl + mod_num)->age);
    	printf("Please enter new sex\n->");
    	scanf("%s", (list->pl + mod_num)->sex);
    	printf("Please enter the new telephone\n->");
    	scanf("%s", (list->pl + mod_num)->tel);
    	printf("Please enter the new address\n->");
    	scanf("%s", (list->pl + mod_num)->addr);
    	printf("Modified successfully\n");
    	if (!add_log(list, "modify",mod_num)) {
    		printf("log fail,please find excause.\n");
    	}
    }
    //qsort的比较函数
    int compare_name(const void* e1,const void* e2) {
    	return strcmp(((PeoInf*)e1)->name, ((PeoInf*)e2)->name);
    
    }
    int compare_age(const void* e1, const void* e2) {
    	return ((PeoInf*)e1)->age - ((PeoInf*)e2)->age;
    
    }
    //实现排序函数
    void sort_peoinf(List* list) {
    	int sort_input = 0;
    	do {
    		printf("--------------------------------\n");
    		printf("--------------------------------\n");
    		printf("-----1. name-------2. age------\n");
    		printf("------------0. exit-------------\n");
    		printf("--------------------------------\n");
    		printf("--------------------------------\n");
    		printf("please enter you want sort by\n->");
    		scanf("%d", &sort_input);
    		if (sort_input == 1) {
    			qsort(list->pl, list->count, sizeof(PeoInf), compare_name);
    			printf("sort by name successfully\n");
    			return;
    		}
    		else if (sort_input == 2) {
    			qsort(list->pl, list->count, sizeof(PeoInf), compare_age);
    			printf("sort by age successfully\n");
    			return;
    		}
    	} while (sort_input);
    	
    }
    void file_save(List *list) {
    	FILE* pf = fopen("contact.txt", "wb");//二进制写入
    	if (pf == NULL) {
    		perror("fopen:");
    		return;
    	}
    	//写数据
    	for (int i = 0; i < list->count; i++) {
    		fwrite(list->pl+i, sizeof(PeoInf), 1, pf);
    	}
    	fclose(pf);
    	pf = NULL;
    }
  3. test.c
    #include "contact.h"
    int main()
    {
    	int input = 0;
    	List list;
    	initialise_list(&list);//动态内存开辟,记得用完销毁
    	int modify_num = 0;//修改数量记录
    	do{
    		menu();
    		printf("Please choose!\n->");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case ADD: 
    		{
    			add_peoinf(&list);
    			modify_num++;
    		}break;
    		case DEL:
    		{
    			del_peoinf(&list);
    			modify_num++;
    		}break;
    		case SELECT:
    		{
    			sele_peoinf(&list);
    		}break;
    		case MODIFY:
    		{
    			modify_peoinf(&list);
    			modify_num++;
    		}break;
    		case SORT:
    		{
    			sort_peoinf(&list);
    		}break;
    		case SHOW:
    		{
    			show_list(&list);
    		}break;
    		case SAVE:
    		{
    			file_save(&list);
    			printf("save in file sucessfully\n");
    			modify_num = 0;
    		}break;
    		case EXIT:
    		{
    			if (modify_num != 0) {
    				int save_select = 0;
    				printf("=========1.save   2.no=============\n");
    				printf("The modified data is not saved, whether it needs to be saved\n->");
    				scanf("%d", &save_select);
    				if (save_select == 1) {
    					file_save(&list);
    					printf("save in file sucessfully\n");
    				}
    			}
    			printf("Ok,have a nice day! Bye~");
    		}break;
    		default:
    			printf("Input is wrong,please reagain!\n");
    			break;
    		}
    	} while (input);
    	//销毁动态内存
    	free(list.pl);
    	list.pl = NULL;
    }

希望对大家有帮助!文章来源地址https://www.toymoban.com/news/detail-704606.html

到了这里,关于C语言程序设计—通讯录实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态通讯录实现(C语言)

    目录 前言: 一:单个节点的设计和主逻辑  结点设计 主逻辑 二:接口实现 (1)生成一个新的结点 (2)增加信息 (3)打印信息 (4)查找  (5)删除信息 (6)修改信息 (7)排序  插入排序 快速排序 (8)已有数据读取 (9)更新数据录入 三:全部代码 contact.h(声明) contact.c(接口) test.c(主逻辑) 本

    2024年02月05日
    浏览(58)
  • C语言--通讯录的实现

    人的信息:姓名+年龄+性别+住址+电话 通讯录中可以存放100个人的信息 增加联系人 删除指定联系人 查找指定联系人 修改指定联系人 显示所有联系人的信息 test.c----测试通讯录 contact.c----通讯录的实现 contact.h----函数的声明 代码如下(示例): 代码如下(示例):

    2024年02月15日
    浏览(48)
  • 通讯录(纯C语言实现)

    相信大家都有过通讯录,今天我来带大家实现以下最简单的通讯录,通过本篇文章,相信可以让大家对C语言有进一步的认识。 话不多说,我们先放函数的实现  是不是看到这里会感到很害怕??不用怕,跟着我的思路,你也可以实现它,我带着你一步一步实现每一个功能  

    2024年02月16日
    浏览(48)
  • C语言课程设计|通讯录管理系统(含完整代码)

    目录 菜单功能 录入联系人信息功能 查看系统中全部信息功能 查看单个信息功能 删除全部信息功能 删除单个信息功能 修改信息功能 完整代码 在长达一个多月的学习过程中,终于将C语言学完,因此专门写一个C语言课程设计来检验这一个多月的学习成果,由于写的比较急,

    2024年02月01日
    浏览(46)
  • C语言进阶——通讯录模拟实现

    🌇个人主页:_麦麦_ 📚今日名言:只有走在路上,才能摆脱局限,摆脱执着,让所有的选择,探寻,猜测,想象都生机勃勃。——余秋雨《文化苦旅》 目录 一、前言 二、正文 1.大体框架 2.界面显示 3. 创建通讯录 4.初始化通讯录 5.增加联系人 6.显示联系人 7. 删除联系人  

    2024年02月02日
    浏览(47)
  • 【C语言】实现动态版通讯录

    💌内容专栏:【C语言】进阶部分 💌本文概括: 结合自定义类型、动态内存管理知识,对静态版本的通讯录进行优化。 💌本文作者:花 碟 💌发布时间:2023.4.2   目录 前言: 一、静态版本代码实现: 二、动态通讯录  三、代码整理  前面我们学过了结构体、枚举等自定义

    2024年02月02日
    浏览(45)
  • C语言——静态通讯录的实现

    今天我们来实现一下一个静态的通讯录: 我就先展示一下几个功能: 实现一个通讯录; 通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址 提供方法: 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示

    2024年01月22日
    浏览(52)
  • C语言实现通讯录--静态版

    实现一个通讯录 ,里面存放100个人的信息,完成通讯录的基本操作功能:增删查改联系人 (1)通讯录存放100个人的信息? 创建一个数组作为通讯录,100个元素,每个元素里面存放每个人的信息,所以数组里面的每个元素应该是结构体类型。 (2)每个人的信息应该包括哪些

    2024年02月16日
    浏览(68)
  • C语言实现通讯录--动态版

    实现一个通讯录,联系人的数量可多可少 1.在静态版本的基础上改用动态的方法: (1)默认能够存放三个人的信息 (2)不够的话,每次增加两个人的信息 2.其他功能不变 建立三个文件: test.c 用于测试通讯录的相关功能 contsct.c 通讯录的实现模块(用函数实现功能) conta

    2024年02月15日
    浏览(52)
  • C语言实现通讯录(文件版)

    学习完C语言的文件读写,我们又可以将通讯录增加以下功能: 1.当退出通讯录的时候,把已增加的联系人信息写到文件中。 2.当通讯录初始化的时候,加载(读取)文件里的信息到通讯录 ——(直接使用打印函数可以显示在屏幕上) 分析: 当我们退出通讯录的时候要实现通讯录

    2024年02月01日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包