NOIP复习资料(C++版)精编版.doc

上传人:小飞机 文档编号:3957195 上传时间:2023-03-28 格式:DOC 页数:217 大小:1.43MB
返回 下载 相关 举报
NOIP复习资料(C++版)精编版.doc_第1页
第1页 / 共217页
NOIP复习资料(C++版)精编版.doc_第2页
第2页 / 共217页
NOIP复习资料(C++版)精编版.doc_第3页
第3页 / 共217页
NOIP复习资料(C++版)精编版.doc_第4页
第4页 / 共217页
NOIP复习资料(C++版)精编版.doc_第5页
第5页 / 共217页
点击查看更多>>
资源描述

《NOIP复习资料(C++版)精编版.doc》由会员分享,可在线阅读,更多相关《NOIP复习资料(C++版)精编版.doc(217页珍藏版)》请在三一办公上搜索。

1、 主 编葫芦岛市一高中 李思洋完成日期2012年8月27日NOIP复习资料(C+版)前 言有一天,我整理了NOIP的笔记,并收集了一些经典算法。不过我感觉到笔记比较凌乱,并且有很多需要修改和补充的内容,于是我又搜集一些资料,包括一些经典习题,在几个月的时间内编写出了NOIP复习资料。由于急于在假期之前打印出来并分发给同校同学(我们学校既没有竞赛班,又没有懂竞赛的老师。我们大家都是自学党),NOIP复习资料有很多的错误,还有一些想收录而未收录的内容。在“减负”的背景下,暑期放了四十多天的假。于是我又有机会认真地修订NOIP复习资料。我编写资料的目的有两个:总结我学过(包括没学会)的算法、数据结构

2、等知识;与同学共享NOIP知识,同时使我和大家的RP+。大家要清醒地认识到,NOIP复习资料页数多,是因为程序代码占了很大篇幅。这里的内容只是信息学的皮毛。对于我们来说,未来学习的路还很漫长。基本假设作为自学党,大家应该具有以下知识和能力: 能够熟练地运用C+语言编写程序(或熟练地把C+语言“翻译”成Pascal语言); 能够阅读代码,理解代码含义,并尝试运用; 对各种算法和数据结构有一定了解,熟悉相关的概念; 学习了高中数学的算法、数列、计数原理,对初等数论有一些了解; 有较强的自学能力。代码约定N、M、MAX、INF是事先定义好的常数(不会在代码中再次定义,除非代码是完整的程序)。N、M、

3、MAX针对数据规模而言,比实际最大数据规模大;INF针对取值而言,是一个非常大,但又与int的最大值有一定差距的数,如100000000。对于不同程序,数组下标的下限也是不同的,有的程序是0,有的程序是1。阅读程序时要注意。阅读顺序和方法没听说过NOIP,或对NOIP不甚了解的同学,应该先阅读附录E,以加强对竞赛的了解。如果不能顺利通过初赛,你就应该先补习初赛知识。这本NOIP复习资料总结的是复赛知识。如果没有学过C+语言,应该先选择一本C+语言教材。一般情况下,看到“面向对象编程”一章的前一页就足够了(NOIP不用“面向对象编程”,更不用摆弄窗口对话框)。附录G介绍了一些书籍和网站。你应该选

4、择一本书,认真地学习。再选择一个网站,作为练习的题库。第一单元对竞赛中常用的操作和简单的算法分析进行了总结,算作对C+语言的巩固。同时,阅读这一单元之后,你应该选择一个合适的C+代码编辑器。第二到第六单元介绍了竞赛常用的算法。阅读每一章时,应该先阅读“小结”名曰“小结”,实际上是“导读”。这五个单元除了经典习题,还有某些思想和算法的具体实现方法。这些信息可能在明处,也可能在暗处,阅读时要注意挖掘和体会。如果有时间,应该在不看解析和代码的前提下独立完成这些题。第七单元是第六单元的一个部分,由于它的内容来自背包九讲,所以单独放在一个单元。从第八单元开始,到第十三单元,基本上就没有习题了。换句话说,

5、该“背课文”了。第八单元介绍了常用的排序算法。你可以有选择地学习,但一定要掌握“STL算法”和“快速排序”。第九单元介绍了基本数据结构,你一定要掌握第九单元前五小节的内容(本单元也有应该优先阅读的“小结”)。有余力的话,第六小节的并查集也应该掌握。第十单元介绍了与查找、检索有关的数据结构和算法。你也可以有选择地学习。第十一单元与数学有关。数学对于信息学来说具有举足轻重的地位。标有“!”的应该背下来,至于其他内容,如果出题,你应该能把它解决。第十二单元仍与数学有关。第十三单元是图论。学习时要先阅读“小结”,把概念弄清楚。之后要掌握图的实现方法。接下来要掌握一些经典图论算法:Kruskal算法、D

