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

news2024/11/24 5:32:00

一.什么是通讯录

通讯录是一种用于存储联系人信息的工具或应用程序。它是一种电子化的地址簿,用于记录和管理个人、机构或组织的联系方式,如姓名、电话号码、电子邮件地址和邮寄地址等。通讯录的目的是方便用户在需要时查找和联系他人。

通讯录通常以列表或表格的形式呈现,每个条目代表一个联系人。用户可以根据联系人的姓名、公司、职位或其他标识符来组织和排序通讯录。随着技术的发展,通讯录也可以与其他应用程序、设备或云服务同步,以确保联系人信息的备份和共享。

通讯录在个人生活和商业环境中都非常有用。个人可以使用通讯录存储家庭成员、朋友、同事和其他重要联系人的信息,以便随时与他们保持联系。在商业环境中,通讯录可以用于管理客户、供应商、合作伙伴和员工的联系信息,以便进行业务沟通和合作。

现代的通讯录应用程序通常具有许多高级功能,如快速搜索、批量导入和导出、分组管理、标签和备注、生日提醒、备份和恢复等。这些功能使通讯录更加强大和便捷,满足用户日常联系和管理联系人的需求。

二.通讯录的功能(简易)

1.允许用户添加、编辑和删除联系人信息,包括姓名、电话号码、电子邮件地址、邮寄地址等。

2.快速搜索:提供快速搜索功能,让用户可以根据姓名、公司、职位或其他标识符快速查找特定的联系人。

三.通讯录的函数实现

关于顺序表的补充:

typedef  PeoInfo SLDataType;
typedef struct SeqList
{
	SLDataType* a;
	int size;
	int capacity;
}SL;

用户的信息:

//前置声明
struct SeqList;
typedef struct SeqList contact;
//用户数据
typedef struct PersonInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

实现通讯录项目需要的代码比较多,我们要使用分文件编写。具体内容我就不再赘述了,如果你还有疑问,可以去看我之前发的扫雷项目。

还有要注意的是此项目是基于顺序表封装,如果对顺序表有疑问,请看我的上一篇文章。

1.初始化联系人列表

程序开始时,可以初始化一个空的联系人列表。InitContact(contact* con):初始化通讯录函数。它接受一个指向contact结构体的指针,通过调用SLInit函数初始化通讯录列表,并打印初始化成功的消息。

//初始化通讯录
void SLInit(SL* ps)
{
	assert(ps);
	ps->a = (SLDataType*)malloc(INIT_CAPACITY * sizeof(SLDataType));
	assert(ps->a);
	ps->size = 0;
	ps->capacity = INIT_CAPACITY;
}
void InitContact(contact* con)
{
	SLInit(con);
	printf("通讯录初始化成功!\n");
}

2.添加联系人

用户可以输入联系人的姓名和电话号码,程序将该联系人添加到列表中。AddContact(contact* con):添加通讯录数据函数。它接受一个指向contact结构体的指针,通过用户输入获取姓名、年龄、性别、电话和地址信息,并调用SLPushBack函数将该联系人信息添加到通讯录列表中,最后打印添加成功的消息。

//添加通讯录数据
void AddContact(contact* con)
{
	PeoInfo x = { 0 };
	printf("请输入姓名\n");
	scanf("%s", x.name);
	printf("请输入年龄\n");
	scanf("%d", &x.age);
	printf("请输入性别\n");
	scanf("%s", x.sex);
	printf("请输入电话\n");
	scanf("%s", x.tel);
	printf("请输入地址\n");
	scanf("%s", x.addr);
	SLPushBack(con, x);
	printf("添加成功!\n");
}

3.删除联系人

用户可以输入要删除的联系人的姓名,程序将在列表中查找并删除该联系人的信息。DelContact(contact* con):删除通讯录数据函数。它接受一个指向contact结构体的指针,通过将通讯录列表的大小减1来删除最后一个联系人的信息,并打印删除成功的消息。

//删除通讯录数据
void DelContact(contact* con)
{
		(con->size)--;
		printf("删除成功!\n");
}

4.显示联系人列表

程序可以显示当前联系人列表中的所有联系人及其电话号码。ShowContact(contact* con):展示通讯录数据函数。它接受一个指向contact结构体的指针,通过遍历通讯录列表,逐个打印联系人的姓名、年龄、性别、电话和地址信息,并打印已全部显示的消息。

