CBA球员注册管理系统(计科课设)

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:数据结构初阶
⭐代码仓库:Data Structure
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!

CBA球员注册管理系统

  • 前言
  • 一、流程图
  • 二、三板斧
  • 三、定义链表
  • 四、功能
    • 1.增加球员信息
    • 2.打印球员信息
    • 3.文件的存储
    • 4.文件的加载
    • 5.查找
    • 6.指定删除
    • 7.指定插入
    • 8.修改成员信息
    • 9.筛选成员信息
    • 10.统计球员个数
    • 11.排序
    • 12.计算
    • 13.判断
    • 14.清空
    • 15.报表
  • 五、注册&登录&找回密码界面
    • 1.创建用户结构体信息
    • 2.创建用户
    • 3.用户注册
    • 4.用户登录
    • 5.用户找回密码
  • 六、流程图
  • 七、归并
  • 总结


前言

这是计科C语言课程设计的大作业,因为写了2k多行的代码,所以我将此代码放在我的Gittee仓库里面了,大家看完讲解需要原代码的直接去我的Gittee仓库进行Clone即可。
Gittee仓库(数据结构)


一、流程图

在这里插入图片描述
在这里插入图片描述


二、三板斧

老规矩,三板斧:Slist.h,Slist.c和text.c,这三个文件是很关键的,我们需要在text.c中进行测试,写一个函数进行一个函数的测试,Slist.h包含头文件,函数的声明和链表结构体的实现;Slist.c包含了函数的定义和实现以及菜单的打印。
在这里插入图片描述


三、定义链表

test.c:
在这里插入图片描述

四、功能

在这里我们要了解几点知识,首先是我们需要改变链表结构的时候,是需要传链表的地址,也就是需要用二级指针去接收,而不改变链表的结构仅仅是改变链表里的数据,只需要用一级指针去接收即可,这样可以单纯改变数据。


以下均在SList.c中:

1.增加球员信息

我这里用的是尾插法,也就是找到尾结点,再尾结点->next直接指向newnode即可,注意,这里我们是直接改变了链表的结构,改变了链表指向性的问题,所以我们用的是二级指针:
在这里插入图片描述
核心code:在这里插入图片描述
这里的增加一个结点我是放到一个函数里,我们直接实现一下这个函数:在这里插入图片描述
流程图:
在这里插入图片描述


2.打印球员信息

打印可以说是最简单的代码,我们只需要遍历链表进行打印即可,注意,这里空链表也可以打印,这里只是打印,不是改变链表的结构,所以我们就只需要用一级指针接收即可:
在这里插入图片描述
流程图:
在这里插入图片描述


3.文件的存储

先在我们.c文件的根目录里创建一个.txt文档然后进行写入,用的是fprintf函数,我们在进行训练完C进阶文件的信息后,我们能够知道fprintf函数是将链表中的信息存放到文件.txt中,是以原本的信息直接打印进去,我们可以遍历链表,一个一个存入文件当中即可:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果大家对于文件的操作有所疑问的,大家可以看一看以前我介绍的C语言文件操作。

流程图:
在这里插入图片描述


4.文件的加载

注意:这里我们进行写入文件用的是什么进制我们读出用的就是什么进制的函数,这里我加载到的是2的文件,所以我们可以往前看到的是文件的写入用的是fprintf,然后文件的加载用的是fscanf。其次,我们需要怎么进行操作文件的加载呢??这个其实不难,我们先创建一个临时的结构体空间,然后将文件中的信息读取到新创建的结构体空间中,再使用memcpy或者memmove或者直接进行赋值进行存储到新的结点里,再将结点进行插入链表即可。

在这里插入图片描述
流程图:
在这里插入图片描述


5.查找

此次查找是按照不同的信息进行查找,我们根据不同的信息进行查找,是根据球员不同的信息进行查找,所以,这里用一个switch-case语句进行协调,似乎看起来很麻烦,但是,这几个函数都是可以复用的,比如我们在比较字符串的时候我们用strcmp库函数进行比较,比较整型和浮点型的话直接进行比较数额大小即可,以下我列两个模板:
No.1:字符串比较
在这里插入图片描述
No.2:数额比较
在这里插入图片描述
No.3组合查找
组合查找就跟我们前面差不多,加一个&&即可,我这里只写了查询学习等级和运动等级的组合查找,并没有写其他的组合查找,因为其他的组合查找都是和这个组合查找一样的过程与代码,我们直接上代码:
在这里插入图片描述
在这里插入图片描述


