《C Primer Plus》读书笔记.doc

上传人:飞****2 文档编号:52766616 上传时间:2022-10-23 格式:DOC 页数:78 大小:1.45MB
返回 下载 相关 举报
《C Primer Plus》读书笔记.doc_第1页
第1页 / 共78页
《C Primer Plus》读书笔记.doc_第2页
第2页 / 共78页
点击查看更多>>
资源描述

《《C Primer Plus》读书笔记.doc》由会员分享,可在线阅读,更多相关《《C Primer Plus》读书笔记.doc(78页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、C Primer Plus读书笔记By:riusksk(泉哥)Blog:1 scanf()在读取输入时会自动将空字符0插入字符串末尾,而且当它遇到第一个空白字符空格(blank)、制表符(tab)或者换行符(newline)时会停止读取,因此使用%s的scnaf()只会把一个单词而不是把整个语句作为字符串读入,此时我们一般用gets()来处理一般的字符串。2 字符串常量”x”与字符常量x不同,x属于基本类型(char),而”x”则属于派生类型(char数组),另外,”x”实际上是由两个字符(x和空字符0)组成的。3 strlen()是以字符为单位给出字符串的长度,其中空字符0并不计算在内,而s

2、izeof()是以字节为单位给出数据的大小,其中还包括空字符0。4 定义符号常量的意义:a.提供更多的信息,增强代码的可读性;b.便于更改代码,特别对于在多处使用同一常量而又必须改变它的值时更为适用。可将符号常量名定义为大写字母,当遇到大写的符号名时,就可知道它是一个常量而变量了,比如:#define PI 3.14159这里如果我们这样定义:float pi = 3.14159;由于pi是个变量,程序可能意外地改变它的值,因此我们使用#define来定义它。除了以上方法之外,我们还可以使用const修饰符来创建符号常量,此时它就成为只读值,在计算中是不可改变的,比如:const float

3、pi = 3.14159;5 linits.h:整数限制头文件,float.h:浮点数限制头文件。例如:#include #include #include int main(void)printf(Max int value on this system:%dn,INT_MAX);printf(Min int value on this system:%dn,INT_MIN);printf(Max float normal value on this system:%en,FLT_MAX);printf(Min float normal value on this system:%en,FL

4、T_MIN); return 0;输出结果:Max int value on this system:Min int value on this system:-Max float normal value on this system:3.e+038Min float normal value on this system:1.e-0386 不匹配的浮点转换实例:n1在堆栈中占用8字节(float被转换成double),n2占用8字节,而n3和n4则分别占用4字节,prinft()在读取堆栈中的值时,它是根据转换说明符去读取的。%ld说明符指出,printf()应该读取4个字节,所以prin

5、tf()在堆栈中读取前4个字节作为它的第一个值,即n1的前半部分,它被解释成一个长整数(long integer)。下一个%ld说明符再读取4字节,即n1的后半部分,它被解释成第二个长整数(long integer)。同样,%ld的第三、四个实例使得n2的前半部分和后半部分被读出,并被解释成两个长整数(long integer)。7 printf()返回所打印的字符的数目,如果输出错误,则返回一个负数(旧版本的printf会有不同的返回值),比如:#include int main(void)inttest = 123;intretvalue;retvalue = printf(“the te

6、st value is %dn”,test);printf(“The printf() function printed %d characters.n”,retvalue);return 0;输出结果:the test value is 123The printf() function printed 22 characters.8 在scanf()格式字符串的说明符中,除了%c以外,其它说明符均会自动跳过输入项之前的空格。比如:#include int main(void)int a;printf(enter:n);scanf(%d,&a);printf(%d.n,a);return 0;

7、输出结果:enter: 33.这里并没有输出空格。又比如:#include int main(void)char a;printf(enter:n);scanf(%c,&a);printf(%c.n,a);return 0;输出结果:enter: a .这里就是输出空格了。9 scanf()函数返回成功读入的项目的个数,如果它没有读取任何项目(当它期望一个数字而你又键入一个非数字字符串时就会发生这种情况),scnaf()会返回值0。当它检测到“文件结尾”时,它返回EOF(stdio.h中将EOF定义为值-1)。10 printf()和scanf()的*修饰符:代码一:/-使用可变宽度的输出字段

8、-#include int main(void) unsigned width, precision; int number = 256; double weight = 242.5; printf(What field width?n); scanf(%d, &width); printf(The number is :%*d:n, width, number); printf(Now enter a width and a precision:n); scanf(%d %d, &width, &precision); printf(Weight = %*.*fn, width, preci

