ACM_编程与调试重点记录(五)

三十一、立方表:

1^3=1

2^3=8

3^3=27

4^3=64

5^3=125(最右边数字是本身)

6^3=216(最右边数字是本身)

7^3=343

8^3=512

9^3=729(最右边数字是本身)

10^3=1000

11^3=1331

12^3=1728

13^3=2197

14^3=2744

15^3=3375

16^3=4096

17^3=4913

18^3=5832

19^3=6859

20^3=8000

21^3=9261

22^3=10648

23^3=12167

24^3=13824

三十二、HDOJ1061解题报告:

显然,当n11000000000之间,若直接先算出nn此方,肯定不行(超出了长整型数的表示范围)。此时只有两条路可走:一是找规律,式运算能在整数范围内发生;二是利用大数算法。

可以肯定的是最右边的数字只有09一共10种情况。(待续)

三十三、puts("enter the number:");printf("enter the number:");都是输出函数,但puts输出后会自动换行,而printf不会自动换行

三十三、.sizeofstrlen比较:

  • 1.sizeof操作符的结果类型是size_t,它在头文件中typedefunsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
  • 2.sizeof是算符,strlen是函数。
  • 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''/0''结尾的。sizeof还可以用函数做参数,比如:

·          short f();

·          printf("%d/n", sizeof(f()));

输出的结果是sizeof(short),即2

  • 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
  • 5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

·          char str[20]="0123456789";

·          int a=strlen(str); //a=10;

·          int b=sizeof(str); //b=20;

  • 6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
  • 7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
  • 8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
  • 9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:

·          fun(char [8])

·          fun(char [])

都等价于 fun(char *) C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去

fun(unsiged char *p1, int len)

{

  unsigned char* buf = new unsigned char[len+1]

  memcpy(buf, p1, len);

}

有关内容见: C++ PRIMER?

  • 10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照48的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。
  • 11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]MAX未知,sizeof(void)都不是正确形式

sizeof使用场合:

  • 1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: 

·            void *mallocsize_t size, 

·            size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)

  • 2.用它可以看看一类型的对象在内存中所占的单元字节。

·          void * memsetvoid * s,int c,sizeof(s)

  • 3.在动态分配一对象时,可以让系统知道要分配多少内存。
  • 4.便于一些类型的扩充,windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。
  • 5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
  • 6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

三十四、一句话结论:

  • 1const int max=101; #define max 101等价
  • 2VC++6.0C-free 4.0中,int型和float型均占4个字节,double型占8个字节
  • 3)调试debugdelete bug,驱除臭虫)
  • 4)任何整数都可以作为return的返回值
  • 5puts("%f/n",1.0/4.00);报错;而printf("%f/n",1.0/4.00);正确
  • 6getch()函数的头文件conio.h
  • 7__int64(前面的是2段下划线)对应的格式控制说明%I64d
  • 8int *pp=int*1735(参见c课本145页中间部分)
  • 9)脚本script是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。
  • 10scanf最末一个字母f即为格式”(format)之意,而scan即为“扫描”
  • 11int64不支持,可以用long long代替

三十五、

  • 1printf("%%%%f/n",1.0/4.00);小规律:当%的个数n为奇数个(如13579)时,对应输出的%01234个;当%的个数n为偶数个(如246810)时,对应输出的%12345.——当n为奇数时,输出地为(n-1/2;当n为偶数时,输出地为n/2
  • 2VC++6.0在编译从word文档等处粘贴来的源代码时,可能指向空行处报错(error C2018: unknown character '0xa1')。再用手工输入相同代码时,不再报此错
  • 3VC64位整数分别叫做__int64unsigned __int64,其范围分别是[-2^63, 2^63)[0,2^64),即-9223372036854775808~92233720368547758070~18446744073709551615(1800亿亿)。对64位整数的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混合运算时,32位整数会被隐式转换成64位整数。
  • 4)当puts遇到/0时,会输出一个/n,也就是换行。
  • 所以puts( "" )时,因为字符串本身长度为0,所以第一个字符就是/0puts会输出一个/n,所以起到了换行的效果。
  • 结论:puts( "" ) puts( "/0" ) printf( "/n" )等效
  • 5(int*),就是把一个值强制转换为一个int型的指针,也就是说把这个值转换为一个地址,这个地址指向的内容是int型的值。另外,假设0xB8000000可以表示int,char ,float的首地址(但事实上不妥,0xB8000000仅是个十六进制的数值),还可以表示数组的首地址,那编译器就无法知道这个地址指向多少个内存单元。Int * pt=(int*)0xB8000000
  • 6)堆内存和栈内存:在标准C语言上,使用malloc等内存分配函数获取内存即是从堆中分配内存,而在一个函数体中例如定义一个数组之类的操作是从栈中分配内存。从堆中分配的内存需要程序员手动释放,如果不释放,而系统内存管理器又不自动回收这些堆内存的话(实现这一项功能的系统很少),那就一直被占用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值