1、程序设计基础,C语言程序设计考试辅导2011信息学院 张宝森,考试大纲分析,六、考试形式及试卷结构,考试大纲分析,五、考试内容(一)、C语言概述与基本概念(二)、数据类型、运算符与表达式(四)、选择结构程序设计(五)、循环控制结构程序设计(六)、数组的应用(七)、函数的应用(八)、指针的应用(九)、结构体与共用体结构的应用(十)、简单位运算的使用(十一)、文件的基本概念和主要应用,算法编程,基本概念,复 习 汇 总,一、C语言概述与基本概念,1、C语言的主要特点2、算法的基本概念和算法的主要描述方法3、结构化程序的三种基本结构4、C语言程序的主要调试及运行步骤,1、C语言的主要特点,(1)语言
2、简洁、紧凑,使用方便、灵活。 32个关键字、9种控制语句,程序形式自由(2)运算符丰富。34种运算符 (3)数据类型丰富,具有现代语言的各种数据结构。(4)具有结构化的控制语句 ,是完全模块化和结构化的语言。 (5)语法限制不太严格,程序设计自由度大。(6)允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可直接对硬件进行操作。兼有高级和低级语言的特点 。(7)目标代码质量高,程序执行效率高。只比汇编程序生成的目标代码效率低10-20%。(8)程序可移植性好(与汇编语言比)。基本上不做修改就能用于各种型号的计算机和各种操作系统。,要弄懂,什么是算法广义:操作步骤;狭义:求一个数据
3、的方法C语言程序组成模块化:最小程序单位函数结构化:顺序、分支、循环编辑、编译、连接、执行,模块化和结构化,模块化C程序由函数组成。每个C程序必须有一个主函数main()。结构化C程序(函数)由三种语句结构组成: 顺序语句 分支语句 循环语句每个C语句以分号结束。,例题,1. 编译程序的作用之一是:(2007)A)将高级语言程序翻译成可执行程序B)发现源程序中的逻辑错误C)发现源程序中的语法错误D)纠正源程序中的语法错误2. 修改高级语言编写的源程序使用的是(2007)A)编辑程序 B)解释程序 C)编译程序 D)链接程序3. 以下关于C程序组成特点的叙述中错误的是 ( 2009 )A) C程
4、序的基本组成单位是函数B) C语言不允许在函数中定义函数C) C语言不允许在一行内写多条语句D) 分号是C语句的组成部分4结构化程序由三种基本结构组成,它们是 【1】 结构、 【2】 结构、和 【3】 结构。 (2005),5. 以下不能用于描述算法的是( 2009 )A) N-S图 B)传统流程图 C) 自然语言 D) E-R图6. 传统流程图的判断框有【1】个入口,【2】个出口。(1、2)7. 关于注释,不正确的说法是:A) 注释可以放在程序的任何地方B) C语言的注释是用“/* ”和“*/”括住的任意字符列。C) 程序编译时,注释不参与编译,也不会出现在目标程序中。D) 当注释由“/*t
5、ext /*sending */”文字组成时,注释内容仅为sending8.,标识符,程序中各种对象的名字。语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。,大小写不同是不同的标识符,A和a,_ A和_a、 ab和AB是不同的标识符(对象)。合法的用户标识符:按规则且除去关键字的标识符。,main主函数不是关键字,关键字和标识符易于出题,下列四个选项中哪个不是关键字 A) while B) switch C) Return D) goto 下列四个选项中哪个是关键字 A) _while B) switch1 C) Return D) goto 下列四个选项中
6、哪个是正确的标识符 A) while B) switch C) Return D) goto 下列四个选项中哪个不是正确的标识符 A) 1while B) _switch C) Return D) _2goto,习题,下列四组选项中,均不是C语言关键字的是: A) define B) getc C) include D) while IF char scanf go type printf case pow下面四组选项中,均是不合法的用户标识符的选项是:(都不是合法的标识符) A) A B) float C) b-a D) _123 P_0 1a0 goto temp do _A int IN
7、T,例题,以下说法正确的是: A) C程序由define和主函数组成 B) C程序由include和主函数组成 C) C程序只由主函数组成 D) C程序由主函数和其他函数组成以下说法错误的是: A) C程序可以包含多个函数。 B) C程序由include命令和主函数组成。 C) 任何C程序都有一个主函数。 D) C程序由主函数和其他函数组成。,习题,1. C源程序的基本单位是【 】。2. 一个C源程序至少包含一个【 】。3. C源程序的注释由【 】和【 】构成。4. 结构化程序设计主要由【 】、【 】和【 】语句结构构成。,函数,主函数,/*,*/,顺序语句,分支语句,循环语句,其它知识,1.
8、语句: 表达式+分号 分号是语句的一部分;空语句:单独的分号2.函数原型 int max(int,int);3.空函数:是一个合法的函数,但是什么也不做。 void dump ( ) 4. 函数的组成: 函数体:花括号内的部分。若一个函数有多个花括号,则最外层的一对花括号为函数体的范围。,例题,函数的组成包括:【返回值类型】、【函数名】、【函数参数】【函数体】。函数体包括:【变量等说明语句】、【可执行语句】两部分。函数原型由【函数头】和【分号】组成。空函数是【函数体没有任何语句或只包含空语句】那样的函数。,编辑、调试、运行 由C源程序建立可执行程序要经过的步骤是【编译】和【链接】。编译的任务是
9、:进行语法检查,无错是生成目标(.obj)文件。链接的任务是:连接系统函数、形成可执行程序(.exe)文件。,算法的基本概念和主要描述方法,一个程序应包括两个方面的内容:对数据组织的描述: 数据结构(data structure)对操作步骤的描述: 算法(algorithm) 数据结构 + 算法 = 程序所谓“算法”,是为解决一个问题而采取的方法和步骤。,例:求,方法1:0+1,+2,+3,+4,一直加到100 加100次方法2:(0+100)+(1+99)+(2+98)+(49 +51)+50 = 10050 + 50,求1+2+3+(100),int i,s=0,n;scanf(“%d”,
10、s=100*50+50;,通用方法。,由人们事先推导公式。,计算机算法可分为两大类别:数值算法:求数值解,例如求方程的根、求函数的定积分等。非数值算法:包括的面十分广泛,最常见的是用于事务管理领域,例如图书检索、人事管理、行车调度管理等。,求135n(即n!),定义变量s、i、n。S1:输入nS2:s=1S3:对于i从1-n s=s*iS4:输出s,void main()int s、i、n; scanf(“%d”,例1.3 求2个数中较大者。,#include int max(int x,int y); /* 对被调用函数max的声明 */void main( ) /* 主函数*/ int a
11、, b, c; /*定义变量a、b、c */ scanf(d,d, /*输出c的值*/,int max(int x, int y) /* 求2个数中较大者 */ int z; if (xy) z=x; else z=y; return (z); ,return xy ? x : y;,算法的特性,有穷性:包含有限的操作步骤确定性:算法中的每一个步骤都应当是确定的 有零个或多个输入:输入是指在执行算法时需要从外界取得必要的信息 有一个或多个输出:算法的目的是为了求解,“解” 就是输出 有效性:算法中的每一个步骤都应当能有效地执行,并得到确定的结果 可以用不同的方法表示算法,常用的有:自然语言伪代
12、码传统流程图结构化流程图,用传统流程图表示算法,1入2出,将求n!的算法用传统流程图表示,优点:用流程线指出各框的执行顺序缺点:毫不受限制地使流程随意地转向,使流程图变得毫无规律循环结构不明显。,三种基本结构,Bohra和Jacopini提出了以下三种基本结构: 顺序结构、选择结构、循环结构用这三种基本结构作为表示一个良好算法的基本单元。,顺序结构,选择结构,循环结构,先判断,后执行可能一次都不执行循环体,先执行,后判断至少执行一次循环体,总结,(1)只有一个入口; (2)只有一个出口;(请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。)(
13、3)结构内的每一部分都有机会被执行到;(4)结构内不存在“死循环”(无终止的循环)。,N-S流程图,(1)顺序结构,(2)选择结构,(3)循环结构,NS流程图举例,判断闰年,4的倍数,整百的倍数中挑出400的倍数,用N-S图表示求n!的算法,流程图阅读,功能?,如何阅读程序?,当i int int与short = int int、char、short与long = long浮点型: float = double float 与 double = double整型+浮点型 = double强制转换 (类型) 表达式 (int)3.999 = 3 (float)(3+2) = 5.0 (doubl
14、e)(int)5.28+(char)3.6) = 8.0,7、算术运算符、赋值运算符、逗号运算符及其表达式的运用,的运算符有以下几类:(1)算术运算符 ( + - * / % )(2)关系运算符 ( ! )(3)逻辑运算符 (! | )(4)位运算符 ( | )(5)赋值运算符 ( += -= /= *= %= | ) (自增自减运算符) + -(6)条件运算符 ( ?: )(7)逗号运算符 ( ,)(8)求字节数运算符( sizeof( ) )(9)强制类型转换运算符( (类型) )(10)指针运算符 ( * )(11)分量运算符( - )(12)下标运算符( )(13)其他 (如函数调用运
15、算符(),后面讲解,习题,若有代数式 ,则不正确的表达式是: A) a/b/c*e*3 B) 3*a*e/b/c C) 3*a*e/b*c D) a*e/c/b*3以下符合C语言语法的赋值表达式是: A) d=9+e+f=d+9 B) d=9+e,f=d+9 C) d=9+e,e+,d+9 D) d=9+e+=d+7在C语言中,要求运算数必须是整型的运算符是: A) / B) + C) != D) %若有代数式 ,则正确的表达式是: A) sqrt(fabs(pow(y,x)+log(y) B) sqrt(abs(pow(y,x)+log(y) C) sqrt(fabs(pow(x,y)+lo
16、g(y) D) sqrt(abs(pow(x,y)+log(y),习题,若有定义:int a=7; float x=2.5,y=4.7; 则表达式 x+a%3*(int)(x+y)%2/4的值是: A) 2.500000 B) 2.75000 C) 3.500000 D) 0.000000设float n=12.678; int m; 则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是: A) n=(n*100+0.5)/100.0 B) m= n*100+0.5,n=m/100.0 C) n=n*100+0.5/100.0 D) n=(n/100+0.5)*100.0
17、 若有定义:int k=7,x=12;则值为3的表达式是: A) x%=(k%=5) B) x%=(k-k%5) C) x%=k-k%5 D) (x%=k)-(k%=5)若有定义:char w;int x;float y double z;,则表达式w*x+z-y的类型是: A) char B) int C) float D) double,习题,printf(“%d,%d,%d”,a,b,c); 与 printf(“%d,%d,%d”,(a,b,c),b,c);的区别若int x=5,n=5;,则计算表达式x+=n+后,x、n的值分别为【 10 】和【 6 】。若int a=6;,则计算表达
18、式a+=a-=a*a后,a的值是【 -60 】。若int a;,则表达式(a=4*5,a*2),a+6的值是【 26 】。,三、简单的C程序设计,1、表达式语句,空语句,复合语句的应用2、赋值语句的含义和使用3、输入/输出函数的基本格式和使用,1、表达式语句,空语句,复合语句的应用,表达式语句:表达式 加 分号 赋值语句: 赋值表达式; a=3*2; +i; 函数调用语句:函数(实参); printf(“A C statement.”); f=sqrt(fabs(pow(x,y)+log(y);赋值语句空语句: 只有一个分号的语句 ;复合语句:用一对 括起来的语句。 z=x+y; t=z/10
19、0; printf(“%f”,t); ,用作if部分和循环体,2、赋值语句的含义和使用,赋值表达式 a=100赋值语句 a=100;1. 语句可以独立存在,而表达式不能。2. 单个符号=是“赋值”,自右向左。条件中一般不能含有赋值符号,但是赋值表达式可以包含于条件表达式中 例: if(a=100) t=a; 错误?比较: if(a=b) t=a; 正确 if(a=0) t=a; ? if(a=b)0) t=a; 正确?,例4.10 输入三角形的三边长,求三角形面积,假设:三个边长a,b,c能构成三角形已知面积公式:s=(a+b+c)*0.5area=sqrt(s*(s-a)*(s-b)*(s-
20、c),#include#includevoid main() float a,b,c,s,area; scanf(“%f,%f,%f,3、输入/输出函数的基本格式和使用,字符输入函数: getchar()格式输入函数: scanf()字符串输入函数:gets(),字符输出函数:putchar()格式输出函数: printf()字数穿输出函数:puts(),c=getchar(); getchar(); scanf(“%d%f”,格式化输入输出,格式控制,标志(%与控制符之间),输入输出,%wd 输入宽度为w个字符的数据。m.nf。指定输出的数据共占列,其中有位小数。如果数值长度小于,则左端补空
21、格。 int a; char s100; scanf(“%20s%d”,s,例4.11 从键盘输入一个大写字母,要求改用小写字母输出。,#include void main() char c1,c2; c1=getchar(); printf(%c,%dn,c1,c1); c2=c1+32; printf(%c,%dn,c2,c2);,习题,已有如下定义,若要求给a1、a2、c1、c2输入的值为10,20,A和B,当从第1列开始输入数据时,正确的输入方式是_.(注意:表示回车,表示空格) int a1,a2;char c1,c2; scanf(“%d%c%d%c”,A) *s1=ChinaBe
22、ijing* B) *s1=ChinaBeijing* *s2=*chi* *s2=chiC) *s1=*ChinaBeijing* D) ChinaBeijing* *s2=chi* *s2=chi*,默认右对齐,习题,若a、b为整型变量,则以下语句的功能是【 交换数据 】。 a+=b;b=a-b;a-=b;以下程序的输出结果是:_。 #include main() int a=252; printf(a=%o a=%#on,a,a); printf(a=%x a=%#xn,a,a); 有一输入函数scanf(“%d”,k);,则不能是float变量k得到正确数值的原因是【 f 】和【 &
23、】。,a=374 a=0374a=fc a=0xfc,四、选择结构程序设计,1、关系运算、逻辑运算的运用2、用if语句实现选择结构3、用switch语句实现多分支选择结构4、选择结构嵌套的应用,1、关系运算、逻辑运算的运用,关系运算符及其优先次序 (大于)= (大于或等于)= (等于)!= (不等于)逻辑运算符及其优先次序! (逻辑非) & (逻辑与) | (逻辑或)关系表达式和逻辑表达式的运算结果为1或0(真或假)。算术表达式和赋值表达式的运算结果为非0或0(真或假)。优先级: ! */%+- = 0|x=5,其等价的逻辑表达式为:x5|x=5。 对数学式子|x|-5 & x-5 或者 !(
24、x=5 | x=5 的反命题逻辑表达式为: x=0,又要满足x=0 & x=60思考:为什么不能写成: 0=x5 若x的值正好为1,则x=1为真,则整个表达式已经为真,不再计算y5这个表达式了“或”关系 x=1 & y5 若x的值不为1,则x=1为假,则整个表达式不可能为真,不再计算y5这个表达式了“与”关系讨厌的用法: x5 & (y=2*x) (x=3) | (y=7),2、用if语句实现选择结构,分支结构就是选择结构,根据条件的真假,执行程序的不同部分,走不同的线路。if语句的三种基本形式 (1) if (表达式) 语句 (2) if(表达式) 语句1 else 语句2,(3)if(表达式1)语句1 else if(表达式2)语句2 else if(表达式m)语句m else 语句n,例5.1 输入两个实数,按代数值由小到大的顺序输出这两个数。,#includevoid main() float a,b,t;scanf(“%f%f”,#includevoid main() float a,b,t; scanf(“%f%f”,