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

大一C语言课设 服装销售系统 代码实现与项目总结

问题分析

服装信息管理及销售管理系统。方便对库存服装的信息管理和添加新服装数据,同时兼具库存数量管理功能。

功能实现

1、建立服装信息库,包括:服装代码、型号、规格、面料、颜色、单价、数量;
2、建立销售信息库,包括:服装代码,数量,日期,售价,小记
3、程序分为两大模块:库存模块和销售模块。库存模块主要用于对服装信息的增加、删除、修改。销售模块主要用于管理库存数量;
4、浏览:管理员可以查询库存信息和销售信息。
5、查找或修改:可以通过编号查找服装。可以根据编号进行修改、删除信息;
6、登记:可以通过编号登记库存情况、销售情况,同时改变库存信息。

现在来看,这个项目最大的难点就是利用c语言的文件系统实现同时修改多个文件,例如服装下单时,要先检查剩余库存;购买时不仅要扣减库存,还要写入购买记录。在没有数据库时实现这一功能比较麻烦。

代码实现

/*该程序运行编译器为Dev-C++ 5.4.0 ,64位系统*/ 
#include<stdio.h>
#include<string.h>
typedef struct _clothes{int nu;			//nu as number,服装代码 char name[30];	char si[10];		//si as sizechar ma[20];	//ma as materialchar co[10];	//co as colorfloat pr;		//pr as prizeint qu;			//qu as quantity
}Clothes;			//建立clothes结构类型,方便进行读写
typedef struct _sale{int rn;			//rn as real number,means the sequence of infomationint nu;			//nu as number,服装代码 int qu;			//qu as quantitychar da[9];		//da as date,save by 8 bytes char;float pr;		//pr as prizechar note[20]; 
}Sale;				//建立sale结构类型,方便进行读写 
//键盘输入新的库存信息
void cgetlist(Clothes aClo[],int number,int innumber){				 int i;for(i=0;i<number;i++,innumber++){								//输入number个数据 printf("服装代码为(系统自动分配):%d\n",innumber+1);aClo[i].nu=innumber;printf("\t输入型号:");scanf("%29s",aClo[i].name);printf("\t输入规格:");scanf("%9s",aClo[i].si); printf("\t输入面料:");scanf("%19s",aClo[i].ma);printf("\t输入颜色:");scanf("%9s",aClo[i].co);printf("\t输入单价:");scanf("%f",&aClo[i].pr);printf("\t输入库存数量:");scanf("%d",&aClo[i].qu);}
}
//键盘输入新的销售信息 
int sgetlist(Sale aSal[],int number,int innumber){					int i;for(i=0;i<number;i++,innumber++){printf("销售记录代码为:%d\n",innumber+1); aSal[i].rn=innumber;printf("\t输入服装代码:");scanf("%d",&aSal[i].nu);printf("\t输入销售数量:");scanf("%d",&aSal[i].qu);if(reducecheck(aSal[i].nu,aSal[i].qu)==-1)	{return -1;}	//检查库存是否足够,不够就返回,中止后面的输入 printf("\t输入日期:");scanf("%s",aSal[i].da); printf("\t输入售价:");scanf("%f",&aSal[i].pr);printf("\t小记:");scanf("%s",aSal[i].note);}return 0;														//不然就不返回值 
}
//将cgetlist输入的信息写入文件,与文件直接通信
int save(Clothes aClo[],int number){								 int ret=-1;														//作为是否成功写入的标记值 FILE*fp=fopen("clothes.data","a");								//尝试用追加打开,用w打开的话会把之前的数据全部清除 if(!fp){														//如果打开失败(假设是由于没有可打开的文件) fclose(fp);													//就关闭文件指针 FILE*fp=fopen("clothes.data","w");							//再用w打开来建立文件 fclose(fp);													//然后关闭指针 FILE*fpc=fopen("clothes.data","a");							//再用追加打开 ret=fwrite(aClo,sizeof(Clothes),number,fpc);				//写入aClo结构体数组,同时给ret一个值 fclose(fpc);												//关闭指针 }else if(fp){													//如果用追加方式打开了 ret=fwrite(aClo,sizeof(Clothes),number,fp);					//就直接写入 fclose(fp);}return ret==number;												//返回number 
}
//将sgetlist输入的信息写入文件,与文件直接通信 
int ssave(Sale aSal[],int number){									int ret=-1;													//作为是否成功写入的标记值FILE*fp=fopen("sale.data","a");								//同save,用w或a打开 if(!fp){fclose(fp);FILE*fp=fopen("sale.data","w");fclose(fp);FILE*fpc=fopen("sale.data","a");ret=fwrite(aSal,sizeof(Sale),number,fpc);fclose(fpc);}else if(fp){ret=fwrite(aSal,sizeof(Sale),number,fp);fclose(fp);}return ret==number;
}
//读取打印库存数据 
void read(FILE*fp,int index){										fseek(fp,index*sizeof(Clothes),SEEK_SET);						//fp指针移动到指定数据的位置 Clothes clo;													//建立结构体用来接受文件里的数据 if(fread(&clo,sizeof(Clothes),1,fp)==1){						//从文件读取数据,如果不成功的话就不输出到控制台 printf("服装代码:%d",index+1);								//用printf输出clo里的数据 printf("\t型号:%s\n",clo.name);printf("\t规格:%s\n",clo.si);printf("\t面料:%s\n",clo.ma);printf("\t颜色:%s\n",clo.co);printf("\t单价:%.2f\n",clo.pr);printf("\t数量:%d\n",clo.qu);}
}
//read函数的封装,无形参,操作界面里调用 
void reads(){														FILE*fp=fopen("clothes.data","r");								//只读方式打开库存信息 if(fp){															//如果成功打开 fseek(fp,0L,SEEK_END);										//移动到文件末位 long size=ftell(fp);										//读取文件末位的数据量 int number=size/sizeof(Clothes);							//计算有几条数据 int index=0;												//让用户输入查找的服装编号 printf("共有%d条数据,输入要检查的服装代码:",number);		scanf("%d",&index);											//输入服装编号 read(fp,index-1);											//系统分配服装编号为了不出现0号,加了一,因此这里减一 fclose(fp);}getchar();														//scanf后输入了回车,这里接收掉 screen();														//回到操作界面 
}
//这里和read基本一样,但是打印的是销售数据 
void sread(FILE*fp,int index){										fseek(fp,index*sizeof(Sale),SEEK_SET);Sale sal;if(fread(&sal,sizeof(Sale),1,fp)==1){printf("销售记录编号:%d\n",index+1);printf("\t服装代码:%d\n",sal.nu);printf("\t销售数量:%d\n",sal.qu);printf("\t日期:%s\n",sal.da);printf("\t售价:%.2f\n",sal.pr);printf("\t小记:%s\n",sal.note);}
}
//sread的封装,和reads基本一样 
void sreads(){														FILE*fp=fopen("sale.data","r");if(fp){fseek(fp,0L,SEEK_END);long size=ftell(fp);int number=size/sizeof(Sale);int index=0;printf("共有%d条数据,输入要检查的销售记录编号:",number);scanf("%d",&index);sread(fp,index-1);fclose(fp);}getchar();screen();
}
//库存信息添加函数
void add(){															int number=0,innumber=0;										//number是用来遍历输入数据的,innumber是系统分配的代码 printf("要添加的服装种类数量:");scanf("%d",&number);Clothes aClo[number];											//建立number个aClo结构体 FILE*fp=fopen("clothes.data","r");								//以只读打开库存数据,以下这段代码是为了分配服装代码 if(fp){																	fseek(fp,0L,SEEK_END);										//移动到文件末尾 long size=ftell(fp);										//读取文件长度 innumber=size/sizeof(Clothes);								//计算已有的结构体数量 fclose(fp);													//关闭文件 }cgetlist(aClo,number,innumber);									//用getlist获取新库存信息 if(!save(aClo,number)){											//保存文件,如果返回-1的话 printf("服装入库失败\n");									//打印失败 }else printf("服装入库成功\n");									//否则打印成功 getchar();														//接受scanf输入的回车 screen();														//返回操作界面 
}
//销售信息添加函数,和add的实现方式基本一样 
void sadd(){														int number=0,innumber=0;printf("要添加的销售记录条数:");scanf("%d",&number);Sale aSal[number];												//建立number个aSal结构体 FILE*fp=fopen("sale.data","r");if(fp){fseek(fp,0L,SEEK_END);										//这段代码作用是读取有多少个数据 long size=ftell(fp);										//这样就可以由系统自动分配下一个编号 innumber=size/sizeof(Sale);fclose(fp);}if(sgetlist(aSal,number,innumber)==-1){							//如果sgetlist返回-1,说明库存不足 printf("^销售信息写入失败\n");}else{															//如果没有返回-1,调用ssave尝试保存 if(!ssave(aSal,number)){									//保存sgetlist输入的aSal结构体 printf("*销售信息添加失败\n");							}else printf("^销售信息添加成功\n");} getchar();														//接受scanf输入的回车screen();
}
//检查库存是否足够和修改库存,x是服装编号,y是销售数量
int reducecheck(int x,int y){FILE*fpr=fopen("clothes.data","r+");							//只读方式打开库存信息 if(fpr){						 								//如果成功打开Clothes clo[1];												//建立结构体用来接受文件里的数据			 fseek(fpr,(x-1)*sizeof(Clothes),SEEK_SET);					//fp指针移动到指定数据的位置								 fread(&clo,sizeof(Clothes),1,fpr);							//读取文件中的数据 if(clo[0].qu<y){											//如果库存不足 printf("库存不足 ");return -1;												//返回-1到getlist,getlist会返回-1到sadd }else {									printf("\t^^^库存充足\n");			clo[0].qu=clo[0].qu-y;									//将clo中的数量值修改为销售后的数量 fseek(fpr,(x-1)*sizeof(Clothes),0);						//移动到数据位置 fwrite(clo,sizeof(Clothes),1,fpr);						//用aclo覆盖原来的数据 fclose(fpr);											//关闭clothes.data,此时sale.data依然打开 }}													
}
//库存信息修改函数的实现,有形参
void change(FILE*fp,int index){Clothes aClo[1];												//建立临时结构体aClo接收数据 cgetlist(aClo,1,index);											//用cgetlist写入数据 到aClo fseek(fp,index*sizeof(Clothes),0);								//指针移动到数据位置 fwrite(aClo,sizeof(Clothes),1,fp);								//保存aClo到文件中 
}
//库存信息修改函数的封装,无形参
void changes(){FILE*fp=fopen("clothes.data","r+");								//只读方式打开库存信息 if(fp){															//如果成功打开 fseek(fp,0L,SEEK_END);										//移动到文件末位 long size=ftell(fp);										//读取文件末位的数据量 int number=size/sizeof(Clothes);							//计算有几条数据 int index=0;												//让用户输入修改的服装编号 printf("共有%d条数据,输入要修改的服装代码:",number);		scanf("%d",&index);											//输入服装编号 change(fp,index-1);											//调用修改函数,系统分配服装编号时为了不出现0号,加了一,因此这里减一 fclose(fp);}getchar();														//scanf后输入了回车,这里接收掉 screen();
}
//删除函数用的getlist
void dcgetlist(Clothes aClo[],int innumber){aClo[0].nu=innumber;strcpy(aClo[0].name,"此处数据已删除"); 							//为了查找系统正常工作,不清空数据,而是替换为空 strcpy(aClo[0].si,"");strcpy(aClo[0].ma,"");strcpy(aClo[0].co,"");aClo[0].pr=0;aClo[0].qu=0;
}
//删除函数
void del(FILE*fp,int index){Clothes aClo[1];												//建立临时结构体aClo dcgetlist(aClo,index-1);										//将aClo变为删除后的特殊结构体 fseek(fp,index*sizeof(Clothes),0);								//指针移动到数据位置 fwrite(aClo,sizeof(Clothes),1,fp);								//把aClo写入文件 
}
//删除函数的封装,无形参,操作界面里调用
void dels(){FILE*fp=fopen("clothes.data","r+");								//只读方式打开库存信息 if(fp){															//如果成功打开 fseek(fp,0L,SEEK_END);										//移动到文件末位 long size=ftell(fp);										//读取文件末位的数据量 int number=size/sizeof(Clothes);							//计算有几条数据 int index=0;												//让用户输入删除的服装编号 printf("共有%d条数据,输入要删除的服装代码:",number);		scanf("%d",&index);											//输入服装编号 del(fp,index-1);											//系统分配服装编号为了不出现0号,加了一,因此这里减一 fclose(fp);}getchar();														//scanf后输入了回车,这里接收掉 screen();
}
//操作界面函数
int screen(){char a;printf("N-服装信息登记,M-服装信息修改,R-服装信息查找\n");printf("D-服装信息删除,S-服装销售登记,G-销售信息查找\n");printf("Q-退出系统\n");printf("输入字母来决定操作:");scanf("%c",&a);switch(a){case'N':add();break;case'M':changes();break;case'R':reads();break;case'D':dels();break;case'S':sadd();break;case'G':sreads();break;}																		
}
int main(){screen();
}

项目总结(大一时所写原文,未改动)

首先,从结果来看,整个程序并不复杂,结构很简单,但是设计过程中依然碰到了很多问题并严重延长了开发周期,这一方面时体现了对c语言仍然不够熟练,另一方面也表明对程序设计难度的低估。
先来说说几个遇到的问题。首先在还没开始时就犯了难。要如何能够把数据写进文件,还能按原样一个一个读出来呢?又要如何实现查找呢?最早还没开始做时,设想过用链表和二叉树来写,但实际操作才发现文件里实现不了。后来想过用“#”等符号作为分隔符,但是这样好像也很难实现按型号、规格等一条条输出,而且修改很困难。后来通过进一步学习才发现用二进制写入可以实现写入结构体和链表。现在写入的问题解决了,接下来就要解决查找的问题。一开始想法是把文件里内容全部读进内存再用strstr找,但这里也有问题,一是strstr查找精度不高,比如要查找Tom,函数可能找到Toma就返回了。其次,找到之后,要输出接下来的数据也比较难。最终决定,由系统自动分配专门编号,再由这一编号来进行查找、修改和删除等。这一决定也使得之后的销售系统对库存进行修改的操作变得更加简单。
开始的添加和查找函数都比较简单,所以遇到的困难不多。这里有一点,增加函数要么用“w”打开,要么用“a”打开,用w的话,之后再打开文件夹添加库存时,会直接清空以前的文件;而用a打开的话,则无法创建文件夹。最后是设置了一个if语句来判断是否存在文件。修改就有些麻烦了。考虑到删除也可以看作修改,就先从删除函数开始。因为要按照上文的按编号查找的话,是不能直接清空一个结构体的,这样会直接导致后面的编号全部乱掉。所以采取了把数据替换为空字符的做法。这样虽然不能直接减少空间,但考虑到本身就是数据量很小的纯字符数据,所以这样影响也不大。然后就是删除函数的实现。首先肯定不能用w方法打开,这样一打开就什么都没了。然后用过用a打开,结果即使用fseek把指针移动到指定位置,也只能写到文件末尾。最后发现,用“r+”方法打开就可以实现覆盖到指定位置。之后还犯了一个小错误,直接把新字符串=原字符串,结果出现了乱码。然后才发现要用strcpy函数。解决了删除函数之后,修改函数也就不难了,只需要把删除里面的空白结构体换成用户输入结构体即可。
然后是销售管理部分。添加和查找销售记录都比较简单,和上面一样,只要修改一下结构体就可以。但涉及到和库存函数的通信,就有些麻烦了。当我们输入完服装编号和销量后,就应该立刻判断是否库存不够,如果不够就立即弹出信息并返回;同时输入的数据也要及时清除,防止混进下一次输入造成乱码。于是这里用了一个检测函数,并且可以直接return退出。但是这个检测函数也没那么简单,碰到了很多麻烦。同时检测函数也要担负把销售后剩余库存信息写进库存文件的功能。最终的解决办法是,再检测函数里用另一个文件指针打开库存文件,读取这里的信息,检测是否库存足够,足够的话就把原有信息修改后,覆盖到原来的位置。
最后是操作界面函数。以上的函数都能正常工作,但是放到switch里面时,要么不能打开,要么直接退出,要么显示两次操作界面。最后发现,每个函数都要用scanf输入数据,这个过程会往缓冲区里写入一个回车符,随后它就直接输入到了操作界面,这就引发了上面的诸多问题。最后的解决办法是往每个函数末尾添加了一个getchar()来接收回车符。
通过这个项目的编写,认识到了以下几个点:

  1. 对C语言的很多操作,尤其是对文件的操作,其实还并不了解。此外,用等号给字符数组赋值的错误操作也出现了。
  2. C++的确是对C语言的非常重要的扩展。例如String类,就可以直接用等号赋值;更重要的是,上面的服装信息系统和销售信息系统本质上非常相似,其实完全可以用类来实现。以及一些函数,只是一些参数有变化,应该也可以用模板函数实现。
  3. 数据库是非常伟大的发明。用C自带的文件通讯还是比较麻烦的,而且经常会有一些错误操作导致数据损坏。用数据库的话,不仅可以方便的储存一些更高级的数据结构,同时在一些方面也更安全。

相关文章:

大一C语言课设 服装销售系统 代码实现与项目总结

问题分析 服装信息管理及销售管理系统。方便对库存服装的信息管理和添加新服装数据&#xff0c;同时兼具库存数量管理功能。 功能实现 1、建立服装信息库&#xff0c;包括&#xff1a;服装代码、型号、规格、面料、颜色、单价、数量&#xff1b; 2、建立销售信息库&#xff…...

从新手到专家:深入探索JVM垃圾回收--开端篇

引言&#xff1a; 在Java的世界里&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制扮演着至关重要的角色&#xff0c;它决定了Java应用的性能、稳定性和扩展性。本系列文章旨在深入探讨JVM中的垃圾回收技术&#xff0c;从基础的概念讲起&#xff0c;直…...

R可视化:另类的柱状图

介绍 方格状态的柱状图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…...

Docker的数据管理(数据卷+数据卷容器)

文章目录 一、Docker的数据管理1、概述2、主要的技术&#xff08;三种数据挂载方式&#xff09;2.1、数据卷&#xff08;Volumes&#xff09;2.2、绑定挂载&#xff08;Bind mounts&#xff09;2.3、tmpfs挂载&#xff08;Tmpfs mounts&#xff09;2.4、之间的关系&#xff08;…...

字符串-至多包含K种字符的子串中最长子串(mid)

一、题目描述 二、解题思路 借鉴以下题目思想&#xff0c;使用双指针&#xff0c;外层循环右侧指针移动&#xff0c;内存循环左侧指针移动 字符串-最长不含重复字符的子字符串(mid)-CSDN博客文章浏览阅读622次&#xff0c;点赞17次&#xff0c;收藏4次。java刷题&#xff1a;…...

Docker从安装开始精通

从虚拟机到容器 1.环境配置的难题 软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户计算机的环境都不相同&#xff0c;你怎么知道自家的软件&#xff0c;能在那些机器跑起来&#xff1f; 用户必须保证两件事&#xff1a;操作系统的设置&#xff0c;各种库和组件的安装…...

MFC:初步理解序列化与反序列化(含代码实现)

序列化与反序列化是MFC将对象数据以二进制数据流的形式进行存储和读取的机制&#xff0c;读、写的效率很高。通过序列化与反序列化&#xff0c;可以将程序中对象在内存中数据保存到文件 (磁盘) 或者从文件 (磁盘) 中读取到内存以恢复对象数据&#xff0c;从而实现程序对数据的持…...

python程序控制结构

文章目录 一、python程序控制结构介绍二、顺序结构2.1、print()函数2.2、end参数2.3、input()函数 三、选择结构3.1选择结构的用途 四、循环结构4.1循环结构的构造4.1.1、循环结构的三个要素4.1.2、循环结构的一个要求4.1.3、循环结构的一个关系 4.2、循环语句4.2.1、while语句…...

【GD32】04 - Timer定时器

GD32中的定时器 GD32E230中有七个定时器&#xff0c;六种类型&#xff0c;其中通用的L4版本有两个&#xff0c;其他类型的各一个。 那我们就以通用L4这个类型来敲代码&#xff0c;其他流程是通用的。 通用L4 虽然每种类型的定时器都有自己的结构框图&#xff0c;但是其实大差…...

Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; func maxProfit(prices []int) int {buy1, sell1 : -prices[0], 0buy2, sell2 : -prices[0], 0for i : 1; i < len(prices); i {buy1 max(buy1, -prices[i])sell1 max(sell1, buy1prices[i])buy2 max(buy2, sell1-prices[i])sell2 m…...

Leetcode2028. 找出缺失的观测数据

Every day a Leetcode 题目来源&#xff1a;2028. 找出缺失的观测数据 解法1&#xff1a;模拟 统计当前 m 个元素的总和 curSum sum(rolls)&#xff0c;总共 mn 个元素和为 total (m n) * mean。 排除 2 种情况&#xff1a; total - curSum > 6 * n&#xff1a;n 个…...

如何在CentOS中合理划分磁盘空间以优化系统性能

目录 前言 理想的分区方案 为什么需要单独分区 安全性 性能 管理和维护 稳定性和可靠性 升级和兼容性 结论 前言 在进行CentOS系统的安装和配置时&#xff0c;合理划分磁盘空间是确保系统性能、安全性和易于管理的关键步骤。本文将探讨如何根据系统的硬件配置和预期用途…...

算法(十一)贪婪算法

文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法&#xff08;Greedy&#xff09;是一种在每一步都采取当前状态下最好的或者最优的选择&#xff0c;从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断&#xff0c…...

Rust之函数式语言特性:迭代器和闭包(一):概述

开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感&#xff0c;其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…...

配置资源管理

一 Secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;这类数据虽然也可以存放在 Pod 或者镜像中&#xff0c;但是放在 Secret 中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 1 有三种类型&#xff1a; kubernetes.io/service…...

unity2020打包webGL时卡进程问题

我使用的2020.3.0f1c1&#xff0c;打包发布WEB版的时候会一直卡到asm2wasm.exe这个进程里&#xff0c;而且CPU占用率90%以上。 即使是打包一个新建项目的空场景也是同样的问题&#xff0c;我尝试过一直卡在这里会如何&#xff0c;结果还真打包成功了。只是打包一个空场景需要20…...

云原生架构相关技术_3.无服务器技术

1.技术特点 1.1面向特定领域的后端云服务&#xff08;BaaS&#xff09; 随着以Kubernetes为代表的云原生技术成为云计算的容器界面&#xff0c;Kubernetes成为云计算的新一代操作系统。面向特定领域的后端云服务&#xff08;BaaS&#xff09;则是这个操作系统上的服务API&…...

Leetcode:Z 字形变换

题目链接&#xff1a;6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;二维矩阵的直接读写&#xff09; 解决办法&#xff1a;直接依据题目要求新建并填写一个二维数组&#xff0c;最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并…...

Python 3 判断文件是否存在

1 使用os.path模块 import osfile_path hello.txtif os.path.exists(file_path):print(f"文件 {file_path} 存在。") else:print(f"文件 {file_path} 不存在。") 2 使用pathlib模块 from pathlib import Pathfile_path Path(word.txt)if file_path.ex…...

(深度学习记录)第TR3周:Transformer 算法详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文本的输入处理中&#xff0c;transformer会将输入文本序列的每个词转化为一个词向量&#xff0c;我们通常会选择一个合适的长度作为输入…...

谷神前端组件增强:自定义列

初始化 $gp.customColumn {}initColumnPool /*** initColumnPool* 初始化列池* * param prefix 前缀* param length 长度* * return Array 列ID数组* */ function initColumnPool (prefix, length) {return Array.from({length}, (value, index) > prefix index) } self…...

31-ESP32-S3-WIFI篇-02 Event Group (事件标记组)

ESP32-S3-WIFI 事件标记组 介绍 在ESP32-S3的WiFi驱动程序中&#xff0c;事件标记组&#xff08;Event Group&#xff09;是一个非常重要的概念。它是FreeRTOS中的一种同步机制&#xff0c;用于在任务之间传递和同步事件。在WiFi驱动程序中&#xff0c;我们使用事件标记组来通…...

构建企业级AI私有知识库

一、引言 在当今竞争激烈的市场环境中&#xff0c;企业为了保持竞争优势&#xff0c;需要高效地管理和利用内部知识资源。构建一个企业级AI私有知识库&#xff0c;不仅可以集中存储和管理企业知识&#xff0c;还能通过人工智能技术实现知识的智能化处理和利用。本文将详细介绍…...

C语言王国——杨氏矩阵

目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题&#xff1a; 一看这不是杨氏矩阵嘛&#xff0c;接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知&#xff1a; …...

陪玩小程序都需要怎么做?

开发陪玩小程序需要进行全面的需求分析、功能规划、技术选型、界面设计等一系列步骤。陪玩小程序作为一种新兴的网络服务平台&#xff0c;为用户提供了寻找游戏伙伴、预约陪玩服务等功能&#xff0c;满足了用户在游戏领域的社交互动和技能提升需求。具体分析如下&#xff1a; 需…...

postgressql——子事务可见性判断 性能问题(8)

子事务可见性判断 & 性能 测试SQL BEGIN; PREPARE sel(integer) ASSELECT count(*)FROM contendWHERE id BETWEEN $1 AND $1 + 100; PREPARE upd(integer) ASUPDATE contend SET val = val + 1WHERE id IN ($1, $1 + 10, $1 + 20, $1 + 30);SAVEPOINT a; \set rnd random…...

20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头

20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头 2024/5/31 20:04 USB摄像头分辨率&#xff1a;1080p&#xff08;1920x1080&#xff09; 默认编译Buildroot的SDK即可点亮USB摄像头。v4l2-ctl --list-devices v4l2-ctl --list-formats-ext -d /dev/video74 …...

从0开始学统计-什么是回归?

1.什么是回归&#xff1f; 回归&#xff08;Regression&#xff09;是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量&#xff08;输入变量&#xff09;与因变量&#xff08;输出变量&#xff09;之间的关系。在回归分析中&#xff0c;我们尝试根…...

Element-ui使用上传时弹框选择文件类型

实现效果 1&#xff0c;点击上传&#xff0c;上传文件&#xff1b; 2&#xff0c;选择文件&#xff1b; 3&#xff0c;弹框选择文件类型&#xff1b; 4&#xff0c;选择类型后确定上传&#xff1b; 一&#xff0c;上传 跳过&#xff1b; 二&#xff0c;定义弹框下拉框…...

原生小程序一键获取手机号

1.效果图 2.代码index.wxml <!-- 获取手机号 利用手机号快速填写的功能&#xff0c;将button组件 open-type 的值设置为 getPhoneNumber--><button open-type"getPhoneNumber" bindgetphonenumber"getPhoneNumber">获取手机号</button> …...

ARM虚拟机安装OMV

OMV(OpenMediaVault)是基于 Debian GNU/Linux 的网络连接存储&#xff08;network attached storage&#xff0c;NAS&#xff09;解决方案。它包含 SSH、(S) FTP、SMB/CIFS、DAAP 媒体服务器、rsync、 BitTorrent 等很多种服务。它可用于 x86-64 和 ARM 平台。 在x86-64平台上&…...

【协议开发系列】梳理关于TCP和UDP两种协议的区别和使用场景

起源 前二天项目上在核对外部对接服务的五元组列表的时候&#xff0c;有一位客户提问对于同样的服务同时支持tcp和udp二种方式&#xff0c;有什么优点和缺点&#xff0c;应该如何选择&#xff1f;这个问题突然让我愣了一下&#xff0c;确实好久没有“温故”了&#xff0c;相关…...

vue blob实现自定义多sheet数据导出到excel文件

背景&#xff1a;最近vue项目遇到一个需求&#xff0c;就是需要将多个表格分成不同sheet页并导出&#xff0c;之前的工具类只能导出一个sheet页&#xff0c;所以在原有的基础上&#xff0c;调整一下&#xff0c;让它支持多sheet导出。 vue blob文件流&#xff0c;这个肯定要的…...

Python—面向对象小解(3)

一、多态 多态指的是一类事物的多中形态 相同的方法&#xff0c;产生不同的执行结果 运算符 * 的多态 int int 加法计算 str str 字符串拼接 list list 列表的数据合并 在python中可以使用类实现一个多态效果 在python中使用重写的方式实现多态 &#xff08;1&#xff09;定…...

Nginx超时时间

Nginx是一款自由、开源、高性能的HTTP和反向代理服务器&#xff0c;它可以通过不同的设置来提高网站的性能和安全性。其中&#xff0c;设置Nginx超时时间非常重要&#xff0c;因为它将直接影响网站的响应速度和用户体验。本文将从多个方面详细阐述Nginx超时时间的设置方法与注意…...

Imgs,GT,Edge,Gradient_all,Gradient_Foreground

保存一下&#xff1a; 做个记录&#xff1a; import cv2 import os import numpy as np# 对整张图片做canny检测 得到纹理图 def canny_all(input_path, output_path):# 遍历文件夹中的所有文件for filename in os.listdir(input_path):# 构造完整的文件路径image_path os.p…...

自学成才Flutter 弹性布局、线性布局

本文我们要介绍 Flutter 中布局 Widget&#xff0c;包括弹性布局、线性布局 流式布局和层叠布局。 Flutter中文网 Flutter开发 一、弹性布局--Flex Flex 类似 Android 中的 FlexboxLayout&#xff0c;和 Expanded 配合使用可以实现子Widget 按照一定比例来分配父容器空间。 使…...

Part 3.1 深度优先搜索

深度优先搜索&#xff08;DFS&#xff09;&#xff0c;即按照深度优先的顺序搜索的算法。 深度优先搜索一般使用栈来实现。 [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得…...

前端Vue小兔鲜儿电商项目实战Day03

一、Home - 整体结构搭建和分类实现 1. 页面结构 ①按照结构新增5个组件&#xff0c;准备最简单的模板&#xff0c;分别在Home模块的入口组件中引入 src/views/Home/components/ HomeCategory.vue HomeBanner.vue HomeNew.vue HomeHot.vue HomeProduct.vue <script …...

ORACLE 查询SQL优化

1 使用EXPLAIN PLAN 使用EXPLAIN PLAN查看查询的执行计划&#xff0c;这可以帮助你理解查询是如何被Oracle执行的。基于执行计划&#xff0c;你可以确定是否存在索引缺失、不必要的全表扫描等问题。 以下是几种使用EXPLAIN PLAN的方法&#xff1a; 使用EXPLAIN PLAN FOR: 你可以…...

Ansible03-Ansible Playbook剧本详解

目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包&#xff0c;安装软件包&#xff0c;启动服务5.3.3.1 任务拆解…...

Qt-qrencode生成二维码

Qt-qrencode开发-生成二维码&#x1f4c0; 文章目录 Qt-qrencode开发-生成二维码&#x1f4c0;[toc]1、概述&#x1f4f8;2、实现效果&#x1f4bd;3、编译qrencode&#x1f50d;4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…...

长安链使用Golang编写智能合约教程(三)

本篇主要介绍长安链Go SDK写智能合约的一些常见方法的使用方法或介绍 资料来源&#xff1a; 官方文档官方示例合约库 官方SDK接口文档 教程一&#xff1a;智能合约编写1 教程二&#xff1a;智能合约编写2 一、获取参数、获取状态、获取历史记录的方法解析 注意&#xff01; …...

Vercel deploy- Nextjs project error-URL link-env variable

Vercel deploy- Nextjs project error-URL link-env variable Error Check Database URL Check next-auth URL NEXTAUTH_URLhttps://yourappname.vercel.app/ 依次排查可能性 Application error: a server-side exception has occurred (see the server logs for more in…...

Java | Leetcode Java题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProfit(int[] prices) {int n prices.length;int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 Math.max(buy1, -prices[i]);sell1 Math.max(sell1, b…...

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)

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

Redis实现延迟队列

最近用到一个延迟消息的功能&#xff0c;第一时间想到使用MQ或者MQ的插件&#xff0c;因为数据量不大&#xff0c;所以尝试使用Redis来实现了&#xff0c;毕竟Redis也天生支持类似MQ的队列消费&#xff0c;所以&#xff0c;在这里总结了一下Redis实现延迟消息队列的方式。 一、…...

如何准确查找论文数据库?

在学术研究过程中&#xff0c;查找相关论文是获取最新研究成果、支持自己研究的重要途径。准确查找论文数据库不仅可以节省时间&#xff0c;还能确保找到高质量的学术资源。本文将介绍一些有效的方法和策略&#xff0c;帮助您准确查找论文数据库。 1. 选择合适的数据库 不同的…...

翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)

What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080319-00/?p23073 Raymond Chen 2008年03月19日 拖拽虚拟文件&#xff08;IStream 版本&#xff09; 上一次&#xff0c;我们看…...

【FPGA】Verilog语言从零到精通

接触fpga一段时间&#xff0c;也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇&#xff1a;Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架&#xff1a;模块的结构 类比&#xff1a;c语言的基础…...