/展示通讯录数据
void ShowContact(contact* con) 
{
	assert(con);
	printf("姓名 年龄 性别 电话 地址\n");
	for (int i = 0; i < con->size; i++)
	{
		printf("%-4s ", ((con->a) + i)->name);
		printf("%-4d ", ((con->a) + i)->age);
		printf("%-4s ", ((con->a) + i)->sex);
		printf("%-4s ", ((con->a) + i)->tel);
		printf("%-4s ", ((con->a) + i)->addr);
		printf("\n");
	}
	printf("已全部显示!\n");
}

5.查找联系人

用户可以输入要查找的联系人的姓名,程序将在列表中查找并显示该联系人的信息。FindContactname(contact* con):查找通讯录数据函数。它接受一个指向contact结构体的指针,通过用户输入要查找的联系人姓名,然后在通讯录列表中查找匹配的姓名并返回其索引值(下标)。如果找到了匹配的联系人,返回其下标;如果未找到匹配的联系人,返回-1。

//查找通讯录数据
int FindContactname(contact* con) 
{
	assert(con);
	printf("请输入联系人的名字\n");
	char j[NAME_MAX] = { 0 };
	scanf("%s", j);
	for (int i = 0; i < (con->size); i++)
	{
		if (strcmp(((con->a) + i)->name, j) == 0)
			return i;
	}
	return -1;
}

6.修改联系人

用户可以输入要修改的联系人的姓名,程序将在列表中查找并允许用户修改该联系人的信息。ModifyContact(contact* con):修改通讯录数据函数。它接受一个指向contact结构体的指针,首先调用FindContactname函数查找要修改的联系人的下标,如果找到了匹配的联系人,则通过用户输入更新该联系人的姓名、年龄、性别、电话和地址信息。如果未找到匹配的联系人,打印未找到的消息。

//修改通讯录数据
void ModifyContact(contact* con)
{
	int i = FindContactname(con);
	if (i >= 0)
	{
		printf("找到了,下标是%d\n", i);
		printf("请输入姓名\n");
		scanf("%s", ((con->a) + i)->name);
		printf("请输入年龄\n");
		scanf("%d", &(((con->a) + i)->age));
		printf("请输入性别\n");
		scanf("%s", ((con->a) + i)->sex);
		printf("请输入电话\n");
		scanf("%s", ((con->a) + i)->tel);
		printf("请输入地址\n");
		scanf("%s", ((con->a) + i)->addr);
		printf("\n");
	}
	else
		printf("未找到!\n");
}

7.销毁联系人列表

程序结束时,可以销毁联系人列表,释放内存空间。DestroyContact(contact* con):销毁通讯录数据函数。它接受一个指向contact结构体的指针,通过调用SLDestroy函数销毁通讯录列表,并打印销毁成功的消息。

void SLDestroy(SL* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;
}
//销毁通讯录数据
void DestroyContact(contact* con)
{
	SLDestroy(con);
	printf("销毁成功!\n");
}

四.通讯录的菜单实现

main()函数中,首先调用menu()函数打印菜单选项,然后通过动态内存分配创建一个contact结构体的指针p,并调用InitContact()函数初始化通讯录。

接下来,通过一个do-while循环,根据用户输入的选项执行相应的操作。根据用户输入的选项,调用相应的函数,如AddContact()添加联系人、DelContact()删除联系人、FindContactname()查找联系人、ModifyContact()修改联系人和ShowContact()显示通讯录。

循环终止条件是用户输入0,即选择退出通讯录。在循环结束后,调用DestroyContact()函数销毁通讯录,并打印成功退出通讯录的消息。

此程序通过菜单和用户输入实现了对通讯录的基本操作。用户可以根据菜单选项选择要执行的操作,直到选择退出通讯录为止。

