你渴望力量吗?

冷知识,盲点,错误。会续更。



1最简单的随机数生成法,线性同余法。

c的标准库(cstdlib)提供了个用于生产随机数的函数。

rand()随机函数,返回-32767的随机值,该函数没有参数

srandnumber)种子函数,要求一个无符号整形参数置随机数生成器的启动值

为了使种子值(number)可变,通草用系统时间作为srand函数的参数,替么函数在ctime文件中定义。

 

time()时间函数,用作为参数时,返回用整形数表示的系统当前时间。

 

 

2C语言中exiexit(0)exit(1)有什么区别??

 

exit好象在stdio.h里面,所以要有包含头文件

return是返回函数调用,如果返回的是main函数,则为退出程序

exit是在调用处强行退出程序,运行一次程序就结束

-------------------------------------------------------------------

return 是返回 函数返回

 

exit是退出

-------------------------------------------------------------------

exit(1)表示异常退出.这个1是返回给操作系统的不过在DOS好像不需要这个返回值

exit(0)表示正常退出

-------------------------------------------------------------------

无论写在那里,都是程序推出,doswindows中没有什么不一样,最多是系统处理的不一样。

数字0,1,-1会被写入环境变量ERRORLEVEL,其它程序可以由此判断程序结束状态。

一般0为正常推出,其它数字为异常,其对应的错误可以自己指定。

-------------------------------------------------------------------

返回给操作系统的,0是正常退出,其他值是异常退出,在退出前可以给出一些提示信息,或在调试程序中察看出错原因.

都是转交执行权给操作系统,不同的是执行后一个返回0操作系统,另一个返回1,并且可以通过对返回值的检查获知程序是否正常结束。

区别就在于告诉系统程序是正常退出还是非正常退出,但都是退出没什么大关系。

利用退出程序后,系统收到的是10,决定下一步的操作。

 

 

3C++中的explicit

C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 ,2 是个默认且隐含的类型转换操作符。

所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。

这样看起来好象很酷, 很方便。 但在某些情况下(见下面权威的例子), 却违背了我们(程序员)的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用/使用, 不能作为类型转换操作符被隐含的使用。

explicit构造函数的作用

解析:

explicit构造函数是用来防止隐式转换的。请看下面的代码:

 

class Test1

{

public:

    Test1(int n)

    {

        num=n;

    }//普通构造函数

private:

    int num;

};

class Test2

{

public:

    explicit Test2(int n)

    {

        num=n;

    }//explicit(显式)构造函数

private:

    int num;

};

int main()

{

    Test1 t1=12;//隐式调用其构造函数,成功

    Test2 t2=12;//编译错误,不能隐式调用其构造函数

    Test2 t2(12);//显式调用成功

    return 0;

}

Test1的构造函数带一个int型的参数,代码23行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码24行会出现编译错误。

普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用。

 

 

 

 

 

 

 

 

 

4、#include”* .h“ 在查找预编译头使用时跳过

出现这种状况的主要原因是没有在cpp文件最前一行添加没有添加 #include "stdafx.h"

#include "stdafx.h" 一定要添加到cpp文件的第一行,不能放在如”#include <iostream>“行等的后面,否则还是会出现类似错误!

每个cpp文件的最前一行添加语句:#include "stdafx.h" 

再次编译运行,即可解决此类错误

 

5、MFC把一个工程中的对话框复制到另一个工程中 (出现IDD未声明的标识符的错误

1、把需要复制对话框工程中的.rc里的相关内容,复制到另一个工程中,1)IDDxxx Dialog BEGIN...END 2)DESIGNINFO BEGIN...END 3)Dialog Info BEGIN...END

2、把resource.h中的相关的#define ID_XXX复制到令一个工程中的相同文件中(可通过不断地调式来查找,相关的ID_XXX

3、为对话框建立类,同时在对话框的头文件中包含#include "Resource.h"

   同时直接将对应的头文件和源文件复制到工程目录下

 

6、打开资源视图时-提示在另一个编辑器中打开

