C语言实现的 通讯录管理系统

2023-11-11

通讯录(C语言实现)


前言:本文讲解如何用C语言来创建一个通讯录,这是一个小项目,非常适合新手上手,同时也可以提高自己的代码能力,里面用到了 结构体传参枚举常量文件动态内存开辟……等知识,自己写一个通讯录可以帮助大家巩固一下自己的C语言知识。为了详细的讲解通讯录,我写了三个版本。

通讯录1(静态)

写的第一个通讯录只能存定量的联系人,如果存的联系人超过容量,就会数组越界,报错。

(一)构思通讯录的内容

在建立一个通讯录前我们可以设想通讯录可以有那些功能,我们想让这个通讯录存哪些信息。这是由我们程序员自己定的。

我先讲几个功能:(1)添加联系人(2)删除联系人(3)

查找联系人(4)显示通讯录表(5)退出通讯录

存联系人的信息,我可以存他的姓名,性别,电话。当然还可以存其它信息,但在本例中只存这三个简单的信息。

(二)代码实现

在构思好通讯录的功能后,我们就可以敲代码来实现通讯的功能了。我们需要做完一个功能后就去验证其正确性,不推荐,大家一口气写完,再去调试,这会让调试变得很复杂。

首先,建立存放联系人的结构体。

struct people    //一个联系人的信息
{
	char name[20];
	char sex[10];
	char phone[20];
};
struct q1//通讯录
{
	int xx;//存进去的联系人个数
	struct people arr[1000];//总共可以存1000个联系人
};

然后建立一个框架:

nt main()
{
	int input = 0;
	struct q1 wx1;//声明了一个通讯录
	//初始化
	chushihua(&wx1);
		do
	{
		mune();//菜单
		scanf("%d", &input);
		switch (input)
		{
		case Add://Add以及下面的是枚举常量,头文件有
			add(&wx1);
			break;
		case Del:
			del(&wx1);
			break;
		case Chaxun:
			chaxun(&wx1);
			break;
		case Show:
			show(&wx1);
			break;
		case Exit:
			break;
		default:
			break;

		}
	} while (input);
	return 0;
}

最后我们去实现通讯录的功能:

//初始化通讯录
void chushihua(struct q1 *py)
{
	py->xx = 0;
	memset(py->arr, 0, sizeof(py->arr));
}
//添加联系人
void add(struct q1 *py)
{
    //添加联系人信息
 	    printf("请输入联系人姓名:");
		scanf("%s", py->arr[py->xx].name);
		printf("请输入联系人性别:");
		scanf("%s", py->arr[py->xx].sex);
		printf("请输入联系人电话:");
		scanf("%s", py->arr[py->xx].phone);
	py->xx++;//有效联系人+1
}
//查询联系人
int chaxun(struct q1 *py)
{
    //输入联系人姓名来进行查找
	char s[20] = { 0 };
	printf("请输入查找联系人的姓名:");
	scanf("%s", s);
    //遍历通讯录,如果查找成功返回下标
	for (int i = 0; i < py->xx; i++)
	{
		if (strcmp(s,py->arr[i].name) == 0)
		{
			printf("联系人姓名:%s", py->arr[i].name);
			printf("联系人电话:%s", py->arr[i].phone);
			return i;
		}
	}
    //查找失败返回 -1
	printf("未查找到联系人\n");
	return -1;
}
//删除联系人
void del(struct q1 *py)
{
    //调用查询函数找到删除人的下标
	int a=chaxun(py);
	if (a != (-1))
	{
        //挪动数据,来删除联系人,相当于把它覆盖了
		for (int i = a; i < py->xx - 1; i++)
		{
			py->arr[i] = py->arr[i + 1];
		}
		py->xx--;//联系人-1
		printf("删除成功\n");
		return;
	}
}
//展示通讯录
void show(struct q1 *py)
{
	for (int i = 0; i < py->xx; i++)
	{
		printf("姓名:%s\n", py->arr[i].name);
		printf("性别:%s\n", py->arr[i].sex);
		printf("电话:%s\n", py->arr[i].phone);
	}
}

源代码

(1)头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct people
{
	char name[20];
	char sex[10];
	char phone[20];
};
struct q1
{
	int xx;
	struct people arr[1000];
};
enum gn
{
	Exit,
	Add,
	Del,
	Chaxun,
	Show,
};
void mune();
void add(struct q1*);
void show(struct q1*);
void chushihua(struct q1*);
int chaxun(struct q1*);
void del(struct q1*);