#include"contact.h"
#include"SL.h"
void menu()
{
	printf("*************************\n");
	printf("1.添加联系人 2.删除联系人\n");
	printf("3.查找联系人 4.修改联系人\n");
	printf("5.显示通讯录 0.退出通讯录\n");
	printf("*************************\n");
}
int main()
{
	menu();
	int i = 0;
	contact* p = (contact*)malloc(sizeof(contact));
	InitContact(p);
	do {
		printf("请输入\n");
		scanf("%d", &i);
		switch (i)
		{
		case 1:
		{
			AddContact(p);
		    break;
		}
		case 2:
		{
			DelContact(p);
			break;
		}
		case 3:
		{
			int k = FindContactname(p);
			if (k >= 0)
			{
				printf("找到了,下标是%d\n", k);
				printf("姓名 年龄 性别 电话 地址\n");
				printf("%-4s ", ((p->a) + k)->name);
				printf("%-4d ", ((p->a) + k)->age);
				printf("%-4s ", ((p->a) + k)->sex);
				printf("%-4s ", ((p->a) + k)->tel);
				printf("%-4s ", ((p->a) + k)->addr);
				printf("\n");
			}
			else
				printf("未找到!\n");
			break;
		}
		case 4:
		{
			ModifyContact(p);
			break;
		}
		case 5:
		{
			ShowContact(p);
			break;
		}
		default:
		{
			printf("输入错误,请重新输入!\n");
			break;
		}
		}
	} while (i);
	DestroyContact(p);
	printf("已成功退出通讯录\n");
	return 0;
}

五.通讯录的测试

1.菜单的显示

2.添加联系人

3.删除联系人

4.查找联系人

5.修改联系人

6.显示通讯录

7.删除通讯录

六.通讯录项目的源码

1.顺序表的源码

1.SL.h

SL.h头文件定义了SL数据结构,表示序列列表。它还定义了初始化、销毁、检查容量、推入和弹出列表中的元素、在特定位置插入和删除元素、以及更改给定位置的元素的函数原型。

#pragma once
#define INIT_CAPACITY 4
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"contact.h"
typedef  PeoInfo SLDataType;
typedef struct SeqList
{
	SLDataType* a;
	int size;
	int capacity;
}SL;
void SLInit(SL* ps);
void SLDestroy(SL* ps);
//void SLPrint(SL* ps);
void SLCheckCapacity(SL* ps);
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
//int SLFind(SL* ps, SLDataType x);
void SLChange(SL* ps, int pos, SLDataType x);

2.Sl.c

Sl.c文件包含了有关顺序表的函数,这些函数实现了一个简单的单链表数据结构,用于管理通讯录数据。通过链表操作函数,可以向链表中添加元素、删除元素、获取元素以及获取链表的大小。这些函数与contact.c文件中的功能函数一起使用,实现了对通讯录数据的管理和操作。

#include"SL.h"
void SLInit(SL* ps)
{
	assert(ps);
	ps->a = (SLDataType*)malloc(INIT_CAPACITY * sizeof(SLDataType));
	assert(ps->a);
	ps->size = 0;
	ps->capacity = INIT_CAPACITY;
}
void SLDestroy(SL* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;
}
//void SLPrint(SL* ps)
//{
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		printf("%d ", *((ps->a) + i));
//	}
//	printf("\n");
//}
void SLCheckCapacity(SL* ps)
{
	assert(ps);
	SLDataType* j = NULL;
	if (ps->size >= ps->capacity)
	{
		j = realloc(ps->a, 2 * (ps->capacity) * sizeof(SLDataType));
		if (j)
		{
			free(ps->a);
			ps->a = NULL;
			perror("fault:");
		}
		else {
			ps->a = j;
		}
	}
	assert(ps->a);
}
void SLPushBack(SL* ps, SLDataType x)
{
	SLCheckCapacity(ps);
	*((ps->a) + (ps->size)) = x;
	(ps->size)++;
}
void SLPopBack(SL* ps)
{
	(ps->size)--;
}
void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = (ps->size) - 1; i > 0; i--)
	{
		*((ps->a) + i) = *((ps->a) + i - 1);
	}
	*(ps->a) = x;
	(ps->size)++;
}
void SLPopFront(SL* ps)
{
	assert(ps);
	for (int i = 0; i < ((ps->size) - 1); i++)
	{
		*((ps->a) + i) = *((ps->a) + i + 1);
	}
	(ps->size)--;
}
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(pos <= ps->size + 1);
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = (ps->size) - 1; i > pos; i--)
	{
		*((ps->a) + i) = *((ps->a) + i - 1);
	}
	*(ps->a + pos) = x;
	(ps->size)++;
}
void SLErase(SL* ps, int pos)
{
	assert(pos <= ps->size + 1);
	assert(ps);
	for (int i = pos; i < ((ps->size) - 1); i--)
	{
		*((ps->a) + i) = *((ps->a) + i + 1);
	}
	(ps->size)--;
}
//int SLFind(SL* ps, SLDataType x)
//{
//	assert(ps);
//	for (int i = 0; i < (ps->size); i++)
//	{
//		if (*((ps->a) + i) == x)
//			return i;
//	}
//	return -1;
//}
void SLChange(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos <= ps->capacity - 1);
	*((ps->a) + pos) = x;
}