9、sion, weight); printf(Done!n); return 0;变量width提供字段宽度,而number就是要打印的数字。其运行结果:What field width?3The number is :256:Now enter a width and a precision:3 7Weight = 242.Done!代码二:/*跳过输入的头两个整数,此功能可用于读取一个文件中某个特定的列*/#include int main(void)int n; printf(please enter three integers:n);scanf(%*d %*d %d,&n);print

10、f(the last integer was %dn,n); return 0;输出结果:please enter three integers:111 222 333the last integer was 33311 取模运算符%只用于整数运算,对于浮点数使用该运算符将是无效的。12 前缀增量与后缀增量的区别:先看下面的代码:#include int main(void) int a = 1, b = 1; int aplus, plusb; aplus = a+; /* 后缀 */ plusb = +b; /* 前缀 */ printf(a aplus b plusb n); print

11、f(%1d %5d %5d %5dn, a, aplus, b, plusb); return 0;运行结果:a aplus b plusb2 1 2 2显然,a和b都加一了,但aplus是a改变之前的值,而plusb却是b改变之后的值。再比如,q=2*+a;它会先将a+1,然后再2*a;而q=2*a+却是先2*a,再将积加1。再举个例子:b = +i /如果使用i+,b会有不同结果,而如果使用下列语句来代替它:+i; /第1行b=i; /如果在第1行使用了i+,b的结果仍会是相同的。13. 增量运算符+与减量运算符具有很高的结合优先级,只有圆括号比它们的优先级高。所以x*y+相当于(x)*(

12、y+)。14. 在y =( 4 + x+)+(6 + x+); 中表达式( 4 + x+)不是一个完整的表达式,所以C不能保证在计算子表达式4 + x+后立即增加x。这里,完整表达式是整个赋值语句,并且分号标记了顺序点,所以C能保证的是在程序进入后续语句前x将被增加两次。C没有指明x是在每个子表达式被 计算后增加还是在整个表达式被计算后增加,这就是我们要避免使用这类语句的原因。15. 请看以下代码:#include int main(void) int i=1; float n;while(i+1时,n都会等于0printf(%fn,n); return 0;16. 请看代码:#include

13、 #define FORMAT %s! C is cool!nint main(void) int num = 10;printf(FORMAT,FORMAT);printf(%dn,+num);printf(%dn,num+);printf(%dn,num-);printf(%dn,num); return 0;运行结果:%s! C is cool! C is cool!1111121117. while循环语句在遇到第一个分号之后就退出循环,例如以下代码:#include int main(void)int n = 0; while (n+ 3); /* line 7 */ printf(

14、n is %dn, n); /* line 8 */ printf(Thats all this program does.n); return 0;输出结果:n is 4Thats all this program does.由于while(n+ 3); 之后存在分号,因此它只是循环的执行n+,直至它小于3才退出循环,相当于一个空语句,退出循环时n刚好等于4。有时,程序员有意地使用带有空语句的while语句,因为所有的工作都在判断语句中进行。例如,你想要跳过输入直到第一个不为空格或数字的字符,可以使用这样的循环:while ( scanf ( “%d”,&num ) = 1);/*跳过整数输

15、入*/只要输入一个整数,则scanf()就返回1,循环就会继续。18. math.h头文件中声明的fabs()函数用于返回一个浮点值的绝对值,即没有代数符号的值。19. 请看代码:#include int main(void) int num = 0;for (printf(keep entering numbers!n);num!=6;)scanf(%d,&num);printf(thats the one I want!n);return 0;输出结果:keep entering numbers!123456thats the one I want!20. houseprice = 249

16、,500; 相当于: houseprice = 249; 500; 而houseprice = (249,500);相当于houseprice =500;21. 求S=1 + 1/2 + 1/4 + 1/8 + 1/16 + #include int main(void) int t_ct;double time,x;int limit;printf(enter the number of terms you want:);scanf(%d,&limit);for (time=0,t_ct=1,x=1;t_ct=limit;t_ct+,x*=2.0)time += 1.0/x;printf(t

17、ime = %f when terms = %d.n,time,t_ct);return 0;运行结果:enter the number of terms you want:15time = 1. when terms = 1.time = 1. when terms = 2.time = 1. when terms = 3.time = 1. when terms = 4.time = 1. when terms = 5.time = 1. when terms = 6.time = 1. when terms = 7.time = 1. when terms = 8.time = 1. w

18、hen terms = 9.time = 1. when terms = 10.time = 1. when terms = 11.time = 1. when terms = 12.time = 1. when terms = 13.time = 1. when terms = 14.time = 1. when terms = 15.22. 代码:#include int main(void)int k;for ( k = 1,printf(“%d:Hi!n”,k) ; printf(“k = %dn”,k),k*k26 ; k+=2,printf ( “Now k is %dn”,k)

