??xml version="1.0" encoding="utf-8" standalone="yes"?>久久婷婷午色综合夜啪,久久精品无码一区二区三区免费,欧美久久久久久http://www.shnenglu.com/haosola/C++zh-cnTue, 06 May 2025 23:14:39 GMTTue, 06 May 2025 23:14:39 GMT60C++装dlllC(j)#{其他语a使用Ҏ(gu)http://www.shnenglu.com/haosola/archive/2016/03/31/213164.htmlHAOSOLAHAOSOLAThu, 31 Mar 2016 09:54:00 GMThttp://www.shnenglu.com/haosola/archive/2016/03/31/213164.htmlhttp://www.shnenglu.com/haosola/comments/213164.htmlhttp://www.shnenglu.com/haosola/archive/2016/03/31/213164.html#Feedback0http://www.shnenglu.com/haosola/comments/commentRss/213164.htmlhttp://www.shnenglu.com/haosola/services/trackbacks/213164.html  C++在开发底层程序时Q是一个不错的选择。不q想用C++快速做一个一般美观的界面Q不如C#、VB{语a快速。当?dng)如果你想做一个个性绚丽的界面QC++完全是可以的?

  不过快速开发时Q我们ƈ不会(x)局限于一U语aQ很多时候都是؜用多U语aQ实C个强大又l丽的UI的YӞ而且可以保证开发速度很快?

  每一U语a都有独特的优势,有优势的部分恰恰是很适合应用的场景,因此~码实现方便快速。ƈ不是说C++开发程序就一定很慢,也不是说C#开发程序就一定快。如果要做偏底层的功能,往往C++实现hq是很快Q而且E序的执行效率也是很高的。对于底层的操作Q用C#{语a来说Q就非常不方ѝ比如调用个pȝAPI函数QC/C++包含一个头文gQ然后直接写函数名称卛_Q而其他语a则比较麻?ch)?jin)。因Z们要通过一层函数库的封装间接调用底层API的,所以也很ȝ(ch)?jin)?

  不过Q正是封装的多,使用的库多,对于C#q类语言来说Q实现界面就很快?jin)。所以说Q做UI是他们的长处Q所以也很简单?

  那么既然如此Q我们就C++和C#l合来用就很好Q这叫做强强联合Q选择C#也是因ؓ(f)语法上和C++很相|VBq些语言语法和C++相差很大Q不?fn)惯?/font>

  那么C++做底层功能封装和C#界面开发如何؜合v来呢Q这个估计是大家最为关?j)的一个问题吧。在实现界面ӞC#可以选择wpf做界面,非常的不错。学?fn)难度也不大QC#代码Q对于C++熟?zhn)的hQ也觉得很好掌握。C++从业者去使用C#问题不大Q只是会(x)多吐槽一下C#的不方便操作指针之类的,不过C#的string实Z错的Q我蛮喜Ƣ?

  C++装代码成dll形式提供lC(j)#{语a使用。C++代码中,你可以尽情的使用cL完成功能Q只是在导出函数Ӟ只要提供C语言的函敎ͼ而不要将cd出,不徏议这么做。而导出函数时Qؓ(f)?jin)让更多语言方便使用dllQ导出函C用C调用U定导出函数。一般语a都支持标准C函数调用U定?

  更多的细节,׃在本文讲q。这里就是概q性的l大家一个印象,让你知道写程序还可以q样玩哦。不要将自己的思维局限于一U语aQ不要再为学?fn)哪一U语a而纠l,也不要ؓ(f)哪一U语a好而争执?

  不过Q初学者总要选定一U语a作ؓ(f)出发Q而我的徏议时Q学?fn)时可能基而全面的学习(fn)。在入门的时候,相对来说是比较沉得下?j)学习(fn)的。所以选择学习(fn)C++作ؓ(f)入门语言是非怸错的选择。当你C++学的不错的时候,再学其他语言做应用开发,都是L掌握的。但是如果工作了(jin)Q再来学?fn)C++Q精力有限,而且很难?rn)下心(j)学习(fn)又大又全又l的C++?

  然而做底层开发时QC++无疑是一个很好的选择。如果C++借用界面库,自然也是可以做很不错的UI的。其他语a之所以可以快速开发,也就是有很多库的支持。当C++的第三方库多?jin),开发速度自然也是很不错的?

  如果你有一些不错的xQ就到C++技术网分n下吧。我?x)仔l阅L一个字透露出来的气息,l你分n我的相关l验Q尽量开阔你的思维范围Q一赯步?

全讯|?/strong>,www.hz1s.com 