(2)头文件对应的源文件

#include"txl1.h"
void mune()
{
	printf("*********************************\n");
	printf("*****        通讯录1         *****\n");
	printf("*****1.add            2.del*****\n");
	printf("*****3.chaxun        4.show*****\n");
	printf("*****0.exit                 *****\n");
	printf("*********************************\n");
}
int chaxun(struct q1 *py)
{
	char s[20] = { 0 };
	printf("请输入查找联系人的姓名:");
	scanf("%s", s);
	for (int i = 0; i < py->xx; i++)
	{
		if (strcmp(s,py->arr[i].name) == 0)
		{
			printf("联系人姓名:%s", py->arr[i].name);
			printf("联系人电话:%s", py->arr[i].phone);
			return i;
		}
	}
	printf("未查找到联系人\n");
	return -1;
}
void add(struct q1 *py)
{
 	    printf("请输入联系人姓名:");
		scanf("%s", py->arr[py->xx].name);
		printf("请输入联系人性别:");
		scanf("%s", py->arr[py->xx].sex);
		printf("请输入联系人电话:");
		scanf("%s", py->arr[py->xx].phone);
	py->xx++;
}
void show(struct q1 *py)
{
	for (int i = 0; i < py->xx; i++)
	{
		printf("姓名:%s\n", py->arr[i].name);
		printf("性别:%s\n", py->arr[i].sex);
		printf("电话:%s\n", py->arr[i].phone);
	}
}
void chushihua(struct q1 *py)
{
	py->xx = 0;
	memset(py->arr, 0, sizeof(py->arr));
}
void del(struct q1 *py)
{
	int a=chaxun(py);
	if (a != (-1))
	{
		for (int i = a; i < py->xx - 1; i++)
		{
			py->arr[i] = py->arr[i + 1];
		}
		py->xx--;
		printf("删除成功\n");
		return;
	}
}

(3)main函数

#include"txl1.h"
int main()
{
	int input = 0;
	struct q1 wx1;
	//初始化
	chushihua(&wx1);
		do
	{
		mune();
		scanf("%d", &input);
		switch (input)
		{
		case Add:
			add(&wx1);
			break;
		case Del:
			del(&wx1);
			break;
		case Chaxun:
			chaxun(&wx1);
			break;
		case Show:
			show(&wx1);
			break;
		case Exit:
			break;
		default:
			break;

		}
	} while (input);
	return 0;
}

总结:对上面的静态通讯录做一个小结,它的缺陷在于只能存放1000个人的数据,可能会浪费空间,而且非常不好的地方在于,它在程序运行结束后保存的联系人信息就没了,那我还要这个通讯录做甚。但优点就是不用扩容,简单。


通讯录2(动态)

这个通讯录2就解决了上一个的版本的一个问题,就是内存是动态开辟的,不用直接开辟存1000个联系人的通讯录,我可以开辟存几个联系人的通讯录,如果内存不够了,我们可以阔容,增大通讯录的内存空间。

这次我们完成上一个版本的通讯录功能,再加入一个改变联系人信息的功能。

先给头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 3
enum gn//枚举常量
{
	EXIT,
	ADD,
	DEL,
	CHAXUN,
	SHOW,
	CHANGE,
};
struct people//联系人信息
{
	char name[10];
	char sex[20];
	char phone[20];
};
struct qq2//动态通讯录
{
	struct people *p;//动态联系人指针
	int sz;//存进去的联系人个数
	int capcity;//通讯录容量
};
void mune();
void chushihua(struct qq2 *);
void zenrong(struct qq2 *);
void add(struct qq2 *);
int chaxun(struct qq2 *);
void del(struct qq2 *);
void change(struct qq2*);
void show(struct qq2 *);	

main函数

#include"txl2.h"
int main()
{
	int input = 0;
	struct qq2 con;
	chushihua(&con);
	do
	{
		mune();
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			add(&con);
			break;
		case DEL:
			del(&con);
			break; 
		case CHAXUN:
			chaxun(&con);
			break;
		case SHOW:
			show(&con);
			break;
		case CHANGE:
			change(&con);
			break;
		case EXIT:
			break;
		}
	} while (input);
	return 0;
}