6、ijkstra算法、SPFA、Floyd算法、拓扑排序。附录F总结了2004年以来NOIP考察的知识点,可以作为选择性学习的参考。在学习算法和数据结构的同时,应该阅读和学习附录A。如果你还有余力,你应该学习第十四单元。第十四单元的内容不是必须要掌握的,但是一旦学会,可以发挥C+语言的优势,降低编程复杂度。临近竞赛时,应该阅读附录B和附录C,以增加经验,减少失误。面临的问题1. 这是复赛复习资料需要有人能用心总结、整理初赛的知识,就像这份资料一样。2. 潜在的问题还是相当多的,只是时间不够长,问题尚未暴露。3. 部分代码缺少解说,或解说混乱。4. 个人语文水平较差,资料也是如此。5. 没有对应的

7、Pascal语言版本。如果有人能为P党写一个Pascal版的STL,他的RP一定会爆增!6. 希望有人能用整理资料,并以自由文档形式发布。最后,欢迎大家以交流、分享和提高为目的修改、复制、分发本资料,同时欢迎大家将资料翻译成Pascal语言版供更多OIer阅读!谢谢大家的支持!葫芦岛市一高中 李思洋2012年8月27日 目 录标题上的符号:1. !:表示读者应该熟练掌握这些内容,并且在竞赛时能很快地写出来。换句话说就是应该背下来。2. *:表示内容在NOIP中很少涉及,或者不完全适合NOIP的难度。3. #:表示代码存在未更正的错误,或算法本身存在缺陷。前 言1目 录I第一单元C+语言基础11

8、.1程序结构11.2数据类型41.3运算符61.4函数81.5输入和输出!91.6其他常用操作!101.7字符串操作!131.8文件操作!131.9简单的算法分析和优化141.10代码编辑器16第二单元基础算法172.1经典枚举问题172.2火柴棒等式182.3梵塔问题192.4斐波那契数列192.5常见的递推关系!202.6选择客栈222.72k进制数232.8Healthy Holsteins242.9小结25第三单元搜索273.1N皇后问题273.2走迷宫293.38数码问题313.4埃及分数343.5Mayan游戏363.6预处理和优化403.7代码模板413.8搜索题的一些调试技巧4

9、33.9小结44第四单元贪心算法464.1装载问题464.2区间问题464.3删数问题474.4工序问题474.5种树问题474.6马的哈密尔顿链474.7三值的排序494.8田忌赛马504.9小结50第五单元分治算法515.1一元三次方程求解515.2快速幂515.3排序515.4最长非降子序列535.5循环赛日程表问题535.6棋盘覆盖545.7删除多余括号555.8聪明的质监员565.9模板585.10小结59第六单元动态规划606.1导例:数字三角形606.2区间问题:石子合并636.3坐标问题656.4背包问题676.5编号问题676.6递归结构问题686.7DAG上的最短路径716

10、.8树形动态规划*726.9状态压缩类问题:过河746.10Bitonic旅行766.11小结77第七单元背包专题787.1部分背包问题787.20/1背包问题!787.3完全背包问题797.4多重背包问题797.5二维费用的背包问题807.6分组的背包问题817.7有依赖的背包问题817.8泛化物品817.9混合背包问题827.10特殊要求827.11背包问题的搜索解法837.12子集和问题84第八单元排序算法858.1常用排序算法858.2简单排序算法878.3线性时间排序888.4使用二叉树的排序算法*898.5小结90第九单元基本数据结构919.1线性表(顺序结构)919.2线性表(链

11、式结构)919.3栈939.4队列949.5二叉树959.6并查集!999.7小结102第十单元查找与检索10410.1顺序查找10410.2二分查找!10410.3查找第k小元素!10510.4二叉排序树10610.5堆和优先队列*10810.6哈夫曼(Huffman)树11010.7哈希(Hash)表111第十一单元数学基础11611.1组合数学11611.2组合数的计算!11711.3排列和组合的产生(无重集元素)!11711.4排列和组合的产生(有重集元素)12011.5秦九韶算法12211.6进制转换(正整数)12311.7高精度算法(压位存储)!12311.8快速幂!12811.9