HAOSOLA 2016-03-31 17:54 发表评论
]]>
利用C++ RAII技术自动回收堆内存http://www.shnenglu.com/haosola/archive/2014/11/16/208891.htmlHAOSOLAHAOSOLASun, 16 Nov 2014 01:05:00 GMThttp://www.shnenglu.com/haosola/archive/2014/11/16/208891.htmlhttp://www.shnenglu.com/haosola/comments/208891.htmlhttp://www.shnenglu.com/haosola/archive/2014/11/16/208891.html#Feedback0http://www.shnenglu.com/haosola/comments/commentRss/208891.htmlhttp://www.shnenglu.com/haosola/services/trackbacks/208891.html  帔R到的动态内存回攉?/strong>

  在C++的编E过E中Q我们经帔R要申请一块动态内存,然后当用完以后将光放。通常而言Q我们的代码是这L(fng)Q?br />
  1: void func()

  2: {

  3: //allocate a dynamic memory

  4: int *ptr = new int;

  5:

  6: //use ptr

  7:

  8: //release allocated memory

  9: delete ptr;

  10: ptr = NULL;

  11: }

  如果q个函数func()逻辑比较单,问题不大Q但是当中间的代码有可能抛出异常Ӟ上面的代码就?x)生内存泄?memory leak)Q如下面代码中第11行和12行将不会(x)被执行。当然有码友?x)说用try-catch包v来就可以?jin),对,没错Q但是代码中到处的try-catch也挺被h诟病?strong>SAT{案
www.sats686.com

  1: void func()

  2: {

  3: //allocate a dynamic memory

  4: int *ptr = new int;

  5:

  6: throw “error”; //just an example

  7:

  8: //use ptr

  9:

  10: //release allocated memory

  11: delete ptr;

  12: ptr = NULL;

  13: }

  而且当函数有多个q回路径Ӟ需要在每个return前都要调用delete去释放资源,代码也会(x)变的不优雅了(jin)?br />
  1: void func()

  2: {

  3: //allocate a dynamic memory

  4: int *ptr = new int;

  5:

  6: if (...)

  7: {

  8: //...a

  9:

  10: //release allocated memory

  11: delete ptr;

  12: ptr = NULL;

  13: return;

  14: } else if (....)

  15: {

  16: //...b

  17:

  18: //release allocated memory

  19: delete ptr;

  20: ptr = NULL;

  21: return;

  22: }

  23:

  24: //use ptr

  25:

  26: //release allocated memory

  27: delete ptr;

  28: ptr = NULL;

  29: }

  鉴于此,我们p惛_法利用C++的一些语aҎ(gu),在函数退栈时能够局部申L(fng)动态内存自动释放掉。熟(zhn)C++的码友们都知道,当一个对象退出其定义的作用域Ӟ?x)自动调用它的析构函数。也是说如果我们在函数内定义一个局部对象,在函数返回前Q甚x异常产生Ӟq个局部对象的析构函数都会(x)自动调用。如果我们能够将释放资源的代码交付给q个对象的析构函敎ͼ我们可以实现资源的自动回收。这cL术,通常被称为RAII (初始化中获取资源)托福{案


  什么是RAII以及(qing)几个例子

  在C++{面向对象语a中,Z(jin)理局部资源的分配以及(qing)释放(resource allocation and deallocation)Q实现异常安?exception-safe)、避免内存泄露等问题QC++之父Bjarne Stroustrup发明?jin)一U叫?#8221;初始化中获取资源“ (RAII, Resource Acquisition Is InitializationQ也可以叫做Scope-Bound Resource Management)的技术。简单来_(d)它的目的是利用一个局部对象,在这个对象的构造函数内分配资源Q然后在其析构函数内释放资源。这P当这个局部对象退Z用域Ӟ它所对应的的资源卛_自动释放。在实现上,它通常有三个特点:(x)

  创徏一个特D类Q在其构造函数初甌资源;

  装目标对象Q将甌资源的目标对象作个特D类的成员变?

  在这个类的析构函数内Q释放资源?br />
  一个典型的例子是标准库中提供的模板类std::auto_ptr。如在《C++E序设计语言?《The C++ Programming Language, Special Edition? Bjarne Stroustrup著,裘宗燕译)中第327|描述?strong>SAT{案


  1: template

  2: class std::auto_ptr {

  3:

  4: public:

  5: //在构造函CQ获得目标指针的理?br />
  6: explicit auto_ptr(X *p = 0) throw() { ptr = p; }

  7: //在析构函CQ释攄标指?br />
  8: ~auto_ptr() throw() { delete ptr; }

  9:

  10: //...

  11:

  12: //重装*?>q算W,使auto_ptr对象像目标指针ptr一样?br />
  13: X& operator*() const throw() { return *ptr; }

  14: X* operator->() const throw() { return ptr; }

  15:

  16: //攑ּ对目标指针的理?br />
  17: X* release() throw() { X* t = ptr; ptr = 0; return t; }

  18:

  19: private:

  20: X *ptr;

  21: };

  惌使用它,非常单,例如

  1: #include

  2:

  3: void func()

  4: {

  5: std::auto_ptr p(new int);

  6:

  7: //use p just like ptr

  8:

  9: return;

  10: }

  另一个例子,是利用GCC中的cleanup attribute。它可以指定一个函敎ͼ在该变量退Z用域时可以执行。例如Wikipedia上提到的?br />
  1: #define RAII_VARIABLE(vartype,varname,initval,dtor) \

  2: void _dtor_ ## varname (vartype * v) { dtor(*v); } \

  3: vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)

  我们可以q样使用Q例?br />
  1: void example_usage() {

  2: RAII_VARIABLE(FILE*, logfile, fopen("logfile.txt", "w+"), fclose);

  3: fputs("hello logfile!", logfile);

  4: }

  q有一个例子,是在刘未鹏的博客文章”C++11 (?qing)现代C++风格)和快速P代式开?#8220;中的”资源理“一节中看到的,他借助C++11的std::function实现?jin)这一Ҏ(gu)。感兴趣的码友可以到他博客内阅读?br />
  W者采用的Ҏ(gu)

  对于new/deleteQ用上面提到的std::auto_ptr可以了(jin)Q但是对于new/delete[]一个动态的一l数l,甚至二维数组Qauto_ptr无能ؓ(f)力了(jin)。而且在一些项目中Q特别是一些有着(zhn)久历史的代码中Q还存在着使用malloc, newL(fng)的现象。所以笔者设计了(jin)一个auto_free_ptrc,实现目标资源的自动回收。它的实现比较简单,只利用了(jin)RAII的第三个特点——”在类的析构函数内释放资源”Q但有一个优Ҏ(gu)可以在申请堆内存代码前?strong>托福{案

  代码如下Q?br />
  1: //auto_free_ptr is only used for automation free memory

  2: template

  3: class auto_free_ptr

  4: {

  5: public:

  6: typedef enum {invalid, new_one, new_array, alloc_mem} EFLAG;

  7: auto_free_ptr() { initialize(); }

  8: ~auto_free_ptr(){ free_ptr(); }

  9:

  10: ///set the pointer needed to automatically free

  11: inline void set_ptr(T** new_ptr_address, EFLAG new_eflag)

  12: { free_ptr(); p_ptr = new_ptr_address; eflag = new_eflag; }

  13:

  14: ///give up auto free memory

  15: inline void give_up() { initialize(); }

  16:

  17: protected:

  18: inline void initialize() { p_ptr = NULL; eflag = invalid; }

  19: inline void free_ptr() throw()

  20: {

  21: if(!p_ptr || !(*p_ptr)) return;

  22:

  23: switch(eflag)

  24: {

  25: case alloc_mem: { free(*p_ptr), (*p_ptr) = NULL, p_ptr = NULL; break; }

  26: case new_one: { delete (*p_ptr), (*p_ptr) = NULL, p_ptr = NULL; break; }

  27: case new_array: { delete[] (*p_ptr),(*p_ptr) = NULL, p_ptr = NULL; break; }

  28: }

  29: }

  30:

  31: protected:

  32: T** p_ptr; //!< pointer to the address of the set pointer needed to automatically free

  33: EFLAG eflag; //!< the type of allocation

  34:

  35: private:

  36: DISABLE_COPY_AND_ASSIGN(auto_free_ptr);

  37: };
  Z(jin)使用方便Q封装两个宏Q?br />
  1: // auto-free macros are mainly used to free the allocated memory by some local variables in the internal of function-body

  2: #define AUTO_FREE_ENABLE( class, ptrName, ptrType ) \

  3: auto_free_ptr auto_free_##ptrName; \

  4: auto_free_##ptrName.set_ptr(&ptrName,auto_free_ptr::ptrType)

  5:

  6: #define AUTO_FREE_DISABLE( ptrName ) auto_free_##ptrName.give_up()

  使用h很简单,例如

  1: void func(int nLftCnt, int nRhtCnt)

  2: {

  3: if (!nLftCnt && !nRhtCnt)

  4: return;

  5:

  6: unsigned *pLftHashs = NULL;

  7: unsigned *pRhtHashs = NULL;

  8:

  9: //在申请堆内存之前Q用auto_free_ptr

  10: AUTO_FREE_ENABLE(unsigned, pLftHashs, new_array);

  11: AUTO_FREE_ENABLE(unsigned, pRhtHashs, new_array);

  12:

  13: //....

  14:

  15: if (nLftCnt)

  16: {

  17: pLftHashs = new unsigned[nLftCnt];

  18: //...a

  19: }

  20:

  21: if (nRhtCnt)

  22: {

  23: pRhtHashs = new unsigned[nRhtCnt];

  24: //...b

  25: }

  26:

  27: //....

  28:

  29: if (...)

  30: {

  31: //因ؓ(f)下面q个函数可以释放资源Q所以在它前面放弃对目标指针的管理权

  32: AUTO_FREE_DISABLE(pLftHashs);

  33: AUTO_FREE_DISABLE(pRhtHashs);

  34:

  35: //q个函数可以释放资源

  36: free_hash_arrays(pLftHashs, pRhtHashs);

  37: }

  38: }

  同样的,有时我们需要申请一个动态二l数l,所以也实现一个对应的auto_free_2D_ptr

  1: //auto_free_2D_ptr is only used for automation free memory of 2D array

  2: template

  3: class auto_free_2D_ptr

  4: {

  5: public:

  6: typedef enum {invalid, new_one, new_array, alloc_mem} EFLAG;

  7: auto_free_2D_ptr() { initialize(); }

  8: ~auto_free_2D_ptr() { free_ptr(); }

  9:

  10: ///set the pointer needed to automatically free

  11: inline void set_ptr( T** new_ptr_address,EFLAG new_eflag, int new_length_row )

  12: { free_ptr(); p_ptr = new_ptr_address; eflag = new_eflag; length_row = new_length_row; }

  13:

  14: //give up auto free memory

  15: inline void give_up() { initialize(); }

  16:

  17: protected:

  18: inline void initialize() { p_ptr = NULL; eflag = invalid; length_row = 0;}

  19: inline void free_ptr() throw()

  20: {

  21: if(!p_ptr || !(*p_ptr)) return;

  22:

  23: for(int i = 0; i < length_row; i++)

  24: {

  25: if(!(*p_ptr)[i]) continue;

  26: switch(eflag)

  27: {

  28: case alloc_mem: { free((*p_ptr)[i]); break; }

  29: case new_one: { delete (*p_ptr)[i]; break; }

  30: case new_array: { delete[] (*p_ptr)[i]; break; }

  31: }

  32: (*p_ptr)[i] = NULL;

  33: }

  34: switch(eflag)

  35: {

  36: case alloc_mem: { free((*p_ptr)); break; }

  37: default: { delete[] (*p_ptr); break; }

  38: }

  39: (*p_ptr) = NULL, p_ptr = NULL;

  40: }

  41:

  42: protected:

  43: T** p_ptr; //!< pointer to the address of the set pointer needed to automatically free

  44: EFLAG eflag; //!< the type of allocation

  45: int length_row; //!< the row length such as ptr[length_row][length_col]

  46:

  47: private:

  48: DISABLE_COPY_AND_ASSIGN(auto_free_2D_ptr);

  49: };

  50:

  51: #define AUTO_FREE_2D_ENABLE( class, ptrName, ptrType, rowNum ) \

  52: auto_free_2D_ptr auto_free_##ptrName; \

  53: auto_free_##ptrName.set_ptr(&ptrName,auto_free_2D_ptr::ptrType, rowNum)

  54:

  55: #define AUTO_FREE_2D_DISABLE( ptrName ) AUTO_FREE_DISABLE( ptrName )

  下面是个例子

  1: void func(int row, int col)

  2: {

  3: if (!row && !col)

  4: return;

  5:

  6: int **ptr = new int*[ row ];

  7: for( int r = 0; r < row; ++r ) { ptr[r] = new int[ col ];}

  8:

  9: AUTO_FREE_2D_ENABLE( int, ptr, new_array, row );

  10:

  11: //....

  12: }

  到这里就l束?jin),有些码友可能会(x)说Q何必这么麻?ch),boost内有很多指针供选择Q用share_ptr, scoped_ptr, scoped_arrayQunique_ptr, auto_ptr 中的一个不p?jin)? 没错!如果你正在开发的代码中,允许用boostQƈ且在相关E序接口l一都用指针来管理、不?x)用到源对象指针的话Q当然优先选boostQ但是当你的代码中由于历史原因,有些接口不可变更Q且new/delete, malloc/free都存在,而且依然需要用源对象指针来完成大部分工作Ӟ不妨试试我设计的q个阉割版的scoped_ptr/scoped_array。MQ根据自q实际情况来选择合适的Ҏ(gu)Q如果标准方案不适用Q就自己写一?strong>托福{案



HAOSOLA 2014-11-16 09:05 发表评论
]]>无声的视频剪辑加入应用E序http://www.shnenglu.com/haosola/archive/2014/11/16/208890.htmlHAOSOLAHAOSOLASun, 16 Nov 2014 00:55:00 GMThttp://www.shnenglu.com/haosola/archive/2014/11/16/208890.htmlhttp://www.shnenglu.com/haosola/comments/208890.htmlhttp://www.shnenglu.com/haosola/archive/2014/11/16/208890.html#Feedback0http://www.shnenglu.com/haosola/comments/commentRss/208890.htmlhttp://www.shnenglu.com/haosola/services/trackbacks/208890.html使用多媒?/strong>
C++Builder可在应用E序中加入多媒体lg。可以用组仉板Win32中的TAnimatelg或System中的TMediaPlayerlg。需要在应用E序中加入无声的视频剪辑Ӟ使用动画lg。需要把声音?或视频剪辑加入应用程序时Q用媒体播攑֙lg?br />本节讨论下列内容Q?br />· 无声的视频剪辑加入应用E序?br />· 声韛_/或视频剪辑加入应用程序?br />
无声的视频剪辑加入应用E序
使用C++Builder的动L件可把无声的视频剪辑加入应用E序?br />
要把无声的视频剪辑加入应用程序:(x)
1) 在组仉板的Win32中双击动画控g的图标。这自动把动画控g攑֜H体上欲在其中显C频剪辑的H口中?br />2) 使用对象观察?选择Name属性ƈl动L件输入一个新名字。调用动L件时用这个名字(遵@标准的C++标识W命名规则)(j)。当讄设计时属性及(qing)创徏事g处理E序ӞL直接在对象观察器中工作?br />3) 选择下列操作之一Q?br />· 选择CommonAVI属性ƈ选择下拉列表中可用的AVI?br />· 或选择FileName属性ƈ点击省略Q?..Q按钮,从本地或|络目录中选择一个可用的AVI文gQƈ在OpenAVI对话框中点击Open?br />· 或用ResName或ResID属性选择一个AVI资源。用ResHandle指定包含由ResName或ResID属性标识的资源的模块?br />q将把AVI文g载入内存。将Open属性设为true?x)把AVI剪辑的第一帧显C在屏幕上,直到使用Active属性或PlayҎ(gu)播放AVI剪辑?br />
4) 讄Repetitions属性可讄AVI剪辑播放的重复次数。若其gؓ(f)0QAVI剪辑?x)一直重复直到StopҎ(gu)被调用?br />5) 修改动画控g的其他设|。例?若要改变动画控g打开时显C的W一帧,可将StartFrame属性设为需要的帧?br />) 使用下拉列表Active属性设为true或编写事件处理程序以在运行时特定的事件发生时播放AVI剪辑。例?要在一个按钮对象被点击Ӟ应ؓ(f)按钮的OnClick事g~写事g处理E序。也可以调用PlayҎ(gu)指定播放AVI剪辑托福{案

注意若在Active属性设为true以后在修改窗体或H体中的lg,Active属性将变ؓ(f)falseQ必重新将它设为true。应仅在q行以前或在q行时做q些工作。加入无声视频剪辑的CZQ假定想要在应用E序启动时将动画徽标作ؓ(f)初始的屏q显C。在动画徽标播放完后q幅屏幕消失。要q行q个例子,先创造一个新工程q将Unit1.cpp文g保存为Frmlogo.cppQ以?qing)将Project1.bpr文g保存为Logo.bpr。然后:(x)

