高级语言程序设计华北电力大学ALLC语言程序设计.ppt
欢迎学习高级语言程序设计,华北电力大学信息网络管理中心计算机基础教研室,办公室电话:2474,引 言,计算机语言的作用,C语言的语法规则,程序设计的方法,主要内容,是人与计算机进行交流的桥梁 计算机语言分为机器语言、汇编语言和高级语言。C是高级语言,学习方法,多读程序,熟悉语法 掌握程序设计技巧,多写程序,多上机,学习要求,课前预习,课后复习,上机前要写好程序,上机后要总结,做好听课笔记,程序规则,运算规则,语句规则等,目录,第一章 C语言概述,第二章 顺序结构程序设计,第三章 选择结构程序设计,第四章 循环控制,第五章 数组,第六章 函数,第七章 预处理命令,第八章 指针,第九章 文件,第一章 C语言基础,1.1计算机语言,1.3 C程序的开发及上机步骤,1.2 C语言概述,1.4基本数据类型,1.5 运算符和表达式,机器语言,汇编语言,高级语言,用0、1组成,执行速度快,难记、不通用,用助记符便于记忆、不通用,类似自然语言和数学语言,通用性强,例如:A=10,B=4 求A+B的值,只能识别机器语言程序,1.1计算机语言,语言处理程序,汇编语言源程序,高级语言源程序,汇编程序,?,解释编译,目的程序,源程序,目的程序,可执行程序,链接程序,编译程序,源程序,结果,解释程序,不同的语言需不同的编译程序,1.1 程序设计语言发展历史,CPU指令系统,由0、1序列构成的指令码组成如:10000000 加 10010000 减,用助记符号描述的指令系统如 ADD A,B,面向机器的语言,程序设计是数据被加工的过程,客观世界可以分类,对象是类的实例对象是数据和方法的封装对象间通过发送和接受消息发生联系,程序设计关键是定义类,并由类派生对象,BASIC VBFORTRAN VFPASCAL Delphi,C,Turbo C+Visual C+Borland C+C+Builder,常用高级程序设计语言,Ada,ALGOL60,ALGOL68,Pascal,Modula-2,CPL,BCPL,B,C,C+,Java,LISP,PROLOG,COBOL,FORTRAN77,FORTRAN,PL/1,Simula 67,Smalltalk 80,BASIC,ANSI-BASIC,QBASIC,VB,FORTRAN90,产生背景产生过程时间:19721973地点:美国贝尔实验室目的:UNIX操作系统设计人:Ken.Thompson和Dennis.M.RitchieC标准标准C:K&R合著The C Programming LanguageANSI C:1983年87 ANSI C:1987年1990年国际标准的ANSI C,C语言发展过程,语言简洁、紧凑、灵活运算符和数据类型丰富程序设计结构化、模块化生成目标代码质量高可移植性好,1.2 C语言特点,32个关键字:(由系统定义,不能重作其它定义)auto break case char constcontinue default do double elseenum extern float for gotoif int long register returnshort signed sizeof static structswitch typedef unsigned union voidvolatile while,1.2 C语言特点,9种控制语句:if()elsefor()while()dowhile()continuebreakswitchgotoreturn,1.2 C语言特点,34种运算符:算术运算符:+-*/%+-关系运算符:=!=逻辑运算符:!&|位运算符:|&赋值运算符:=及其扩展条件运算符:?:逗号运算符:,指针运算符:*&求字节数:sizeof强制类型转换:(类型)分量运算符:.-下标运算符:其它:()-,1.2 C语言特点,例1.1 第一个程序 Hello,World!,/*example1.1 The first C Program*/#include main()printf(“Hello,World!”);,输出:Hello,World!,1.3 C程序格式和结构特点,例1.2,/*example1.1 calculate the sum of a and b*/#include/*This is the main program*/main()int a,b,sum;a=10;b=24;sum=add(a,b);printf(”sum=%dn,sum);/*This function calculates the sum of x and y*/int add(int x,int y)int z;z=x+y;return(z);,运行结果:sum=34,格式特点习惯用小写字母,大小写敏感不使用行号,无程序行概念可使用空行和空格常用锯齿形书写格式,main().,main()int i,j,sum;sum=0;for(i=1;i10;i+)for(j=1;j10;j+)sum+=i*j;printf(“%dn”,sum);,优秀程序员的素质之一:使用TAB缩进对齐有足够的注释有合适的空行,1.3 C程序格式和结构特点,结构特点函数与主函数程序由一个或多个函数组成必须有且只能有一个主函数main()程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行。程序语句C程序由语句组成用“;”作为语句终止符注释/*/为注释,不能嵌套不产生编译代码,例:/*This is the main/*of example1.1*/*/,编译预处理命令,1.3 C程序格式和结构特点,C程序开发步骤,file.exe,程序代码的录入,生成源程序*.c,语法分析查错,翻译生成目标程序*.obj,与其它目标程序或库链接装配,生成可执行程序*.exe,1.进入Turbo C集成环境运行Turbo C的执行程序TC.EXE,就进入了Turbo C集成环境,TC主屏由四部分组成:主菜单、编辑窗口、信息窗口和功能键提示行。在进行编辑程序之前应设置好包含文件、库文件、输出文件和Turbo C系统所在的目录。2.编辑在编辑窗口中将编写好的程序输入计算机或对已经存在的源程序文件进行修改的过程,就是源程序的编辑过程。FileLoad命令:输入一个要编辑的源程序名字,则编辑窗口中的NONAME.C被新输入的名字取代。若被编辑的是一个新文件,则可以输入编写好的程序到编辑窗口;若被编辑的是一个旧文件,则可以对其进行修改。FileSave命令:保存文件。FileNew命令:在清屏后的编辑窗口,输入程序FileWrite to命令 输入源程序名字保存文件,C程序的开发及上机步骤,3.编译选择CompileCompile to OBJ命令,对编辑窗口中的文件进行编译,如果编译成功,按F2键,将文件保存一下后就可进入下一个过程;否则,若编译失败,则在信息窗口中将发现的错误和警告信息一一列出。4.连接编译后生成的目标文件和库文件连接在一起才能生成可执行文件。当编译成功后,选择CompileLink EXE file命令,进入连接,如果出现错误,则一般要检查库文件和头文件的路径设置是否正确,修改后重新连接。,C程序的开发及上机步骤,5.运行选择RunRun或Ctrl+F9(两个键同时按下)命令,就可以执行程序。若要察看运行结果,则按ALT+F5。如果程序在运行过程中需要输入数据,则选择了RunRun命令后,屏幕处于用户屏状态,等待用户输入所需的数据,数据输入结束,运行后重新回到集成环境的主屏。Turbo C中,编译和连接这两个步骤也可以通过功能键ctrl+F9(建立.EXE可执行文件)附带一并一次完成。简言之,编辑后,可通过ctrl+F9一起完成若有错,则要反复多次。6.退出Turbo环境选择FileOS shell命令,可以暂时退出Turbo C,转到DOS提示符下,此时,若再键入EXIT,则又可以返回Turbo C集成环境的主屏。选择FileQuit命令,彻底退出Turbo C,返回到DOS提示符下。,1.3 C程序的开发及上机步骤,1.4 基本数据类型,整型,字符型,实型,有,无,说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例:,1.4 基本数据类型,常量与变量标识符定义:用来标识变量、常量、函数等的字符序列组成:只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线大小写敏感不能使用关键字长度:最长32个字符命名原则:见名知意不宜混淆 如l与I,o与0,例:判断下列标识符号合法性sum Sum M.D.John day Date 3days student_name#33 lotus_1_2_3 char ab _above$123,M.D.John,3days,#33,char,$123,ab,1.4 基本数据类型,一般用大写字母是宏定义预处理命令,不是C语句直接常量:整型常量 实型常量 字符常量 字符串常量,如#define PRICE 30,常量定义:程序运行时其值不能改变的量(即常数)分类:符号常量:用标识符代表常量定义格式:#define 符号常量 常量,例 符号常量举例(ch2_1.c)#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(total=%d,total);,运行结果:total=300,1.4 基本数据类型,整型常量(整常数)三种形式:十进制整数:由数字09和正负号表示.如 123,-456,0八进制整数:由数字0开头,后跟数字07表示.如0123,011十六进制整数:由0 x开头,后跟09,af,AF表示.如0 x123,0Xff,例 12 与 12L,例 30000 为int型 65536 为long int 型,整型常量的类型根据其值所在范围确定其数据类型在整常量后加字母l或L,认为它是long int 型常量,问题:0123=()100 x123=()100Xff=()10,1.4 基本数据类型,实型常量(实数或浮点数)表示形式:十进制数形式:(必须有小数点)如0.123,.123,123.0,0.0,123.指数形式:(e或E之前必须有数字;指数必须为整数)如12.3e3,123E2,1.23e4,e-5,1.2E-3.5,实型常量的类型默认double型在实型常量后加字母f或F,认为它是float 型,1.4 基本数据类型,字符常量定义:用单引号括起来的单个普通字符或转义字符.,字符常量的值:该字符的ASCII码值,如 A65,a97,048,n10,如 a A?n 101,转义字符:反斜线后面跟一个字符或一个代码值表示,例 转义字符举例main()printf(101 x42 Cn);printf(I say:How are you?n);printf(C Programn);printf(Turbo C);,运行结果:(屏幕显示)A B CIsay:”How are you?”C ProgramTurbo C,例 main()printf(“Yb=n”);,运行结果:屏幕显示:=打印机输出:,1.4 基本数据类型,字符常量与字符串常量不同,字符串常量定义:用双引号(“”)括起来的字符序列存储:每个字符串尾自动加一个 0 作为字符串结束标志,例:char ch;ch=“A”;,1.4 基本数据类型,变量概念:其值可以改变的量变量名与变量值变量定义的一般格式:数据类型 变量1,变量n;,变量初始化:定义时赋初值,例:int a,b,c;float data;,决定分配字节数和数的表示范围,合法标识符,例:int a=2,b,c=4;float data=3.67;char ch=A;int x=1,y=1,z=1;int x=y=z=1;,变量的使用:先定义,后使用,例1 int student;stadent=19;/Undefined symbol statent in function main,例2 float a,b,c;c=a%b;/Illegal use of floating point in function main,变量定义位置:一般放在函数开头,1.4 基本数据类型,整型变量占字节数随机器不同而不同,一般占一个机器字shortintlong可用sizeof(类型标识符)测量,实型变量float:占4字节,提供7位有效数字double:占8字节,提供1516位有效数字,字符型变量字符变量存放字符ASCII码char与int数据间可进行算术运算,例 float a;a=111111.111;/*a=111111.1*/double b;b=111111.111;/*b=111111.111*/,例 a=D;/*a=68;*/x=A+5;/*x=65+5;*/s=!+G/*s=33+71;*/,没有字符串变量,用字符数组存放,1.4 基本数据类型,例/*ch2_003.c*/#define PRICE 12.5 main()int num=3;float total;char ch1,ch2=D;total=num*PRICE;ch1=ch2-A+a;printf(“total=%f,ch1=%cn”,total,ch1);,运行结果:total=37.500000,ch1=d,1.4 基本数据类型,不同类型数据间的转换隐式转换什么情况下发生运算转换-不同类型数据混合运算时赋值转换-把一个值赋给与其类型不同的变量时输出转换-输出时转换成指定的输出格式函数调用转换-实参与形参类型不一致时转换运算转换规则:不同类型数据运算时先自动转换成同一类型,显式转换(强制转换)一般形式:(类型名)(表达式)例(int)(x+y)(int)x+y(double)(3/2)(int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变,例 main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);结果:x=3.600000,i=3,精度损失问题,1.4 基本数据类型,1.5 运算符和表达式,算术运算符和表达式基本算术运算符:+-*/%结合方向:从左向右优先级:-*/%-+-(2)(3)(4)说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据,例 5/2=-5/2.0=,例 5%2=-5%2=1%10=5%1=5.5%2,例 5/2=2-5/2.0=-2.5,例 5%2=1-5%2=-1 1%10=1 5%1=0 5.5%2(),1.5 运算符和表达式,自增、自减运算符+-作用:使变量值加1或减1种类:前置+i,-i(先执行i+1或i-1,再使用i值)后置 i+,i-(先使用i值,再执行i+1或i-1),说明:+-不能用于常量和表达式,如5+,(a+b)+-结合方向:自右向左优先级:-+-*/%-+-(2)(3)(4),例-i+-(i+)i=3;printf(“%d”,-i+);/-3,例-i+i=3;printf(“%d”,-i+);,1.5 运算符和表达式,赋值运算符和表达式简单赋值运算符符号:=格式:变量标识符=表达式作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符种类:+=-=*=/=%=&=|=含义:exp1 op=exp2 exp1=exp1 op exp2,例 a=3;d=func();c=d+2;,1.5 运算符和表达式,说明:结合方向:自右向左优先级:14左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y;a+b=3;,例 float f;int i;i=10;f=i;则 f=10.0,例 int i;i=2.56;/结果i=2;,例:a=b=c=5 a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/表达式值为5,a,b,c值为5,/b=5;a=5,/表达式值11,c=6,a=11,/表达式值10,a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,1.5 运算符和表达式,逗号运算符和表达式形式:表达式1,表达式2,表达式n结合性:从左向右优先级:15逗号表达式的值:等于表达式n的值用途:常用于循环for语句中,例 a=3*5,a*4 a=3*5,a*4,a+5例 x=(a=3,6*3)x=a=3,6*a例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,、=、=(等于)、!=(不等于)关系运算符优先级从高到低为、=、!=结合方向从左到右。a=b的结果为,aB的结果为,关系运算,1.5 运算符和表达式,C语言提供三个逻辑运算符:&(逻辑与)、|(逻辑或)、!(逻辑非),逻辑运算,1.5 运算符和表达式,!(非)算术运算符关系运算符&和|赋值运算符,(高),(低),例如:,(a b)&(x y),(!a)+b)|(a b),a b&x y,!a+b|a b,1.5 运算符和表达式,逻辑运算的结果只可能为1或0;,逻辑运算的对象可以是任何类型的数据,“非0”为“真”,“0”为“假”。,a&b&c(与短路运算)(m=ab)&(n=cd),a|b|c(或短路),main()int m,n=10;m=2,条件运算,形式为:e1?e2:e3 其中e1,e2,e3都是表达式。一般而言,e1为条件表达式,当e1的值为真时(即非0),e2的值作为整个表达式的值,不再计算e3的值,若e1的值为假(即为)时,取e3的值作为整个表达式的结果,而不计算e2的值。如:max(xy?x:y);将和中较大的一个数赋值给变量max条件运算符的结合性是由右向左。,1.5 运算符和表达式,第二章 顺序结构程序设计,数据输出,数据输入,顺序结构,顺 序 结 构,三种基本结构,顺序结构,、选择结构,、循环结构,顺序结构,开 始,赋 值,处 理,输 出,结束,流程图,赋 值,处 理,输 出,N-S图,赋值语句,赋值表达式;,格式,数 据 输 出,printf(“格式控制”,输出项),printf函数的格式,如:printf(“%d,%d,%d”,a,b,a+b),如:printf(“t=%f,sint=%f n”,t,sin(t),格式说明,%d,按十进制输出整数,%f,按小数形式输出实数,n,换行,其它字符,原样输出,例:当a=10,b=-5.3时,写出下面语句的输出结果,格式输出语句,printf(“格式控制”,输出项);,printf(“%d,%f”,a,b);,10,-5.300000,printf(“a=%d nb=%f”,a,b);,a=,10,b=,-5.300000,输出项:变量、表达式、函数,格式控制:,为输出项提供格式说明,提供需要原样输出的文字或字符,;,;,格式说明的个数=输出项个数,格式说明的类型=输出项类型,数 据 输 出,控制输出数据的宽度,格式说明,意 义,数据宽度,%d,按十进制输出整数,%f,按小数形式输出实数,系统决定,%md,注:m、n为整型常数,按十进制输出整数,占m位,例1 a=23,b=34,c=-55,写出下面语句的运行结果,printf(“a=%d,b=%5d,c=%2d”,a,b,c),a=,23,b=,34,c=-55,%m.nf,按小数形式输出实数,(小数占6位),.,(实际位数),系统决定,.,.,n位,m位,例2 t=2.346写出下面语句的运行结果,printf(“t=%f,%5.2f,%3.2f”,t,t,t),t=,2.346000,2.35,2.35,举 例,例1 已知三边长,求三角形面积(四舍五入保留两位小数)。,输 入,处 理,输 出,如何保留小数?,13.456,13.46,1)移动小数点,13.456*100,2)加0.5,1345.6+0.5,3)取整,4)小数点还原,1346/100,area*100,.0,=1345.6,=1346.1,1346,=13.46,(int)(),+0.5,/100,用同一个程序计算边长为任意值的三角形面积,设边长为a、b、c,则:,问题,s=(a+b+c)/2;,float a,b,c,s,area;,a=3.0;b=4.0;c=6.0;,area=sqrt(s*(s-a)*(s-b)*(s-c);,printf(“area=%fn”,area);,area=(int)(area*100+0.5)/100.0;,#include“math.h”,main(),%f,%6.2f,printf(“a,b,c=%f,%f,%fn”,a,b,c);,a,b,c=,area=,3.000000,4.000000,6.000000,5.330000,a,b,c=,area=,数据输入,scanf函数的格式,scanf(“格式控制”,地址表),如:scanf(“%d,%f”,&a,&b),地址表列:,&a:变量a的地址,&b:变量b的地址,scanf(“格式控制”,地址表);,数据输入语句,;,%d,按十进制输入整数,%f,按小数形式输入实数,其它字符,原样输入,&:地址运算符,格式控制:,指定数据输入的格式,例如:设a=2,b=2.5,写出执行下面的语句时,数据输入的形式。,scanf(“%d%f”,scanf(“%d,%f”,scanf(“a=%d,b=%f”,2,2.5,:数据间的分隔符,2,,,2.5,2,,,2.5,a=,b=,输 入缓冲区,a,b,内存单元,P79P82,意义,程序运行时,例2 将两个变量中的值互换。,分析,a,b,2,1,1,a,2,b,方法一:,a,b,2,1,a=b,b=a,1,1,方法二:,酱油,醋,2,a=b,b=c,c,醋,酱油,酱油,=a,c,a,b,c,1,2,输 入,交 换,输 出,main(),int a,b,c;,scanf(“%d,%d”,c=a;,a=b;,b=c;,printf(“a=%d,b=%dn”,a,b);,printf(“a=%d,b=%dn”,a,b);,printf(“Please input a,b:”);,中间变量的类型要与原始变量一致,Please input a,b:,2,1,a=2,b=1,a=1,b=2,实际问题,数学模型,计算方法,编 程,编辑程序,编译查错,连接,错?,修改程序,修改算法,修改模型,错?,运行程序,错?,小结,第三章 选择结构程序设计,选择结构,选择结构实现一 if语句,选择结构实现二 else if语句,选择结构实现三 if语句的嵌套,关系表达式和逻辑表达式,多分支选择结构,x0?,YES,NO,真,假,选 择 结 构,main()int x;scanf(“%d”,,选择结构,算法图示,流程图,N-S图,x0,真,YES,假,NO,P22P26,条件,根据条件是否为真而选择执行不同的程序块,关系表达式,关系运算符及其优先级,=,(小于),(小于等于),=,(大于),=,(大于等于),!=,(等于),(不等于),同 级,同 级,高,低,关系表达式,ab,-1!=c+3,各种运算符的优先级,关系表达式的结果,t=5=3,算术,关系,赋值,得整数值:0或1,0:,假,1:,真,例 若a=5,b=7,计算表达式的值,b(a=4)+1,4,5,1,c=ab,(c实型),1,1.0,c,1.0,逻 辑 表 达 式,逻辑运算符,|,&,(逻辑与),!,(逻辑或),(逻辑非),逻辑表达式,各种运算符的优先级,逻辑表达式的值,得整数值:0或1,0:,假,1:,真,运算对象,非0:,真,0:,假,例 若a=3,b=4,c=5,计算表达式的值,!a|b+c&b c,9,-1,1,1,a+bc&b=c,!(x=a)&(y=b),低,高,非,关系,与,算术,赋值,或,0,if语句,if语句的格式,if(表达式),if子句,else,else子句,执行过程,表达式为真?,if子句,真,假,else子句,if(x0),printf(“nx=%d,YES”,x);,else,printf(“nx=%d,NO”,x);,if(x0),printf(“nx=%d”,x);,else,printf(“nx=%d”,x);,printf(“YES”);,printf(“NO”);,非0:真 0:假,退出,if子句或else子句包含多个语句,就要用、括起来,表达式为真?,真,If子句,假,else子句,例1 判断一个数能否被3整除,若能被3整除,计算该数的立方,并打印yes,否则,计算该数的平方,并打印no。,main(),int x,pf,lf;,printf(“nPlease input x:”);,scanf(“%d”,if(x%3=0),lf=x*x*x;,printf(“x=%d,yesnlf=%d”,x,lf);,else,pf=x*x;,printf(“x=%d,nonpf=%d”,x,pf);,x%3=0,真,计算x3,假,计算x2,输出,输出,举 例,if语句,省略else的选择结构,if(表达式),if子句,执行过程,表达式为真?,if子句,真,假,退出,例2 写出程序的运行结果,main(),int a,b,s;,if(ab)s=b;,s*=s;,printf(“%dn”,s);,s=a;,3,4,3,4,16,scanf(“%d,%d”,3,4,16,4,3,16,3,4,4,16,表达式为 真?,真,If子句,假,例3比较a、b、c三个数的大小,将最大的数放在a中。,main(),int a,b,c,d;,if(ab),printf(“The result is:”);,printf(“a,b,c=%d,%d,%dn”,a,b,c);,scanf(“%d,%d,%d”,printf(“nPlease input a,b,c:”);,d=a;a=b;b=d;,ab?,真,a、b交换,假,ac?,真,a、c交换,假,举 例,if(ac),d=a;a=c;c=d;,else if语句,else if语句,if(表达式0),if子句,else if(表达式1),else if子句1,else if(表达式2),else if子句2,else,else 子句,执行过程,式0为真?,A,真,假,退 出,式1为真?,式2为真?,真,真,B,假,C,假,D,式0为真?,真,A,假,式1为真?,真,B,假,式2真?,真,C,假,D,例4 读程序写运行结果,main(),float a;,int m;,scanf(“%f”,if(a30)m=1;,else if(a40)m=2;,else if(a50)m=3;,else m=4;,printf(“a=%4.1f,m=%dn”,a,m);,36.3,a=36.3,m=2,90,a=90.0,m=4,40,a=40.0,m=3,16.7,a=16.7,m=1,举 例,例5 编写程序计算表达式的值:,main(),float x,y;,printf(“nInput x:”);,scanf(“%f”,if(x0),else if(x10),else,printf(“x=%5.2f,y=%5.2f”,x,y);,x0,真,y=x,假,x10,真,y=x-1,假,y=x+1,y=x;,y=x-1;,y=x+1;,举 例,If语句的嵌套,if语句嵌套的格式,if(表达式1),else,else子句,else子句,内嵌if,执行过程,式1为真?,式2为真?,真,真,if子句,假,else子句,假,内嵌 if,退 出,退 出,分清if的层次,if子句,else 子句,if(表达式2),else,if子句,if(表达式3),if子句,else,内嵌if,else总是与上面最近的if配对,例6 下面的程序要计算函数的值,判断哪个程序正确.,if(x=0),if(x0)y=1;,else y=0;,else y=-1;,x,1,0,0,-9,-1,在if子句中嵌套具有else子句的if 语句,不会发生语法错误,y=-1;,if(x!=0),if(x0)y=1;,else y=0;,x,1,0,-1,-9,0,y=-1;,if(x!=0),if(x0)y=1;,else y=0;,x,1,0,0,-9,-1,在if子句中嵌套没有else子句的if 语句,内嵌的 if语句要用、括起来.,y,40,y,40,y,40,举 例,举 例,例7 编写程序计算表达式的值:,x0,真,y=x,假,x-5&x20,真,输出x和y,假,main(),float x,y;,scanf(“%f”,If(x-5&x20),if(x0),y=x;,else,If(x10),y=x-1;,else,y=x+1;,printf(“x=%5.2f,y=%5.2f”,x,y);,x10,真,y=x-1,y=x+1,假,多分支选择结构,switch语句,switch(表达式),case 常量表达式1:语句1,case 常量表达式2:语句2,case 常量表达式n:语句n,default:语句n+1,语句体,整型,类型相同,零个或一个以上的语句,执行过程,计算表达式的值,执行该常量表达式后各语句,是,执行default后各语句,不是,退出,例8 写出下面程序的运行结果。,main(),int g;,scanf(“%d”,switch(g/10),case 10:,case 9:printf(“An”);,case 8:printf(“Bn”);,case 7:printf(“Cn”);,case 6:printf(“Dn”);,default:printf(“En”);,main(),int g;,scanf(“%d”,printf(“g=%d”,g);,switch(g/10),case 10:,case 9:printf(“An”);break;,case 8:printf(“Bn”);break;,case 7:printf(“Cn”);break;,default:printf(“En”);,100,g=100,B,C,D,E,45,100,g=45,g=100,78,g=78,45,g=45,A,E,A,跳出switch语句体,C,E,举 例,printf(“g=%d”,g);,case 6:printf(“Dn”);break;,第四章循环控制,循环结构实现一 用if和goto构成循环,循环结构实现三 do-while循环,循环结构实现四 for循环,循环结构的概念,循环结构实现二 while循环,循环的嵌套,break和continue语句,程序举例,循环结构的概念,goto语句的格式,goto 语句标号,应用示例,语句标号的命名规则与变量名相同,goto key;,key:s+=x;,带标号的语句的格式,语句标号:语句,执行过程,s+=x,循环结构的概念,某段程序被有限次地执行,被反复执行,没有出口,If语句和goto语句构成循环,形式,标号:if(表达式),goto 标号,循环体,执行过程,真,假,退出,当表达式为真,循环体,举 例,例1 编写程序计算表达式的值:,x0,真,y=x,假,x10,真,y=x-1,假,y=x+1,当x=20,输入x,main(),float x,y;,printf(“nInput x:”);,scanf(“%f”,ks:if(x=20),printf(“Error,again:”);,goto ks;,if(x0)y=x;,else if(x10)y=x-1;,else y=x+1;,printf(“x=%5.2f,y=%5.2f”,x,y);,scanf(“%f”,while循环,while循环的一般形式,while(表达式),循环体,while(i5),printf(“%d,”,i);,i+;,while循环执行过程,执行循环体,真,退 出,假,当表达式为真时,循环体,例1 main(),int i;,i=1;,i=i+1;,循环前:,i=1,i,第一次,循环次数,i5,1,1,第二次,2,2,第三次,3,3,第四次,4,4,退出循环:,i=5,关注循环前、循环中、循环后控制变量的值,例2 编程序,计算 s=1+2+3+100,(1)如何得到加数?,i:,while(i5),printf(“%d,”,i);,i+;,i=1;,i=14,i=100,(2)如何实现累加?,s为被加数,初始:s=0,i=1:,s+i,s,s=s+i;,i=2:,i=100:,s+=i;,1、2、100,s=0;,i=1,s=0,当 i=100时,s+=i,i+,输 出,s+=i;,s+i,s,s+i,s,main(),int i,s;,i=1;,s=0;,while(i=100),s+=i;,i+;,printf(“s=%d”,s);,1,1+2,1+2+.+100,i=3:,s,s+i,1+2+3,举 例,do-while循环,do-while循环的一般形式,do,循环体,while(表达式);,while(i5);,printf(“%d,”,i);,i+;,do-while循环执行过程,执行循环体,真,退 出,假,当表达式为真,循环体,例1 main(),int i;,i=1;,循环前:,i=1,i,第一次,循环次数,1,1,第二次,2,2,第三次,3,3,第四次,4,4,退出循环:,i=5,do,例2 输入任意n个数,计算其中奇数和及偶数和,并统计奇数个数。,while(i5);,printf(“%d,”,i);,i+;,i=1;,do,i=n,在循环之前确定n,(2)如何统计个数?,i=1,jh=0,oh=0,tj=0,输入n,x%2=0,输入x,真,oh+=x,假,jh+=x,tj+,i+,当i=n时,输出,举 例,scanf(“%d”,执行一次scanf,就为变量输入一个新值,(1)如何得到n个数?,main(),int i=1,jh=0,oh=0,tj=0,n,x;,printf(“Please input n:”);,scanf(“%d”,do,scanf(“%d”,if(x%2=0),oh+=x;,else,jh+=x,tj+;,i+;,while(i=n);,printf(“The result:”);,printf(“oh=%d”,oh);,printf(“jh=%d,tj=%d”,jh,tj);,for循环,for循环的一般形式,for(表达式1;表达式2;表达式3),循环体,printf(“*”);,for循环执行过程,计算表达式1,真,退 出,假,例1 main(),int k;,for(k=0;k10;k+),执行循环体,计算表达式3,k的取值:,执行循环体:,09,退出循环体:,10,例2 计算n的阶乘。,n!=12 3(n-1)n,递归定义:,n!=(n-1)!n,(n-1)!=(n-2)!(n-1),结论:,已知0!,求n!,p:存放阶乘,i:计数,过程:,p=0!=1,1!,p*1,2!,p*2,(n-1)!,p*(n-1),n!,p*n,确定n,p=1,for i=1to n,p*=i,输出,main(),scanf(“%d”,p=1;,for(i=1;i=n;i+),p*=i;,p,p,p,p,p*=i;,表达式1:i=1表达式2:i=n表达式3:i+,举 例,int n,i;long p;,int p,n,i;,Printf(“%d!=%ld”,n,p);,printf(“%d!=%d”,n,p);,循 环 的 嵌 套,循环嵌套形式,while