12、表达式求值12911.10解线性方程组*133第十二单元数论算法13512.1同余的性质!13512.2最大公约数、最小公倍数!13512.3解不定方程axbyc!*13512.4同余问题*13612.5素数和素数表13612.6分解质因数137第十三单元图与图论算法13913.1图的实现13913.2图的遍历14113.3连通性问题14213.4欧拉回路 邻接矩阵14613.5最小生成树(MST)14713.6单源最短路问题(SSSP问题)14813.7每两点间最短路问题(APSP问题)!15213.8拓扑排序15213.9关键路径15513.10二分图初步15713.11小结160第十四单

13、元 STL简介16414.1STL概述16414.2常用容器16414.3容器适配器17014.4常用算法17114.5迭代器17514.6示例:合并果子175附录A思想和技巧177A.1时间/空间权衡177A.2试验、猜想及归纳177A.3模型化177A.4随机化*178A.5动态化静态178A.6前序和!179A.7状态压缩*180A.8抽样测试法*182A.9离散化*183A.10Flood Fill*184附录B调试185B.1常见错误类型185B.2调试过程185B.3调试功能185B.4符号DEBUG的应用186B.5代码审查表186B.6故障检查表187B.7命令行和批处理*18

14、8附录C竞赛经验和教训192C.1赛前两星期192C.2赛前30分钟192C.3解题表193C.4测试数据195C.5交卷前5分钟196C.6避免偶然错误196C.7骗分197附录D学习建议198D.1学习方法198D.2学习能力198D.3关于清北学堂198附录E竞赛简介199E.1从NOIP到IOI199E.2NOIP简介199E.3常用语201E.4第一次参加复赛202附录FNOIP复赛知识点分布204附录G资料推荐205G.1书籍205G.2网站205参考文献206计算机专业是朝阳还是夕阳?207杜子德在CCF NOI2012开幕式上的讲话209多数奥赛金牌得主为何难成大器210第一单

15、元C+语言基础1.1程序结构(1) 程序框架 注释:注释有两种,一种是“/”,另一种是“/* */”。“/”必须单独放置一行,或代码所在行的后面;而“/*”、“*/”成对存在,可以插入到代码的任意位置。 引用头文件:在代码开头写“#include ”。如果想引用自己的头文件,需要把尖括号(表示只从系统目录搜索头文件)换成双引号(表示先从cpp所在文件夹搜索,然后再到系统文件夹搜索)。 命名空间:很多C+的东西都要引用std命名空间,所以代码中会有“using namespace std;”。 main():所有程序都要从main()开始。在所有的算法竞赛中,main()的返回值必须是0,否则视

16、为程序异常结束,得分为0分。 语句和语句块:1. 语句:一般情况下,一条语句要用一个分号“;”结束。为了美观和可读性,可以把一条语句扩展成几行,也可以把多个语句写到同一行上。2. 语句块:用“”和“”包围的代码是语句块。无论里面有多少代码,在原则上,语句块所在的整体都视为一条语句。(2) 选择结构1. if语句:if表示判断。如果条件为真,就执行接在if后的语句(语句块),否则执行else后的语句(语句块)。如果没有else,就直接跳过。if有以下几种格式:if (条件)/ 如果条件成立,就执行if后面的语句或语句块。语句或语句块if (条件)/ 如果条件成立,就执行if后面的A,否则执行B。

17、语句或语句块Aelse语句或语句块Bif (条件1)/ 实际上,这是if语句内的if语句,即if的嵌套。所以else和if中间要有空格。语句或语句块Aelse if (条件2)语句或语句块Belse语句或语句块N2. switch语句:switch表示选择。它根据条件的不同取值来执行不同的语句。格式如下:switch (表达式)case 值1:代码段Abreak;case 值2:代码段Bbreak;default:代码段Nbreak;如果表达式的值是值1,就执行代码段A;如果表达式的值是值2,就执行代码段B否则执行代码段N。注意: default一部分可以省略。 如果不使用break,那么紧随

18、其后的case部分代码也会被执行,直到遇到break或switch语句结束为止! switch结尾要有一个分号。3. if、switch都可以嵌套使用。【问题描述】输入一个日期,判断它所在年份是否为闰年,并输出所在月份的天数。闰年的判断方法:四年一闰,百年不闰,四百年又闰。int year,month,day;bool b=false;cinyearmonthday;/ 判断是否为闰年if (n%400=0)b=true;else if (n%100!=0 & n%4=0)b=true;if (b)couty是闰年。endl;elsecouty不是闰年。endl;/ 判断所在月份的天数swit