6.指定删除

按照身份证找到人,想把这个人删除怎么办??我们只需要记忆要删除人的前一个以及后一个,要删的人的前一个结点进行保存,然后将前一个人的结点指向next->next,再将要删的人的结点进行释放即可,再将这个人的信息进行释放即可:

在这里插入图片描述
在这里插入图片描述
流程图:
在这里插入图片描述


7.指定插入

思路比较简单,我们找到需要插入的位置,我们仅仅需要按照身份证找到需要插入人的信息,直接往后插入即可,为什么要往后插入,我们不往前插入呢??因为往前插入是很麻烦的,要判断是不是头结点,是的话,我们直接新结点就是头结点,不是的话我们前插,大家有没有发现有点麻烦?所以C++中的STL库中的插入是尾插,而且人们的习惯都是往后排队,不可能插队吧!?所以我们选择往后插入。
在这里插入图片描述

//指插(找到位置再插入到位置的后面)
void InsertCBAPlayerAfter(SLTCBANode** pphead) {//assert(pphead);int pos = 0;int ret = 0;int pos1 = 1;SLTCBANode* prev = *pphead;//prev为头结点if (prev == NULL) {//空链表printf("还未存入球员信息,请重试!\n");system("pause");//暂停system("cls");//清屏return;}printf("请输入要插入哪个人的后面(序号)\n");scanf("%d", &pos);//找位置while (prev) {//算算链表数ret++;prev = prev->next;}prev = *pphead;if (pos > ret || pos <= 0) {//用户输入位置过大printf("找不到需要插入的位置,请重新试!\n");printf("此时只存了%d个球员的信息\n", ret);system("pause");//暂停system("cls");//清屏return;}SLTCBANode* temp = NULL;//临时空间if (pos == 1) {//在头结点SLTCBANode* newnode = BuyListNode();//建立一个新的结点printf("请输入球员身份证号码>\n");scanf("%s", newnode->cbaplayer.ID);printf("请输入球员姓名(英文)>\n");scanf("%s", newnode->cbaplayer.name);printf("请输入球员性别(女f,男m)>\n");scanf("%s", newnode->cbaplayer.sex);printf("请输入球员年龄>\n");scanf("%d", &newnode->cbaplayer.age);printf("请输入球员的球衣号码>\n");scanf("%d", &newnode->cbaplayer.number);printf("请输入球员身高(cm)>\n");scanf("%f", &newnode->cbaplayer.high);printf("请输入球员体重(kg)>\n");scanf("%f", &newnode->cbaplayer.weight);printf("请输入球员臂展(cm)>\n");scanf("%f", &newnode->cbaplayer.reach);printf("请输入球员体脂率(小数)>\n");scanf("%f", &newnode->cbaplayer.BodyFatPercentage);printf("请输入球员运动等级(优秀outstanding,良好good,及格pass)>\n");scanf("%s", newnode->cbaplayer.PEResult);printf("请输入球员学习等级(优秀outstanding,良好good,及格pass)>\n");scanf("%s", newnode->cbaplayer.LearingScore);newnode->next = prev->next;prev->next = newnode;printf("增加成功\n");system("pause");//暂停system("cls");//清屏return;}else if (pos == ret) {InputTailCBAPlayer(&prev);//尾插}else {//不在头结点while (prev->next != NULL) {//找相等的位置,先定义pos1,再++,直至与pos相同,找到位置//pos1 = 1;pos1++;prev = prev->next;if (pos == pos1) {//相等进行插入操作SLTCBANode* newnode1 = BuyListNode();//建立一个新的结点printf("请输入球员身份证号码>\n");scanf("%s", newnode1->cbaplayer.ID);printf("请输入球员姓名(英文)>\n");scanf("%s", newnode1->cbaplayer.name);printf("请输入球员性别(女f,男m)>\n");scanf("%s", newnode1->cbaplayer.sex);printf("请输入球员年龄>\n");scanf("%d", &newnode1->cbaplayer.age);printf("请输入球员的球衣号码>\n");scanf("%d", &newnode1->cbaplayer.number);printf("请输入球员身高(cm)>\n");scanf("%f", &newnode1->cbaplayer.high);printf("请输入球员体重(kg)>\n");scanf("%f", &newnode1->cbaplayer.weight);printf("请输入球员臂展(cm)>\n");scanf("%f", &newnode1->cbaplayer.reach);printf("请输入球员体脂率(小数)>\n");scanf("%f", &newnode1->cbaplayer.BodyFatPercentage);printf("请输入球员运动等级(优秀outstanding,良好good,及格pass)>\n");scanf("%s", newnode1->cbaplayer.PEResult);printf("请输入球员学习等级(优秀outstanding,良好good,及格pass)>\n");scanf("%s", newnode1->cbaplayer.LearingScore);newnode1->next = prev->next;prev->next = newnode1;printf("增加成功\n");system("pause");//暂停system("cls");//清屏return;}//prev = prev->next;//比控制范围多了的数据,指向空,越界(可以在此进行调试,将这段代码屏蔽掉进行调试)if (prev == NULL) {//越界printf("越界,插入不了!\n");break;}}}//if (prev == NULL) {//	printf("超出范围\n");//	system("pause");//暂停//	system("cls");//清屏//}
}