功能实现

#include"txl2.h"
void mune()
{
	printf("*********************************\n");
	printf("**********tongxunlv2*************\n");
	printf("********1.add *********2.del*****\n");
	printf("********3.chaxun*******4.show****\n");
	printf("********5.change*********0.exit**\n");
	printf("*********************************\n");
}
//初始化
void chushihua(struct qq2 *py)
{
	py->sz = 0;//有效联系人先置成0
	py->capcity = MAX;//初始容量为max=3,头文件有
    //动态开辟一块空间
	py->p = (struct people *)malloc(MAX*sizeof(struct people));
}
//扩容
void zenrong(struct qq2 *py)
{
    //先检查是否需要扩容
    //如果容量和有效联系人相等,说明空间满了
	if (py->capcity == py->sz)
	{
        //调整通讯录空间
		struct people *tmp = (struct people *) realloc(py->p, (py->capcity+2) * sizeof(struct people));
        //设一个tmp检查开辟空间是否成功
        //如果不为NULL,就说明开辟空间成功
		if (tmp != NULL)
		{
			py->capcity += 5;
			py->p = tmp;
		}
		else
		{
            //开辟不成功直接结束程序
			perror("通讯录内存不足\n");
			exit(1);
		}
	}
	else
		return;
}
//增加联系人
void add(struct qq2 *py)
{
    //先检验是否需要扩容
	zenrong(py);
    //输入联系人数据
	printf("请输入名字:");
	scanf("%s",py->p[py->sz].name);
	printf("请输入性别: ");
	scanf("%s",py->p[py->sz].sex);
	printf("请输入电话: ");
	scanf("%s",py->p[py->sz].phone);
	py->sz++;
	printf("增加成功\n");
}
//查找联系人
int chaxun(struct qq2 *py)
{
	char s[10] = { 0 };
	printf("请输入查找的联系人姓名:");
	scanf("%s", s);
    //查找成功返回下标
	for (int i = 0; i < py->sz; i++)
	{
		if (strcmp(s,py->p[i].name) == 0)
		{
			printf("%s\n", py->p[i].name);
			printf("%s\n", py->p[i].sex);
			printf("%s\n", py->p[i].phone);
			return i;
		}
	}
    //查找不成功返回-1
	printf("该联系人不存在\n");
	return -1;
}
//删除联系人
void del(struct qq2 *py)
{
	int set=chaxun(py);
	if (set>= 0)
	{
		for (int i = set; i < py->sz; i++)
		{
			py->p[i] = py->p[i+1];
		}
		py->sz--;
		printf("联系人已经删除\n");
		return;
	}
	else
	{
		return;
	}
	
}
//改变联系人
void change(struct qq2 *py)
{
	int ret = chaxun(py);
	if (ret >= 0)
	{
        //如果查找成功,就重新输入联系人信息
		printf("请输入联系人的新姓名:");
		scanf("%s", py->p[ret].name);
		printf("请输入联系人的性别:");
		scanf("%s", py->p[ret].sex);
		printf("请输入联系人的新电话:");
		scanf("%s", py->p[ret].phone);
	}
	return;
}
//展示通讯录信息
void show(struct qq2 *py)
{
	for (int i = 0; i < py->sz; i++)
	{
		printf("%s ", py->p[i].name);
		printf("%s ", py->p[i].sex);
		printf("%s ", py->p[i].phone);
		printf("\n");
	}
	return;
}

总结:这个版本的通讯录,通过创建动态数组的方式来减少内存的浪费,但是还有一个问题没解决,就是无法做到存储联系人,退出程序后联系人的信息没保存。


通讯录3(动态+储存)

如何才可以将通讯录的内容包存呢?我们需要利用文件来储存其信息,那就好办了,只要在程序开头录入文件已经存的联系人信息;在程序结束前,将联系人的信息存入文件中。这样就做到了联系人的存储。

头文件

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 3
//功能函数声明
void mune();
void chushihua(struct gg *pc);
void Add(struct gg * pc);
int Search(struct gg * pc);
void Del(struct gg* pc);
void Change(struct gg *pc);
void Show(struct gg * pc);
void Esc(struct gg *pc);
void baocun(struct gg * pc);
void luru(struct gg * pc);
void zenrong(struct gg * pc);
//一个联系人的信息
struct connact
{
	char name[20];
	char sex[5];
	char phone[30];
};
//通讯录声明
struct gg
{
	struct connact* data;
	int sz;
	int capacity;
};
//枚举常量
enum option
{
	esc,
	add,
	del,
	change,
	show,
	search,
};