19、ch (month)case 1: case 3: case 5: case 7: case 8: case 10: case 12:cout这个月有31天。endl;break;case 4: case 6: case 9: case 11:cout这个月有30天。endl;break;case 2:cout这个月有(b ? 29 : 28)天。endl;break;(3) 循环结构1. while语句:如果条件成立,就继续循环,直到条件不成立为止。格式如下:while (条件)循环体(语句或语句块)2. dowhile语句:如果条件成立,就继续循环,直到条件不成立为止。它与while的最大

20、区别在于,dowhile循环中的语句会被执行至少一次,而while中的语句可能一次都没有被执行。格式如下:do循环体while (条件);/ 注意分号4. for语句:for分四部分,有初始条件、继续循环的条件、状态转移的条件和循环体。格式如下:for (初始条件; 继续循环的条件; 状态转移的条件)循环体转换成while循环,即:初始条件while (继续循环的条件)循环体状态转移for后三个条件不是必需的,可以省略不写,但分号必须保留。5. 在循环语句内部使用break,可以跳出循环;使用continue,可以忽略它后面的代码,马上进入下一轮循环。注意,这两个语句只对它所在的一层循环有效。

21、6. 写for循环时,一定要注意: 不要把计数器的字母打错,尤其是在复制/粘贴一段代码的时候。 根据算法要明确不等号是“”,还是“=”。 逆序循环时,不要把自减“-”写成自增“+”!【问题描述】输入n,输出n!(n!1234n)。结果保证小于long long的范围。当输入值为负数时结束程序。int n;long long r=1;cinn;while (n-1)r=1;for (int i=1; i=n; i+)r*=i;coutn! = rn;(4) goto语句goto语句用于无条件跳转。要想跳转,首先要定义标签(在代码开头的一段标识符,后面紧跟冒号),然后才能goto那个标签。很多教程

22、不提倡使用无条件跳转,因为它破坏了程序结构,还容易给代码阅读者带来麻烦。不过,这不代表goto没有使用价值。goto的一个用途是跳出多层循环:for (int i=0; i9; i+)for (int j=0; j9; j+)for (int k=0; k9; k+)if (满足某种条件) goto _exited;_exited:(5) C与C+的区别C+语言是以C语言为基础开发出来的,C语言的大多数内容被保留了下来。在信息学竞赛领域,很多情况下C和C+可以互相转化,甚至不用对代码进行任何修改。下面是信息学竞赛领域中C和C+的重要区别: C+支持用流输入输出,而C只能用scanf和print

23、f再见了,%d! C+非常支持面向对象编程,而C已经“out”了。资料中的“高精度算法”就只能用C+完成,因为在struct内定义了成员函数。C+可以用更强大的string类处理字符串,而不必担心发生某些低级错误。 C+有强大的STL,而C没有(有一个小小的qsort和bsearch算是补偿了)。STL是很多人从C转到C+的重要原因。 C的头文件名仍然可以用在C+中,不过可能会收到警报应该去掉“.h”,前面再加一个“c”。如应该改成。 C程序运行速度稍优于C+。不过也没快多少。总之,C能做的一切事情,C+也能做;C+能做的一切事情,C不一定能做。1.2数据类型(1) 基本数据类型名称占用空间别

24、名数据范围int4signed, signed int,long, long int2,147,483,6482,147,483,647unsigned int 一般都使用有符号整数,除非范围不够大,或者你确定你的减法运算不会出现“小数减大数”。4unsigned, unsignedlong,unsigned long int04,294,967,295char1char128127unsigned char1unsigned char0255short 一般来说,使用int、long long更保险一些,除非内存不够用。2short int,signed short int32,76832,

25、767unsigned short2unsigned short int065,535long long 不要使用“_int64”!它是Visual C+特有的关键字。8signed long long9,223,372,036,854,775,8089,223,372,036,854,775,807 假如a是long long类型,把超过231的值赋给它时要使用字面值LL(ULL):a=123456789012345LL。unsigned long long8018,446,744,073,709,551,615bool1true或falsechar1128127signed char112

26、8127unsigned char10255float43.4E +/- 38 (7位有效数字)double8long double1.7E +/- 308 (15位有效数字)(2) 变量与常量1. 定义变量:“变量类型 标识符”,如“int i;”定义了一个名字为i的整型变量。注意,此时i并未初始化,所以i的值是不确定的。2. 定义常量:“const 变量类型 标识符=初始值”,如:const int N=90;3. 合法的标识符: 标识符不能和关键字(在IDE中会变色的词语)相同。 标识符只能包括字母、数字和下划线“_”,并且开头只能是字母或下划线。 标识符必须先定义后使用。 在同一作用域

