??xml version="1.0" encoding="utf-8" standalone="yes"?>精品国产福利久久久,久久久国产99久久国产一,久久久婷婷五月亚洲97号色 http://www.shnenglu.com/Cunch/category/15970.html不惜奋斗zh-cnSat, 13 Jul 2013 15:53:19 GMTSat, 13 Jul 2013 15:53:19 GMT60Qt反射http://www.shnenglu.com/Cunch/archive/2013/07/13/201779.htmlCunchCunchSat, 13 Jul 2013 14:19:00 GMThttp://www.shnenglu.com/Cunch/archive/2013/07/13/201779.htmlhttp://www.shnenglu.com/Cunch/comments/201779.htmlhttp://www.shnenglu.com/Cunch/archive/2013/07/13/201779.html#Feedback0http://www.shnenglu.com/Cunch/comments/commentRss/201779.htmlhttp://www.shnenglu.com/Cunch/services/trackbacks/201779.html?/strong>

本文主要讲解Qt是如何实现反,以及一点点反射使用的小心得?/p>

文章概览

Qt反射内幕窥

详细内容

反射前期准备

得到注册的类成员变量

得到注册的类成员函数

讉KcL员属性(get,setQ?/p>

调用注册的函?/p>

反射应用

ȝ

Qt反射内幕窥

Qt反射机制是基于moc(meta object compiler)实现?在这里多插一句(可以说Qt所有C++没有的特性,几乎都和q个有关p)。但是需要注意的是Qt提供的反式基本的反,不支持类的反,q个与JavaQC#q是有差别的?/p>

moc讲解

通常C++的编译过Eؓ

预处?>~译->链接->q行

Qt~译的过E中Q有一个moc的过E?在Qt工程构徏q程中的qmake其实是q这个事的。moc->预处?>~译->链接->q行?/p>

在mocq程中,需要处理的事情如下Q?/p>

1?识别一些特D的宏Q_OBJECT、Q_PROPERTY、Q_INVOKABLE。。? 如果到q些关键字,Qt自然׃ȝ成对应的moc文g?/p>

2?slotQsignal自然也是如此?/p>

3?uidesignerQ同样也是在q个阶段处理?

详细内容

 

反射前期准备

1?首先得承于Q_Object,同时需要在class中加入Q_OBJECTQ但是Q_Object的构造函数默认是U有的不让ѝ?

在类中直接用Q_GADGET也可以实现反,。。。据说只能实现部分功能,目前我只实现到能遍历成员属性,函数Q但是不能访问其中的倹{?

q个q程其实是定义QMetaObject的过E,具体见Qt源码

2?注册cL员变量需要用Q_PROPERTY

Q_PROPERTY( type member READ get WRITE set) 其中READ,WRITE是关键字

Type表示成员的类型(不支持自定义cdQ对Qt很多基本cd都支持);

Member代表你给该成员另外v的名字,可以和变量名不同QgetQset是自己在C++函数里面定义的基本的讉K函数名,不需要写参数。直接上代码Q?

3?注册cL员函?

如果你希望这个函数能够被反射Q那么很单,只需要在cȝ函数声明前加入Q_INVOKABLE关键字?

例如Q_INVOKABLE int func( QString flag );

   #include <QObject>
   class MyClass : public QObject
   {
    Q_OBJECT
    Q_PROPERTY(int Member1 READ Member1 WRITE setMember1 )
    Q_PROPERTY(int Member2 READ Member2 WRITE setMember2 )
    Q_PROPERTY(QString MEMBER3 READ Member3 WRITE setMember3 )
   public:
    explicit MyClass(QObject *parent = 0);
   signals:
   public slots:
   public:
    Q_INVOKABLE int Member1();
    Q_INVOKABLE int Member2();
    Q_INVOKABLE QString Member3();
    Q_INVOKABLE void setMember1( int mem1 );
    Q_INVOKABLE void setMember2( int mem2 );
    Q_INVOKABLE void setMember3( const QString& mem3 );
    Q_INVOKABLE int func( QString flag );
   private:
    int m_member1;
    int m_member2;
    QString m_member3;
   };

得到注册的类成员变量

  MyClass theObj;
 const QMetaObject* metaObj = theObj.metaObject();
 //1.遍历cȝ属?/span>
 int propertyCnt = metaObj->propertyCount();
 for ( int i = 0; i < propertyCnt; ++ i )
 {
 QMetaProperty oneProperty = metaObj->property( i );
 cout << " name: " << oneProperty.name();
 cout << " type: " << QVariant::typeToName( oneProperty.type()) << "\n";
  }

主要思\是得到其元对象Q得到其元属性,然后p得到你需要的信息Q具体的讉K函数有name,type,需要注意的是得到的type是枚丑ր|q在Qt提供了typeToName的函敎ͼ你可以得到想要的Q例如不是空z的2Q而是”int”Q?/p>

得到注册的类成员函数

//2.遍历cȝ函数成员
 int methodCnt = metaObj->methodCount();
 for ( int idx = 0; idx < methodCnt; ++ idx )
 {
 QMetaMethod oneMethod = metaObj->method( idx );
 cout << "--------begin-------" << "\n";
 cout << " typeName: " << oneMethod.typeName() << "\n";
 cout << " signature: " << oneMethod.signature() << "\n";
 cout << " methodType: " << oneMethod.methodType() << "\n";
 cout << "--------end---------" << "\n";
  }

和遍历类属性一_其实是Ҏ(gu)元对象,得到元函?

其中typeName代表q回cdQsignature只的是函数的原貌QmethodType代表函数的类型,在Qt中分Zc(槽,信号Q普通函敎ͼ?/p>

讉KcL员属性(get,setQ?/strong>

//3.使用反射
 cout << "-------test property-----------" << "\n";
 MyClass newObj;
 newObj.setProperty("Member1", 66);
 cout << newObj.property( "Member1" ).toString().toStdString() << "\n";
 cout << newObj.Member1() << "\n";
 cout << "--------end----------" << "\n";

在这里用的是QObject的property() 和setPropertyҎ(gu)Q来讉K成员信息。但是对于用Q_GADGET宏的c,是不能用这个方法的Q还在寻找解x法,基本思\当然是重写?/p>

调用注册的函?/strong>

  int ret;
  MyClass newObj;
 newObj.setMember1( 20 );
 newObj.setMember2( 50 );
 QMetaObject::invokeMethod( &newObj, "func", Qt::DirectConnection,
 Q_RETURN_ARG(int, ret ),
 Q_ARG(QString, "+"));

//普通函数的调用

在MyClass中,我们定义了int func( QString flag );q个函数Q利用反的调用方式如上Q主要是理解invokeMethod的用法,其中Qt::DirectConnection是函数的执行方式Q分为(异步和同步)QQ_RETURN_ARG是返回参敎ͼQ_ARG是传入参敎ͼ需要按函数声明中参数的序依次传入QQt最多支?个参敎ͼ对于一般的应用没有问题。还有疑问,L步具见Qt强大的帮助文档?/p>

反射的应?/strong>

反射反射Q就我目前的认知水^来看Q通过使用字符Ԍ来实现函数的通用化调用,例如你可以利用反把很多函数攄到数l中Q实Cơ遍历,全部调用?/p>

目前我见到的大多是利用反来操作数据库,例如hibernateQ其实可以利用Qt的反,快速实现所谓的hibernate,(最q自q立实C一套,很方??/p>

ȝ

q篇文章主要讲了如何使用Qt来实现反,在实用角度上来讲Q我们不需要了解Qt是怎么实现反射的,对于怎么用上面说的很清楚了。大家有什么的新的xQ希望能提出来,来电(sh)请咨?br /> <levard@gmail.com>



Cunch 2013-07-13 22:19 发表评论
]]>
[面试?]如何实现不能被承的C++的类Q且能正怋?/title><link>http://www.shnenglu.com/Cunch/archive/2013/06/15/201015.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Fri, 14 Jun 2013 16:18:00 GMT</pubDate><guid>http://www.shnenglu.com/Cunch/archive/2013/06/15/201015.html</guid><wfw:comment>http://www.shnenglu.com/Cunch/comments/201015.html</wfw:comment><comments>http://www.shnenglu.com/Cunch/archive/2013/06/15/201015.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/Cunch/comments/commentRss/201015.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Cunch/services/trackbacks/201015.html</trackback:ping><description><![CDATA[<p> </p> <p>貌似好久没有自己写过blog了,对于自己q样一个健忘的人,文采又这么差的h来说Q正好借这个机会锻g下自q文字能力Q同时记录下学过的东ѝ?/p> <p>貌似用过C++也好久了Q碰到这个问题,开始确实感觉到无力Q最后还是搜索了下别人是怎么做的。据说是Adobe 07q的面试题?/p> <p> </p> <p>1、第一x大家都是Q既然不能被l承Q也是一旦承这个类之后Q类׃能被初始化?/p> <p>2、可能把cȝ构造函数私有化Q和单例有点像,但是q样cd不能正常使用了?/p> <p>3、实在无力,查了下,他们是通过使用虚承解册个问题的?/p> <p>对于虚承,具体资料见:<a >http://blog.163.com/xiangzaihui@126/blog/static/166955749201182294317243/</a></p> <p>里面有一句话很重要:<font color="#ff0000">C++规定:把真正创建对象时所指定的类UCؓ是最zc?虚基cd对象是由最zcȝ构造函数通过调用虚基cȝ构造函数进行初始化?</font></p> <p><font color="#ff0000"></font> </p> <p>具体实现代码如下Q?/p> <div class="ptpdttj" id="codeSnippetWrapper"> <div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1"> 1:</span> <span style="color: #cc6633">#include</span> <cstdio></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2"> 2:</span> <span style="color: #cc6633">#include</span> <iostream></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3"> 3:</span>  </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4"> 4:</span> <span style="color: #0000ff">template</span><<span style="color: #0000ff">class</span> T> <span style="color: #0000ff">class</span> CFinal{</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5"> 5:</span> <span style="color: #0000ff">friend</span> T;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6"> 6:</span> <span style="color: #0000ff">private</span>:</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7"> 7:</span> CFinal(){ std::cout << <span style="color: #006080">"CFinal()"</span> << std::endl; }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8"> 8:</span> ~CFinal(){} </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9"> 9:</span> };</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10"> 10:</span>  </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11"> 11:</span> <span style="color: #0000ff">class</span> CFoo : <span style="color: #0000ff">virtual</span> <span style="color: #0000ff">public</span> CFinal<CFoo>{</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12"> 12:</span> <span style="color: #0000ff">public</span>:</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13"> 13:</span> CFoo(){ std::cout << <span style="color: #006080">"CFoo()"</span> << std::endl; }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14"> 14:</span> ~CFoo(){}</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15"> 15:</span> };</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum16"> 16:</span>  </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum17"> 17:</span> <span style="color: #0000ff">class</span> CBar : <span style="color: #0000ff">public</span> CFoo{</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum18"> 18:</span> <span style="color: #0000ff">public</span>:</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum19"> 19:</span> CBar() { std::cout << <span style="color: #006080">"CBar"</span> << std::endl; }</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum20"> 20:</span> };</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum21"> 21:</span>  </pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum22"> 22:</span> <span style="color: #0000ff">int</span> main()</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum23"> 23:</span> {</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum24"> 24:</span> <span style="color: #008000">//CBar bar;</span></pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum25"> 25:</span> CFoo foo;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum26"> 26:</span> <span style="color: #0000ff">while</span>(1){}</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum27"> 27:</span> <span style="color: #0000ff">return</span> 0;</pre><!--CRLF--><pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum28"> 28:</span> }</pre><!--CRLF--></div></div> <p>当你创徏CBarӞ需要初始化CFinalQ但是你不是他的friendQ不能初始化Q上面标U)</p> <p>如果你会问不要virtual行不行?<br />    不行Q由于不要virtualQ你可以l过CFoo的friend讉K到CFinalQ但是有virtual׃同了Q你必须直接初始化CFinalQ这是C++的规定,避免多次初始化)</p> <p> </p> <p>但是有个问题Qgcc不能~译通过Q在friend T出错Qvs2010没有问题Q希望知道的能给点帮助?/p> <p> </p> <p>参考文献:</p> <p><a >http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/</a>QC++实现不能被承的c)</p><img src ="http://www.shnenglu.com/Cunch/aggbug/201015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Cunch/" target="_blank">Cunch</a> 2013-06-15 00:18 <a href="http://www.shnenglu.com/Cunch/archive/2013/06/15/201015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>曄?D资料的网址http://www.shnenglu.com/Cunch/archive/2013/01/09/197147.htmlCunchCunchWed, 09 Jan 2013 04:25:00 GMThttp://www.shnenglu.com/Cunch/archive/2013/01/09/197147.htmlhttp://www.shnenglu.com/Cunch/comments/197147.htmlhttp://www.shnenglu.com/Cunch/archive/2013/01/09/197147.html#Feedback0http://www.shnenglu.com/Cunch/comments/commentRss/197147.htmlhttp://www.shnenglu.com/Cunch/services/trackbacks/197147.htmlhttp://blog.csdn.net/trcj1/article/details/6163753

http://blog.sina.com.cn/s/blog_5e6fd4290100nhxa.html 

http://www.shnenglu.com/richardhe/archive/2008/03.html

http://www.cnitblog.com/linghuye/archive/2007/06/24/29007.html

3D游戏资料  http://www.shnenglu.com/flyindark/archive/2011/05/01/145475.aspx 

OGRE http://blog.sina.com.cn/s/articlelist_1159765812_1_1.html

http://www.shnenglu.com/lovedday/  3D知识

http://www.shnenglu.com/lai3d/ 

http://multi-crash.com/

http://www.shnenglu.com/billhsu/

 

|络~程

http://www.shnenglu.com/Solstice/archive/2011/04/17/144378.html



Cunch 2013-01-09 12:25 发表评论
]]>
一道简单的面食题来自CSDNhttp://www.shnenglu.com/Cunch/archive/2011/08/20/153983.htmlCunchCunchSat, 20 Aug 2011 13:49:00 GMThttp://www.shnenglu.com/Cunch/archive/2011/08/20/153983.htmlhttp://www.shnenglu.com/Cunch/comments/153983.htmlhttp://www.shnenglu.com/Cunch/archive/2011/08/20/153983.html#Feedback9http://www.shnenglu.com/Cunch/comments/commentRss/153983.htmlhttp://www.shnenglu.com/Cunch/services/trackbacks/153983.html求较?yu)的|不能?比较q算W?if-else ?: while for 内嵌汇编 递归 W三方函?br />int Min(int a, int b)
{
  //write code here
}

原网址Q?a title="http://topic.csdn.net/u/20110816/19/3194c61c-fc4d-41ad-8357-9110d8cdc6b0.html" >http://topic.csdn.net/u/20110816/19/3194c61c-fc4d-41ad-8357-9110d8cdc6b0.html

 

 

 

下面是我的解{,以及我搜集的解答Q以及我的解{?

需要声明的是没有考虑溢出的情况,对于a-b溢出的问题,都{?4位的Q?

 

#include <cstdio>
#include <assert.h>

int Min(int x, int y)
{
    int tmp = (x - y) * (((x - y) >> (sizeof(int) * 8 - 1)) | 1);
    return ((x + y) - tmp) / 2;
}

int Min2(int x, int y)
{
    int min[2] = {y, x};
    int sign = ((x - y) >> (sizeof(int) * 8 - 1)) & 1;
    return min[sign];
}

int Min3(int a, int b)
{
    int sum = a + b;
    b = a - b;
    a += b * (b >> (sizeof(int) * 8 - 1));
    return sum - a;
}

int Min4(int a, int b)
{
    int sign = ((unsigned int)(a - b)) >>31;
    return a * sign + b * (1 - sign);
}

int Min5(int a, int b)
{
    return (&b)[(a-b)>>31];
}

int main()
{
    int x, y;

//   assert(Min3(0x80000000, 0x7fffffff) == 0x80000000);
    while(scanf("%d%d", &x, &y) != EOF)
    {
        printf("the minimal is %d\n", Min5(x, y));
    }
    return 0;
}
q有大家是怎么~排代码的啊Q给我推荐个插g

 

有必要对Min5 介绍下,来自CSND

int min(int a, int b)
{
  return (&b)[a-b>>31];
}
在windowspȝ上完?br />&b获得b在堆栈上的指针,a-b>>31的结果只能是-1或?
当a大于b?(a-b>>31) = 0, 此时函数q回(&b)[0] = b,
当a于b?(a-b>>31) = -1, 此时函数q回(&b)[-1]=aQ?br />Z?&b)[-1]会是aQ?br />函数在调用前会将参数压入堆栈Q?br />int m = min(55,33);
00E6142E push 21h -> b = 33
00E61430 push 37h -> a = 55
00E61432 call min (0E610F5h)  
在调用min函数的时候,参数按从叛_左的序压入堆栈Q?nbsp;
堆栈是段q箋内存Q在windows下堆栈地址是从高到低,
也就是先pushq入的参C占用高内存地址Q?br />b先被pushQ所以b占用高内存地址Q?br />a被后push,a占用紧连着b的低内存地址Q?br />+ &b 0x0030fd80 int *
+ &a 0x0030fd7c int *
奇的是Q我们知?(&b)[0]q回的是b本n的|
?&b)[-1]q回的却是a 的|也就是说(&b)[-1]q回了上四个字节的|
(&b)[-1] = *(&b - 1) = a;Q这里b是int型,所?1相当于将地址向后偏移4个字节)



Cunch 2011-08-20 21:49 发表评论
]]>
一个清华老师的一番话Q感觉写得很?/title><link>http://www.shnenglu.com/Cunch/archive/2011/08/07/152735.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Sun, 07 Aug 2011 14:09:00 GMT</pubDate><guid>http://www.shnenglu.com/Cunch/archive/2011/08/07/152735.html</guid><wfw:comment>http://www.shnenglu.com/Cunch/comments/152735.html</wfw:comment><comments>http://www.shnenglu.com/Cunch/archive/2011/08/07/152735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Cunch/comments/commentRss/152735.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Cunch/services/trackbacks/152735.html</trackback:ping><description><![CDATA[<div><p> <span style="font-size: 14.0pt;">一双鞋Q耐克?癑֤Q李宁的4癑֤Q特步的3癑֤Q?61?癑֤Q所以,你毕业于一个什么样的大学很重要?/span> <br /> <span style="font-size: 14.0pt;">  一双鞋Q在地摊不过几十元,C商场、专卖店Q会涨到一癄臛_百。所以,你呆在什么地方很重要?/span> <br /> <span style="font-size: 14.0pt;">  一双鞋Q只有合脚ƈ且合意了才能卖出厅R所以,沟通了解很重要?/span> <br /> <span style="font-size: 14.0pt;">  一双鞋Q少了一只,是不值钱的。所以,另一半很重要?/span> <br /> <span style="font-size: 14.0pt;">  一双鞋Q样式老的Q大多很便宜。所以,更新自己的知识很重要?/span> <br /> <span style="font-size: 14.0pt;">  一双鞋Q积压多q_只能打折处理。所以,到合适的q婚吧?/span> <br /> <span style="font-size: 14.0pt;">  一双鞋Q?有h3?q如新的Q有ZCq穿烂的。所以,有个好上司很重要</span> <br /> <span style="font-size: 14.0pt;">  q是个现实的C会Q感情不能当饭吃QI夫ȝ事哀。不要相信电(sh)影里的故事情节,那只是个供许多陌生h喧嚣情感的场所。只有不理智和不现实的h才相?/span> <br /> <span style="font-size: 14.0pt;">  l自己定目标Q一q_两年Q五q_也许你出生不如别人好Q通过努力Q往往可以改变70%的命q。破|子破摔只能和懦弱做朋友?/span> <br /> <span style="font-size: 14.0pt;">     1, 一个hQ如果你不D׃把,你根本不知道自己有多优秀?nbsp; </span> <br /> <span style="font-size: 14.0pt;">     2?赚钱是一U能力,花钱是一U水qI能力可以l,水^是轻易练不出来的?/span> <br /> <span style="font-size: 14.0pt;">     3、年Mh不可以太狂?/span> <br /> <span style="font-size: 14.0pt;">     4、一个h的知识,通过学习可以得到Q一个h的成长,必须通过练?/span> <br /> <span style="font-size: 14.0pt;">     5、这个世界上好书很多Q可以改变命q的书很?/span> <br /> <span style="font-size: 14.0pt;">     6、这个世界上朋友很多Q可以用一生托付的朋友很少?/span> <br /> <span style="font-size: 14.0pt;">     7、如果发C个hQ一个地方,一件事Q一本书Q可以改变你的命q。一定要惛_法跟他发生关p,否则Q他p你没关系?/span> <br /> <span style="font-size: 14.0pt;">     8、当一个h没有成功的时候,装也装出成功的样子。(因ؓ装的时候,他已l成Z性格的一部分Q?/span> <br /> <span style="font-size: 14.0pt;">     9、我们学习的目的Q是Z使用Q不是知识没有用Q而是你没有用,说明你没有用?/span> <br /> <span style="font-size: 14.0pt;">    10、别人对你的态度Q决定了你的命运?</span> <br /> <span style="font-size: 14.0pt;">    11、笑由心生?/span> <br /> <span style="font-size: 14.0pt;">    12、一个h出门的时候,口袋里都装的钱,装钱的目的,是Z花出去,那里舒服往那里花。一个h让别服,他就是一个经营者;别h让你舒服Q他是一个消费者?/span> <br /> <span style="font-size: 14.0pt;">    13、一个hQ敢听真话,需要勇气;一个h敢说真话Q需要魄力?</span> <br /> <span style="font-size: 14.0pt;">    14、因Z的存在,让别人快乐v来,你叫朋友Q因Z的存在,让别人卓v来,你是教练Q因Z的存在,让别人强大v来,你是领导?/span> <br /> <span style="font-size: 14.0pt;">    15、一件事情,对你伤害的程度与事情本生没有M关系Q取决于你对qg事的态度?/span> <br /> <span style="font-size: 14.0pt;">    16 、你Q简单了Q你的世界就单了Q你Q简单了Q事情就单了?</span> <br /> <span style="font-size: 14.0pt;">    17、一件事Q会q了Q好好干Q不会干了,乱干。干的次数多了,自然会干Q但是,首先Q你要干?/span> <br /> <span style="font-size: 14.0pt;">    18、一个hQ想要优UQ你必须要接受挑战;一个hQ你惌快优秀Q就要去L挑战?/span> <br /> <span style="font-size: 14.0pt;">    19、一个h惌创业Q先要学会打工?/span> <br /> <span style="font-size: 14.0pt;">    20、世界上Q成功的有两UhQ一Uh是傻子,一Uh是疯子。傻子是会吃亏的人,疯子是会行动的h?/span></p><p> <br /> <span style="font-size: 14.0pt;">1?“太漂亮的女h最后L孤单一人,因ؓ她不肯向爱情妥协Q太帅气的男人最后L落在不太漂亮的女人手上,因為他向生活妥协。因此太漂亮的女人和太帅气的?人L无法长久一LQ因Z们都习惯被围l被取?zhn)。太漂亮的女人,是堪折的花,早遇到好Q太帅气的男人,是待熟的果,最好不要太早遇上?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;">2?#8220;时候,希望自己快点长大Q长大了Q却发现遗失了童q_单nӞ慕恋h的甜蜜,恋爱Ӟ怀念单w的自由。很多事物,没有得到时总觉得美好,得到之后才开始明白:“我们在得到的同时也在失去?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ有得有失,淡然面对 </span> <br /> <br /> <span style="font-size: 14.0pt;">3?#8220;在爱的世界里Q没有谁对不赯Q只有谁不懂得珍惜谁?能够说出的委屈便不算委屈Q能够抢走的׃h便不爱人?不说出委屈就只能委屈自己Q不放走不爱你的人就得不到爱你的人?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ在泪的时候觉得委屈,其实心里已经慢慢学会坚强 </span> <br /> <br /> <span style="font-size: 14.0pt;">4?“人生的\上,我们都在奔跑Q我们d赶超一些hQ也d被一些h越。h生的要义Q一是欣赏沿途的风景Q二是抵Nq的l点Qh生的U诀Q寻找一U最?合自q速度Q莫因疾q而不堪重P莫因q缓而空耗生命;人生的快乐,在于走自q路,看自q景,越他h不得意,他h越不失志?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ在l望Ӟ要抬头看看天Q想惛_在的意义 </span> <br /> <br /> <span style="font-size: 14.0pt;">5?#8220;有一天,友情和爱情碰见。爱情问友情Q世上有我了Qؓ什么还要有你的存在Q友情笑着_爱情会让Z泪Q而友情的存在是帮h们擦q眼泪!”</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ打心眼里重视朋友,哪怕不联系Q不多言Q其实也会很依赖 </span> <br /> <br /> <span style="font-size: 14.0pt;">6?#8220;我很׃Q却不知道该如何靠近你,所以觉得离开也是可以的。ƈ没有什么不同,l果反正都是q样Q是好是坏都不重要,重要的是我曾l迷恋你Q就像我qh一把晚清的雕花椅?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ安妮的话L让h在感到温暖的同时有一丝心痛,爱是一门要耗费一生去学习、经营的学问 </span> <br /> <br /> <span style="font-size: 14.0pt;">7?#8220;我想l你q福Q却Cq你的世界。我想用我的全世界来换取一张通往你的世界的入场券Q不q,那只不过是我的一厢情愿而已。我的世界,你不在乎Q你的世界,我被驱逐。我真的喜欢你,闭上|以ؓ我能忘记Q但下的泪Q却没有骗到自己?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ答应自己,要独自承受这一?</span> <br /> <br /> <span style="font-size: 14.0pt;">8?“不要让幸擦肩而过Q最懂你的hQL会一直在w边守护你,不让你有一丝的委屈Q真正爱你的人,也许不会说许多爱你的话,却会做许多爱你的事。如果发?w边有这L人,请你好好珍惜……q福不会时时{着你,׃的h和你qZ是随时可以出玎ͼ好好把握Q不要让自己和幸擦肩而过”</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ期待懂我的?</span> <br /> <br /> <span style="font-size: 14.0pt;">9?#8220;人生最最不能逊色的风景应该是努力。努力是人生的一U精状态,是对生命的一U赤子之情。努力是拥有之母Q拥有是努力之子Q一心努力可谓条条大路通罗马。所以,与其规定自己一定要成ؓ一个什么样的h物,获得什么东西,不如练自己做一个努力的人?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ早p明白Q最的不是成功的那一刻,而是事后回想奋斗q程中的艰辛 </span> <br /> <br /> <span style="font-size: 14.0pt;">10?#8220;人生Q没有永q的伤痛Q没有过不去的坎。还是让我们学学杨柳Q看似柔弱却坚韧Q狂风吹不断Q太刚强的树qԌ却在风中折枝。学会放弃,学会承受Q学会坚强,学会微笑Q那是一U别L丽Q适当的放弃,是h生优雅的转n?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;color: #ff0000;">psQ没有过不去的坎Q让自己跨越的姿势美一?</span> <br /> <br /> <span style="font-size: 14.0pt;">      1、靠山山会倒,靠hZ跑,只有自己最可靠?br />  <br />  2、没有h陪你C辈子Q所以你要适应孤独Q没有h会帮你一辈子Q所以你要奋斗一生?br />  <br />  3、与其用泪水(zhn)恨今天Q不如用汗水拼搏今天?br />  <br />  4、当眼泪尽的时候,留下的应该是坚强?br />  <br />  5、h生就像一杯没有加p的咖啡Q喝h是苦涩的Q回呌v来却有久久不会退ȝ余香?br />  <br />  6、有一U缘Q放手后成ؓ风景Q有一颗心Q坚持中方现真诚?br />  <br />  7、选择自己所qQ爱自己所选择的?br />  <br />  8、这一U不攑ּQ下一U就会有希望?br />  <br />  9、曾l拥有的不要忘记Q难以得到的更要珍惜Q属于自q不要攑ּQ不属于自己的不要强求,已经失去的留作回忆?br />  <br />  10、喜Ƣ就该珍惜,珍惜别攑ּ?br />  <br />  11、h生就是一场旅行,不在乎目的地Q在乎的是沿途的风景以及看风景的心情?br />  <br />  12、不求与人相比,但求越自己Q要哭就哭出Ȁ动的泪水Q要W就W出成长的性格?br />  <br />  13、ؓ你的难过而快乐的是敌人,Z的快乐而快乐的是朋友,Z的难q而难q的才是你的知己?br />  <br />  14、如果爱Q请qQ如不爱Q请d?br />  <br />  15。只要心中有希望存在Q就有幸存在?br />  <br />  W一?#8220;人都是逼出来的”。每个h都是有潜能的Q生于安乐,M忧?zhn)Q所以,当面对压力的时候,不要焦燥Q也许这只是生活对你的一点小考验Q相信自己,一切都能处理好Q逼急了好汉可以上梁山,时世造英雄,I则思变Qh只有压力才会有动力?br />  <br />  W二句:“如果你简单,q个世界对你简?#8221;。简单生zL能幸生z,知怹Q宽容大度,什么事情都不能想繁杂,心灵的负荷重了,׃怨天忧h。要定期的对记忆q行一ơ删除,把不愉快的h和事从记忆中摈弃?br />  <br />  W三句:“人生没有彩排Q每一天都是现场直?#8221;。偶会惻I如果人生真如一场电(sh)子游戏,玩坏了可以选择重来Q生zM变成什么样子?正因为时光流逝一M复返Q每一天都不可q回Q所以更要珍惜每一寸光_孝敬父母、疼爱孩子、体贴爱人、善待朋友?br />  <br />  W四句:“怀才就象怀孕,旉久了才会让h看出?#8221;。hQ切莫自以ؓ是,地球d了谁都会转,古往今来Q恃才放肆的人都没有好下场。所以,即便再能qԌ也一定要保持谦虚谨慎Q做好自q事情Q是金子M发光?br />  <br />   W五句:“q去酒逢知已千杯少Q现在酒逢千杯知已少”。不甚酒力,体会不了酒的味Q但却能感受知已的妙处。没有朋友的人生是孤独的Q不完整的,可是Q?因ؓ生活的忙,渐渐了联络Q友谊就变的淡了Q所以,抽点旉Q联l朋友一赯聊天Q让情谊在笑C升腾Q当朋友遇到了难题的时候,一定要记得n?出,即便帮不了忙Q安C是最大的支持?br />  <br />  W六句:“人生如果错了方向Q停止就是进?#8221;。hQL很难Ҏ(gu)自己的缺点,人,也L 很难发现自己的错误。有Ӟ明知错了Q却ƲŞ不能Q一错再错,把握正确的方向,坚守自己的原则,世界上的诱惑很多Q天上永q不会掉馅饼Q不要因图一?的快乐而付出惨痛的代h(hun)Q如果发现错了,一定要止步?br />  <br />  W七句:“人生两大(zhn)剧Q一是万念俱灎ͼ一是踌w满?#8221;。现代的人好象特?脆弱Q报U怸天天报道众多名h得抑郁症Q这些h一定是从一个极端走向别一个极端。正因ؓt躇满志Q才坚信自已是完的Q是无所不能的,如果受到一Ҏ(gu)折, ׃变得极度自卑Q甚臛_ȝl生zȝ勇气。ؓ自己找一个准的定位Qn受生zM吧?br />  <br />  W八句:“人生和爱情一P错过了爱情就错过了h?#8221;。爱情是什么?让h无所适从Q让人神颠倒,面对爱情的时候,勇敢一点,大胆说出自己的爱Q有花堪摘直LQ莫待无q折枝。hQM生老病死,怎么q都是一生,错过了爱情就错过了生命的_ֽ?br />  <br />  W九(ji)句:“天下有钱人终成眷?#8221;。现代社会的人变得越来越势利Q爱情也来无重,于是我不得不怿“天下有钱人终成眷?#8221;是对C爱情的最切的描q?br />  <br />  W十句:“要成功,需要朋友,要取得巨大的成功Q需要敌?#8221;。有竞争才有发展Q因为有了敌人的存在Q因为有了不服输的决心,才会努力地做好自q事。所以,有时候,敌h比朋友的力量更大Q天下没有永q的敌hQ却有永q的朋友Q有些时候,敌h也可以变成朋友?</span> <br /> <br /> <br /> <br /> <span style="font-size: 14.0pt;">1.也许愈是丽愈是脆弱,像盛夏的沫?/span></p><p> <br /> <span style="font-size: 14.0pt;">2.  “如果׃可以让你q福Q那么我q你;如果不爱你可以让你幸,那么我就只是喜欢你?#8221; </span> <br /> <span style="font-size: 14.0pt;"> “?#8212;—你的q福呢?” </span> <br /> <span style="font-size: 14.0pt;"> “我的q福Q就是看着你幸?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;">3. 如果一开始,你就不要出现在我的面前,那么Q我也许׃会知道幸的滋味。你何其D忍Q把所 有的爱满满地那么卒不及防地都l了我,告诉我,你永q喜Ƣ我 爱我Q永q不会离开我,让我错以 为,我可以幸得象个被宠溺的孩子Q让我错以ؓQ只要抱住你Q就可以拥有整个世界?/span> <br /> <br /> <span style="font-size: 14.0pt;">4.“你会喜欢我多久?” </span> <br /> <span style="font-size: 14.0pt;"> “永远?#8221; </span> <br /> <span style="font-size: 14.0pt;"> “即你已l不爱我了,即你已l忘记我了,即你已l从q个世界消失。我依然会爱着你?#8221; </span> <br /> <span style="font-size: 14.0pt;"> “pQ都不在q个世界上了Q还怎么爱我Q?#8221; </span> <br /> <span style="font-size: 14.0pt;"> “我会L一个天使,让它替我来爱你?#8221;</span> <br /> <br /> <span style="font-size: 14.0pt;">5.如果失去了你的爱Q我在这世界上,p失去了灵的I壳Q再也找不到家?/span> <br /> <br /> <span style="font-size: 14.0pt;">6.当你在我w边快乐Ӟq福在我w边Q当我听CW声Ӟq福已经在我w边?</span> <br /> <br /> <span style="font-size: 14.0pt;">7. 习惯了Y弱,心也会逐渐软弱hQ习惯了依赖Q会渐渐忘记如何依靠自己。一旦眼泪失L力, 一旦陷入孤立无援的境地Q如果变得Y׃Q该怎样M护n边的亲h和自己? </span> <br /> <br /> <span style="font-size: 14.0pt;">8.我很想你Q却不想见你?</span> <br /> <br /> <span style="font-size: 14.0pt;">9.如果一开始你没有告诉我,你永q喜Ƣ我Q永q不会离开我,只要׃你,可以拥有整个世界?</span> <br /> <br /> <span style="font-size: 14.0pt;">10.那一q_是谁三天三夜不眠不休U下满塘药Q是谁抱着14支粉U色的荷p他喜Ƣ我Q是谁说会 永远保护我、让我开心。难道,你一开始就是在骗我Q请你不要再来伤xQ我会难q,心像被撕 一栗如果你q喜Ƣ我Q请你珍惜我。如果你不喜Ƣ我Q我会离开你?/span> <br /> <br /> <br /> <span style="font-size: 14.0pt;">12.不喜Ƣ又能怎样Q心里有数就可以了。不可能要求世上所有h都是你的朋友Q都是关׃的h。珍 惜对你好的hQ其他的Q就随她们去吧! </span> <br /> <br /> <span style="font-size: 14.0pt;">13.既然对世人宣布了我们的恋情,我们是一对了Q永不分手,不离不弃?</span> <br /> <br /> <span style="font-size: 14.0pt;">14.上天不会只永q眷一个hQ给她多大的q运Q日后必会给她多大的难。她能做到的只是把握住 q福的时机,凭借它努力地冲上最大可能的峰。所以,l不可以错过MZ?</span> <br /> <br /> <span style="font-size: 14.0pt;">15.如果你始l没办法׃我,我会l你分手的权利?</span> <br /> <br /> <span style="font-size: 14.0pt;">16.世界上没有什么h是可以真正相信的Q只有相信自己,因ؓ只有自己不会背叛自己Q欺骗自己,d自己?</span> <br /> <br /> <span style="font-size: 14.0pt;">17.我想要靠自己的力量立_q个世界Q有_的媄响力Q有_的钱Q可以守护我惛_护的人,可 以在面对MH如其来的灾难时Q都不会被打倒?</span> <br /> <br /> <br /> <br /> <span style="font-size: 14.0pt;">1.那个在不l意中,也许改变了我一生的男孩。我怿L一天,我们会在世界的屋再ơ相遇?</span> <br /> <span style="font-size: 14.0pt;"> 不要L用过L衡量生活的幸与不q,每个人的生命都是可以l放丽的,只要你珍惜?</span> <br /> <span style="font-size: 14.0pt;"> ——《木吉他的夏天?</span> <br /> <br /> <span style="font-size: 14.0pt;">2.没有人永q十七岁Q但永远有h十七岁?</span> <br /> <span style="font-size: 14.0pt;"> 因ؓ依赖一份只有我记得的回忆,我已l长大。长到可以勇敢的面对人间所有的风风雨雨?</span> <br /> <span style="font-size: 14.0pt;"> ——《来不及学坏?</span> <br /> <br /> <span style="font-size: 14.0pt;">3.我一直喜Ƣ下午的阛_。它让我怿q个世界M事情都会有{机,怿命运的宽厚和好?</span> <br /> <span style="font-size: 14.0pt;"> 我们l归要长大,带着一U无怨的心情(zhn)?zhn)地长大?</span> <br /> <span style="font-size: 14.0pt;"> 归根到底Q成长是一U幸?</span> <br /> <span style="font-size: 14.0pt;"> ——《按旉大?</span> <br /> <br /> <span style="font-size: 14.0pt;">4.喜欢的歌静静地听Q喜Ƣ的q地看?</span> <br /> <span style="font-size: 14.0pt;"> ——《我要我们在一赗?/span> <br /> <br /> <span style="font-size: 14.0pt;">5.其实Qh字的l构是怺的支撑,只要你愿意,谁都可以l谁q福Q?</span> <br /> <span style="font-size: 14.0pt;"> ——《我要我们在一赗?</span> <br /> <br /> <span style="font-size: 14.0pt;">6.我知道无论我走到哪里Q你都会陪在我n辏V陪我哭Q陪我笑Q陪我等待,陪我开花?</span> <br /> <span style="font-size: 14.0pt;"> ——《女生派?</span> <br /> <br /> <span style="font-size: 14.0pt;">7.爱情像糖?我囫囵吞?享受瞬间的甜?</span> <br /> <span style="font-size: 14.0pt;"> Q-《糖衣?</span> <br /> <br /> <span style="font-size: 14.0pt;">8.最痛的痛是原谅Q最黑的黑是背叛 </span> <br /> <span style="font-size: 14.0pt;"> Q-《糖衣-临暗?</span> <br /> <br /> <span style="font-size: 14.0pt;">9.我们都是单翅膀的天使,只有拥抱着才能飞翔?</span> <br /> <span style="font-size: 14.0pt;"> ——《挥着膀的女孩?</span> <br /> <br /> <span style="font-size: 14.0pt;">10.我们生活在同一个温暖的水域Q也许偶会被水草缠l,但因为彼此温暖的呼吸Q相信都不会是死 l。如果我说我׃Q我一直都׃Q不知道你会不会怿Q?/span> <br /> <span style="font-size: 14.0pt;"> ——《双D?</span> <br /> <br /> <span style="font-size: 14.0pt;">11.成长是q样Q痛q快乐着。你得接受这个世界带l你的所有伤宻I然后无所谓惧的长大?</span> <br /> <span style="font-size: 14.0pt;"> ——《双D?/span> <br /> <br /> <span style="font-size: 14.0pt;">12.爱是一场战?我不怕受伤只怕你不快? </span> <br /> <span style="font-size: 14.0pt;"> ——《离׃个ID的距R?</span> <br /> <br /> <span style="font-size: 14.0pt;">13.是别q头?你就感觉不到我的深情? </span> <br /> <span style="font-size: 14.0pt;"> ——《离׃个ID的距R?</span> <br /> <br /> <span style="font-size: 14.0pt;">14.爱情是一场注定的潮水Q而自己就是一叉时等待靠岸的舟。潮来潮去,随L逐流Q蝲沉蝲, 在劫N?</span> <br /> <span style="font-size: 14.0pt;"> ——《离׃个ID的距R?</span> <br /> <br /> <span style="font-size: 14.0pt;">15.在爱情这场戏里L有一个主角和一个配角,累的永远是主角,伤的永远是配角?</span> <br /> <span style="font-size: 14.0pt;"> ——《爱在仙境的日子?</span> <br /> <br /> <span style="font-size: 14.0pt;">16.像流水一栗金钱,CQ美丽,q有爱情Q最后都会像水一栗?</span> <br /> <span style="font-size: 14.0pt;"> ——《爱在仙境的日子?</span> <br /> <br /> <span style="font-size: 14.0pt;">17.我一路狂奔,渴望在拥挤匆忙的人群里找C个和我相似的面孔Q她和我有相似的命运。我可以在 她的w上看到自己命运的参照,何去何从Q不再那么仓皇?</span> <br /> <span style="font-size: 14.0pt;"> ——《小妖的金色城堡?/span> <br /> <br /> <span style="font-size: 14.0pt;">18.我没有月亮?</span> <br /> <span style="font-size: 14.0pt;"> q个月亮是很多h的,但不是我的。温暖遥不可及?</span> <br /> <span style="font-size: 14.0pt;"> ——《校服的裙摆?</span> <br /> <br /> <span style="font-size: 14.0pt;">19.我们是q样苍老的Q从时光的一端辗转到时光的另一端,请别说再见,不需要再见?</span> <br /> <span style="font-size: 14.0pt;"> ——《校服的裙摆?</span> <br /> <br /> <span style="font-size: 14.0pt;">20.甜言蜜语Q说l左耛_?</span> <br /> <span style="font-size: 14.0pt;"> ——《左耟?</span> <br /> <br /> <span style="font-size: 14.0pt;">21.我没有勇气折断我的翅膀Q却也飞不到M地方?</span> <br /> <span style="font-size: 14.0pt;"> ——《左耟?</span> <br /> <br /> <span style="font-size: 14.0pt;">22.我们的爱情染上了埃 {待一场风暴的z礼 </span> <br /> <span style="font-size: 14.0pt;"> ——《左耟?</span> <br /> <br /> <span style="font-size: 14.0pt;">23.有些人,有些?是不是你惛_?q的能忘记? </span> <br /> <span style="font-size: 14.0pt;"> ——《左耟?</span> <br /> <br /> <span style="font-size: 14.0pt;">24.最痛苦的是Q消׃的东西,它就永远的不见了Q永q都不会再回来,却偏q要留下一根细而尖的针Q一直插在你心头Q一直拔不去Q它惌你疼Q你得?</span> <br /> <span style="font-size: 14.0pt;"> ——《左耟?</span> <br /> <br /> <br /> <br /> <br /> <span style="font-size: 14.0pt;">你永q也看不见我最׃的时候,因ؓ我只有在看不见你的时候,才最׃。同P你永q也看不见我最寂寞的时候,因ؓ我只有在你看不见我的时候,我才最寂寞?</span> <br /> <br /> <span style="font-size: 14.0pt;">要理想不要惻I要激情不要矫情。凡事知_?/span></p></div><img src ="http://www.shnenglu.com/Cunch/aggbug/152735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Cunch/" target="_blank">Cunch</a> 2011-08-07 22:09 <a href="http://www.shnenglu.com/Cunch/archive/2011/08/07/152735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对程序员来说最好的发明http://www.shnenglu.com/Cunch/archive/2011/08/04/152447.htmlCunchCunchThu, 04 Aug 2011 08:18:00 GMThttp://www.shnenglu.com/Cunch/archive/2011/08/04/152447.htmlhttp://www.shnenglu.com/Cunch/comments/152447.htmlhttp://www.shnenglu.com/Cunch/archive/2011/08/04/152447.html#Feedback6http://www.shnenglu.com/Cunch/comments/commentRss/152447.htmlhttp://www.shnenglu.com/Cunch/services/trackbacks/152447.html      IT行业Q每个公叔R有自q一份代码规范,为的是大家可以互相更好的交流Q同时对外发布的时候,感觉是一个hq的Q这样很好?/p>

     今天有个人问我,怎么自动生成一个文件头Q其实我早就想了Q就是太懒了Q同事发现Visual assist是可以办到的Q上|一搜发现这个功能真是很强大?/p>

     很多自动生成QFor example 写个win32E序Q开始的那些操作大概得100多行吧,现在告诉你只要几个字母就能搞定了Q太牛g?/p>

    

     那我q门弄斧了Q大牛别拍我?/p>

    W一步:C可以修改snippet的地Ҏ(gu)

