随笔 - 15  文章 - 5  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

  • 1. re: 2011年9月26日[未登录]
  • 我不是吹嘘,为什么1,2,3,4,5,7,9,10,11,12我都知道一点????
    看来我估计可以过电面啊~_~
  • --ZJ
  • 2. re: 2011年9月26日
  • 有计划的人生会很精彩。。
  • --Cheap glueless lace front wigs
  • 3. re: 2011年9月26日
  • (14)举个例子说明你学习能力比较强,
    牛!

    那个腾讯就是做QQ的吧,QQ里面还内嵌个木马,有事没事的扫描下用户磁盘,唉,公司技术就这鸟水平,还对应聘者提那么多要求。
  • --Chipset
  • 4. re: 2011年9月26日
  • 问这么多问题,要求不低啊,呵呵,要回答好需要很扎实的基础
  • --LoveBeyond
  • 5. re: 2011年9月26日
  • 这些问题我十有八九答不上来...惭愧啊
  • --pezy

阅读排行榜

评论排行榜

人都是有惰性的,
该篇文章转自于中国心理网

一般学习和工作生活中,我们都可能有这样的经验,就是当说想要作某件事情的时候,但过了好久发现还是没有作;或者觉得有力气使不出来;或者总觉得生活是灰色和抑郁的等等

这类情况反应在生活中,就是生活好象总是被一种惰性缠绕,知道那不好,但又不知道从何处入手来改变。

从心理学操作性反应的原则为基础,对于人类的行为方式进行观察后,心理学家提出这样一种改进方式,以纠正惰性生活方式,并由这种惰性生活方式的结束而带来整个人生的良性改变。

你如果有兴趣坚持尝试一周以下方式,你会发现你整个人会很不同了,如果能继续坚持,那惰性生活方式就会永远不敢再接近你,而你将在人生获得你愿意的成就

先可以
用一天到两天时间给自己作一个行为记录,把你通常每天要作的事情记下来,这包括记录你所有的生活活动。这样你即使粗粗的记,大约也会有几十件。

然后把其中一些如果吃饭等必须完成的事情剔除

在此之后,你把剩余下来的几十件事情按照你的兴趣排列,把你最不喜欢作的事情放在第一位,把你最喜欢作的事情放在最后一位。

最后,你就可以在以后一周内进行行动了,每天一早起来,从你最不喜欢的事情开始作起,并且坚持作完第一件事情,再作第二件事情……这么一直作到最后一件你喜欢的事情。

在整个过程中,你开始会稍觉得困难,但你只要花很少的力气稍稍坚持,你就能顺利进行下去。千万在中途不要跳跃那个先作不喜欢的再作喜欢的计划

这种方式是一种强化作用的方式,先一件困难的事情完成后,再作稍困难的事情,那是一种对于前面行动的强化,然后继续,强化的效果会越来越大,一直大到你觉得你有力量来完成任何事情。

对于改变惰性生活方式,这种方式具有很大的效果。而对于经常抑郁心情的人,这种生活方式将直接改变表现为抑郁的行为,而很容易的使抑郁的情绪结束,而只要坚持,抑郁的生活方式就会永远结束。

通过结束惰性或抑郁的行为,而结束惰性或抑郁的心理。