27、内,标识符不能重复定义(即使在不同作用域内也不应重复,否则容易产生歧义)。 C+区分大小写。所以A和a是两个不同的标识符。(3) 数组1. 定义一个一维数组:int a10;这个数组一共10个元素,下标分别为09。访问某个元素时,直接用a加方括号,如a5。2. 定义一个二维数组:int b53;这个数组一共5315个元素,分别是b00、b01、b02、b10b42。访问某个元素时要用两个方括号,如b21。多维数组的定义和使用方法与此类似。3. 数组名和元素的寻址:以上面的a、b为例 数组名是一个指针,指向整个数组第一个元素所在的地址。如a就是&a0、b就是&b00。 多维数组的本质是数组的数组

28、,所以b0实际上是b00、b01的数组名,b0就是&b00。 在内存中,数组中每个元素都是紧挨着的,所以可以直接进行指针的运算。如a+3就是&a3,*(b+1)就是b10,*(*(b+3)+2)就是b32。 在竞赛中要尽可能回避这些功能。4. 字符串: 字符串实际上是char的数组。 字符串最后一位必须是0,否则会在进行输出、使用字符串函数时发生意外。 数组,包括字符串,不可以整体地赋值和比较。如果需要,应使用memcpy和memcmp(字符串是strcpy和strcmp)。5. C+中数组的下标只能从0开始(当然可以闲置不用),并且int a10中a的最后一个元素是a9,不是a10!6. C

29、+不检查数组下标是否越界!如果下标越界,程序很有可能会崩溃!(4) 指针1. 取地址运算符和取值运算符: 取地址运算符“&”:返回变量所在的地址。一般用于变量。(而数组名本身就是指针,无需“&”) 取值运算符“*”:返回地址对应的值,或用于改变指针所指内存空间的值。只能用于指针。2. 指针的意义:保存另一个变量的内存地址。3. 定义指针:int *p;定义多个指针时,每个字母的前面都要有“*”。注意,如果p没有被初始化,它就会指向一个未知的内存空间,而错误地操作内存会导致程序崩溃!4. 指针使用实例:int a = 0, b = 1; int c = 1,2,3,4,5,6,7,8,9,10;

30、int *p;/ 定义一个指针p=&a;/ 让p指向a(*p)=3;/ 相当于a=3(*p)=b;/ 相当于a=b,此时a等于1/ p=b;/ 非法操作,左边是int *,右边是int,类型不匹配。p=&b;/ 让p指向b,从此p和a没关系了p=c+6;/ 让p指向c6,p和b又没关系了cout*p;/ 输出p指向的变量的值,即c6p+;/ 现在p指向了c7;p=NULL;/ 表示p没有指向任何变量cout”):p.value、(&p)-value C+中结构体可以像类一样建立自己的构造函数、成员函数,也可以重载运算符。 对于pack这个结构体,它的内部不允许再有pack类型的成员,但是可以有

31、pack类型的指针。1.3运算符(1) 运算符的优先级运算符结合方式:无.(对象成员) -(指针) (数组下标) ()(函数调用)从左向右+ - (typecast)(强制类型转换) sizeof ! +(一元) -(一元)*(取值运算符) &(取地址运算符) new delete从右向左.* -*从左向右* / %(取余数)从左向右+ -从左向右(右移)从左向右 =从左向右=(判断相等) !=(判断不等)从左向右&(按位与)从左向右(异或)从左向右|(按位或)从左向右&(条件与)从左向右|(条件或)从左向右?:(条件运算符)从右向左= *= /= %= += -= &= = = 、=、=2-

32、eps & d=2+eps) / 相当于if (d=2) 不应该判断一个变量的值是否等于true。安全的做法是判断它是否不等于false。3. 位运算: &、|、分别表示按位与、按位或、按位异或,即两个操作数上每一个二进制位都要进行运算。 表示按位求反。 表示二进制位的移动。当某一位数字移动到二进制位的外面之后,它就直接“消失”了。an相当于a2n。4. 逻辑运算符: &、|、分别表示与、或、异或。!表示非。 ?:是条件运算,它是C+唯一一个三目运算符。它的格式如下:A ? B : C。如果A不为false,那么返回B,否则返回C。可以将这个运算符理解为一个简化版的if。 |、&、?:是短路运