image

点击[Edit]Q?q入~辑?

W二步:

image 

在这?你会发现很多~写Q如果用q的化,现在知道它藏那了把,在这里可以根据自q讄来进行添?/p>

注意要写ShortcutQ这个羃写才能v作用?/p>

下面l个win32自动生成的例子吧?/p>

首先Q?/p>

image

在Shortcut中填写win_creatorQ点击运用就好了Q然后OK?/p>

在代码中Q写win_creatorQ后选中下面那个蓝色Q回车就生成了?/p>

image

昄下生成的代码Q写得还很简z啊Q:

image

 

至于其他q用之类的,大家可以参考:

http://www.shnenglu.com/yeduwu/articles/97785.htmlQ?q个有很多关于代码注释的内容?/p>

 

大家有啥更好用法或者东西,希望大家分n下啊?/p>

Cunch 2011-08-04 16:18 发表评论
]]>
一?D的多人在U游戏, 服务?+ 客户?/title><link>http://www.shnenglu.com/Cunch/archive/2011/07/09/150544.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Sat, 09 Jul 2011 08:22:00 GMT</pubDate><guid>http://www.shnenglu.com/Cunch/archive/2011/07/09/150544.html</guid><wfw:comment>http://www.shnenglu.com/Cunch/comments/150544.html</wfw:comment><comments>http://www.shnenglu.com/Cunch/archive/2011/07/09/150544.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.shnenglu.com/Cunch/comments/commentRss/150544.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Cunch/services/trackbacks/150544.html</trackback:ping><description><![CDATA[<blockquote> <p>         最q学院组l了一个实训,要求是利用Socket通信和D3D的知识, 写一个多人在U的游戏Q?服务端是在linux下, 客户是在Windows下; 写这个的目的是想让大家给我找? Ƣ迎大家的意见。我的QQ ?43167101Q希望和大家一赯论?/p></blockquote> <p> </p> <p>服务端(linux下)Q?/p> <p>      服务端用的是非dSelect模型Q下面是目的结构图Q?</p> <p>                    <a href="http://www.shnenglu.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E6%9C%8D%E5%8A%A1%E5%99%A83_4.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="服务?" alt="服务?" src="http://www.shnenglu.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E6%9C%8D%E5%8A%A1%E5%99%A83_thumb_1.jpg" border="0" height="396" width="781" /></a>             </p> <p>     ׃其中有很多的消息Q其ơؓ了扩展,所以用了工厂模式Q我把从客户端接受的消息都放在输入缓冲区中, 向客L发送的消息都放在输出缓冲区中, Z对玩家进行管?/p> <p>设计了一个Manager(单例)来管理玩Ӟ主要是ؓ了实现删除,dQ获取等操作Q?所以就用了STL中Mapq个容器。值得一提的是InputSocketStream是用的一U@环队列的?/p> <p>惌计的?/p> <p><a href="/Files/Cunch/GameServer__2_.zip">服务器端代码</a></p> <p> </p> <p>客户端:</p> <p>客户端由于是在windows中,所以用了Windows的socket通信Q同时用了多线E,其中一个线E主要是Z接受玩家的数据,ȝE主要是Z负责逻辑和渲染?/p> <p>渲染层的l构Q?/p> <blockquote> <p> </p></blockquote> <p><a href="http://www.shnenglu.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%B8%B2%E6%9F%93_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="客户端渲? alt="客户端渲? src="http://www.shnenglu.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%B8%B2%E6%9F%93_thumb.jpg" border="0" height="354" width="779" /></a></p> <p> </p> <p>CUI端,目前做的比较单就是用CEGUIq个重量U的界面库,发现不是那么好用Q太庞大了?/p> <p> </p> <p>通信端:Q主要是负责和服务器的通信Q,包括玩家和虚拟玩家的消息</p> <p> </p> <p><a href="http://www.shnenglu.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E5%AE%A2%E6%88%B7%E7%AB%AF4_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="客户?" alt="客户?" src="http://www.shnenglu.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/%E5%AE%A2%E6%88%B7%E7%AB%AF4_thumb.jpg" border="0" height="255" width="795" /></a></p> <p> </p> <p>想用的需要被指CEGUI 0.7.1</p> <p><a href="/Files/Cunch/NetGameClient.zip">客户端的代码,</a>Q?׃资源文g太大了就不上传了<br /></p> <p>目前q存在的问题是虚拟玩家的同步问题,不知到有高手懂这个问题的吗,提供个思\.</p> <p>我的思\是这LQ比如玩家按下W键,向服务器发送这个消息,服务器负责{发给其他的客LQ该客户端开始走动,知道玩家抬vW键后发送停止的消息l服务器Q服务器负责转发。但是在实现q个问题的时候,׃我用了DiretInputQ但是响应Keydown事gӞ按下W键时QKeydown执行了很多次Q没有找C个办法知道keydownq个事g什么时候停止的。谁有好的做法希望能告诉我?</p><p>下面发个游戏的截图:</p> <p> </p> <p><a href="http://www.shnenglu.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/image_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" alt="image" src="http://www.shnenglu.com/images/cppblog_com/Cunch/Windows-Live-Writer/1f1d3852caa2_D85F/image_thumb.png" border="0" height="513" width="950" /></a></p><img src ="http://www.shnenglu.com/Cunch/aggbug/150544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Cunch/" target="_blank">Cunch</a> 2011-07-09 16:22 <a href="http://www.shnenglu.com/Cunch/archive/2011/07/09/150544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C++ 面试常见问题http://www.shnenglu.com/Cunch/archive/2011/04/12/144038.htmlCunchCunchTue, 12 Apr 2011 07:32:00 GMThttp://www.shnenglu.com/Cunch/archive/2011/04/12/144038.htmlhttp://www.shnenglu.com/Cunch/comments/144038.htmlhttp://www.shnenglu.com/Cunch/archive/2011/04/12/144038.html#Feedback0http://www.shnenglu.com/Cunch/comments/commentRss/144038.htmlhttp://www.shnenglu.com/Cunch/services/trackbacks/144038.html

