C语言小项目——通讯录

【C语言】实战项目——通讯录 学会创建一个通讯录,对过往知识进行加深和巩固。 阅读详情

一、项目要求

请添加图片描述

在学习了结构体、动态内存管理以及文件操作的相关知识后,我们可以根据以上基本要求来分别设计三个版本的通讯录,分别是静态版、动态版和文件版

静态版:是最基础的版本,能满足对通讯录内部联系人的增删查改、对联系人按姓名,年龄,电话或住址进行排序、显示通讯录中所有联系人、退出通讯录。

动态版:动态版的通讯录能满足静态版通讯录的所有功能,但是内部实现由固定大小改为动态增容;

文件版:文件版的通讯录能满足动态版通讯录的所有功能,但是会在程序退出时把联系人信息保存在文件中,在程序运行时把文件中的联系人信息加载到通讯录中;

  • 设计框架

我们把项目封装在三个源文件中:

test.c:通讯录的总体逻辑,主要用于对通讯录各功能的测试;

contact.c:通讯录各种功能的具体实现;

contact.h:各种必要的声明,包括库函数头文件的声明、自定义结构的声明以及自定义函数的声明;

二、静态版通讯录

1. 结构体设计

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_NAME 10 //宏定义各种联系人信息变量的大小,方便以后修改
#define MAX_SEX 3
#define MAX_TELE 12 
#define MAX_ADDR 10
#define MAX_CAP 100 //通讯录容量

typedef struct peoinfo //联系人
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}peoinfo;

typedef struct con  //通讯录
{
	peoinfo data[MAX_CAP];
	int sz;  //通讯录实际联系人数目
}contact;

2、初始化通讯录

我们可以使用前面学习的 memset 函数来b把通讯录中存放联系人信息的数组的内容全部初始化为0,然后再把用于实际联系人数量置为0,完成通讯录的初始化

void InitContact(contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

3、添加联系人信息

这里由于通讯录大小是固定的,所以我们在添加联系人的时候要注意检查通讯录是否已满,如果没满才能正常添加,满了就打印提示信息并直接 return。

void AddContact(contact* pc)
{
	if (pc->sz == MAX_CAP)
	{
		printf("通讯录已满,不能添加联系人!\n");
		return;
	}
	printf("请输入添加联系人的姓名:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入添加联系人的年龄:");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入添加联系人的性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入添加联系人的电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入添加联系人的住址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功!\n");
}

4、删除联系人信息

这里有两个需要注意的地方:一是需要检查通讯录是否为空,如果为空提示后直接返回;二是我们要检查我们希望删除的这个人是否存在,所以我们需要设计一个 FindByName 函数来查找联系人,根据函数的结果来进行后续操作。

int FindByName(const contact* pc, char* name)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void DelContact(contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("请输入你要删除的联系人:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在!\n");
		return;
	}
	for (int i = pos; i < MAX_CAP - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功!\n");
}

5、查找联系人(按姓名)

这里也需要调用 FindByName 函数来查找联系人,如果我们查找到了就返回该联系人所在位置的下标,但是如果找不到我们应该返回一个无意义的数,比如-1,因为数组是从0下标开始的,我们所查找的联系人可能在0位置处。

int FindByName(const contact* pc, char* name)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void SearchContact(const contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入你要查找的联系人:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("你要查找的人不存在!\n");
		return;
	}
	printf("%-10s %-5d %-5s %-15s %-10s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
}

6、修改联系人信息

int FindByName(const contact* pc, char* name)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void ModifyContact(contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入你要修改的联系人:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	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].tele);
	printf("请输入新联系人的住址:");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功!\n");
}

7、排序联系人(自选属性)

我们可以通过调用 qsort 函数,然后给定排序规则来实现对联系人信息的排序,这里实现出了除性别以外所有属性的排序方法的函数(毕竟正常人可不会按性别排序),然后将其放入函数指针数组中,最后通过回调函数的方式实现任意方式的排序。

void menu1()
{
	printf("*****************************\n");
	printf("***** 0. name  1. age  ******\n");
	printf("***** 2. tele  3. addr ******\n");
	printf("*****************************\n");
}