流程图:
在这里插入图片描述


8.修改成员信息

修改成员信息比较简单,我们仅仅需要直接将需要修改的信息覆盖掉即可,看似似乎很难,但是我们思路是先找到需要找到的人,人的身份证号是互不相同的,所以我们寻找的依据是身份证号,找到了那个人以后,我们进行scanf直接进行覆盖的操作,接下来我们看以下下面的模板进行操作:
在这里插入图片描述
在这里插入图片描述
流程图:
在这里插入图片描述


9.筛选成员信息

筛选可以根据自己的喜好进行筛选,只要是在这个范围内进行筛选出来进行打印即可,我们这里的筛选都是大同小异,我这里仅仅放一个筛选的条件即可:
在这里插入图片描述

在这里插入图片描述


10.统计球员个数

统计球员个数那就是直接遍历链表,进行加加操作,最后进行return即可:
在这里插入图片描述
在这里插入图片描述


11.排序

排序似乎看上去很难,但是其实并没有想象中的那么复杂,我们在进行排序的时候是可以分升序和降序的,我们只需要放在一个switch-case子语句里进行选择即可,进行排序其实并不复杂,我们只需要进行地址的交换和数据的交换即可,那我们直接动手开始做吧!
在这里插入图片描述
我们只需要将头结点赋给prev1,然后prev1往后遍历,而prev2永远比prev1往后一位进行比较即可,按照升序和降序进行操作即可,直至遍历完链表。


12.计算

计算这个模块仅仅是一个娱乐的项目,我在网上找了体侧、学习和体脂率的计算公式,进行调用即可:

//计算菜单
void MathMenuInterface() {printf("\t   ******************************************************\t\t\n");printf("\t   ****************    欢迎来到计算菜单     **************\t\t\n");printf("\t   ***************   0.退出     1.体脂率    *************\t\t\n");printf("\t   ***************   2.学习等级 3.体育等级  *************\t\t\n");printf("\t   ***************          请选择          *************\t\t\n");printf("\t   ******************************************************\t\t\n");
}//计算(体脂率,学习成绩,体育成绩)
void MathMenu() {system("cls");int input = 0;float math = 0.0f;float chinese = 0.0f;float english = 0.0f;float fiftymeters = 0.0f;      //10float basketballskills = 0.0f; //60float Standinglongjump = 0.0f; //10float eightymeters = 0.0f;     //20MathMenuInterface();do {printf("请选择\n");scanf("%d", &input);switch (input) {case 0: {printf("退出程序\n");break;}case 1:{printf("请输入性别(男male,女female):>\n");char Sex[10];scanf("%s", Sex);int i = strlen(Sex);if (i == 4) {printf("请分别输入腰围(cm)和体重(kg)\n");float waistline = 0.0f;float weight = 0.0f;scanf("%f %f", &waistline, &weight);float BFP = ((waistline * 0.74) - (weight * 0.082 + 44.74)) / weight * 100;printf("体脂率为%.1f\n", BFP);}else {printf("请分别输入腰围(cm)和体重(kg)\n");float waistline1 = 0.0f;float weight1 = 0.0f;scanf("%f %f", &waistline1, &weight1);float BFP = ((waistline1 * 0.74) - (weight1 * 0.082 + 34.89)) / weight1 * 100;printf("体脂率为%.1f\n", BFP);}break;}case 2://学习等级printf("请分别输入语文数学和英语分数(百分制)\n");scanf("%f %f %f", &chinese, &math, &english);float avarage = (chinese + math + english) / 3;if (avarage >= 85 && avarage <= 100) {printf("outstanding\n");}else if (avarage >= 75 && avarage < 85) {printf("good\n");}else if (avarage >= 60 && avarage < 75) {printf("pass\n");}else {printf("no pass\n");}break;case 3: {//体育等级printf("请输入50米,篮球技巧,立定跳远和800米跑步成绩(百分制)\n");scanf("%f %f %f %f", &fiftymeters, &basketballskills, &Standinglongjump, &eightymeters);float sum = 0.1 * fiftymeters + 0.6 * basketballskills + 0.1 * Standinglongjump + 0.2 * eightymeters;if (sum >= 90) {printf("outstanding\n");}else if (sum >= 80 && sum < 90) {printf("good\n");}else if (sum >= 70 && sum < 80) {printf("pass\n");}else {printf("no pass\n");}break;}}} while (input);system("pause");//暂停system("cls");//清空
}