main函数

#include"gg.h"
int main()
{ 
    //创建了通讯录 con
	struct gg con;
	int input=0;
	chushihua(&con);
    //调用录入文件信息函数
    luru(&con);
	do
	{
		mune();
		scanf("%d", &input);
		switch (input)
		{
		case add:
			Add(&con);
			break;
		case del:
			Del(&con);
			break;
		case change:
			Change(&con);
			break;
		case show:
			Show(&con);
			break;
		case search:
			Search(&con);
			break;
		case esc:
            //将联系人保存到文件中    
			baocun(&con);
			Esc(&con);
			break;
		}
	} while (input);
  return 0;
}

功能实现

#include"gg.h"4
//打印菜单
void mune()
{
	printf("*********************************\n");
	printf("*************通讯录**************\n");
	printf("*********************************\n");
	printf("***请选择:**********************\n");
	printf("****1.add  ***2.del***3.change **\n");
	printf("****4.show ***5.search***********\n");
	printf("****0.esc                        \n");
}
//增容
void zenrong(struct gg* pc)
{
	if (pc->sz == pc->capacity)
	{
		struct connact *str = (struct connact*)realloc(pc->data, (pc->capacity + 2)*sizeof(struct connact));
		if (str != NULL)
		{
			pc->data = str;
			pc->capacity += 2;
		}
		else
		{
			perror("通讯录内存不足");
			exit(1);
		}
	}
	
}
//录入文件里的信息
void luru(struct gg* pc)
{
    //创建一个文件指针并且打开文件
    //二进制只读信息
   	FILE *str = fopen("connact.txt", "rb");
    //判断文件是否打开成功,打开失败str为NULL
	if (NULL == str)
	{
		perror("fopencao");
		return;
	}
	struct connact tmp = { 0 };
    //一步步的将文件里的信息存到通讯录中
    //fread返回NULL时,循环结束,文件信息全部录完
	while (fread(&tmp, sizeof(struct connact), 1, str))
	{
		zenrong(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}
}
//初始化
void chushihua(struct gg* pc)
{
	pc->sz = 0;
	pc->data = (struct connact *)malloc(max*sizeof(struct connact));
	pc->capacity = max;
}
//查找联系人
int Search(struct gg * pc)
{ 
	int i = 0;
	char na[20] = { 0 };
	printf("请输入查找联系人的姓名:");
	scanf("%s", na);
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(na, pc->data[i].name) == 0)
		{
			printf("找到此联系人:\n");
			printf("姓名:%15s\n", pc->data[i].name);
			printf("性别:%15s\n", pc->data[i].sex);
			printf("电话:%15s\n", pc->data[i].phone);
			return i;
		}
	}
	return -1;
}
//添加联系人
void Add(struct gg* pc)
{
	        zenrong(pc);
	        printf("请输入名字:");
			scanf("%s", pc->data[pc->sz].name);
			printf("请输入性别: ");
			scanf("%s", pc->data[pc->sz].sex);
			printf("请输入电话: ");
			scanf("%s", pc->data[pc->sz].phone);
			pc->sz++;
			printf("增加成功\n");

}
//删除联系人
void Del(struct gg *pc)
{
	int a = Search(pc); int b;
	if (a >= 0)
	{
        //这里增加了一个防止误删的功能
		printf("请确认是否删除联系人\n");
		printf("删除请选1,取消删除请选0\n");
		scanf("%d", &b);
		if (b == 1)
		{
			for (int i = a; i < pc->sz - 1; i++)
			{
				pc->data[i] = pc->data[i + 1];
			}
			pc->sz--;
			printf("删除成功\n");
		}
		else
		{
			return;
		}
	}
	else
	{
		printf("此联系人不存在\n");
	}
}
//改变联系人
void Change(struct gg* pc)
{
	struct connact tmp = { 0 };
	int a = Search(pc);
	if (a >= 0)
	{
		printf("请修改;\n");
		printf("请输入新名字: ");
		scanf("%s", tmp.name);
		printf("请输入新性别: ");
		scanf("%s", tmp.sex);
		printf("请输入新电话: ");
		scanf("%s", tmp.phone);
		pc->data[a] = tmp;
		printf("修改成功\n");
	}
	else
	{
		printf("此联系人不存在\n");
	}
}
//展示通讯录
void Show(struct gg* pc)
{
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%15s %15s %15s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].phone);
	}
}
//退出通讯录
void Esc(struct gg*pc)
{
    //释放储存联系人的空间
	free(pc->data);
    //将释放完的指针设为NULL
	pc->data = NULL;
    //将容量和有效联系人置为0
	pc->capacity = 0;
	pc->sz = 0;
}
//将联系人信息存到文件中
void baocun(struct gg*pc)
{
    //打开文件,只写(二进制写)
	FILE *str = fopen("connact.txt", "wb");
    //判断是否打开成功
	if (str == NULL)
	{
		perror("fopen");
		return;
	}
    //将已有联系人的信息依次写入文件中
	for (int i = 0; i < pc->sz; i++)
	{
		fwrite(pc->data + i, sizeof(struct connact), 1, str);
	}
    //关闭文件
	fclose(str);
	str = NULL;
}