enum cau
{
	NAME,
	AGE,
	TELE,
	ADDR
};

int cmp_age(const void* a, const void* b)
{
	return (*(peoinfo*)a).age - (*(peoinfo*)b).age;
}

int cmp_name(const void* a, const void* b)
{
	char* s1 = ((peoinfo*)a)->name;
	char* s2 = ((peoinfo*)b)->name;
	return strcmp(s1, s2);
}

int cmp_tele(const void* a, const void* b)
{
	char* s1 = ((peoinfo*)a)->tele;
	char* s2 = ((peoinfo*)b)->tele;
	return strcmp(s1, s2);
}

int cmp_addr(const void* a, const void* b)
{
	char* s1 = ((peoinfo*)a)->addr;
	char* s2 = ((peoinfo*)b)->addr;
	return strcmp(s1, s2);
}

void SortContact(contact* pc)
{
	menu1();
	int input = 0;
	int (*p[4])(const void*, const void*) = { cmp_name, cmp_age, cmp_tele, cmp_addr };//函数指针数组
	while (1)
	{
		printf("请选择以什么属性排序:> ");
		scanf("%d", &input);
		if (input == 0 || input == 1 || input == 2 || input == 3)
		{
			qsort(pc->data, pc->sz, sizeof(pc->data[0]), p[input]);
			printf("排序成功!\n");
			return;
		}
		else
		{
			printf("输入错误,请重新输入!\n");
		}
	}
}

8、显示所有联系人信息

void ShowContact(const contact* pc)
{
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-10s %-5d %-5s %-15s %-10s\n", 
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

9、完整代码

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_NAME 10
#define MAX_SEX 3
#define MAX_TELE 12 
#define MAX_ADDR 10
#define MAX_CAP 100

typedef struct peoinfo //联系人
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}peoinfo;

typedef struct con  //通讯录
{
	peoinfo data[MAX_CAP];
	int sz;
}contact;


//初始化通讯录
void InitContact(contact* pc);


//增加联系人
void AddContact(contact* pc);


//查看通讯录
void ShowContact(const contact* pc);


//删除联系人
void DelContact(contact* pc);


//查找联系人
void SearchContact(const contact* pc);


//修改联系人
void ModifyContact(contact* pc);


//对通讯录排序
void SortContact(contact* pc);

contact.c

#include"contact.h"

void InitContact(contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

void AddContact(contact* pc)
{
	if (pc->sz == MAX_CAP)
	{
		printf("通讯录已满,不能添加联系人!\n");
		return;
	}
	printf("请输入添加联系人的姓名:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入添加联系人的年龄:");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入添加联系人的性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入添加联系人的电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入添加联系人的住址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功!\n");
}

void ShowContact(const contact* pc)
{
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-10s %-5d %-5s %-15s %-10s\n", 
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

int FindByName(const contact* pc, char* name)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void DelContact(contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("请输入你要删除的联系人:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在!\n");
		return;
	}
	for (int i = pos; i < MAX_CAP - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功!\n");
}

void SearchContact(const contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入你要查找的联系人:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("你要查找的人不存在!\n");
		return;
	}
	printf("%-10s %-5d %-5s %-15s %-10s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
}

void ModifyContact(contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入你要修改的联系人:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	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].tele);
	printf("请输入新联系人的住址:");
	scanf("%s", pc->data[pos].addr);
	printf("修改成功!\n");
}

void menu1()
{
	printf("*****************************\n");
	printf("***** 0. name  1. age  ******\n");
	printf("***** 2. tele  3. addr ******\n");
	printf("*****************************\n");
}

enum cau
{
	NAME,
	AGE,
	TELE,
	ADDR
};

int cmp_age(const void* a, const void* b)
{
	return (*(peoinfo*)a).age - (*(peoinfo*)b).age;
}

int cmp_name(const void* a, const void* b)
{
	char* s1 = ((peoinfo*)a)->name;
	char* s2 = ((peoinfo*)b)->name;
	return strcmp(s1, s2);
}

int cmp_tele(const void* a, const void* b)
{
	char* s1 = ((peoinfo*)a)->tele;
	char* s2 = ((peoinfo*)b)->tele;
	return strcmp(s1, s2);
}