2.通讯录的源码

1.contact.h

contact.h头文件定义了用于管理联系人列表的数据结构和函数原型。它包括了SL.h头文件,该头文件定义了序列列表的函数和数据结构。

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 100
#define SEX_MAX 7
#define TEL_MAX 12
#define ADDR_MAX 100
#include<string.h>
//前置声明
struct SeqList;
typedef struct SeqList contact;
//用户数据
typedef struct PersonInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PeoInfo;
//初始化通讯录
void InitContact(contact* con);
//添加通讯录数据
void AddContact(contact* con);
//删除通讯录数据
void DelContact(contact* con);
//展示通讯录数据
void ShowContact(contact* con);
//查找通讯录数据
int FindContactname(contact* con);
//修改通讯录数据
void ModifyContact(contact* con);
//销毁通讯录数据
void DestroyContact(contact* con);

2.contact.c

contact.c文件包含了许多功能函数共同实现了对通讯录数据的初始化、添加、删除、展示、查找、修改和销毁的操作。相应的函数实现了对通讯录数据结构的操作,并通过调用SL.h中的函数实现了具体的链表操作。

#include"contact.h"
#include"SL.h"
//初始化通讯录
void InitContact(contact* con)
{
	SLInit(con);
	printf("通讯录初始化成功!\n");
}
//添加通讯录数据
void AddContact(contact* con)
{
	PeoInfo x = { 0 };
	printf("请输入姓名\n");
	scanf("%s", x.name);
	printf("请输入年龄\n");
	scanf("%d", &x.age);
	printf("请输入性别\n");
	scanf("%s", x.sex);
	printf("请输入电话\n");
	scanf("%s", x.tel);
	printf("请输入地址\n");
	scanf("%s", x.addr);
	SLPushBack(con, x);
	printf("添加成功!\n");
}
//删除通讯录数据
void DelContact(contact* con)
{
		(con->size)--;
		printf("删除成功!\n");
}
//展示通讯录数据
void ShowContact(contact* con) 
{
	assert(con);
	printf("姓名 年龄 性别 电话 地址\n");
	for (int i = 0; i < con->size; i++)
	{
		printf("%-4s ", ((con->a) + i)->name);
		printf("%-4d ", ((con->a) + i)->age);
		printf("%-4s ", ((con->a) + i)->sex);
		printf("%-4s ", ((con->a) + i)->tel);
		printf("%-4s ", ((con->a) + i)->addr);
		printf("\n");
	}
	printf("已全部显示!\n");
}
//查找通讯录数据
int FindContactname(contact* con) 
{
	assert(con);
	printf("请输入联系人的名字\n");
	char j[NAME_MAX] = { 0 };
	scanf("%s", j);
	for (int i = 0; i < (con->size); i++)
	{
		if (strcmp(((con->a) + i)->name, j) == 0)
			return i;
	}
	return -1;
}
//修改通讯录数据
void ModifyContact(contact* con)
{
	int i = FindContactname(con);
	if (i >= 0)
	{
		printf("找到了,下标是%d\n", i);
		printf("请输入姓名\n");
		scanf("%s", ((con->a) + i)->name);
		printf("请输入年龄\n");
		scanf("%d", &(((con->a) + i)->age));
		printf("请输入性别\n");
		scanf("%s", ((con->a) + i)->sex);
		printf("请输入电话\n");
		scanf("%s", ((con->a) + i)->tel);
		printf("请输入地址\n");
		scanf("%s", ((con->a) + i)->addr);
		printf("\n");
	}
	else
		printf("未找到!\n");
}
//销毁通讯录数据
void DestroyContact(contact* con)
{
	SLDestroy(con);
	printf("销毁成功!\n");
}

3.test.c

代码中的main()函数是程序的入口点。它显示一个菜单选项,用于管理联系人列表,并重复提示用户输入,直到用户选择退出程序。根据用户的输入,它调用相应的函数来执行所需的操作。