33、算符 例如计算“a & b”,如果a为false,那么实际上结果就是false不管b是什么,程序都不再计算了。不要在这三种运算符内调用函数或赋值,以免发生难以查出的错误!5. 比较运算符、位移运算符、逻辑运算符、条件运算符的优先级较低,所以使用时要多加括号,以防出错。6. 自增(+)、自减(-)运算符: 增量分别是1和-1。 这两种运算符只能用于数值类型的变量,不能用于非数值类型变量、常量、表达式和函数调用上。 前缀+、-和后缀+、-的作用效果不同:int i=0, j=8, k=5;j = j + (+i);/ i先自增,变成1,然后再和j相加。执行之后i=1,j=9。k = k + (i+

34、);/ i先和k相加,使k=6。然后i再自增。执行之后i=2,k=6。 前缀运算符返回引用类型,后缀运算符返回数值类型。 为了避免错误,不要让+、-和其他能够改变变量的操作在同一行出现!7. 赋值运算符: 在C+中赋值是一种运算符。所以你会看到i=j=0、dx=y、return c=i+j之类的代码。 +=、-=、*=、可以简化书写。例如a*=2+3相当于a=a*(2+3)。(3) 真值表pqp & q (p & q)p | q (p | q)p q!p (p)true (1)true (1)true (1)true (1)false (0)false (0)true (1)false (0)

35、false (0)true (1)true (1)false (0)false (0)true (1)false (0)true (1)true (1)true (1)false (0)false (0)false (0)false (0)false (0)true (1)(4) 类型强制转换用一对小括号把数据类型包上,则它右侧的变量或常量的值(变量本身不变)就变成了对应的类型。如:int i=2;float c=6.4/(float)i;/ 把i的值变成float类型。两个操作数进行四则运算,如果想保留小数位,那么两个操作数应该都是浮点数。上面的代码就是这样。1.4函数(1) 定义和使用函数

36、1. 定义和调用函数:下面定义了一个函数,返回值是double类型的,其中有两个参数i、j,分别是int和float类型的。double foo(int j, float j) 如果函数不需要返回任何值,可定义为void类型。 函数的定义必须在函数调用的前面。只有在前面添加了函数定义,才能把具体实现放到调用的后面:double foo(int, float);/ 放到调用之前2. 返回值:return 值; 函数是void类型的,那么return后面除了分号,什么都不跟。 调用之后,函数立刻结束。 不可以直接对函数名赋值(学过Pascal或Basic语言的同学要特别注意)。3. 如果你的函数需

37、要返回指针或引用,你必须注意:不要引用函数内部的变量!因为函数一结束,函数内部的变量就烟消云散,不复存在了。正确做法是引用静态变量(static)或全局变量。4. 内联函数(inline):当一个函数内部只有寥寥几句时,如“华氏度变摄氏度”,可以考虑将其定义成内联函数,通知编译器省略函数入栈等操作,直接展开函数内容,以加快运行速度。inline int FtoC(int f) return (f-32)/9*5; (2) 传递实参1. 按值传递:例如int foo(int n),在调用foo时,程序会把参数复制一份给n。这样,对n的任何修改都不会反映到调用foo的参数上面。对于按值传递数组,一

38、定要慎重。因为复制数组的元素要浪费很多时间。2. 传递指针:例如int foo(int *n)。对n的修改会反映到调用foo的参数上面。 修改n的值时要注意,必须用取值运算符,否则改变的是n指向的内存空间 使用const可防止n指向的内存空间发生改变:int foo(const int *n)。这时再写n=5之类的语句会被报错。 此外,这种方法可以用于传递数组调用时只需把数组名作为参数。这时不需要取值运算符。3. 传递引用:例如int foo(int &n)。优点是既可以直接修改调用foo的参数,又不会带来指针的麻烦(无需取值运算符)。缺点是不能传入常数或表达式。1.5输入和输出!(1) 使用标准输入/输出头文件:变量约定:FILE *fin, *fout;fin、fout分别代表输入文件和输出文件。把它们换成stdin和stdout,就是从屏幕输入和从屏幕输出。“1.5 字符串操作”也使用了同样的变量。1. 输出字符串或变量的值:printf(格式字符串, );或fprintf(fout, 格式字符串, );格式字符:“%”后连接一个字母。字符含义字符含义d整数 在Windows下调试时,用“%I64d”输出long long类型的值。交卷时,由于用Linux测试,要改成“%lld”。e, E用科学记数法表示的浮点数u无符号整数f浮点数o

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号