1.求下面函数的q回|微YQ?br>
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}

假定x = 9999?{案Q?

思\Q将x转化?q制Q看含有?的个数?br>
2. 什么是“引用”Q申明和使用“引用”要注意哪些问题?

{:引用是某个目标变量?span style="COLOR: #0000ff">“别名”(alias)Q?/span>?span style="COLOR: #0000ff">应用的操作与对变量直接操作效果完全相?/span>?span style="COLOR: #0000ff">x一个引用的时候,切记要对其进行初始化
。引用声明完毕后Q相当于目标变量名有两个名称Q即该目标原名称和引用名Q?strong>不能再把该引用名作ؓ其他变量名的别名
。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本w不是一U数据类型,因此引用本n不占存储单元Q系l也不给引用分配存储单元。不能徏立数l的引用?br>
3. ?#8220;引用”作ؓ函数参数有哪些特点?

Q?Q?span style="COLOR: #ff0000">传递引用给函数与传递指针的效果是一L。这Ӟ被调函数的Ş参就成ؓ原来主调函数中的实参变量或对象的一个别名来使用Q所以在被调函数中对形参变量的操作就是对其相应的目标对象Q在主调函数中)的操?/span>?br>
Q?Q?span style="COLOR: #ff0000">引用传递函数的参数Q在内存中ƈ没有产生实参的副?/span>Q它是直接对实参操作Q而?span style="COLOR: #ff0000">一般变量传递函数的参数Q当发生函数调用Ӟ需要给形参分配存储单元QŞ参变量是实参变量的副本;如果传递的是对象,q将调用拯构造函?/span>。因此,当参C递的数据较大Ӟ?strong>引用比用一般变量传递参数的效率和所占空间都?/span>
?br>
Q?Q用指针作为函数的参数虽然也能辑ֈ与用引用的效果Q但是,?strong>被调函数中同栯lŞ参分配存储单元,且需要重复?*指针变量?的Ş式进行运,q很Ҏ(gu)产生错误且程序的阅读性较?/strong>Q另一斚wQ在主调函数的调用点处,必须用变量的地址作ؓ实参。而引用更Ҏ(gu)使用Q更清晰?br>
4. 在什么时候需要?#8220;常引?#8221;Q?/strong> 

如果既要利用引用提高E序的效率,又要保护传递给函数的数据不在函C被改变,应使用常引用。常引用声明方式Qconst cd标识W?&引用?目标变量名;

?

int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确

?

string foo( );
void bar(string & s);

那么下面的表辑ּ是非法的:

bar(foo( ));
bar("hello world");

原因在于foo( )?hello world"串都会生一个时对象,而在C++中,q些临时对象都是constcd的。因此上面的表达式就是试囑ְ一个constcd的对象{换ؓ非constcdQ这是非法的?br>
引用型参数应该在能被定义为const的情况下Q尽量定义ؓconst ?br>
5. ?#8220;引用”作ؓ函数q回值类型的格式、好处和需要遵守的规则?

格式Q类型标识符 &函数名(形参列表及类型说明){ //函数?}

好处Q在内存中不产生被返回值的副本Q(注意Q正是因点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!

注意事项Q?br>
Q?Q不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用成Z"无所?的引用,E序会进入未知状态?br>
Q?Q不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这U情况(q回函数内部new分配内存的引用)Q又面其它?yu)尬局面。例如,被函数返回的引用只是作ؓ一个时变量出玎ͼ而没有被赋予一个实际的变量Q那么这个引用所指向的空_由new分配Q就无法释放Q造成memory leak?br>
Q?Q可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某U业务规则(business ruleQ相兌的时候,其赋值常怸某些其它属性或者对象的状态有养I因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针)Q那么对该属性的单纯赋值就会破坏业务规则的完整性?br>
Q?Q流操作W重载返回值申明ؓ“引用”的作用:

操作符<<?gt;>Q这两个操作W常常希望被q箋使用Q例如:cout << "hello" << endl; 因此q两个操作符的返回值应该是一个仍然支持这两个操作W的引用。可选的其它Ҏ(gu)包括Q返回一个流对象和返回一个流对象指针。但是对于返回一个流对象Q程序必重斎ͼ拯Q构造一个新的流对象Q也是_q箋的两?lt;<操作W实际上是针对不同对象的Q这无法让h接受。对于返回一个流指针则不能连l?lt;<操作W。因此,q回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许q就是C++语言中引入引用这个概늚原因吧。赋值操作符=。这个操作符象流操作W一P是可以连l用的Q例如:x = j = 10;或?x=10)=100;赋值操作符的返回值必L一个左|以便可以被l赋倹{因此引用成了这个操作符的惟一q回值选择?br>
?

Qi nclude <iostream.h>
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10; //以put(0)函数g为左|{h(hun)于vals[0]=10;
put(9)=20; //以put(9)函数g为左|{h(hun)于vals[9]=20;
cout<<vals[0];
cout<<vals[9];
}
int &put(int n)
{
if (n>=0 && n<=9 ) return vals[n];
else { cout<<"subscript error"; return error; }
}

Q?Q在另外的一些操作符中,却千万不能返回引用:+-*/ 四则q算W。它们不能返回引用,Effective C++[1]的Item23详细的讨Zq个问题。主要原因是q四个操作符没有side effectQ因此,它们必须构造一个对象作回|可选的Ҏ(gu)包括Q返回一个对象、返回一个局部变量的引用Q返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作ؓq回值的三个规则Q第2?两个Ҏ(gu)都被否决了。静态对象的引用又因?(a+b) == (c+d))会永qؓtrue而导致错误。所以可选的只剩下返回一个对象了?br>
6. “引用”与多态的关系Q?/span>

