c++中如何在字符串中加入变量?

在用c++操作mysql时,SQL语句是字符串,但是其中的某些字段需要变量来表示(比如插入的内容),该怎么做呢?
即希望:insert into table2( , ) values( , ) 空的部分用变量表示,可在外部随时修改

3个回答

可以使用stringstream,示例代码如下:

#include <sstream>  //必要的头文件
string currency;         //std::string
currency = "EURUSD";  //currency即题目中所谓的变量部分
std::stringstream ss;
ss << "lynx -dump 'http://somesite.com/q?s=" << currency << "=X' > file.txt";  //注意双引号和单引号的使用
system(ss.str().c_str());  //调用system函数执行上述字符串

楼主调试时,可以先写一个简单的sql语句找找感觉。

如果对您有帮助,请采纳答案好吗,谢谢!

可以格式化字符串即可~~~~

sprintf就可以,用法和printf类似,只是结果放在字符串里面。
https://baike.baidu.com/item/sprintf/9703430?fr=aladdin

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++中如何在字符串中加入变量?
在用c++操作mysql时,SQL语句是字符串,但是其中的某些字段需要变量来表示(比如插入的内容),该怎么做呢? 即希望:insert into table2( , ) values( , ) 空的部分用变量表示,可在外部随时修改
c/c++ 如何在字符串里面加入变量?
就比如说我现在有个s[3]="**",然后我声明char *t="a s[2] b“,使得t指向的位置为字符串"a * b"?
c++变量的定义与值的修改
各位大侠,我初学c++的老白兔,今天第一次上来,请教了。 函数splitmsg中我试图将参数str分解成三个内容:第一个是要移动的点A/B/C...(大写),第二个是要移动的轴x/y(小写),第三个参数是移动的步长。 函数返回一个字符串。头文件中已经定义了的public变量如下: char CurPoint[2], CurAxis[2]; int CurMove; DWORD Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,Ox,Oy; DWORD Wx,Wy; //当前正处理的坐标 我希望从得到的三个变量中的头两个确定要移动的点、轴和移动的步长 ``` char* Timer::splitmsg(char* str){ //传过来的字符串格式:(A,x,-1)/(D,D,0)/(B,y,12) char *rtnstr=""; if(str==NULL) return rtnstr; char *ObjProperty[8]={"A","B","C","D","O","x","y"}; //坐标对象 char *objn, *objs,*obja; sscanf(str,"%[^,],%[^,],%[^#]",&objn,&objs,&obja); sprintf(CurPoint,"%s",&objn); sprintf(CurAxis,"%s",&objs); CurMove = (int)&obja; rtnstr=CurPoint; //目前为止正常 if(strcmp(ObjProperty[0],CurPoint)==0){ Wx=Ax; Wy=Ay; } if(strcmp(ObjProperty[1],CurPoint)==0){ Wx=Bx; Wy=By; } if(strcmp(ObjProperty[2],CurPoint)==0){ Wx=Cx; Wy=Cy; } if(strcmp(ObjProperty[3],CurPoint)==0){ Wx=Dx; Wy=Dy; } if(strcmp(ObjProperty[4],CurPoint)==0){ Wx=Ox; Wy=Oy; } //目前为止都正常,可是无法将移动步长加入到所确定的目标坐标中, if(Wx>0 && Wy>0 && abs(CurMove)>0){ if(strcmp(ObjProperty[5],CurAxis)==0){ //Wx = Wx+CurMove; //出问题的地方 } if(strcmp(ObjProperty[6],CurAxis)==0){ //Wy = Wy+CurMove; //出问题的地方 } } return rtnstr; } ``` 请问: # 1、为什么坐标Wx和Wy不能修改?使用常数Wx = Wx+1都不行。我该如何修改? # 2、我的变量定义是否有问题?如果将开始的三个变量char CurPoint[2], CurAxis[2],int CurMove不是定义成public, # 而是在函数中定义的话,我的后续过程连坐标点都找不到,且程序会崩溃。为什么? 谢谢了!
串口编程16进制显示问题
void CComTestDlg::OnComm() { // TODO: Add your control notification handler code here VARIANT variant_inp;//定义一个VARIANT类对象 COleSafeArray safearray_inp;//定义一个COleSafeArray对象 LONG len,k; BYTE rxdata[2048];//设置BYTE数组 AN 8—intterthat is not signed. CString strtemp; if (m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有数据 { ////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.GetInput();//读缓冲区 safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); for(k=0;k<len;k++) { safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 } for(k=0;k<len;k++)//将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k); strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放 m_strRXData+=strtemp;//加入接收编辑框对应字符串 } } UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的) } ``` ``` 显示代码如上,请问怎样改才能让它16进制显示
vs2010 mfc ADO连接SQL server 程序不解
![图片说明](https://img-ask.csdn.net/upload/202001/23/1579746010_73671.jpg) 各位网友, 我在网站下载的一个MFC ADO方式连接SQL server数据库代码有个地方不明白,请帮忙看看 新建一个按钮,加入如下代码: void CADOTESTDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 1. ADOConn conn; 2. conn.OnInitADOConn(); 3. _bstr_t vSQL; 4. vSQL = "INSERT INTO [dbtest].[dbo].[userinfo] ([username],[userpwd]) VALUES('seamanj','123')"; 5. conn.ExecuteSQL(vSQL); 6. conn.ExitConnect(); 7. conn.m_pConnection; } MFC 中debug执行完第2行,m_pConnection中就有了地址,SQL server 中执行Select * from sys.dm_exec_connections可看到新的连接,但是执行完第6行应该m_pConnection中的地址被清空,并且断开连接的,可是实际情况是一直到执行完所有的代码并结束,m_pConnection才被清空并断开连接。 哪位能帮我解释下,谢谢。 ``` void ADOConn::ExitConnect() { // 关闭记录集和连接 if (m_pRecordset != NULL) m_pRecordset->Close(); m_pConnection->Close(); // 释放环境 ::CoUninitialize(); //CString temp=_T("0"); } ``` ``` void ADOConn::OnInitADOConn() { // 初始化OLE/COM库环境 //CoInitialize(NULL)和AfxOleInit()的区别: https://blog.csdn.net/zhoubl668/article/details/4139933 ::CoInitialize(NULL); try { // 创建Connection对象 m_pConnection.CreateInstance("ADODB.Connection"); // 设置连接字符串,必须是BSTR型或者_bstr_t类型 _bstr_t strConnect = "Provider=SQLOLEDB; Server=127.0.0.1;Database=dbtest; uid=lnhv013710; pwd=013710;"; m_pConnection->Open(strConnect,"","",adModeUnknown); } // 捕捉异常 catch(_com_error e) { // 显示错误信息 AfxMessageBox(e.Description()); } } ``` ``` #pragma once class ADOConn { // 定义变量 public: //添加一个指向Connection对象的指针: _ConnectionPtr m_pConnection; //添加一个指向Recordset对象的指针: _RecordsetPtr m_pRecordset; // 定义方法 public: ADOConn(); virtual ~ADOConn(); // 初始化—连接数据库 void OnInitADOConn(); // 执行查询 _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); // 执行SQL语句,Insert Update _variant_t BOOL ExecuteSQL(_bstr_t bstrSQL); void ExitConnect(); }; ```
mscomm读取十六进制转为十进制显示
VC6.0写的,本来下位机传的是十进制真好转成字符串显示,现在要求的单片机穿上来的是十六进制的数据请问怎么修改代码转成十进制字符串显示啊 ``` void CTemperDlg::OnCommMscomm() { m_strRXData=" "; //每次进入编辑框内容清空等待显示新的数据 VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 CString strtemp; static int flag; //识别码数字标志位 if(m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符 { //以下你可以根据自己的通信协议加入//处理代码 variant_inp=m_ctrlComm.GetInput();//读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为//ColeSafeArray型变量 len=safearray_inp.GetOneDimSize();//得到有效数据长度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k);//字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strRXData += strtemp; //加入接收编辑框对应字符串strtemp m_RXData+=strtemp; double tem; tem=atof(m_strRXData); CString aa; if(tem>31.00) { m_strlbaojing.SetIcon(m_hIconbaoj); } else m_strlbaojing.SetIcon(m_hIconzhc); } } UpdateData(FALSE); } ```
请问为什么我的上位机接收不到数据?这是我的控件代码,虚心向大神请教。
VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_mscom.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_mscom.get_Input(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k);//字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 ////此处编译有错误,可在项目属性->配置属性->常规里将“字符集”改为使用多字节字符集即可 m_EditReceive+=strtemp; //加入接收编辑框对应字符串 } } UpdateData(FALSE); //更新编辑框内容
怎样加入先序遍历的代码
#include <iostream> #include <stdio.h> #include <string> #define MAX 1000 using namespace std; typedef struct{ /* 定义哈夫曼编码的结构数组 */ char data; int weight; /* 定义权值 */ int parent; int lchild; int rchild; int num; }huffmannode; typedef struct{ /* 定义保存哈夫曼结构体 */ char bits[50]; int start; }huffmancode; int main() { huffmannode ht[100]; /* 定义储存权值的空间 */ huffmancode cd[100]; char string[100]; /* 定义数组存储空间 */ char hcd[100]; int i,j,x,y,s1,s2,m1,m2,num,c,f,k; cout<<"请输入长度 n= "; /* 输入字符的个数 */ cin>>num; cout<<"==============================="<<endl; for(i=0;i<num;i++) { getchar(); /* 获得输入的字符 */ cout<<"输入字符: "; cin>>ht[i].data; /* 输入字符函数 */ cout<<"输入权值: "; cin>>ht[i].weight; } cout<<"============================="<<endl; for(i=0;i<2*num-1;i++) { ht[i].parent=ht[i].lchild=ht[i].rchild=-1; /* 初始化父结点,左右子结点 */ } for (i=num;i<2*num-1;i++) { s1=s2=0; /* 初始化变量 */ m1=m2=MAX; for (j=0;j<i;j++) { if (ht[j].weight<m1 &&ht[j].parent==-1) /* 寻找无父结点的最小值 */ { m2=m1; s2=s1; m1=ht[j].weight; s1=j; /* 寻找当前最小值 */ } else if(ht[j].weight<m2 &&ht[j].parent==-1) /* 寻找无父结点的次小值 */ { m2=ht[j].weight; s2=j; } /* 寻找次小值 */ } ht[s1].parent=i; /* s1的父结点为i */ ht[s2].parent=i; ht[i].weight=m1+m2; /* 最小值的权值相加为i的权值 */ ht[i].lchild=s1; /* i的左子为s1 */ ht[i].rchild=s2; /* i的右子为s2 */ } for(i=0;i<num;i++) { cd[i].start=num; x=i; y=ht[x].parent; /* 记录父结点 */ while (y!=-1) { if (ht[y].lchild==x) cd[i].bits[cd[i].start]='0'; /* 给字符赋0值 */ else cd[i].bits[cd[i].start]='1'; /* 给字符赋1值 */ cd[i].start--; x=y; y=ht[y].parent; } } cout<<"字符"<<"->"<<"权值:"<<endl; for (i=0;i<num;i++) { cout<<ht[i].data; /* 输出字符 */ for(j=cd[i].start;j<=num;j++) { cout<<cd[i].bits[j]; /* 输出字符的01代码 */ } cout<<endl; } cout<<"============================="<<endl; cout<<"请输入信息: "<<endl; cin>>string; /* 输入字符串 */ for(i=0;string[i]!='\0';i++) { for(c=0;c<=num;c++) if(string[i]==ht[c].data) /* 寻找与输入字符相匹配的字母 */ { for(j=cd[c].start;j<=num;j++) cout<<cd[c].bits[j]; /* 输出字母代码 */ break; } } cout<<"============================="<<endl; cout<<"请输入密码:"; cin>>hcd; /* 输入0、1代码 */ f=2*num-2; for(i=0;hcd[i]!='\0';i++) { if(hcd[i]=='0') /* 判断输入为0,寻找左子 */ f=ht[f].lchild; else if(hcd[i]=='1') f=ht[f].rchild; /* 判断输入为1,寻找右子 */ if(f<num) { cout<<ht[f].data; /* 输出字符串 */ f=2*num-2; } } cout<<endl; return 0; }
基于NRF905和485总线的测温系统
买的NRF模块,485总线程序没写,烧录代码后,在上位机上显示乱码,NRF发送的是十六进制,void CTemperDlg::OnCommMscomm() { // TODO: Add your control notification handler code here m_strRXData=" "; //每次进入编辑框内容清空等待显示新的数据 VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 CString strtemp; static int flag; //识别码数字标志位 if(m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符 { //以下你可以根据自己的通信协议加入//处理代码 variant_inp=m_ctrlComm.GetInput();//读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为//ColeSafeArray型变量 len=safearray_inp.GetOneDimSize();//得到有效数据长度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k);//字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strRXData += strtemp; //加入接收编辑框对应字符串strtemp //bt[len]='\0'; m_RXData+=strtemp; double tem; tem=atof(m_strRXData); CString aa; if(tem>31.00) { m_strlbaojing.SetIcon(m_hIconbaoj); //m_ctrlComm.SetOutput(COleVariant(aa)); } else m_strlbaojing.SetIcon(m_hIconzhc); } } UpdateData(FALSE); } //DEL void CTemperDlg::InitChart() //DEL { //DEL m_ctrlChart.Series(0).Clear(); //DEL m_ctrlChart.GetAxis(http://msnpiki.msnfanatic.com/index.php/Main_Page-->#0000cc">).GetLeft().SetMinMax(-40, 100); //DEL }
c语言数据结构词索引表出了点问题,谁能帮忙看看呀
#include<stdio.h> #include<string.h> #include<stdlib.h> #include <conio.h> #include <ctype.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define MaxBookNum 1000 //假设只对1000本书建立索引表(1000) #define MaxKeyNum 2500 //索引表的最大容量(2500) #define MaxLineLen 500 //书目串的最大长度(500) #define MaxWordNum 10 //词表的最大容量 #define MaxWordLength 30 //单词的最大长度 typedef int Status; typedef int ElemType; //定义链表的数据元素类型为整型 typedef int Boolean; typedef struct { char item[MaxWordNum][MaxWordLength]; //字符串的数组 int last; //词表的长度 }WordListType; //词表的类型(顺序表) typedef struct { char *ch; //如果是非空串,则按串长分配存储区,否则ch为NULL int length; //串长度 }HString; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*Link,*Position; typedef struct { Link head,tail; int len; }LinkList; typedef struct { HString key; //关键词 LinkList bnolist; //存放书号索引的链表 }IdxTermType; //索引项类型 typedef struct { IdxTermType item[MaxKeyNum+1]; int last; }IdxListType; //索引表类型 //----------------主要变量-------------- char buf[MaxLineLen]; //书目串缓冲区 WordListType wdlist; //关键字词表 IdxListType idxlist; //索引表 char oftenwords[6][10] = {"an","a","of","and","to","the"}; /*******************************声明部分****************************************/ //--------------基本操作--------- void InitIdxList (IdxListType *idxlist); //初始化操作,置索引表idxlist为空表,且在idxlist.item[0]设一空串 void GetLine (FILE *f); //从文件F读入一个书目信息到书目串缓冲区buf void ExtractKeyWord (int *Num); //Status ExtractKeyWord(char* Buffer,WordListType *w,int *Num); //从buf中提取书名关键词到词表wdlist,书号存入bno Status InsIdxList (IdxListType *idxlist,ElemType bno); //将书号为bno的书名关键词按词典顺序插入索引表idxlist void PutText (FILE *g,IdxListType idxlist); //将生成的索引表idxlist输出到文件g //--------------为实现在索引表上进行插入,要先实现下列操作----------- void GetWord (int i,HString *wd); //用wd返回词表wdist中第i个关键词 int Locate (IdxListType *idxlist,HString wd,Boolean *b); //在索引表idxlist中查询是否存在与wd相等的关键词。若存在,则返回其在索引表 //中的位置,且b取值TRUE;否则返回插入位置,且b取值FALSE void InsertNewKey(int j,HString wd); //在索引表idxli的第i项上插入新关键词wd,并初始化书号索引的链表为空表 Status InsertBook (int i,int bno); //在索引表idxlist的第i项中插入书号为bno的索引 //------------串的堆分配存储表示----------- Status StrAssign(HString *T,char *chars); //生成一个其值等于串常量chars的串T int StrCompare(HString S,HString T); //若S>T,则返回值>0,若S=T,则返回值 = 0,若S<T,则返回值<0 Status StrCopy(HString *T, HString S); //由串S复制得串T //----------------带头结点的线性链表------------- Status InitList(LinkList *L); //构造一个空的线性链表L Status MakeNode(Link *p,ElemType e); //分配由p指向值e的结点,并返回OK;若分配失败,则返回ERROR Status Append (LinkList *L,Link s); //将指针s所指的一串结点链接在线性链表L的最后一个结点 //之后,改变链表L的尾指针指向新的尾结点 /*******************************函数部分****************************************/ Status StrAssign(HString *T,char *chars) { int i = strlen(chars); if((*T).ch) free((*T).ch); if(!i){ //若chars为空 (*T).ch = NULL; (*T).length = 0; } else{ //chars不空 if(!((*T).ch = (char *)malloc(i * sizeof(char)))) //为T分配chars所需的存储空间 exit(OVERFLOW); int count; for(count = 0;count <= i;count++) //把chars存入T中 (*T).ch[count] = chars[count]; (*T).length = i; } //else return OK; } void InitString(HString *T) { (*T).length = 0; (*T).ch = NULL; } int StrCompare(HString S,HString T) { int count; for(count = 0;count<S.length && count<T.length;count++){ if(S.ch[count] != T.ch[count]) return S.ch[count]-T.ch[count] ; } return S.length-T.length; } Status StrCopy(HString *T, HString S) { int j; if((*T).ch) free((*T).ch); //删除T串中原有值 (*T).ch = (char*)malloc(S.length * sizeof(char)); if(!(*T).ch) exit(OVERFLOW); for(j = 0; j <= S.length; j++) (*T).ch[j] = S.ch[j]; (*T).length = S.length; return OK; } Status InitList(LinkList *L) { Link p; p = (Link)malloc(sizeof(LNode)); if(!p) exit(OVERFLOW); p->next = NULL; (*L).head = (*L).tail = p; (*L).len = 0; return OK; } Status MakeNode(Link *p,ElemType e) { *p = (Link)malloc(sizeof(LNode)); if(!(*p)) exit(OVERFLOW); (*p)->data = e; (*p)->next = NULL; return OK; } Status Append (LinkList *L,Link s) { int i = 1; (*L).tail->next = s; while(s->next){ s = s->next; i++; } (*L).tail = s; (*L).len += i; return OK; } void GetWord(int i,HString *wd) { char *p; p = *(wdlist.item +i); StrAssign(wd,p); //生成关键字字符串 } int Locate(IdxListType *idxlist,HString wd,Boolean *b) { int i,m; for(i = (*idxlist).last-1; ( m=StrCompare((*idxlist).item[i].key,wd) ) >0; --i); if(m == 0){ //找到 *b = TRUE; return i; } else{ *b = FALSE; return i+1; } } void InsertNewKey(int j,HString wd) { int count; InitList(&idxlist.item[idxlist.last+1].bnolist); for(count = idxlist.last-1; count>=j; --count){ //后移索引项 idxlist.item[count+1] = idxlist.item[count]; } InitString(&idxlist.item[j].key); StrCopy(&idxlist.item[j].key,wd); //插入新的索引项 //串赋值 InitList(&idxlist.item[j].bnolist); //初始化书号索引表为空表 ++idxlist.last; } Status InsertBook (int i,int bookno) { Link p; if(!MakeNode(&p,bookno)) return ERROR; Append(&idxlist.item[i].bnolist,p); return OK; } Status InsertIdxList(IdxListType *idxlist,int bno) { int i,j; HString wd; Boolean b; InitString(&wd); for(i= 0;i<wdlist.last;++i){ GetWord(i,&wd); //获取wdlist中保存的单词 j = Locate(idxlist,wd,&b); //查找是否已存在于idxlist中 if(!b) //不存在 InsertNewKey(j,wd); //则插入新的关键词 InsertBook(j,bno); //插入书号 } return OK; } void InitIdxList (IdxListType *idxlist) { int i; (*idxlist).last = 0; for(i = 0;i<MaxKeyNum;i++){ InitList(&(*idxlist).item[i].bnolist); //初始化索引表项目中的书号的链表 } } void ExtractKeyWord (int *BookNum) { int i = 0,j = 0,k = 0,m; wdlist.last = 0; //很重要 Boolean Ignore; char TempChar[30]; for(m = 0;m<=30;m++) TempChar[m] = '\0'; //清空TempChat[] while(*(buf+i) !=' '){ //提取书目串缓冲区其中的书号 TempChar[i] = *(buf+i); //将书号以字符串类型保存在该数组中 i++; } TempChar[i] ='\0'; *BookNum = atoi(TempChar); //将书号转为int for(m = 0;m<=i;m++) TempChar[m] ='\0'; //清空TempChat[] i++; //推进一位,当前*(buf+i)开始为书名 while(*(buf+i) !='\n' && *(buf+i) != '\0'){ //每个字符串末尾都有结束符\n if(*(buf+i) != ' '){ //若非空字符 if(*(buf+i) >'A'&& *(buf+i) <= 'Z'){ *(buf+i) -= 'A' - 'a'; //若为大写,则转为小写 } TempChar[j] = *(buf+i); //把当前字符加入TempChar中//------------ j++; i++; } //if else{ //若为空字符,则检索当前TempChar中保存的字符串是否为常用词 Ignore = FALSE; //若Ignore为TRUE,则为常用词;为FALSE则不是常用词 for(m = 0;m<6;m++){ //查找是否为常用词 if(strcmp(TempChar,oftenwords[m]) == 0){ Ignore = TRUE; //是常用词 break; }//if }//for if(Ignore){ for(m = 0;m<=j;m++) TempChar[m] = '\0'; //清空TempChat[] i++; j = 0; }//if else{ //不是常用词 for(m = 0;m<=j;m++) //将该词插入wdlist中 wdlist.item[wdlist.last][m] = TempChar[m]; for(m = 0;m<=j;m++) TempChar[m] = '\0'; //清空TempChat[] k++; wdlist.last++; i++; j=0; }//else }//else }//while } void GetLine(FILE *f) { fgets(buf,MaxLineLen,f); } void PutText (FILE *g,IdxListType idxlist) { int i,j,k; Link p; for(i = 0;i<=idxlist.last;i++){ for(j = 0;j<idxlist.item[i].key.length; j++) putc(*(idxlist.item[i].key.ch + j),g); putc('\t',g); if(idxlist.item[i].key.length < 8) putc('\t',g); p = idxlist.item[i].bnolist.head; for(k = 0;k<idxlist.item[i].bnolist.len ; k++){ p = p->next; fprintf(g,"%03d",p->data); putc(' ',g); }//for putc('\n',g); }//for } void PrintFile(FILE *FileName) { char ch; rewind(FileName); ch = getc(FileName); while(ch != EOF){ putchar(ch); ch = getc(FileName); } printf("\n"); rewind(FileName); } /*******************************主函数部分**************************************/ int main() { FILE *f,*g; int ct; int BookNo; if((f = fopen("BookName.txt","r")) == NULL){ printf("ERROR in open BookName.txt\n"); exit(1); } if((g = fopen("KeyWordIndex_self.txt","w"))==NULL){ printf("ERROR in open KeyWordIndex_self.txt\n"); exit(1); } printf("书单文件:\n"); PrintFile(f); InitIdxList(&idxlist); WordListType w; while(!feof(f)){ GetLine(f); //读取书单文件中的一行到缓冲区 ExtractKeyWord(&BookNo); InsertIdxList(&idxlist,BookNo); } PutText(g,idxlist); fclose(f); fclose(g); printf("\n结果如下:\n"); if((g = fopen("KeyWordIndex_self.txt","r"))==NULL){ printf("ERROR in open KeyWorkIndex_self.txt\n"); exit(1); } PrintFile(g); fclose(g); return 0; }
这是我在 C++ Builder编程实例精解(赵现明)书上照着打学生成绩管理,出了一些问题。
附上代码如下: ```//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //----文件(信息)读取----------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { int File; struct student*Tmp=First; struct student*Tmp2; //-----设置全局变量的中间变量---- //-----尝试从文件读取记录信息---- First=NULL; if(!FileExists("StuScore.rcd")) //不存在这个文件 { Application->MessageBoxA("没有找到成绩记录文件!","失败!",0); return; } else { File=FileOpen("StuScore.rcd",fmOpenRead); if(File==-1) { Application->MessageBoxA("打开文件记录失败!","失败!",0); return; } while(true) { int hehe; Tmp2=(struct student*)malloc(sizeof(struct student)); hehe=FileRead(File,Tmp2,sizeof(struct student)); if(hehe<sizeof(struct student)) { free(Tmp2); break; //文件读完了 } if(!First) //First==NULL { First=Tmp2; First->Next=First; First->Pre=First; Tmp=First; } else //First!=NULL { Tmp->Next=Tmp2; Tmp->Next->Pre=Tmp; Tmp=Tmp->Next; Tmp->Next=First; First->Pre=Tmp; } } FileClose(File); } } //---添加或修改------------------------------------------------------------------------ bool _fastcall TForm1::Add(bool RePlace) { //姓名和学号必须填好,成绩可以不填, //并赋成绩为-1以标记没有登录成绩 if(EditNum->Text=="") { Application->MessageBoxA("请填写学生的学号!","错误输入!",0); return false; } else if(EditName->Text=="") { Application->MessageBoxA("请填写学生的姓名!","错误输入!",0); return false; } else if(!RBtnMale->Checked&&!RBtnFemale->Checked) { Application->MessageBoxA("请选择学生的性别!","错误输入!",0); return false; } else { struct student*temp=(struct student*)malloc(sizeof(struct student)); //寻找对应id的姓名,如果链表中存在id; //则不添加用户 struct student*temp2=First; if(First&&!RePlace)//连表不为空,并且是新增信息,不是修改 { do { if(EditNum->Text.ToInt()==temp2->ID) //ToInt()把里面的字符串转换成整数 { //存在此ID Application->MessageBoxA("此学号已存在,请更改!", "错误输入!",0); return false; } else { temp2=temp2->Next; } } while(temp2!=First); //遍历循环链表 } //现在可以添加信息了 temp->ID=EditNum->Text.ToInt(); StrPCopy(temp->Name,EditName->Text); //纪录性别 if(RBtnMale->Checked) temp->Sex=0; //男 else temp->Sex=1; //女 //记录成绩 if(EditMath->Text=="") temp->Math=-1; //不登记成绩 else temp->Math=EditMath->Text.ToDouble(); if(EditChinese->Text=="") temp->Chinese=-1; else temp->Chinese=EditChinese->Text.ToDouble(); if(EditEnglish->Text=="") temp->English=-1; else temp->English=EditEnglish->Text.ToDouble(); //把temp加入链表中 if(!First) //没有记录 { First=temp; First->Next=First; First->Pre=First; } else { temp->Pre=First->Pre; temp->Next=First; temp->Pre->Next=temp; temp->Next->Pre=temp; } } return true; } //---删除------------------------------------------------------------------------- void _fastcall TForm1::Del(struct student* DelStu) { if(DelStu&&First) //链表中存在学生信息,而且要删除的信息不为空 { if(First==DelStu) //删除第一条信息 { if(First->Next==First)//只有一条信息 First=NULL; else First=First->Next; } DelStu->Pre->Next=DelStu->Next; DelStu->Next->Pre=DelStu->Pre; free(DelStu); } } //-----信息的查找(onchange事件的响应)--------------------------------------------------------------- void __fastcall TForm1::EditNumChange(TObject *Sender) { //寻找对应id的姓名,如果在链表中存在id, //如果处在编辑状态,即新添信息,或者修改信息,那么不处理此事件 if(EditName->Enabled) return; //TmpStu是全部变量,它要对应当前在窗口中显示的信息 //所以,每次的EditNum改变,都要先清空它 TmpStu=NULL; EditName->Text=""; RBtnMale->Checked=false; RBtnFemale->Checked=false; EditMath->Text=""; EditChinese->Text=""; EditEnglish->Text=""; if(!First) return; //还没有任何的学生信息,则直接返回 //在查找,更改(查找要更改的信息),删除(查找要删除的信息) //都要根据学号的变化适时显示信息,这个功能由这段代码实现 struct student*NowTmp=First; //查找对应学号的信息,并用全局变量TmpStu来指向它 if(EditNum->Text.Length()) //学号输入框不为空 { do { if(EditNum->Text.ToInt()==NowTmp->ID) { //找到信息,显示在窗体中 TmpStu=NowTmp; EditName->Text=TmpStu->Name; if(TmpStu->Sex) RBtnFemale->Checked=true; else RBtnMale->Checked=true; if(TmpStu->Math==-1) EditMath->Text=""; //未登记成绩 else EditMath->Text=TmpStu->Math; if(TmpStu->Chinese==-1) EditChinese->Text=""; else EditChinese->Text=TmpStu->Chinese; if(TmpStu->English==-1) EditEnglish->Text=""; else EditEnglish->Text=TmpStu->English; //如果是在查找和删除模式下, 则把OK/Cancel按钮置为可用 if(TabSet1->TabIndex==2||TabSet1->TabIndex==3) { BitBtn1->Enabled=true; BitBtn2->Enabled=true; } break; //找到信息后跳出while循环 } else { NowTmp=NowTmp->Next; //下一个信息 } } while(NowTmp!=First); // 遍历环形链表 } } //--------------------------------------------------------------------------- //---信息的保存------------------------------------------------------------------------ void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose) { Save(false); //自动保存 } void _fastcall TForm1::Save(bool Auto) { int File; struct student*Tmp=First; if(!First) //没有用户信息 { if(!Auto) Application->MessageBoxA("没有学生信息!","保存失败",0); return ; } if(FileExists("StuScore.rcd")) //存在记录文件 { if(!DeleteFile("StuScore.rcd")) //删除失败 { Application->MessageBoxA("删除旧记录失败!","不能保存",0); } } File=FileCreate("StuScore.rcd"); if(File==-1) //创建失败 { Application->MessageBoxA("创建文件 StuScore.rcd 失败,不能保存","失败",0); } //写文件 do { if(FileWrite(File,Tmp,sizeof(struct student))==-1); Application->MessageBoxA("一个错误!","提示",0); Tmp=Tmp->Next; } while(Tmp!=First); FileClose(File); } //----TabSet的响应----------------------------------------------------------------------- void __fastcall TForm1::TabSet1Change(TObject *Sender, int NewTab, bool &AllowChange) { switch(TabSet1->TabIndex) { case 0: //添加新学生 { //设置组建可用 EditName->Enabled=true; GroupBoxSex->Enabled=true; GroupBoxScore->Enabled=true; BitBtn1->Enabled=true; BitBtn2->Enabled=true; LabelHint->Caption="提示:输入学生学号,其它信息随学号动态显示"; } break; case 2://修改 { EditName->Enabled=false; GroupBoxSex->Enabled=false; GroupBoxScore->Enabled=false; //在输入学号被查找到的时候,置按钮可用 BitBtn1->Enabled=false; BitBtn2->Enabled=false; LabelHint->Caption="提示:输入学号,点击OK,修改后按OK保存修改"; } break; case 3://删除 { EditName->Enabled=false; GroupBoxSex->Enabled=false; GroupBoxScore->Enabled=false; //在输入学号被查找到的时候,置按钮为可用 BitBtn1->Enabled=false; BitBtn2->Enabled=false; LabelHint->Caption="提示:输入学号,点击OK完成删除"; } break; case 4: { Close(); } break; default: break; } //每次更改状态,都要清空各个组件的内容 EditNum->Text=""; EditName->Text=""; RBtnFemale->Checked=false; RBtnMale->Checked=false; EditMath->Text=""; EditChinese->Text=""; EditEnglish->Text=""; } //----------------------------------------------------------------------- //----Cancel----------------------------------------------------------------------- void __fastcall TForm1::BitBtn2Click(TObject *Sender) { TabSet1->OnClick(this); } //-----"OK"---------------------------------------------------------------------- void __fastcall TForm1::BitBtn1Click(TObject *Sender) { switch(TabSet1->TabIndex) { case 0: //添加新生 { if(Add(false)) //添加成功 { TabSet1->TabIndex=0; TabSet1->OnClick(this); } else //添加失败 {}; } break; case 1: break; //查找不会有这种情况 case 2: //更改 { if(!EditName->Enabled) //还没找到要修改的信息 { //设当前的学生信息为要修改的学生信息 //各个组件设为可用,以供修改信息 EditName->Enabled=true; GroupBoxSex->Enabled=true; GroupBoxScore->Enabled=true; } else //已经修改,现在确认修改 { //修改完毕,将各个组件中的信息写入全局中间变量TmStu中 if(Add(true))//加入信息成功 { Del(TmpStu); //删除TmStu指向的需要修改的信息 TmpStu=NULL; TabSet1->TabIndex=2; TabSet1->OnClick(this); } else //输入的新信息不合法 { //不作处理,等待更改后再接按OK } } } break; case 3: //删除 { Del(TmpStu); //删除当前的学生信息 TmpStu=NULL; TabSet1->TabIndex=3; TabSet1->OnClick(this); } break; case 4: break; //不会有这种情况 default: break; } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { } //--------------------------------------------------------------------------- ```问题如下 1: 在运行的时候,TabSet1Change函数已经设置了相应的组件可用,TabIndex为添加的时候,为什么要点击好几次才能输入名字Edit等,而且奇怪的是数学成绩Edit一直不能输入,而语文和英语可以输入。 输入完成的时候,问题又来了,显示如下图 ![图片说明](https://img-ask.csdn.net/upload/201709/18/1505703842_790924.png) 问题很多,希望高手们提出来,本人刚接触Builder,我会及时采纳,或者有学生成绩管理的c++ builder可以参考的,也可以发出来,谢谢。 ``` ``` ``` ``` ``` ```
JAVA风景日历,运行时,日历是有了,但风景没有,这是为什么?
运行是这样 ![图片说明](https://img-ask.csdn.net/upload/201911/14/1573703884_780623.jpg) 但是想要这样![图片说明](https://img-ask.csdn.net/upload/201911/14/1573708341_322515.jpg) ``` import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.*; import java.util.Timer; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; //这是一个用JList和JTable完成的简单日历 public class calender { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { JFrame frame = new CalendarFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } class CalendarFrame extends JFrame { private static final long serialVersionUID = 8067844586793608064L; JPanel listPanel; // 显示月份的列表面板 JPanel tablePanel; // 显示日期的表格面板 JPanel textPanel; // 文本面板 JMenuBar menuBar; // JMenuBar,JMenu定义的变量都没有实现功能 JMenu fileMenu; JMenu editMenu; JMenu formatMenu; JMenu lookMenu; JMenu helpMenu; JEditorPane text; // 自带复制,剪切和删除快捷键功能的面板 JScrollPane textscrollpane; JScrollPane tablescrollpane; @SuppressWarnings("rawtypes") JList list; // 显示月份的列表 JTable table; // 显示日期的表格 JPanel yearPanel; // 显示年份的面板 JSpinner spinner; // JSpinner空间 JLabel label = new JLabel(); public static boolean flag = true; @SuppressWarnings({ "unchecked", "rawtypes" }) public CalendarFrame() { table = new JTable(new MyTableModel()); tablescrollpane = new JScrollPane(table); for (int i = 0; i < 7; i++) { TableColumn column = table.getColumnModel().getColumn(i);// 获取表格每一列 column.setResizable(false);// 不允许改变列的大小 } table.setBackground(Color.GREEN); table.setRowHeight(72); // 设定每列的大小 table.setRowSelectionAllowed(false);// 设定行的选择模式 table.setDefaultRenderer(String.class, new MyTableRenderer()); list = new JList(new AbstractListModel() // 匿名的list模型类,提供list显示的月份数据 { private static final long serialVersionUID = -3703164069291737586L; public Object getElementAt(int index) { String obj = null; switch (index) { case 0: obj = "Jan"; break; case 1: obj = "Feb"; break; case 2: obj = "Mar"; break; case 3: obj = "Apr"; break; case 4: obj = "May"; break; case 5: obj = "Jun"; break; case 6: obj = "Jul"; break; case 7: obj = "Aug"; break; case 8: obj = "Sep"; break; case 9: obj = "Oct"; break; case 10: obj = "Nov"; break; case 11: obj = "Dec"; break; } return obj; } @Override public int getSize() { return 12; } }); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 设定列表的选择模式 list.setCellRenderer(new MyListCellRenderer()); // 列表元素的绘制类MyListCellRenderer list.setSelectedIndex(Calendar.getInstance().get(Calendar.MONTH));// JList默认的月份为现实的月份 list.addListSelectionListener(new ListSelectionListener()// 当某个列表被选中时,更新日期table控件 { public void valueChanged(ListSelectionEvent e) { flag = true; table.updateUI(); } }); list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { if (evt.getClickCount() == 2) { String s = (String) list.getSelectedValue(); JOptionPane.showMessageDialog(list, s); } } }); listPanel = new JPanel(); listPanel.setLayout(new BorderLayout()); listPanel.add(list); tablePanel = new JPanel(); tablePanel.setBackground(Color.white); tablePanel.setLayout(new BorderLayout()); tablePanel.add(tablescrollpane); // table.setBackground(Color.green); yearPanel = new JPanel();// 将label控件和JSpinner控件加入年份面板上 yearPanel.setLayout(new GridLayout(0, 4)); JLabel gongyuan = new JLabel("公元", JLabel.RIGHT); JLabel year = new JLabel("年"); spinner = new JSpinner(new SpinnerNumberModel(Calendar.getInstance() .get(Calendar.YEAR), null, null, 1)); spinner.addChangeListener(new ChangeListener() // 为JSpinner空间添加事件监听器 { @Override public void stateChanged(ChangeEvent e) { flag = true; table.updateUI(); } }); yearPanel.add(gongyuan); yearPanel.add(spinner); yearPanel.add(year); yearPanel.add(label); showTime(); new Timer().schedule(new TimerTask() { @Override public void run() { while (true) { showTime(); } } }, 1000); tablePanel.add(yearPanel, BorderLayout.NORTH);// 将年份面板加入到表格面板的北部 textPanel = new JPanel(); textPanel.setLayout(new BorderLayout()); text = new JEditorPane(); textscrollpane = new JScrollPane(text); textPanel.add(textscrollpane); text.setFont(new Font("SansSerif", Font.PLAIN, 40)); tablePanel.add(textPanel, BorderLayout.SOUTH); menuBar = new JMenuBar();// JMenu定义的空间都没实现功能 fileMenu = new JMenu("文件"); editMenu = new JMenu("编辑"); formatMenu = new JMenu("格式"); lookMenu = new JMenu("查看"); helpMenu = new JMenu("帮助"); menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(formatMenu); menuBar.add(lookMenu); menuBar.add(helpMenu); GridBagLayout layout = new GridBagLayout(); // 设成GridBagLayout布局 GridBagConstraints constraints = new GridBagConstraints(); this.setFont(new Font("SansSerif", Font.PLAIN, 14)); this.setLayout(layout); this.setTitle("风景日历"); // 设定标题 this.setIconImage(new ImageIcon("res\\title.jpg").getImage()); // 设定图标 constraints.fill = GridBagConstraints.BOTH; constraints.weightx = 0.5; constraints.weighty = 0.5; layout.setConstraints(listPanel, constraints); constraints.weightx = 8.0; constraints.weighty = 0.5; layout.setConstraints(tablePanel, constraints); this.setJMenuBar(menuBar); this.add(listPanel); this.add(tablePanel); this.setSize(this.getToolkit().getScreenSize().width * 3 / 4, this .getToolkit().getScreenSize().height * 3 / 4); // 设定窗体的大小 } private void showTime() { int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); int minute = Calendar.getInstance().get(Calendar.MINUTE); int second = Calendar.getInstance().get(Calendar.SECOND); StringBuilder sb = new StringBuilder(); if (hour < 10) { sb.append("0" + hour); } else { sb.append(hour); } if (minute < 10) { sb.append(":0" + minute); } else { sb.append(":" + minute); } if (second < 10) { sb.append(":0" + second); } else sb.append(":" + second); label.setFont(new Font("SansSerif", Font.BOLD, 12)); label.setForeground(Color.BLACK); label.setText(sb.toString()); } class MyTableModel extends AbstractTableModel // 表格模型类,提供表格数据 { private static final long serialVersionUID = 1L; String[] columnName = new String[] // 表格列名 { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; @Override public int getColumnCount() // 返回表格列数 { return columnName.length; } public int getRowCount() // 返回表格行数 { return 6; } public String getColumnName(int col) // 获得表格列名 { return columnName[col]; } public Class<? extends Object> getColumnClass(int c) { return getValueAt(0, c).getClass(); } public Object getValueAt(int rowIndex, int columnIndex) { int month = list.getSelectedIndex();// 获得列表的月份 int year = (Integer) spinner.getValue();// 获得spinner显示的年份 GregorianCalendar gc = new GregorianCalendar(year, month, 1); int dayOfWeek = gc.get(Calendar.DAY_OF_WEEK) - 1; // 获得这个月的第一天是星期几 int countDayInMonth = 0;// 某月的总天数,这里的月是从0-11,表示1-12月 if (month == 0 || month == 2 || month == 4 || month == 6 || month == 7 || month == 9 || month == 11) { countDayInMonth = 31; // 是31天的月份 } else if (month == 3 || month == 5 || month == 8 || month == 10) { countDayInMonth = 30; // 是30天的月份 } else if (gc.isLeapYear(year) && month == 1) { countDayInMonth = 29; // 闰年2月 } else if (!gc.isLeapYear(year) && month == 1) { countDayInMonth = 28; // 非闰年2月 } String value = ""; // 因为返回值是Object类型,所以不能直接返回int类型的数据,所以转换成String类型 if (rowIndex == 0) // 第一列的数据 { if (columnIndex < dayOfWeek) { value = ""; } else { value = "" + (columnIndex - dayOfWeek + 1); } } else // 其余列的数据 { if (((rowIndex - 1) * 7) + (columnIndex + 1 + 7 - dayOfWeek) <= countDayInMonth) value = (((rowIndex - 1) * 7) + (columnIndex + 1 + 7 - dayOfWeek)) + ""; } return value; } } @SuppressWarnings("rawtypes") class MyListCellRenderer extends JLabel implements ListCellRenderer // 列表元素绘制类继承自JLabel,实现ListCellRenderer接口 { private static final long serialVersionUID = 1L; public Component getListCellRendererComponent(JList list, // the list Object value, // value to display int index, // cell index boolean isSelected, // is the cell selected boolean cellHasFocus) // does the cell have focus { String s = value.toString().trim(); // 获取选中元素的字符内容 setText(s); // 显示这个字符 Dimension dimension = list.getSize(); // 设定这个每个元素的大小 int height = dimension.height / 12; int width = dimension.width; setSize(width, height); if (isSelected) // 如果该元素被选中,则背景色为红色 { setBackground(Color.red); setForeground(list.getSelectionBackground()); } else // 未被选中的元素背景色显示为灰色,前景色为粉红色 { setBackground(Color.gray); setForeground(Color.pink); } setIcon(new ImageIcon("res\\mon.jpg")); // 设定该元素的图标 setEnabled(list.isEnabled()); setFont(new Font("SansSerif", Font.PLAIN, 20)); // 设定字体大小 setOpaque(true); return this; } } class MyTableRenderer extends JLabel implements TableCellRenderer { private static final long serialVersionUID = 1L; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if ((Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "") // 如果这个标签上的值等于该天的值 .equals(value) && flag == true // 标记为true && list.getSelectedIndex() == Calendar.getInstance().get( Calendar.MONTH) // 列表显示的月份是该月的值 && (Integer) spinner.getValue() == Calendar.getInstance() .get(Calendar.YEAR))// spinner显示的年份是该年 { setFont(new Font("SansSerif", Font.PLAIN, 40)); // 设定字体大小 setText((String) value); // 显示日期字符串 setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); setForeground(Color.RED); // 设定字符串颜色 flag = false; } else // 如果不是改日的标签上的值 { setFont(new Font("SansSerif", Font.PLAIN, 40)); // 设定字体大小 setText((String) value); // 显示标签上的日期字符串 if (hasFocus) // 如果是被点中的表格的单元格 { setBorder(UIManager .getBorder("Table.focusCellHighlightBorder")); // 设定边框 setForeground(Color.RED);// 设定日期字符串颜色 } else { setForeground(null); setBorder(null); } } return this; } } } ```
求大神回答 java的swing题目
1.创建项目Lab37,添加类MainFrame,继承自JFrame,实现ActionListener接口。 2.添加以下成员属性 a)JTree类型的treeDir b)String类型的dirName c)JSplitPane类型的sp d)JTable类型的fileInfo 3.构造方法 a)设置标题为“文件信息查看器” b)创建工具栏,并添加一个“打开”按钮。注册按钮事件监听对象为this c)构造一个只有一个节点,显示“未选择目录”的树,引用到treeDir d)将treeDir加入到sp的左侧 e)将fileInfo设置为一个表头显示"文件名","文件大小"。只有一行数据"未选择文件","0"的表。 f)将fileInfo加入到sp的右侧 g)将工具栏放置在窗体的North方位,sp放置在Center。设置窗体大小为600*480,可见。 4.添加一个方法makeTree,没有返回值,参数String rName, String[] nName。方法逻辑如下: a)以rName为内容定义一个节点作为根节点root。 b)定义一个DefaultMutableTreeNode数组nodes,数组的个数为nName数组元素的数目。 c)利用循环,将nName数组的每一个内容构建一个节点,并复制到nodes数组的元素。将当前这个nodes的节点添加到root的子节点。 d)创建根为root的树引用到treeDir。 e)将treeDir放入JScrollPane容器再添加到sp的左侧。sp.setLeftComponent(new JScrollPane(treeDir)); 5.添加一个方法makeTable,没有返回值,参数File[] nFile a)如果nFile的内容为空,则返回。 b)定义DefaultTableModel对象dtm,获取fileInfo对象的模型。 c)清除原有数据行。 d)定义字符串数组title,内容为"文件名","文件大小"。将title设置为表头作为表头。dtm.setColumnIdentifiers(title); e)定义一个2元素的String数组data,循环遍历nFile,将每个元素的文件名赋值到data[0],文件大小赋值到data[1]。将data添加为表格的一行。dtm.addRow(data); 6.添加一个方法openFile,没有返回值,不需要参数。方法处理逻辑如下 a)定义一个JFileChooser对象fileChooser。 b)调用fileChooser的setFileSelectionMode方法,参数JFileChooser.DIRECTORIES_ONLY。使得只能选择目录。 c)打开文件对话框,定义临时int变量rVal记录返回值。 d)如果是按“确定”返回,则将用户选择的目录路径赋值到dirName。根据dirName构建文件对象,调用makeTree方法和makeTable方法。 7.实现actionPerformed方法 a)判断事件源是否为按钮。 b)如果是按钮事件,则调用openFile方法 8.主方法 a)构造MainFrame对象。 具体图片如下![![![![图片说明](https://img-ask.csdn.net/upload/201506/07/1433674821_106203.png)图片说明](https://img-ask.csdn.net/upload/201506/07/1433674815_5161.png)图片说明](https://img-ask.csdn.net/upload/201506/07/1433674859_111744.png)图片说明](https://img-ask.csdn.net/upload/201506/07/1433674797_418237.png)
c++,epoll,线程池,求解
主要问题: 客户端 与服务器端进行通信(传送一个字符串)当服务器端检测到epollin事件到来时,创建一个任务,加入到任务队列,相应的线程去处理任务。问题来了,为什么我的客户端与服务器只进行一次字符串的传送,服务器端会添加多个任务(300左右个)正常的话,应该是一个任务,所有的线程去抢这个任务,谁拿到任务了谁去执行,然后剩下的线程进行休眠。。。。。本人学生, 才接触这一块,希望大家帮帮忙。。。。 ``` 客户端 # include <iostream> # include <algorithm> # include <stdio.h> # include <string> # include <cstring> # include <cstdlib> # include <unistd.h> # include <sys/types.h> # include <sys/socket.h> # include <netinet/in.h> # include <arpa/inet.h> using namespace std ; # define ERR_EXIT(err) \ do \ { \ perror(err) ; \ exit(EXIT_FAILURE) ; \ \ }while(0) \ int main () { int res = 0 ; char buf[1024] ; memset(buf, 0, sizeof(buf)) ; int sockfd = socket(PF_INET, SOCK_STREAM, 0) ; if(sockfd < 0) ERR_EXIT("socket err") ; struct sockaddr_in cltaddr ; memset(&cltaddr, 0, sizeof(cltaddr)) ; cltaddr.sin_family = AF_INET ; cltaddr.sin_port = htons(8001) ; cltaddr.sin_addr.s_addr = inet_addr("127.0.0.1") ;; res = connect(sockfd, (struct sockaddr *)&cltaddr, sizeof(cltaddr)) ; if(res < 0) ERR_EXIT("connect err") ; cin >> buf ; cout << buf << endl ; while(strcmp("exit", buf) != 0) { write(sockfd, buf, sizeof(buf)) ; memset(buf, '\0', sizeof(buf)) ; cin >> buf ; } close(sockfd) ; return 0 ; } ``` ``` 线程池 #ifndef _CTHREADPOLL_H_ #define _CTHREADPOLL_H_ # include <unistd.h> # include <stdlib.h> # include <fcntl.h> # include <arpa/inet.h> # include <sys/stat.h> # include <signal.h> # include <sys/types.h> # include <iostream> # include <sys/socket.h> # include <sys/socket.h> # include <iomanip> # include <string.h> # include <string> # include <errno.h> # include <vector> # include <sys/wait.h> # include <pthread.h> # include <sys/epoll.h> # include <algorithm> using namespace std ; class CTask { public: CTask(){} ; // 无参构造函数 CTask(string taskName) // 有参构造函数 { this->m_strTaskName = taskName ; this->m_ptrData = NULL ; } public: virtual int PerformTask() = 0 ; // 执行任务的接口 void SetData(void *data) // 设置数据 { this->m_ptrData = data ; } protected: void *m_ptrData ; string m_strTaskName ; } ; class CThreadPoll { public: CThreadPoll(int threadNum = 10) ; // 有默认值的构造函数 public: int AddTack(CTask *task) ; // 添加任务到任务队列中 int getTaskSize() ; // 获取当前任务队列的数量 int StopAll() ; // 使线程池中的线程退出 protected: int CreatepThread() ; // 创建线程池中的线程 static void *ThreadCallBack (void * arg) ; // 线程回调函数 private: pthread_t *m_Thread_id ; // 线程id int m_iThreadNum ; // 线程池中的线程数量 static bool shutdown ; // 线程退出标志 static pthread_mutex_t m_pthreadMutex ; // poxsi线程锁 static pthread_cond_t m_pthreadCond ; // 条件等待变量 static vector<CTask *> m_vecTaskList ; // 任务列表 } ; #endif # include "CThreadpool.h" /************************************************************************/ bool CThreadPoll::shutdown = false ; // 线程退出标志 vector<CTask *> CThreadPoll::m_vecTaskList ; // 任务列表 pthread_mutex_t CThreadPoll::m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER ; // poxsi线程锁 pthread_cond_t CThreadPoll::m_pthreadCond = PTHREAD_COND_INITIALIZER ; // 条件等待变量 int CThreadPoll::CreatepThread() { m_Thread_id = new pthread_t[m_iThreadNum] ; for(int i = 0; i < m_iThreadNum; i ++) { pthread_create(&m_Thread_id[i], NULL, ThreadCallBack, NULL); } return 0 ; } CThreadPoll::CThreadPoll(int threadNum) // 有默认值的构造函数 { this->m_iThreadNum = (pthread_t)threadNum ; CreatepThread() ; } void *CThreadPoll::ThreadCallBack (void *arg) { pthread_t tid = pthread_self() ; while(1) { pthread_mutex_lock(&m_pthreadMutex) ; cout << "tid is : " << tid << endl ; cout << "size is :" << m_vecTaskList.size() << endl ; while(m_vecTaskList.size() == 0 && !shutdown) { pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex) ; } cout << "tid is1111 : " << tid << endl ; cout << "size is11111 :" << m_vecTaskList.size() << endl ; if(shutdown) { pthread_mutex_unlock(&m_pthreadMutex) ; pthread_exit(NULL) ; } vector<CTask *>::iterator iter = m_vecTaskList.begin() ; CTask *temp = NULL ; if(iter != m_vecTaskList.end()) { temp = *iter ; cout << "delete ..." << endl ; m_vecTaskList.erase(iter) ; } temp->PerformTask() ; pthread_mutex_unlock(&m_pthreadMutex) ; // sleep(2) ; } return NULL ; } int CThreadPoll::AddTack(CTask *task) { pthread_mutex_lock(&m_pthreadMutex) ; this->m_vecTaskList.push_back(task) ; pthread_mutex_unlock(&m_pthreadMutex) ; pthread_cond_signal(&m_pthreadCond) ; // pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex) ; return 0 ; } int CThreadPoll::getTaskSize() { return this->m_vecTaskList.size() ; } int CThreadPoll::StopAll() { if(shutdown) { return -1 ; } // 把退出标记设置为true,唤醒所有等待的线程让它们退出 shutdown = true ; pthread_cond_broadcast(&m_pthreadCond) ; // 等待所有线程退出, 不然就成了僵尸线程了 for(int i = 0; i < m_iThreadNum; i ++) { pthread_join(m_Thread_id[i], NULL) ; } //释放掉tid所占用的内存空间 delete [] m_Thread_id ; //销毁互斥锁,和条件变量 pthread_cond_destroy(&m_pthreadCond) ; pthread_mutex_destroy(&m_pthreadMutex) ; return 0 ; } ``` ``` 测试 # include "CThreadpool.cpp" # include "mysqlbak.cpp" # include <unistd.h> # include <stdlib.h> # include <fcntl.h> # include <arpa/inet.h> # include <sys/stat.h> # include <signal.h> # include <sys/types.h> # include <iostream> # include <sys/socket.h> # include <sys/socket.h> # include <iomanip> # include <string.h> # include <string> # include <errno.h> # include <vector> # include <sys/wait.h> # include <pthread.h> # include <sys/epoll.h> # include <algorithm> using namespace std ; typedef vector<struct epoll_event> EventList ; /*typedef struct _Packet { int len ; char buffsize[1024] ; } PACKET ;*/ struct INFO { int uid ; char name[20] ; char sex[10] ; unsigned int age ; unsigned int score ; } ; class WPTask : public CTask { public: WPTask(){} ; public: int PerformTask() { int ret = 0 ; char str[1024] ; struct INFO person ; int connfd = this->m_Connfd ; ret = read(connfd, str, sizeof(str)) ; if(ret == 0) { cout << "client close." << endl ; epoll_ctl(epollfd, EPOLL_CTL_DEL, connfd, &event) ; return -1 ; } cout << str << endl ; // cout << person.uid << " " << person.name << " " << person.sex << // " " << person.age << " " << person.score << endl ; /* ret = query_db(this->m_Mysql) ; if(ret == 0) { cout << "query err:" << endl ; } */ return 0 ; } void SetConnectFd(int connfd) { this->m_Connfd = connfd ; } void SetDatabaseFd(MYSQL mysql) { this->m_Mysql = mysql ; } protected: MYSQL m_Mysql ; int m_Connfd ; public: int epollfd ; struct epoll_event event ; } ; int main () { MYSQL mysql ; int res = login_db(mysql) ; if(res == -1) cout << "login_db err" << endl ; signal(SIGPIPE, SIG_IGN) ; signal(SIGCHLD, SIG_IGN) ; struct sockaddr_in srvaddr ; memset(&srvaddr, 0, sizeof(srvaddr)) ; srvaddr.sin_port = ntohs(8001) ; srvaddr.sin_family = AF_INET ; srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1") ; int idlefd = open("dev/null", O_RDONLY | O_CLOEXEC) ; int listenfd = socket(PF_INET, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_TCP) ; if(listenfd == -1) cout << "socket failure." << endl ; int on = 1 ; if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) cout << "setsockopt failure." << endl ; if(bind(listenfd, (struct sockaddr *)&srvaddr, sizeof(srvaddr)) == -1) cout << "bind failure." << endl ; if(listen(listenfd, SOMAXCONN) == -1) cout << "listen failure." << endl ; CThreadPoll pthread(10) ; int nready, connfd ; int nontimeout = -1 ; EventList events(16) ; struct epoll_event event ; event.events = EPOLLIN ; event.data.fd = listenfd ; int epollfd = epoll_create1(EPOLL_CLOEXEC) ; epoll_ctl(epollfd, EPOLL_CTL_ADD, listenfd, &event) ; struct sockaddr_in peeraddr ; socklen_t peerlen = sizeof(peerlen) ; while(1) { nready = epoll_wait(epollfd, &*events.begin(), static_cast<int>(events.size()), -1) ; if(nready == -1) { if(errno == EINTR) { continue ; } return -1 ; } if(nready == 0) { continue ; } if((size_t)nready == events.size()) { events.resize(events.size() * 2) ; } for(int i = 0; i < nready; i ++) { if(events[i].data.fd == listenfd) { if((connfd = accept4(listenfd, (struct sockaddr *)&peeraddr, &peerlen, SOCK_NONBLOCK | SOCK_CLOEXEC)) == -1) { if(errno == EMFILE) { close(idlefd) ; idlefd = accept(listenfd, NULL, NULL) ; close(idlefd) ; idlefd = open("dev/null", O_RDONLY | O_CLOEXEC) ; continue ; } return -1 ; } cout << "ip:" << inet_ntoa(peeraddr.sin_addr) << endl ; cout << "port:" << ntohl(peeraddr.sin_port) << endl ; event.events = EPOLLIN ; event.data.fd = connfd ; epoll_ctl(epollfd, EPOLL_CTL_ADD, connfd, &event) ; } else if(events[i].events & EPOLLIN) { connfd = events[i].data.fd ; if(connfd == 0) continue ; WPTask *task = new WPTask ; task->epollfd = epollfd ; task->event = events[i] ; task->SetDatabaseFd(mysql) ; task->SetConnectFd(connfd) ; cout << "renwu1" << endl ; // sleep(3) ; pthread.AddTack(task) ; } } } return 0 ; } ``` ![图片说明](https://img-ask.csdn.net/upload/201612/14/1481718038_751898.png) 附上图片: 此图片为客户端与服务器进行一次通信,服务器端建立了N个任务。。。。无语了。。。 如有能很好解决的人 麻烦您有时间的时候加下我的qq:712102032,本人不总玩csdn如能解决,必有重谢。 改成ET貌似可以了,但是。。。我的本意是LT, ET与LT的区别在哪里呢?
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
MyBatis研习录(01)——MyBatis概述与入门
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis原本是apache的一个开源项目iBatis, 2010年该项目由apache software foundation 迁移到了google code并改名为MyBatis 。2013年11月MyBatis又迁移到Github。
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
Python爬虫精简步骤1 获取数据
爬虫,从本质上来说,就是利用程序在网上拿到对我们有价值的数据。 爬虫能做很多事,能做商业分析,也能做生活助手,比如:分析北京近两年二手房成交均价是多少?广州的Python工程师平均薪资是多少?北京哪家餐厅粤菜最好吃?等等。 这是个人利用爬虫所做到的事情,而公司,同样可以利用爬虫来实现巨大的商业价值。比如你所熟悉的搜索引擎——百度和谷歌,它们的核心技术之一也是爬虫,而且是超级爬虫。 从搜索巨头到人工...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
web前端javascript+jquery知识点总结
1.Javascript 语法.用途 javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
渗透测试-灰鸽子远控木马
木马概述 灰鸽子( Huigezi),原本该软件适用于公司和家庭管理,其功能十分强大,不但能监视摄像头、键盘记录、监控桌面、文件操作等。还提供了黑客专用功能,如:伪装系统图标、随意更换启动项名称和表述、随意更换端口、运行后自删除、毫无提示安装等,并采用反弹链接这种缺陷设计,使得使用者拥有最高权限,一经破解即无法控制。最终导致被黑客恶意使用。原作者的灰鸽子被定义为是一款集多种控制方式于一体的木马程序...
Python:爬取疫情每日数据
前言 目前每天各大平台,如腾讯、今日头条都会更新疫情每日数据,他们的数据源都是一样的,主要都是通过各地的卫健委官网通报。 以全国、湖北和上海为例,分别为以下三个网站: 国家卫健委官网:http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml 湖北卫健委官网:http://wjw.hubei.gov.cn/bmdt/ztzl/fkxxgzbdgrfyyq/xxfb...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允许使用这...
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧???? 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升自...
粒子群算法求解物流配送路线问题(python)
1.Matlab实现粒子群算法的程序代码:https://www.cnblogs.com/kexinxin/p/9858664.html matlab代码求解函数最优值:https://blog.csdn.net/zyqblog/article/details/80829043 讲解通俗易懂,有数学实例的博文:https://blog.csdn.net/daaikuaichuan/article/...
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang....
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
情人节来了,教你个用 Python 表白的技巧
作者:@明哥 公众号:Python编程时光 2020年,这个看起来如此浪漫的年份,你还是一个人吗? 难不成我还能是一条狗? 18年的时候,写过一篇介绍如何使用 Python 来表白的文章。 虽然创意和使用效果都不错,但有一缺点,这是那个exe文件,女神需要打开电脑,才有可能参与进来,进而被你成功"调戏”。 由于是很早期的文章了,应该有很多人没有看过。 没有看过的,你可以点击这里查看:用Pyt...
用Python开发实用程序 – 计算器
作者:隋顺意 一段时间前,自己制作了一个库 “sui-math”。这其实是math的翻版。做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于计算器,很多复杂的计算都离不开它。我们使用过各式各样的计算器,无论是电脑自带的,还是网也上的计算器,却都没有自己动手编写属于自己计算器。今天就让我们走进计算器的世界,用python来编写...
经典算法(19)教你两分钟学会【选择排序】
这篇博客使用图文并茂的方式讲解选择排序算法,并有完整的算法逻辑以及代码实现。
Python学习笔记(语法篇)
本篇博客大部分内容摘自埃里克·马瑟斯所著的《Python编程:从入门到实战》(入门类书籍),采用举例的方式进行知识点提要 关于Python学习书籍推荐文章 《学习Python必备的8本书》 Python语法特点: 通过缩进进行语句组织 不需要变量或参数的声明 冒号 1 变量和简单数据结构 1.1 变量命名 只能包含字母、数字和下划线,且不能以数字打头。 1.2 字符串 在Python中,用引号...
用Python打造你的专属情人节贺卡,赶快发给TA浪漫一下吧
明天就是情人节了。这个情人节,注定是一个不能约会的情人节,但不能约会不代表不能浪漫。古人比我们出生早,那些浪漫的诗词早都被他们挖掘一空,比诗词我们肯定没有机会了。好在我们还有Python,不然都不知道该如何表达浪漫。接下来,浪导教你制作一个浪漫的情人节专属贺卡。
Python绘图与可视化
文章目录使用的库Matplotlib程序包绘图命令的扩展及其属性设置 使用的库 Python有很多可视化工具,如:Matplotlib。 Matplotlib是一种2D的绘图库,它可以支持硬拷贝和跨系统的交互,它可以在Python脚本、IPython的交互环境下、Web应用程序中使用。如果结合使用一种GUI工具包(如IPython),Matplotlib还具有诸如缩放和平移等交互功能。它不仅支持各...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问