#include"contact.h"
#include"SL.h"
void menu()
{
	printf("*************************\n");
	printf("1.添加联系人 2.删除联系人\n");
	printf("3.查找联系人 4.修改联系人\n");
	printf("5.显示通讯录 0.退出通讯录\n");
	printf("*************************\n");
}
int main()
{
	menu();
	int i = 0;
	contact* p = (contact*)malloc(sizeof(contact));
	InitContact(p);
	do {
		printf("请输入\n");
		scanf("%d", &i);
		switch (i)
		{
		case 1:
		{
			AddContact(p);
		    break;
		}
		case 2:
		{
			DelContact(p);
			break;
		}
		case 3:
		{
			int k = FindContactname(p);
			if (k >= 0)
			{
				printf("找到了,下标是%d\n", k);
				printf("姓名 年龄 性别 电话 地址\n");
				printf("%-4s ", ((p->a) + k)->name);
				printf("%-4d ", ((p->a) + k)->age);
				printf("%-4s ", ((p->a) + k)->sex);
				printf("%-4s ", ((p->a) + k)->tel);
				printf("%-4s ", ((p->a) + k)->addr);
				printf("\n");
			}
			else
				printf("未找到!\n");
			break;
		}
		case 4:
		{
			ModifyContact(p);
			break;
		}
		case 5:
		{
			ShowContact(p);
			break;
		}
		default:
		{
			printf("输入错误,请重新输入!\n");
			break;
		}
		}
	} while (i);
	DestroyContact(p);
	printf("已成功退出通讯录\n");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(算法)

总结&#xff0c;建议看EXCEL的《算法》页签&#xff0c;不然感觉有点乱 备注原理/步骤时间复杂度空间复杂度串的应用模式匹配简单/暴力O(mn) KMP  O(mn) 树的应用树哈夫曼树1、带权路径长度WPL 2、外部排序-最佳归并树1、哈夫曼树的度&#xff0c;只有0和m&#xff08;m叉…

Linux——十个槽位,RWX

Linux——RWX 十个槽位 - 表示文件 d 表示文件夹 l 表示软链接 r权&#xff0c;针对文件可以查看文件内容 针对文件夹&#xff0c;可以查看文件夹内容&#xff0c;如ls命令 w权&#xff0c;针对表示可以修改此文件 针对文件夹&#xff0c;可以在文件夹内&#…

深入理解k8s kube-proxy

1、概述 我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的&#xff0c;真正的流量由iptables/ipvs来转发就可以了。 网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。 kube-proxy就是K8s网络的核心组件。它把我们…

C++11 数据结构1 线性表的概念,线性表的顺序存储,实现,测试

一 线性表的概念 线性结构是一种最简单且常用的数据结构。 线性结构的基本特点是节点之间满足线性关系。 本章讨论的动态数组、链表、栈、队列都属于线性结构。 他们的共同之处&#xff0c;是节点中有且只有一个开始节点和终端节点。按这种关系&#xff0c;可以把它们的所有…

选择正确的Go Module Path

最近我在查看项目代码时&#xff0c;注意到有人在go.mod文件中将module path写为com.example.foo了。根据这个写法&#xff0c;相信屏幕前的读者也可以推断出这位开发人员可能是从Java阵营转到Go的。实际开发中可能有很多开发者会使用类似的内容作为module path&#xff0c;但这…

使用快捷回复软件的好处

在现代的客服工作中&#xff0c;尤其是店铺大促期间&#xff0c;咨询量的激增往往让客服人员应接不暇。即使打字速度再快&#xff0c;也难以跟上源源不断的客流。想应对这样的情况&#xff0c;快捷回复软件就非常适合客服人员了。 以我个人正在使用的客服宝为例&#xff0c;我想…

(Java)数据结构——图(第五节)Kruskal的实现最小生成树(MST)

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 Kruskal算法&#xff08;Kruskal的实现原理&#xff09; Kruskal算法的原理&#xff1a; 就是每次取最小的边&#xff0c;看看是不是与已经选择的构成回路&#x…

面向对象设计原则实验“依赖倒置原则”

高层模块不应该依赖于低层模块。二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。 &#xff08;开闭原则、里氏代换原则和依赖倒转原则的三个实例很相似&#xff0c;原因是它之间的关系很紧密&#xff0c;在实现很多重构时通常需要同时使用这三个原则。开闭…

计算机网络-TCP断开连接阶段错误应对机制

连接断开阶段 四次挥手机制&#xff1a;TCP连接的断开需要四次挥手&#xff0c;这是因为双方都需要独立地关闭数据传输。第二次和第三次挥手不能合并&#xff0c;因为在回复第二次挥手的时候&#xff0c;可能还有数据没有接收完成&#xff0c;所以需要先回复ACK报文&#xff0c…

css面试题---场景应用

1、实现一个三角形 css一般用border属性实现三角形。 div {width: 0;height: 0;border: 100px solid;border-color: orange blue red green; } // 三角形一 div {width: 0;height: 0;border-top: 50px solid red;border-right: 50px solid transparent;border-left: 50px soli…

竞赛 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

免费HTTPS证书在线申请

申请HTTPS证书的流程如下&#xff1a; 1. 确定证书类型&#xff1a; - 根据你的网站用途&#xff08;如个人博客、企业官网、电商、金融等&#xff09;和信任级别要求&#xff0c;选择适合的证书类型&#xff0c;如DV&#xff08;域名验证&#xff09;、OV&#xff08;组织验证…

[论文笔记] Pai-megatron Qwen1.5-14B-CT 后预训练 踩坑记录

1. 模型权重转换报错 hf2mcore_1.5_v2.py 报错为: /mnt/cpfs/kexin/dlc_code/qwen1.5/PAI-Megatron-Patch/toolkits/model_checkpoints_convertor/qwen/hf2mcore_1.5_v2.py 正确文件替换如下,更改了477行,删除了 args.hidden_size 这个维度,在tp>1时也支持转换: eli…

如何将h5网页打包成iOS苹果IPA文件

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;最近有很多小伙伴都被难住了&#xff0c;是什么问题给他们都难住了呢&#xff0c;许多小伙伴都说想要把h5网页打包成iOS苹果IPA文件&#xff0c;但是却不知道具体怎么操作&#xff0c;是怎么样的一个流程…

强化学习的数学框架:马尔科夫决策过程 MDP

文章目录 1. 什么是马尔科夫过程2. 强化学习与MDP的关系3. 价值函数的贝尔曼方程[^1]3.1 状态价值函数的贝尔曼方程3.2 动作价值函数的贝尔曼方程3.3 价值函数递推关系的转换 4. 最优价值函数5. MDP计算最优值函数实例[^2] 1. 什么是马尔科夫过程 马尔科夫过程&#xff08;Mar…

如何用酷鸟云进行iOS上架?

众所周知&#xff0c;大部分苹果开发者通常会上架多个马甲包应用&#xff0c;以获得更多流量和收益。这个过程需要进行账号、IP、设备隔离&#xff0c;这会需要很多电脑&#xff0c;但又没有那么mac 电脑的话&#xff0c;可以借助酷鸟云来进行上架&#xff0c;它是VPS云服务器&…

工作日常随记-总

软件测试主管工作日常随记-总 前言 接下来&#xff0c;我将开始散文式地记录我作为一位从业3年多的软件测试人员的软测经验。这是我在繁忙的日常工作的中跋涉出来又又投入的另一工作&#xff08;bushi&#xff09;另一兴趣中去。 我将简单&#xff08;偏流水线向&#xff09;…

性能升级,INDEMIND机器人AI Kit助力产业再蜕变

随着机器人进入到越来越多的生产生活场景中&#xff0c;作业任务和环境变得更加复杂&#xff0c;机器人需要更精准、更稳定、更智能、更灵敏的自主导航能力。 自主导航技术作为机器人技术的核心&#xff0c;虽然经过了多年发展&#xff0c;取得了长足进步&#xff0c;但在实践…

windwos安全加固

一、账号管理 按用户类型分配账号 目的&#xff1a;根据系统要求&#xff0c;设定不同账户和组&#xff0c;管理员、数据库 sa、审计用户、来宾用户等 实施方法&#xff1a; 打开本地用户和计算机管理器 ​ 1.打开运行&#xff0c;输入lusrmgr.msc 2.根据用户要求将账户加入…

一文涵盖Lambda,Stream,响应式编程,从此爱上高效率编程

一文涵盖Lambda,Stream,响应式编程&#xff0c;从此爱上高效率编程 前言 本文结构为 先是一个例子&#xff0c;带你快速体验&#xff0c;之后再去深究里面的方法。以及一些底层原理是如何实现的。从如何用&#xff0c;到如何用好&#xff0c;如何用精。学习操作&#xff0c;学…