int cmp_addr(const void* a, const void* b)
{
	char* s1 = ((peoinfo*)a)->addr;
	char* s2 = ((peoinfo*)b)->addr;
	return strcmp(s1, s2);
}

void SortContact(contact* pc)
{
	menu1();
	int input = 0;
	int (*p[4])(const void*, const void*) = { cmp_name, cmp_age, cmp_tele, cmp_addr };//函数指针数组
	while (1)
	{
		printf("请选择以什么属性排序:> ");
		scanf("%d", &input);
		if (input == 0 || input == 1 || input == 2 || input == 3)
		{
			qsort(pc->data, pc->sz, sizeof(pc->data[0]), p[input]);
			printf("排序成功!\n");
			return;
		}
		else
		{
			printf("输入错误,请重新输入!\n");
		}
	}
}

test.c

#include"contact.h"

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

enum OPTION
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};

void test()
{
	contact con;
	InitContact(&con);
	menu();
	int input = 0;
	do
	{
		printf("请选择:> ");
		scanf("%d", &input);
		switch (input)
		{
			case ADD:
				AddContact(&con);
				break;
			case DEL:
				DelContact(&con);
				break;
			case SEARCH:
				SearchContact(&con);
				break;
			case MODIFY:
				ModifyContact(&con);
				break;
			case SHOW:
				ShowContact(&con);
				break;
			case SORT:
				SortContact(&con);
				break;
			case EXIT:
				printf("退出成功!\n");
				return;
				break;
			default:
				printf("输入有误,请重新输入!\n");
				break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

三、动态版通讯录

我们发现静态版的通讯录存在一个缺陷,那就是数组大小是固定的,导致当我们联系人比较少的时候会造成空间浪费,联系人比较多的时候又存储不下;所以我们通过把静态版通讯录改造成动态版通讯录来解决空间浪费与不足的问题;

动态版通讯录与静态版通讯录的实现基本相同,只是把静态数组变成了动态数组,相应需要改变的函数有:通讯录结构体、初始化函数、增加联系人的函数(需要判断是否需要增容),需要增加的函数有:检查容量函数(容量满了就增容)

1、结构体设计

存放联系人信息的结构体不变,需要改动的是通讯录结构体,我们在静态版通讯录结构体中定义了一个固定大小的联系人结构体数组,用于存放联系人信息,但是现在我们用将其改为动态增容的,所以我们需要定义一个联系人指针变量,指向动态开辟的一块空间,来存放联系人信息;同时,我们还需要一个capacity变量,来记录当前通讯录的容量,如果当前联系人数量与其相等,我们就增容。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_NAME 10
#define MAX_SEX 3
#define MAX_TELE 12 
#define MAX_ADDR 10
#define INIT_LEN 3  //初始容量
#define EXPAN_LEN 2 //每次扩容的大小

typedef struct peoinfo //联系人
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}peoinfo;

typedef struct con
{
	peoinfo* data;
	int sz;
	int capacity;
}contact;

2、初始化通讯录

我们可以使用 malloc 函数来为 date 指针开辟空间,然后再使用 memset 函数将其内容全部初始化为0,我们也可以使用 calloc 函数,在开辟空间的同时把内存初始化为0。

void InitContact(contact* pc)
{
	pc->data = (peoinfo*)malloc(INIT_LEN * sizeof(peoinfo));
	if (pc->data == NULL)
	{
		perror("InitContact");
		return;
	}
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
	pc->capacity = INIT_LEN;
}

3、检查通讯录容量

比较通讯录结构体中的实际联系人数量和当前通讯录容量,如果二者相等,就使用 realloc 函数对通讯录进行扩容,这里我们一次扩容两个。

int Expansion(contact* pc)
{
	peoinfo* temp = (peoinfo*)realloc(pc->data, sizeof(peoinfo) * (EXPAN_LEN + pc->capacity));
	if (temp == NULL)
	{
		perror("Expansion:");
		return -1;
	}
	pc->data = temp;
	pc->capacity += EXPAN_LEN;
	return 1;
}

4、销毁通讯录

void DestroyContact(contact* pc)
{
	assert(pc);
	free(pc->data);   //释放date指向的空间
	pc->data = NULL;  //把date置空,避免出现野指针
}

6、完整代码

动态版通讯录的完整代码我放在 Gitee 上了,有需要的可以自取

动态版通讯录

四、文件版通讯录

我们发现动态版的通讯录存在一个缺陷,那就是我们的联系人信息并没有持久化,每次我们程序重新运行的时候都需要重新添加联系人;

我们可以通过把动态版通讯录改造成文件版通讯录来解决联系人信息存储问题;

文件版通讯录在动态版的基础上增加了两个步骤:一是在销毁通讯录之前把联系人信息存放到 contact.txt 文件中,避免程序退出后联系人信息丢失;二是在初始化通讯录后,把 contact.txt 文件中的联系人信息加载到通讯录中;相应需要增加的函数有:加载联系人信息函数、保存联系人信息函数。

1. 保存联系人

void SaveContact(contact* pc)
{
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		printf("保存失败!\n");
		return;
	}
	size_t ret = fwrite(pc->data, sizeof(peoinfo), pc->sz, pf);
	if (ret == pc->sz)
	{
		printf("保存成功!\n");
	}
	fclose(pf);
	pf = NULL;
}

2. 加载联系人信息

int Expansion(contact* pc)
{
	peoinfo* temp = (peoinfo*)realloc(pc->data, sizeof(peoinfo) * (EXPAN_LEN + pc->capacity));
	if (temp == NULL)
	{
		perror("Expansion:");
		return -1;
	}
	pc->data = temp;
	pc->capacity += EXPAN_LEN;
	return 1;
}

void LoadContact(contact* pc)
{
	FILE* pfread = fopen("contact.txt", "rb");
	if (pfread == NULL)
	{
		perror("fopen");
		printf("初始化失败!\n");
		return;
	}
	peoinfo temp = { 0 };
	while (fread(&temp, sizeof(peoinfo), 1, pfread) == 1)
	{
		pc->data[pc->sz] = temp;
		pc->sz++;
		if (pc->sz == pc->capacity)
		{
			Expansion(pc);
		}
	}
	printf("初始化成功!\n");
	fclose(pfread);
	pfread = NULL;
}

3. 完整版代码

文件版通讯录的完整代码我放在 Gitee 上了,有需要的可以自取

文件版通讯录

C语言实现的简易通讯录项目 C语言,作为一种高效、灵活的编程语言,它的历史可追溯至1969年,由贝尔实验室的Dennis Ritchie设计。由于其高效性、灵活性以及接近硬件操作的能力,C语言迅速成为系统编程和应用开发的重要选择。函数是C语言执行特定任务的代码块。定义函数时,需要指明返回类型、函数名和参数列表。函数调用则意味着将执行权交予该函数。// 定义函数// 调用函数通过本章的学习,我们对C语言有了初步的了解,包括其发展历程、主要特点、基本语法结构以及控制结构等。为后续深入学习数据结构和编程实践奠定了基础。 阅读详情

相关推荐

基于JavaFX的Http Server模拟器

源码地址 GitHub - DayRain/http-server-simulator: http server 模拟器 功能描述 HttpServer模拟器,通过简单的配置即可模拟第三方服务端,用于接收和响应HTTP请求。 支持同时模拟多个服务、动态添加接口、动态配置返回值。 使用说明 运行 exe运行 编译代码后,点击exe直接运行 代码运行 下载好代码后,运行主类ApplicationStarter即可 新建服务 主界面如下 点击 文件-新建 创建新的服务 ...

小楼夜听雨的博客 2534

【C语言实战项目】通讯录

C语言实战项目之通讯录程序万字详解.

C/C++领域,数据结构,linux,MySQl学习者 4685

Logisim 原码一位乘法器设计 图解及代码(计算机组成原理)

Logisim 原码一位乘法器设计 图解及代码(计算机组成原理) 包对

醉蕤的博客 4375

通讯录项目(用c语言实现)

它是一种电子化的地址簿,用于记录和管理个人、机构或组织的联系方式,如姓名、电话号码、电子邮件地址和邮寄地址等。通讯录的目的是方便用户在需要时查找和联系他人。通讯录通常以列表或表格的形式呈现,每个条目代表一个联系人。用户可以根据联系人的姓名、公司、职位或其他标识符来组织和排序通讯录。随着技术的发展,通讯录也可以与其他应用程序、设备或云服务同步,以确保联系人信息的备份和共享。通讯录在个人生活和商业环境中都非常有用。个人可以使用通讯录存储家庭成员、朋友、同事和其他重要联系人的信息,以便随时与他们保持联系。

z6665454的博客 1457

10分钟训练你的AI歌手:RVC WebUI声音克隆保姆级教程

本文提供了一份详细的RVC WebUI声音克隆保姆级教程,指导用户如何在10分钟内利用Retrieval-based-Voice-Conversion技术训练专属AI歌手。教程涵盖从环境配置、数据准备、模型训练到最终推理应用的全流程,即使是新手也能快速上手,实现高质量的声音克隆与歌曲生成。

weixin_29073241的博客 818

文石NoteX3国行版安装 Google Play经验分享

文石NoteX3国行版安装 Google Play经验分享。

2301_80693261的博客 7594

C语言—顺序表(含通讯录项目)

C语言—顺序表(含通讯录项目)

2302_81120572的博客 3566

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 281

C语言实现通讯录项目

C语言实现通讯录项目

weixin_52345097的博客 876

LightningChart使用教程:创建 JS 散点图

这是对 LightningChart JS XY 图表一些有趣功能的快速技术研究,以及如何使用 LightningChart JS 创建嵌入式散点聊天和添加自定义交互。 此图表将可视化一个 XY 坐标列表以及一个额外的自定义属性,它只是一段文本。这些自定义属性将与 UI 文本元素一起显示,这些元素将与用户的鼠标移动交互。 我们将介绍的突出功能是: 什么是散点图? 如何创建散点图? 如何将自定义属性附加到数据点。 如何创建交互式 UI 文本元素。 最终结果 什么是散点图? 散点图或散点图是..

Augenstern__zyx的博客 1370

基于YOLO11深度学习的糖尿病视网膜病变智能诊断系统【Python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍如何利用YOLO11深度学习技术构建糖尿病视网膜病变智能诊断系统。项目提供完整的Python源码、PyQt5图形界面、标注数据集及训练代码,实现从图片、视频到摄像头的多模态病变检测,旨在辅助医疗筛查,提升诊断效率。

weixin_29089057的博客 277

【C语言进阶】【小项目】实现一个通讯录【C语言知识点汇总项目】通过这个项目,掌握C语言重要知识点

【C语言项目】包含C语言学习阶段大部分知识点,巩固扎实C语言编程,干货满满的宝藏级别详解通讯录的实现,错过必后悔系列篇~

系统编程、网络编程 5343

20、超声多普勒成像技术全解析

本文全面解析了超声多普勒成像技术,涵盖彩色血流成像(CFI)、能量多普勒成像、超快多普勒成像和矢量多普勒成像的原理、流程、优势及临床应用场景。详细探讨了各成像模式的特点,如CFI的血流方向与速度可视化、能量多普勒对小血管的高灵敏度、超快多普勒的高帧率分析能力,以及矢量多普勒消除角度依赖性的创新方法。同时分析了技术面临的挑战及未来发展趋势,包括更高分辨率、人工智能辅助诊断和便携式设备的发展,为医学影像研究和临床诊断提供重要参考。

z2a3b4c5d的博客 277

通讯录项目(C语言基于顺序表)

之前的通讯录是int的数据类型,但是现在我们要存储的内置类型,所以需要在contact头文件当中进行声明这个结构体(即包含的联系人的数据)//定义联系人数据//姓名,性别,年龄,电话,地址int age;}peoInfo;现在有了联系人的结构体的一个数据,所以需要对之前的int进行相应的替换,但是在此时他是找不到我们之前定义的那个结构体的,我们在循序表的头文件当中加上现在的这个头文件便不会有报错的情况。这个是顺序表的当中代码的修改部分。

2302_81290080的博客 933

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C语言 【通讯录项目】

联系人自定义排序就是可以按照用户的需求进行排序,例如按照名字首字母的顺序、年龄的大小等联系人拥有的信息进行排序。C 语言 【排序算法---qsort()】-优快云博客//按年龄升序排序printf("已完成排序!\n");运行结果:到这里一个简易的通讯录就已经完成了,喜欢的读者请一键三连!

qq_70199082的博客 944

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C语言通讯录小项目(含分布详解)

10002051230这些宏定义用于设置通讯录的最大容量以及联系人各信息字段的最大长度。MAX 表示通讯录最多能存储 1000 条联系人信息,MAX_NAME 表示联系人姓名的最大长度为 20 个字符,以此类推。使用宏定义可以方便修改代码中的数值。int age;定义结构体用于存储单个联系人的信息,包括姓名、年龄、性别、电话号码和地址。新手在学习,上述代码如有不足请多多指教!

2403_85788277的博客 1044

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言顺序表实践项目:通讯录

本次我们实现了基于动态顺序表的通讯录项目,实现了通讯录的增删查改等操作 ,并添加了相关的文件操作的功能。

0xFFFFFFFF 1429

通讯录(C语言练手小项目)1

首先,新建项目,创3个源文件,分别为test.c , contact.c , contact.h。contact. c 通讯录相关的实现。contact. h 通讯录相关的声明。这是静态版本,后面会有动态版本。test. c 测试功能。

2402_83411382的博客 1390

C语言小项目--通讯录的实现

今天给大家带来的是通讯录的一个小项目。其中包括通讯录的初始化、增加、显示、删除、查找、修改、排序功能! 这里写目录标题一级目录二级目录三级目录 一级目录 二级目录 三级目录

姜守威的博客 1347

(C语言)静态通讯录(正式版)(C语言小项目)

(C语言)静态通讯录(正式版)(C语言小项目)

2302_78101238的博客 1438

C语言实战小项目——通讯录3.0

可实现文件保存的通讯录的实现 ——接上篇2.0版本动态通讯录的优化3.0版本 C语言实战小项目——通讯录2.0—— 博客入口 文章目录可实现文件保存的通讯录的实现一、优化改进部分(1)添加文件保存功能(2)初始化加载文件信息二、整体代码展示1.test.c 通讯录主体框架测试文件2.contact.c 通讯录函数文件3.contact.h 宏定义及函数声明文件小结完! 一、优化改进部分   在上次的2.0版本中,我们已经拥有了可实现动态内存操作的通讯录版本,但是每次当我们输入数据,展示数据,退出之后

rain67的博客 3749

欢迎走进C语言-(通讯录小项目)

很多细心地小伙伴已经发现了,我们在打开文件和增加成员的函数中都调用了增容函数会不会有冲突,导致多次增容呢,其实,仔细想一想我们在程序执行的时候只调用一次初始化函数,在获取数据的时候会不会出现数据大于我们申请的空间,我们是不是需要申请空间用于加载我们的数据,以免数据丢失。我们有了增加成员的函数,为了验证我们写的函数是否有问题,我们可以写一个显示成员函数,将我们存入的数据打印出来,来判断我们写的是否正确。那如果有一天我们存入的人员惹我们不高兴了,我们想跟他们同归于尽或者销毁他们,我们能做到吗,

freedom_paradise的博客 671

c语言通讯录项目

关于通讯录项目c语言的实现方法

m0_73961454的博客 913

C语言 零基础帮你快速了解【单链表结构】—— 通讯录项目

本篇博客将介绍如何使用C语言和单链表数据结构来实现一个简单而功能强大的通讯录管理系统。通过这个项目,我们将学习如何在C语言中利用数据结构来组织和管理大量的联系人信息,以及如何实现基本的增加、删除、查找和修改功能。

m0_74951730的博客 997

C语言 通讯录项目动态版本 容量可增加

通讯录 C语言 动态

ainuliba的博客 477

(C语言)静态通讯录(测试版)(C语言小项目)

(C语言)静态通讯录(测试版)(C语言小项目)

2302_78101238的博客 1524
上一篇: C语言文件操作
下一篇: C语言程序环境和预处理
岸边露伴'
博客等级 码龄3年 2粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值