流程图:
在这里插入图片描述


13.判断

判断其实也就是复用比较函数接口,我们仅仅需要进行比较即可,如果比较相等就通过,不相等就输出不相匹配的信息,如下:
在这里插入图片描述
而进入主函数我们想单纯判断判断自己的话,有一个细节,我们已经链表遍历到末尾了,所以,这个链表是已经进行改变了,我们需要将链表重新放到头的位置:
在这里插入图片描述
流程图:
在这里插入图片描述


14.清空

清空就是销毁链表,把空间还给操作系统,可以理解为,我搬家了,这块空间我还给国家了,至于这块空间以后会被谁借用,我不知道,我只是把这块空间还掉了,销毁链表就是置为空即可:
在这里插入图片描述

流程图:
在这里插入图片描述


15.报表

报表就是要将这个链表打印地更加美观即可,与打印模块相同:
在这里插入图片描述
流程图:
在这里插入图片描述


五、注册&登录&找回密码界面

1.创建用户结构体信息

test.c:
在这里插入图片描述


2.创建用户

遇事不决先创建一个用户的文件,我们将这个文件放在与.c和.h一样地方的根目录下,这样子写起来只需要用相对地址即可,较为简洁,所以我们先创建一个吧!
在这里插入图片描述
在这里插入图片描述


3.用户注册

注册这块难度就上来了,我们进行注册的话是打开文件进行文件的写入,用的是fread函数,将我们在控制台上进行写入的信息存到文件中,这其中的细节当然是我们要先比较我们的账号是否被征用,以及我们确认两次是否输入一样的密码,这些直接用strcmp函数进行比较,但在这中间,我们当然也看到过很多问题,就比如说我输入的数额大于我开辟的空间的大小了,这就需要我们将这些错误进入调试一看,发现空间不够,我们增大空间。也可能出现进不来文件的情况,我们就需要仔细检查一下fread函数是否输入错误。

