如何将子目录.o合并单个.o,每个子目录.o合成可执行文件

最近在学习Linux下的编程,打算自己学习一下Makefile的编写。太复杂的Makefile看不懂,想简单了解一下Makefile的编写。想学习一下多级目录的多个Makefile怎么写,以及多目录的Makefile文件的调用。
现在有一个想法,是否可以将每个子目录的.o合并成一个.o,又在上级目录中将这些.o生成单个.o,一级一级往上,在顶层目录下生成可执行文件。

2个回答

不可以。
比方我有两个.c文件add.c和min.c

add.c

 int add(int x, int y)
{
return x + y;
}

min.c

 int min(int x, int y)
{
return x - y;
}

分别编译
gcc -c add.c -o add.o
gcc -c min.c -o min.o

如果你想直接合并两个.o
gcc add.o min.o -o tar.o
会报类似如下的错误:
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':

不过有另外的方法,就是把.o文件生成.a或者.so文件。

gcc -shared -fPIC add.o min.o -o tar.so

这样是可以的。

在每个目录下生成静态库就可以了
cd 目录1 ; ar crv libmylib1.a a.o b.o
cd 目录2; ar crv libmylib2.a c.o d.o

在上一级目录,先把libmylib1.a libmylib1.a 解开,
ar x 目录1/libmylib1.a
ar x 目录2/libmylib2.a