==总结:==这个版本的通讯录就挺好,它可以将联系人的信息储存,并且空间也不浪费。

代码运行如下

(1)添加联系人并展示
在这里插入图片描述
(2)删除联系人并展示
在这里插入图片描述
(3)改变联系人信息并展示
在这里插入图片描述
(4)查找联系人
在这里插入图片描述
(5)退出程序,在打开看看数据是否保存
在这里插入图片描述
可以发现数据以及被储存了。

(6)看看文件里面的信息
在这里插入图片描述
这是二进制文件,里面存的是二进制码,我们不太能看懂。


这就是本章内容了,希望大家有所收获!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言实现的 通讯录管理系统 的相关文章

  • 动态路由-BGP的基础配置

    一 给每个路由器配置ip地址 AR6 1 1 添加ip地址 interface GigabitEthernet0 0 0 ip address 1 1 1 1 255 255 255 0 2 配置BGP对等体 bgp 100 配置bgp的A
  • 使用PyQt(Python+Qt)+moviepy开发的视频截取、音视频分离、MP4转GIF动图工具免费下载分享

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 在因博文素材需要将软件操作制作成动画时 发现网上相关绿色使用工具都需要注册 否则动态上就会打上各种LOGO 无
  • C++ 类成员指针

    1 成员指针简介 成员指针是C 引入的一种新机制 它的申明方式和使用方式都与一般的指针有所不同 成员指针分为成员函数指针和数据成员指针 2 成员函数指针 在事件驱动和多线程应用中被广泛用于调用回调函数 在多线程应用中 每个线程都通过指向成员