//用户注册
void Register() {users ReceiveUserInput, ReadFromFile;//ReceiveUserInput是用来接收用户输入的,ReadFromFile是用来从文件中读取的char temp[MAX_NAME] = "";//20个存储空间,用着下面做判断的printf("欢迎来到注册界面>\n");FILE* pFileRiver = fopen("users.txt", "rb");//二进制只读方式打开文件,rb--只可以读fread(&ReadFromFile, sizeof(users), 1, pFileRiver);//将文件里面的信息存储到ReadFromFile中if (pFileRiver == NULL) {//空perror("fopen::pFileRiver\n");return;}printf("请输入你的账号>");//用户名scanf("%s", ReceiveUserInput.id);while (1) {//让文件运行起来if (strcmp(ReceiveUserInput.id, ReadFromFile.id)) {//用户名不相同if (!feof(pFileRiver)) {//未读到文件结尾也可能认为用户名不同fread(&ReadFromFile, sizeof(users), 1, pFileRiver);//继续读到文件的结尾}else {//读到文件末尾了break;//跳出文件即可}}else {//用户名相同,重复了printf("该ID已被别人征用,请换个ID\n");//Sleep(1000);fclose(pFileRiver);pFileRiver = NULL;return;//直接返回}}//创建成功printf("请输入您的姓名>");scanf("%s", ReceiveUserInput.name);printf("请输入您的性别>");scanf("%s", ReceiveUserInput.sex);printf("请输入您的电话号码>");scanf("%s", ReceiveUserInput.phone);printf("请输入您的密码>");scanf("%s", ReceiveUserInput.password);/*int i = 0;for (i = 0; i < 30; i++){ReceiveUserInput.password[i] = _getch();if (ReceiveUserInput.password[i] == '\r'){break;}else{printf("*");}}*/printf("请确认您的密码>");scanf("%s", temp);//进行判断密码是否正确/*for (i = 0; i < 30; i++){temp[i] = _getch();if (temp[i] == '\r'){break;}else{printf("*");}}*///判断do {if (strcmp(ReceiveUserInput.password, temp) == 0) {//两次密码输入相同pFileRiver = fopen("users.txt", "ab");//ab--只可以写fwrite(&ReceiveUserInput, sizeof(users), 1, pFileRiver);//将信息写入ReceiveUserInput中printf("\n账号注册成功,请登录\n");fclose(pFileRiver);pFileRiver = NULL;return;//直接返回不解释}else {//两次密码输入不同printf("\n两次密码不一致,请重新输入>\n");printf("请输入您的密码>");scanf("%s", ReceiveUserInput.password);/*for (i = 0; i < 20; i++) {ReceiveUserInput.password[i] = _getch();if (ReceiveUserInput.password[i] == '\r') {break;}else{printf("*");}}printf("\n");*/printf("请确认您的密码>");scanf("%s", temp);//进行判断密码是否正确/*for (i = 0; i < 20; i++) {temp[i] = _getch();if (temp[i] == '\r') {break;}else {printf("*");}}printf("\n");*/}} while (1);
}

流程图:
在这里插入图片描述


4.用户登录

登录难度不大,我们找到文件以后,只需要我们进行密码的匹配即可,但这里同样有个细节就是,我们运用fread的时候是需要先读一个匹配匹配的,之后再往后遍历匹配,因为我进入过调试,我看到了当我仅仅是直接用feof函数读到末尾发现,可能会有不匹配的项目,一直弹不出正确的答案,就相当于我们让机器人找东西的时候,是需要先给它看看这个东西大致是长什么样子的,不是单纯的告诉它让它去找橘子香蕉这样的,是需要先给它看看橘子香蕉长什么样,再让它去找。这样进行先读一个再往后遍历读是正确的。

//登录用户
int Login() {users ReceiveUserInput, ReadFromFile;//ReceiveUserInput是用来接收用户输入的,ReadFromFile是用来从文件中读取的FILE* PFile = fopen("users.txt", "rb");//只读文件if (!PFile) {perror("fopen::PFil\n");return;}printf("欢迎来到登录界面\n");fread(&ReadFromFile, sizeof(users), 1, PFile);//先读一个匹配匹配printf("请输入账号>");scanf("%s", ReceiveUserInput.id);while (1) {if (strcmp(ReceiveUserInput.id, ReadFromFile.id) == 0) {//匹配成功break;}else {if (!feof(PFile)) {//未读到文本的结尾fread(&ReadFromFile, sizeof(users), 1, PFile);//往后读}else {printf("此账号不存在,请退出重试\n");fclose(PFile);PFile = NULL;//system("pause");//暂停//system("cls");//清屏return 0;}}}int count = 0;int count1 = 2;printf("您只有三次输密码的机会!\n");do {printf("请输入密码>");int i = 0;for (i = 0; i < 20; i++) {ReceiveUserInput.password[i] = _getch();if (ReceiveUserInput.password[i] == '\r') {break;}else{printf("*");}}//i = i + 1;ReceiveUserInput.password[i++] = '\0';printf("\n");//scanf("%s", ReceiveUserInput.password);if (!strcmp(ReceiveUserInput.password, ReadFromFile.password)) {//密码匹配成功printf("\n登录成功,欢迎使用\n");printf("\n按任意键继续\n");fclose(PFile);PFile = NULL;//这个有或无都没什么大影响return 1;}else {printf("密码错误,请重新输入\n");printf("还有%d次机会!\n", count1);count1--;count++;}if (count >= 3) {break;}} while (strcmp(ReceiveUserInput.password, ReadFromFile.password));//输入密码相同即可登录printf("三次机会输入密码均错误,请退出重试!\n");return 0;
}

