收藏 分销(赏)

编程-C語言设计语言课件.pdf

上传人:曲**** 文档编号:10599500 上传时间:2025-06-04 格式:PDF 页数:240 大小:11.39MB 下载积分:15 金币
下载 相关 举报
编程-C語言设计语言课件.pdf_第1页
第1页 / 共240页
编程-C語言设计语言课件.pdf_第2页
第2页 / 共240页


点击查看更多>>
资源描述
C程序设计语言作业及参考书 教师:晏海华(软件所,逸夫馆505)口参考书:(1)(3呈序设计语言,B.W.Kernighan,D.M.Ritchie,清华大学出 版社影印;机械工业出版社,徐宝文等译;(2)C语言教程,孙玉芳,孟庆昌编著;(3)(3呈序设计语言,谭浩强,清华大学出版社;作业:from W Programming Language-P13.1-4;P20 1-8,1-9,1-10;P24 1-13;P31 1-18;P34 1-20,1-22,1-23;P46 2-3;P49 2-6,2-8;P58 3-1;P60 3-2;P63 3-3;P64 3-5,3-6;P71 4-1;P73 4-2;P79 4-4,4-6,4-10;P83 4-11;P88 4-13;P97 5-1,5-2;P107 5-3,5-5;P110 5-7;P118 5-13;P121 5-14;P126 5-19;P1436-2,6-3共计34题,请选做其中的20道题,作业占总成绩的10分。刖BC语言的产生、发展和它与UNIX系统的关系C语言的产生与UNIX操作系统是密不可分的:UNIX由Bell Lab的KThompson和D.M.Ritchie最先在1969年开发的OS(它的 前身是MIT和AE开发的Multies)。1970年,V1,V2版在PDP-7机上用花缩静言实现。1971 年V3 PDP11/23;1972年V4 PDP11/45。1972年,D.M.Ritchie开发出新语言C。(C 6 B(BCPL R CPL单数据型语言)1973年,Ritchie和Thompson用C改写了UNIX核心(90%)即V5、八 一刖Bc语言的发展经历三个阶段:第一阶段:78年以前,C称为UNIX C,即C被看成第二阶段:78年D.Ritchie的C程序设计语言出版到 88年ANSI C(标准C)标准出现。此C又称为K&RC。第三阶段:88年ANSI C标准(89年3月批准)。CPL-今BCPL今B-今C 今C+1968 C.Strachey 1969 M.Richards 1970 K.Thompson 1972 D.M.Ritchie 1988 B.Stroustrupc语言特别适用于编写:操作系统;一编译程序数据库管理系统网络软件图形软件其它系统软件及软件工具应用软件刖S第一章C语言导论I C语言特点I C语言的一般介绍I咖序的编辑、编译和运行第一章C语言导论1.1C语言特点1)表达能力强2)有先进的数据结构郑控制结构,支持结构化、模块化程序设计,为大型软件开发提供有力工具。数据类型第一章C语言导论第一章C语言导论控制流设施复合语句 语句序列分程序局部说明;语句序列条件语句 if i-if-else循环语句 while,do_while,for开关语句 switch转向语句 goto,continue,break,return存贮类auto 局部变量(自动变量)static 静态存贮分配变量extern 外部全程变量register 寄存器变量分块编译功能第一章C语言导论3)可通过预处理程序,进行宏定义,处理包含文件和条 件编译4)语言简洁,键入量少(仅有五个基本类型和32个关键 字)如,=,+=,*=,+,.5)效率高C编写的程序仅比用汇编语言编写的程序相差20%6)可移植性好C编译规模较小,用C记述的75%80%的代码相同。此外,C编译几 乎在所有的系统上都有。C语言本身提供某些设施,使C程序移植容易。第一章C语言导论C语言缺点算符太多,优先级多,不便记忆。相对来说,c语言类型转换随便,安全性较差(如指针)。可读性比PASCAL语言差。第一章c语言导论1.2 c语言的一般介绍1.2.1词汇表数字:0,1,.9英文字母:a,b,.z,A,B,.Z(一般用大、小写表示不同字符)连字符:作用同英文字母标识符:以字母(或_)开头的字母(_)数字串。一般不要太长,依赖于实现。运算符和分界符:+,/,%,夕 二?第一章c语言导论1.2.2关键字define,undef,include,ifdef,ifndef,endif,及line,虽不是关键字,但是最好把 它们看作关键字,它们主要用于C预处理程序中。intautogotoiffloatstaticreturnelsecharexternbreakwhileshortregistercontinueforlongdounsignedswitchdoublecasestructdefaultunionvoidenumtypedefsizeofconstsigned第一章C语言导论1.2.3 C语言程序结构C程序由一系列外部说明和函数组成。一个C程序可由一个或多个函数(它们之间不能嵌套)组成,但其 中必有一个(也只能有一个)命名为main(主函数),其它函数 可由用户任取名字。程序运行时必需从main开始,但main函数在 程序中的前后位置没有关系。组成C程序的各个函数可在一个源文件上,也可以分放在多个文件 上(函数不能跨文件),每个源文件可单独编译。C源文件必须以.C作后缀(.h为C程序的头文件)。第一章c语言导论例 1-1/*file:hello.c*/f二 main()(printf(4hello,worldn);)说明:1./*/为注释,不可嵌套2.main()为主函数定义3.printf为标准I/O库中格式化输出 函数4.口为C语言转义字符,常用的有:n 换行t 制表b 退格k 回车f 换页 本身,单引号ddd 位模式“双引号5.分号(;)为语句的结束符(这与 PASCAL语言不同,在PASCAL中分号为语句的分隔符)第一章C语言导论例 1-2main()/*simple.c*/int a,b,c,sum;a=1;b=2;scanf(d”,&c);/*注意要用地址*/sum=a+b+c;printfCSum=%dn sum);说明:在scanf和printf中,号开始的为格 式转换字符,用桂制输入/出格 式,常用的有in%4d,%6.2fscanfprintf%d%d十进制整数%f%f十进制浮点数%c%c单个字符%s%s字符串%0八进制整数%x十六进制整数%本身同时,在4%前还可以加数字,第一章c语言导论1.3 C程序的编辑、编译和运行使用编辑器如:vi(UNIX),edit(DOS)编译=.o或.obj连接.o(.obj)=.exe第一章C语言导论1)UNIX编译环境Cc-o执行文件名-c文件名o:指定执行文件名,缺省为a.out c:产生.0文件如:sl.c,s2.c s3.c组成一个C程序,则有:,cc-c sl.ccc-c s2.ccc-o s sl.o s2.o s3.c2)DOS 及 Windows 环境目前,在DOS和WINDOWS环境下的C编译系统已将C程序的编辑、编绎、连接、调试和运行集成到一起,如VC,BC等开发环境。3)输入/输出重定向,输出重定向,将标准输出重定向到指定文件,如,C prog outfile prog progl I prog2第一章C语言导论第二章数据、运算符、表达式2.1标识符和变量2.1.1标识符 标识符在C语言中可作为变量名、常量名、函数名、参数名、类 型名、枚举名和标号等。通常定义名用大写,其它名字用小写。以连字符(_)开始的名字用户最好不用(通常系统取名以一开始)o好的标识符可使程序易读,也可以减少写程序或修改程序时 由于疏忽而产生的错误。第二章数据、运算符、表达式2.1.2变量与变量说明在C中,所有变量必须先说明(定义)后使用。说明方式:存贮类1类型变量(列)表;例:int lower,upper,step;char c,line100;extern double x;const double PI=3.1415926;const char msg =Warning”;第二章数据、运算符、表达式2.2常量2.2.1文字常量(literal)和常量定义line 66ci=3.141592*dia;si!=W;一又如:#define PAGESIZE 6666、3.141592和 90,都是文字常量#define PI 3.141592#define ENDSTRING 0则上面可以写成:line=A&c v=Z)return(c+3-A);第二章数据、运算符、表达式4)字符串常量 _ _ 一一用一对双引号括起来的字符串称为字符串常量,如:“The C Programming Language”注意:所有字符串均以0结束(代码值为0的字符),因此,“x”和父不同,末尾的w由编译程序自动添加。第二章数据、运算符、表达式2.3基本数据类型数据类型一般32位操作系统(如 UNIX,W32)16位操作系统(如 DOS)int3216short(int)1616long(int)3232unsigned(int)3216float3232double6464char88在ANSI C中,还有两个类型修饰符:const-其变量值在程序执行中不可以通过赋值等方法对它进行 修改(是定义常量的另一种方法,定义的常量无类型,而用const定义的常量有类型)。Volatile-变量的值可能在程序中以某种不明显方式改变。第二章数据、运算符、表达式2.4类型转换一可利用函数将一种类型转换成另一种类型,如:int atoi(char s)int i,n;n=0;for(i=0;si=U&si=9;i+)n=10*n+si 一 O;return(n);)main()int n;char st100;scanf(“s”,st);n=atoi(st);printf(dn”,n);第二章数据、运算符、表达式C语言类型转换通常是自动的一隐式类型转换1)字符与整数可以用整数的地方就可以用字符。而整数转换成字符时,超出8位就将高位丢掉。2)浮点数与整数浮点截去小数部分,整数3)无符号整数一般整数(int)和无符号整数(unsigned)混合使用,则简单整 数转换成无符号整数。第二章数据、运算符、表达式4)算术转换如果一个运算符,有不同类型的运算对象空B么“较低”类型会自动 转换成“较高”类型。double-float此外,赋值号右边表达式的类型会自动转换为赋值号左边变量类 型。第二章数据、运算符、表达式强制类型转换(cast)-显式类型转换(V类型名)表达式,如:x=sqrt(double)n);第二章数据、运算符、表达式2.5表达式和运算符C语言中一个表达式后跟一个分号可构成一条语句,如:;称为表达式语句在C语言中,分号是语句的结束符,而在PASCAL语言中分号 是语句的分隔符。在其它语言里常见的赋值语句El=E2;在C语 言中称为赋值表达式语句。在C中,a=b=c=0;是合法的赋值表达式语句。第二章数据、运算符、表达式2.5.1表达式表达式:=V初等表达式 即 初等量+相当tI单目表达式,I双目表达式I V条件表达式,I V赋值表达式,初等表达式:=标识符,变量名、常量名等I V常量,文字常量IV字符串I(V表达式,)I V标识符(表达式,表达式*)I V左值,第二章数据、运算符、表达式V左值:标识符,一 I左值 表达式力I V左值标识符,I V左值A-v标识符I(左值)I*v表达式变量被赋变量数组元素:_结构或联合成员 一同上指针变量,取指针所指对象作为被赋从上可以看出,一般只有变量、数组元素、结构成员才能做为左值第二章数据、运算符、表达式1.单目表达式由单目运算符构成的表达式,格式为:-一二(单目运算符运算对象单目表达式:二*表达式I&V左值I-表达式I+表达式I Y表达式,I!表达式I(类型名)表达式I sizeof表达式I sizeof(V类型名,)I+V左值I-Y左值I V左值+I左值-取指针所指对象内容取变量地址单目减单目加按位反逻辑反强制类型转换数据类型的大小,以字节计同上前置增/减量后置增/减量第二章数据、运算符、表达式例1 指针和地址int x,y;int*px;x=10;px=&x;y=*px;(间接取,相当于y=x)指针变量用来存放所指对象的地址。注忌:-只有左值,才能取地址,即变量或数组元素能取地址。所以,&(3),&(x+5)等非法。-只有左值,才可对它进行+或一运算。第二章数据、运算符、表达式例2 前置和后置增(减)量n=5;n=5;x=+n;结果:ff:6,x:6x=n+;结果:x95,n:6前置运算是先进行增减量,再取其值。后置运算是先取其值,再进行增减量运算。第二章数据、运算符、表达式例3给出下列程序的输出结果#include main()int a,b,c;a=b=c=0;a=+b+c;printfC6%d%d%dn5a,b,c);a=b+C+;printfC6%d%d%dnta,b,c);a=+b+C+;printf(u%d%d%diT,a,b,c);a bic;printfC6%d%d%dna,b,c);a=+c+c;printfC6%d%d%dna,b,c);/*2 11*/P 222 V/*5 3 3*/*5 2 2 号/*不确定,取决于机器实现*/第二章数据运算符、表达式2.双目表达式双目表达式,:=表达式,双目运算符,V表达式V双目运算符:=*I/1%I+I-1 I I I=I,=,:=v表达式1?表送式必不太凝塞先计算表达式1,若其值为非零,则结果是表达式2的值,否则就 是表达式3的值。例:if(a b)z=b;等价于:z=(a b)?a:b;第二章数据、运算符、表达式4.赋值表达式赋值表达式左值赋值运算符次表达式v赋值运算符:=I+=I-=1/=I%=I*=I=I=I&=I A=11=赋值表达式可表示为:(el)op=(e2)其中op为一个双目运算符,其等价于(el)=(el)op(e2)如,x+=n;即x=x+n;注意:这种等价关系并不是完全正确的,因为在(el)op=(e2)中,el只并算一次,而在(el)=(el)op(e2)中却计算两次,例如:a+i*=n与a+i=a+i*n不同,后者跟计算次序有关。第二章数据、运算符、表达式使用赋值表达式的优点:一 表达式简明扼要,如:bfreelist_frow-b_back+=2编译程序产生效率高其用一个运算符完成其它语言中须多个运算符才能完成的功 能。如:x+=n只有一个运算符,而x=x+n则有两个运算符O注思:y*=n+1;3 y=y*(n+l),而不是y=y*n+l第二章数据、运算符、表达式2.5.2运算符的优先级和结合顺序15优先级运算结合律1初等量运算符().-单目运算符初等量运算符2-!+-&*(类型名)sizeof 双目运算符右结合 单目运算符34*/%H算术运算符5 移位运算符678910=关系运算符_=1=&A1按位运算符1112&II三目运算符逻辑运算符13?:赋值运算符右结合14*=/=%=+=-=&=八=1=逗号运算符右结合第二章数据、运算符、表达式第三章语句与控制流3.1概述C语言语句分成简单语句和构造语句两类。第三章语句与控制流简单语句1)表达式语句赋值表达式语句,如:*X+其它表达式语句,如:+X;-函数调用语句等。2)转移语句goto标号;break;间断语句continue;继续语句return;return(表达式);3)空语句;=y*=z+3;构造语句1)复合语句(分程序)局部数据说明1*注意:后没有分号(;),这与单个语句不同。2)条件语句if语句,if_else语句3)循环语句for语句while语句do_while 语句4)开关语句switch语句(包括case语句)第三章语句与控制流3.2条件语句if(表达式)语句if(表达式)语句1 else表达式F语句2第三章语句与控制流注意:在if嵌套中,省略else会产生二义性。如:if(n0)if(a b)z=a;elsez=b;即else与前面最接近的不带else的if相对应。若要使上面的else与第一个if相 匹配,可使用。如:if(n 0)if(a b)z=a;)elsez=b;第三章语句与控制流若if语句的else部分嵌套if语句,如:if()else if()else这是实现多路分支的最一般方法。第三章语句与控制流例3-1:#include main()|int a,b;char ch;scanf(66%d%d,ch=getchar();if(ch=y)int x;x=a;a=b;b=x;printfCa=%d b=%dn,a,b);)else printf(66no swap!n);第三章语句与控制流3.3 while语句while(表达式语句第三章语句与控制流例3-2从键盘读入字符并输出#define EOF-1main()(int c;while(c=getchar()!=EOF)putchar(c);)第三章语句与控制流例3-3有一阶梯,每跨2阶余1阶;每跨3阶余2阶;每跨5阶余4阶;每跨6阶余5阶;每跨7阶正好不余,求共有几阶?_main()(int x=3;while(x%3!=2)x+=2;while(x%5!=4)x+=6;while(x%6!=5)x+=30;while(x%7!=0)x+=30;printfCx=%dn,x);)第三章语句与控制流3.4 for语句for(表达式1;表达式2;表达式3)嘤塞田巷f-血,号,.至语句其等价于:表达式1;while(表达式2)语句;表达式3;F语句结束第三章语句与控制流for特别适合于循环次数固定或有固定步长的循环,如下一个 循环十次的循环:;for(i=0;i=O&si=9;i+)n=10*n+si-40,;return(sign*n);第三章语句与控制流例3-5将字符串颠倒 void reverse(char s)(int c,ij;for(i=09 j=strlen(s)-1;i j;i+,j-)c=si;si=s|j;sj=int strlen(char s)一int i=0;while(si!=0)+i;return(i);第三章语句与控制流注意:从语法上讲,表达式中任一个都允许省略,但分号不能省。如:=for(;(c=getchar()!=EOF;)工语句s;for(;)语句S;当表达式2不出现时,则认为条件为真,循环永远下去(无穷循环),退出 它只能用break或return语句。所以,一个while(A)B;等价于一个for(;A;)B;第三章语句与控制流3.5 dojAhi I e语句do语句while(表达式);作用类似于while,但do_while是否 终止,其判定条件是在猫环体之后,即它总是先执行一次循环体,再判断表达式的值是否为真。第三章语句与控制流总的说来,while(for)循环是在顶上测试循环终止条件,而 do_while是在每次通过循环体之后,在底部进行测试,所以 循in本至少要进行一次。注意:do_while与Pascal语言中的Repeatuntill不同 其 布尔表达式为False时继续循环,若为True时,终止循环。第三章语句与控制流例3-6将一个整型数转换成字符串。void itoa(int n,char s)i=0;do int i,sign;if(sign=n)0);if(sign 0)si+=si=W;reverse(s);第三章语句与控制流三种循环主要的用途:for通常用于固定步长的循环 while通常用于循环条件在头部判断的循环 do_while通常用于至少循环一次的循环第三章语句与控制流3.6开关(switch)语句-另一种表达多路支方式基本形式:switch(表达式)语句语句的表达形式为:case常量表达式:语句或空default:语句第三章语句与控制流switch语句的常见形式为:swich(表达式)case常量表达式1:语句1或空;case常量表达式2:语句2或空;case常量表达式n:语句n或空;default:语句n+1或空;其语义动作为:1)先计算表达式的值;2)该值与每一个case后的常量进行比较;3)若匹配,则控制就转向该常量后的语句;4)若不匹配,若有default,则转向default后的语句,否则什么也不 做;第三章语句与控制流注意:1)常量表达式必须是整型=1二八 2)在同一个switch中不应出现两个具有同样的情况常量;3)default语句如果有,只允许出现一次,default可出现在 switch中的任何位置,通常放在最后;4)case和default本身不改变控制流(这与pascal中的case语句不 同),中断离开switch要用break;5)case后的语句可以是单个语句,也可以是复合语句(但不带 开头和结尾的花括号)C的switch语句与Pascal中case另一个不同是:C有default语句。第三章语句与控制流例打印学生成绩片断char score;switch(score)case E:printfCno passn);break;case D:printf(passn);break;case C:printfCbetterXn99);break;case B:printf(rightn);break;case A:printfCall rightn);break;)第三章语句与控制流3.7间断、继续、转移和返回语句(无条件转移语句)break:迫使程序从包含它的最内层循环体或开关语句中跳出(循一环只能跳出一层)。打,三一_一:continue:迫使程序从包含它的最内层循环体立即执行下一次循环(不管现在程序执行到何处)。goto标号:使控制转移到标号处。/标号作用范围是当前函数;,只允许从里层转向外层,而不允许反过来由外层转向里层;return:把控制返回调用程序。它有两种形式:(1)return;或(2)return(表达式);注意:(1)main不需要也不要return语句。(2)如函数无return语句,则程序执行完该函数最后一条语句后,便自动返回调用程序。第三章语句与控制流国际上对goto语句作出结论:从理论上讲,goto语句决非是必要的语言 成份,取消它同样可写出各种各样的程序,但有时不得不用got。语句,如下 程序段。应该是有选择地使用goto,以达到程序结构清晰、易读、易维护的 目的。.、二二一”一二int i,j,k,x;float y;for(i=.)for(j=.)for(k=.)scanf(u%d%f&x,&y);if(x 0&y 0)while(n=0)if(linen!=6 6&linen!=n&linen!=6f)break;linen+l=0;printfC6%sn5 line);)第三章语句与控制流int getline(char s,int lim)int c,i;for(i=0;i=O&c v=9)continue;count+;)printfCnon digital character:%dn,count);)第三章语句与控制流本章综合练习:例3-9:给出下面程序的输出结果。#include char input =66SSSWILTECHllllWlWALLMPr,;main()(int i,c;for(i=2;(c=inputi)!=0;i+)switch(c)case a:putchar(i);continue;case I:break;case 1:while(c=input+i)!=W&c!=609);case 9:putchar(S);case E:case L:continue;default:putchar(c);continue;putcharC);putcharCXn5);)结果:SWITCH SWAMP第三章语句与控制流2.给出下面程序段的输出结果。一 for(putchar(r);putchar(2,);putchar(3,)putchar(44,);continue;putchar(5,);)结果:1243243.第三章语句与控制流3.简化下面程序段,去掉其中的无条件转移语句。if(B)contine;C;)结果:while(A)if(!B)C;第三章语句与控制流第四章函数和程序结构4.1概述使用函数的目的:(1)功能分解的需要;(2)代码重用;常用的标准库函数有:标准I/O库函数#include (getchar,putchar.)标准数学函数#include (sin,cos,sqrt.)Ai TnBCD第四章函数和程序结构4.2函数4.2.1函数结构(函数的定义和调用)在ANSI C标准中,函数定义形式为:类型函数名(参数说明)(局部变量定义或说明语句)第四章函数和程序结构口函数名一般是标识符,一个程序只有一个main函数,其它函数 名可随意取,当然最好是有助于记忆的名字。一口在ANSI C标准中,函数返回值不允许省略,即使是返回整型值(int),当函数无返回值时,应说明为void类型。局部变量定义或说明可有可无。在C语言中,函数在概念上相当于Pascal中的过程(procedure)和 函数(function)两种情况,无返回值时就是过程。实际上,C的 函数往往兼存函数和过程双重功能。注意:在C语言中,函数定义不允许嵌套,即在一个函数体内不 能包含有其它函数的定义,这与Pascal语言不同。第四章函数和程序结构函数调用形式:函数名(实参表)_ _ _._ _ _其中实参个数、类型、排列次序应和形参定义时一致。(老版本的C编译器往往不做这方面的检查)函数通过return语句将值返回给调用函数。第四章函数和程序结构例4-1:计算x的幕。#include int power(int x,int n);main()(int i;for(i=0;i=10;+i)printf(d%d%dn”,i,power(2,i),power(-3,i);)int power(int x,int n)(int i,p;p=1;for(i=l;i 0;-n)p*=x;return(p);第四章函数和程序结构例4-2在输入中查找给定串。#define MAXLINE 1000int index(char s,char t);int getline(char line,int ml);main()(char lineMAXLINE;while(getline(line,MAXLINE)0)if(index(line,the)=0)printf(=O&si=O&si 0)printf(“t%.2fn sum+=atof(line);注意:函数原型说明的类型、参数类型、个数及次序必须与函数定义时一 致,否则会产生错误。第四章函数和程序结构4.2.4参数一口调用函数时,实参的类型、排列次序和个数应与函数定义时 形参相对应(在ANSI C标准中,若不一致,将出现编译错误),但float将自动转换为double类型,char和short将转换为int类型 O数组名将转换为指向该数组第一个元素的指针值(数组的首 地址)。口C函数的参数传递全部采用传值,它没有Pascal中的变量形参,所以只能传递实参变量的值,而不能隐含传地址。一一传值 调用实际上重新拷贝了一个副本给形参,因此,我们可以把函 数形参看作是局部变量。传值的好处是传值调用不会改变调用 函数实参变量的内容,因此,可避免不必要的副作用。口如何改变实参变量内容?第四章函数和程序结构有时,确实需要改变实参变量的内容,如何实现?首先,我们来看一个例子,void swap(int x,int y)int temp;temp=x;x 二 y;y 二 temp;main()int a=2,b=3;swap(a9 b);o请问a和b是否交换i 不能!第四章函数和程序结构若要交换实参变量a和b,正确的做法应为:void swap(int*px,int*py)(int temp;temp=*px;*px=*py;*py=temp;)/、&amam()(int a=2,b=3;swap(&a,&b);px间接取间接取,间接存间接存第四章函数和程序结构提示:这也是为什么用scanf读int,char,double类型数据时要取变量 地址。因为需要改变变量内容。因此,在一定要改变实参变量内容时,应把函数的形参显式地说明 为指向实参变量(类型)的指针,相应地调用时应该用变量的地址 值作为参数。尽管C的函数和函数返回值一般应为基本类型,但它们却可以是指 向任何类型(包括复杂的结构类型,甚至其它函数)的指针,这就 大大扩充了 C的功能和应用范围。第四章函数和程序结构4.2.5递归.一个函数直接或间接调用自己称为递归。C语言允许函数递归 调用,如下面例子:(1)x n=1 n=0X*X n-l n 0(2)n!=1 n=0n*(n-l)!n 0第四章函数和程序结构例4-5:n!#include int fact(int n);main()(printf(3!=%d,5!=%dn,fact(3),fact(5);)int fact(int n)(if(n 0)hanoi(n-l,x,z,y);printfCMOVE%d:%c 今%cn n,x,z);hanoi(n-l,y,x,z);printf(uPlease input the number of hanoi tower:99);scanf(“d&n);hanoi(n,A B JC);第四章函数和程序结构4.3变量说明和初始化 变量说明和定义,在C语言中有不同含义,(Pascal语言中变量声明 即变量定义)。变量定义一不仅要说明变量类型和特性,而且在编译时要分配存贮 区域(在此之前,我们所遇到的都是变量定义)。变量说明一仅仅说明变量的类型和特征,并不需要分配存贮单元。实际上,只有外部(全程)变量有时需要对它们进行说明。注:函数定义与函数说明与此类似。第四章函数和程序结构4.3.1变量的存贮类型变量的定义或变量说明的形式如下:存贮类1类型说明符存贮类:auto 函数内部的局部变量(auto可省略不写)static 静态存贮分配,又分为内部和外部静态extern全程变量(用于外部变量说明)register参数和自动变量分配在硬件寄存器中第四章函数和程序结构1)自动变量-局部变量,在一个函数开头或段开头处说明的变量,作用域为定义它的函数(局部变量)。/编译程序不对自动变量给予隐含的初值,故其初值不确定 O因此,每次使用前,必须明确地置初值。/形参是自动变量,作用域仅限于相应函数内。,在分程序开头说明的变量作用域为定义它的分程序。/自动变量随函数的引用而存在和消失,由一次调用到下一 次调用之间不保持值。第四章函数和程序结构2)外部变量,在函数外部定义的变量即为外部变量,它的作用域是整个程/C程序可以分别放在几个文件上,每个文件可作为一个编译 单位分别编译。外部变量只需在某个文件上定义一次,其它文 件若要引用此变量时,应用extern加以说明。(外部变量定义 时不必加extern关键字。,在同一文件中,若前面的函数要引用后面定义的外部(在函 数之外)变量时,也应在函数里加以extern说明。引进外部变量的原因:-解决函数单独编译的协调;-与变量初始化有关;-外部变量的值是永久的;-解决数据共享;注意:函数本身通常也被认为是外部变量。第四章函数和程序结构3)静态变量内部静态变量、_ 在局部变量前加上一atic,关键字就成为内部静态变量。e5s内部静态变量仍是局部变量,其作用域仍在定义它的函数内。但 该变量采用静态存贮分配(由编译程序在编译时分配,而一般的自 动变量和函数形参均采用动态存贮分配,即在运行时分配空间),当函数执行完,返回调用点时,该变量并不撤消,其值将继续保留,若下次再进入该函数时,其值仍存在。外部静态变量在函数外部定义的变量前加上“static”关键字便成了外部静态变量外部静态变量的作用域为定义它的文件,即成为该文件的的“私 有”(private)变量,其它文件上的函数一律不得直接进行访问,除非通过它所在文件上的各种函数来对它进行操作,这可实现数据 隐藏。(在C+中提供进行一步的数据隐藏。)第四章函数和程序结构4)寄存器变量,只有自动(局部)变量和函数参数可进一步指定为寄存器存,使用register变量可以提高存取速度,但寄存器变量的数目依赖 于具体机器(早期为23个),即使用户希望多说明几个寄存器 变量也没有用,只有前面几个有效。,只限于int,char,short,unsigned和指针类型可使用register存贮类/不能对register变量取地址(即&操作)。第四章函数和程序结构程序变量作用域图第四章函数和程序结构4.3.2变量初始化A外部和静态变量由编译程序给予隐含的初值0。A程序员可在变量定义时对它进行初始化(不是赋值表达式)。binary(int x,int y,int n)(int low=0;int high=n-1;,o 准招 CM SI一辗 M匕 c G在双 计以AN 序,:程型思:%汪 旧造O|但傩如mtx=1,3,3,3;static char pattern=the;器由2福初static char pattern二 t e 0;时,数组元素个数可以不写,编译程第四章函数和程序结构A自动变量的初始化每进入该函数时便初始化一次。A外部或静态变量的初始化仅在编译时进行一次。工 A自动变量或寄存器变量只能显式初始化,否则,自动变量和寄 存器变量有不确定的值。A外部数据的说明,如果带有初始化项,即当成一个定义。第四章函数和程序结构4.4程序结构在c语言中,函数不能嵌套定义。如,下面定义在C语言中是不充许的:f()(g()但在C语言中,变量可以嵌套定义,如:if(n 0)int i;/*declare a new*/for(i=0;in;i+)第四章函数和程序结构如果出现同名变量,则内层变量将屏蔽外层变量。例4-7:0;main()int i=1;printf(i=%d,”,i);(int i=2;printf(i=%d,”,i);(i+=1;printf(i=%d,”,i);)printf(i=%d,”,i);)printfC4i=%dn”,i);结果:i=l,i=2,i=3,i=3,i=l第四章函数和程序结构4.5 C语言预处理程序预处理关键字:#define#undef#include#if#ifdef#ifndef#else#endif#line(注意:#前面不能留空格)第四章函数和程序结构4.5.1 包含文件(include)include“文件名”一般文件#inlcude 文件名 系统文件编译程序以该文件名的内容来替换该控制行,通常在每个源文件开 头出现这样的行,是为了包含公共的#define和全程变量的说明以及 函数原型。第四章函数和程序结构使用include可把其它文件(往往是.h文件)的内容包含进来,#include还允许嵌套使用,如:第四章函数和程序结构使用#include的优点可以把所有公共的、需要给程序各个函数共享的外部变量说 明、函数原型和宏定义、类型定义等都放在某一文件上(通 常以.h为文件后缀)。其它文件的开头只须用一条include 该.h”文件的语句,就可以省去重写这些说明、定义的麻烦,而且程序结构更为清晰。如:#include#include#include“locaLh”第四章函数和程序结构4.5.2宏定义define标识符 单词串编译程序用单词串来替换#define后出现的该标识符。宏定义通常 有两种用途:1)定义常量如:#define YES 1#define EOF-1第四章函数和程序结构又如:#define:=#define then#define begin#define end;则可以写出Pascal风格的C程序:if(i 0)thenbegina:=1;b:=2;end第四章函数和程序结构2)定义函数宏定义还可带变元(参数):_.define 标识符(标识符,.J如:#define max(A,B)(A)(B)?(A):(B)
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服