版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、讲师:尹成QQ:77025077博客:http:/ 传智播客传智播客http:/高薪就业高薪就业传智播客传智播客 2. 链表讲解链表讲解 3.栈,队列,链表综合学习栈,队列,链表综合学习 4.C语言实战语言实战 5.C语言面试语言面试传智播客C语言入门教程(7)大纲 1.编译及预处理编译及预处理6.传智播客传智播客C/C+学院课程介绍学院课程介绍传智播客传智播客传智播客传智播客4宏宏替换预处理预处理是指在进行编译之前所作的处理,由预处理程序负责完成 用一个标识符来表示一个字符串,称为“宏”,被定义为“宏”的标识符称为“宏名”。 在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去
2、代换,这称为“宏代换”或“宏展开”; 传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客1、预处理程序对宏定义不作语法检查。2.宏定义不是普通C 语句,在行末不必加分号,如加上分号则连分号也一起置换 例#define N 3Omain( ) int i; for(i=1;i=N;i+)printf(%dn,i); 传智播客传智播客宏名在源程序中若用引号括起来,则预处理程序不对其作置换例#de
3、fine PRICE 88main( ) printf(PRICE IS %d,PRICE); 运行结果如下:PRICE IS 88而不是 88 IS 88,即双引号中的PRICE 没有用88代替 同一个宏名不能重复定义同一个宏名不能重复定义 如如 # #define PRICE 88define PRICE 88和和 # #define PRICE 100define PRICE 100 不能同时出现在同一段程不能同时出现在同一段程序中。序中。 传智播客传智播客宏定义中的字符串不能替换用户标志符中与宏名相同的部分 #define PRICE 88main( ) int BOOK_PTICE=
4、10;程序中的BOOK_PTICE中的PRICE不会被替换为BOOK_88。传智播客传智播客 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。 #define M 10#define N 2 #define X M+100#define Y M*Nmain( ) printf(M=%dnN=%dnX=%dnY=%dn,M,N,X,Y);运行结果是:M=10N=2X=110Y=20在第三条宏定义#define X M+100语句中,用到了前面已经定义过的宏M传智播客传智播客宏定义一般写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用
5、# undef命令。 #define N 100 main() #undef Nmax() N只在main函数中有效,在max中无效 传智播客传智播客语言有一类宏可以带有参数,在宏定义中的参数称为形式参数,在宏展开中的参数称为实际参数。 带参数的宏在编译连接后,不仅要展开宏,而且要用实参去代换形参,在宏定义中的形参是标识符,而宏展开中的实参可以是任意表达式。带参宏定义的一般形式为: #define 宏名(形参表) 字符串带参宏展开的一般形式为: 宏名(实参表); 例:例: # #define ADD(x) xdefine ADD(x) x* *10 10 / /* *宏定义宏定义* */ /
6、a =ADD (3); a =ADD (3); / /* *宏展开宏展开* */ /在宏展开时,用实参在宏展开时,用实参3 3去代替形去代替形参参x x,经预处理宏展开后的语句经预处理宏展开后的语句为:为: a =3a =3* *1010;传智播客传智播客#define CUBE(x) (x)* (x)* (x)main( ) double y; float z=10; int i; int j=2; y= CUBE (z); i= CUBE (j); printf(y=%8.1fni=%dn,y,i);运行结果是:y=1000.0i=8执行语句y= CUBE (z);时自动将z的值代替(x)
7、* (x)* (x)中的x, 执行语句i= CUBE (j);时自动将j的值代替(x)* (x)* (x)中的x,并且将结果返回给CUBE,再分别赋值给y、i 传智播客传智播客 类似函数的带参数宏定义#include stdio.h#define exchange(a,b) int t;t=a;a=b;b=t;void main()int x=10;int y=20;printf(x=%d; y=%dn,x,y);exchange(x,y);printf(after exchange:x=%d; y=%dn,x,y);上述程序运行结果如下:x=10; y=20after exchange:x=
8、20; y=10传智播客传智播客传智播客传智播客、一条include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。不能这样写include 语句:#include “m1.h,m2.h” 或#include “m1.h”,”m2.h”而必须写成:#include “m1.h” #include “m2.h”、文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。、文件包含语句中被包含的文件通常是以.h 结尾的头文件,这种头文件中的内容多为变量的定义、类型定义、宏定义、函数的定义或说明,但被包含的文件也可以是以.c为扩展名的语言源文件。传智播客传智播客与第
9、一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译。这与第一种形式的功能正相反。 传智播客传智播客传智播客传智播客实现宏定义加减乘除函实现宏定义加减乘除函数,数,实现循环宏定义输出字实现循环宏定义输出字符串传智播客符串传智播客,变量层叠宏定义变量层叠宏定义1234条件编译实现中文英文韩文条件编译实现中文英文韩文日文多语种界面日文多语种界面实现实现将将C语言语言的语句汉化的语句汉化,类型汉化,以及代码混,类型汉化,以及代码混淆淆实现条件编译,实现条件编译,实现中实现中英文界面英文界面传智播客传智播
10、客head12491249A135613561475B1475C10211021D0头指针头指针各结点地址不连续各结点地址不连续各结点含有两个部分各结点含有两个部分表尾表尾传智播客传智播客1010189.510103901010785a结点结点b结点结点c结点结点a.next=&b;b.next=&c;numscorenext传智播客传智播客1010189.510103901010785a结点结点b结点结点c结点结点numscorenext传智播客传智播客1010189.510103901010785a结点结点b结点结点c结点结点numscorenextheadhead=&am
11、p;a;a.next=&b;b.next=&c;NULLc.next=NULL;传智播客传智播客传智播客传智播客链表的建立一般是指先建立一个空链表,而后一个个地将元素插在队尾。传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客数组数组链表链表链表与数组的比较链表与数组的比较. 内存中按照顺序存放 寻址容易 大小固定 删除时需要很多移动 静态数组无法增加,动态数组需要很多移动 内存中按照指针链式存放 寻址需要循环 大小可变 查找时需要很多移动 删除,插入非常便捷啥时候用数组,啥时候用链表啥时候用数组,啥时候用链表.各个不同各个不同传智播客传智播客实现
12、链表逆转实现链表逆转实现链表排序以及删除所有节点实现链表排序以及删除所有节点构建一个链表的数据结构构建一个链表的数据结构传智播客传智播客栈和队列。栈和队列的操作受到了一定程度的限制对栈而言,只能在栈顶一端进行元素的插入和删除.队列只允许在一段插入,在另外一端删除元素。数据结构是合理组织数据的手段,掌握数据结构,能使代码组织清晰,程序质量高,易读易维护。传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客用栈实现进制转换用栈实现进制转换 用用栈实现逆序栈实现逆序用栈实现进制转换用栈实现进制转换传智播客传智播客项目实践项目实践算法案例实践案例实践案例实践案例实践案例实践
13、案例实践案例实践案例实践传智播客传智播客自顶向下,逐步求精问题所在问题分析问题分解设计逻辑与封装逐步实现12345传智播客传智播客 入口入口出口出口面向过程的编程方法面向过程的编程方法 传入数据 传出结果对单个模块而言,只有一个入口,一个出对单个模块而言,只有一个入口,一个出口,是一种从上到下的流程式方法,减少口,是一种从上到下的流程式方法,减少了模块的相互联系了模块的相互联系 使模块可作为插件或积使模块可作为插件或积木使用,降低程序的复杂性,提高可靠性木使用,降低程序的复杂性,提高可靠性面向过程面向过程传智播客传智播客编写高质量的C程序设计理念封装可复用传智播客传智播客耦合度,是指模块之间相
14、互依赖性大小的度量,耦合度越小,模块的相对独立性越大。内聚度,是指模块内各成份之间相互依赖性大小的度量,内聚度越大,模块各成份之间联系越紧密,其功能越强。AmericaEuropeAsia巴西巴西美国美国非洲非洲俄罗斯俄罗斯澳大利亚澳大利亚内聚耦合传智播客传智播客检验你前面学习的效果好坏,就看你是否能够通过世界五百强严酷的检验你前面学习的效果好坏,就看你是否能够通过世界五百强严酷的C语言考核,不过五百强很有挑战,你先搞定基础的面试题语言考核,不过五百强很有挑战,你先搞定基础的面试题100题。题。面试面试笔试笔试机试机试检验你是否检验你是否通关通关传智播客传智播客传智播客传智播客传智播客传智播客
15、传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客 写一个函数找出一个整数数组中,第二大的数。n 传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客 写出下面的结果nchar str1 = abc;nchar str2 = abc;nconst char str3 = abc;nconst char str4 = abc;nconst char *str5 = abc;nconst char *str6 = abc;nchar *str7 = abc;char *str8 = abc;ncout ( str1 = str2 ) endl; cout
16、( str3 = str4 ) endl; cout ( str5 = str6 ) endl; cout ( str7 = str8 ) endl;传智播客传智播客传智播客传智播客 写出输出结果nInt main()nnint a5=1,2,3,4,5;nint *ptr=(int *)(&a+1);nprintf(%d,%d,*(a+1),*(ptr-1);n传智播客传智播客传智播客传智播客 nint a=248; b=4;int const c=21;const int *d=&a;nint *const e=&b;int const *f const =&
17、;a;n请问下列表达式哪些会被编译器禁止?为什么?传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客什么是预编译, ,何时需要预编译? ?n预编译又称为预处理, ,是做些代码文本的替换工作。处理# #开头的 指令, ,比如拷贝#include #include 包含的文件代码,#define #define 宏定义的替换, ,条件 编译等,就是为编译做的预备工作的阶段,主要处理# #开始的预编译 指令,预编译指令指示了在程序正式编译前就由编译器进行的操作, 可以放在程序中的任何位置。nc c 编译系统在对程序进行通常的编译之前,先进行预处理。c c
18、 提供的 预处理功能主要有以下三种:1 1)宏定义 2 2)文件包含 3 3)条件编 译传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客n27 . main函数既然不会被其它函数调用,为什么要返回 1 nint main()nn int x=3;n printf(%d,x);n return 1;n传智播客传智播客nint sum(int a)nn auto int c=0;n static int b=3;n c+=1;n b+=2;n return(a+b+c);nnvoid main()nnint I;nin
19、t a=2;nfor(I=0;I5;I+)nnprintf(%d, sum(a);nn传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客完成输出下列字符n*n*.*.n*.*.*.n*.*.*.*.n*.*.*.*.*.n*.*.*.*.*.*.n*.*.*.*.*.*.*.传智播客传智播客传智播客传智播客传智播客传智播客带参宏带参宏带参函数带参函数处理时间编译时运行时参数类型无需定义程序长度变长不变占用存储空间否是运行时间不占运行时间调用和返回时占传智播客传智播客传智播客传智播客、请写出链表的插入排
20、序法,冒泡排序法。传智播客传智播客传智播客传智播客传智播客传智播客单连表的建立,把a-z26 个字母插入到连表中,并且倒叙,还 要打印传智播客传智播客求组合数: 求 n 个数(1.n)中 k 个数的组合.nn如:combination(5,3)nn要求输出:543,542,541,532,531,521,432,431,421,321,传智播客传智播客求全排列: 求 n 个数(1.n)中 k 个数的排列.nn如:P (2,2)n12 21n如:P (3,2)n12 21 13 31 23 32传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客有一分
21、数序列:1/2,1/4,1/6,1/8,用函数递归调用的方法,求此 数列前 20 项的和传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客两个字符串,s,t;把 t 字符串插入到 s 字符串中,s 字符串有足够 的空间存放 t 字符串传智播客传智播客请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符, 并返回该字符所在位置索引值。传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客n【标准答案】8,10,12,14,16传智播客传智播客【标准答案】16传智播客传智播客传智播客传智播客有双向循环链表
22、结点定义为:nnstruct nodenn int data;nnstruct node *front,*next;nn;nn有两个双向循环链表 A,B,知道其头指针为:pHeadA,pHeadB,请 写一函数将两链表中 data 值相同的结点删除传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客编写一个 C C 函数,该函数在一个字符串中找到可能的最长的子 字符串,且该字符串是由同一字符组成的。传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客传智播客编程实现:把十进制数(long (long 型) )分别以二进制输 出,不能使用 printf print
23、f 系列库函数。传智播客传智播客unsigned int TestAsOne0(char log) int i; unsigned int num=0, val; for(i=0; i i; /移位 val &= 0 x01; /与1相与 if(val) num+; return num; 传智播客传智播客int Invert(char *str) int num=0; while(*str!=0) int digital=*str-48; num=num*10+digital; str=str+1; return num; 传智播客传智播客void IntToCharChange(i
24、nt num, char* pval) char strval100; int i, j; int val0 = 0; int val1 = 0; val0 = num; for(i=0; i100; i+) val1 = val0 % 10; /取余 val0 = val0 / 10; /取整 strvali = val1 + 48; /数字字符 if(val0 10) i+; strvali = val0 + 48; break; for(j=0; j=i; j+) /倒置 pvalj = strvali-j; pvalj = 0; 传智播客传智播客用递归算法判断数组 aNaN是否为一个递
25、增数组。 传智播客传智播客传智播客传智播客int search(char *cpSource, int n, char ch) /起始地址,搜索长度,目标字符int i;for(i=0; in & *(cpSource+i) != ch; +i);return i;传智播客传智播客int ChildString(char*p) /自己写 char *q=p;int stringlen=0, i=0,j=1,len=0,maxlen=1; while(*q!=0) /不能用strlen,求得长度stringlen Stringlen+;q+; while( i Stringlen ) i
26、f(*(p+i)=*(p+j)&jmaxlen) /统计最大子串长度 maxlen=len+1; len=0; else len=0; i+;j+; return maxlen; 传智播客传智播客传智播客传智播客void BubbleSort(double arr, int n) int i,j; int exchange = 1; /交换标志 for(i=1;i=i;j-) /对当前无序区Ri.n自下向上扫描 if(arrj+1 arrj)/交换记录 arr0=arrj+1; /R0不是哨兵,仅做暂存单元 arrj+1=arrj; arrj=arr0; exchange=1; /发生
27、了交换,故将交换标志置为真 if(!exchange) /本趟排序未发生交换,提前终止算法 return; /endfor(外循环) 传智播客传智播客/删除操作StatusListDelete_DuL(DuLinkList&L,inti,ElemType&e)if(!(p=GetElemP_DuL(L,i)returnERROR;e=p-data;p-prior-next=p-next;p-next-prior=p-pror;free(p);returnOK;/插入操作StatusListInsert_DuL(DuLinkList&L,inti,ElemType&
28、;e)if(!(p=GetElemP_DuL(L,i)returnERROR;if(!(s=(DuLinkList)malloc(sizeof(DuLNode)returnERROR;s-data=e;s-prior=p;p- next - prior =s; p-next=s;s-next=p-next-next;returnOK;传智播客传智播客传智播客传智播客输出和为一个给定整数的所有组合传智播客传智播客#include #include main()main() char string81;char string81; int i,num=0,word=0;int i,num=0,wo
29、rd=0; char c;char c; gets(string);gets(string); for(i=0;(c=stringi)!=0;i+)for(i=0;(c=stringi)!=0;i+) if(c= ) if(c= ) word=0;word=0; else if(word=0)else if(word=0) word=1; num+; word=1; num+; printf(There are %d words in the linen,num);printf(There are %d words in the linen,num); 传智播客传智播客有两个双向循环链表 A A,B B,知道其头指针为:pHeadA,pHeadBpHeadA,pHeadB,请 写一函数将两链表中 data data 值相同的结点删除传智播客传智播客#include stdio.h#include stdlib.hmain()int i,j
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西省吕梁市离石区光明小学校2023-2024学年五年级上学期期中英语试卷
- 塑料制品的抗紫外线和抗老化处理考核试卷
- 电气机械的电磁场与电波传播考核试卷
- 劳务协作就业帮扶项目实施方案
- 台球游戏课件教学课件
- 篮球的课件教学课件
- 医院新员工培训总结报告
- 食品安全教育培训
- 针叶樱桃课件教学课件
- 册草原课件教学课件
- 学校人事管理制度改革方案
- 韩国《寄生虫》电影鉴赏解读
- 三对三篮球赛记录表
- 石油和天然气输送行业物联网与智能化技术
- 高考英语高频词汇汇总
- 六年级语文下册《记一次体育比赛》教案设计
- 文档系统需求方案(完整版)资料
- 贵州省高中信息技术会考复习
- 建筑陶瓷制造行业技术趋势分析
- 小学六年级地方课程《可爱的四川》教案
- 药品微生物检验基础知识培训课件
评论
0/150
提交评论