19、)printf (“k is %d in the loopn”,k);return 0;运行结果:1:Hi!k = 1k is 1 in the loopNow k is 3k = 3k is 3 in the loop Now k is 5k is 5 in the loopNow k is 7k = 723. 让程序要求用户输入一个大写字母,使用嵌套循环产生像下面这样的金字塔图案,比如输入E: A ABA ABCBA ABCDCBA ABCDEDCBA提示:使用一个外部循环来处理行,在每一行中使用三个内部循环,一个处理空格,一个以升序打印字母,一个以降序打印字母。源码如下:#include

20、int main(void) int a; char i,j,k; printf(请输入字母: ); scanf( %c,&i); /* 输入的字母用 i */ for(k=A ; k0 ; a-) printf( ); /* 印出空白字元 */ for(j=A ; j=A ; j-) printf(%c,j); /* 递減印出字母 */ printf(n); return 0;24. getchar()没有参数,它返回来自输入设备的下一个字符,比如:ch = getchar(); 相当于scanf(%c,&ch);putchar()打印出它的参数,比如putchar(ch); 相当于prin

21、tf(“%c”,ch);这两个函数通常在stdio.h文件中定义,而且通常只是个预处理宏,而不是真正的函数。25. ctype.h系列字符函数:ctype.h头文件包含了一些函数的原型,这些函数接受一个字符作为参数,如果该字符属于某特定的种类则返回真,否则返回假,比如isalpha()函数判断是否为字母。一些映射函数,比如转换为小写字母tolower()函数,它并不改变原始的参数,它们只返回改变后的值,也就是说,tolower(ch); /对ch没有影响,若要改变ch,可以这样做:ch = tolower(ch); 。26.27. 求2到num之间的所有数,看它们是否可以整除num,比如求14

22、4的约数,由于一次成功的num%div测试可以得到两个约数,拿144除以2,可以得到72,则这两个数均为其约数,这样,我们可以将测试的数缩小到num的平方根即可,而不必到num。如果测试的数是一个完全平方数,就只需打印出一个数。如果测试的数是一个素数,那么程序流程也进不了if语句中,对此我们可设置一个布尔值变量,即标志(flag):#include #include / BOOL,TRUE,FALSE包含在windows.h头文件中int main(void) unsigned long num; unsigned long div; BOOL isPrime; printf(Please e

23、nter an integer for analysis,enter q to quit.n ); while (scanf(%lu, &num) = 1) for (div = 2, isPrime= TRUE; (div * div) ! & | ,对于逻辑表达式是从左至右求值的。31. 在定义测试范围时,请勿效仿数学上常用的写法:if ( 90 = range = 100)/ 语义错误printf (“Good show!n”);问题在于该代码存在语义错误,而不是语法错误,所以编译器并不会捕获它(尽管可能会发出警告)。因为对=运算符的求值顺序是由左到右的,所以它会被解释成:( 90 =

24、range )= 100子表达式90 = 90 & range = a & ch = z)printf ( “Thats a lowercase character.n”);对于ASCII那样的字符编码可以工作,因为在这种编码中连续字母的编码是相邻的数值。然而,对于包括EBCDIC在内的一些编码就不正确了。进行这种测试的移植性最好的方法是使用ctype.h系列中的islower()函数:if ( islower(ch)printf ( “Thats a lowercase character.n”);33. 计算给定的平方英尺的面积涂油漆,全部涂完需要多少罐油漆。当不知道1罐,比如1.7罐时,

25、就取2罐,用条件运算符即可处理以上这种情况,而且在适当的时候也可用来打印can或cans。#include stdio.h#define COVERAGE 200/*每罐漆可喷的平方英尺数*/int main (void)int sq_feet;int cans;printf(enter number of square feet to be patined:n);while (scanf(%d,&sq_feet)=1)cans = sq_feet/COVERAGE;cans += (sq_feet% COVERAGE=0) ? 0 : 1;printf(you need %d %s of p

26、aint.n,cans,cans = 1? can:cans);printf(Enter next value (q to quit):n);return 0;34. continue语句只能用在循环体中,它可使程序跳过其余循环的用于处理有效输入的部分,本语句只结束本层本次的循环,并不跳出循环。比如:int main (void)for (n=1;n=100;n+)if (n%5!=0)continue;printf(“%d”,n); 相当于:int main (void)for (n=1;n=100;n+)if (n%5=0)printf(“%d”,n); 或者int main (void)

27、for (n=1;n=100;n+)if (n%5!=0);/分号elseprintf(“%d”,n); 35. 分析以下两份代码的不同:代码一:#include stdio.hint main (void)int count = 0;char ch;for (count=0;count10;count+)ch = getchar();if (ch = n)continue;putchar(ch);printf(n);return 0;代码二:#include stdio.hint main (void)int count = 0;char ch;while (count 10)ch = ge