1) 在组仉板的Win32中双击动画lg图标?br />2) 使用对象观察?其Name属性设为Logo1?br />3) 选择其FileName属?点击省略Q?..Q按?从你?.\Examples\Coolstuf目录中选择cool.avi文g?br />
然后在OpenAVI对话框中点击Open。这把cool.avi文g载入内存?br />4) 通过点击和拖动把动画控制框放|在H体的右上角?br />5) 其Repetitions属性设? SAT{案
) 点击H体使其获得焦点q将其Name属性设为LogoForm1QCaption属性设为LogoWindow。然后减窗体的高度以便动L件放到窗体正中?br />7) 双击H体的OnActivate事gq编写下列代码以当窗体在q行时获得焦Ҏ(gu)播放AVI剪辑Q?br />
Logo1→Active = true;

8) 在组仉板Standard上双击标签控g图标。选择它的Caption属性ƈ输入“WelcometoCool Images4.0”。然后选择Font属?点击省略Q?..Q按钮ƈ从字体对话框中选择字体样式QBold,SizeQ?8,ColorQNavyQƈ单击OK。点dƈ拖动标签控g以将它放到窗体正?strong>托福{案

9) 点击动画控g使其获得焦点。双dOnStop事gq编写下列代码以当AVI文g停止时关闭窗体:(x)
LogoForm1→Close();

10) 选择RunRun执行动画徽标H口?/p>

HAOSOLA 2014-11-16 08:55 发表评论
]]>
C/C++中容器vector使用Ҏ(gu)http://www.shnenglu.com/haosola/archive/2014/09/20/208361.htmlHAOSOLAHAOSOLASat, 20 Sep 2014 07:13:00 GMThttp://www.shnenglu.com/haosola/archive/2014/09/20/208361.htmlhttp://www.shnenglu.com/haosola/comments/208361.htmlhttp://www.shnenglu.com/haosola/archive/2014/09/20/208361.html#Feedback0http://www.shnenglu.com/haosola/comments/commentRss/208361.htmlhttp://www.shnenglu.com/haosola/services/trackbacks/208361.html   [cpp] view plaincopy/*
   * file_name: vector_test.cpp
   *
   * Created on: 2014q??8?下午3:34:23
   * Author: The_Third_Wave,
   * Last modified: 2014q??8?下午3:34:23
   #include
   #include
   #include "Headers/Myfunc.h"
   #include "Headers/Person.h"
   void output(const std::vector &vec)
   // 因ؓ(f)是输?gu)不是修改,定义形参为常量引用,提高可靠?const)和效?&)!
   {
   std::cout << "size: " << vec.size()<< ", capacity: " <
   }
   int main()
   {
   std::vector vec = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
   pr_vector(vec);
   // 讉K首位元素Q原生方法之vec.front()和vec.back() 使用前一般最好做元素(g)查vec.size()
   std::cout << vec.front() << std::ends << vec.back() << std::endl;
   // 通过q代器【注?*(--vec.end())】, 使用前一般最好做元素(g)查vec.size()
   std::cout << *vec.begin() << std::ends << *(--vec.end()) << std::endl;
   auto a = vec.size(); // 让编译器自动分析表达式所属类?br />   auto b = vec.capacity(); // 不重新分配内存的话,vector可以保存多少元素
   std::cout << "size: " << a << std::ends << "capacity: " <
   vec.reserve(50); // 分配臛_能容Un个元素的内存I间
   output(vec);
   vec.shrink_to_fit(); // capacity()减少为size()相同大小
   output(vec);
   vec.reserve(50); // 分配臛_能容U?0个元素的内存I间
   // 以下d元素
   for (decltype(vec.size()) ix = 0; ix != 40; ++ix) // decltype从表辑ּcd推导出变量类?br />   {
   vec.push_back(ix*ix);
   }
   pr_vector(vec);
   output(vec); // s输出证明没超qsizeQvector׃?x)分配超额的I间
   // 我们不分配空_(d)看看自动理
   for (decltype(vec.size()) ix = 0; ix != 40; ++ix) // decltype从表辑ּcd推导出变量类?br />   {
   vec.push_back(ix*ix);
   }
   pr_vector(vec);
   output(vec); // 输出表示分配?jin)超额的I间,【测试表明:(x)分配的空间ؓ(f)当前?倍,也就意味着大浪贏V?br />   // 以下重新初始化,开始插入操作的学习(fn)【ƈ学习(fn)?qing)几U赋值的操作Ҏ(gu)?br />   std::vector vec2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 重新初始?br />   pr_vector(vec); pr_vector(vec2);
   std::swap(vec, vec2); // 【快速】交换两容器的数?swap(a, b)
   pr_vector(vec); pr_vector(vec2);
   vec2.assign(vec.begin(), vec.end()); // 参数为另外一个同cdvector的P代器
   pr_vector(vec); pr_vector(vec2);
   vec.assign({0, 0, 0, 0, 0}); // 参数为初始化列表
   pr_vector(vec);
   vec.assign(10, 1); // 替换?0?
   pr_vector(vec);
   // vector没有向头部插入数据的原生Ҏ(gu)Q只能通过insert()Ҏ(gu)来操作,插入位置都ؓ(f)指针指向的前一个位|?br />   // 具体?U?br />   // W一Uvec.insert(p, t); pw的q代器,t为需要插入的|q回gؓ(f)指向新添加元素的q代?br />   auto p = vec.insert(vec.begin() + vec.size()/2, 6688);
   // W二Uvec.insert(p, n, t); pw的q代器,插入n个tQ返回gؓ(f)指向新添加的W一个元素的q代器,如果n?Q则q回p
   vec.insert(p, 3, 4);
   // W三Uvec.insert(p, b, e); pw的q代器,b、e为同cd其他vec对象的P代器Q返回gؓ(f)指向新添加的W一个元素的q代器。范围ؓ(f)I,则返回p
   vec.insert(p, vec2.crbegin(), vec2.crend()); // const 反向q代?strong>SAT{案
   // W四Uvec.insert(p, il); pw的q代器,il为元素值列表,q回gؓ(f)指向新添加的W一个元素的q代器,列表为空Q则q回p
   vec.insert(vec.begin(), {9,8,7,6,5,4,3,2,1,0});
   pr_vector(vec);
   // 善用使用insertq回|可以实现特定位置的反复插?以上l果已说?strong>托福{案
   // emplace操作Q?【c++11】emplace_front【vector没有】、emplace、emplace_back对应push_front【vector没有】、insert、push_back
   std::vector per = {{"The_Third_Wave", 100, }}; // cd始化+vector初始化,所以{{}Q?{}}必须?br />   per.emplace_back("The_Third_Wave", 188, );
   per.emplace(per.begin() + 1, Person("The_Third_Wave", 168, ));
   for (auto &p: per)
   {
   print(std::cout, p);
   }
   // 删除操作Q注意编译器不检查元素是否存在,所以坑自己?br />   // vec.pop_back(),vector没有pop_front()
   vec = {0, 1, 2, 3, 4, 5, 6, 7, 8 ,9};
   vec.pop_back();
   pr_vector(vec);
   // vec.erase(p)【删除P代器p所指元素,q回gؓ(f)Q被删元素之后的q代器。p指向NQ返回尾后P代器Q如果p是尾后P代器Q那坑M?jin),恭??br />   vec.erase(vec.begin() + 8);
   pr_vector(vec);
   // vec.erase(b, e)【删除P代器bQe所指范围元素,q回gؓ(f)Q被删元素之后的q代器。如果e是尾后P代器Q返回的q是֐q代器,不坑Q恭??br />   vec.erase(vec.begin() + 3 , vec.end() - 1);
   pr_vector(vec);
   // vec.clear()删除所有,q回gؓ(f)void
   vec.clear();
   pr_vector(vec);
   std::cout << "上面有空行就对了(jin)!否则是出错?jin)?;
   }
   l果为:(x)
 
   [cpp] view plaincopy
   0 1 2 3 4 5 6 7 8 9
   0 9
   0 9
   size: 10 capacity: 10
   size: 10, capacity: 50
   size: 10, capacity: 10
   0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521
   size: 50, capacity: 50
   0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521
   size: 90, capacity: 100
   0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521
   0 1 2 3 4 5 6 7 8 9
   0 1 2 3 4 5 6 7 8 9
   0 1 2 3 4 5 6 7 8 9 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521
   0 1 2 3 4 5 6 7 8 9
   0 1 2 3 4 5 6 7 8 9
   0 0 0 0 0
   1 1 1 1 1 1 1 1 1 1
   9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0 4 4 4 6688 1 1 1 1 1
   0 1 2 3 4 5 6 7 8
   0 1 2 3 4 5 6 7
   0 1 2 7
   上面有空行就对了(jin)!否则是出错?jin)?img src ="http://www.shnenglu.com/haosola/aggbug/208361.html" width = "1" height = "1" />