随机推荐

  • IIS错误页面隐藏版本信息 - Web.Config customErrors配置

    目录 背景 分析暴露原因 解决办法 扩展学习customErrors使用方法 customErrors元素配置结构 元素属性 Mod 属性选项 示例 参考文章 背景 项目现按照国网的要求 测试后发现系统错误页面存在服务器版本号泄露 不允许部
  • Java Servlet的主要功能和作用是什么?

    Servlet 通过创建一个框架来扩展服务器的能力 以提供在 Web 上进行请求和响应服务 当客户机发送请求至服务器时 服务器可以将请求信息发送给 Servlet 并让 Servlet 建立起服务器返回给客户机的响应 当启动 Web 服务器
  • Kali Linux 2020.1修改Root用户密码

    背景信息 多年以来 Kali从BackTrack继承了默认的root用户策略 作为对Kali工具和策略的评估的一部分 因此Kali 决定对此进行更改 并将Kali移至 传统默认非根用户 模型 那如果我们因某些情况想开启Root用户这应该如何
  • facebook stetho Android调试工具

    什么是Stetho 官网简介 Stetho is a debug bridge for Android applications enabling the powerful Chrome Developer Tools and much m
  • 如何利用matlab神经网络进行水量预测

    数据收集 百度搜索EPS数据库登陆 我们选择进入城市数据库 我们的目的是要进行某年水量预测 我们的目的是知道了某一年的土地 人口等信息 就可以预测出该年的用水量 因此我们需要搜集一些信息用来训练 可以多选几年如2003 2017 然后点击下
  • 13 集成测试之自顶向下集成测试方法

    自顶向下集成测试方法 前言 深度优先集成方法 宽度优先集成方法 总结 前言 自顶向下集成方法可以采取深度优先或者宽度优先策略 深度优先集成方法 深度优先从最左边分支自上而下开始测试并向上结合 测试完一个分支后再测试下一个分支 如图测试顺序为
  • 渗压计工作原理及选型

    渗压计适合埋设在水工建筑物和基岩内 或安装在测压管 钻孔 堤坝 管道或压力容器中 以测量孔隙水压力或液位 主要部件均采用特殊钢材制造 适合在各种恶劣环境中使用 一般型号后缀为标准型 可以为低量程型和为通气 差压 型 另可根据客户要求提供高压
  • Hypertable 简介 一个 C++ 的Bigtable开源实现

    1 Introduction 随着互联网技术的发展 尤其是云计算平台的出现 分布式应用程序需要处理大量的数据 PB级 在一个或多个云计算平台中 成千上万的计算主机 如何保证数据的有效存储和组织 为应用提供高效和可靠的访问接口 并且保持良好的
  • scss中的样式复用:继承;占位符;混合宏

    文章目录 一 使用 extend实现样式复用 继承 二 使用占位符实现样式复用 占位 三 使用混合宏实现样式复用 混合宏 四 参数运算符 待更新 类名复用 未验证 待更新 react中使用sass 了解css in js解决方案 在reac
  • 【Pandas 数据查找函数 详解】

    本文介绍了Pandas数据查找常用函数 掌握了这些函数的应用 让你在数据处理时 手到擒来 游刃有余 目录 一 查找数据位置 s str find 和s str index 函数 二 数据的查找判断 1 判断开头或结尾是否是指定字符串s st
  • 保姆级Obsidian学习教程【超完整,小白必备】

    前言 本篇文章学习视频来源 沙牛obsidian优质课程 学 习 软 件 obsidian 课 程 对 应 资 源 云盘资源 说 明 Obsidian是基于Markdown文件的本地知识管理软件 并且开发者承诺Obsidian对于个人使用者
  • java integer long 转换_long(Long)与int(Integer)之间的转换

    1 将long型转化为int型 这里的long型是基础类型 long a 10 int b int a 2 将Long型转换为int 型的 这里的Long型是包装类型 Long a 10 int b a intValue 3 将Long型转
  • 编译GDB --enable-targets=all --enable-64-bit-bfd

    这次尝试才用一种新的BLOG发帖 大家都可以把要发到BLOG的文章投递到MAILLIST 然后大家REVIEW 等REVIEW的差不离了 再发到BLOG上 欢迎大家帮忙review 编译GDB teawater hellogcc 1 取得源
  • 2.1python中的赋值运算符和比较运算符

    在程序中 使用赋值运算符可以帮助我们更加高效的完成一些需要多行程序完成的工作 使用比较运算符可以让程序员通过比较更加明白所编程序是否与自己的所思考的相同 1 首先 我们先看一下赋值运算符的具体内容 如下 赋值运算符符号 含义 a b b a
  • 微信H5(公众号)跳转微信小程序实现及其传参

    1 使用微信开放标签 wx open launch weapp 跳转
  • Linux车机平台pulseaudio多alsasink配置

    https www freedesktop org wiki Software PulseAudio 官网上的介绍是这样的 pulseaudio 是一个POSIX操作系统上的声音系统 是音频应用的代理 它允许你对音频数据 在从应用传递到硬件
  • Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • 【java】maven引用外部 jar 包,以RXTXcomm.jar为例

    目录 1 作为资源文件夹内的资源引用 2 将jar包手动安装到maven仓库 工具 IntelliJ IDEA 2020 2 3 x64 1 作为资源文件夹内的资源引用 1 在项目根路径新建文件夹lib 将资源文件复制到该文件夹 2 将文件
  • python处理压缩文件

    Zip 模块安装 pip install zipfile 使用 import zipfile 打开zip文件 zipfileObj zipfile ZipFile tmp zip with上下文 with zipfile ZipFile t
  • C语言实现的 通讯录管理系统

    通讯录 C语言实现 文章目录 通讯录1 静态 通讯录2 动态 通讯录3 动态 储存 前言 本文讲解如何用C语言来创建一个通讯录 这是一个小项目 非常适合新手上手 同时也可以提高自己的代码能力 里面用到了 结构体传参 枚举常量 文件 动态内存