28、tchar();if (ch = n)continue;putchar(ch);count+;printf(n);return 0;由于contuine语句会导致循环体的剩余部分被跳过,因此在代码一中,当continue语句被执行时,首先递增count,然后把count与10相比较,这时换行符就包括在计数中了,而在代码二中,它读入10个字符(换行符除外,ch为换行符时会跳过count+;语句)并回显它们。当你在代码一中输入9个字符,然后回车后就能打印出来。而当你在代码二中输入9个字符,然后回车并不能显示出字符,必须再输入1个字符以凑足10个才会回显。36. 37. 38. 在switch语句中

29、,其圆括号中的判断表达式应该具有整数值(包括char类型),case标签必须是整形(包括char)常量或整数常量表达式(公包含整数常量的表达式)。不能用变量作为case标签。39. 只读取一行的首字符:while ( getchar () != n )continue; /跳过输入行的剩余部分这个循环从输入读取字符,直到出现由回车键产生的换行符。注意,函数返回值并未赋予任何变量,因此它只是被读取并丢弃而已。因为最后一个被丢弃的字符是换行符,所以下个读入的字符是下一行的首字符。40. 原则上,C程序根本不需要使用goto语句。但是有一种情况是被许多C专业人员所容忍的:在出现故障时从一组嵌套的循环

30、中跳出(单条break仅仅跳出最里层的循环)。具有讽刺意味的是,C不需要goto,却有一个比其它语言更好的goto,因为它允许您在标签中使用描述性的单词而不是数字。41. 编写一个程序读取输入,直到#,并报告序列ei出现的次数。#include #include int SearchChar(char* SourcesString)int i,Num=0;for (i=0;*(PBYTE)(SourcesString+i)!=#;i+)if (*(PBYTE)(SourcesString+i)=e & *(PBYTE)(SourcesString+i+1)=i)Num+;return Num;

31、int main()char Teststr=heiCJKDJKeJHKieihjkklHC#; printf(Num=%dn,SearchChar(Teststr);return 0;运行结果:Num=242. 缓冲分为两类:完全缓冲I/O和行缓冲I/O。对完全缓冲输入来说,缓冲区满时被清空(内容被发送至其目的地)。这种类型的缓冲通常出现在文件输入中。缓冲区的大小取决于系统,但512字节和4096字节是常见的值。对行缓冲I/O来说,遇到一个换行字符时将被清空缓冲区。键盘输入是标准的行缓冲,因此按下回车键将清空缓冲区。43. 在windows 7,VC6的环境下,将一行的开始位置键入的Ctrl

32、+Z解释成文件尾信号。44. 程序越大,就越应该使用模块化(函数)的方法进行编程。45. 输入由字符组成,但scanf()可以将输入转换成整数或浮点值。使用像%d或%f这样的说明符时能限制可接受的输入的字符类型,但getchar () 和使用%c的scanf()可接受任何字符。46. getchar( putchar () )不是一个合法的表达式,因为getchar()可以不用参数,而putchar()需要一个参数。47. 在缓冲系统中把数值输入与字符输入相混合时,由于数值输入会忽略空格和换行符,而字符输入不会,因此当先执行字符输入再执行数值输入时,会将换行符发送给后面的数值输入,导致不希望的

33、结果。所以在字符输入之前进行了数字输入时,应该添加代码以在获取字符输入之前剔除换行字符。例如:while ( scanf ( “%d”,&input) != 1 )while ( ch = getchar () != n)putchar (ch); / 剔除换行字符printf (“ is not an integer .n Please enter an “);printf (“integer value,such as 25,-178,or 3:”);48. 猜测程序:在1到100之间,猜测数值,比如程序最初猜50,让其询问用用户该猜测值是大、小还是正确。如果该猜测值小,则令下一次猜测值为

34、50和100的中值,也就是75。如果75大,则下一次猜测值为75和50的中值,等等。使用这种二分搜索策略,起码如果用户没欺骗,该程序很快会获得正确答案。代码:#include #include int main(void) int high = 100; int low = 1; int guess = (high + low) / 2; char response; printf(Pick an integer from 1 to 100. I will try to guess ); printf(it.nRespond with a y if my guess is right, wit

35、h); printf(na h if it is high, and with an l if it is low.n); printf(Uh.is your number %d?n, guess); while (scanf(%s,&response) & response != y) if (response = n) continue; if (response != h & response != l) printf(I dont understand that response. Please enter h forn); printf(high, l for low, or y f

36、or correct.n); continue; if (response = h) high = guess - 1; else if (response = l) low = guess + 1; guess = (high + low) / 2; printf(Well, then, is it %d?n, guess); printf(I knew I could do it!n); return 0;运行结果:Pick an integer from 1 to 100. I will try to guess it.Respond with a y if my guess is right, witha h if it is high, and with an

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com