HAOSOLA 2014-09-20 15:13 发表评论
]]>
C++q代器的两种实现方式http://www.shnenglu.com/haosola/archive/2014/08/25/208128.htmlHAOSOLAHAOSOLAMon, 25 Aug 2014 13:36:00 GMThttp://www.shnenglu.com/haosola/archive/2014/08/25/208128.htmlhttp://www.shnenglu.com/haosola/comments/208128.htmlhttp://www.shnenglu.com/haosola/archive/2014/08/25/208128.html#Feedback0http://www.shnenglu.com/haosola/comments/commentRss/208128.htmlhttp://www.shnenglu.com/haosola/services/trackbacks/208128.html  一、P代器概述
  q个标题其实有点"标题?的含义,因ؓ(f)C++在标准库中的实现q代器的方式只有一U,也就是ؓ(f)cd义beginQ)(j)和endQ)(j)函数QC++11增加?jin)range for语句Q可以用来遍历P代器中的元素。实现P代器的第二种方式Q就是用C++模拟C#和Java中的q代器模式,q且我们可以定义?gu)qforeach语句。除此之外,q代器可能还有很多种实现的方法,各个库也?x)多自己的P代器的实现有所定义Q在q里只要明白q代器的本质意义卛_?br />  q代器,也称作游标,是一U设计模式,我们可以对它q行递增Q或选择下一个)(j)来访问容器中的元素,而无需知道它内部是如何实现的?br />  很多语言提供foreach语句来访问容器中的每一个元素,其实也就是调用容器中的P代器Q抽象地来说是Q?br />  foreach Q?元素 : 容器 Q?{ … }
  上面的代码等效于Q?br />  for Q?游标=获得q代器的开_(d)获得q代器的末尾Q?游标 != q代器末; 游标Ud一个单?Q?{…} // C++ 的P代器模式
  或者:(x)
  while Q?q代器游标移动一个单位(q回是否存在下一个单位)(j)Q?{ … } // C#、Java的P代器模式Q可以用q代器。Current之类的方法返回游标所指向的元?br />  二、C++中的q代器实现方?br />  q代器其实是一个类Q要自定义一个P代器Q就要重载P代器的!=、解引用Q?Q?+q算W,以便它在range for语句中用。range for 是C++11中新增的语句Q如我们对一个集合用语句for Qauto i : collection Q?Ӟ它的含义其实为:(x)
  for Q?auto __begin = collection.beginQ)(j)Q?auto __end = collection.endQ)(j)Q?__begin != __endQ)(j)Q?++__begin Q?br />  { i = *__begin;
  … //循环?br />  }
  begin和end是集合的成员函数Q它q回一个P代器。如果让一个类可以有range for的操作,它必:(x) · 拥有begin和end函数Q它们均q回q代?· end函数q回一个指向集合末,但是不包含末օ素的|即用集合范围来表C,一个P代器的范围是 [ begin, end Q?一个左闭右开区间 对于q代器,它的要求臛_是:(x) · 必须重蝲++、!=和解引用Q?Q运符QP代器看v来会(x)像一个指?· q代器必d以通过++最后满I=条gQ这h能够l止循环
  下面l出最单的实现代码。我们定义一个CPPCollectionc,里面有个字符串数l,我们让它能够通过range for每个字W串输出来?br />  #include <IOSTREAM>
  class CPPCollection {
  public:
  class Iterator{
  public:
  int index;
  CPPCollection& outer;
  IteratorQCPPCollection &o, int iQ?: outerQoQ, indexQiQ?{ }
  void operator++Q)(j){
  index++;
  }
  std::string operator*Q)(j) const{
  return outer.str[index];
  }
  bool operator !=QIterator iQ{
  return i.index != index - 1;
  }
  };
  public:
  std::string str[10] {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
  Iterator beginQ)(j) {
  return IteratorQ?this, 0Q;
  }
  Iterator endQ)(j) {
  return IteratorQ?this, 9Q;
  }
  };
  我们定义?jin)个内部的嵌套类Iterator,qؓ(f)它重载了(jin)++?、!=q算W。由于C++中的内部嵌套cM外围的类没有联系Qؓ(f)?jin)访问外部类对象的|我们必须要传入一个引用(或指针,本例中传入引用)(j)。Iterator的自增方法其实就是增加内部的一个烦(ch)引倹{判断!=的方法是和另外一个P代器做比较,q个q代器一般是集合的末,当我们的索引g{于末尾的烦(ch)引?1Q?[begin, endQ?Q时Q认P代器已经辑ֈ?jin)末?在CPPCollectioncMQ定义了(jin)beginQ)(j)、endQ)(j)分别q回开头、结束P代器Q调用如下代码:(x)
  CPPCollection cpc;
  for Qauto i : cpcQ{
  std::cout ?i ?std::endl;
  }
  卛_遍历集合中的所有元素了(jin)?br />  在泛型算法中Qؓ(f)?jin)对集合中的每一个元素进行操作,我们通常要传入集合的q代器头、P代器,以及(qing)谓词Q例如std::find_ifQvec.beginQ)(j)Q?vec.endQ)(j)Q?…Q,q种泛型法其实是在P代器的首位反复P代,然后q行相应的行为?br />  三、模拟C#QJavaQ中的P代器实现方式
  C#和Java的P代器实现方式较ؓ(f)cMQ在q里以C#ZQ我用C++来模拟它的实现。C#中,可P代的cȝ承IEnumerable接口Q它声明?jin)一个方法GetEnumerator,q回一个P代器。P代器l承IEnumerator接口Q接口定义了(jin)MoveNextQ)(j)Ҏ(gu)Q将游标Ud一个单位,q返回是否还可以UdQResetQ)(j)Ҏ(gu)Q游标归位; Current属性:(x)q回当前游标所指向的|在C#中,Current是一个属性,Z(jin)模拟它,在C++中将它定义ؓ(f)一个函敎ͼ(j)Qƈ且用只包含抽象函数的cL模拟接口托福{案
  #define interface struct
  template <TYPENAME T>
  interface IEnumerator {
  virtual T& CurrentQ)(j) = 0;
  virtual bool MoveNextQ)(j) = 0;
  virtual void ResetQ)(j) = 0;
  virtual ~IEnumerator<T>Q)(j) { };
  };
  template <TYPENAME T>
  interface IEnumerable {
  virtual IEnumerator<T>& GetEnumeratorQ)(j) = 0;
  virtual ~IEnumerable Q)(j) { };
  };
  Z(jin)自定义一个foreach"关键?,可以用宏定义来进行P代器的等效替代:(x)
  #define foreachQitem, collectionQ?\
  auto &__item_enumerator = collection.GetEnumeratorQ)(j)Q?\
  __item_enumerator.ResetQ)(j)Q?\
  while Qitem = __item_enumerator.CurrentQ)(j)Q?__item_enumerator.MoveNextQ)(j)Q?br />  当我们用foreach的时候,宏展开自动展开用集合类collection的GetEnumeratorQ)(j)函数来获得一个P代器的引用,复位之,q将当前D予item,q代器向前移动。需要注意的是,我们在代码中不能重复定义__item_enumerator变量Q且cd一定要为auto&:auto变量不会(x)保留引用W号Q且如果不是引用Q或指针Q,?x)触发拷贝构造函敎ͼ从而失d象的多态性?如同刚才一P我们定义一个集合类Q?br />  class CSharpCollection : public IEnumerable<STD::STRING>{
  public:
  class Enumerator : public IEnumerator<STD::STRING> {
  public:
  CSharpCollection &outer; //外部c?br />  int index = 0; //下标
  Enumerator QCSharpCollection &oQ?: outerQoQ{
  }
  bool MoveNextQ)(j) override {
  index++;
  if Qindex <= 10Q?return true;
  delete this;
  return false;
  }
  void ResetQ)(j) override {
  index = 0;
  }
  std::string &CurrentQ)(j) override {
  return outer.str[index];
  }
  ~Enumerator Q)(j){
  std::cout ?"Enumerator 被析? ?std::endl;
  }
  };
  public:
  std::string str[10] {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
  IEnumerator<STD::STRING>& GetEnumeratorQ)(j) override{
  return *new EnumeratorQ?thisQ;
  }
  };
  需要注意的是,凡是体现多态性的函数Q返回值必Mؓ(f)引用或者指针,且不得ؓ(f)栈中的(f)时变量,因此我们调用完GetEnumeratorQ)(j)后,要将生成的P代器删除Q删除的代码写在?jin)MoveNextQ)(j)内,当游标不可移动的时候,q代器被删除托福{案
  以后可以用自己的foreach宏定义来遍历元素?jin)?x)
  std::string a;
  CSharpCollection csc;
  IEnumerable<STD::STRING>& refcsc = csc;
  foreach Qa , refcsc Q{
  std::cout ?a ?std::endl;
  }
  上面代码的第三行意在说明Q如果一个类中承了(jin)IEnumerablec,它一定是可P代的Q可以调用它的ResetQ)(j)、MoveNextQ)(j)、CurrentQ)(j)Q也可以用我们刚刚写的foreach来进行遍历?/p>