如果你试试,你将发现这是多么有趣的事情。
posted @ 2011-09-26 23:48 mengkai 阅读(221) | 评论 (0)编辑 收藏
今天也是也是一个比较特殊的日子吧,接到了第一次电话面试通知,无奈这几天感冒状态是相当不好,特别是今天头晕脑胀,口腔溃疡,上火气泡,外加咳嗽难忍。那真是难受。在吃饭的时候接到了腾讯深圳那边的电视面试通知,问我什么时候方便,方便的话要电话面试我,我告知8点左右有时间,如果今天不面试就明天这个时间,我就回到宿舍开机等着,然后等到8点心情有点激动,毕竟是第一次电话面试嘛,强忍难受的感冒,在电脑旁边等,但是等到九点10分也没有接到电话,于是上床睡觉,刚睡了不到10分钟电话响起,开始面试,
面试的问题都是很基础的,首先自我介绍,这个部分做的不太好,介绍的比较少,那边比较吃惊说,“啊就这些,那你介绍一些大学的生活”,之后就是技术方面的,
(1)对C/C++语言熟悉吗?平时开发都用它吗?
(2)熟悉STL编程嘛?用的多吗?然后你介绍一下容器的定义,说出几种容器,如何让你设计容器,栈是如何实现的
(3)区别一下STL中vector和list之间的区别,还问了其他一些适配器。
(4)map的原理,熟悉那些STL中的几种排序,你对sort,qsort内部是如何实现的研究过嘛?
(5)对于排序中快速排序和堆排序之间区别,各自的特点。
(6)然后对于多线程的开发问了一些
(7)关于函数调用约定,几种,各自的特点,应用的地方。
(8)关于网络编程的内容,写过网络编程方面的项目吗?介绍一下
(9)对于操作系统方面的,临界区,死锁,等等
(10)c++为何没有虚构造函数,多态如何实现的,关于虚函数的使用
(11)问了关于内存方面的知识,堆,栈内存,常量,全局变量,局部变量,内存结构的有个研究嘛?深入了解吗?
(12)对于atoi,如果让你实现该函数的功能,你如何实现,应该注意些什么问题。
(13)你本科是网络工程,问一些网络方面的知识,
(14)举个例子说明你学习能力比较强,
睡了一觉起来写了一下,感觉面试的一般吧,过几天可能会有其他面试或者通知实习。
最后总结一些,基础的知识需要经常回顾,电话面试需要注意的细节,要善于总结,从这次的电话面试中吸取教训,为以后更多的电话面试做好准备,

转载(某个博客的):

4 每天睡觉前坚持做三件事

    1. 今天都干了些什么,那些与课题实验有关,用科学而简练的语言描述出来,记录下来,自认为失败的实验也要认真对待,并找出原因。

    2. 想好并安排好明天要做的实验,千万不要到了明天再准备。

    3. 前两件事做不好,不要睡觉。

就这样,坚持做,一定会进步很快的。

posted @ 2011-09-26 23:46 mengkai 阅读(1845) | 评论 (5)编辑 收藏

消息处理过程:
1消息定义:
消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作就是已经写好的代码,成为消息处理函数。
为何要引进消息映射。一个程序往往拥有多个窗体,主窗口就算一个,其他菜单工具栏等等子窗口,那需要写多少个switchcase语句,所以MFC采用了消息映射机制,利用一个数组,将窗口消息和相对应的消息处理函数进行映射,可以理解成这个是一个表,该机制叫消息映射
AFX_MSGMAP可以得到基类的消息映射入口地址和得到本身的消息映射入口地址。
2消息种类:
(1)windows消息,主要包含WM_开头的消息,WM_COMMAND消息除外,由窗口和视图处理,此类消息带有确定如何处理消息的参数。
(2)控件通知,此类消息包含从控件和其他子窗口发送到其父窗口的WM_COMMAND通知消息,
(3)命令消息,包含了用户界面对象发出的WM_COMMAND通知消息,
其中windows消息和控件通知消息由窗口来处理,CFrameWnd,CMDIFrameWnd,CMDIChildWnd,CView,CDialog
命令消息更广的是对象处理
形式如下:ON_COMMAND(id,memberFxn);
对于通知消息,例如树形控件是ON_CONTROL(EN_CHANGE,id,memberFxn);
3消息处理过程
MFC消息处理过程如下:
(1)_AfxCbtFilterHook()截获消息(这个是一个钩子函数);
(2)_AfxCbtFilterHook()把窗口过程设定为AfxWndProc();
(3)函数AfxWndProc()接收windows操作系统的发送的消息。
(4)函数AfxWndProc()调用函数AfxCallWndProc()进行消息处理;
(5)函数AfxCallWndProc()调用CWnd类的方法WindowProc进行消息处理。
4添加用户自定义消息处理函数
第一步,定义消息,#define WM_MYMESSAGE (WM_USER+100)
第二步,实现消息处理函数,该函数使用WPRAM和LPARAM参数,并返回LPRESULT
LPRESULT CMainFrame::OnMyMessage(WPARAM wParam,LPARAM lParam)
{
 return 0;
}
第三步:在类头文件中的FX_MSG块中说明消息处理函数
形式如下
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam)
第四步。在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)
可以看出来,用户定义的消息和通过classwizard添加的消息一样。
5windows消息循环机制
windows消息函数
从消息队列中取出消息
在MSDN中PeekMessage的定义
BOOL PeekMessage
The PeekMessage function checks a thread message queue for a message and places the message (if any) in the specified structure.

