这个从1加到100的程序怎么没有输出,没错误啊(请教大佬)

#include
int main()
{
int t, b;
t = 1;
b = 2;
while (b < 100);
{
t = t + b;
b = b + 1;
}
printf("%d\n", t);
return 0;
}
是需要运行一段时间吗?

4个回答

while (b < 100); 后面多了一个分号,就是空语句,即循环体是一个空语句,b 永远是初始值 2 死循环了。
解决办法:去掉 分号。

while()
{}
while循环后面没有“;”

do{
}while();
do-while循环后面才有“;”

while (b < 100);这行代码成立,代码运行到这里,不再往下执行了,那来打印输出呀!

while(b<100)后面有一个分号,就相当于循环体是一个空语句,底下的大括号里的语句不执行,b一直为初始值2,形成死循环,就得不到输出了,只要将分号去掉就行了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
输出一个浮点数,输出浮点数绝对值,保留两位小数,但我这个程序为啥输入-9,输出-900,输出严重错误,请教各位大神
#include<cstdio> #include<iostream> using namespace std; int main() { float a; cin>>a; if(a>=0) printf("%.2f",a); else printf("%.2f",-a); return 0; } ![图片说明](https://img-ask.csdn.net/upload/201912/20/1576824121_204404.png) ![图片说明](https://img-ask.csdn.net/upload/201912/20/1576827969_811797.png)
PTA统计一批学生的平均成绩与不及格人数显示人数较多,但没有人不及格的错误显示。
> 本题要求编写程序,计算学生们的平均成绩,并统计不及格(成绩低于60分)的人数。题目保证输入与输出均在双精度范围内。 > 输入格式: 输入在一行中给出一系列非负实数,其间以空格分隔。当读到负实数时,表示输入结束,该数字不要处理。 输出格式: 按照以下格式输出: Average = 成绩均值 Count = 不及格人数 其中平均值精确到小数点后两位,等号的左右各有一个空格。 输入样例1: 67 88 73 54 95 60 0 -1 输出样例1: Average = 62.43 Count = 2 输入样例2: -100 90 80 0 输出样例2: Average = 0.00 话不多说上代码: ``` #include<stdio.h> int main() { double a,sum=0,n=0;int k; for(k=0;;n++) { scanf("%lf",&a); if(a<0||a>100)break; if(a>=0&&a<60){k++;} sum=sum+a; } if(n==0)printf("Average = 0.00"); else printf("Average = %.2f",sum/n); if(k>0)printf("\nCount = %d",k); return 0; } ``` 请教各位大佬~
matlab 最速下降法求Rosenbrock函数最小值点中求梯度问题
https://blog.csdn.net/sinat_34474705/article/details/70306327 我在看篇文章中作者的程序时,发现这段下面这段代码中需要自己手动输入梯度,我试着用matlab自带的求梯度函数改了一下,总数出现错误信息:输出项过多。想请教一下不可以让程序自己求梯度吗? 目标函数:Rosenbrock函数(Rosenbrock.m) function [f,g] = Rosenbrock(x) f = 100*(x(2)-x(1)^2)^2 +(1-x(1))^2; g1 = 2*x(1) - 400*x(1)*(- x(1)^2 + x(2)) - 2; g2 = - 200*x(1)^2 + 200*x(2); g = [g1,g2]'; 这是我改写的: function [f,g] = Rosenbrock(x) f = 100*(x(2)-x(1)^2)^2 +(1-x(1))^2; [g1,g2]=gradient(f) g = [g1,g2]'; 错误信息: 错误使用 gradient (line 49) 输出参数太多。 出错 Rosenbrock (line 3) [g1,g2]=gradient(f) 出错 main_steepDescent (line 16) [~,gk] = Rosenbrock(x0); % 求初始梯度
请教各位大神有关c++ stack overflow错误
DEBUG提示错误: ``` First-chance Exception in ConvexHull.exe(NTDLL.DLL);0xC00000FD:Stack Overflow ``` 点击ALT+7之后查看调用栈内容如下: ``` NTDLL! 77452c33() NTDLL! 77455ae0() NTDLL! 774c5f63() NTDLL! 7748a40a() NTDLL! 77455ae0() _heap_alloc_base(unsigned int 64) line 200 _heap_alloc_dbg(unsigned int 16, int 1, const char * 0x00000000, int 0) line 378 + 9 bytes _nh_malloc_dbg(unsigned int 16, int 1, int 1, const char * 0x00000000, int 0) line 248 + 21 bytes _nh_malloc(unsigned int 16, int 1) line 197 + 19 bytes operator new(unsigned int 16) line 24 + 11 bytes std::_Allocate(int 1, dot * 0x00000000) line 30 + 12 bytes std::allocator<dot>::allocate(unsigned int 1, const void * 0x00000000) line 59 + 40 bytes std::vector<dot,std::allocator<dot> >::insert(dot * 0x00000000, unsigned int 1, const dot & {...}) line 158 + 14 bytes std::vector<dot,std::allocator<dot> >::insert(dot * 0x00000000, const dot & {...}) line 154 std::vector<dot,std::allocator<dot> >::push_back(const dot & {...}) line 142 + 50 bytes Divide(dot {...}, dot {...}, std::vector<dot,std::allocator<dot> > {...}) line 63 Divide(dot {...}, dot {...}, std::vector<dot,std::allocator<dot> > {...}) line 77 + 119 bytes Divide(dot {...}, dot {...}, std::vector<dot,std::allocator<dot> > {...}) line 77 + 119 bytes Divide(dot {...}, dot {...}, std::vector<dot,std::allocator<dot> > {...}) line 77 + 119 bytes Divide(dot {...}, dot {...}, std::vector<dot,std::allocator<dot> > {...}) line 77 + 119 bytes Divide(dot {...}, dot {...}, std::vector<dot,std::allocator<dot> > {...}) line 77 + 119 bytes Divide(dot {...}, dot {...}, std::vector<dot,std::allocator<dot> > {...}) line 77 + 119 bytes ...... ``` 使用的是VC6.0,编译器就是VC6.0默认的。 本人是个菜鸟,根据调用栈给出的内容完全不知道如何定位错误。 本人的程序是快速凸包算法(一个课后作业),程序在数据量比较少的情况下,点的个数在1000以下都运行正常,程序逻辑没有错误,当数据量增大到2000、3000的时候程序就提示出上述异常。 顺便说一下设置栈保留大小也已经试过了,将栈保留大小设置为16000000也无效。 以下是本人代码: ``` // ConvexHull.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "dot.h" #include <iostream> #include <vector> #include "BruteForceCH.h" #include "line.h" #include <windows.h> #include <time.h> #include <fstream> #include "comm.h" #include "GrahamScan.h" #include <stack> #include "QuickTuBao.h" #define random(x) (rand()%x) using namespace std; int main(int argc, char* argv[]) { int n; printf("input dots number:\n"); cin >> n; //随机点生成算法 //* vector<dot> vec; srand((int)time(0)); for(int i=0;i<n;) { dot d; d.x = random(100) + (float)random(10)/(float)10; d.y = random(100) + (float)random(10)/(float)10; //d.x = random(10); //d.y = random(10); if(find(vec.begin(),vec.end(),d) != vec.end()); else { vec.push_back(d); i++; } } //*/ //将生成的点写入文件,便于MATLAB读入 ofstream f1("C:\\MATLAB7\\work\\dot\\dots.txt");//打开文件用于写,若文件不存在就创建它 if(!f1) return 0;//打开文件失败则结束运行 vector<dot>::iterator it; for(it=vec.begin();it!=vec.end();it++) { dot d = *it; //cout<<d.x<<","<<d.y<<endl; f1<<d.x<<" "<<d.y<<endl; } f1.close();//关闭文件 //记录运行时间 LARGE_INTEGER BegainTime ; LARGE_INTEGER EndTime ; LARGE_INTEGER Frequency ; QueryPerformanceFrequency(&Frequency); QueryPerformanceCounter(&BegainTime) ; QuickTuBao(vec); QueryPerformanceCounter(&EndTime); //输出运行时间(单位:s) cout << "运行时间(单位:s):" <<(double)( EndTime.QuadPart - BegainTime.QuadPart )/ Frequency.QuadPart <<endl; //将结果写入文件 ofstream f2("C:\\MATLAB7\\work\\dot\\outdots.txt");//打开文件用于写,若文件不存在就创建它 if(!f2) return 0;//打开文件失败则结束运行 //vector<dot>::iterator it; for(it=vec.begin();it!=vec.end();it++) { dot d = *it; f2<<d.x<<" "<<d.y<<endl; } it=vec.begin(); dot d = *it; f2<<d.x<<" "<<d.y<<endl; f2.close();//关闭文件 system("pause") ; return 0; } ``` ``` // QuickTuBao.cpp : 快速凸包算法的具体实现代码. // #include "stdafx.h" #include "QuickTuBao.h" //#pragma comment(linker,stack:16000000,16000000) static vector<dot> outpts;//点集pts的凸包 //计算三角形的有向面积 double getArea(dot p1, dot p2, dot p3) { return p1.x * p2.y + p3.x * p1.y + p2.x * p3.y - p3.x * p2.y - p2.x * p1.y - p1.x * p3.y; } //计算叉乘 float cross(dot pi, dot top, dot ntop) { return (pi.x-ntop.x)*(top.y-ntop.y) - (top.x-ntop.x)*(pi.y-ntop.y); } //递归 void Divide(dot d1, dot d2, vector<dot> ptsleft) { vector<dot>::iterator it; if(ptsleft.empty()) { if(find(outpts.begin(),outpts.end(),d1) == outpts.end()) outpts.push_back(d1); if(find(outpts.begin(),outpts.end(),d2) == outpts.end()) outpts.push_back(d2); return; } //寻找pMax,面积最大的就是pMax double area = 0, maxArea = 0; dot pMax = d1; for(it=ptsleft.begin();it!=ptsleft.end();it++) { area = abs(getArea(d1, d2, *it)); if(area > maxArea) { pMax = *it; maxArea = area; } } //找出位于(p1, pMax)直线左边的点集s1 //找出位于(pMax, p2)直线左边的点集s2 vector<dot> s1; vector<dot> s2; dot d; for(it=ptsleft.begin();it!=ptsleft.end();it++) { d = *it; if(getArea(d1,pMax,d) > 0) s1.push_back(d);//d属于左(上) else if(getArea(pMax,d2,d) > 0) s2.push_back(d);//d属于右(下) } /* cout<<"------------s1---------"<<endl; for(it=s1.begin();it!=s1.end();it++) { cout<<*it<<endl; } cout<<"------------s2---------"<<endl; for(it=s2.begin();it!=s2.end();it++) { cout<<*it<<endl; } */ //递归 Divide(d1, pMax, s1);//分别求解 Divide(pMax, d2, s2);//分别求解 } void QuickTuBao(vector<dot> &vec) { //按x轴对pts排序 sort(vec.begin(),vec.end(),lessCompare); dot d1 = vec[0];//最左边的点 dot d2 = vec[vec.size()-1];//最右边的点,用直线p1p2将原凸包分成两个小凸包 cout<<d1<<endl; cout<<d2<<endl; //左右凸包点集 vector<dot> ptsleft; vector<dot> ptsright; //穷举所有的点,将点集按照直线d1d2分为左右两个凸包(上下凸包) dot d; vector<dot>::iterator it; for(it=vec.begin();it!=vec.end();it++) { d = *it; double area = getArea(d1,d2,d); if(area > 0) ptsleft.push_back(d);//d属于左(上) else if(area < 0) ptsright.push_back(d);//d属于右(下) } Divide(d1, d2, ptsleft);//分别求解 Divide(d2, d1, ptsright);//分别求解 vec = outpts; //去除共线的点 vector<dot> in; int size = vec.size(); int j,k; for(int i=0;i<size;i++) { j=(i+1)%size; k=(i+2)%size; if(cross(vec[j],vec[k],vec[i]) == 0) { //加入内点 in.push_back(vec[j]); } } for(it=vec.begin();it!=vec.end();) { d = *it; if(find(in.begin(),in.end(),d) != in.end()) it = vec.erase(it); else it++; } } ```
关于输出错误的问题(新手求教)
# 自己写的一个程序,想请教各位大佬,为什么输出结果,一直为0 ![图片说明](https://img-ask.csdn.net/upload/201711/15/1510708421_751115.jpg) ![图片说明](https://img-ask.csdn.net/upload/201711/15/1510708434_78680.jpg)
请教IDEA while循环debug问题
# 想调试一个使用JDBC从数据库读取Blob类型数据的程序,但是试了很多次debug不了其中的while循环 ## 在Servlet实现类的doPost方法中试了一个简单的while循环,发现可以调试 ```java int a=11; int i=0; while (++i<a){ System.out.println(i); } ``` ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570014345_777656.png) ## 代码 ### Servlet doPost ``` String sql = "SELECT * FROM resource WHERE id = ?"; String[] path = new String[1]; path[0] = "F:\\program design\\JavaWeb\\web\\resource\\2.png"; //下面的方法传入数据库连接,接收数据的类,sql语句以及要将数据库中提取的文件放入的路径和sql语句中?的替代 //返回接收数据的类的实例的集合 ArrayList<Datas> arrayList = JDBC.searchBolb(connection, Datas.class, sql, path, 1); PrintWriter writer = response.getWriter(); for (Datas d : arrayList) { writer.println(d); } ``` ### JDBC ```java //重点请看while循环,其他错误只要能调试while循环我自己慢慢找 public static <T> ArrayList<T> searchBolb(Connection connection, Class<T> clazz, String sql, String[] resourcePath, Object... args) { //数据库表中最后一个字段为Blob类型 //输出类中封装Blob资源输出地址 PreparedStatement ps = null; ResultSet result = null; ResultSetMetaData rsmd = null; InputStream is = null; FileOutputStream fos = null; int resourcePathNumber = 0; ArrayList<T> collection = new ArrayList<T>(); try { ps = connection.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } result = ps.executeQuery(); rsmd = result.getMetaData(); while (result.next()) { int columnCount = rsmd.getColumnCount(); T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i < columnCount - 1; i++) { Object columnValue = result.getObject(i + 1); String columnLabel = rsmd.getColumnLabel(i + 1); Field field = clazz.getDeclaredField(columnLabel); field.setAccessible(true); field.set(t, columnValue); } Blob blob = result.getBlob(columnCount); String blobLabel = rsmd.getColumnLabel(columnCount); Field field = clazz.getDeclaredField(blobLabel); field.setAccessible(true); field.set(t, resourcePath); is = blob.getBinaryStream(); fos = new FileOutputStream(resourcePath[resourcePathNumber++]); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } collection.add(t); } } catch (SQLException | IOException | NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { e.printStackTrace(); } finally { try { ps.close(); is.close(); fos.close(); } catch (SQLException | IOException e) { e.printStackTrace(); } if (collection == null) { System.out.println("Failed to search"); } return collection; } } ```` ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570015047_843639.png) ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570015068_774806.png) <br> 把断点设在144行(while循环第一行),运行到for循环第一行出错(用的f8,不进入方法体)(没有while循环过,这是第一次for循环),这里的错误是结果集关闭,但是显然并没有任何操作使之关闭(我试了另外一个没有问题的方法,报的同样的错误),怀疑是刚开始debug时就已经进行完了while循环,导致结果集关闭 <br> 请问需要把断点设在哪里,或者是怎么样才能解决上述问题?3Q
各位大哥 、大姐 请教 Java 的小问题1-1
需求说明 (1)登录时提示用户输入用户名和密码。 (2)验证用户名和密码的正确性 (3)系统提供用户有 3 次机会输入用户名和密码,如果超过 3 次仍不能匹配,程序结束。 (4)根据 3 种匹配结果(信息匹配 / 信息不匹配 / 3 次都不匹配),执行不同的操作 1. 信息完全匹配 输入“欢迎进入我行我素购物管理系统” 2. 信息不匹配 计算剩余次数,输出“用户名和密码不匹配!”,告知还有几次机会,提示“请重新输入” 3. 3 次不匹配 输入“您没有全线进入系统!” (5)声明变量username和password,分别存储系统中正确的用户名和密码,声明变量name和pw,分别从控制台获取输入的用户名和密码, (6)使用for循环结构,计数器 从3开始递减直到 为1, -1表示剩余的次数。 // 从键盘接受用户名和密码 // 进行判断 (7)使用多重 结构进行判断并执行相应的操作, (8)break 语句的作用:立刻跳出整个循环结构 import java.util.*; public class PswVerjfy1{ public static void main(String[]args){ String username = " "; // 用户名 String password = " "; // 密码 boolean wrong = true; Scanner input = new Scanner(System.in); for(int i = 3; i >= 1; i--){ System.out.print("用户名:"); username = input.next(); System.out.print("密码:"); password = input.next(); if(username.equals("manage") && password.equals("0000") ){ System.out.println("购物管理系统"); wrong = false; break; } if(wrong){ System.out.println("\n用户名和密码不匹配!"); System.out.println("你还有"+(i-1)+"次机会,请重新输入:"); }else{ System.out.println("你没有权限进入系统!"); } } System.out.println("程序结束!"); } } 我执行的时候 输入三次错误 怎么不显示“你没有权限进入系统”还有输入错误3次以后 她还显示 你好有 0 此机会 (可不可以不让它显示)直接显示(你没有权限进入系统/程序错误)啊
请教Spring + Hibernate进行开发时,session关闭问题
程序代码 <br />public class DaoReal extends HibernateDaoSupport implements Dao { <br />  public List&lt;user&gt; getAll() { <br />    Session s = super.getSession(); <br />    try { <br />      return s.createQuery("from User").list(); <br />    } finally { <br />      s.close(); <br />    } <br />  } <br />} <br /> <br /> <br />问题:(利用session.createQuery(...)方法的隐患) <br />上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是Spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n&lt;=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。 <br /> <br />执行n遍后依然停止响应。问题出在哪里呢?其实Spring的Session总是与某个线程绑定的,而这个线程往往就是承载Servlet或Jsp的那个线程,也就是说,它的生命周期scope是request的。在上面的例子中,我们利用getSession强制获得了Hibernate的 Session,这个Session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,Spring只对当前事务中的Session 进行关闭。 <br /> <br /> <br />请教大家有什么解决办法没? 还是我提的问题是错误的?谢谢大家?<br /><strong>问题补充</strong><br />回楼上: <br />用到了hibernate+spring的话,一般我们直接用getHibernateTemplate().find("from User")这类型的查询。 <br /> <br />单是现在我项目里面程序用到这个类型的: <br />Session s = super.getSession(); <br />try { <br />      return s.createQuery("from User").list(); <br />  } finally { <br />      s.close(); <br />  } <br /> <br />我们测试中好像发现了这个session不能完全关闭好像。是不是这么回事??<br /><strong>问题补充</strong><br />在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的。在利用Spring + Hibernate进行开发时也是如此。 <br /> <br />getHibernateTemplate().find("from User"); <br />这类型的我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。 <br /> <br /><br /><strong>问题补充:</strong><br />getSession()是从当前的ThreadLocal中拿到的SESSION <br />就是说可以不用关闭SESSION,但这个线程结束的时候,SESSION就没了。。 <br /> <br /> <br />但是我们的请求也许也许没有响应,一直在请求过程中,也是就是这个线程还没结束,那这个session也就没有关闭吧!
PTA:进阶练习1001 A+B Format
Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits). Input Specification: Each input file contains one test case. Each case contains a pair of integers a and b where −10 ​6 ​​ ≤a,b≤10 ​6 ​​ . The numbers are separated by a space. Output Specification: For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format. Sample Input: -1000000 9 Sample Output: -999,991 大概意思应该是两个数相加的和后有逗号的输出吧 程序清单: ``` #include<stdio.h> int main() { int a,b,fu=0,num[1000]; scanf("%d %d",&a,&b); int sum=a+b; if(sum==0)printf("0"); if(sum<0) { fu=1; sum=-sum; } int i=0; while(sum!=0) { num[i++]=sum%10; sum/=10; } i--; if(fu)printf("-"); int count=0; for(;i>=0;i--) { printf("%d",num[i]); count++; if(count%3==0&&i!=0)printf(","); } } ``` 有挺多错误的,我看网上的代码也不知道自己什么情况没考虑到,请教~ ![图片说明](https://img-ask.csdn.net/upload/201912/29/1577631522_728093.png)
请教各位大神:一种新的数组排序,初测速度是快速排序的50倍,有无市场价值,时间复杂度能计算出来吗?
求助:最近,发现了一种新的数组排序方法,初测其速度是快速排序法的近50倍,想知道有没有市场价值,时间复杂度能计算出来吗?请各位大神赐教! 下面,为了便于区别说明将这个新方法暂且称之占位排序法; 用javascript脚本语言实现快速排序法和占位排序方法之后,然后在同一台(较老旧的,cpu是AMD推土机)电脑上,用ie浏览器运行,样本1000时,快速排序法和占位排序法所耗时分别是:18毫秒、15毫秒;样本10000时,所耗时间分别是:95毫秒、80毫秒;样本100000时,耗时分别是:2405毫秒、407毫秒;样本1000000时,耗时分别是:190888毫秒、3962毫秒;占位方比快排法在对100万数据进行排序时,快了近50倍!!! 占位排序法的理念是:一是,只对数组全局作一次遍历,以后每次只遍历数组的一小部分;二是,把数据的迁移次数降至极致。 占位法的实现方法是: 分段处理、选取代表、萝卜占位、先乱后治、小马快跑、多看少动; 将一个大的数组分割成多个段;首先,要在各段数据p内明确锚点位;其次,锚点位的确定要遵守一个预先明确的固定规范; 其特征还在于,在锚点位上保存的数据不仅要体现自身的数据特征,还要能体现所在段p共同的数据特征。 ![图片说明](https://img-ask.csdn.net/upload/201906/20/1560998940_178698.jpg) 举例:如果在段p内,继续分段p_;假设一个索引地址m; m即是段p的锚点位,又是p_的锚点位,那么在索引m存放的数据,要求必须同时体现:自身的数据征、段p的共同的数据特征、段p_的共同的数据特征;如果对锚点位的数据操作直接作用在需要排序的数据集合上,称之为内建锚点(以下所有实例如无特别说明均采用内建锚点的方式);如果对锚点位的数据进行的操作,还需要额外的映射在另外一个数据集合上,则称之为外建锚点。 列举一个实例,做进一步说明:要从大到小重新排序一个数组A;数组A有100个元素:数据d,规定从A[0]开始每5个数据为一组p_;同时,从A[0]开始每15个数据为一组p;这样一个p内就有3个p_;更进一步,规定每个段的第一个索引对应段的锚点位;那么,A[0]是p的锚点位,又是p_的锚点位;则,A[5]是p_的一个锚点位,而不是p的锚点位;假设初始状态:A[0]存放的数据为5、A[3]为6、A[7]为9、A[12]为8,其他数据均为2;为了在排序过程中,减少遍历和迁移数据的数量,选择最大值来表达每一段数据的共同属性;这样在p_内,A[0]和A[3]的数据值要进行交换;在p内,A[0]和A[7]的数据值还要进行交换,优选的,不仅交换A[0]和A[7]的数据值,还要对A[0]至A[4]与A[5]至A[9],两个p_段内的数据进行整理,使A[0]至A[9]中最大的5个数迁移至A[0]至A[4]中,A[0]至A[9]中最小的5个数迁移至A[5]至A[9]中;最后的结果为:A[0]为9、A[5]为2、A[10]为8。 所述的萝卜占位,指的是“一个萝卜、一个坑”的占位理论在计算机数据整理和筛选过程中的运用; 一方面,更具体的,假设要从一个更大的数据集合中筛选出最小的n个数据,那么只要从数据集合中任意找出n个数据,然后再从这n个数据中找到最大的一个n_,据此就可以准确的进行以下推断:如果存在一个数据大于n_,那么该数据一定不是要选的数据;如果存在一个数据n_1,只要n_1小于n_,那么就又能证明了n_这个数据一定不是要选的,所以就可以安全的用n_1将n_替换掉了;接下来,对调整后的n个数据重新排查,再次找出n个数据中最大的那个,然后重复以上操作,直到将所有符合要求的数据都找出来; 另一方面,设定锚点存放的是每个数据段p的最小的值,p段里面还有p_段,要筛选出最小的n个数据;那么,就可以先遍历p的锚点,选择出锚点值最小的n个p段,再从这n个p段中出找出锚点值最小的n个p_段;再从这n个p_中找到锚点的值最大的p_1;最后遍历这n个p_数据段的数据,只有满足小于或等于p_1,同时又小于n_的值才有可能是要选取的值,所以可以安全的操作这些数据与n_的数据进行互换; 否则,一定不是,所以可以将它们安全的排除在目标之外; 而从一个更大的数据集合中筛选出最大的n个数据,与此逻辑相同,但取值相反;具体的, 只要从数据集合中任意找出n个数据,然后再从这n个数据中找到最小的一个n_,据此就可以准确的进行以下推断:如果存在一个数据小于n_,那么该数据一定不是我们要选的数据;如果存在一个数据n_1,只要n_1大于n_,那么就又能证明了n_这个数据一定不是我们要选的,所以就可以安全的用n_1将n_替换掉了;接下来,对调整后的n个数据重新排查,再次找出n个数据中最小的那个,然后重复以上操作,直到将所有符合要求的数据都找出来; 另一方面,更进一步,接上例,更具体的,设定锚点存放的是每个数据段p的最大的值,p段里面还有p_段,要筛选出最大的n个数据;那么,就可以先遍历p的锚点,选择出锚点值最大的n个p段,再从这n个p段中出找出锚点值最大的n个p_段;再从这n个p_中找到锚点的值最小的p_1;最后遍历这n个p_数据段的数据,只有满足大于或等于p_1,同时又大于n_的值才有可能是要选取的值,所以可以安全的操作这些数据与n_的数据进行互换;否则,一定不是,所以可以将它们安全的排除在目标之外; 通过这种方法有效的减少了数据的遍历数量和数据的交换次数; ![图片说明](https://img-ask.csdn.net/upload/201906/20/1560999113_571306.jpg) ``` <!doctype html><head><meta charset="UTF-8"><title>占位排序法</title></head><body><script> /**********用于随机产生一个测试用数组*****/ function arrcf(arr,arrLength){ for(var i = 0; i < arrLength; i++){arr[i]=Math.floor(Math.random()*10000);};} var arr = new Array(); arrcf(arr,1000000);//调用生成随机数组 var d = new Date(); var t = d.getTime();//记录程序开始的 /**********用于随机产生一个测试用数组****/ var z =25; //步长,每次可排好的数据个数,可调整 var p =4*z; //数据分段长度,可根据实际情况调整 var pxb = 0; //prr数组中arr[prr[*]]最大值的下标* var pxm = 0; //arr[prr[*]]中最小值的下标* var f2 = arr.length; //数组长度 var fi = f2-z; //段的头部 var mx = fi; //步长内极值(最小值)的下标 var pi = 0; //中间过渡变量 var prr = new Array();//中间过渡数组 /**** 预处理 ***************/ ycl(f2); /**** 全面排序 *************/ for(var fi=f2-z;fi>0;fi-=z){ //向prr[]填充z个p节点的下标 var prr= new Array(); for (var iii=0;iii<z;iii++ ){ prr[iii]=iii*p;} //找出arr[prr[*]]最小的*值 pxb = prrmax(pxb); //便历节点找出最大的z个数据,更新prr[] for(var ii=(z)*p; ii< fi ;ii+= p){ if(arr[prr[pxb]]<arr[ii]){ prr[pxb]=ii; //重新确定prr[]中的最小值 pxb = prrmax(pxb);}} mx=colt(z,fi); //获取步长内的最小值 //遍历prr数组 for(var i=0;i<z;i++){ pi=prr[i]; if(arr[mx]<arr[prr[i]]){ //步长内的最小值,是否小于段的最大值 var z1= Math.floor(fi/p)*p; if(z1===pi){ //判断步长的头部是否在段内 //处理尾部数据,即步长头部所在的段 var z1= Math.floor(fi/p)*p; for(var ii=z1;ii<fi;ii++){ //遍历arr[]数组的当前段 if(arr[ii] >= arr[prr[pxb]]){ //如果当前值不小于arr[prr[]]最小值 if(arr[ii]>arr[mx]){ dtod(ii,mx); mx=colt(z,fi); //获取步长内的最小值 }} if(arr[ii]>arr[pi]){ //动态维护本段的最大值 pi=ii; }} //保存最大值到段的开头位置 if(arr[pi]>arr[prr[i]]){dtod(pi,prr[i]);} }else{ for(var ii=prr[i];ii<prr[i]+p;ii++){ //遍历arr[]数组的当前段 if(arr[ii] >= arr[prr[pxb]]){ //如果当前值大于等于prr[]中的arr[prr[]]最小值 if(arr[ii]>arr[mx]){ //如果当前值大于数组中的最小值 dtod(mx,ii); //数据交换 mx=colt(z,fi); //重新获取步长内的最小值 }} if(arr[ii]>arr[pi]){ //动态维护本段的最大值 pi=ii; }} //保存最大值到段的开头位置 if(arr[pi]>arr[prr[i]]){ dtod(pi,prr[i]); }}}} if(fi>p*z){ var fz=fi; var zf=fi+z; zpx(fz,zf); }else{ var fz=0; var zf=fi+z; zpx(fz,zf); break; }} /************以下位置用于封装函数*****************************/ //标记段数据的最大值属性 function ycl(f2){ for (var i=0;i<f2;i += p ){ var max=i; var rp=i+p; for(var ii=i;ii<rp;ii++){ if(arr[max]<arr[ii]){ max=ii; }} dtod(i,max); }} //选取步长内最小数据的索引号 function colt(z,fi){var mrx=fi+z; for(var i=fi;i<mrx;i++){if(arr[mx]>arr[i]){mx=i;}}return(mx); } //数据交换 function dtod(dt1,dt2){y=arr[dt1];arr[dt1]=arr[dt2];arr[dt2]=y;} //找出arr[prr[i]]最小的i值 function prrmax(pxb){ var pxb=0; for(var pi = 0;pi<z;pi++){if(arr[prr[pxb]]>arr[prr[pi]]){pxb=pi;}}return(pxb);} //以1为步长,双向式,对数据排序 function zpx(fz,zf){ //zf排序的开始位置,fz排序的结束位置 for(fz;fz<zf;zf){ var mi=fz; //记录最小值 var ma=zf-1; //记录最大值 if(arr[fz]>arr[zf-1]){dtod(fz,zf-1);}//前后两个数比较,交换位置 for(var i=fz;i<zf;i++){ if(arr[i]<arr[mi]){mi=i;}else if(arr[i]>arr[ma]){ ma=i; }} dtod(fz,mi); dtod(ma,zf-1); fz++; zf--; }} /**********以下用于输出结果**********************/ //for(var i=0;i<arr.length;i++){ document.write(arr[i]+",,,,,"+i+"<br>")}; var t2=(new Date().valueOf());document.write("---开始时间---"+t2+"<br>---完成时间---"+t+"<br>-占位排序法-用时--------"+(t2-t)+"---毫秒<br>"); for(var i=0;i<arr.length;i++){if(arr[i-1]>arr[i]){alert("数组排序有误,错误在:"+i);}else{x1=-1;}};if(x1<0){alert("排序正确");}; </script></body></html> ```下面是快排法 ``` ``` <!doctype html><head><meta charset="UTF-8"> <title>快速法数组排序</title></head><body> <script> //用于随机产生一个测试用数组 function arrcf(arr,arrLength){ //数组名字(调用前在函数外声明一下,做在全局的),数组长度 for(var i = 0; i < arrLength; i++){arr[i]=Math.floor(Math.random()*1000);}; } //调用生成随机数组 var arr = new Array(); arrcf(arr,1000000); var d = new Date(); var t = d.getTime();//记录程序开始的时间,用于测试程序执行效率 /********* (以下代码采用52.0Hz的方案,https://blog.csdn.net/Loving_M/article/details/52993521)******/ var times=0; var quickSort=function(arr){ //如果数组长度小于等于1无需判断直接返回即可 if(arr.length<=1){return arr;} var midIndex=Math.floor(arr.length/2);//取基准点 var midIndexVal=arr.splice(midIndex,1);//取基准点的值,splice(index,1)函数可以返回数组中被删除的那个数arr[index+1] var left=[];//存放比基准点小的数组 var right=[];//存放比基准点大的数组 //遍历数组,进行判断分配 for(var i=0;i<arr.length;i++){ if(arr[i]<midIndexVal){left.push(arr[i]);}//比基准点小的放在左边数组 else{right.push(arr[i]);}//比基准点大的放在右边数组 } //递归执行以上操作,对左右两个数组进行操作,直到数组长度为<=1; return quickSort(left).concat(midIndexVal,quickSort(right)); }; quickSort(arr); /*******************************************************************************************/ //用于输出结果 var t2=(new Date().valueOf()); document.write("---开始时间---"+ t2 +"<br>---完成时间---"+t+"<br>-快速法-用时----"+(t2-t)+"---毫秒<br>"); </script></body></html> ``` ![图片说明](https://img-ask.csdn.net/upload/201906/20/1561001908_368628.jpg) ![图片说明](https://img-ask.csdn.net/upload/201906/20/1561002457_733470.jpg)
求助下面这个单片机小车代码,为啥case中的事件我没有发送指令,小车就开始动了
刚刚研究单片机小车一段时间,在某宝上买个小车,随车附赠了WIFI控制小车运转的代码,然后想自己改改代码完成我想要的功能。但问题是,在switch……case这个语句中,我都没有给小车发送指令,小车自己就动了,我不太清楚是哪个地方出的问题,所以想请教各位大神,我该怎么改,小车才能在接到我的指令后,才动。(我在程序里面编了一个gg事件,用于证明程序是没有经过判断就直接运行case中的事件,但结果确实是我没有发送指令,他就动了......)代码如下: ``` /*////////////////接线图////////////////////////////////////////// MLA-----------------P1.0 L---left 左 MLB-----------------P1.1 MRA-----------------P1.2 R---right 右 MRB-----------------P1.3 ////////////////////////////////////////////////////////////////*/ #include<AT89x51.H> #define uchar unsigned char uchar count; //HJ-4WD小车驱动接线定义 #define Left_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //左边两个电机向前走 #define Left_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //左边两个电机向后转 #define Left_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //左边两个电机停转 #define Right_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //右边两个电机向前走 #define Right_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //右边两个电机向后走 #define Right_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //右边两个电机停转 bit M3_start_flag=0; bit M4_start_flag=0; bit M3_forward_flag=0; bit M4_forward_flag=0; //uchar SEH_PWM_count=1; //uchar SEV_PWM_count=1; uchar M3A_count=0; uchar M3B_count=0; uchar M4A_count=0; uchar M4B_count=0; uchar SEH_count=15; uchar SEV_count=14; uchar command=0; sbit BEEP=P2^6; sbit LEMP=P2^0; sbit M3A=P0^0; sbit M3B=P0^1; sbit M4A=P0^2; sbit M4B=P0^3; //sbit SEH_PWM=P2^6; //sbit SEV_PWM=P2^7; int gg=0; void delay(int z) { int i; for(i=z;i>0;i--); } int aa(int g) { g++; return g; } void Com_Init() { //IE = 0x00; //停止所有中断 TMOD= 0x22; //设置定时器0为方式1(16位);定时器1为方式2(8位自动重装) SCON= 0x50; //设置串口控制寄存器,串口方式1,10位uart,波特率可调;允许接收 TH1 = TL1 = 0xfd; //为定时器1赋初值,晶振为11.0592MHz时波特率为9600bps IE = 0x92; //开定时器0中断,串口中断,外中断0和总中断 //EA,_ _ ES,ET1,EX1,ET0,EX0 TR1 = 1; } void Time0_Init() //定时器初始化 { //TMOD=0x01; //使用定时器T0的模式1 TH0=TL0=0xa3; TR0=1; } void Time0_Int() interrupt 1 { count=count++; if(count>=200) { count=0; //if(SEH_PWM_count>=40000)SEH_PWM_count=0; //if(SEV_PWM_count>=40000)SEV_PWM_count=0; } // if(SEH_PWM_count) // { // if(count<SEH_count) //判断0.5ms次数是否小于角度标识 // SEH_PWM=1; //确实小于,pwm输出高电平 // else // SEH_PWM=0; //大于则输出低电平 //SEH_PWM_count++; //} // if(SEV_PWM_count) // { // if(count<SEV_count) //判断0.5ms次数是否小于角度标识 // SEV_PWM=1; //确实小于,pwm输出高电平 // else // SEV_PWM=0; //大于则输出低电平 // SEV_PWM_count++; // } } void main() { int i=0; count=0; P0=0xef; P1=0x00; P2=0xff; P3=0xff; Time0_Init(); Com_Init(); while(1) { i++; if(i>=200)i=0; if(gg>=100||gg<=15) { Left_moto_go ; //左电机往前走 Right_moto_back ;} ////////////////////////////////////////// if(M3_start_flag) { if(M3_forward_flag) { M3A=0; if(i<M3B_count)M3B=1; else M3B=0; } else { M3B=0; if(i<M3A_count)M3A=1; else M3A=0; } } else { M3A=0; M3B=0; } ///////////////////////////////////////////// if(M4_start_flag) { if(M4_forward_flag) { M4B=0; if(i<M4A_count)M4A=1; else M4A=0; } else { M4A=0; if(i<M4B_count)M4B=1; else M4B=0; } } else { M4A=0; M4B=0; } if(i>=100)i=0; } } * 1. void ser() interrupt 4 * 1. { * 1. if(RI==0) return; * 1. ES=0; //关闭口中断 * 1. RI=0; //清除口接收标志位 * 1. command=SBUF; //读取字符 * 1. switch(command) * 1. { * 1. case 'a':{ //向前:左右轮同时正传 * 1. // Left_moto_go ; //左电机往前走 * 1. // Right_moto_go ; //右电机往前走 * 1. // gg++; * 1. break; * 1. } * 1. case 'b':{ * 1. //向后:左右轮同时反传 * 1. Left_moto_back ; //左电机往后走 * 1. Right_moto_back ; //右电机往后走 * 1. gg=aa(gg); * 1. break; * 1. } case 'c':{ //向左:左轮后转,右轮正传 Left_moto_back ; //左电机往后走 Right_moto_go ; //右电机往前走 break; } case 'd':{ //向右:右轮后转,左轮正传 Left_moto_go ; //左电机往前走 Right_moto_back ; //右电机后走 break; } case 'e':{ //停转 Left_moto_Stop ; //左电机往前走 Right_moto_Stop ; //右电机往前走 break; } case '1':{ //云台向下移动 SEV_count++; // SEV_PWM_count=1; if(SEV_count>=23)SEV_count=23; //已经是180度,则保持 break; } case '2':{ //云台向上移动 SEV_count--; // SEV_PWM_count=1; if(SEV_count<=4)SEV_count=5; //已经是180度,则保持 break; } case '3':{ //左后转大弯 SEH_count++; // SEH_PWM_count=1; if(SEH_count>=23)SEH_count=23; //已经是180度,则保持 break; } case '4':{ //云台向右移动 SEH_count--; // SEH_PWM_count=1; if(SEH_count<=4)SEH_count=5; //已经是180度,则保持 break; } case '5':{ //云台回正 SEH_count=15; SEV_count=14; break; } case 'f':{ //开摄像头灯 LEMP=1; break; } case 'g':{ //关摄像头灯 LEMP=0; break; } case 'h':{ //开摄像头灯 BEEP=0; break; } default: { Left_moto_Stop; Right_moto_Stop; BEEP=1; break; } count=0; //20ms周期从新开始 } ES=1; //允许串口中断 } ``` 第一次发帖求助,我不知道这么发有没有什么错误的地方,如有请指正,我尽快修改。谢谢~
用ctypes向dll传入的数组,返回python后,其中的数据有时正确有时错误,怎么办?
运行环境: win10 + anaconda5.3 + jupyter python文件 ``` import numpy as np import pandas as pd mylib = ctypes.cdll.LoadLibrary('mydll.dll') C_fun = mylib.func_name C_fun.restypes = None C_fun.argtypes = pass_args_Struct, c_double*10 # pass_args_Struct 是继承ctypes.Structure定义的结构体,代码略 def generate_Struct(data, 其他参数略): # 生成 pass_args_Struct,代码略 # data是个DataFrame,用于接收下面myClass的data属性 class myClass(): # myclass有个data属性,data是一个DataFrame # 其他代码略 def func1(self, x): # 删除self.data的一列,再根据x参数重新添加这一列,代码略 struct_x = generate_Struct(self.data, 其他参数略) myArr = (c_double*10)() C_fun(struct_x, myArr) npArr = np.ctypeslib.as_array(myArr,(10,)) return pd.Series(npArr, _column_names) # _column_names 定义略 def func2(self): # 生成df,df是个只有一列值的DataFrame,代码略 return df.apply(lamba x: self.func1(x[0]), axis=1, result_type='expand')) # 其他代码略 ``` mydll.dll中的代码 ``` #define API extern "C" __declspec(dllexport) typedef pass_args_Struct { // 对应于python中pass_args_Struct,代码略 } API void func_name(pass_args_Struct* x, double arr[]) { // 对arr进行一些操作,代码略 } ``` 在jupyter中: 导入前述Python文件并生成 myObject=myClass() 之后, 执行ret1 = myObject.func1()没什么问题, 但是ret2 = myObject.func2()的结果则有时正确有时错误,错误的时候,ret2中会出现一些NaN值和错误的值。 之前把generate_Struct()定义成myclass的一个方法,连ret1也会出错; 之前的func1(self, x)中采用: ``` func1(self, x): # 其他代码略 myArr = np.ctypeslib.as_array(myArr,(10,)) # 左边不用新名而直接用myArr return pd.Series(myArr, _column_names) ``` 则ret1会频繁出错,基本上是对一次就错一次。 程序一直能运行,只是结果有时不正确。 请教各位大牛,正确的写法是什么样子的? ==================================================== =====2018年11月30日更新==================================== 我可能发现问题了: Python文件TestX.py(放在PYTHONPATH下): ``` import numpy as np from ctypes import Structure, c_double, c_int, POINTER class struct_args(Structure): _fields_ = [('data',POINTER(c_double*2)), ('rows',c_int)] class test(): def __init__(self): self.data = None def get_args_2C(self): arr = np.ascontiguousarray(self.data[['foo','bar']].values, dtype=np.float) rows = c_int(arr.shape[0]) return struct_args(arr.ctypes.data_as(POINTER(c_double*2)), rows) ``` 在jupyter中: ``` import TestX import pandas as pd import numpy as np mydata = pd.DataFrame(np.arange(1600).reshape(800,2),columns=['foo','bar']) # 行数不要太小 mytest = TestX.test() mytest.data = mydata args = mytest.get_args_2C() np.ctypeslib.as_array(args.data,(800,)) ``` 输出的值经常是错误的。 ==================================================== =====2018年12月3日更新==================================== 不知道为什么,但总算是不出错了: python文件: ``` from ctypes import Structure,POINTER,c_double def Struct_A(ctypes.Structure): _fields_ = [(), # 其他成员略 ('my_arr',POINTER(c_double)] # 这个地方用c_double*10后面也会出错 class myClass(): def makeStructA(self, 其他参数): arr = (c_double*10)() SA = Struct_A(……,arr) # 其他成员略 return SA def myMethod(self, 其他参数): SA = self.makeStructA(其他参数) # myCfun是dll中的函数,功能是利用SA中数据进行一些计算,然后把结果写入SA.my_arr,具体代码略 myCfun(SA) ret = pd.Series(np.ctypeslib.as_array(SA.my_arr,(10,)), _columns_name) ret['odd'] = 1 # 这里随便新加点什么就不会出错了 return ret ``` 以上代码如果没有ret['odd']=1那一行,则myObject.myMethod()返回的Series中都是错误的值(看着像是内存未初始化,比如-2.24934335e308之类),而随便给ret添加点什么内容,返回值就是正确的了。 但是在以下计算中仍然会出错,只是出错的频率变小了,而且多运行几次就会正确: ``` class myClass(): # 接上文 def myOptimize(self, arg_name, arg_range): ret = pd.DataFrame({arg_name:arg_range}) _optimize = lambda arg: self.myMethod(**{arg_name:arg[arg_name]}) return ret.join(ret.apply(_optimize, axis=1, result_type='expand')) ``` ===================================== =====2018年12月7日更新==================================== 又出错了!!!12月3日写的: ``` ret['odd'] = 1 # 这里随便新加点什么就不会出错了 ``` 那个函数确实不出错了,但是别的函数用同样的写法(先生成c_double*shape再传入dll在C中写入值)得到的ret无论添加行还是添加列,多运行几次总会出错(内存被清理)。 换一种写法: ``` 略 arr=np.zeros(shape) 略 # 然后传入arr.ctypes.data_as(POINTER(c_double*10)) ``` 目前暂时不出错了。 =====2018年12月13日更新==================================== 前面的写法有问题:用函数生成结构体(比如makeStructA)再传递给dll就会出错,直接将makeStuctA的代码放到myMethod中就不会出错。 另外,传递结构体时用byref就不会出错了,在dll中用malloc给结构体的成员赋值都不会出错。
请教一个JVM内存优化的问题
<p>自己写的一个WEB爬虫程序,程序方面的优化我自己感觉做的不错了,各种对象的使用都想办法不让内存浪费。 <br />但还是吃内存吃的很厉害 <br />我想主要的消耗在于,对于每一个爬下来的网页,都要变成String在内存中分析超链接,这个估计很大。 <br />另外对于每一个分析到的URL,都需要保存起来。 <br /><br /><br />我当前使用的内存优化参数如下 <br />-Xms1024M -Xmx1024M -Xmn512M -Xss128K -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxPermSize=128M -XX:NewSize=128M -XX:MaxNewSize=128M -XX:SurvivorRatio=8 <br /><br />机器内存是1G。。上面那堆参数,除了最大最小堆内存我也是不求甚解,不是非常明白我设置了什么。网上搜答案也是五花八门,希望大家能推荐一个内存优化参数的文章 <br />另外我上面设置的参数有哪些方面可以优化,或者哪些地方写的不对。 <br /><br />核心的代码我都贴到下面:(我是刚入门的菜鸟,大家别笑话我写的差哦) <br /><br />这个是主类,负责控制,那个monitor大家就当做System.out.println,其实就是</p> <pre name="code" class="java">package com.wood.core; import java.util.concurrent.*; import java.util.*; import com.wood.core.monitor.*; public class CrawlerController implements Runnable { //一个类,用来管理URL,由各抓取线程共享 private URLMap urlmap; //已成功处理URL总数 private int count; //目标完成任务总数 private int total; //管理所有的抓取线程,必要时进行关闭,由于抓取线程存在I/O读取,而I/0读取中的线程是不可中断的,需调用线程的cancel函数 private Crawler[] crawlers; //线程工厂,可以监视产生的线程工作状态 private CrawlerFactory factory; //线程数目 private int threadMax; //当前活动线程 private int threadActive; //线程执行器 private ExecutorService exec; //当系统关闭时取消 private boolean canceled; public CrawlerController(String seed) { this(seed,20,10000); } public CrawlerController(List&lt;string&gt; seeds) { this(seeds,20,10000); } public CrawlerController(String seed,int threadNum) { this(seed,threadNum,10000); } public CrawlerController(List&lt;string&gt; seeds,int threadNum) { this(seeds,threadNum,10000); } public CrawlerController(String seed,int threadNum,int total) { //初始化URLMap,保存抓取启始位置 urlmap=new URLMap(seed); init(threadNum, total); } public CrawlerController(List&lt;string&gt; seeds,int threadNum,int total) { urlmap=new URLMap(seeds); init(threadNum, total); } //构造 private void init(int threadNum,int total) { //初始完成URL总数为0 count=0; //设置目标完成总数 this.total=total; threadMax=threadNum; threadActive=threadNum; //初始化工作线程 crawlers=new Crawler[threadMax]; String id="Crawler "; for(int i=0;i&lt;threadmax;i++) crawlers[i]="new" crawler(id+(i+1),this,urlmap);="" factory="new" crawlerfactory();="" exec="Executors.newCachedThreadPool(factory);" canceled="false;" }="" 检查当前工作线程状态,并打印系统状态="" private="" boolean="" check()="" {="" if(canceled)="" return="" false;="" int="" count="getCount();" if(count=""&gt;total) { MonitorHolder.getMonitor().print("已抓取"+COUNT+"页面,完成目标任务"+total+"页面\n"); cancel(); return false; } threadActive=factory.getActive(); /*if(threadActive&lt;=0) { MonitorHolder.getMonitor().print("无活动工作线程,抓取任务提前结束\n"); cancel(); return false; }*/ MonitorHolder.getMonitor().print_status("统计信息:成功抓取"+COUNT+"页面,当前活动线程为"+threadActive+"个\n"); return true; } //结束抓取 public void cancel() { //调用每个抓取线程的离开方法 for(Crawler cw:crawlers) cw.cancel(); //销毁工厂 factory.destory(); exec.shutdownNow(); MonitorHolder.getMonitor().print("成功结束抓取工作,共抓取"+getCount()+"页面\n"); this.canceled=true; } public synchronized void count() { count++; } public synchronized int getCount() { return count; } public int getTotal() { return total; } public URLMap getMap() { return urlmap; } @Override public void run() { while(!Thread.currentThread().isInterrupted() &amp;&amp; !canceled) { try { MonitorHolder.getMonitor().print("初始化完毕\n"); MonitorHolder.getMonitor().print("开始抓取工作\n"); for(Crawler cw:crawlers) exec.execute(cw); int check_count=0; while (check()){ TimeUnit.SECONDS.sleep(5); check_count++; if(check_count==24) { //每2分钟把待处理URL队列打乱一次 urlmap.shuffle(); MonitorHolder.getMonitor().print("控制信息!!!待抓取URL顺序将打乱\n"); check_count=0; System.gc(); } } } catch (InterruptedException e) { MonitorHolder.getMonitor().print("抓取工作被中断\n"); cancel(); } } } public static void main(String[] args) { List&lt;string&gt; seeds=new ArrayList&lt;string&gt;(15); //问问的各个分类 seeds.add("http://wenwen.soso.com/"); seeds.add("http://wenwen.soso.com/z/c1879048192.htm"); seeds.add("http://wenwen.soso.com/z/c1090519040.htm"); seeds.add("http://wenwen.soso.com/z/c1627389952.htm"); seeds.add("http://wenwen.soso.com/z/c855638016.htm"); seeds.add("http://wenwen.soso.com/z/c1191182336.htm"); seeds.add("http://wenwen.soso.com/z/c1191182336.htm"); seeds.add("http://wenwen.soso.com/z/c620756992.htm"); seeds.add("http://wenwen.soso.com/z/c553648128.htm"); seeds.add("http://wenwen.soso.com/z/c385875968.htm"); seeds.add("http://wenwen.soso.com/z/c687865856.htm"); seeds.add("http://wenwen.soso.com/z/c16777216.htm"); seeds.add("http://wenwen.soso.com/z/c318767104.htm"); seeds.add("http://wenwen.soso.com/z/c150994944.htm"); seeds.add("http://wenwen.soso.com/z/c922746880.htm"); seeds.add("http://wenwen.soso.com/z/c83886080.htm"); CrawlerController controller=new CrawlerController(seeds,5,2000000); List&lt;string&gt; format=new ArrayList&lt;string&gt;(10); //问问回答问题的格式 format.add("http://wenwen.soso.com/z/q"); controller.getMap().addLimit(format); Thread thread=new Thread(controller); thread.start(); } } </pre> <p><br /></p> <pre name="code" class="java">package com.wood.core; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.*; import java.io.*; import java.net.*; import com.wood.core.monitor.*; public class Crawler implements Runnable { //抓取线程ID private String id; //控制器 private CrawlerController controller; //URL,供各线程共享 private URLMap urlmap; private boolean canceled; //保存抓取的网页内容,用于分析超链接 private String content; //字符集 private String charset; //匹配超链接的正则表达式 private String link_reg="&lt;a\\s+(.*?)href\\s*=\\s*\"?(.*?)[\"(\\s*?)](.*?)&gt;"; private Pattern link_pattern=Pattern.compile(link_reg,Pattern.CASE_INSENSITIVE); //匹配字符集的正则表达式 private String charset_reg="&lt;meta\\s+http-equiv=\"content-type\"\\s+content=\"text html;="" charset="(.*?)\&amp;quot;(.*?)"&gt; "; private Pattern charset_pattern=Pattern.compile(charset_reg, Pattern.CASE_INSENSITIVE); private Pattern dir_path_pattern=Pattern.compile("^\\w+$", Pattern.CASE_INSENSITIVE); //保存当前抓取的URL的主机 private String host; //生成待建立的文件夹名 private String host_path; //抓取网页的根目录 private String root_path="E:\\web"; private File root_dir=new File(root_path); //输入来自URL,输出到文件 private InputStreamReader in=null; private OutputStreamWriter out=null; //输入输出缓冲区 private char[] buf=new char[10240]; //网页内容缓冲区 private StringBuilder contentbuilder=new StringBuilder(1024*1024); //通过一个URL,下载网页内容 private void download(URL url) { in=null; out=null; //建立抓取文件 String urlfile=url.getFile(); if(urlfile.endsWith("/")) urlfile+="indexindex"; File file=new File(host_path,urlfile); File file_dir=new File(file.getParent()); if(!file_dir.exists()) file_dir.mkdirs(); MonitorHolder.getMonitor().print(id+"开始准备下载"+url.toString()+"\n"); try { //打开链接 URLConnection conn=url.openConnection(); //超时30秒 conn.setConnectTimeout(30000); conn.setDoOutput(true); //不是HTML不下载 /*String type=conn.getContentType(); if( (type==null)|| (!type.equals("text/html")) ) return;*/ //将网页内容的缓冲区清空 contentbuilder.setLength(0); in=new InputStreamReader(conn.getInputStream(),charset); out=new OutputStreamWriter(new FileOutputStream(file),charset); int len; //读取网页内容,并写入文件,保存到网页内容缓冲里面 while((len=in.read(buf, 0, 10240)) &gt;0) { out.write(buf, 0, len); //append可以减小系统损耗 contentbuilder.append(buf, 0, len); } out.flush(); //将网页内容缓冲区的内容读到content中,用于分析 content=null; content=contentbuilder.toString(); } catch (IOException e) { MonitorHolder.getMonitor().print("错误!!!"+id+"下载页面"+url.toString()+"错误\n"); } finally{ try { if(in!=null) in.close(); if(out!=null) out.close(); } catch (IOException e) { } in=null; out=null; } } public Crawler(String id,CrawlerController controller,URLMap urlmap) { this.id=id; this.controller=controller; this.urlmap=urlmap; this.charset="utf-8"; canceled=false; MonitorHolder.getMonitor().print(id+"就绪\n"); } //设置字符集,通过正则表达式获取字符集格式 //为了性能,该功能并未使用 private void setCharset() { Matcher matcher=charset_pattern.matcher(content); String CHARSET="GB2312"; if(matcher.find()) CHARSET=matcher.group(1).trim(); this.charset=CHARSET; try { content=new String(content.getBytes("GB2312"),CHARSET); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //从网页内容中分析超链接 private List&lt;string&gt; retrieveLinks(URL url) { List&lt;string&gt; urls=new LinkedList&lt;string&gt;(); if(content==null) return urls; Matcher matcher=link_pattern.matcher(content); String link; String host_reg="http://"+host; String host_nowww; if(host.contains("www")) host_nowww=host.substring(host.lastIndexOf("w")+2); else { host_nowww=host; } while(matcher.find()) { //通过抓取第1组的内容 link=matcher.group(2).trim().toLowerCase(); if (link.length() &lt; 1) { continue; } //网页内部链接,忽略 if (link.charAt(0) == '#') { continue; } //发送邮件链接,忽略 if (link.indexOf("mailto:") != -1) { continue; } if (link.toLowerCase().indexOf("javascript") != -1) { continue; } //分析绝对地址或相对地址 if (link.indexOf("://") == -1){ if (link.charAt(0) == '/') //处理绝对地址 link = "http://" + host+ link; else if(link.startsWith("./")) link="http://" + host+ link.substring(1); else { String file = url.getFile(); String file_path=file.substring(0, file.lastIndexOf('/')); while(link.startsWith("../")) { link=link.substring(link.indexOf("/")+1); file_path=file_path.substring(0, file_path.lastIndexOf("/")); } link="http://"+host+file_path+"/"+link; } } int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, index); } if(!urlmap.testHost(link)) continue; if(!urlmap.testLimit(link)) continue; urls.add(link); } return urls; } //设置主机并建立目录 private void setHost(String host) { this.host=host; this.host_path=root_path+"\\"+host; File host_dir=new File(host_path); if(!host_dir.exists()) host_dir.mkdirs(); } @Override public void run() { if(!root_dir.exists()) root_dir.mkdirs(); while(!Thread.currentThread().isInterrupted() &amp;&amp; !canceled &amp;&amp; (controller.getCount()&lt;controller.gettotal()) )="" {="" try="" {="" 获得一个待抓取的url,如果没有可用url,则进入阻塞状态,该方法调用是线程安全的="" string="" urlstring="urlmap.getURL();" monitorholder.getmonitor().print(id+"开始抓取"+urlstring+"\n");="" 建立url="" url="" url="new" url(urlstring);="" 设置主机="" sethost(url.gethost());="" 清空网页内容,并下贼="" content="null;" download(url);="" 未下载到内容="" if(content="=null)" {="" continue;="" }="" monitorholder.getmonitor().print(id+"抓取"+urlstring+"完毕,进行解析\n");="" setcharset();="" 分析超链接="" list&lt;string=""&gt; urls=retrieveLinks(url); //将分析到的超连接加入到待抓取的URL队列中,并将成功抓取数+1 urlmap.addAll(urls); controller.count(); MonitorHolder.getMonitor().print(id+"解析"+urlstring+"完毕,共计"+urls.size()+"个超链接,开始新任务\n"); content=null; TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { MonitorHolder.getMonitor().print(id+"被中断\n"); canceled=true; } catch (MalformedURLException e) { MonitorHolder.getMonitor().print(id+"报告:URL格式错误\n"); }catch (Exception e) { e.printStackTrace(); } } } //退出,由控制器调用,关闭所有底层I/O资源 public void cancel() { try { if(in!=null) in.close(); } catch (IOException e) { } try { if(out!=null) out.close(); } catch (IOException e) { e.printStackTrace(); } MonitorHolder.getMonitor().print(id+"停止工作\n"); canceled=true; } } </pre> <p> </p> <pre name="code" class="java">package com.wood.core; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.*; import java.util.*; public class URLMap { //待抓取的URL队列 private LinkedList&lt;string&gt; URLQueue; //缓存解析出来的URL,使用Hash方便快速查找,&lt;k,false&gt;表示未抓取,&lt;k,true&gt;表示抓取结束 private HashMap&lt;string,boolean&gt; cachedURL; private HashSet&lt;string&gt; hosts; private HashSet&lt;string&gt; format_limit; //默认构造器,初始化队列,集合 private URLMap() { URLQueue=new LinkedList&lt;string&gt;(); cachedURL=new HashMap&lt;string,boolean&gt;(50000); hosts=new HashSet&lt;string&gt;(20); format_limit=new HashSet&lt;string&gt;(20); } public URLMap(List&lt;string&gt; seeds) { this(); for(String s:seeds) cachedURL.put(s, false); URLQueue.addAll(seeds); for (String string : seeds) { try { URL test=new URL(string); String host=test.getHost(); hosts.add(host); } catch (MalformedURLException e) { e.printStackTrace(); } } } public URLMap(String seed) { this(); cachedURL.put(seed, false); URLQueue.add(seed); try { URL test=new URL(seed); hosts.add(test.getHost()); } catch (MalformedURLException e) { e.printStackTrace(); } } //将解析出来的URL添加到URLMap中,如果有重复则忽略,URL有效性由外部保证,该方法是线程安全的 public synchronized void addURL(String url) throws InterruptedException { //如果该URL已存在,忽略该URL if(cachedURL.keySet().contains(url)) return; cachedURL.put(url, false); URLQueue.add(url); //有可用URL,唤醒所有阻塞线程 notifyAll(); } //将解析出来的URL添加到URLMap中,如果有重复则忽略,URL有效性由外部保证,该方法是同步的 public synchronized void addAll(List&lt;string&gt; urls) throws InterruptedException { for (String url : urls) { if(cachedURL.keySet().contains(url)) continue; cachedURL.put(url,false); URLQueue.add(url); } notifyAll(); } //从当前URL队列中获取一个URL,如果当前队列无可用URL,则该线程进入阻塞状态 public synchronized String getURL() throws InterruptedException { //该处进入阻塞 while(URLQueue.size()==0) wait(); //将其从队列中删除 String url=URLQueue.remove(); cachedURL.put(url, true); return url; } public boolean testHost(String host) { for(String host_allow:hosts) { if(host.contains(host_allow)) return true; } return false; } public void addHost(List&lt;string&gt; l) { hosts.addAll(l); } public void addLimit(List&lt;string&gt; l) { format_limit.addAll(l); } public boolean testLimit(String url) { if(format_limit.size()==0) return true; else { for(String s:format_limit) if(url.contains(s)) return true; } return false; } //将待抓取队列打乱 private int swap_check=0; public synchronized void shuffle() { swap_check++; int size=URLQueue.size(); if(size&lt;1000) { java.util.Collections.shuffle(URLQueue); swap_check=0; } else { if(size&gt;=1000 &amp;&amp; size&lt;5000) { if(swap_check==5) { java.util.Collections.shuffle(URLQueue); swap_check=0; } } else { if(swap_check==15) { java.util.Collections.shuffle(URLQueue); swap_check=0; } } } } } </pre> <p><br /><br />附件里是内存使用情况<br /><strong>问题补充</strong><br />主要占用内存的是char[] <br />我的策略是所有分析到的有效URL都存储在HashMap中 <br />但是几万个URL不至于占用大多数内存吧? <br />我的工作线程只有5个,设置的多了,一会就崩了 <br /><br />哪位高人路过,帮我看眼吧 <br />祝你新年好运~</p> <p> </p> <p>附件里是内存占用,缓存的URL总数是20000个,一个大概占用80B,程序内存总数是150MB</p> <p>我不知道到底是什么东西不停的吃内存,回收不掉,程序运行的时间越长,线程数越多,内存吃的越快</p>
C++书上例题运行出现问题
我是用vs2013调试运行的 ``` #include <iostream> using namespace std; class Student { private: int num; int score; public: void setdata() { cin >> num; cin >> score; } void display() { cout << "num : " << num << endl; cout << "score = " << score << endl; } }; Student stud1, stud2; int main() { stud1.setdata(); stud2.setdata(); //老是运行到这里就自动跳过了 stud1.display(); stud2.display(); //这两条语句能正常输出,第一个输出正常,第二个输出都是0 cin.get(); cin.get(); //两个cin.get()在程序中也不起作用了 return 0; } ``` 初学C++请教各位大神,注释中的问题是怎么回事,怎么解决。 2017-7-12 找了几天问题,终于弄懂了,当时我输入数据时,给"score"输入的是98.5,是个浮点数,而"score"是int型,由此产生了“意想不到”的结果。 后又发现,不管是用cin语句输入,还是用scanf_s语句输入,都是同样的运行结果,会莫名其妙跳过。 随后把后面修改成了 ``` printf_s("%d\n", cin.get()); printf_s("%d\n", cin.get()); printf_s("%d\n", cin.get()); cin.get(); ``` 运行结果是 ![图片说明](https://img-ask.csdn.net/upload/201707/12/1499854541_145753.jpg) 可以看到最后的三个cin.get()接收了几个莫名的东西。 后来查资料又看到“当cin尝试将输入的double型数字读为int型数据失败后,会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据,输入流必须处于无错误状态。”推测是在我输入浮点数给int型变量后,cin或者scanf_s使缓冲区出了些问题。 由此,我改动了下setdata()函数: ``` void setdata() { cin.clear(); //想用它清空缓冲区 cin >>num; cin >>score; } ``` 运行后发现并不能解决跳过问题。 查资料,又改了下: ``` void setdata() { cin.clear(); cin.sync(); //不理解为什么一定要加这个 scanf_s("%d", &num); scanf_s("%d", &score); } ``` 这样修改后,才没有跳过,保证了正常的输入。 其实很简单,输入的数据类型不符导致的错误,输对就好了,以上都是钻牛角尖TT 之所以采纳下面那位大大的回答,不是说完全解决了问题,而是给了思路,非常感谢所有回答的热心的人。
Linux下将静态库编译成动态库的问题
使用JNI技术时,需要将第三方提供的静态库编译成动态库,在编译过程中遇到问题,使用gcc进行编译链接: gcc -I/home/jichenxiao/java/jdk1.8.0_11/include -I/home/jichenxiao/java/jdk1.8.0_11/include/linux -fPIC -shared -o libAir.so AirConditioner.c -L. -Wl,--whole-archive -lBLNetwork-linux-64 -Wl,--no-whole-archive -lpthread -lrt -lm 其中/home/jichenxiao/java/jdk1.8.0_11/include和/home/jichenxiao/java/jdk1.8.0_11/include/linux为jni.h和jni_md.h的路径,libAir.so为输出的动态库,AirConditioner.c为要一起编译的c程序,-lBLNetwork-linux-64为要编译成动态库的静态库文件libBLNetwork-linux-64.a。编译时报的错误为: /usr/bin/ld: ./libBLNetwork-linux-64.a(aes.o): relocation R_X86_64_32S against `.bss' can not be used when making a shared object; recompile with -fPIC ./libBLNetwork-linux-64.a(aes.o): error adding symbols: Bad value collect2: error: ld returned 1 exit status 我不懂编译原理,请教大家,希望大家能给出解决方案,谢谢!
如何写一个完整的java视频播放器?诚望高手们指点!
高手们,你们好。我在网上搜了几个java视频播放器的代码,带是均不能正常运行。我不知道是怎么回事,我想请教下你们,同时如果你们有完整的java视频播放器代码,能否提供一份?望指导! 我的代码为: package com.bird.jmf; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; import javax.media.*; // 视频播放程序 public class VideoPlayDemo extends JFrame { private Player player; // 播放器对象 private Component visualMedia; // 视频显示组件 private Component mediaControl; // 视频播放控制组件 private Container container; // 主容器 private File mediaFile; //媒体文件 private URL fileURL; //媒体文件URL地址 public VideoPlayDemo() { // 构造函数 super("视频播放程序"); //调用父类构造函数 container = getContentPane(); //得到窗口容器 JToolBar toobar = new JToolBar(); //实例化工具栏 JButton openFile = new JButton("打开媒体文件"); //实例化按钮 toobar.add(openFile); //增加按钮到工具栏 JButton openURL = new JButton("打开网络地址"); toobar.add(openURL); container.add(toobar, BorderLayout.NORTH); //设置工具栏 openFile.addActionListener(new ActionListener() { //打开文件按钮事件处理 public void actionPerformed(ActionEvent event) { JFileChooser fileChooser = new JFileChooser(); //实例化文件选择器 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);//设置文件打开模式为仅打开文件 int result = fileChooser.showOpenDialog(VideoPlayDemo.this);//显示对话框 if (result == JFileChooser.APPROVE_OPTION) { //得到用户行为 mediaFile = fileChooser.getSelectedFile(); //得到选择的文件 } if (mediaFile != null) { try { fileURL = mediaFile.toURL(); //得到文件的URL地址 } catch (MalformedURLException ex) { ex.printStackTrace(); //输出错误信息 showMessage("打开错误"); //显示错误信息 } startPlayer(fileURL.toString()); //开始播放打开的文件 } } }); openURL.addActionListener(new ActionListener() { //打开URL按钮事件处理 public void actionPerformed(ActionEvent event) { String addressName =JOptionPane.showInputDialog(VideoPlayDemo.this, "输入URL地址"); if (addressName != null) startPlayer(addressName); //开始播放打开的URL } }); Manager.setHint(Manager.LIGHTWEIGHT_RENDERER, Boolean.TRUE); setSize(300, 200); //设置窗口大小 setVisible(true); //设置窗口为可视 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序 } //初始化播放器 public void startPlayer(String mediaLocation) { if (player != null) //如果播放器非空则移去先前的播放器组件 if (visualMedia != null) container.remove(visualMedia); //如果对象visualMedia非空则移去 if (mediaControl != null) { container.remove(mediaControl); //如果对象mediaControl非空则移去 player.close(); //关闭播放器 } MediaLocator mediaLocator = new MediaLocator(mediaLocation); //媒体定位器 if (mediaLocator == null) { showMessage("打开文件错误"); //显示错误信息 return; } try { player = Manager.createPlayer(mediaLocator); //得到播放器实例 player.addControllerListener(new PlayerEventHandler()); //增加播放控制器 player.realize(); } catch (Exception ex) { ex.printStackTrace(); showMessage("打开错误"); //显示错误信息 } } //取得媒体组件 //Download by http://www.codefans.net public void getMediaComponents() { visualMedia = player.getVisualComponent(); //取得视频显示组件 //如果对象visualMedia非空则加入到窗口内容窗格 if (visualMedia != null) { container.add(visualMedia, BorderLayout.CENTER); pack(); } mediaControl = player.getControlPanelComponent(); //取得播放控制组件 //如果对象visualMedia非空则加入到窗口内容窗格 if (mediaControl != null) container.add(mediaControl, BorderLayout.SOUTH); } //播放器事件处理 private class PlayerEventHandler extends ControllerAdapter { public void realizeComplete(RealizeCompleteEvent realizeDoneEvent) { player.prefetch(); //预取媒体数据 } //完成预取媒体数据后,开始播放媒体 public void prefetchComplete(PrefetchCompleteEvent prefetchDoneEvent) { getMediaComponents(); validate(); player.start(); //开始播放媒体 } //如果媒体播放完毕,重新设置媒体时间并停止媒体播放器 public void endOfMedia(EndOfMediaEvent mediaEndEvent) { player.setMediaTime(new Time(0)); //重新设置媒体时间 player.stop(); // 停止媒体播放 } } public void showMessage(String s) { JOptionPane.showMessageDialog(this, s); //显示提示信息 } public static void main(String args[]) { new VideoPlayDemo(); } }
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
程序员,职场上请远离这种人!
对有些职场人来讲,甩锅就是一种生存手段。01.从大学打篮球说起上大学的时候喜欢打篮球,然后我又特别喜欢抢篮板,经常是跳起来的时候没事,落下来的时候偶尔会踩到别人的脚上,于...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
一个读研让我损失了一百万的真实故事
关注我!只要10分钟,包你学会数据分析 毕业后,应该就业还是考研? 我刚出国留学那会儿,就惊讶的发现,外国local95%都不会选择读研 他们说,硕士学费很贵,时间宝贵,老板不认,所以很费 当几乎所有人都是本科学历时,硕士学历反而像个异类 在老板眼里,三年硕士远远不如3年的工作经验实用 他们甚至专门为拒绝高学历者发明了一个词,叫overoccupie...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
杭漂程序员2019的心路历程,还不起助学贷款,交不起房租,披荆斩棘终雨过天晴
一个杭漂2019的心酸历程,一路披荆斩棘终于还是雨过天晴。
我采访了同事,让他掏出了每天都会浏览的干货网站
前言只有光头才能变强。文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y在周六的晚上,我日常去到公司写文章。想写...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问