再合并成一个大的.a
ar crv libbiglib.a *.o

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
化学方程式 程序实现
Problem Description 还记得高中的化学方程式吗?当时化学课是我的最爱,老师常常需要我们用化学方程式来反应一种化学变化。但是粗心的我,常常在写化学方程式的时候,在一些细节上出问题。现在我们有很多的化学方程式,但是不知道其是否正确,需要你用编程来判断。 首先我们以例子来说明下化学方程式的格式: 2H2+O2==2H2O 3Fe + 2O2==Fe3O4 CaO + H2O == Ca(OH)2 1) 左边有N种化学品,右边有M种化学品,其中N>=1且M>=1,在每种化学品中,用一个大写字母或者一个大写字母加一个小写字母表示一种化学元素,每种化学元素在表示化学变化的符号“==”前后都出现。多于N>1和M>1的情况,相邻的两种化学品之间用一个“+”来连接。 2) 在每种元素(或者每种根,后面说明)后面出现的系数,是角标,表示这个元素或者根在这个化学品中出现的比例(主要和元素的最外层和次外层电子分布有关系,在这里不考虑具体的含义,只考虑格式),同时最先在这个化学品最前面的系数,表示这个化学方程式中,这种化学品参与化学反应的比例。根据守恒定理,前后出现的化学元素的个数必须相等。一般对于数字1都不用显式写出来(数据中也同样不会出现系数1),系数同样不为0(数据中也不出现)。 3) 对于一些由多个元素组成的串,表示一个“根”,如上面例子中的OH是一个氢氧根,也叫羟基。常常一个根必须由多个元素组成(单个元素不成为根),而在表示它们在化学品中出现的比例时,为了体现它们是一个小的部分,用括号包括起来(括号不能嵌套),再在其后加上系数,所以对于Ca(OH)2中,氧元素(O)与氢元素(H)同时出现两次,但是如果根只出现一次,可以加括号也可以不加,如NaOH。 4) 在一个化学方程式中,空格的出现一般是不受限制的,但是不能将同一个化学品内的元素以及所有与它们相关的系数分开,产生符号也不能分开。 5) 对于其他的一些特殊情况,如可逆化学方程式(事实上大部分的化学变化是可逆过程)用双向箭头表示,有些产生气体的分子后面需要用向上的箭头表示,在产生过程上还有可以加一些外界物理条件,产生沉淀需要说明等,我们不予考虑。 Input 输入有多个case,每个case占一行,每行表示一个化学方程式 Output 对于每个化学方程式,判断其格式上是否正确(这里不考虑意义上的正确性问题)。如果正确输出YES,否则NO。所以输入字符都是英文状态的。每个串长不超过100个字符,每种化学品的长度不超过20个字符。 Sample Input 2H2+O2==2H2O Sample Output YES
web项目加载大量图片,视频(500M左右)时,打开单个页面没问题,打开多个标签页时视频会卡顿,求解?
项目为jeecg3.8(导入jar包的),有两台服务器A,B(centos7) A:上存放Tomcat(里边部署项目),nginx(将静态资源的请求转发到B), B:存放图片视频 项目还未正式部署,所有访问压力不大(只有三四个人) 不知道问题出在哪里了,求解
实现文件上传时遇到的问题,有没有大佬帮忙看看具体是什么问题?问题已在代码中标出
String message = ""; //消息提示 try { if (this.file != null) { File f = this.getFile(); // 采用时间+UUID的方式随即命名 String stroreName = java.util.UUID.randomUUID().toString() + fileFileName.substring(fileFileName.lastIndexOf(".")); //BUG修复 //创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024*100); //设置缓冲区的大小为100KB,默认是10KB factory.setRepository(tmpFile); //设置上传时生成的临时文件保存目录 //创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); //解决上传文件名的中文乱码 upload.setFileSizeMax(1024*1024*10); //设置上传单个文件的大小的最大值10M upload.setSizeMax(1024*1024*10); //设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,100M List<FileItem> list = upload.parseRequest(request); for(FileItem item : list){ // ***程序运行到这一步就直接跳出了*** if(item.isFormField()){ String name = item.getFieldName(); //解决普通输入项的数据的中文乱码问题 String value = item.getString("UTF-8"); //value = new String(value.getBytes("iso8859-1"),"UTF-8"); System.out.println(name + "=" + value); }else{ String fileSuffixName = fileFileName.substring(fileFileName.lastIndexOf("." ) + 1); if(fileSuffixName.equals("doc") || fileSuffixName.equals("docx")){ FileInputStream inputStream = new FileInputStream(f); FileOutputStream outputStream = new FileOutputStream(propath + File.separator + stroreName); byte[] buf = new byte[1024]; int length = 0; while ((length = inputStream.read(buf)) != -1) { outputStream.write(buf, 0, length); } inputStream.close(); outputStream.flush(); outputStream.close(); MessageFile msgfile = new MessageFile(); msgfile.setFilePath(stroreName); msgfile.setFileName(this.fileFileName); msgfile.setCreateDate(new Date()); messageFileService.saveOrUpdate(msgfile); MessageFile resultfile = messageFileService.findById(msgfile .getId()); ServletUtil.sendAsJson(response, resultfile.toJSONString()); message = "文件上传成功!"; } } } } } catch (FileUploadBase.FileSizeLimitExceededException e) { e.printStackTrace(); request.setAttribute("message", "单个文件超出最大值!!!"); //request.getRequestDispatcher("/message.jsp").forward(request, response); } catch(FileUploadBase.SizeLimitExceededException e){ e.printStackTrace(); request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!"); //request.getRequestDispatcher("/message.jsp").forward(request, response); return; } catch (Exception e) { message = "文件上传失败"; e.printStackTrace(); } request.setAttribute("message",message); //request.getRequestDispatcher("/message.jsp").forward(request, response); }
化学方程式 怎么实现的
Problem Description 还记得高中的化学方程式吗?当时化学课是我的最爱,老师常常需要我们用化学方程式来反应一种化学变化。但是粗心的我,常常在写化学方程式的时候,在一些细节上出问题。现在我们有很多的化学方程式,但是不知道其是否正确,需要你用编程来判断。 首先我们以例子来说明下化学方程式的格式: 2H2+O2==2H2O 3Fe + 2O2==Fe3O4 CaO + H2O == Ca(OH)2 1) 左边有N种化学品,右边有M种化学品,其中N>=1且M>=1,在每种化学品中,用一个大写字母或者一个大写字母加一个小写字母表示一种化学元素,每种化学元素在表示化学变化的符号“==”前后都出现。多于N>1和M>1的情况,相邻的两种化学品之间用一个“+”来连接。 2) 在每种元素(或者每种根,后面说明)后面出现的系数,是角标,表示这个元素或者根在这个化学品中出现的比例(主要和元素的最外层和次外层电子分布有关系,在这里不考虑具体的含义,只考虑格式),同时最先在这个化学品最前面的系数,表示这个化学方程式中,这种化学品参与化学反应的比例。根据守恒定理,前后出现的化学元素的个数必须相等。一般对于数字1都不用显式写出来(数据中也同样不会出现系数1),系数同样不为0(数据中也不出现)。 3) 对于一些由多个元素组成的串,表示一个“根”,如上面例子中的OH是一个氢氧根,也叫羟基。常常一个根必须由多个元素组成(单个元素不成为根),而在表示它们在化学品中出现的比例时,为了体现它们是一个小的部分,用括号包括起来(括号不能嵌套),再在其后加上系数,所以对于Ca(OH)2中,氧元素(O)与氢元素(H)同时出现两次,但是如果根只出现一次,可以加括号也可以不加,如NaOH。 4) 在一个化学方程式中,空格的出现一般是不受限制的,但是不能将同一个化学品内的元素以及所有与它们相关的系数分开,产生符号也不能分开。 5) 对于其他的一些特殊情况,如可逆化学方程式(事实上大部分的化学变化是可逆过程)用双向箭头表示,有些产生气体的分子后面需要用向上的箭头表示,在产生过程上还有可以加一些外界物理条件,产生沉淀需要说明等,我们不予考虑。 Input 输入有多个case,每个case占一行,每行表示一个化学方程式 Output 对于每个化学方程式,判断其格式上是否正确(这里不考虑意义上的正确性问题)。如果正确输出YES,否则NO。所以输入字符都是英文状态的。每个串长不超过100个字符,每种化学品的长度不超过20个字符。 Sample Input 2H2+O2==2H2O Sample Output YES
化学方程式 用程序的编写
Problem Description 还记得高中的化学方程式吗?当时化学课是我的最爱,老师常常需要我们用化学方程式来反应一种化学变化。但是粗心的我,常常在写化学方程式的时候,在一些细节上出问题。现在我们有很多的化学方程式,但是不知道其是否正确,需要你用编程来判断。 首先我们以例子来说明下化学方程式的格式: 2H2+O2==2H2O 3Fe + 2O2==Fe3O4 CaO + H2O == Ca(OH)2 1) 左边有N种化学品,右边有M种化学品,其中N>=1且M>=1,在每种化学品中,用一个大写字母或者一个大写字母加一个小写字母表示一种化学元素,每种化学元素在表示化学变化的符号“==”前后都出现。多于N>1和M>1的情况,相邻的两种化学品之间用一个“+”来连接。 2) 在每种元素(或者每种根,后面说明)后面出现的系数,是角标,表示这个元素或者根在这个化学品中出现的比例(主要和元素的最外层和次外层电子分布有关系,在这里不考虑具体的含义,只考虑格式),同时最先在这个化学品最前面的系数,表示这个化学方程式中,这种化学品参与化学反应的比例。根据守恒定理,前后出现的化学元素的个数必须相等。一般对于数字1都不用显式写出来(数据中也同样不会出现系数1),系数同样不为0(数据中也不出现)。 3) 对于一些由多个元素组成的串,表示一个“根”,如上面例子中的OH是一个氢氧根,也叫羟基。常常一个根必须由多个元素组成(单个元素不成为根),而在表示它们在化学品中出现的比例时,为了体现它们是一个小的部分,用括号包括起来(括号不能嵌套),再在其后加上系数,所以对于Ca(OH)2中,氧元素(O)与氢元素(H)同时出现两次,但是如果根只出现一次,可以加括号也可以不加,如NaOH。 4) 在一个化学方程式中,空格的出现一般是不受限制的,但是不能将同一个化学品内的元素以及所有与它们相关的系数分开,产生符号也不能分开。 5) 对于其他的一些特殊情况,如可逆化学方程式(事实上大部分的化学变化是可逆过程)用双向箭头表示,有些产生气体的分子后面需要用向上的箭头表示,在产生过程上还有可以加一些外界物理条件,产生沉淀需要说明等,我们不予考虑。 Input 输入有多个case,每个case占一行,每行表示一个化学方程式 Output 对于每个化学方程式,判断其格式上是否正确(这里不考虑意义上的正确性问题)。如果正确输出YES,否则NO。所以输入字符都是英文状态的。每个串长不超过100个字符,每种化学品的长度不超过20个字符。 Sample Input 2H2+O2==2H2O Sample Output YES
选中 单个或多个多选框获取 第一个td里的值......
![图片说明](https://img-ask.csdn.net/upload/201907/20/1563608930_650520.png) 这种方法可以选中 单个或多个多选框获取 第一个td里的值 ![图片说明](https://img-ask.csdn.net/upload/201907/20/1563608996_278838.png) 请问我想获取这个p标签里的内容 该怎么写?
terroexplorer可以导入的3d.x格式最大支持单个文件为多大,我的模型较大,导入之后不显示
我的.x文件大概7g,导入之后左边目录栏有显示,但模型不显示
化学方程式 程序的变化
Problem Description 还记得高中的化学方程式吗?当时化学课是我的最爱,老师常常需要我们用化学方程式来反应一种化学变化。但是粗心的我,常常在写化学方程式的时候,在一些细节上出问题。现在我们有很多的化学方程式,但是不知道其是否正确,需要你用编程来判断。 首先我们以例子来说明下化学方程式的格式: 2H2+O2==2H2O 3Fe + 2O2==Fe3O4 CaO + H2O == Ca(OH)2 1) 左边有N种化学品,右边有M种化学品,其中N>=1且M>=1,在每种化学品中,用一个大写字母或者一个大写字母加一个小写字母表示一种化学元素,每种化学元素在表示化学变化的符号“==”前后都出现。多于N>1和M>1的情况,相邻的两种化学品之间用一个“+”来连接。 2) 在每种元素(或者每种根,后面说明)后面出现的系数,是角标,表示这个元素或者根在这个化学品中出现的比例(主要和元素的最外层和次外层电子分布有关系,在这里不考虑具体的含义,只考虑格式),同时最先在这个化学品最前面的系数,表示这个化学方程式中,这种化学品参与化学反应的比例。根据守恒定理,前后出现的化学元素的个数必须相等。一般对于数字1都不用显式写出来(数据中也同样不会出现系数1),系数同样不为0(数据中也不出现)。 3) 对于一些由多个元素组成的串,表示一个“根”,如上面例子中的OH是一个氢氧根,也叫羟基。常常一个根必须由多个元素组成(单个元素不成为根),而在表示它们在化学品中出现的比例时,为了体现它们是一个小的部分,用括号包括起来(括号不能嵌套),再在其后加上系数,所以对于Ca(OH)2中,氧元素(O)与氢元素(H)同时出现两次,但是如果根只出现一次,可以加括号也可以不加,如NaOH。 4) 在一个化学方程式中,空格的出现一般是不受限制的,但是不能将同一个化学品内的元素以及所有与它们相关的系数分开,产生符号也不能分开。 5) 对于其他的一些特殊情况,如可逆化学方程式(事实上大部分的化学变化是可逆过程)用双向箭头表示,有些产生气体的分子后面需要用向上的箭头表示,在产生过程上还有可以加一些外界物理条件,产生沉淀需要说明等,我们不予考虑。 Input 输入有多个case,每个case占一行,每行表示一个化学方程式 Output 对于每个化学方程式,判断其格式上是否正确(这里不考虑意义上的正确性问题)。如果正确输出YES,否则NO。所以输入字符都是英文状态的。每个串长不超过100个字符,每种化学品的长度不超过20个字符。 Sample Input 2H2+O2==2H2O Sample Output YES
如何将多个txt文本合并在一个文本里面并且完全打乱行序
我现在有几个个txt文件,每个文件里面都是一行一行的数据,单个文件差不多1G, 我现在想把他们合并在一个txt文件中,并且打乱他们的行序,我原本想各个文件先读取几行,放在一个数组里面打乱写入新的文本,接着在读取这些文件接下来的几行,还是合并打乱写入,知道全部读完,但是我不知道怎么去控制这个每次读取那些行
正则表达式‘.*?’是不包括冒号‘:’吗
![图片说明](https://img-ask.csdn.net/upload/202001/03/1578019460_955818.png) * 如题(第一次发问,不是很懂这个markdown 见谅)。我想用正则表达式提取这个A标签的文本,也就是‘Jason Mraz’,但是我发现第一段代码是可以正确提取的,第二段则不行,这个冒号不加在正则表达式里面就不会被我的.*?匹配到吗?为此我特地复习了一下‘.’的匹配规则:“匹配除 "\n" 之外的任何单个字符”似乎冒和号没什么关系。 ``` re.findall('表演者:.*?>(.*?)</a>', html.text, re.S)[0] ``` ``` re.findall('表演者.*?>(.*?)</a>', html.text, re.S)[0] ``` 推理下来就是正则表达式‘.*?’是匹配不到冒号‘:’是这样吗?总感觉不太对,来论坛求助大佬解决
kettle生产环境hive到mysql连接出错
1.kettle做数据转换 从hive到mysql,本地spoon.bat开发运行正常,上传到linux下用kitchen.sh执行不报错但是会卡住,debug模式下日志如图。 2.做了单个测试,job转换中只连接mysql执行个查询可以,或者只连接hive执行查询语句也可以。但是同时将两个步骤放到一个转换里 就出现跟上面一样的问题 ![图片说明](https://img-ask.csdn.net/upload/201910/30/1572405694_49226.jpg) na位路过的大佬帮忙看下。
SPSS 卡方检验最简单功能的实现:单个总体方差是否等于指定常数的操作步骤?
SPSS 卡方检验最简单功能的实现:单个总体方差是否等于指定常数的操作步骤? 感觉SPSS越简单的功能越不好找,问题如下:![图片说明](https://img-ask.csdn.net/upload/201912/11/1576078837_139743.jpg) 还有,SPSS的标签在哪里? 求教各位大神啦!
RxJava toList或者collect运算符后无法进行订阅
``` final Observer<List<SportCheckTaskEntity>> observer = new Observer<List<SportCheckTaskEntity>>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(List<SportCheckTaskEntity> sportCheckTaskEntities) { iSportCheckTaskPresenterView.onRefreshDataSuccess(flag, sportCheckTaskEntities); } @Override public void onError(Throwable e) { Log.i("1216", e.toString()); } @Override public void onComplete() { } }; sportCheckDao.querySportCheckTaskManager(userId, teamId, currentTime) // 当前的类型和期望的类型 .flatMap(new Function<List<SportCheckTaskEntity>, ObservableSource<SportCheckTaskEntity>>() { @Override public ObservableSource<SportCheckTaskEntity> apply(List<SportCheckTaskEntity> sportCheckTaskEntities) throws Exception { return Observable.fromIterable(sportCheckTaskEntities); } }) .flatMap(new Function<SportCheckTaskEntity, ObservableSource<SportCheckTaskEntity>>() { @Override public ObservableSource<SportCheckTaskEntity> apply(final SportCheckTaskEntity sportCheckTaskEntity) throws Exception { return sportCheckDao.getSportCheckTaskPrepareItemCountByTaskId(sportCheckTaskEntity.getSportCheckTaskId()).map(new Function<Integer, SportCheckTaskEntity>() { @Override public SportCheckTaskEntity apply(Integer integer) throws Exception { sportCheckTaskEntity.setPrepareItemNumber(integer); return sportCheckTaskEntity; } }); } }) .flatMap(new Function<SportCheckTaskEntity, ObservableSource<SportCheckTaskEntity>>() { @Override public ObservableSource<SportCheckTaskEntity> apply(final SportCheckTaskEntity sportCheckTaskEntity) throws Exception { return sportCheckDao.getSportCheckTaskTotalItemCountByTaskId(sportCheckTaskEntity.getSportCheckTaskId()).map(new Function<Integer, SportCheckTaskEntity>() { @Override public SportCheckTaskEntity apply(Integer integer) throws Exception { sportCheckTaskEntity.setTotalItemNumber(integer); return sportCheckTaskEntity; } }); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .toList() .toObservable() .subscribe(observer); ``` 第一个flatMap是用来发射单个Observable的 第二个flatMap是用来给集合中的对象添加某个值的 第二个flatMap是用来给集合中的对象添加某个值的 在这之前,都没有问题,但是在执行toList()或者collect()运算符后,后续的订阅没有执行. 网上查了原因,说是toList()运算符引起的阻塞,需要使用onComplete()方法进行调用,但是不清楚具体该如何使用
php导出excel,单用户多条数据问题
php导出excel的时候怎么让他一个用户显示多条数据,就像 用户 商品 价格 小明 玩具1 9.99 (不显示) 玩具2 8.8 小红 玩具3 9.9 如上,单个用户只显示一次,但是购买的商品换行显示那个不显示表示那个也是小明的
实验是数据结构中做一个学生成绩管理系统,在网上找到了相应代码,但是不知道怎么插入学生信息,希望大佬帮助完成这个课题
#include<stdio.h> #include<stdlib.h> #include<string.h> char top[50]; //成绩文件顶部的标题用top保存 typedef struct student //单个学生成绩的记录 { char name[10]; //姓名 int number; //学号 int chinese; //语文 int math; //数学 int english; //英语 struct student *next; }student,*gradelist; gradelist fileread(char *adress) //读取成绩文件 { FILE * fp; if((fp=fopen(address,"r"))==NULL) //打开文件 { printf("文件打开出错"); exit(0); } gradelist file=(student *)malloc(sizeof(student)); //申请空间 file->next=NULL; student * p=file; //操作指针 int n=0; //循环标记,具体作用是在第一次循环时方便处理标题 while(!feof(fp)) { if(n==0) { fgets(top,50,fp); //处理标题,并且文件指针移到第二行 } if(n==1) //申请空间 { (p->next)=(student *)malloc(sizeof(student)); p=p->next; p->next=NULL; } fscanf(fp,"%s%d%d%d%d",p->name,&p->number,&p->chinese,&p->math,&p->english); //将文件的数据输入到链表中 n=1; } if(fclose(fp)) //关闭文件 { printf("文件关闭失败"); exit(0); } return file; } void FilePrint(gradelist file) //将成绩文件打印到屏幕上 { student *p=file; printf("%s\n",top); //打印标题 while(p->next!=NULL) { printf("%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english); //循环打印 p=p->next; } } void merger() //合并文件 { char * address1="1.txt",*address2="2.txt",*address3="3.txt"; gradelist file1=fileread(address1),file2=fileread(address2); FILE *fp; if((fp=fopen("3.txt","w+"))==NULL) //先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面 { printf("合并成绩文档失败,原因:建立文档出错"); exit(0); } student *p1=file1,*p2=file2; fprintf(fp,"%s",top); //先输入标题 while(p1->next!=NULL) { fprintf(fp,"%6s %2d %d %d %d\n",p1->name,p1->number,p1->chinese,p1->math,p1->english); //输入1.txt p1=p1->next; } while(p2->next!=NULL) { fprintf(fp,"%6s %2d %d %d %d\n",p2->name,p2->number,p2->chinese,p2->math,p2->english); //输入2.txt p2=p2->next; } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } void extract() //抽取补考的成绩记录 { char * address4="4.txt",*address3="3.txt"; FILE *fp; if((fp=fopen("4.txt","w+"))==NULL) //新建文件4.txt { printf("抽取补考学生成绩记录建立新文件失败"); exit(0); } gradelist file3=fileread(address3); student *p=file3; fprintf(fp,"%s",top); //先输入标题 while(p->next!=NULL) { if((p->chinese)<60||(p->math)<60||(p->english)<60) //补考条件 { fprintf(fp,"%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english); } p=p->next; } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } void sort(int i) { char * address3="3.txt"; gradelist file3=fileread(address3); //先将3.txt读入链表 student *p=file3; if(remove("3.txt")) //由于排序后的内容也要保存到3.txt,故删除3.txt { printf("删除文件出错"); exit(0); } int n=0; //学生个数 FILE *fp; if((fp=fopen("3.txt","w+"))==NULL) //新建一个空的3.txt { printf("新建文件出错"); exit(0); } fprintf(fp,"%s",top); //标题先输入 while(p->next!=NULL) { n++; p=p->next; } typedef struct //链表不容易操作,故而新建一个结构数组 { int totalgrade; char name[10]; int number; int chinese; int math; int english; }gradenote; //成绩记录 typedef struct { gradenote r[100]; //只初始化了100了空间,学生人数超过100就不能了,懒得动态分配了 }grade_list; //待排序成绩表 grade_list L; p=file3; int t; for(t=1;t<=n;t++,p=p->next) //将链表的内容复制到结构数组里 { strcpy(L.r[t].name,p->name); L.r[t].number=p->number; L.r[t].chinese=p->chinese; L.r[t].math=p->math; L.r[t].english=p->english; L.r[t].totalgrade=p->chinese+p->math+p->english; } if(i==1) //直接插入排序 { int k; for(k=2;k<=n;++k) { if(L.r[k].totalgrade<L.r[k-1].totalgrade) { L.r[0]=L.r[k]; L.r[k]=L.r[k-1]; int j; for(j=k-2;L.r[0].totalgrade<L.r[j].totalgrade;--j) { L.r[j+1]=L.r[j]; } L.r[j+1]=L.r[0]; } } } if(i==2) //折半插入排序 { int m; int k; for(k=2;k<=n;++k) { L.r[0]=L.r[k]; int low=1,high=k-1; while(low<=high) { m=(low+high)/2; if(L.r[0].totalgrade<L.r[m].totalgrade) high=m-1; else low=m+1; } int j; for(j=k-1;j>=high+1;--j) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; } } int q; for(q=n;q>=1;q--) //将排序好的内容输入到3.txt { fprintf(fp,"%6s %2d %d %d %d\n",L.r[q].name,L.r[q].number,L.r[q].chinese,L.r[q].math,L.r[q].english); } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } void search(char *name) //按姓名查找 { gradelist file=fileread("3.txt"); student * p=file; while(p->next!=NULL) { if(strcmp(name,p->name)==0) { printf("%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english); return; } p=p->next; } printf("查无此人,请确定名字输入正确\n"); exit(0); } void main(void) // { int chioce; gradelist file1=fileread("1.txt"),file2=fileread("2.txt"); printf("现有成绩记录文件1\n"); printf("*********************************************************\n"); FilePrint(file1); printf("*********************************************************\n"); printf("现有成绩记录文件2\n"); printf("*********************************************************\n"); FilePrint(file2); printf("*********************************************************\n"); printf("第一步,合并成绩记录文件\n"); merger(); printf("合并成功\n"); system("PAUSE"); printf("现有合并后的成绩记录文件3\n"); printf("*********************************************************\n"); gradelist file3=fileread("3.txt"); FilePrint(file3); printf("*********************************************************\n"); printf("第二步,抽取补考成绩记录\n"); extract(); system("PAUSE"); printf("现有补考成绩记录文件4\n"); printf("*********************************************************\n"); gradelist file4=fileread("4.txt"); FilePrint(file4); printf("*********************************************************\n"); printf("第三步,对文件3进行排序\n"); printf("请输入排序方式(1/2)\n1:直接插入排序\n2:折半插入排序\n"); scanf("%d",&chioce); if(chioce==1) sort(1); else if(chioce==2) sort(2); else { printf("输入不合理,程序默认采用1方式\n"); sort(1); } file3=fileread("3.txt"); printf("现有按总分降序的成绩记录3\n"); printf("*********************************************************\n"); FilePrint(file3); printf("*********************************************************\n"); printf("第四步,查找学生信息\n"); char name[100]; printf("请输入学生姓名\n"); scanf("%s",name); search(name); printf("按任意键结束程序\n"); getchar(); } 姓名 学号 语文 数学 英语 张明明 01 67 78 82 李成友 02 78 91 88 张辉灿 03 68 82 56 王露 04 56 45 77 陈东明 05 67 38 47 姓名 学号 语文 数学 英语 陈果 31 57 68 82 李华明 32 88 90 68 张明东 33 48 42 56 李明国 34 50 45 87 陈道亮 35 47 58 77
php爬虫问题(目标网站刷新太慢,导致抓取不到)
由于应用限制,只能用php做接口。 功能:爬取目标网站的图片然后并下载到本地 问题:目标网站由于要js动态渲染页面,但是刷新的速度太慢导致php爬虫爬取不到图片。 目标网站截图:![图片说明](https://img-ask.csdn.net/upload/202001/10/1578666920_85770.png) PHP代码: ``` <?php class download_image{ //抓取图片的保存地址 public $save_path; //抓取图片的大小限制(单位:字节) 只抓比size比这个限制大的图片 public $img_size=0; //定义一个静态数组,用于记录曾经抓取过的的超链接地址,避免重复抓取 public static $a_url_arr=array(); /** * @param String $save_path 抓取图片的保存地址 * @param Int $img_size */ public function __construct($save_path,$img_size){ $this->save_path=$save_path; $this->img_size=$img_size; if(!file_exists($save_path)){ mkdir($save_path,0775); } } /** * 递归下载抓取首页及其子页面图片的方法 ( recursive 递归) * @param String $capture_url 用于抓取图片的网址 */ public function recursive_download_images($capture_url){ if (!in_array($capture_url,self::$a_url_arr)){ //没抓取过 self::$a_url_arr[]=$capture_url; //计入静态数组 } else { //抓取过,直接退出函数 return; } $this->download_current_page_images($capture_url); //下载当前页面的所有图片 //用@屏蔽掉因为抓取地址无法读取导致的warning错误 $content=@file_get_contents($capture_url); //匹配a标签href属性中?之前部分的正则 $a_pattern = "|<a[^>]+href=['\" ]?([^ '\"?]+)['\" >]|U"; preg_match_all($a_pattern, $content, $a_out, PREG_SET_ORDER); $tmp_arr=array(); //定义一个数组,用于存放当前循环下抓取图片的超链接地址 foreach ($a_out as $k => $v) { /** * 去除超链接中的 空'','#','/'和重复值 * 1: 超链接地址的值 不能等于当前抓取页面的url, 否则会陷入死循环 * 2: 超链接为''或'#','/'也是本页面,这样也会陷入死循环, * 3: 有时一个超连接地址在一个网页中会重复出现多次,如果不去除,会对一个子页面进行重复下载) */ if ( $v[1] && !in_array($v[1],self::$a_url_arr) &&!in_array($v[1],array('#','/',$capture_url) ) ) { $tmp_arr[]=$v[1]; } } foreach ($tmp_arr as $k => $v){ //超链接路径地址 if ( strpos($v, 'http://')!==false ){ //如果url包含http://,可以直接访问 $a_url = $v; }else{ //否则证明是相对地址, 需要重新拼凑超链接的访问地址 $domain_url = substr($capture_url, 0,strpos($capture_url, '/',8)+1); $a_url=$domain_url.$v; } $this->recursive_download_images($a_url); } } /** * 下载当前网页下的所有图片 * @param String $capture_url 用于抓取图片的网页地址 * @return Array 当前网页上所有图片img标签url地址的一个数组 */ public function download_current_page_images($capture_url){ $content=@file_get_contents($capture_url); //屏蔽warning错误 //匹配img标签src属性中?之前部分的正则 $img_pattern = "|<img[^>]+src=['\" ]?([^ '\"?]+)['\" >]|U"; preg_match_all($img_pattern, $content, $img_out, PREG_SET_ORDER); $photo_num = count($img_out); //匹配到的图片数量 echo $capture_url . "共找到 " . $photo_num . " 张图片\n"; foreach ($img_out as $k => $v){ $this->save_one_img($capture_url,$v[1]); } } /** * 保存单个图片的方法 * @param String $capture_url 用于抓取图片的网页地址 * @param String $img_url 需要保存的图片的url */ public function save_one_img($capture_url,$img_url){ //图片路径地址 if ( strpos($img_url, 'http://')!==false ){ // $img_url = $img_url; }else{ $domain_url = substr($capture_url, 0,strpos($capture_url, '/',8)+1); $img_url=$domain_url.$img_url; } $pathinfo = pathinfo($img_url); //获取图片路径信息 $pic_name=$pathinfo['basename']; //获取图片的名字 if (file_exists($this->save_path.$pic_name)){ //如果图片存在,证明已经被抓取过,退出函数 echo $img_url.'该图片已经抓取过!'."\n"; return; } //将图片内容读入一个字符串 $img_data = @file_get_contents($img_url); //屏蔽掉因为图片地址无法读取导致的warning错误 if ( strlen($img_data) > $this->img_size ){ //下载size比限制大的图片 $img_size = file_put_contents($this->save_path . $pic_name, $img_data); if ($img_size){ echo $img_url.'图片保存成功!'."\n"; } else { echo $img_url.'图片保存失败!'."\n"; } } else { echo $img_url.'图片读取失败!'."\n"; } } } set_time_limit(120); //设置脚本的最大执行时间 根据情况设置 $download_img=new download_image('imgages/',0); //实例化下载图片对象 //$download_img->recursive_download_images('http://www.oschina.net/'); //递归抓取图片方法 //$download_img->download_current_page_images($_POST['capture_url']); //只抓取当前页面图片方法 $download_img->download_current_page_images('http://127.0.0.1:808/yoyo/word/php/1.html'); //只抓取当前页面图片方法 ?> ```
python 路径匹配中的 *和**通配符用法
通俗易懂一点 为什么 PurePath("a/b.py").match("\*.py") True 运行结果是True,单个"星号"成功匹配了a/b 。 不是说单个星号不能匹配斜杠的吗 PurePath("/a/b/c.py").match("a/\*\*/\*.py") False 运行结果是False,两个"星号"没有成功匹配 b/c。。 不是说两个星号可以匹配多级目录吗
c:foreach循环出多个div如何控制单个div的显示隐藏
``` <c:forEach items="${requestScope.newList}" var="newList"> <!--消息 --> <div class="s-msg-item s-msg-temp i-msg-downup conceal1"> <h6 class="s-msg-bar"><span class="s-name">每日新闻</span></h6> <div class="s-msg-content i-msg-downup-wrap"> <div class="i-msg-downup-con"> <a class="i-markRead" target="_blank" href="/person/mynest/blog?blog=${newList.id}"> <img src="/static/images/${newList.pic}"> <p class="s-main-content"> ${newList.activityTitle} </p> <p class="s-row s-main-content"> <a href="/person/mynest/blog?blog=${newList.id}"> 阅读全文 <i class="am-icon-angle-right"></i> </a> </p> </a> </div> </div> <a class="i-btn-forkout conceal" ref="${newList.id}" href="javascript:;"><i class="am-icon-close am-icon-fw"></i></a> </div> </c:forEach> ``` jQuery代码 ``` $(function () { $(document).ready(function(){ $(".conceal").click(function(){ $(".conceal1").hide(); }); }); }); ``` 修改后: ``` <c:forEach items="${requestScope.newList}" var="newList"> <!--消息 --> <div class="s-msg-item s-msg-temp i-msg-downup conceal1" id="${newList.id}" onclick=hide(this)> <h6 class="s-msg-bar"><span class="s-name">每日新鲜事</span></h6> <div class="s-msg-content i-msg-downup-wrap"> <div class="i-msg-downup-con"> <a class="i-markRead" target="_blank" href="/person/mynest/blog?blog=${newList.id}"> <img src="/static/images/${newList.pic}"> <p class="s-main-content"> ${newList.activityTitle} </p> <p class="s-row s-main-content"> <a href="/person/mynest/blog?blog=${newList.id}"> 阅读全文 <i class="am-icon-angle-right"></i> </a> </p> </a> </div> </div> <a class="i-btn-forkout conceal" ref="${newList.id}" href="javascript:;"><i class="am-icon-close am-icon-fw"></i></a> </div> </c:forEach> ``` JS ``` function hide(obj){ $(obj).toggle(); } ``` >
火拼双扣 C语言写
Problem Description 小明是一个不求上进的孩子,非常喜欢玩QQ游戏的双扣,但是小明的老婆却喜欢玩火拼双扣,没办法,谁让小明家是老婆最大呢,小明只能每天陪着老婆玩火拼双扣了。 在这里呢,小明还是先唠叨下火拼双扣的规则,以统一一下游戏规则,也避免了有些要求上进的同学没玩过不知道游戏规则。 由于题目的需求,规则我们只讲合法牌型和出牌大小。 1.牌型 单张:任意一张单牌。 顺子:任意五张或者五张以上点数相连的牌, 2 和小王不能出现在顺子中。 对子:任意两张点数相同的牌。 连对:三对或三对以上点数相连的牌,如: 556677 。 2 和小王不能出现在连对中。 三张:任意三张点数相同的牌。 连三张:三个或三个以上点数相连的三张牌,如: 5556 66777 。 2 和小王不能出现在连对中。 炸弹:四张或四张以上点数相同的牌,如: 6666 6 。 三王炸弹:任意三个王的牌型。 天王炸弹:四张王牌。 X 相炸弹: X 张同样的牌组成的炸弹( 4<=X<=8 )。如: 777777 ( 6 相炸弹)。 X 相 Y 连环 炸弹: Y 组点数相连 (3<=Y<=6) 且牌数同为 X 的炸弹。如 777778888 8999 99 ( 5 相 3 连环 炸弹) 2 和小王不能出现在此牌型中。 大王的特殊作用 大王(包括两个大王)和别的牌型一起出的时候,可以做任意一张满足牌型需要的万能牌。如果大 王可 以替代的牌存在一种以上的选择的时候,则选择大的牌型为优先。 例如: 7777 +大王= 77777 45678 +大王= 456789 (注意不是 3456 78 ) 77899 +大王= 778899 77 + 8 + 9 +大王+大王= 778899 2 . 牌型的比较 特殊的牌型或者特殊牌型的组合,都对应相应的星级。手中有几星级的牌,关系到游戏中的翻倍分数、贡献分数;同时星级也是特殊牌型大小比较的标准。 星级的分类和定义: 特殊牌型: 三王炸弹: 6 星级。 天王炸弹: 7 星级。 根据单个炸弹牌型分: X 相炸弹:等同于 X 星级。如: 6666 66 为 6 相炸弹等同于 6 星级。 根据 X 相 Y 连环 炸弹牌型分:星级= X+Y 具体对应星级如下: 4 相 3 连环 炸弹: 7 星。 4 相 4 连环 炸弹: 8 星。 4 相 5 连环 炸弹: 9 星。 4 相 6 连环 炸弹: 10 星。 5 相 3 连环 炸弹: 8 星。 5 相 4 连环 炸弹: 9 星。 5 相 5 连环 炸弹: 10 星。 6 相 3 连环 炸弹: 9 星。 6 相 4 连环 炸弹: 10 星。 7 相 3 连环 炸弹: 10 星。 8 相 3 连环 炸弹: 11 星。 点数的大小: 从大至小以次为:F(大王)、f(小王)、 2 、 A 、 K 、 Q 、 J 、 T(10) 、 9 、 8 、 7 、 6 、 5 、 4 、 3 炸弹: 炸弹大于任何其他非炸弹的牌型。 同为炸弹的牌型,先按照星级比较大小;如果星级相同,则按照牌的数量比较大小,数量越少的越大;如过数量相同,则按照牌型中最大牌的点数比较大小。 特殊:天王炸弹是 7 星牌里面最大的牌型,三王炸弹是 6 星牌里面最小的牌型。 由于小明打牌很差劲,所以他每次都是点提示出牌,而且小明是不会用连环炸弹的,因为他觉得这样太浪费,现在就要你来完成简单的提示功能,我们的提示功能简单到只要你输出有没有可能出牌,如果有可能出牌,输出“yes”,否则输出“no”。 Input 有多组case,数据的第一行输入一个正整数n(2<n<100)表示case数,下面每个case两行,第一行代表对手出的牌(牌数不超过8张),第二行代表小明手上的牌,两行都是有字母“F(大王)、f(小王)、 2 、 A 、 K 、 Q 、 J 、 T(10) 、 9 、 8 、 7 、 6 、 5 、 4 、 3”组成,保证不出现别的字母,而且保证对手出的牌是合法的牌型,并且符合所有的牌是从两幅标准的扑克中抽取。 Output 每个case输出一行,如果小明能压到对方,输出“yes”,否则输出“no”。 Sample Input 2 34567 456789 333 4444 Sample Output yes yes
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问

相似问题

3
请问关于mongoose如何使用updateMany批量更新的问题
6
C#工作流中如何创建子工作流
4
KTV管理系统一直是单个门店如何改为多店
0
Kotlin单个类无法右键运行,配置无法选择类
2
postman runner 如何重复发送请求
2
做单个添加时报错,Parameter 'mid' not found. Available parameters are [array]???
4
spark--java.lang.ArrayIndexOutOfBoundsException: 10582
3
SQL 从不同表提取数据和统计
2
Django实现Web应用显示单个主题时出现错误: 'function' object has no attribute 'entry_set'
4
使用SpringBoot+MybatisPlus做了一个单个删除DOM,请问批量怎么删除呢
0
pytorch编写ResNet,在kernel权值初始化的时候,将小波赋值给初值,如何实现单个核的值符合小波分布呢??
1
单个访问每个页面可以显示 但是从index.jsp的frame框架中链接其他页面就会报错,为什么呢?
2
Spring中使用@Autowired省略get和set方法后如何获取实体对象的单个值
1
使用keras搭建黑体汉字单个字符识别网络val_acc=0.0002
2
用python实现单个列表中相邻元素的合并,列表中的最后一个元素为所有元素的组合
1
用python实现单个列表中元素与元素之间的合并,列表中的最后一个元素为所有元素的组合
0
输入化学方程式,判断其格式上是否正确,运用C程序的语言代码的方式应该如何实现的?
2
js或jq单个数据 组成一个新的数组
2
用tensorflow做机器翻译时训练代码有问题
3
Mybatis小练习 报错 求大神指导,信息详尽