BOOL PeekMessage(
  LPMSG lpMsg,         // pointer to structure for message
  HWND hWnd,           // handle to window
  UINT wMsgFilterMin,  // first message
  UINT wMsgFilterMax,  // last message
  UINT wRemoveMsg      // removal flags
);
从线程消息队列中取出一个消息
GetMessage
The GetMessage function retrieves a message from the calling thread's message queue and places it in the specified structure. This function can retrieve both messages associated with a specified window and thread messages posted via the PostThreadMessage function. The function retrieves messages that lie within a specified range of message values. GetMessage does not retrieve messages for windows that belong to other threads or applications.

BOOL GetMessage(
  LPMSG lpMsg,         // address of structure with message
  HWND hWnd,           // handle of window
  UINT wMsgFilterMin,  // first message
  UINT wMsgFilterMax   // last message
);

如果把2,3,4设置为null或者0,表示接受本程序的所有消息
还要注意上面两者的区别,
都是比较基础的东西,

posted @ 2011-09-25 10:43 mengkai 阅读(288) | 评论 (0)编辑 收藏
 穷举(枚举)算法,又称是暴力破解法,也是我接触最多的理解比较全面深刻的一个算法。 
穷举算法就是一一列出所有可能的元素,用题目已知的条件验证每个结果,看是否满足。
枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:
1)可预先确定候选答案的数量;
2)候选答案的范围在求解之前必须有一个确定的集合。
一般应用在规模比较小的问题上,因为穷举算法一般都是循环和条件判断来实现的,当循环比较多的时候可能,时间复杂性和空间复杂性都很大。
举几个例子来看看:
委派任务
 某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
 1)A和B两人中至少去一人;
 2)A和D不能一起去;
 3)A、E和F三人中要派两人去;
 4)B和C都去或都不去;
 5)C和D两人中去一个;
 6)若D不去,则E也不去。
 问应当让哪几个人去?
我们可以根据已知信息得到一些限制性的条件,假设能去执行任务的代表是1,而不能去执行任务的是0,
A+B >1 :表示A,B至少一人要去
A+D != 2:表示AD不能同时去
A+E+F == 2:表示三者中派两人去
B+C == 0 & B+C == 2:表示BC要么都去,要么都不去
C+D == 1:表示CD只能有一人去,
D+E == 0 & D==1表示:D不去的话,则E也不去,D去的话,E随便,
核心算法
nt a,b,c,d,e,f;
 for(a=1;a>=0;a--) /*穷举每个人是否去的所有情况*/
 for(b=1;b>=0;b--) /*1:去 0:不去*/
 for(c=1;c>=0;c--)
 for(d=1;d>=0;d--)
 for(e=1;e>=0;e--)
 for(f=1;f>=0;f--)
 if(a+b>=1&&a+d!=2&&a+e+f==2
 &&(b+c==0||b+c==2)&&c+d==1
 &&(d+e==0||d==1))
 {
 printf("A will%s be assigned. \n",a?"":"not");
 printf("B will%s be assigned. \n",b?"":"not");
 printf("C will%s be assigned. \n",c?"":"not");
 printf("D will%s be assigned. \n",d?"":"not");
 printf("E will%s be assigned. \n",e?"":"not");
 printf("F will%s be assigned. \n",f?"":"not");
 }