在这里插入图片描述
这里用到了加密,我们可以了解一下_getch函数就是不回显,它单纯是读入一个字符到缓冲区,而不进行显示出来,'\r’是回车键,我们读到不是回车键就输出*,是回车键就退出,那很多人就问了,我密码输入错误想按spaceback怎么办???那当然了spaceback也是一个字符,那我们就退出重试!!

流程图:
在这里插入图片描述


5.用户找回密码

找回密码就相当于信息的匹配,我们只需要将我们以前的信息进行匹配即可,匹配完蹦出来密码即可。

//找回密码
void Reback() {users a, b;FILE* fp = fopen("users.txt", "r");char temp[20];int count = 0;printf("欢迎来到找回密码界面!\n");fread(&b, sizeof(users), 1, fp); printf("请输入账号\n");scanf("%s", &a.id);while (1){if (strcmp(a.id, b.id) == 0){break;}else{if (!feof(fp)){fread(&b, sizeof(users), 1, fp);}else{printf("查无此人,请重新输入!\n");//Sleep(500);fclose(fp);return;}}}printf("请输入姓名:\n");scanf("%s", a.name);do {if (strcmp(a.name, b.name)) {printf("姓名输入错误!请重新输入!\n");scanf("%s", a.name);}} while (strcmp(a.name, b.name));printf("请输入电话号码:\n");scanf("%s", a.phone);do {if (strcmp(a.phone, b.phone)) {printf("电话号码输入错误!请重新输入!\n");scanf("%s", a.phone);}} while (strcmp(a.phone, b.phone));printf("请输入性别:\n");scanf("%s", a.sex);do {if (strcmp(a.sex, b.sex)) {printf("性别输入错误!请重新输入!\n");scanf("%s", a.sex);}} while (strcmp(a.sex, b.sex));printf("您的密码是:%s\n", b.password);system("pause");system("cls");
}

流程图:
在这里插入图片描述

六、流程图

顶级流程图:
在这里插入图片描述
一级流程图:
在这里插入图片描述


七、归并

我们在进行上面的函数接口的书写完成后,进行一步一步调试,那当然,写出来的肯定不是完美的,我们进入主函数中再进行调试,进行运行,一步一步进行看,想象不同的奇葩的“数”,输入看效果,那这里主函数直接移步到我的Gittee中吧~~~

⭐代码仓库:Data Structure


总结

以上便是整个课设的思路与想法,实际上用到的大多数知识都是我们日常见到的知识,是我们学习过的知识,当我们把这些知识掌握了以后,相信敲一个课设不是很难,但是主要在于细心和调试的运用。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot注册web组件

目录 前言 一、注册Servlet组件 1.1 使用SpringBoot注解加继承HttpServet类注册 1.2 通过继承HttpServet类加配置类来进行注册 二、注册Listener组件 2.1 使用SpringBoot注解和实现ServletContextListener接口注册 2.2 ServletContextListener接口和配置类来进行注册 …

算法框架-LLM-1-Prompt设计(一)

原文&#xff1a;算法框架-LLM-1-Prompt设计&#xff08;一&#xff09; - 知乎 目录 收起 1 prompt-engineering-for-developers 1.1 Prompt Engineering 1.1.1 提示原则 1. openai的环境 2. 两个基本原则 3. 示例 eg.1 eg.2 结构化输出 eg.3 模型检验 eg.4 提供示…

uwb人员定位系统:人员轨迹实时定位

UWB定位系统是一种基于超宽带技术的定位系统。它与传统的通信技术不同&#xff0c;不需要使用载波&#xff0c;而是通过发送和接收具有纳秒或微妙级以下的极窄脉冲来实现无线传输。这种系统的优势包括低功耗、对信道衰落不敏感、抗环境能力强、不会对同一环境下的其他设备造成影…

深度学习(1)---卷积神经网络(CNN)

文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络&#xff08;Convolut…

淘宝/天猫获得淘宝商品详情API(含测试示例)

taobao.item_get 调用说明 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中进入测试&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]c…

【计算机网络】HTTP协议详解(举例解释,超级详细)

文章目录 一、HTTP协议简单介绍 1、1 什么是HTTP协议 1、2 再次理解“协议” 二、HTTP请求 2、1 HTTP的工作过程 2、1、1 demo代码 2、2 URL 介绍 2、2、1 urlencode 和 urldecode 2、3 HTTP 请求格式 三、HTTP响应 3、1 响应demo 3、2 HTTP 响应格式 四、HTTP 请求和响应中的…

Leetcode.965 单值二叉树

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…

HTML之如何下载网页中的音频(二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

一篇博客学会系列(3) —— 对动态内存管理的深度讲解以及经典笔试题的深度解析

目录 动态内存管理 1、为什么存在动态内存管理 2、动态内存函数的介绍 2.1、malloc和free 2.2、calloc 2.3、realloc 3、常见的动态内存错误 3.1、对NULL指针的解引用操作 3.2、对动态开辟空间的越界访问 3.3、对非动态开辟内存使用free释放 3.4、使用free释放一块动态…

Vue中如何进行多语言处理

Vue中的多语言处理 在开发多语言Web应用程序时&#xff0c;处理文本翻译和国际化是一个重要的任务。Vue.js提供了多种方法来实现多语言处理&#xff0c;以确保您的应用程序能够支持不同语言的用户。本文将深入探讨在Vue中进行多语言处理的方法&#xff0c;并提供示例代码来帮助…

基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

(c++)类和对象 下篇

目录 1.再次了解构造函数 2. Static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 1.再次了解构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { pub…

用AI原生向量数据库Milvus Cloud 搭建一个 AI 聊天机器人

搭建聊天机器人 一切准备就绪后,就可以搭建聊天机器人了。 文档存储 机器人需要存储文档块以及使用 Towhee 提取出的文档块向量。在这个步骤中,我们需要用到 Milvus。 安装轻量版 Milvus Lite,使用以下命令运行 Milvus 服务器: (chatbot_venv) [egoebelbecker@ares milvus_…

软断言你也学不会

断言是测试用例的一部分&#xff0c;也是测试工程师开发测试用例的核心。断言通常集成在单元测试和集成测试中&#xff0c;断言分为硬断言和软断言。 硬断言是我们狭义上听到的普通断言:当用例运行后得到的[实际]结果与预期结果不匹配时&#xff0c;测试框架将停止测试执行并抛…

2023年中国家用智能门锁市场发展概况分析:家用智能门锁线上市场销量290.4万套[图]

智能门锁是指区别于传统机械锁的基础上改进的&#xff0c;在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能门锁区别于传统机械锁, 是具有安全性, 便利性, 先进技术的复合型锁具。 智能门锁级别分类 资料来源&#xff1a;共研…

怎么通过portainer部署一个vue项目

这篇文章分享一下今天通过docker打包vue项目&#xff0c;并使用打包的镜像在portainer上部署运行&#xff0c;参考了vue-cli和docker的官方文档。 首先&#xff0c;阅读vue-cli关于docker部署的说明 vue-cli关于docker部署的说明https://cli.vuejs.org/guide/deployment.html#…

记录:Unity脚本的编写2.0

目录 前言控制方法键盘控制鼠标控制虚拟控制器控制 平移和旋转 前言 前面记录了一些简单的unity脚本用来控制unity中对象模型的移动&#xff08;或者不能叫控制&#xff0c;毕竟它是开启之后自己在跑的&#xff09;&#xff0c;那么让模型可以根据用户的操作来进行变化的方法自…

支付宝2023年收单外包服务机构评级启动,截止11月15日

9月22日消息&#xff0c;支付宝近日发布公告称&#xff0c;已启动2023年收单外包服务机构评级工作。支付宝表示&#xff0c;收单外包服务机构评级工作是金融监管部门规范引导收单外包服务市场的重要举措&#xff0c;其结果将会向社会公示&#xff0c;直接关系到外包机构的业务开…

条件查询和数据查询

一、后端 1.controller层 package com.like.controller;import com.like.common.CommonDto; import com.like.entity.User; import com.like.service.UserService; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import …

Python实时采集Windows CPU\MEMORY\HDD使用率

文章目录 安装psutil库在Python脚本中导入psutil库获取CPU当前使用率&#xff0c;并打印结果获取内存当前使用率&#xff0c;并打印结果获取磁盘当前使用情况&#xff0c;并打印结果推荐阅读 要通过Python实时采集Windows性能计数器的数据&#xff0c;你可以使用psutil库。psut…