HAOSOLA 2014-08-25 21:36 发表评论
]]>
数据格式 int与char的存储方?/title><link>http://www.shnenglu.com/haosola/archive/2014/08/25/208126.html</link><dc:creator>HAOSOLA</dc:creator><author>HAOSOLA</author><pubDate>Mon, 25 Aug 2014 13:15:00 GMT</pubDate><guid>http://www.shnenglu.com/haosola/archive/2014/08/25/208126.html</guid><wfw:comment>http://www.shnenglu.com/haosola/comments/208126.html</wfw:comment><comments>http://www.shnenglu.com/haosola/archive/2014/08/25/208126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/haosola/comments/commentRss/208126.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/haosola/services/trackbacks/208126.html</trackback:ping><description><![CDATA[<p>有时候错误的代码?x)让我们更深ȝ理解一门编E语aQ所以在Learn c the hard way一书中Q作者不停的让我们把正确的代码破坏掉Q发挥我们的好奇?j)与惌力,d觉c语言的一些特性?br />Z(jin)弄清弄清c中int与char型变量存储的异同和gccҎ(gu)'\0'字符数组的的反应Q修改了(jin)Learn c the hard way书中的ex8<br />代码如下<br />#include <stdio.h><br />int mainQint argc,char *argv[]Q?br />{<br />int areas[] = {10, 12, 13, 14, 20};<br />char name [] = "Zed";<br />char full_name[] = {<br />'Z', 'e', 'd',<br />' ', 'A', '.', ' ',<br />'S', 'h', 'a', 'w'<br />};<br />unsigned int interg[2];<br />interg[0] = '\0' * 0x01000000 + 'A'*0x00010000 + 'B' * 0x00000100 + 'C' * 0x00000001;<br />unsigned int inter = interg[0];<br />// WARNING: On some system you may have to change the<br />// %ld in this code to a %u since it will use unsignt ints<br />printfQ?The size of an int: %ld\n",sizeofQintQ)(j)Q?br />printfQ?The siez of areas Qint[]Q:(x)%ld\n",<br />sizeofQareasQ)(j)Q?br />printfQ?The number of ints in areas: %ld\n",<br />sizeofQareasQ?sizeofQintQ)(j)Q?br />printfQ?The first area is %d, the 2nd %d.\n",<br />areas[0],areas[10]Q;<br />printfQ?The size of a char: %ld\n",sizeofQcharQ)(j)Q?br />printfQ?The size of name Qchar[]Q:(x) %ld\n",<br />sizeofQnameQ?sizeofQcharQ)(j)Q?br />printfQ?The size of full_name Qchar[]Q:(x) %ld\n",<br />sizeofQfull_nameQ)(j)Q?br />printfQ?The number of chars: %ld\n",<br />sizeofQfull_nameQ?/ sizeofQcharQ)(j)Q?br />// !!!其中full_name未设|nulll尾<br />printfQ?name=\"%s\" and full_name=\"%s\"\n",<br />name, full_nameQ;<br />// test 证明?jin)gcc把未初始化的地方初始?<br />printfQ?the char after the full_nameQshuold be errorQ:(x)%c\n",full_name[12]Q;<br />// ?int 存储字符?br />printfQ?interg=%X\n", intergQ;<br />printfQ?inter=\"%s\"\n", &interQ;<br />printfQ?interg=\"%s\"\n", intergQ;<br />return 0;<br />}<br />重点在于<br />char full_name[] = {<br />'Z', 'e', 'd',<br />' ', 'A', '.', ' ',<br />'S', 'h', 'a', 'w'<br />};<br />unsigned int interg[2];<br />interg[0] = '\0' * 0x01000000 + 'A'*0x00010000 + 'B' * 0x00000100 + 'C' * 0x00000001;<br />unsigned int inter = interg[0];<br />可以看到full_name字符串初始化的时候是没有nulll尾的,如果的vc中编译ƈ以字W串形式输出的话?x)跟上ؕ?br />interg的数l第一个元素中我分别在四个字节中放入了(jin)'\0'Q即0Q?A'?B'?C',W二个元素未初始化?br />inter中放的是同样的数字?br />输出如下Q?br />The size of an int: 4<br />The siez of areas Qint[]Q:(x)20<br />The number of ints in areas: 5<br />The first area is 10, the 2nd -1493946707.<br />The size of a char: 1<br />The size of name Qchar[]Q:(x) 4<br />The size of full_name Qchar[]Q:(x) 11<br />The number of chars: 11<br />name="Zed" and full_name="Zed A. Shaw"<br />the char after the full_nameQshuold be errorQ:(x)<br />interg=6EB11E70<br />inter="CBA"<br />interg="CBA"<br />可以看到以字W串输出的full_nameq没有因为无nulll尾而输Zؕ码或错误Q在csdn论坛上了(jin)解到可能是因为gcc字W串存储区全部初始化为零?br />PS:对于数组的初始化Q可以只初始化一个元素,可以其他元素为零QLearn c the hard wayQ;<br />inter以字W串输出的结果是按我赋值的倒序输出的,q个是因为小端的数据存储造成?strong><em><a ><font color="#ffffe8">托福{案</font></a></em></strong></p><img src ="http://www.shnenglu.com/haosola/aggbug/208126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/haosola/" target="_blank">HAOSOLA</a> 2014-08-25 21:15 <a href="http://www.shnenglu.com/haosola/archive/2014/08/25/208126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言/C++递归法http://www.shnenglu.com/haosola/archive/2014/05/30/207148.htmlHAOSOLAHAOSOLAFri, 30 May 2014 01:53:00 GMThttp://www.shnenglu.com/haosola/archive/2014/05/30/207148.htmlhttp://www.shnenglu.com/haosola/comments/207148.htmlhttp://www.shnenglu.com/haosola/archive/2014/05/30/207148.html#Feedback0http://www.shnenglu.com/haosola/comments/commentRss/207148.htmlhttp://www.shnenglu.com/haosola/services/trackbacks/207148.html  递归法也是C语言法中一个比较简单与常用的算法,本文我们来谈谈递归法Q我们首先了(jin)解一下什么是递归法Q关于递归法的概念只有一句话Q一个过E(或函敎ͼ(j)直接或间接调用自己本w,q种q程Q或函数Q叫递归q程Q或函数Q?br />  我们再来看看递归法的特点:(x)
  Q?Q?递归是在过E或函数里调用自w?br />  Q?Q?在用递归{略Ӟ必须有一个明的递归l束条gQ称为递归出口?br />  Q?Q?递归法解题通常昑־很简z,但递归法解题的运行效率较低。所以一般不提倡用递归法设计E序?br />  Q?Q?在递归调用的过E当中系lؓ(f)每一层的q回炏V局部量{开辟了(jin)栈来存储。递归ơ数q多Ҏ(gu)造成栈溢出等。所以一般不提倡用递归法设计E序?br />  再看看递归的分c:(x)
  直接递归
  E序设计中,q程或函数直接或者间接调用自己,pUCؓ(f)递归调用。子E序直接调用自己Q这UCؓ(f)直接递归Q嵌套关pȝ子程序A和B,内层的B调用外层的A,q是间接低归Q^U关pȝ子程序A和B,其中A调用?jin)B,B调用?jin)A,q也是间接递归Q不q,q种间接递归用到?前引用"的规则?br />  下面Q博LC(jin)一些有关于递归法的题目。我们看看第一个题目?br />  q是一道很l典的题目:(x)阶乘。相信大部分的h都知道什么是阶乘Q但是你如果不知道的话,不妨参见一下百度百U:(x)阶乘?br />  好了(jin)Q其实这题非常简单,我们只需要一个函数即可解决问题?br />  1 int recursiveQint iQ?br />  2 {
  3 int sum = 0;
  4 if Q? == iQ?br />  5 return Q?Q;
  6 else
  7 sum = i * recursiveQi-1Q;
  8 return sum;
  9 }
  是上面的递归函数Q这题我׃费幅讲解?jin),重点攑֜W二个例题:(x)汉诺塔问题?br />  一个庙里有三个柱子Q第一个有64个盘子,从上往下盘子越来越大。要求庙里的老和把q?4个盘子全部移动到W三个柱子上。移动的时候始l只能小盘子压着大盘子。而且每次只能Ud一个?、此时老和(后面我们叫他W一个和)(j)觉得很难Q所以他惻I(x)要是有一个h能把?3个盘子先Ud到第二个柱子上,我再把最后一个盘子直接移动到W三个柱子,再让那个人把刚才的前63个盘子从W二个柱子上Ud到第三个柱子上,我的d完成了(jin)Q简单。所以他找了(jin)比他q轻的和(后面我们叫他W二个和)(j)Q命令:(x)
  ① 你把?3个盘子移动到W二柱子?strong>托福{案
  ② 然后我自己把W?4个盘子移动到W三个柱子上?br />  ③ 你把?3个盘子移动到W三柱子?br />  2、第二个和尚接了(jin)dQ也觉得很难Q所以他也和W一个和一hQ要是有一个h能把?2个盘子先Ud到第三个柱子上,我再把最后一个盘子直接移动到W二个柱子,再让那个人把刚才的前62个盘子从W三个柱子上Ud到第三个柱子上,我的d完成了(jin)Q简单。所以他也找?jin)比他年ȝ和尚Q后面我们叫他第三和)(j)Q命令:(x)
  ① 你把?2个盘子移动到W三柱子?br />  ② 然后我自己把W?3个盘子移动到W二个柱子上?br />  ③ 你把?2个盘子移动到W二柱子?br />  3、第三个和尚接了(jin)dQ又把移动前61个盘子的d依葫芦话瓢的交给?jin)第四个和尚Q等{递推下去Q直到把d交给?jin)?4个和ؓ(f)止(估计W?4个和很郁闷Q没Z(x)也命令下别hQ因为到他这里盘子已l只有一个了(jin)Q?br />  4、到此Q务下交完成,到各司其职完成的时候了(jin)。完成回推了(jin)Q?br />  W?4个和移动第1个盘子,把它UdQ然后第63个和移动他l自己分配的W?个盘子?br />  W?4个和再把第1个盘子移动到W?个盘子上。到q里W?4个和的d完成Q第63个和完成了(jin)W?2个和交l他的Q务的W一步?br />  从上面可以看出,只有W?4个和的d完成?jin),W?3个和的d才能完成Q只有第2个和?---W?4个和的d完成后,W?个和的d才能完成。这是一个典型的递归问题?现在我们以有3个盘子来分析Q?br />  W?个和命令:(x)
  ① W?个和你先把W一柱子?个盘子移动到W二柱子。(借助W三个柱子)(j)
  ② W?个和我自己把第一柱子最后的盘子Ud到第三柱子?br />  ③ W?个和你把前2个盘子从W二柱子Ud到第三柱子?br />  很显?dng)W二步很Ҏ(gu)实现托福{案
  其中W一步,W?个和他?个盘子,他就命o(h)Q?br />  ① W?个和你把第一柱子W?个盘子移动到W三柱子。(借助W二柱子Q?br />  ② W?个和我自己把第一柱子W?个盘子移动到W二柱子上?br />  ③ W?个和你把第1个盘子从W三柱子Ud到第二柱子?br />  同样Q第二步很容易实玎ͼ但第3个和他只需要移?个盘子,所以他也不用在下派d?jin)。(注意Q这是停止递归的条Ӟ也叫边界|(j)
  W三步可以分解ؓ(f)Q第2个和还是有2个盘子,命o(h)Q?br />  ① W?个和你把第二柱子上的第1个盘子移动到W一柱子?br />  ② W?个和我把第2个盘子从W二柱子Ud到第三柱子?br />  ③ W?个和你把第一柱子上的盘子Ud到第三柱子?br />  分析l合h是Q?→3 1→2 3→2 借助W三个柱子移动到W二个柱?|1→3 | 2→1 2→3 1→3借助W一个柱子移动到W三个柱子|共需要七步?br />  如果?个盘子,则第一个和的命o(h)中第1步和W?步各?个盘子,所以各需?步,?4步,再加上第1个和的1步,所?个盘子d需要移?+1+7=15步,同样Q?个盘子需?5+1+15=31步,6个盘子需?1+1+31=64?#8230;…由此可以知道Q移动n个盘子需要(2的nơ方Q?1步?br />  从上面整体综合分析可知把n个盘子从1座(相当W一柱子Q移?座(相当W三柱子Q:(x)
  Q?Q把1座上Qn-1Q个盘子借助3座移?座?br />  Q?Q把1座上Wn个盘子移?座?br />  Q?Q把2座上Qn-1Q个盘子借助1座移?座?br />  下面用hanoiQn,a,b,cQ表C把1座n个盘子借助2座移动到3座?br />  很明显:(x) Q?Q步上是 hanoiQn-1,1,3,2Q?Q?Q步上是 hanoiQn-1,2,1,3Q?br />
  用C语言表示出来Q就是:(x)
  1 #include <stdio.h>
  2 int methodQint n,char a, char bQ?br />  3 {
  4 printfQ?number%dform%cto%c"n",n,a,bQ;
  5 return 0;
  6 }
  7 int hanoiQint n,char a,char b,char cQ?br />  8 {
  9 ifQ?n==1 Q?move Q?,a,cQ;
  10 else
  11 {
  12 hanoiQn-1,a,c,bQ;
  13 moveQn,a,cQ;
  14 hanoiQn-1,b,a,cQ;
  15 };
  16 return 0;
  17 }
  18 int mainQ)(j)
  19 {
  20 int num;
  21 scanfQ?%d",&numQ;
  22 hanoiQnum,'A','B','C'Q;
  23 return 0;
  24 }
  q就是递归法Q其实,在C语言中,递归法比枚举法q要实用Q但是这两种法都很单?/p>

HAOSOLA 2014-05-30 09:53 发表评论
]]>
C++二维数组动态内存分?/title><link>http://www.shnenglu.com/haosola/archive/2014/05/28/207135.html</link><dc:creator>HAOSOLA</dc:creator><author>HAOSOLA</author><pubDate>Wed, 28 May 2014 12:29:00 GMT</pubDate><guid>http://www.shnenglu.com/haosola/archive/2014/05/28/207135.html</guid><wfw:comment>http://www.shnenglu.com/haosola/comments/207135.html</wfw:comment><comments>http://www.shnenglu.com/haosola/archive/2014/05/28/207135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/haosola/comments/commentRss/207135.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/haosola/services/trackbacks/207135.html</trackback:ping><description><![CDATA[<p>  对于二维数组和二l指针的内存的分?br />  q里首选说一下一l指针和一l数l的内存分配情况?br />  一l_(d)(x)<br />  数组QŞ如int a[5];q里定义?jin)一个一l数la,q且数组的元素个数是5,q里的a是这五个元素的整体表C,也就是通过a我们能找到这五个元素。注意:(x)a是代表数l第一个元素的首地址?amp;a是代表数l的地址Q虽然它们的值相同?br />  指针Q?int *p = NULL;q里p是一个指针,它指向的是计?br />  机内一块存储intcd的内存。P = a;是让p{于刚才甌的数l的W一个元素的地址。所以通过p我们也能扑ֈ?个元素所以P[i]跟a[i]的作用一栗?br />  注意Q?br />  1:int *p = NULL; p的大在32位机器是4,即p=a;之后p的sizeofQpQ仍然等?.<br />  2:在声明之后,数组必须分配内存q行初始化。而指针一般是动态分配其指向的内存?br />  3:不要h指针和数l,指针是指针Q数l就是数l,只是数组在一定条件下可以转换成指针。不要将指针和数l؜淆。(例如Q指针有++,--操作Q数l则不可以)(j)?br />  一l指针的动态内存分配:(x)<br />  int *p = NULL;<br />  p = new int[N];<br />  千万别忘?jin)delete<br />  delete [] p;<br />  p = NULL;<br />  二维数组的内存分?br />  int a[2][3]; q里分配?jin)一?X3=6个int大小的数l。二l数l的W二个维?不能省略?br />  二维数组的内存在计算机内也是q箋的一片地址Q只不过?个元素构成一个一l数la[i],q里的a[i]代表l度?的数l的W一个元素的地址。所以a[i][j]的访问跟a[i]的访问也清楚了(jin)。这里的a[i]其实是一个一l数l的W一个元素的地址?br />  对于二维数组做实参,我们通常用一l指针处理,例如Q?br />  1 #include<br />  2 void testQint *pQ?br />  3 {<br />  4 for Qint i = 0;i<3;++iQ?br />  5 {<br />  6 forQint j = 0;j<3;++jQ?br />  7 {<br />  8 std::cout?Qp+3*i+jQ; //一l处?br />  9 }<br />  10 }<br />  11 }<br />  12 int mainQvoidQ?br />  13 {<br />  14 int a[3][3]={1,2,3,4,5,6,7,0,0};<br />  15 testQ(int*QaQ; //二l数l当做一l处?br />  16 systemQ?pause"Q;<br />  17 return 0;<br />  18 }<br />  q些惛_书上讲的都非常清楚?br />  二维数组的C++动态内存分配?br />  二维指针的动态数l分配:(x)二维指针cM指针数组的分?br />  int **p;<br />  1 #include<br />  2 int mainQvoidQ?br />  3 {<br />  4 int **p = NULL; //q里甌一?x4的二l数l?br />  5 p = new int *[3]; //分配一l指针,分配三个int* cd的一l指针?br />  6 for Qint i = 0;i < 3; ++iQ?br />  7 {<br />  8 p[i] = new int[4];<br />  9 }<br />  10 for Qint i = 0; i < 3; ++iQ?br />  11 {<br />  12 forQint j = 0; j < 4 ; ++jQ?br />  13 {<br />  14 p[i][j] = i*j;<br />  15 std::cout<<br />  26 return 0;<br />  27 }<br />  指针数组的动态内存分?br />  指针数组的动态内存分配只需要对指针数组的数l元素指针分别分配内存即可,比二l指针的分配了(jin)一个环节?br />  1 #include<strong><em><a ><font color="#ffffdf" size="2">托福{案</font></a></em></strong><br />  2 int mainQvoidQ?br />  3 {<br />  4 int *a[3]; //甌含有三个int* cd的指针数l?br />  5 //跟二l指针不同的是,q里数组a不用手动甌内存<br />  6 for Qint i = 0;i < 3;++iQ?//甌一?x4的空?br />  7 {<br />  8 a[i] = new int[4];<br />  9 }<br />  10 for Qint i = 0; i<3 ;++iQ?br />  11 {<br />  12 for Qint j = 0; j<4; ++jQ?br />  13 {<br />  14 a[i][j] = i*j;<br />  15 std::cout<<br />  25 return 0;<br />  26 }<br />  数组指针的动态内存分?br />  数组指针是指向数组的指针,说白?jin)就是指向一个数l整体,因此分配的时候直接申请一片内存地址卛_。跟二维数组的静(rn)态分配类伹{?br />  1 // Karllen<br />  2 int mainQvoidQ?br />  3 {<br />  4 int Q?aQ[4]; //q里?是第二维的维度,a的增量的基数?个int<br />  5 a = new int[3][4];<br />  6 delete []a;<br />  7 a = NULL;<br />  8 return 0;<br />  9 }</p><img src ="http://www.shnenglu.com/haosola/aggbug/207135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/haosola/" target="_blank">HAOSOLA</a> 2014-05-28 20:29 <a href="http://www.shnenglu.com/haosola/archive/2014/05/28/207135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++混合~程--extern “C?使用Ҏ(gu)详解http://www.shnenglu.com/haosola/archive/2014/04/26/206722.htmlHAOSOLAHAOSOLASat, 26 Apr 2014 05:45:00 GMThttp://www.shnenglu.com/haosola/archive/2014/04/26/206722.htmlhttp://www.shnenglu.com/haosola/comments/206722.htmlhttp://www.shnenglu.com/haosola/archive/2014/04/26/206722.html#Feedback0http://www.shnenglu.com/haosola/comments/commentRss/206722.htmlhttp://www.shnenglu.com/haosola/services/trackbacks/206722.html  其实在网上关于这个问题已l讨论很多了(jin)Q但是大多都是重复的Q确实讲解的很详l,q指Z(jin)怎么用是错误的,本来记忆׃怎么P所以对于记忆这些错误的用法更是讨厌Q还不如记忆一U通用的而且比较规范、代码阅读v来比较舒适的Ҏ(gu)Q下面我们开始吧Q!Q?br />  C、C++密不可分Q^时用更多的是C,但有时候却不?jin)C++,而且是C、C++hQ؜合编E)(j)在一L(fng)Q比如,RTP视频传输Qlive555多媒体播攄都是C++下的Q他需要调用JRTPLIB库,再比如,我那邮g发送,我也用C++写的Q定义了(jin)一个Email对象Q包含了(jin)成员Q收发邮件地址Q用户名Q密码等Q以?qing)方法?x)邮g头、Base64~码和邮件发送这些操作,很好用,所以,很多时候,C++q是蛮不错的…但,*.c?.cpp文gh在一P不是那么的简单,.
  一、extern"C"的作用(最重点Q?br />  1. extern "C"的真实目的是实现cC和C++的؜合编E。extern "C"是由C++提供的一个连接交换指定符P用于告诉C++q段代码是C函数。extern "C"后面的函C使用的C++的名字修饎ͼ而是用C.q是因ؓ(f)C++~译后库中函数名?x)变得很长,与C生成的不一_(d)造成C++不能直接调用C函数托福{案
  2.C++语言支持函数重蝲QC语言不支持函数重载。函数被C++~译后在库中的名字与C语言的不同。假设某个函数的原型为:(x)void fooQint x, int yQ;该函数被C~译器编译后在库中的名字为_foo,而C++~译器则?x)生像_foo_int_int之类的名字。C++提供?jin)Cq接交换指定W号extern"C"来解军_字匹配问题?br />  3.被extern "C"限定的函数或变量是externcd的;extern是C/C++语言中表明函数和全局变量作用范围Q可见性)(j)的关键字Q该关键字告诉编译器Q其声明的函数和变量可以在本模块或其它模块中使用。被extern "C"修饰的变量和函数是按照C语言方式~译和连接的雅思答?/font>
  4.与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块用时Q其不可能被extern "C"修饰?br />  二、extern"C"与__cplusplus
  #ifdef __cplusplus
  extern "C" {
  #endif
  #ifdef __cplusplus
  }
  #endif
  CplusplusQC plus plusQ即"C++",用于C++文档的头文g中,上面代码的意思是Q如果是C++文gQ?.cppQ后~Q则使用extern "C",在C++目中应用的非常q泛。即使用gcc~译器编译,函数名ؓ(f)Ccd如_foo.个h认ؓ(f)Q搞懂了(jin)q两个关键字Q尤其是理解extern "C"
  extern "C" 是ؓ(f)?jin)C与C++混合~程而设立的关键字,假如你已l知道了(jin)关于extern "C" 的一些用方法,惛_快掌握用策略,下面从两个角度说明:(x)
  1Q在C++E序中调用CE序Q比如在CPP文g中用C文g的某一个函敎ͼ那么可以肯定的是所使用的函数肯定是按照C语言的编译方式编译,那么仅仅通告CPP文g按照C语言调用函数的方式调用即可,而且不用再重新编译C函数Q在函数所在头文g中添加extern "C"关键字,这个头文g包含到CPP文g卛_。也是如下所C:(x)
  #ifdef __cplusplus
  extern "C" {
  #endif
  /*… 函数声明*/
  #ifdef __cplusplus
  }
  #endif
  E微举例说明一下:(x)
  ?
  // cheader.h
  #ifndef _C_HEADER_
  #define _C_HEADER_
  #ifdef __cplusplus
  extern "C" {
  #endif
  #include <STDIO.H>
  #include <STDLIB.H>
  int addQint a,int bQ;
  #ifdef __cplusplus
  }
  #endif
  #endif
  // cfunc.c
  //#include "header.h"
  int addQint a,int bQ?br />  {
  return a+b;
  }
  //main.cpp
  #include <IOSTREAM>
  #include "header.h"
  using namespace std;
  int mainQ)(j)
  {
  int a,b=0;
  b= addQ?,3Q;
  cout《B《ENDL; pre < } 0; return><BR>
  ׃。c文g中的函数是按照C语言~译方式q行~译的,所以不包括头文件也是可以的Q但是在头文件声明的时候必进行说明,因ؓ(f)在CPP文g中包括的q个头文件会(x)按照C语言的方式查扑և敎ͼ不然׃(x)按照C++的方式查扑և数add<BR>
  <P><STRONG>2Q在CE序中用CPP~译的函敎ͼq样需要重新编译函数库Q在函数声明的头文g中也是如上声明,然后再函数所在的CPP文gd上述头文Ӟ直接~译卛_Q这个时候虽说在CPP文g~译Q但是是安装C语言的方式编译,在C文g中同h加上q头文g卛_?lt;/STRONG></P>
  <P><STRONG>E微举例说明一下:(x)</STRONG></P>
  <P><STRONG></STRONG></P>
  <PRE class=brush:java;>// cheader.h头文?br />  #ifndef _C_HEADER_
  #define _C_HEADER_
  #ifdef __cplusplus
  extern "C" {
  #endif
  #include <STDIO.H>
  #include <STDLIB.H>
  int subQint a,int bQ;
  #ifdef __cplusplus
  }
  #endif
  #endif
  //cppsub.cpp
  #include "header.h"
  int subQint a,int bQ?br />  {
  return a-b;
  }
  /*但是如果头文g的那一行注释掉Q也?x)在q接时出错,因ؓ(f)在头文g中已l说明用C语言的方式编译,但是不说明这一点,?x)用C++~译方式q行
  如果不想使用头文Ӟ那么可以int subQint a,int bQ?换ؓ(f) extern "C" int subQint a,int bQ?,但是extern "C"在。c文g时不可以出现*/
  //cmain.c
  #include "header.h"
  int mainQ)(j)
  {
  int a=0,b=0;
  b = subQ?,3Q;
  printfQ?b is %d\r\n",a,bQ;
  return 0;
  }
  </PRE>
  但是在用的时候也是有一定的规范的:(x)<BR>
  //C++头文?cppExample.h<BR>
  #ifndef CPP_EXAMPLE_H<BR>
  #define CPP_EXAMPLE_H<BR>
  extern "C" int addQ?int x, int y Q;<BR>
  #endif
  <BR>
  //C++实现文g cppExample.cpp<BR>
  #include "cppExample.h"<BR>
  int addQ?int x, int y Q?lt;BR>
  {<BR>
  return x + y;<BR>
  }
  <BR>
  /* C实现文g cFile.c<BR>
  /* q样?x)编译出错?x)#include "cExample.h" */<BR>
  extern int addQ?int x, int y Q;<BR>
  int mainQ?int argc, char* argv[] Q?lt;BR>
  {<BR>
  addQ?2, 3 Q; <BR>
  return 0;<BR>
  }
  note: 如果 cppEample.h Ҏ(gu)Q?br />  #ifndef CPP_EXAMPLE_H<BR>
  #define CPP_EXAMPLE_H
  #ifdef __cplusplus
  extern "C" {
  #endif
  <BR>
  int addQ?int x, int y Q;
  #ifdef __cplusplus
  }
  #endif
  <BR>
  #endif
  则在 C 文g?#include "cExample.h" ׃?x)报错?jin)?br />  MQ?无论?c q是 c++头文Ӟ只要是想以后混合~程Q就最好加?br />  #ifdef __cplusplus
  extern "C" {
  #endif
  /**** some declaration or so *****/
  #ifdef __cplusplus
  }
  #endif /* end of __cplusplus */<BR>
  错误的原因在于在C语言中没有关键字 extern "C"<BR>
  QPS:有的Z(x)单独使用extern "C" 来修饰某个函敎ͼ我觉得不是很好看Q特别是在头文g中不能这么用,因ؓ(f)在C文g中不能出现这L(fng)关键字,所以最好用最后介l的条g~译 在一定条件下才?extern "C"Q?lt;BR>
  <P></P>
  <PRE class=brush:java;><PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE>
  <PRE class=brush:java;></PRE> </PRE>