一个比较有代表性的问题就是填写运算符的游戏
5 5 5 5 5 =5 
由于算术表达式的特殊性,在编程求解这个算式时,需要注意以下几点:
(1)当填入除号时,要求右侧的数不能为0
(2)乘除的运算级别比加减高。       
代码如下:
    int j,i[5]; //循环变量 ,数组i用来表示4个运算符
    int sign;//累加运算时的符号  
    int result; //保存运算式的结果值
    int count=0; //计数器,统计符合条件的方案
    int num[6];  //保存操作数
    float left,right; //保存中间结果
    char oper[5]={' ','+','-','*','/'}; //运算符
    printf("请输入5个数:");
    for(j=1;j<=5;j++)
        scanf("%d",&num[j]);
    printf("请输入结果:");
    scanf("%d",&result);
    for(i[1]=1;i[1]<=4;i[1]++)//循环4种运算符,1表示+,2表示-,3表示*,4表示/
    {
        if((i[1]<4) || (num[2]!=0))//运算符若是/,则第二个运算数不能为0
        {
            for(i[2]=1;i[2]<=4;i[2]++)
            {
                if((i[2]<4) || (num[3]!=0))
                {
                    for(i[3]=1;i[3]<=4;i[3]++)
                    {
                        if((i[3]<4) || num[4]!=0)
                        {
                            for(i[4]=1;i[4]<=4;i[4]++)
                            {
                                if((i[4]<4) || (num[5]!=0))
                                {
                                    left=0;
                                    right=num[1];
                                    sign=1;
                                    for(j=1;j<=4;j++)
                                    {
                                        switch(oper[i[j]])
                                        {
                                            case '+':
                                                 left=left+sign*right;
                                                 sign=1;
                                                 right=num[j+1];
                                                 break;
                                            case '-':
                                                 left=left+sign*right;
                                                 sign=-1;
                                                 right=num[j+1];
                                                 break;//通过f=-1实现减法
                                            case '*':
                                                 right=right*num[j+1];
                                                 break;//实现乘法
                                            case '/':
                                                 right=right/num[j+1];//实现除法
                                                 break;
                                        }
                                    }
                                    if(left+sign*right==result)
                                    {
                                        count++;
                                        printf("%3d:",count);
                                        for(j=1;j<=4;j++)
                                            printf("%d%c",num[j],oper[i[j]]);
                                        printf("%d=%d\n",num[5],result);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if(count==0)
        printf("没有符合要求的方法!\n");    

posted @ 2011-09-25 10:22 mengkai 阅读(924) | 评论 (0)编辑 收藏
首先我们在MSDN看一下printf的原型和sprintf的原型

int printf( const char *format [, argument]... );

int sprintf( char *buffer, const char *format [, argument] ... );
从定义来看两者的功能其实很相似的。
如果你接触的控制台的程序较多的话,见到printf的比较多,printf函数打印结果到屏幕上,而sprintf函数可以完成其他数据类型转换为字符串。
从以下几点来说明一下
(1)函数的中前两个参数是固定外,可选参数是任意个,buffer是存放字符串指针或者数组名字,fromat是格式化字符串,只要是printf使用的格式化字符串,在sprintf都可以使用,格式化字符串是该函数的精髓。
(2)首先可以把一个整型数据格式化为字符串。比如:char str[20];int i_arg = 12345;sprintf(buf,"%-6d",i_arg);
(3)看一个浮点类型的例子。比如:char str[20];double d_arg = 3.1415926;sprintf(str,"%6.2f",d_arg);
可以控制精度
(4)连接两个字符串,也可以将多个字符串连接起来,%m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。%m.n在浮点数中,m也表示宽度,n表示小数的位数。比如:char dest[256];char src1[] = {'a','b','c','d','e'};
char src2[] ={'1','2','3','4'};sprintf(dest,"%.5s%.4s",src1,src2);也可以动态的截取字符串的某一些字符,char dest[256];char src1[] = {'a','b','c','d','e'};
char src2[] ={'1','2','3','4'};sprintf(dest,"%.*s%.*s",2,src1,3,src2);也可以窃取浮点类型的有效位sprintf(str,"%*.*",10,4,d_arg);
补充一点,sprintf的返回值就是字符串的字符的个数,也就是strlen(str)的结果,
也可以打印某个参数的地址
int i=2;
sprintf(str,"%0*x",sizeof(void *),&i);或者用sprintf(str,"%p",&i);

此外这些都是都是多字节类型(ANSI)的函数,而对于unicode类型的应该使用的相似的函数:

int wprintf( const wchar_t *format [, argument]... );

 

int swprintf( wchar_t *buffer, const wchar_t *format [, argument] ... );

用法和上面的很相似的,就是类型不同而已,
对于printf和sprintf该函数的包含在<stdio.h>头文件
而sprintf和wprintf函数包含在<stdio.h>或者<wchar.h>头文件中。

posted @ 2011-09-24 22:14 mengkai 阅读(4027) | 评论 (0)编辑 收藏
仅列出标题
共2页: 1 2