引用是除指针外另一个可以生多态效果的手段。这意味着Q一个基cȝ引用可以指向它的zcd例?br>
?

Class A; Class B : Class A{...}; B b; A& ref = b;

7. “引用”与指针的区别是什么?

指针通过某个指针变量指向一个对象后Q对它所指向的变量间接操作?/span>E序中用指针,E序的可L差Q而引用本w就是目标变量的别名Q对引用的操作就是对目标变量的操作?/strong>此外Q就是上面提到的对函Cref和pointer的区别?br>
8. 什么时候需?#8220;引用”Q?/strong>

操作符<<?gt;>赋值操作符=的返回倹{拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用?br>
以上 2-8 参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx

9. l构与联合有和区别?
1. l构和联合都是由多个不同的数据类型成员组? ?/font>在Q何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址I间Q? 而结构的所有成员都存在Q不同成员的存放地址不同Q?
2. 对于联合的不同成员赋? 会对其它成员重? 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的?br>
10. 下面关于“联合”的题目的输出Q?br>
a)
Qinclude <stdio.h>
union
{
int i;
char x[2];
}a;

void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
{案Q?66 (低位低地址Q高位高地址Q内存占用情冉|Ox010AQ?br>
b)

main()
{
union{ /*定义一个联?/
int i;
struct{ /*在联合中定义一个结?/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋?/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first='a'; /*联合中结构成员赋?/
number.half.second='b';
printf("%x\n", number.i);
getch();
}
{案Q?AB (0x41对应'A',是低位;Ox42对应'B',是高位)

6261 (number.i和number.halfq一块地址I间Q?/font>

11. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字W串QstrSrc 是源字符丌Ӏ不调用C++/C 的字W串库函敎ͼL写函?strcpy?br>

{案Q?br>char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘\0’)
return tempptr ;
}

12. 已知Stringcd义如下:

class String
{
public:
String(const char *str = NULL); // 通用构造函?br>String(const String &another); // 拯构造函?br>~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函?br>private:
char *m_data; // 用于保存字符?br>};

试写出cȝ成员函数实现?br>
{案Q?br>
String::String(const char *str)
{
if ( str == NULL ) //strlen在参CؓNULL时会抛异常才会有q步判断
{
m_data = new char[1] ;
m_data[0] = '\0' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}

}

String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}


String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete []m_data; //删除原来的数据,新开一块内?br>m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}


String::~String()
{
delete []m_data ;
}

13. .h头文件中的ifndef/define/endif 的作用?

{:防止该头文g被重复引用?br>
14. Qi nclude<file.h> ?Qi nclude "file.h"的区别?

{:前者是从Standard Library的\径寻扑֒引用file.hQ?strong>后者是从当前工作\径搜dƈ引用file.h
?br>
15.在C++ E序中调用被C ~译器编译后的函敎ͼZ么要加extern “C”Q?/strong>

首先Q作为extern是C/C++语言中表明函数和全局变量作用范围Q可见性)的关键字Q该关键字告诉编译器Q其声明的函数和变量可以在本模块或其它模块中使用?br>
通常Q在模块的头文g中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块BƲ引用该模块A中定义的全局变量和函数时只需包含模块A的头文g卛_。这P模块B中调用模块A中的函数Ӟ在编译阶D,模块B虽然找不到该函数Q但是ƈ不会报错Q它会在q接阶段中从模块A~译生成的目标代码中扑ֈ此函?br>
extern "C"是连接申?linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式~译和连接的,来看看C++中对cMC的函数是怎样~译的:

作ؓ一U面向对象的语言QC++支持函数重蝲Q而过E式语言C则不支持。函数被C++~译后在W号库中的名字与C语言的不同。例如,假设某个函数的原型ؓQ?br>
void foo( int x, int y );
  

该函数被C~译器编译后在符号库中的名字为_fooQ而C++~译器则会生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机Ӟ生成的新名字UCؓ“mangled name”Q?br>
_foo_int_int q样的名字包含了函数名、函数参数数量及cd信息QC++是靠这U机制来实现函数重蝲的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )~译生成的符h不相同的Q后者ؓ_foo_int_float?br>
同样圎ͼC++中的变量除支持局部变量外Q还支持cL员变量和全局变量。用h~写E序的类成员变量可能与全局变量同名Q我们以"."来区分。而本质上Q编译器在进行编译时Q与函数的处理相|也ؓcM的变量取了一个独一无二的名字,q个名字与用L序中同名的全局变量名字不同?br>
未加extern "C"声明时的q接方式

假设在C++中,模块A的头文g如下Q?br>
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif  

在模块B中引用该函数Q?br>
// 模块B实现文g moduleB.cpp
Qi nclude "moduleA.h"
foo(2,3);
  

实际上,在连接阶D,q接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_intq样的符P

加extern "C"声明后的~译和连接方?br>
加extern "C"声明后,模块A的头文g变ؓQ?br>
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif  

在模块B的实现文件中仍然调用foo( 2,3 )Q其l果是:
Q?Q模块A~译生成foo的目标代码时Q没有对其名字进行特D处理,采用了C语言的方式;

Q?Q连接器在ؓ模块B的目标代码寻找foo(2,3)调用ӞL的是未经修改的符号名_foo?br>
如果在模块A中函数声明了foo为extern "C"cdQ而模块B中包含的是extern int foo( int x, int y ) Q则模块B找不到模块A中的函数Q反之亦然?br>
所以,可以用一句话概括extern “C”q个声明的真实目的(M语言中的M语法Ҏ(gu)的诞生都不是随意而ؓ的,来源于真实世界的需求驱动。我们在思考问题时Q不能只停留在这个语a是怎么做的Q还要问一问它Z么要q么做,动机是什么,q样我们可以更深入地理解许多问题Q:实现C++与C及其它语a的؜合编E。  

明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的用技巧:

extern "C"的惯用法

Q?Q在C++中引用C语言中的函数和变量,在包含C语言头文Ӟ假设为cExample.hQ时Q需q行下列处理Q?br>
extern "C"
{
Qi nclude "cExample.h"
}

而在C语言的头文g中,对其外部函数只能指定为externcdQC语言中不支持extern "C"声明Q在.c文g中包含了extern "C"时会出现~译语法错误?br>
C++引用C函数例子工程中包含的三个文g的源代码如下Q?br>
/* c语言头文ӞcExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif


/* c语言实现文gQcExample.c */
Qi nclude "cExample.h"
int add( int x, int y )
{
return x + y;
}


// c++实现文gQ调用addQcppFile.cpp
extern "C"
{
Qi nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}

如果C++调用一个C语言~写?DLLӞ当包?DLL的头文g或声明接口函数时Q应加extern "C" { }?br>
Q?Q在C中引用C++语言中的函数和变量时QC++的头文g需dextern "C"Q但是在C语言中不能直接引用声明了extern "C"的该头文Ӟ应该仅将C文g中将C++中定义的extern "C"函数声明为externcd?br>
C引用C++函数例子工程中包含的三个文g的源代码如下Q?br>
//C++头文?cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif


//C++实现文g cppExample.cpp
Qi nclude "cppExample.h"
int add( int x, int y )
{
return x + y;
}


/* C实现文g cFile.c
/* q样会编译出错:Qi nclude "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}

15题目的解{请参考《C++中extern “C”含义深层探烦》注解:

16. 兌、聚?Aggregation)以及l合(Composition)的区别?

涉及到UML中的一些概念:兌是表CZ个类的一般性联p?/strong>Q比?#8220;学生”?#8220;老师”是一U关联关p;聚合表示has-a的关p,是一U相Ҏ(gu)散的关系Q聚合类不需要对被聚合类负责Q如下图所C,用空的菱形表C合关p:



从实现的角度Ԍ聚合可以表示?

class A {...} class B { A* a; .....}

?strong>l合表示contains-a的关p,兌性强于聚合:l合cM被组合类有相同的生命周期
Q组合类要对被组合类负责Q采用实心的菱Ş表示l合关系Q?br>


实现的Ş式是:

class A{...} class B{ A a; ...}

参考文章:http://blog.csdn.net/wfwd/archive/2006/05/30/763753.aspx

http://blog.csdn.net/wfwd/archive/2006/05/30/763760.aspx

17.面向对象的三个基本特征,q简单叙qCQ?br>
1. 装Q将客观事物抽象成类Q每个类对自w的数据和方法实行protection(private, protected,public)

2. l承Q广义的l承有三U实现Ş式:

实现l承Q指使用基类的属性和Ҏ(gu)而无需额外~码的能力)?/font>

可视l承Q子H体使用父窗体的外观和实C码)?/font>

接口l承Q仅使用属性和Ҏ(gu)Q实现滞后到子类实现Q?/font>

前两U(cȝ承)和后一U(对象l合=>接口l承以及U虚函数Q构成了功能复用的两U方式?br>
3. 多态:是将父对象设|成为和一个或更多的他的子对象相等的技术,赋g后,父对象就可以Ҏ(gu)当前赋值给它的子对象的Ҏ(gu)以不同的方式运作。简单的_是一句话Q?strong>允许子cȝ型的指针赋值给父类cd的指?/span>
?br>
18. 重蝲Qoverload)和重?overriedQ有的书也叫?#8220;覆盖”Q的区别Q?br>
常考的题目。从定义上来_

重蝲Q是指允许存在多个同名函敎ͼ而这些函数的参数表不同(或许参数个数不同Q或许参数类型不同,或许两者都不同Q?br>
重写Q是?strong>子类重新定义复类虚函?/strong>的方法?br>
?span style="COLOR: #ff0000">实现原理上来?/strong>
Q?br>
重蝲Q?strong>~译器根据函C同的参数表,对同名函数的名称做修饎ͼ然后q些同名函数成了不同的函数Q?span style="COLOR: #ff0000">臛_对于~译器来说是q样?/span>Q?/strong>如,有两个同名函敎ͼfunction func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这LQint_func、str_func。对于这两个函数的调用,在编译器间就已经定了,是静态的。也是_它们?strong>地址在编译期q定了Q?span style="COLOR: #ff0000">早绑?/span>Q,
因此Q?strong>重蝲和多态无?/span>Q?br>
重写Q和多态真正相兟뀂当子类重新定义了父cȝ虚函数后Q父cL针根据赋l它的不同的子类指针Q动态的调用属于子类的该函数Q?strong>q样的函数调用在~译期间是无法确定的Q调用的子类的虚函数的地址无法l出Q。因此,q样的函数地址是在q行期绑定的Q晚l定Q?/strong>

19. 多态的作用Q?br>
主要是两个:1. 隐藏实现l节Q得代码能够模块化Q扩展代码模块,实现代码重用Q?. 接口重用Qؓ了类在承和z的时候,保证使用家族中Q一cȝ实例的某一属性时的正调用?br>
20. Ado与Ado.net的相同与不同Q?/strong>

除了“能够让应用程序处理存储于DBMS 中的数据“q一基本怼点外Q两者没有太多共同之处。但是Ado使用OLE DB 接口q基于微软的COM 技术,而ADO.NET 拥有自己的ADO.NET 接口q且Z微Y?NET 体系架构。众所周知.NET 体系不同于COM 体系QADO.NET 接口也就完全不同于ADO和OLE DB 接口Q这也就是说ADO.NET 和ADO是两U数据访问方式。ADO.net 提供对XML 的支持?/font>

21. New delete 与malloc free 的联pM区别?
{案Q?span style="COLOR: #ff0000">都是在堆(heap)上进行动态的内存操作
。用malloc函数需要指定内存分配的字节数ƈ?span style="COLOR: #0000ff">不能初始化对象,new 会自动调用对象的构造函?/span>
?span style="COLOR: #0000ff">delete 会调用对象的destructorQ而free 不会调用对象的destructor.

22. #define DOUBLE(x) x+x Qi = 5*DOUBLE(5)Q?i 是多?
{案Qi ?0?br>
23. 有哪几种情况只能用intialization list 而不能用assignment?

{案Q当cM含有const、reference 成员变量Q基cȝ构造函数都需要初始化表?br>
24. C++是不是类型安全的Q?/strong>
{案Q不是。两?strong>不同cd的指针之间可以强制{?/span>Q用reinterpret cast)。C#是类型安全的?br>
25. main 函数执行以前Q还会执行什么代码?
{案Q全局对象的构造函C在main 函数之前执行?br>
26. 描述内存分配方式以及它们的区?
1Q??strong>静态存储区域分配。内存在E序~译的时候就已经分配好,q块内存在程序的整个q行期间都存在。例如全局变量Qstatic 变量?/strong>
2Q??span style="COLOR: #ff0000">栈上创徏。在执行函数Ӟ函数?span style="BACKGROUND-COLOR: #888888">局部变?/span>的存储单元都可以在栈上创建,函数执行l束时这些存储单元自动被释放
?strong>栈内存分配运内|于处理器的指o?/span>
?br>3Q??span style="COLOR: #ff0000">堆上分配Q亦U动态内存分?/span>。程序在q行的时?strong>用malloc 或new 甌L多少的内存,E序员自p责在何时用free 或delete 释放内存?/strong>动态内存的生存期由E序员决定,使用非常灉|Q但问题也最?/span>?br>
27.struct ?class 的区?/strong>

{案Q?strong>struct 的成员默认是公有?/strong>Q而类的成员默认是U有的?span style="COLOR: #ff0000">struct ?class 在其他方面是功能相当?/strong>
?br>
从感情上Ԍ大多数的开发者感到类和结构有很大的差别?strong>感觉上结构仅仅象一堆缺乏封装和功能的开攄内存位,而类pzȝq且可靠的社会成?/strong>Q它有智能服务,有牢固的装屏障和一个良好定义的接口。既然大多数人都q么认ؓQ那?/font>只有在你的类有很的Ҏ(gu)q且有公有数据(q种事情在良好设计的pȝ中是存在?Q时Q你也许应该使用 struct 关键字,否则Q你应该使用 class 关键字?

28.当一个类A 中没有生命Q何成员变量与成员函数,q时sizeof(A)的值是多少Q如果不是零Q请解释一下编译器Z么没有让它ؓ零。(AutodeskQ?/span>
{案Q肯定不是零。D个反例,如果是零的话Q声明一个class A[10]对象数组Q而每一个对象占用的I间是零Q这时就没办法区分A[0],A[1]…了?br>
29. ?086 汇编下,逻辑地址和物理地址是怎样转换的?QIntelQ?br>{案Q通用寄存器给出的地址Q是D内偏移地址Q相?span style="COLOR: #ff0000">D寄存器地址*10H+通用寄存器内地址Q就得到了真正要讉K的地址?br>
30. 比较C++中的4U类型{换方式?

请参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspxQ重Ҏ(gu)static_cast, dynamic_cast和reinterpret_cast的区别和应用?br>
31.分别写出BOOL,int,float,指针cd的变量a ?#8220;?#8221;的比较语句?/strong>
{案Q?br>BOOL : if ( !a ) or if(a)
int : if ( a == 0)
float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)



32.误出const?define 相比Q有何优点?
{案Q?Q?strong> const 帔R有数据类型,而宏帔R没有数据cd
。编译器可以对前者进行类型安全检查。而对后者只q行字符替换Q没有类型安全检?/strong>Qƈ且在字符替换可能会生意料不到的错误?br>2Q?有些集成化的调试工具可以对const 帔Rq行调试Q但是不能对宏常量进行调?/strong>?br>
33.q数l与指针的区别?
数组要么在静态存储区被创建(如全局数组Q,要么在栈上被创徏。指针可以随时指向Q意类型的内存块?br>(1)修改内容上的差别
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向帔R字符?br>p[0] = ‘X’; // ~译器不能发现该错误Q运行时错误
(2) 用运符sizeof 可以计算出数l的定wQ字节数Q。sizeof(p),p 为指针得到的是一个指针变量的字节敎ͼ而不是p 所指的内存定w。C++/C 语言没有办法知道指针所指的内存定wQ除非在甌内存时记住它。注意当数组作ؓ函数的参数进行传递时Q该数组自动退化ؓ同类型的指针?br>char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
计算数组和指针的内存定w
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不?00 字节
}

34.cL员函数的重蝲、覆盖和隐藏区别Q?/strong>
{案Q?br>a.成员函数被重载的特征Q?br>Q?Q相同的范围Q在同一个类中)Q?br>Q?Q函数名字相同;
Q?Q参C同;
Q?Qvirtual 关键字可有可?/span>
?br>b.覆盖是指zcd数覆盖基cd?/span>Q特征是Q?br>Q?Q?span style="COLOR: #0000ff">不同的范?/strong>
Q分别位于派生类与基c)Q?br>Q?Q?strong>函数名字相同Q?br>Q?Q?strong>参数相同Q?br>Q?Q?strong>基类函数必须有virtual 关键?/span>
?虚函?added by alphajay)
c.“隐藏”是指zcȝ函数屏蔽了与其同名的基类函数Q规则如下:
Q?Q?span style="COLOR: #0000ff">如果zc?/span>的函C基类的函数同名,但是参数不同。此Ӟ不论有无virtual关键字,基类的函数将被隐藏(注意别与重蝲hQ?br>Q?Q?span style="COLOR: #0000ff">如果zcȝ函数与基cȝ函数同名Qƈ且参C相同Q但?span style="COLOR: #ff0000">基类函数没有virtual 关键?/span>。此Ӟ基类的函数被隐藏Q?span style="COLOR: #ff0000">注意别与覆盖hQ?br>
35. There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.
{案Q? ( a + b ) + abs( a - b ) ) / 2

36. 如何打印出当前源文g的文件名以及源文件的当前行号Q?br>{案Q?br>cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系l预定义宏,q种宏ƈ不是在某个文件中定义的,而是q译器定义的?br>
37. main d数执行完毕后Q是否可能会再执行一D代码,l出说明Q?br>{案Q?strong>可以Q可以用_onexit 注册一个函?/strong>Q它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void);
void main( void )
{
String str("zhanglin");
_onexit( fn1 );
_onexit( fn2 );
_onexit( fn3 );
_onexit( fn4 );
printf( "This is executed first.\n" );
}
int fn1()
{
printf( "next.\n" );
return 0;
}
int fn2()
{
printf( "executed " );
return 0;
}
int fn3()
{
printf( "is " );
return 0;
}
int fn4()
{
printf( "This " );
return 0;
}
The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.

38. 如何判断一D늨序是由C ~译E序q是由C++~译E序~译的?
{案Q?br>#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif



Cunch 2011-04-12 15:32 发表评论
]]>atoi函数实现http://www.shnenglu.com/Cunch/archive/2011/03/13/141711.htmlCunchCunchSun, 13 Mar 2011 05:08:00 GMThttp://www.shnenglu.com/Cunch/archive/2011/03/13/141711.htmlhttp://www.shnenglu.com/Cunch/comments/141711.htmlhttp://www.shnenglu.com/Cunch/archive/2011/03/13/141711.html#Feedback9http://www.shnenglu.com/Cunch/comments/commentRss/141711.htmlhttp://www.shnenglu.com/Cunch/services/trackbacks/141711.html
1、能够将从当前开始的字符Q数字或+?Q到W一个不是数字的字符l束的数字字W串Q{化成整数Q?br>      q个也就是有人在blog中谈论的前缀匚w?br>2、需要注意的指针在这个过E中的指向发生了改变

下面l出我的atoi实现代码
int aatoii(const char * str)
{
    
if(str == NULL) return 0;

    
int result = 0;
    
int sign = 1;
    
if( ('0'<= str[0&& str[0<= '9'||(str[0]=='-'|| str[0]=='+')
    {
        
if(str[0== '+' || str[0== '-')
        {
            
if(str[0]=='-')
            {
                sign 
= -1;
            }
            str
++;
        }
    }
    
else
    {
        
return 0;
    }

    
while('0'<= *str && *str <= '9')
    {
        result 
= result*10 + (*str++ - '0');
    }

    
return result;
}



修改版:
int aatoii(const char * str)
{
    
if(str == NULL) return 0;

    
int result = 0;
    
int sign = 1;
    
if( ('0'<= str[0&& str[0<= '9'||(str[0]=='-'|| str[0]=='+')
    {
        
if(str[0== '+' || str[0== '-')
        {
            
if(str[0]=='-')
            {
                sign 
= -1;
            }
            str
++;
        }
    }
    
    
    
while('0'<= *str && *str <= '9' )
    {
        result 
= result*10 + (*str++ - '0');
    }

    
return result * sign;
}

后面说我没溢出判断:
我仔l想了想Q我认ؓ没必有,׃我保证了传进来的str是有意义的:
无外乎这几种情况Q?{'\0'}, {'+', '\0'}, {'1', '2', '\0'} , {'a', 'b', '1', '2', '\0'},q些都应该没有问?br>Q由于while('0' <= *str && *str <= '9')Q等于间接就判断了?br>
修改版二Q?br>现在发现我对溢出的理解是错误Q下面给Z?br>psQ发现l(f)inux的颜色真好看Q?br>



 
3、今天我才明白const char* str; 是修饰字W串不能改变的,而不是指针, 修饰帔R指针的是char* const strQ?br>
    那我p说吧Q?br>    const int * const pint;  //一个const指针Q指向一个const成员
    const int * pint;   //一个非const指针Q?指向一个const成员
    int *pint;  //一个非const指针Q指向一个非const成员
    int * const pint;  //一个const指针Q指向一个非const成员
    int const * pint; //和第二个一P 一个非const指针Q?指向一个const成员Q?q个不常?br>





Cunch 2011-03-13 13:08 发表评论
]]>
C++W试?/title><link>http://www.shnenglu.com/Cunch/archive/2011/03/09/141391.html</link><dc:creator>Cunch</dc:creator><author>Cunch</author><pubDate>Wed, 09 Mar 2011 00:04:00 GMT</pubDate><guid>http://www.shnenglu.com/Cunch/archive/2011/03/09/141391.html</guid><wfw:comment>http://www.shnenglu.com/Cunch/comments/141391.html</wfw:comment><comments>http://www.shnenglu.com/Cunch/archive/2011/03/09/141391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Cunch/comments/commentRss/141391.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Cunch/services/trackbacks/141391.html</trackback:ping><description><![CDATA[<div id="p3ltndn" class=postText>l定?ji)个敎ͼ例如Q?Q?Q?Q?Q?Q?Q?Q?Q?计算?ji)个数的排列的种数。需要考虑重复情况Q如果给??Q则只有一U结果?<br>限制Q不能用stl?<br>要求Q完成函?nbsp;unsigned int foo(unsigned int *arr); <br>输入法代码Qƈl出法复杂度分析? <p>分析Q?nbsp;</p> <p>#include <cstdlib><br>#include <iostream></p> <p>using namespace std;<br>unsigned int foo(unsigned int *arr)<br>{<br>    unsigned int p[] ={1,2,6,24,120,720,5040,40320,362880};<br>    unsigned int i,j,c,s=p[8];//first the number is p<sup>9<sub>9</sub></sup><br>    for(i = 0; i < 7; i++)<br>       for(j = i+1; j < 8; j++)<br>       {<br>           if(arr[i]>arr[j])  //swap two number<br>           {<br>               arr[i]^=arr[j];<br>               arr[j]^=arr[i];<br>               arr[i]^=arr[j];<br>           }    <br>       }    <br>    i = 0;<br>    c = 0;<br>    while(i<8)<br>    {<br>        j = i+1;<br>        while(arr[i]==arr[j])//compute the number of the repetition <br>        {<br>            c++;   <br>            j++;  <br>        }    <br>        s/=p[c];<br>        c=0;<br>        i=j;<br>    }    <br>    return s;<br>}<br>   <br>int main()<br>{<br>    unsigned int a[]={1,3,3,5,6,7,8,8,9};<br>    cout<<"The number of permutation is: "<<foo(a)<<endl;<br>    system("pause");<br>    return 0;<br>}     <br>q可以改q排序那部分?/p> <p>转一个经典的题目Q?/p> <p>l一个天q?问如何用3ơ把q个球扑և?<br>q且求出q个球是比其他的轻q是?<br>?2个球分别~号为a1,a2,a3.......a10,a11,a12. <br>W一步:?2球分开3拨,每拨4个,a1~a4W一拨,Cؓb1Q?nbsp;a5~a8W?拨,Cؓb2Q其余第3拨,Cؓb3Q?<br>W二步:b1和b2攑ֈ天^两盘上,记左盘ؓc1Q右为c2Q这时候分两中情况Q?<br><br>1.c1和c2qQ此时可以确定从a1到a8都是常球Q然后把c2拿空Qƈ从c1上拿下a4Q从a9到a12四球里随便取三球Q假设ؓa9到a11Q放到c2上。此时c1上是a1到a3Qc2上是a9到a11。从q里又分三种情况Q?<br>     AQ天q_^衡,很简单,说明没有放上ȝa12是异球Q而到此步一q了两ơ,所以将a12随便?1个常球再UCơ,也就是第三次Q马上就可以定a12是重q是轻; <br>     BQ若c1上升Q则q次U说明异球ؓa9到a11三球中的一个,而且是比常球重。取下c1所有的球,q将a8攑ֈc1上,a9取下Q比较a8和a11Q第三次UͼQ如果^衡则说明从c2上取下的a9是偏重异球,如果不^衡,则偏向哪盘则哪盘里放的就是偏重异球; <br>     CQ若c1下降Q说明a9到a11里有一个是偏轻异球。次U情况和BcMQ所以接下来的步骤照搬B是Q?<br><br>2.c1和c2不^衡,q时候又分两U情况,c1上升和c1下降Q但是不哪U情况都能说明a9到a12是常球。这步是解题的关键。也是这个题最妙的地方?<br>     AQc1上升Q此时不能判断异球在哪盘也不能判断是轻还是重。取下c1中的a2到a4三球放一边,c2中的a5和a6攑ֈc1上,然后常球a9攑ֈc2上。至此,c1上是a1Qa5和a6Qc2上是a7Qa8和a9。此时又分三中情况: <br>         1Q如果^衡,说明天^上所有的球都是常球,异球在从c1上取下a2到a4中。而且可以断定异球轻重。因为a5到a8都是常球Q而第2ơ称的时候c1是上升的Q所以a2到a4里必然有一个轻球。那么第三次U就用来从a2到a4中找到轻球。这很简单,随便拿两球放到c1和c2Q^衡则剩余的ؓ要找球,不^衡则哪边低则哪个扄Q?<br>         2Qc1仍然保持上升Q则说明要么a1是要扄ȝQ要么a7和a8两球中有一个是重球Q这步懂吧?好好xQ很单的。因为a9是常球,而取下的a2到a4肯定也是常球Q还可以推出换盘攄的a5和a6也是常球。所以要么a1轻,要么a7或a8重)。至此,q剩一ơ称的机会。只需把a7和a8放上两盘Q^衡则说明a1是要扄偏轻异球Q如果不qQ则哪边高说明哪个是偏重异球Q?<br>         3Q如果换球称W?ơ后天^q打破Qƈ且c1降低了,q说明异球肯定在换过来的a5和a6两求中,q且异球偏重Q否则天q么^衡要么保持c1上升。确定要扄是偏重之后,a5和a6攑ֈ两盘上称W?ơ根据哪辚w可以判定a5和a6哪个是重球; <br>     BQ第1ơ称后c1是下降的Q此时可以将c1看成c2Q其实以后的步骤都同AQ所以就不必要再重复叙述了。至此,不管情况如何Q用且只用三ơ就能称?2个外观手感一模一L球中有质量不同于其?1球的偏常的球。而且在称的过E中可以判定其是偏轻q是偏重?<br><br>3.U2 合唱团在17 分钟内得赶到演唱会场Q途中必需跨过一座桥Q四个h从桥的同一端出发,你得帮助他们到达另一端,天色很暗Q而他们只有一只手늭。一ơ同时最多可以有两h一赯桥,而过桥的时候必L有手늭Q所以就得有人把手电(sh){带来带去,来回桥两端。手늭是不能用丢的方式来传递的。四个h的步行速度各不同,若两人同行则以较慢者的速度为准。Bono 需? 分钟q桥QEdge 需? 分钟q桥QAdam需?5 分钟q桥QLarry 需?0 分钟q桥。他们要如何?7 分钟内过桥呢Q(有个同济的学生写文章说他当时在微软面试时是到了这道题Q最短只能做出在19分钟内过桥,微Y的h对他讲这Ll果已经是不错的了!Q?nbsp; <br>  A点到 B ?<br> 1 ? q去 2 分钟 2  <br> 2 q来 4 分钟 2+2=4 <br>10?5q去 14 分钟 4+10=14   <br>1 q来 15 分钟 14+1=15   <br>1 ? q去 17 分钟 15+2=17 </p> <p>W一l?nbsp; <br>  1.烧一根不均匀的Q从头烧到尾d需?个小时。现在有若干条材质相同的l_Q问如何用烧l的Ҏ(gu)来计时一个小时十五分钟呢?<br>       ans:三根lI<font color=#ff0000>开始的时候,W一根点燃两端,W二根点燃一端,W三根不?/font>?font color=#ff0000>W一根烧完(30分钟)后,点燃W二根的另一?/font>Q第二根只要15分钟可以烧完了Q第二根l烧?45分钟)后,点燃W三根子两端,W三根烧完(1时15?后,计时完成<br><br>  2.你有一桶果冻,其中有黄艌Ӏ绿艌Ӏ红色三U,闭上眼睛抓取同种颜色的两个。抓取多个可以确定你肯定有两个同一颜色的果?<br><br>  3.如果你有无穷多的_一?公升的提捅,一?公升的提捅,两只提捅形状上下都不均匀Q问你如何才能准称?公升的水?<br><br>  4.一个岔路口分别通向诚实国和说谎国。来了两个hQ已知一个是诚实国的Q另一个是说谎国的。诚实国永远说实话,说谎国永q说谎话。现在你要去说谎国,但不知道应该走哪条\Q需要问q两个h。请问应该怎么?<br><br>  5.12个球一个天qI现知道只有一个和其它的重量不同,问怎样U才能用三次找到那个球?3个呢?(注意此题q未说明那个球的重量是轻是重Q所以需要仔l考虑)<br><br>  6.?个点上画10条直U,要求每条直线上至有三个?<br><br>  7.在一天的24时之中Q时钟的旉、分针和U针完全重合在一L时候有几次?都分别是什么时?你怎样出来的?<br><br>  8.怎么L?|木,使其中Q意两|的距ȝ{?<br><br>  W二l?nbsp; <br><br>  1.Z么下水道的盖子是圆的?<br><br>  2.中国有多辆汽R?<br><br>  3.汽车钥匙插入R门,向哪个方向旋转就可以打开车锁?<br><br>  4.如果你要L中国?4个省(含自d、直辖市和港澳特区及台湾?中的M一个,你会L哪一个,Z?<br><br>  5.多少个加油站才能满中国的所有汽?<br><br>  6.惌你站在镜子前Q请问,Z么镜子中的媄象可以颠倒左叻I却不能颠倒上?<br><br>  7.Z么在M旅馆里,你打开热水Q热水都会瞬间倾泻而出?<br><br>  8.你怎样Excel的用法解释给你的奶奶?<br><br>  9.你怎样重新改进和设计一个ATM银行自动取款?<br><br>  10.如果你不得不重新学习一U新的计机语言Q你打算怎样着手来开?<br><br>  11.如果你的生规划中打在5q内受到奖励Q那获取该项奖励的动机是什?观众是谁?<br><br>  12.如果微Y告诉你,我们打算投资五百万美元来启动你的投资计划Q你开始什么样商业计划?Z?<br><br>  13.如果你能够将全世界的?sh)脑厂商集合在一个办公室里,然后告诉他们被做一件事Q那件事是什? <br><br> <br><br>W三l?nbsp; <br><br>  1.你让工hZ工作7天,回报是一栚w条,q个金条q_成相q的7D,你必d每天l束的时候给他们一D金条。如果只允许你两ơ把金条弄断Q你如何l你的工Z?<br><br>  2.有一辆火车以每小?5公里的速度d北京直奔q州Q同时另一辆火车每时20公里的速度从广州开往北京。如果有一只鸟Q以30公里每小时的速度和两辆火车同时启动,从北京出发,到另一辆R后就向相反的方向q回去飞Q就q样依次在两辆火车之间来回地飞,直到两辆火R盔R。请问,q只鸟共飞行了多长的距离?<br><br>  3.你有四个装药丸的|子Q每个药且R有一定的重量Q被污染的药丸是没被污染的药丸的重量+1。只U量一ơ,如何判断哪个|子的药被污染了?<br><br>  4.门外三个开兛_别对应室内三盏灯Q线路良好,在门外控制开x候不能看到室内灯的情况,现在只允许进门一ơ,定开兛_灯的对应关系?<br><br>  5.人民币ؓ什么只????0的面?<br><br>  6.你有两个|子以及50个红色弹球和50个蓝色弹球,随机选出一个罐子, 随机选出一个弹球放入罐子,怎么l出U色弹球最大的选中Z?在你的计划里Q得到红球的几率是多?<br><br>  7.l你两颗6面色子,可以在它们各个面上刻?-9L一个数字,要求能够用它们拼ZQ意一q中的日期数?br><br>  W四l?nbsp;<br><br>  W一?nbsp;. 五个L抢到?00颗宝矻I每一颗都一样大和价D城。他们决定这么分Q?br><br>  抽签军_自己的号?1????)<br><br>  首先Q由1h出分配方案,然后大家表决Q当且仅当超q半数的人同意时Q按照他的方?br><br>  q行分配Q否则将被扔q大喂鲨鱼<br><br>  如果1h后,再由2h出分配方案,然后剩下?行表冻I当且仅当过半数的h?br><br>  意时Q按照他的方案进行分配,否则被扔入大v喂鲨?br><br>  依此cL<br><br>  条gQ每个v盗都是很聪明的hQ都能很理智地做出判断,从而做出选择?br><br>  问题Q第一个v盗提出怎样的分配方案才能自己的收益最大化?<br><br>  W二?nbsp;. 一道关于飞机加油的问题Q已知:<br><br>  每个飞机只有一个a,<br><br>  飞机之间可以怺加a(注意是相互,没有加a?<br><br>  一a可供一枉机绕地球飞半圈,<br><br>  问题Q?br><br>  Z臛_一枉机绕地球一圈回到v飞时的飞机场Q至需要出动几枉?(所有飞Z同一机场起飞Q而且必须安全q回机场Q不允许中途降落,中间没有飞机?W三? 汽R加a问题  <br><br>  一辆蝲?00升的汽R从A开往1000公里外的BQ已知汽车每公里耗a量ؓ1升,A处有无穷多的油,其他M地点都没有aQ但该R可以在Q何地点存放a以备中{Q问从A到B最需要多a<br><br>  W四? h问题<br><br>  一U杯子,若在WN层被摔破Q则在Q何比N高的楼层均会_若在WM层不_则在M比M低的楼层均会_l你两个q样的杯子,让你?00层高的楼层中试Q要求用最的试ơ数扑և恰y会杯子破碎的楼层?br><br>  W五? 推理游戏<br><br>  教授选出两个??的数Q把它们的和告诉学生Ԍ把它们的U告诉学生乙Q让他们轮流猜这两个?br><br>  甲说Q?#8220;我猜不出”<br><br>  乙说Q?#8220;我猜不出”<br><br>  甲说Q?#8220;我猜C”<br><br>  乙说Q?#8220;我也猜到?#8221;<br><br>  问这两个数是多少<br><br>  W六? 病狗问题<br><br>  一个住宅区内有100户hӞ每户人家M条狗Q每天傍晚大安在同一个地斚w狗。已知这些狗中有一部分病狗Q由于某U原因,狗的Mh无法判断自己的狗是否是病狗,却能够分辨其他的狗是否有病,现在Q上U传来通知Q要求住户处册些病狗,q且不允许指认他人的狗是病狗(是只能判断自己?Q过?天之后,所有的病狗都被处决了,问,一共有几只病狗?Z?<br><br>  W八? 监狱里有100个房_每个戉K内有一囚犯。一天,监狱长说Q你们狱房外有一늁Q你们在N时可以控制这个电(sh)?熄或?。每天只能有一个h出来NQƈ且防风是随机的。如果在有限旉内,你们中的某h能对我说Q?#8220;我敢保证Q现在每个h都已l至放q一ơ风了?#8221;我就放了你们!问囚犯们要采取什么策略才能被监狱长放?如果采用了这U策略,大致多久他们可以被释?<br><br> <br><br>W五l?nbsp; <br><br>  1.某手机厂家由于设计失误,有可能造成甉|寿命比原来设计的寿命短一?不是冲放甉|?Q解x案就是免Ҏ(gu)换电(sh)池或l?0元购买该厂家新手机的折换券。请l所有已购买的用户写信告诉解x案?br><br>  2.一高层领导在参观某博物馆时Q向博物馆馆员小王要了一块明代的城砖作ؓU念Q按国家规定QQ何h不得博物馆收藏品变为私有。博物馆馆长需要如何写信给q位领导Q将城砖取回?br><br>  3.营业员小姐由于工作失误,?万元的笔记本?sh)脑?.2万元错卖l李先生Q王姐的经理怎么写信l李先生试图钱要回?<br><br>  4.l你一ƾ新研制的手机,如果你是试l的l长Q你会如何测?<br><br>  5.如何为函数int atoi(const char * pstr)~写试向量?<br><br>  W六l?nbsp; <br><br>  1.链表和数l的区别在哪?<br><br>  2.~写实现链表排序的一U算法。说明ؓ什么你会选择用这LҎ(gu)?<br><br>  3.~写实现数组排序的一U算法。说明ؓ什么你会选择用这LҎ(gu)?<br><br>  4.L写能直接实现char * strcpy(char * pstrDest,const char * pstrSource)函数功能的代码?br><br>  5.~写反{字符串的E序Q要求优化速度、优化空间?br><br>  6.在链表里如何发现循环链接?<br><br>  7.l出z牌的一个算法,q将z好的牌存储在一个整形数l里?br><br>  8.写一个函敎ͼ查字W是否是整数Q如果是Q返回其整数倹{?或者:怎样只用4行代?br><br>  9.l出一个函数来输出一个字W串的所有排列?br><br>  10.L写实现void * malloc(int)内存分配函数功能一L代码?br><br>  11.l出一个函数来复制两个字符串A和B。字W串A的后几个字节和字W串B的前几个字节重叠?br><br>  12.怎样~写一个程序,把一个有序整数数l放C叉树?<br><br>  13.怎样从顶部开始逐层打印二叉树结Ҏ(gu)?LE?br><br>  14.怎样把一个链表掉个顺?也就是反序,注意链表的边界条件ƈ考虑I链?? --<br><br>  15.L写能直接实现int atoi(const char * pstr)函数功能的代?br><br>-----------------------------------------------------------------------------------<br>W一l题{案Q?nbsp;<br><br>  <br>  2)Ҏ(gu)抽屉原理Q??br><br>  3)3升装?3???全注?;3升装?3?????;5升倒掉;3???注入1?;3升装?3???完成(另:可用回溯法编E求?<br><br>  4)问其中一人:另外一个h会说哪一条\是通往诚实国的?回答者所指的那条路必然是通往说谎国的?br><br>  5)12个球Q?br><br>  W一ơ:4Q? 如果q了Q?br><br>  那么剩下的球中取3攑ַ??个好球放双Q称Q?br><br>  如果左边重,那么取两个球UC下,哪个重哪个是ơ品Q^的话W三个重Q是ơ品Q轻的话同理<br><br>  如果q了Q那么剩下一个次品,q可Ҏ(gu)需要称出次品比正品L者重<br><br>  如果不^Q?br><br>  那么不妨讑ַ辚w双轻,Z便于说明Q将左边4颗称为重球,双4颗称球,剩下4颗称为好?br><br>  取重?颗,ȝ2颗放在左侧,右侧?颗好球和一颗轻?br><br>  如果左边?br><br>  U那两颗重球Q重的一个次品,q的话右边轻球次?br><br>  如果双?br><br>  U左边两颗轻球,ȝ一个次?br><br>  如果q?br><br>  U剩下两颗重球,重的一个次品,q的话剩下那颗轻球次?br><br>  13个球Q?br><br>  W一ơ:4Q?Q如果^?br><br>  ?颗球用上面的Ҏ(gu)仍旧能找出次品,只是不能知道ơ品是重是轻<br><br>  如果不^Q同上 <br><br>6)  <br><br>  o o o<br><br>  o o o<br><br>  o o o<br><br>  7)<br><br>  23ơ,因ؓ分针要{24圈,旉才能?圈,而分针和旉重合两次之间的间隔显?gt;1时Q它们有23ơ重合机会,每次重合中秒针有一ơ重合机会,所以是23?br><br>  重合旉可以对照手表求出Q也可列方程求出<br><br>  8)<br><br>  在地球表面种树,做一个地球内接的正四面体Q内接点即ؓ所?br><br>  W二l?nbsp;无标准答?nbsp; <br><br>  W三l?nbsp;<br><br>  1. 分成1,2,4三段Q第一天给1Q第二天l?取回1Q第3天给1Q第4天给4取回1?Q第5天给1Q第6天给2取回1Q第七天l?<br><br>  2. 求出火R盔R旉Q鸟速乘以时间就是鸟飞行的距?br><br>  3. 四个|子中分别取1,2,3,4颗药丸,U出比正帔R多少Q即可判断出那个|子的药被污?br><br>  4. 三个开兛_别:养I开Q开10分钟Q然后进屋,暗且凉的为开?控制的灯Q亮的ؓ开?控制的灯Q暗且热的ؓ开?控制的灯<br><br>  5. 因ؓ可以?Q?Q?Q?0l合成Q何需要的货币|日常习惯?0q制<br><br>  6. 题意不理?..*_*<br><br>  7. 012345 0126(9)78<br><br>  W四l?nbsp;都是很难的题?nbsp; <br><br>  W一题:97 0 1 2 0 或?nbsp;97 0 1 0 2 (提示Q可用逆推法求?<br><br>  W二题:3枉?架次Q飞法:<br><br>  ABC 3架同时v飞,1/8处,ClAB加满油,Cq航Q?/4处,BlA加满油,Bq航QA到达1/2处,C从机场往另一方向起飞Q?/4处,C同已l空油箱的Aq_剩余沚wQ同时B从机v飞,AC?/8处同Bq_剩余沚wQ刚?枉机同时返航。所以是3枉?架次。第三题Q需要徏立数学模?nbsp; <br><br>  (提示Q严D明该模型最优比较麻烦,但确实可证,大胆猜想是解题关?<br><br>  题目可归lؓ求数?nbsp;an=500/(2n+1) n=0,1,2,3......的和Sn什么时候大于等?000,解得n>6<br><br>  当n=6ӞS6=977.57<br><br>  所以第一个中转点v始位|距Mؓ1000-977.57=22.43公里<br><br>  所以第一ơ中转之前共耗a 22.43*(2*7+1)=336.50?br><br>  此后每次中{耗a500?br><br>  所以总耗a量ؓ7*500+336.50=3836.50?br><br>  W四题:需要徏立数学模?br><br>  题目可归lؓ求自然数列的和S什么时候大于等?00Q解得n>13<br><br>  W一个杯子可能的投掷楼层分别为:14Q?7Q?9Q?0Q?0Q?9Q?7Q?4Q?0Q?5Q?9Q?00<br><br>  W五题:3?(可严D?<br><br>  设两个数为n1Qn2Qn1>=n2Q甲听到的数为n=n1+n2Q乙听到的数为m=n1*n2<br><br>  证明n1=3Qn2=4是唯一?br><br>  证明Q要证以上命题ؓ真,不妨先证n=7<br><br>  1)必要性:<br><br>  i) n>5 是显然的Q因为n<4不可能,n=4或者n=5甲都不可能回{不知道<br><br>  ii) n>6 因ؓ如果n=6的话Q那么甲虽然不知?不确?+4q是3+3)但是无论?Q?q是3Q?乙都不可能说不知?m=8或者m=9的话乙说不知道是没有道理?<br><br>  iii) n<8 因ؓ如果n>=8的话Q就可以n分解?nbsp;n=4+x ?nbsp;n=6+(x-2)Q那么m可以?x也可以是6(x-2)?x=6(x-2)的必要条件是x=6即n=10Q那样n又可以分解成8+2Q所以M当n>=8Ӟn臛_可以分解成两U不同的合数之和Q这样乙说不知道的时候,甲就没有理由马上说知道?br><br>  以上证明了必要?br><br>  2)充分?br><br>  当n=7Ӟn可以分解?+5?+4<br><br>  昄2+5不符合题意,舍去Q容易判断出3+4W合题意Qm=12Q证?br><br>  于是得到n=7 m=12 n1=3 n2=4是唯一解。第六题Q??数学归纳法证?  <br><br>  1)若只?只病狗,因ؓ病狗Mh看不到有其他病狗Q必然会知道自己的狗是病?前提是一定存在病?Q所以他会在W一天把病狗处决?br><br>  2)设有k只病狗的话,会在Wk天被处决Q那么,如果有k+1只,病狗的主人只会看到k只病狗,而第k天没有h处决病狗Q病狗主人就会在Wk+1天知道自q狗是病狗Q于是病狗在Wk+1天被处决<br><br>  3)?)2)得,若有n只病狗,必然在第n天被处决<br><br>  W八题:<br><br>  U定好一个h作ؓ报告?可以是第一个放风的?<br><br>  规则如下Q?br><br>  1、报告hN的时候开灯ƈ数开灯次?br><br>  2、其他hW一ơ遇到开着灯放风时Q将灯关?br><br>  3、当报告人第100ơ开灯的时候,d监狱长报告,要求监狱长放?.....<br><br>  按照概率大约30q后(10000?他们可以被释?br><br>  W五l无标准{案  <br><br>  W六l部分题参考答案:  <br><br>  4.<br><br>char * strcpy(char * pstrDest,const char * pstrSource)<br>{<br> assert((pstrDest!=NULL)&&(pstrSource!=NULL)); <br> char * pstr=pstrDest;<br> while((*(pstrDest++)=*(pstrSource++))!='\0');<br>        return pstr;<br>}<br> <br><br><br>  5.<br><br>char * strrev(char * pstr)<br>{<br> assert(pstr!=NULL);<br> <br> char * p=pstr;<br> char * pret=pstr;<br> while(*(p++)!='\0');<br> p--;<br> char tmp;<br> while(p>pstr)<br> {<br>  tmp=*p;<br>  *(p--)=*(pstr);<br>  *(pstr++)=tmp;  <br> }<br> return pret; <br><br>癑ֺW试题:<br>IPD|?ip1 ip2。之间以I格分开Qip形式为X.X.X.XQ数据保存在文g中,文g不超q?k行,无序。现在要求编写算法去掉可重IPQ可重有三种形式Q包含、交叠、紧靠?<br><br>例如Q文件内容ؓQ?<br>10.0.0.0 10.0.0.12 <br>10.0.0.5 10.0.0.10    ( <= 包含) <br>10.0.0.8 10.0.0.<span style="COLOR: #ff0000">15</span>    ( <= 交叠) <br>10.0.0.<span style="COLOR: #ff00ff">15</span> 10.0.0.24   ( <= 紧靠) <br><br>最后输Zؓ: <br>10.0.0.0 10.0.0.24</p> <p>codeQ?br>/*<br>**q个函数的作用是文件中的一行对应的两个数据转换成整形的数据<br>**比如?0.0.0.0 10.0.0.12 转换后,left=10*2<sup>24,</sup>是10.0.0.0对应的整敎ͼ每个数字对应8位,right=left+12<br>*/<br>void ParseLine( char line[], size_t length, unsigned int &left, unsigned int &right)<br>{<br>    size_t i;<br>    for( i=0; i<length; i++ )<br>    {<br>        if ( line[i]=='.' || line[i]==' ' )//点变成0<br>        {<br>            line[i]=0;<br>        }<br>    }<br>    <font style="BACKGROUND-COLOR: #00ffff"><font style="BACKGROUND-COLOR: #ffff00">char *p   = (char*)&left;</font><br></font>    char *num = line;<br>    for( i=3; i<4; --i ) //<font color=#ff0000>size是size_tQ而size_t是unsigned intQ所以i=0再自减后变成了最大的整数Q@环就会终?br></font>    {<br> // cout<<i<<",";<br>        *(p+i) = strtol( num, &num  ,10 );<br>        cout<<static_cast<int>(*(p+i))<<",";<br>        ++num;<br> // cout<<num<<":";<br>    }<br>    cout<<endl;<br>    p = (char*)&right;<br>    for( i=3; i<4; --i )<br>    {<br>        *(p+i) = strtol( num, &num, 10 );<br>        ++num;<br>    }<br>}</p> <p><br>void UniqueSequence(  vector<unsigned int> & uSeq, unsigned int left, unsigned int right )<br>{<br>    size_t i, lPos=-1, rPos=-1;<br>    for( i=0; i<uSeq.size(); i++ )<br>    {<br>        if( left <= uSeq.at(i)  )<br>        {<br>            lPos = i;<br>            break;<br>        }<br>    }<br>    for( ;i<uSeq.size(); i++ )<br>    {<br>        if( right<=uSeq.at(i) )<br>        {<br>            rPos=i;<br>            break;<br>        }<br>    }<br>    if( lPos == -1 )<br>    {<br>        uSeq.push_back( left );<br>        uSeq.push_back( right );    <br>        return;<br>    }</p> <p>    if( lPos%2 == 0 )<br>    {<br>        if(  uSeq.at(lPos)==left )<br>        {    <br>        }<br>  else<br>        {<br>            uSeq.insert( uSeq.begin()+lPos, left );<br>        }<br>    }<br> else<br>    {<br>        --lPos;<br>    }<br>    if( rPos == -1 )<br>    {<br>        uSeq.erase( uSeq.begin()+(lPos+1), uSeq.end() );<br>        uSeq.push_back(right);<br>    }<br> else if(  rPos%2 == 0  )<br>    {<br>        if( uSeq.at(rPos)== right )<br>        {<br>            uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+(rPos+1) );<br>        }<br>  else<br>        {<br>            uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );<br>            uSeq.insert( uSeq.begin()+rPos, right  );<br>        }<br>    }<br> else<br>    {<br>        uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );<br>    }<br>}</p> <p><br>void PrintIP( unsigned int num )<br>{<br>    char *p = (char*)&num;<br>    for( size_t i=3;i>0; --i)<br>    {<br>        cout<< (int)p[i]<<".";<br>    }<br>    cout<<(int)p[0];<br>}</p> <p>#define MAX_BUFFER_LENGTH 100<br>int main()<br>{<br>    unsigned int left, right;<br>    char buffer[MAX_BUFFER_LENGTH];<br>    ifstream infile( "test.txt" );<br>    if( infile.fail() )<br>    {<br>        return 0;<br>    }<br>    vector<unsigned int> uSeq;<br>    while( infile.getline(buffer, MAX_BUFFER_LENGTH) )<br>    {<br>        ParseLine(buffer, strlen(buffer), left, right);<br> // cout<<left<<","<<right<<endl;<br>        UniqueSequence( uSeq, left, right );<br>  for( size_t i=0; i<uSeq.size(); i+=2 )<br>    {<br>        PrintIP(uSeq.at(i) );<br>        cout<<"  ";<br>        PrintIP(uSeq.at(i+1));<br>        cout<<endl;<br>    }<br>  cout<<endl;<br>    }<br>    for( size_t i=0; i<uSeq.size(); <font color=#ff0000>i+=2</font> )<br>    {<br>        PrintIP(uSeq.at(i) );<br>        cout<<"  ";<br>        PrintIP(uSeq.at(i+1));<br>        cout<<endl;<br>    }<br>    return 0;<br>}<br><br>/*<strong>long</strong> <strong>strtol(</strong> <strong>const</strong> <strong>char</strong> <strong>*</strong><em>nptr</em><strong>,</strong> <strong>char</strong> <strong>**</strong><em>endptr</em><strong>,</strong> <strong>int</strong> <em>base</em> <strong>),</strong>其中nptr是以NULLl尾字符Ԍ<em>endptr</em>是字W串停止扫描的地方(Pointer to character that stops scanQ,<strong>strtol</strong> returns the value represented in the string <em>nptrQThe <strong>strtol</strong> function converts nptr to a <strong>long</strong>. <strong>strtol</strong> stops reading the string nptr at the first character it cannot recognize as part of a number. This may be the terminating null character, or it may be the first numeric character greater than or equal to base. <br></em><font style="BACKGROUND-COLOR: #ffcc00">string = "-10110134932This stopped it";<br>  l = strtol( string, &stopstring, 10 );<br>  printf( "string = %s", string );<br>  printf("   strtol = %ld", l );<br>  printf("   Stopped scan at: %s", stopstring );<br>  string = "10110134932";<br>  printf( "string = %s\n", string );<br>  /* Convert string using base 2, 4, and 8: */<br>  for( base = 2; base <= 8; base *= 2 )<br>  {<br>     /* Convert the string: */<br>     ul = strtoul( string, &stopstring, base );<br>     printf( "   strtol = %ld (base %d)\n", ul, base );<br>     printf( "   Stopped scan at: %s\n", stopstring );<br>  }<br>打印的结果是Q?br>string = -10110134932This stopped it   strtol = -2147483647   Stopped scan at: This stopped itstring = 10110134932<br>  strtol = 45 (base 2)<br>  Stopped scan at: 34932<br>  strtol = 4423 (base 4)<br>  Stopped scan at: 4932<br>  strtol = 2134108 (base 8)<br>  Stopped scan at: 932<br>*/</font></p> <p><font style="BACKGROUND-COLOR: #ffffff">5.如果存在两个变量Qa和bQ不使用“if”?#8220;?:”?“switch”和其它的判断语句Q找Z个数中的最大倹{?br>      {案Q? ( a + b ) + abs( a - b ) ) / 2</font></p> <p>6. 写一个函数找Z个整数数l中Q第二大的数 QmicrosoftQ?br>       const int MINNUMBER = -32767 ;<br>       int find_sec_max( int data[] , int count)<br>       {<br>                int maxnumber = data[0] ;<br>                int sec_max = MINNUMBER ;<br>                for ( int i = 1 ; i < count ; i++)<br>                {<br>                    if ( data[i] > maxnumber )<br>                    {<br>                         sec_max = maxnumber ;<br>                         maxnumber = data[i] ;<br>                    }<br>                    else<br>                    {<br>                             if ( data[i] > sec_max )<br>                                     sec_max = data[i] ;<br>                    }<br>                }<br>                return sec_max ;<br>        }</p> </div> <img src ="http://www.shnenglu.com/Cunch/aggbug/141391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Cunch/" target="_blank">Cunch</a> 2011-03-09 08:04 <a href="http://www.shnenglu.com/Cunch/archive/2011/03/09/141391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转C++W试http://www.shnenglu.com/Cunch/archive/2011/03/09/141390.htmlCunchCunchTue, 08 Mar 2011 23:55:00 GMThttp://www.shnenglu.com/Cunch/archive/2011/03/09/141390.htmlhttp://www.shnenglu.com/Cunch/comments/141390.htmlhttp://www.shnenglu.com/Cunch/archive/2011/03/09/141390.html#Feedback0http://www.shnenglu.com/Cunch/comments/commentRss/141390.htmlhttp://www.shnenglu.com/Cunch/services/trackbacks/141390.html


一、如何判断一个单链表是有环的Q(注意不能用标志位Q最多只能用两个额外指针Q?br>   struct node { char val; node* next;}
   bool check(const node* head) {} //return false : 无环Qtrue: 有环
    一UOQnQ的办法是Q搞两个指针Q一个每ơ递增一步,一个每ơ递增两步Q如果有环的话两者必焉合,反之亦然Q:
    bool check(const node* head)
    {
         if(head==NULL) 
              return false;   
         node *low=head, *fast=head->next;
         while(fast!=NULL && fast->next!=NULL)
        {
               low=low->next;
               fast=fast->next->next;
               if(low==fast)
                    return true;
        }
       return false;
   }

 二、删除一个单w表的最中间的元素,要求旉可能短Q不能用两ơ@环)
struct link
{
    int data;
    struct link *next;
};
void delMiddle(link *head)
{
    if(head == NULL)
           return;
    else if(head->next == NULL)
    {
            delete head;
            return;
    }
    else
    {
            link *low = head;
            link *fast = head->next;
            while(fast != NULL && fast->next != NULL)
            {   
                       fast = fast->next->next;
                       if(fast == NULL)
                                    break;
                       low = low->next;
            }
            link *temp = low->next;
            low->next = low->next->next;
            delete temp;
  
    }
}
int main()
{
       struct link *head,*l;
       struct link *s;
       head = (link*)malloc(sizeof(link));
       head->data=0;
       head->next = NULL;
       l = head;
       for(int i=1; i<9; i++)
       {
            s = (link*)malloc(sizeof(link));
            s->data = i;
            s->next = NULL;
            l->next= s;
            l = l->next;
       }
       print(head);
       delMiddle(head);
       print(head);
       return 0;
}

三、输入nQ求一个n*n矩阵Q规定矩阉|45度线递增(威盛)
/**
 * 得到如下样式的二l数l?br>* zigzagQjpeg~码里取象素数据的排列顺序)
*
*   0, 1, 5, 6,14,15,27,28,
*   2, 4, 7,13,16,26,29,42,
*   3, 8,12,17,25,30,41,43,
*   9,11,18,24,31,40,44,53,
*   10,19,23,32,39,45,52,54,
*   20,22,33,38,46,51,55,60,
*   21,34,37,47,50,56,59,61,
*   35,36,48,49,57,58,62,63
 */

void zigzag(int n)
{
 int **a =(int**) malloc(n*sizeof(int *));  //分配I间
 
 if(NULL == a)
  return ;
 int i;
 for(i = 0; i < n; i++) {
        if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {
            while(--i>=0)
                free(a[i]);
            free(a);
            return;
        }
    }
 
 bool flag = false; //q个标志位用来判断是?5度角生成q是225度角生成
 int count = 0;
 for(i=0; i<n; i++)  //生成的上半部分的数据
 {
  
  if(flag)
  {
   for(int r = 0; r<=i; r++)
   {
    a[r][i-r] = count;
    count++;
   }
   flag = false;
  }
  else
  {
   for(int r = i; r>=0; r--)
   {
    a[r][i-r] = count;
    count++;
   }
   flag = true;
  }
 }
 for(i=n-1; i>=0; i--)  //生成的是下半部分的数?br> {
 // cout<<i<<endl;
  if(flag)
  {
   for(int r = 0; r<=i-1; r++)
   {
    int r1 = n-i+r;       //代表当前?br>    int c1 = 2*n-i-1-r1;  //代表当前?br>    a[r1][c1] = count;
    count++;
   }
   flag = false;
  }
  else
  {
   for(int r = i-1; r>=0; r--)
   {
    cout<<"ddd"<<endl;
    int r1 = n-i+r;
    int c1 = 2*n-i-1-r1;
 //   cout<<r1<<","<<c1<<endl;
    a[r1][c1] = count;
    count++;
   }
   flag = true;
  }
 }
 for(int r = 0; r<n; r++)
 {
  for(int c=0; c<n; c++)
   cout<<a[r][c]<<",";
  cout<<endl;
 }
}
int main()
{
 int n;
 cin>>n;
 zigzag(n);
 return 0;
}
|上q有一个h写了一个比较y的算法:
/**
* 得到如下样式的二l数l?br>* zigzagQjpeg~码里取象素数据的排列顺序)
*
*   0, 1, 5, 6,14,15,27,28,
*   2, 4, 7,13,16,26,29,42,
*   3, 8,12,17,25,30,41,43,
*   9,11,18,24,31,40,44,53,
*   10,19,23,32,39,45,52,54,
*   20,22,33,38,46,51,55,60,
*   21,34,37,47,50,56,59,61,
*   35,36,48,49,57,58,62,63
*/

#include
<stdio.h>
int main()
{
   
int N;
   
int s, i, j;
   
int squa;
    scanf(
"%d", &N);
   
/* 分配I间 */
   
int **a = malloc(N * sizeof(int *));
   
if(a == NULL)
       
return 0;
   
for(i = 0; i < N; i++) {
       
if((a[i] = malloc(N * sizeof(int))) == NULL) {
           
while(--i>=0)
                free(a[i]);
            free(a);
           
return 0;
        }
    }
   
/* 数组赋?*/
    squa
= N*N;   
   
for(i = 0; i < N; i++)
       
for(j = 0; j < N; j++) {
            s
= i + j;
           
if(s < N)
                a[i][j]
= s*(s+1)/2 + (((i+j)%2 == 0)? i : j);
           
else {
                s
= (N-1-i) + (N-1-j);
                a[i][j]
= squa - s*(s+1)/2 - (N - (((i+j)%2 == 0)? i : j));
            }
        }
   
/* 打印输出 */   
   
for(i = 0; i < N; i++) {
       
for(j = 0; j < N; j++)
            printf(
"%-6d", a[i][j]);
        printf(
"\n");
    }
   
return 0;
}

四、打??000的整敎ͼ不能使用程控制语句(for,while,goto{?也不能用递归
1.
typedef struct _test{
   
static int a;
    _test(){
        printf(
"%d\n",_test::a);
        a
++;
    }
  }Test;
 
int Test::a = 1;

 
int   main()  
  {  
    Test tt[
1000];
   
return 0;
  }  
2.
#include   <stdio.h>
#define   B   P,P,P,P,P,P,P,P,P,P
#define   P   L,L,L,L,L,L,L,L,L,L
#define   L   I,I,I,I,I,I,I,I,I,I,N
#define   I   printf( "%3d   ",i++)
#define   N   printf( "\n ") 
int  main()
{
    int   i   =   1;
    B;
}
?br>#define A(x) x;x;x;x;x;x;x;x;x;x;
int main ()
{
   
int n = 1;
    A(A(A(printf (
"%d ", n++))));

   
return 0;
}


五、struct   S   {
        int   i;
        int   *   p;
};
void   main()
{
        S   s;
        int   *   p   =   &s.i;
        p[0]   =   4;
        p[1]   =   3;
        s.p   =   p;
        s.p[1]   =   1;
        s.p[0]   =   2;
}
问程序会在哪一行死掉?QmicrosoftQ?br>解: S   s;
         int   *   p   =   &s.i;        //s.i的地址存储在p?/span>
        p[0]   =   4;                    //修改了s.i
         p[1]   =   3;                    //修改了s.p
         s.p   =   p;                    //s.p指向s.i
         s.p[1]   =   1;               //修改s.p本n
        s.p[0]   =   2;               //s.p指向的是0x00000001,试向这里写,出错
     s.p[0]       =       2;   时出?
     因ؓs.p存的是s.i的地址,s.p[1]为s.p,当s.p[1]=1?s.p此时存放的是1?而不是地址s.i,故在s.p[0]   =   2时出?
此时相当于s.p=ox00000001;地址ox0000001   =   2;当然出错了

如果语句s.p[0]   =2   先于s.p[1]=1则程序就不会出错.此时语句相当于s.i=2;s.p=1;

六、题目描qͼ
1.   int   swap(int   *x,int   *y)
{
    if(x==NULL   ¦ ¦   y==NULL)
        return   -1;
    *x   +=   *y;
    *y   =   *x-   *y;
    *x   -=   *y;
      return   1;
}
h错,溢出已经考虑Q不是错?
2.
void   foo(int   *x,   int   *y)
{
    *x   +=   *y;
    *x   +=   *y;
}
void   fun(int   *x,   int   *y)
{  
    *x   +=   2   *   (*y);
  }
问两个函数是否等P能否互换
解答Q第一题的函数是交换。但假如考虑x,   y都是指向同一个变?l果是这个变量的gؓ0.
W二题的两个函数是有区别?也考虑x,y是指向同一个变?q样W一个函数的l果是这个变量的4?但第二个函数的结果是变量??/font>.



Cunch 2011-03-09 07:55 发表评论
]]>
ƷŮþþþavˬ | ƷþþþþþþþӰԺ| һɫۺþ| Ůͬþ| þþþ| þþþAVȥ| ձƷþþĻ | ɫþþۺ| ձvaҹĻþ | þþƷž޾Ʒ| ڵСþþþþþ| ҹƷþþþþӰ777 | ƷŮþøվ| þþþþþƷþþþ| þɫۺϼ| þþƷƷʢۿ| ˾þô߽| ޳ɫwwwþվҹ| þþþѿӰƬ| ƷþþþþĻһ| ޾Ʒھþ| þþƷһ| 91龫Ʒ91þþþ| þ97þ97Ʒӿϼ | ˾þþƷavһ| avþþþòվ| 97Ʒ˾þô߽app| þ޾ƷƵ| ŷձþþƷ| ۺ˾þۺ| һֻƴƬ99þ| ձƷþþĻ| 㽶þҹɫƷ2020| þþŷղa| ƷƵþþ| þˬ˸߳AV | þñѵӰˬˬˬ| þۺϾɫۺŷȥ | þþþþëƬѲ| ɫۺϾþþƷĻҳ| ޹ƷþþþþԻ |