当前位置: 首页 > news >正文

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

一.什么是通讯录

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

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

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

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

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

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");}elseprintf("未找到!\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");}elseprintf("未找到!\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");}elseprintf("未找到!\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");}elseprintf("未找到!\n");break;}case 4:{ModifyContact(p);break;}case 5:{ShowContact(p);break;}default:{printf("输入错误,请重新输入!\n");break;}}} while (i);DestroyContact(p);printf("已成功退出通讯录\n");return 0;
}

相关文章:

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

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

让大模型落地有“技”可循

“2018年&#xff0c;随着Transformer预训练模型的兴起&#xff0c;自然语言处理&#xff08;NLP&#xff09;学术圈中形成了一个主流观点——NLP领域的不同技术方向&#xff0c;如文本分类、文本匹配、序列标注等&#xff0c;最终都会被归结到文本生成这一核心任务之下。”这是…...

java:字符集和字符流

字符集 规定了字符和二进制之间对应关系的一张表 字节是计算机最基本的存储单位 字符则是通过字符组成和编码而成的文本 常见字符集 1,ASCII字符集 基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号 一个字节表示一个字符 所有的字符集均兼容ASCII…...

Java常见的设计模式

Java常见的设计模式 工厂模式&#xff08;Factory Pattern&#xff09;单例模式&#xff08;Singleton Pattern&#xff09;代理模式模式&#xff08;Proxy Pattern&#xff09;适配器模式&#xff08;Adapter Pattern&#xff09;观察者模式&#xff08;Observer Pattern&…...

Oracle 19c RAC集群相关日志

1.DB日志&#xff08;数据库日志&#xff09; Redo Log&#xff08;重做日志&#xff09;&#xff1a; 在Oracle数据库中&#xff0c;重做日志记录了数据库发生的所有修改操作&#xff0c;包括数据的插入&#xff0c;更新和删除。在RAC的环境中&#xff0c;每个实例都有自己的重…...

TR4 - Transformer中的多头注意力机制

目录 前言自注意力机制Self-Attention层的具体机制Self-Attention 矩阵计算 多头注意力机制例子解析 代码实现总结与心得体会 前言 多头注意力机制可以说是Transformer中最主要的模块&#xff0c;没有之一。这次我们来仔细分析一下注意力机制与多头注意力机制。 自注意力机制…...

three.js跟着教程实现VR效果(四)

参照教程&#xff1a;https://juejin.cn/post/6973865268426571784&#xff08;作者&#xff1a;大帅老猿&#xff09; 1.WebGD3D引擎 用three.js &#xff08;1&#xff09;使用立方体6面图 camera放到 立方体的中间 like “回” 让贴图向内翻转 &#xff08;2&#xff09;使…...

AI预测体彩排3第1弹【2024年4月12日预测--第1套算法开始计算第1次测试】

前面经过多个模型几十次对福彩3D的预测&#xff0c;积累了一定的经验&#xff0c;摸索了一些稳定的规律&#xff0c;有很多彩友让我也出一下排列3的预测结果&#xff0c;我认为目前时机已成熟&#xff0c;且由于福彩3D和体彩排列3的玩法完全一样&#xff0c;我认为3D的规律和模…...

spring 中的控制反转

在Spring框架中&#xff0c;控制反转&#xff08;IoC&#xff0c;Inversion of Control&#xff09;是指将对象的创建和管理交给了容器&#xff0c;而不是在应用程序代码中直接创建对象。在传统的编程模式中&#xff0c;应用程序代码通常负责创建对象并管理它们的生命周期&…...

GO并发总是更快吗?

许多开发人员的一个误解是,并发解决方案总是比串行更快,大错特错。解决方案的整体性能取决于许多因素,例如,结构的效率(并发)、可以并行处理的部分以及计算单元的竞争程度。 1. GO调度 线程是操作系统可以执行的最小单元。如果一个进程想要同时执行多个动作,它可以启动…...

echarts折线图自定义打点标记小工具

由于没研究明白echarts怎么用label和lableLine实现自定义打点标记&#xff0c;索性用markPoint把长方形压扁成线模拟了一番自定义打点标记&#xff0c;记录下来备用。&#xff08;markLine同理也能实现&#xff09; 实现代码如下&#xff1a; <!DOCTYPE html> <html…...

【图论】Leetcode 200. 岛屿数量【中等】

岛屿数量 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以…...

酒店大厅装水离子雾化壁炉前和装后对比

在酒店大厅装水离子雾化壁炉之前和之后&#xff0c;大厅的氛围和体验会有显著的对比&#xff1a; 装水离子雾化壁炉之前&#xff1a; 传统感&#xff1a;在壁炉安装之前&#xff0c;大厅可能会有传统的装饰或者简单的暖气设备&#xff0c;缺乏现代化的元素。这种传统感可能会…...

城市内涝与海绵城市规划设计中的水文水动力模拟

原文链接&#xff1a;城市内涝与海绵城市规划设计中的水文水动力模拟https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601198&idx5&sn35b9e5e3961ea2f190f9742236a7217f&chksmfa820dc9cdf584df97633f64d19bdc3e5f7d1a5a85000c8f040e1953c51b9b39c87b5…...

C++项目实战与经验分享

在编程世界中,C++ 是一种功能强大且灵活的编程语言,广泛应用于系统级编程、游戏开发、嵌入式系统以及高性能计算等领域。本文将分享一个基于C++的图像处理系统项目实战经验,并深入探讨在开发过程中遇到的问题及解决方案。 一、项目概述 本次项目实战的目标是开发一个基于C…...

Day17_学点JavaEE_转发、重定向、Get、POST、乱码问题总结

1 转发 转发&#xff1a;一般查询了数据之后&#xff0c;转发到一个jsp页面进行展示 req.setAttribute("list", list); req.getRequestDispatcher("student_list.jsp").forward(req, resp);2 重定向 重定向&#xff1a;一般添加、删除、修改之后重定向到…...

Mouse IFN-α ELISA kit (Quick Test)

干扰素α&#xff08;IFN-α&#xff09;是一类由免疫细胞分泌的内源性调节因子&#xff0c;也被称为白细胞干扰素&#xff0c;主要参与响应病毒感染的先天性免疫。 基于结构特征、受体、细胞来源和生物活性的不同&#xff0c;干扰素可被分为Ⅰ、Ⅱ、Ⅲ三种类型&#xff0c;其中…...

AMD Tensile 简介与示例

按照知其然&#xff0c;再知其所以然的认知次序进行 1&#xff0c;下载代码 git clone --recursive https://github.com/ROCm/Tensile.git 2&#xff0c;安装 Tensile cd Tensile mkdir build cd build ../Tensile/bin/Tensile ../Tensile/Configs/rocblas_dgemm_nn_asm_full…...

Rust语言

文章目录 Rust语言一&#xff0c;Rust语言是什么二&#xff0c;Rust语言能做什么&#xff1f;Rust语言的设计使其适用于许多不同的领域&#xff0c;包括但不限于以下几个方面&#xff1a;1. 传统命令行程序&#xff1a;2. Web 应用&#xff1a;3. 网络服务器&#xff1a;4. 嵌入…...

排序算法之冒泡排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性冒泡排序O(n^2 )O(n)O(n^2)O(1)In-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b; 不…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...