关闭打开的Resource.h,双击资源视图中的.rc(可能需要进行两次双击)就可以了
或者关闭解决方案,再重新打开。(已经试过,成功

退出程序,然后把*.ncb,*.opt,*.clw删掉,再开 。(未试过

00001. 

 

7关于C语言中return的一些总结

returnC++预定义的语句,它提供了种植函数执行的一种放大。当return语句提供了一个值时,这个值就成为函数的返回值.

说到return,有必要提及主函数的定义,下面是从网络上找到的资料,好好消化吧,对了解主函数中返回值的理解有很大的帮助.

很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.void main( ) 从来就不存在于 C++ 或者 C )。下面我分别说一下 C C++ 标准中对 main 函数的定义。

1. C

C89 中,main( ) 是可以接受的。Brian W. Kernighan Dennis M. Ritchie 的经典巨著 The C programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。不过在最新的 C99 标准中,只有以下两种定义方式是正确的:

 int main( void )

 int main( int argc, char *argv[] )

(参考资料:ISO/IEC 9899:1999 (E) Programming languages C 5.1.2.2.1 Program startup

当然,我们也可以做一点小小的改动。例如:char *argv[] 可以写成 char **argvargv argc 可以改成别的变量名(如 intval charval),不过一定要符合变量的命名规则。

如果不需要从命令行中获取参数,请用int main(void) ;否则请用int main( int argc, char *argv[] )

main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。

如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0; ,大概是因为 vc6 98 年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上 return 语句了吧!不过,gcc3.2Linux 下的 C 编译器)会在生成的目标文件中加入 return 0;

 

2. C++

C++98 中定义了如下两种 main 函数的定义方式:

  int main( )

  int main( int argc, char *argv[] )

(参考资料:ISO/IEC 14882(1998-9-01)Programming languages C++ 3.6 Start and termination

int main( ) 等同于 C99 中的 int main( void ) int main( int argc, char *argv[] ) 的用法也和 C99 中定义的一样。同样,main 函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C++98 规定编译器要自动在生成的目标文件中加入 return 0; 。同样,vc6 也不支持这个特性,但是 g++3.2Linux 下的 C++ 编译器)支持。

 

3. 关于 void main

C C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C C++ 标准中都是这样规定的。虽然在一些编译器中,void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为标准中从来没有定义过 void main g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用 int main

 

4. 返回值的作用

main 函数的返回值用于说明程序的退出状态。如果返回 0,则代表程序正常退出,否则代表程序异常退出。下面我们在 winxp 环境下做一个小实验。首先编译下面的程序:

 int main( void )

 {

  return 0;

 }

然后打开附件里的“命令提示符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值为 0 。假设刚才编译好的文件是 a.exe ,如果输入“a && dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非 0 值,重新编译后输入“a && dir”,则 dir 不会执行。因为 && 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是 int main 的好处。如果你有兴趣,也可以把 main 函数的返回值类型改成非 int 类型(如 float),重新编译后执行“a && dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入 a || dir 的话,则表示如果 a 异常退出,则执行 dir

5. 那么 intmain(intargc,char*argv[],char*envp[])呢?

这当然也不是标准 C 里面定义的东西!char*envp[] 是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用。

到了这里,你应该了解为什么主函数定义为 int返回类型,而且函数体里面有return 0;这个语句了吧.

下面具体说说我对return的应用的理解。

只要一个函数的返回值是数字型的,那么就可以返回0(return 0),其实你返回多少都没问题。一般情况下,C++做出来的函数都要求返回一个值,当函数执行正常,且达到了一般情况下的目的,那么就返回0表示正确的调用了该函数,这个0就是返回给主调函数以通知没有出错的;如果函数调用中出错,或者没有按照一般情况执行,那么就返回1,以告知主调函数采取响应策略;如果你在某个函数所在类的定义所在的头文件中定义了一组状态值(一般都是负整数),那么函数就可以返回不同的值以告之主调函数具体发生了什么异常或错误,这种情况一般用于函数功能独立性较差的的情况。所以一般不鼓励把函数返回类型定义为void,至少返回应该是int,而在函数的最后加上return 0.语句:

         int func(参数列表)

         {

              ……

              ……

              ……

              Return 0;

          }

    在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句,那么整个程序就会停止,退出程序的执行。

如果你定义一个函数有返回类型,可以想下面那样调用:

int func()

{

        int value;

    ……

    ……

……

return value;

}

int main()

{

     int intvalue;

     intvalue=func();

     ……

     ……

     teturn 0;

}

return语句后面具体是什么内容,这就要具体情况具体分析了:

1) 在返回类型是char的函数中,return后应该是char类型的值;

2) 在返回类型是int的函数中,如果是要停止函数的调用,最好应该为0;其他的按照你的目的而定,只要是int 类型就行了

3) 在返回类型是结构类型的函数中,return后应该是结构的一个实例对象。

 总之,函数定义为什么样的返回类型,该函数中return后就应该是相应类型的值。

 

 

 

8、错排公式

基本形式:d[1]=0;   d[2]=1
递归式:d[n]= (n-1)*( d[n-1] + d[n-2])

 

 

9structclass

结构是数据的封装,类是数据和操作的封装。可以把结构看成是类的特例。结构和类都可以用关键字structclass定义。区别是,struct定义的结构或类的全部成员不做特殊说明的情况下都是公有的,用class定义的结构或类不做声明的成员是私有的。

Structclss的转化,书上的思考题说,class转化为struct,要把所有成员换位public,但是在vs2013的情况下,我没有转化成员属性,直接把class换为struct编译并没有出现任何错误。

 

10、不带参数的构造函数就是默认构造函数。如果你写了一个构造函数,编译器就不给你提供默认构造函数了。如果你又想用默认的构造函数,必须显式写一个不带参数的,或者直接写成 类名提示编译器使用编译器提供的默认构造函数。


11、VC6.0调试

F10 单步调试程序
F5 按照断点停顿,也就是说只有在有断点的时候才停,你可以用F5运行到有断点的地方,然后按F10单步调试
F11进入函数,ALT+F11跳出函数

 

12迭代和递归

递归和迭代都是循环的一种。

 

简单地说,递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。

 

递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。

 

递归的例子,比如给定一个整数数组,采用折半查询返回指定值在数组中的索引,假设数组已排序,为方便描述,假设元素都为正数,数组长度为2的整数倍。

 

折半查询是查询的一种,比遍历所有元素要快很多。

int Find(int *ary,int index,int len,int value)

{

    if(len==1)//最后一个元素

    {

        if (ary[index]==value)return index;//成功查询返回索引

        return -1;//失败,返回-1

    }

    //如果长度大于1,进行折半递归查询

    int half=len/2;

    //检查被查值是否大于上半部分最后一个值,如果是则递归查询后半部分

    if(value>ary[index+half-1])

        return Find(ary,index+half,half,value);

    //否则递归查询上半部分

    return Find(ary,index,half,value);

}  

 

迭代经典例子就是实数的累加,比如计算1-100所有实数的和。

 int v=1;

for(i=2;i<=100;i++)

{

    v=v+i;

}  

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值