HAOSOLA 2014-04-26 13:45 发表评论
]]>
printf()格式化输?gu)?/title><link>http://www.shnenglu.com/haosola/archive/2014/04/08/206503.html</link><dc:creator>HAOSOLA</dc:creator><author>HAOSOLA</author><pubDate>Tue, 08 Apr 2014 08:26:00 GMT</pubDate><guid>http://www.shnenglu.com/haosola/archive/2014/04/08/206503.html</guid><wfw:comment>http://www.shnenglu.com/haosola/comments/206503.html</wfw:comment><comments>http://www.shnenglu.com/haosola/archive/2014/04/08/206503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/haosola/comments/commentRss/206503.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/haosola/services/trackbacks/206503.html</trackback:ping><description><![CDATA[<p>  % - 0 m.n l或h 格式字符<br />  下面对组成格式说明的各项加以说明Q?br />  ①%:表示格式说明的v始符P不可~少?br />  ②-:?表示左对齐输出,如省略表C右寚w输出?br />  ③0:?表示指定IZ?,如省略表C指定空位不填?br />  ④m.n:m指域宽,卛_应的输出在输出讑֤上所占的字符数。N指精度。用于说明输出的实型数的数位数。对数值型的来_(d)未指定nӞ隐含的精度ؓ(f)n=6位?br />  ⑤l或h:lҎ(gu)型指long型,对实型指double型。h用于整型的格式字符修正为short型?br />  ---------------------------------------<br />  格式字符<br />  格式字符用以指定输出的数据cd和输出格式?br />  ①d格式Q用来输出十q制整数。有以下几种用法Q?br />  %d:按整型数据的实际长度输出?br />  %md:m为指定的输出字段的宽度。如果数据的位数于m,则左端补以空|若大于m,则按实际位数输出?br />  %ld:输出长整型数据?br />  ②o格式Q以无符号八q制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度?%mo"格式输出?br />  例:(x)<br />  mainQ)(j)<br />  { int a = -1;<br />  printfQ?%d, %o", a, aQ;<br />  }<br />  q行l果Q?1,177777<br />  E序解析Q?1在内存单元中Q以补码形式存放Qؓ(f)Q?111111111111111Q?,转换为八q制Cؓ(f)Q?77777Q?.<br />  ③x格式Q以无符号十六进制Ş式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度?%mx"格式输出?br />  ④u格式Q以无符号十q制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度?%mu"格式输出?br />  ⑤c格式Q输Z个字W?br />  ⑥s格式Q用来输Z个串。有几中用法<br />  %s:例如QprintfQ?%s", "CHINA"Q输?CHINA"字符Ԍ不包括双引号Q?br />  %ms:输出的字W串占m列,如字W串本n长度大于m,则突破获m的限Ӟ字W串全部输出。若串长于m,则左补空根{?br />  %-ms:如果串长于m,则在m列范围内Q字W串向左靠,双I格?br />  %m.ns:输出占m列,但只取字W串中左端n个字W。这n个字W输出在m列的右侧Q左补空|注意Q如果n未指定,默认?.<br />  %-m.ns:其中m、n含义同上Qn个字W输出在m列范围的左侧Q右补空根{如果n>m,则自动取n|即保证n个字W正常输出,注意Q如果n未指定,默认?.<br />  如果是sprintfQdesc, "%m.ns", sourQ; 如果descI间够的话,?x)?m.ns ?的结自动补null字符Q不同于strncpy.<br />  例如 :sprintfQdesc, "%.3s", "123456"Q; desc如果I间>=4字节的话Q第4个字节将是null字符?br />  ⑦f格式Q用来输出实敎ͼ包括单、双_ֺQ,以小数Ş式输出。有以下几种用法Q?br />  %f:不指定宽度,整数部分全部输出q输?位小数?br />  %m.nf:输出共占m列,其中有n位小敎ͼ如数值宽度小于m左端补空根{?br />  %-m.nf:输出共占n列,其中有n位小敎ͼ如数值宽度小于m右端补空根{?br />  ⑧e格式Q以指数形式输出实数。可用以下Ş式:(x)<br />  %e:数字部分Q又U尾敎ͼ(j)输出6位小敎ͼ指数部分?位或4位?br />  %m.ne?-m.ne:m、n?-"字符含义与前相同。此处n指数据的数字部分的小C敎ͼm表示整个输出数据所占的宽度?br />  ⑨g格式Q自动选f格式或e格式中较短的一U输出,且不输出无意义的零?br />  ---------------------------------------<br />  关于printf函数的进一步说明:(x)<br />  如果惌出字W?%",则应该在"格式控制"字符串中用连l两?表示Q如Q?br />  printfQ?%f%%", 1.0/3Q;<br />  输出0.333333%.<br />  ---------------------------------------<br />  对于单精度数Q?f格式W输出时Q仅?位是有效数字Q小?位?br />  对于双精度数Q?lf格式W输出时Q前16位是有效数字Q小?位?br />  ------------------------------------------------------------------<br />  printfQ)(j)函数是格式输出函敎ͼhprintfQ)(j)打印变量的指令取决与变量的类型。例如,在打印整数是使用%dW号Q在打印字符??c W号。这些符可UCؓ(f)转换说明。因为它们指定了(jin)如何不数据{换成可显C的形式。下列列出的是ANSI C标准printfQ)(j)提供的各U{换说明?br />  转换说明?qing)作为结果的打印输?a 点数、十六进制数字和p-记数法(C99Q?br />  %A 点数、十六进制数字和p-记法QC99Q?br />  %c 一个字W?br />  %d 有符号十q制整数<br />  %e 点数、e-记数?br />  %E 点数、E-记数?br />  %f 点数、十q制记数?br />  %g Ҏ(gu)数g同自动选择%f?e.<br />  %G Ҏ(gu)数g同自动选择%f?e.<br />  %i 有符号十q制敎ͼ?d相同Q?br />  %o 无符号八q制整数<br />  %p 指针<br />  %s 字符?br />  %u 无符号十q制整数<br />  %x 使用十六q制数字0f的无W号十六q制整数<br />  %X 使用十六q制数字0f的无W号十六q制整数<br />  %% 打印一个百分号<br />  //q有一个特D的格式%*.* ,q两个星L(fng)值分别由W二个和W三个参数的值指?printfQ?%.*s \n", 8, "abcdefgggggg"Q;<br />  printfQ?%*.*f \n", 3,3, 1.25456fQ;使用printf Q)(j)函数 printfQ)(j)的基本Ş式:(x) printfQ?格式控制字符?,变量列表Q;#include<cstdio>int mainQ)(j)<br />  {<br />  //for int<br />  int i=30122121;<br />  long i2=309095024l;<br />  short i3=30;<br />  unsigned i4=2123453; printfQ?%d,%o,%x,%X,%ld,%hd,%u\n",i,i,i,i,i2,i3,i4Q;//如果是:(x)%l,%h,则输不出l果<br />  printfQ?%d,%ld\n",i,i2Q;//试验不出%ld?d之间的差别,因ؓ(f)long?bytes <strong><em><a ><font color="#ffffec">www.yztrans.com</font></a></em></strong> <br />  printfQ?%hd,%hd\n\n\n",i,i3Q;//试验?hd?d之间的差别,因ؓ(f)short?bytes<br />  //for string and char<br />  char ch1='d';<br />  unsigned char ch2=160;<br />  char *str="Hello everyone!";<br />  printfQ?%c,%u,%s\n\n\n",ch1,ch2,strQ;//unsigned char过128的没有字W对?br />  //for float and double,unsigned and signed can not be used with double and float<br />  float fl=2.566545445F;//or 2.566545445f<br />  double dl=265.5651445; <strong><em><a ><font color="#ffffec">www.jamo123.com</font></a></em></strong> <br />  long double dl2=2.5654441454;<br />  //%g没有e格式Q默?位包括小数点前面的数Q?br />  //%f没有e格式Q默?位仅只小数点后面包含6?br />  //%e采用e格式Q默?位ؓ(f)转化后的数点后面的6?br />  printfQ?%f,%e,%g,%.7f\n",fl,dl,dl,dlQ;<br />  printfQ?%f,%E,%G,%f\n",fl,dl,dl,dlQ;//%F is wrong<br />  printfQ?%.8f,%.10e\n",fl,dlQ;<br />  printfQ?%.8e,%.10f\n\n\n",fl,dlQ;<br />  //for point<br />  int *iP=&i;<br />  char *iP1=new char;<br />  void *iP2;//dangerous!<br />  printfQ?%p,%p,%p\n\n\n",iP,iP1,iP2Q;<br />  //其他知识Q负P表示左对齐(默认是右寚wQ;%6.3,6表示宽度Q?表示_ֺ<br />  char *s="Hello world!";<br />  printfQ?:%s: \n:%10s: \n:%.10s: \n:%-10s: \n:%.15s: \n:%-15s: \n:%15.10s: \n:%-15.10s:\n\n\n",<br />  s,s,s,s,s,s,s,sQ; double ddd=563.908556444;<br />  printfQ?:%g: \n:%10g: \n:%.10g: \n:%-10g: \n:%.15g: \n:%-15g: \n:%15.10g: \n:%-15.10g:\n\n\n",<br />  ddd,ddd,ddd,ddd,ddd,ddd,ddd,dddQ;<br />  //q有一个特D的格式%*.* ,q两个星L(fng)值分别由W二个和W三个参数的值指?printfQ?%.*s \n", 8, "abcdefgggggg"Q;<br />  printfQ?%*.*f \n", 3,3, 1.25456fQ; return 0;<br />  }</p><img src ="http://www.shnenglu.com/haosola/aggbug/206503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/haosola/" target="_blank">HAOSOLA</a> 2014-04-08 16:26 <a href="http://www.shnenglu.com/haosola/archive/2014/04/08/206503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.fvxg.cn" target="_blank">þۺɫHEZYO</a>| <a href="http://www.rrthhz.cn" target="_blank">þAVһ</a>| <a href="http://www.geyr.cn" target="_blank">ƷþþþþӰԺ</a>| <a href="http://www.jiqirenedu.cn" target="_blank">ٸ߳ҽоþþþþ</a>| <a href="http://www.jhyjpj.cn" target="_blank">þþƷɧ</a>| <a href="http://www.sooppp.cn" target="_blank">Ʒþþþþ֣ݹ˾ </a>| <a href="http://www.taibeitengxun.cn" target="_blank">ƷŮþøվ</a>| <a href="http://www.pianjuan.cn" target="_blank">޳˾þ</a>| <a href="http://www.baodecai.cn" target="_blank">þþƷþý </a>| <a href="http://www.zhtdkh.cn" target="_blank">þþùƷ</a>| <a href="http://www.yunfengxuandk.cn" target="_blank">þþþþþ97</a>| <a href="http://www.huishou399.cn" target="_blank">97Ʒ˾þô߽</a>| <a href="http://www.wnlv.cn" target="_blank">ݺɫۺվþþþþþø </a>| <a href="http://www.study1.cn" target="_blank">Ʒþ¶</a>| <a href="http://www.tgl999.cn" target="_blank">ŷ˼Ծþ</a>| <a href="http://www.smtch.cn" target="_blank">ƷۺϾþ</a>| <a href="http://www.lnboxue.cn" target="_blank">޾Ʒþþþ</a>| <a href="http://www.97xxri.cn" target="_blank">վþþ</a>| <a href="http://www.pandingo.cn" target="_blank">ƷŮþþþavˬ </a>| <a href="http://www.tvhhm.cn" target="_blank">þ99Ʒþ99</a>| <a href="http://www.xuwonline.cn" target="_blank">vaþþþ</a>| <a href="http://www.sfsqw.cn" target="_blank">þþƷ</a>| <a href="http://www.sinaer.cn" target="_blank">ĻƷѾþ5151 </a>| <a href="http://www.fcsyx.cn" target="_blank">Ʒһþ㽶߿ </a>| <a href="http://www.168lala.cn" target="_blank">91þþƷ˾þ</a>| <a href="http://www.35zz.cn" target="_blank">þҹɫƷ鶹</a>| <a href="http://www.lady8.cn" target="_blank">þþþavӰ</a>| <a href="http://www.pz851.cn" target="_blank">þùɫAVѿ</a>| <a href="http://www.dnf530.cn" target="_blank">˾þô߽ۺĻ</a>| <a href="http://www.beo.net.cn" target="_blank">˾þô߽Ʒ</a>| <a href="http://www.qvella.cn" target="_blank">þþƷһ</a>| <a href="http://www.xldgdq.cn" target="_blank">þþþþþþþ</a>| <a href="http://www.t6s.com.cn" target="_blank">þþƷަvDz</a>| <a href="http://www.jiqirenedu.cn" target="_blank">þɧ</a>| <a href="http://www.liopenfactory.com.cn" target="_blank">˾Ʒþۺ</a>| <a href="http://www.lyrisme.cn" target="_blank">þþƷУСŮ</a>| <a href="http://www.gkvw.cn" target="_blank">999Ʒþþþþ</a>| <a href="http://www.6922215.cn" target="_blank">һһþAþۺϾƷ </a>| <a href="http://www.vanblog.cn" target="_blank">þùŮѹۿƷ</a>| <a href="http://www.vfmg.cn" target="_blank">þþþþԻAV</a>| <a href="http://www.ulpj.cn" target="_blank">91Ʒۿ91þþþþ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>