




已阅读5页,还剩326页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级语言程序设计(一) (C Programming),北京航空航天大学计算机学院软件所 晏海华,2,作业及参考书,教师:晏海华 联系方式:柏彦大厦708,Tel: 82328212, Email:yhh 参考书: C程序设计语言,B.W.Kernighan, D.M.Ritchie, 机械工业出版社,徐宝文等译 从问题到程序程序设计与C语言引论,裘宗燕编著,机械工业出版社 C语言教程,孙玉芳,孟庆昌编著 课程信息、作业及答疑:http: / 考核方式:作业占10%,期中考试占30%,期末占60%,3,忠告,掌握C语言程序设计的唯一途径:,上机实践(编程)! (Try!),高级语言程序设计(一) (C Programming),第一讲:C语言基础,5,本章目标,了解C语言的历史及现状; 初步了解C程序的结构 知道在某个操作系统环境下(Windows)一个C程序的编写过程; 掌握变量、常量、简单数据类型、类型转换、表达式及部分C语言运算符; 知道运算符优先级及结合律,6,程序设计与程序设计语言,程序设计(Programming): 为计算机解决问题所需的分析、设计、编写及调试程序过程。(The process of planning, writing, testing, and correcting the steps required for a computer to solve a problem or perform an operation.) 程序设计语言(Programming Language): 用来表达程序的计算机能够执行的人工语言。,7,为什么要学C程序设计,C语言仍是目前广泛使用的编程语言,主要特点: 表达能力强,支持结构化程序设计; 语言简洁; 代码效率高: C编写的程序仅比用汇编语言编写的程序相差20%; 可移植性好; 特别适合编写操作系统、编译程序、数据库系统、嵌入式软件及图形/图象处理等对性能要求高的软件; C语言是目前广泛流行的面向对象语言C+、C#及Java的基础,8,C语言历史,C语言的产生与UNIX操作系统是密不可分的: UNIX由Bell Lab的K.Thompson和D.M.Ritchie最先在1969年开发的O.S.(它的前身是MIT和AE开发的Multies)。 1970年,V1,V2版在PDP-7机上用汇编语言实现 1971年V3 PDP11/23 ; 1972年V4 PDP11/45 1972年,D.M.Ritchie开发出新语言C。(C B BCPL CPL单数据型语言) 1973年,Ritchie和Thompson用C改写了UNIX核心(90%)即V5,9,C语言历史(续),C语言的发展经历三个阶段: 第一阶段:78年以前,C称为UNIX C,即C被看成UNIX的一部分。 第二阶段:78年D.Ritchie的C程序设计语言出版到88年ANSI C(标准C)标准出现。此C又称为K&R C。 第三阶段:88年ANSI C标准(89年3月批准)。,CPL 1968 C.Strachey,10,一个简单的C程序:在屏幕上显示一行正文,例1-1 /* file: hello.c */ #include main( ) printf(“hello, worldn”); ,/* */ 为注释,不可嵌套,#include为一条预处理指令,当程序中用到输入/输出函数时,应在文件开始处加上该指令。,main为一函数名。 由 括起来的部分为函数体。 函数名为一标识符。,printf为一条输出语句,在C语言中分号(;)为语句的结束符。 printf为标准I/O库中标准输出函数。 “” 为一字符串常量。 n为C语言转义字符,表示回车。,11,标识符,在C语言中标识符定义为:”由字母(或_)开头的字母(_)数字串“。标识符在C语言中可作为变量名、常量名、函数名、参数名、类型名、枚举名和标号等。,12,C程序结构,一个C程序由一系列外部说明和函数组成; 一个函数则由局部变量说明及语句序列组成; 一个C程序可由一个或多个函数组成,但其中必有一个(也只能有一个)命名为main(主函数),其它函数可由用户任取名字。程序运行时必需从main开始,但main函数在程序中的前后位置没有关系 ; 组成C程序的各个函数可在一个源文件上,也可以分放在多个文件上(函数不能跨文件),每个源文件可单独编译。C源文件必须以.c作后缀(.h为C程序的头文件) ;,13,C程序的编辑、编译和运行,14,在Windows下使用VC编写及运行C程序,项目名,15,16,17,给出C源文件名,18,编辑C程序,19,编译Compile,编译及连接Build,编译及连接信息,运行Execute,20,运行结果,21,在UNIX(Linux)下编写及运行一个C程序,cc -o执行文件名 c 文件名 o :指定执行文件名,缺省为a.out c :产生.o文件如:s1.c, s2.c s3.c组成一个C程序, 则有: cc c s1.c cc c s2.c cc o s s1.o s2.o s3.c,22,另一个简单的C程序:整数求和,int 为数据类型说明符,其为一个 关键字。 a,b,c,sum为变量,其为 标识符。,例1-2 #include main( ) /* c1_2.c */ int a, b, c, sum; a =1; b = 2; scanf(“%d”, ,a = 1;为赋值语句,其中1为数字常量,=为赋值运算符。,scanf为标准输入函数,在此从键盘上读入一个整数存入变量c中。 在此,printf将变量sum内容显示到屏幕上。,+为算术运算符。,23,关键字,int auto goto if float static return else char extern break while short register continue for long do unsigned switch double case struct default union void enum typedef sizeof const signed define, undef, include, ifdef, ifndef, endif, 及line,虽不是关键字,但是最好把它们看作关键字,它们主要用于C预处理程序中。,24,标准输入及输出函数:scanf & printf,在scanf和printf中,%号开始的为格式转换控制字符,用来控制输入/出数据的格式,常用的有: scanf printf %d %d 十进制整数 %f %f 十进制浮点数 %c %c 单个字符 %s %s 字符串 %o 八进制整数 %x 十六进制整数 % %本身 在控制字符前还可以加数字,如: %4d :输出最小域宽为4个字符的整数。 %6.2f :输出最小域宽为6个字符的浮点数,并且小数点占两位。,25,一个例子:计算圆的面积及周长,例1-3 #include main() double radius, area, perimeter; scanf(“%f”, ,浮点数据类型,26,变量与变量说明,在C中,所有变量必须先说明(定义)后使用; 说明方式: 存贮类 类型 变量(列)表; 例: int lower, upper, step; char c, line100; extern double x; const double PI = 3.1415926; const char msg = “Warning”;,27,变量属性,double salary = 1500.23;,变量的类型,变量的名字,变量的值,变量的存储位置 地址: 0x00222000,28,常量,整型常量(十进制、八进制、十六进制、long整型常量),如:1275, 0127, 0x19a, 0xABD, 123l, 89L 浮点常量,如:23.15, -8E-3, -125e+4 字符常量,用一对单引号括起来字符称为字符常量,如:A, b, ? 一个字符常量的值是该字符在机器字符集(通常是ASCII字符集,但某些IBM大型机用EBCDIC码)中的编码值, 它是一个整数值。如上,在ASCII字符集中A的值为65,b的值为98,?的值为63。 转义字符常量,如: 0, n, t, b, r, f , , ddd(位模式,ddd为八进制数,其值为ddd) 字符常量可像其它数一样参与数值运算,主要用于同其它字符作比较,如: if( c = A ,29,常量(续),字符串常量,用一对双引号括起来的字符串称为字符串常量,如: “The C Programming Language” 注意:所有字符串均以0结束(代码值为0的字符),因此,“x”和x不同,末尾的0由编译程序自动添加。,30,常量定义,所有常量可以用#define来定义,即可以给一个常量命名。如: #define PI 3.14156 使用常量定义的好处: 可提高程序的可读性 程序的可移植性更好,可维护性更好,#include #define PI 3.14159 main() double radius, area, perimeter; scanf(“%f”, ,31,基本数据类型,注意:在C语言中,没有Bool(布尔)类型,它用非0值表示真(True),用0表示假(False)。 在ANSI C中,类型修饰符: const - 其变量值在程序执行中不可以通过赋值等方法对它进行修改(是定义常量的另一种方法,用#define定义的常量无类型,而用const定义的常量有类型)。如: const float PI = 3.14159;,#include const float PI = 3.14159; main() double radius, area, perimeter; scanf(“%f”, ,32,类型转换,C语言类型转换通常是自动的- 隐式(自动)类型转换 1)字符与整数 可以用整数的地方就可以用字符。 而整数转换成字符时,超出8位就将高位丢掉。 2)浮点数与整数 3)无符号整数 一般整数(int)和无符号整数(unsigned)混合使用,则简单整数转换成无符号整数。,33,类型转换(续),4)算术转换 如果一个运算符,有不同类型的运算对象,那么“较低”类型会自动转换成“较高”类型。,此外,赋值号右边表达式的类型会自动转换为赋值号左边变量类型。,如,n+1.5结果将为double类型,34,类型转换(续),强制类型转换(cast)- 显式类型转换 () 如:x = sqrt(double) n );,35,表达式与运算符,在C语言中,由运算符(operators)及运算对象(operands)构成的式子称为表达式(expression),如:x + y *z 在C语言中,一个表达式后跟一个分号可构成一条语句: ; 称为表达式语句 如: x+; n = 5; a = b = c = 0;,36,算术运算符,算术运算符: +, - , * , / , % 在算术运算时,注意整除问题,如: double f; f = 3 / 2;,f = ?,f 值为 1 而不是1.5, 若要f为1.5,则应写为: f = (double)3 / 2;,37,赋值运算符,赋值运算符: =, += , -=, /= , %= , *= , = , = , 注意:这种等价关系并不是完全正确的,因为在(e1) op= (e2)中,e1只计算一次,而在(e1)=(e1)op(e2)中却计算两次,例如:a+i *= n与a+i = a+i * n不同,后者跟计算次序有关。,38,赋值运算符(续),赋值运算符优点: 表达式简明扼要,如: bfreelist_frow-b_back += 2; 编译程序产生效率高(其用一个运算符完成其它语言中须多个运算符才能完成的功能。如:x += n只有一个运算符,而x = x+n则有两个运算符) 注意: y *= n+1; 等价于 y = y*(n+1);,而不是y = y*n+1;,39,增(减)量运算符,增(减)量运算符:+,- 依据运算符与运算对象间的位置,分为前置和后置运算 前置运算是先进行增减量,再取其值。 后置运算是先取其值,再进行增减量运算。 如: n = 5; n = 5; x = +n; x = n+; 结果: ? 结果:?,x: 6, n: 6,x: 5, n: 6,像+,-这类只要求一个运算对象的运算符又称为单目运算符(unary operators)。+,-运算符在有些书中称为自增(减)运算符。,40,例1_4给出下列程序的输出结果 #include main( ) int a, b, c; a = b = c = 0; a = +b + +c; printf(“%d %d %dn”,a, b, c); a = b+ + c+; printf(“%d %d %dn”,a, b, c); a = +b + c+; printf(“%d %d %dn”,a, b, c); a = b- + -c; printf(“%d %d %dn”,a, b, c); a = +c + c; printf(“%d %d %dn”,a, b, c); ,/* 2 1 1 */,/* 2 2 2 */,/* 5 3 3 */,/* 5 2 2 */,/* 不确定,取决于机器实现 */,增(减)量运算符(续),41,运算符优先级及结合律,42,运算符优先级及结合律(续),可以使用()运算符来改变表达式中运算符的计算次序。如: (x+y) / 12 if( (x = n) 0) while( (c = getchar() ) != EOF),高级语言程序设计(一) (C Programming),第二讲:C程序设计入门,44,本章目标,了解算法及控制结构 了解关系运算符及逻辑运算符 掌握使用选择及循环结构进行简单程序设计 掌握C程序的简单测试与调试方法 了解C程序的编程风格,45,程序设计,程序设计过程就是解决问题的过程。程序设计通常包括如下五个步骤:,分析问题: 功能:需要弄清楚软件要完成的功能; 输入:如果问题有输入,分析输入是什么及输入数据的类型; 处理:对输入数据做什么处理; 输出:如果有输出,输出什么数据及输出数据的格式; 对于复杂问题,可将问题分解为若干子问题,然后再进行上面的分析。,算法设计: 设计解决问题的具体方案(步骤)。,编码: 将算法用高级语言实现。,测试: 运行编译连接后得到的执行程序,以验证程序是否按要求 解决了问题,并没有产生副作用。即程序是否做了该做的事,同时没有做不该做的事。,调试: 如果程序经测试发现问题,则通过调试手段找到产生错误的代码并修复它。,46,结构化程序设计(structured programming),将复杂问题分解为简单问题的程序设计方法称为结构化程序设计,其特点为: 自顶向下(top-down); 逐步细化(stepwise refinement); 模块化(modular);,47,算法,任何计算问题的解决都是按指定的顺序执行一系列动作的结果。解决问题的动作及动作之间的顺序称为算法(algorithm)。,48,问题2.1,问题:“判断某学生成绩是否及格”,49,问题2.1:问题分析,输入:学生成绩;类型:整型; 处理:学生成绩值与60进行比较,大于或等于60,则及格,否则不及格; 输出:字符串“Pass”或“Fail”; 变量:需要一个整型变量用于存放输入的学生成绩。,50,问题2.1:算法设计,解决问题2.1的步骤可描述为(算法): 读入学生成绩值 如果该成绩值大于或等于60 输出信息“Pass” 否则 输出信息“Fail”,51,算法表示,算法即可以用自然语言表述(如前),也可用用半结构化语言或结构化图形表示,如: read 学生成绩值 if 成绩值 = 60 print “Pass” else print “Fail”,52,控制结构,计算机语言提供三种方式来控制算法的执行:顺序(Sequence)、选择(Selection)和循环(Loop)。,循环,53,条件:关系运算符及逻辑运算符,关系运算符:, =, =, =, != 逻辑运算符:&, |, !,注意:在C语言中,没有Bool(布尔)类型,它用非0值表示真(True),用0表示假(False)。因此,在C中,任何一个表达式都可用为条件。,A & B 若A为0,则B不必求值,结果一定为0。 A | B 若A为非0,则B不必求值,结果一定为非0。,例如: (5 = 3) | ( x = 5) (2 = 3) & ( x = 7),54,条件(续),一些常见的条件例子: 判断整形变量n的值为一个0到10之间的值: ( 0 = n & n = 10) 判断字符变量c是字母: ( a = c & c = z) | A = c & c = Z) 判断某年是平年还是闰年(闰年为能被4整除但不能被100整除,或能被400整除): ( ( y % 4 = 0 ) & ( y % 100 != 0 ) ) | ( y % 400 = 0 ),注意: 条件表达式 “0 = n = 10” 不能得到预期结果,运算符优先级,55,语句,C语言语句分成简单语句和构造语句两类。 简单语句 1)表达式语句 赋值表达式语句,如: *x+ = y *= z+3; 其它表达式语句,如:+x; -y; 函数调用语句等。 2)转移语句 goto 标号; break; 间断语句 continue; 继续语句 return; return (表达式); 3)空语句 ;,56,语句(续),构造语句 1)复合语句(分程序) * 注意:后没有分号(;),这与单个语句不同。 2)选择(条件)语句 if语句,if_else语句 3)循环语句 for语句 while语句 do_while语句 4)开关语句 switch语句(包括case语句),57,问题2.1:代码实现与测试,根据其算法描述,我们很容易将问题“判断学生成绩是否及格”的解决转换为相应的程序。,程序设计的常用方法为首先给出问题的算法描述,然后将其编程序实现。,如何判断程序解决了相应问题?可用下面输入数据来测试(检验): 75(输出应为“Pass”) 30(输出应为“Fail”) 60 (输出应为“Pass”)- 特殊数据,58,选择结构:if语句,if(表达式) 语句 if(表达式) 语句1 else 语句2,59,选择结构:if语句(续),注意:在if嵌套中,省略else会产生二义性。如: if( n 0) if(a b) z = a; else z = b; 即else与前面最接近的不带else的if相对应。若要使上面的else与第一个if相匹配,可使用。如: if(n 0) if(a b) z = a; else z = b;,60,条件运算符(?:)与条件表达式,条件运算符(三目运算符):?: 条件表达式: ? : 先计算表达式1,若其值为非零,则整个表达式结果为表达式2的值,否则就为表达式3的值。 例:计算a和b的最大值 if( a b) z = a; else z = b; 等价于: z = ( a b) ? a: b;,例2-1a /*判断学生成绩是否及格*/ #include main( ) int score; scanf(“%d”, ,61,问题2.2,问题: “判断某学生成绩对应的五级评分成绩” 问题分析: 输入:学生成绩;类型:整型; 处理:学生成绩值分别与90,80,70,60进行比较,以判断其为优、良、中、及格和不及格中哪一等级; 输出:A(优)、B(良)、C(中)、D(及格)、F(不及格); 变量:需要一个整型变量用于存放输入的学生成绩。,62,问题2.2:算法设计,解决该问题的算法如下: 得到学生成绩值 如果该成绩值大于或等于90 输出信息“优” 否则 如果该成绩值大于或等于80 输出信息“良” 否则 如果该成绩值大于或等于70 输出信息“中” 否则 如果该成绩值大于或等于60 输出信息“及格” 否则 输出信息“不及格”,63,问题2.2:代码实现与测试,得到学生成绩值 如果该成绩值大于或等于90 输出信息“优” 否则 如果该成绩值大于或等于80 输出信息“良” 否则 如果该成绩值大于或等于70 输出信息“中” 否则 如果该成绩值大于或等于60 输出信息“及格” 否则 输出信息“不及格” 算法,例2-2 /*判断学生成绩对应的五级评分*/ #include main( ) int score; scanf(“%d”, ,嵌套if结构,测试数据为: 95 90 85 80 75 70 65 60 55,64,多路选择:if_else if,例2-2a /*判断学生成绩对应的五级评分*/ #include main( ) int score; scanf(“%d”, ,一种更好的风格!,65,多路选择:if_else if(续),注意:不当的判断顺序可能造成程序错误的执行结果,如: #include main( ) int score; scanf(“%d”, ,下面程序实现与例2-2a程序完成一样的功能,但效率要低。 /*判断学生成绩对应的五级评分*/ #include main( ) int score; scanf(“%d”, ,66,多路选择:switch语句,基本形式: switch(表达式) case常量表达式1:语句1或空; case常量表达式2:语句2或空; case常量表达式n:语句n或空; default:语句n+1或空; 语义动作为: 先计算表达式的值; 该值与每一个case后的常量进行比较; 若匹配,则控制就转向该常量后的语句; 若不匹配,若有default,则转向default后的语句,否则什么也不做;,67,多路选择:switch语句(续),注意: 常量表达式必须是整型(if_else if可能根据任意条件来进行多路选择); 在同一个switch中不应出现两个具有同样的情况常量; default语句如果有,只允许出现一次,default可出现在switch中的任何位置,通常放在最后; case和default本身不改变控制流(这与pascal中的case语句不同),中断离开switch要用break; case后的语句可以是单个语句,也可以是复合语句(但不带开头和结尾的花括号) C中switch语句与Pascal中case一个不同是:C有default语句。,因此,switch语句特别适合于依据一组常量值来进行判断的多路选择。,68,多路选择:switch语句(续),例如:打印学生成绩 #include main( ) char score; score = getchar(); switch(score) case F: printf(“no passn”); break; case D: printf(“passn”); break; case C: printf(“bettern”); break; case B: printf(“rightn”); break; case A: printf(“all rightn”); break; default: printf(“input error!n”); break; ,case C: printf(“bettern”);,将出现什么问题?,如果输入为C,则输出为: better right,69,多路选择:switch语句(续),问题2.2的另一种解决方式。,例2-2b /*判断学生成绩对应的五级评分*/ #include main( ) int score; scanf(“%d”, ,70,问题2.3,问题: “某班有30名学生,输入每个学生成绩并判断其是否及格”。 问题分析: 输入:学生成绩;类型:整型; 处理:学生成绩值与60进行比较,大于或等于60,则输出及格(”Pass”),否则输出不及格(”Fail”); 输出:字符串“Pass”或“Fail”; 依次对每个学生重复上面步骤,重复次数为30次。 变量:需要一个整型变量用于存放输入的学生成绩,一个整型变量用于记录重复次数。,71,问题2.3:算法设计,算法: 1.设置变量n为0 2.读入一学生成绩值到变量score中 3.判断score值,如果大于或等于60,则输出“Pass”,否则输出”Fail”; 4.变量n加1 5.重复步骤2至4,直到n等于30,72,问题2.3:算法设计(续),算法流程图,73,问题2.3:代码实现,程序: 例2-3 /*判断某班学生成绩是否及格*/ #include main( ) int n, score; n = 0; while(n = 60) printf(“Passn”); else printf(“Failn”); n+; ,算法: 1.设置变量n为0 2.读入一学生成绩值到变量score中 3.如果score=60 输出”Pass” 否则 输出“Fail” 4.变量n加1 5.重复步骤2至4,直到n等于30,while循环语句,测试数据考虑: 依次输入30个成绩值,这些值中应包括100,60,0等特殊值。,74,循环结构:while语句,while(表达式) 语句,75,循环结构:while语句(续),例:从键盘读入字符并输出 #define EOF 1 main( ) int c; while( c = getchar( )!= EOF) putchar( c ); ,算法分析: 读入一个字符 while 不是输入结束符 输出字符; 读入下一个字符;,1)程序如何结束? Ctr-z 2)为何程序运行: hello hello,76,循环结构:for语句,for(表达式1;表达式2;表达式3) 语句 其等价于: 表达式1; while(表达式2) 语句; 表达式3; ,77,循环结构:for语句(续),例2-3a /*判断某班学生成绩是否及格*/ #include main( ) int n, score; for (n=0; n = 60) printf(“Dn”); else printf(“Fn”); ,78,循环结构:for语句(续),for特别适合于循环次数固定或有固定步长的循环,如下面是一个循环十次的循环: for( i=0; i10; i+) 当然也可以用于其它方面,见如下两例。,79,循环结构:for语句(续),例:将字符串转换成整数,“123”,1-0= 1,1*10 + 2-0 = 12,12*10 + 3-0 = 123,算法分析,80,循环结构:for语句(续),int atoi(char s ) int i, n, sign; for(i=0; si = = | si = = n | si = = t; i+) ; /* skip white space */ sign = 1; if(si = = + | si = = -) sign = (si+ = = +)?1:-1; for(n=0; si = 0 ,数组:数据的有序集合,所有数据具有相同类型。 通过下标来访问数组元素。将在下一讲详细说明。,#include int atoi(char s ); main() char s20; scanf(“%s”, s); printf(“%dn”, atoi(s); ,81,循环结构:for语句(续),例:将字符串颠倒,“”,算法分析,交换,82,循环结构:for语句(续),void reverse(char s ) int c, i, j; for(i=0, j=strlen(s)-1; i j ; i+,j-) c = si; si = sj; sj = c; ,int strlen(char s ) int i=0; while(si != 0) +i; return (i); ,#include int reverse(char s ); Int strlen(char s ); main() char s20; scanf(“%s”, s); reverse(s); printf(“%sn”,s); ,83,循环结构:for语句(续),注意:从语法上讲,表达式中任一个都允许省略,但分号不能省。 如: for( ; (c = getchar( )!= EOF; ) 语句s; for( ; ;) 语句s; 当表达式2不出现时,则认为条件为真,循环永远下去(无穷循环),退出它只能用break或return语句。 因此, while(A) B; 等价于 for(; A; ) B;,84,循环结构:do_while语句,do 语句 while (表达式); 作用类似于while,但do_while是否终止,其判定条件是在循环体之后,即它总是先执行一次循环体,再判断表达式的值是否为真。,85,循环结构:do_while语句(续),总的说来,while(for)循环是在顶上测试循环终止条件,而do_while是在每次通过循环体之后,在底部进行测试,所以循环体至少要进行一次。 注意:do_while与Pascal语言中的Repeatuntill不同- 其布尔表达式为False时继续循环,若为True时,终止循环。,86,循环结构:do_while语句(续)*,例:将一个整型数转换成字符串。 void itoa(int n, char s ) int i, sign; if(sign = n) 0); if(sign 0) si+ = -; si = 0; reverse(s); ,87,循环结构,三种循环主要的用途: for通常用于固定步长的循环 while通常用于循环条件在头部判断的循环 do_while通常用于至少循环一次的循环,88,问题2.4,问题:“某班有30名学生,输入每个学生成绩并判断其成绩是否及格,在判断学生成绩过程中,如果输入的学生成绩不合法(如大于100或为负数)则给出错误提示,并终止程序运行”。 问题分析: 与问题2.3不同的是在处理学生成绩时,首先要判断所读入的成绩值是否非法,如果非法,则给出错误信息并退出处理;否则继续处理。,算法: 1.设置变量n为0 2.while n小于30 2.1 读入一学生成绩值到变量score中 2.2 如果变量score值大于100或小于0: a.输出错误信息 b.退出循环 2.3 判断score值,输出“Pass”或“Fail” 2.4 变量n加1 3.结束,如何中途退出循环?,break语句,89,break和continue语句(goto语句),例2-4 /*判断某班学生成绩对应的五级评分*/ #include main( ) int n, score; for (n=0; n 100 | sorce = 60) printf(“Dn”); else printf(“Fn”); ,退出循环,90,break和continue语句(goto语句)(续),break:迫使程序从包含它的最内层循环体或开关语句中跳出(循环只能跳出一层)。 continue:迫使程序从包含它的最内层循环体立即执行下一次循环(不管现在程序执行到何处)。 goto标号:使控制转移到标号处。 标号作用范围是当前函数; 只允许从里层转向外层,而不允许反过来由外层转向里层;,91,break和continue语句(goto语句)(续),例:统计非数字字符数。 main( ) int count; char c; count = 0; while( c = getchar( ) != EOF) if( c = 0 ,不用continue语句同样可以实现该程序: main( ) int count; char c; count = 0; while( c = getchar( ) != EOF) if( c 9) count+; printf(“non digital character: %dn”, count); ,92,break和continue语句(goto语句)(续)*,国际上对goto语句作出结论:从理论上讲,goto语句决非是必要的语言成份,取消它同样可写出各种各样的程序,但有时不得不用goto语句,如下程序段。应该是有选择地使用goto,以达到程序结构清晰、易读、易维护的目的。 int i, j, k, x; float y; for(i = ) for(j = ) for(k = ) scanf(“%d %f”, ,93,程序设计实践:测试(Testing),如何验证一个程序解决了问题(即实现了所要的功能),可分析每个输入数据的范围,然后对每个数据从下面几个方面来考虑测试数据: 正常数据(范围内,如问题2.1中的75),以确定程序做了该做的事; 边界数据(范围边界,如问题2.4中的60,0, 100),以确定程序在数据边界上处理没有错; 非法数据(范围外,如问题2.4中-1,或者101),以确定程序没有做不该做的事,即进行了错误处理;,94,程序设计实践:调试程序(Debug),调试(Debug):定位并解决问题 调试方法: 简单:使用打印语句(printf); 高级:使用编程环境所带的调试工具; 调试方式: 设置/删除断点(Insert/Remove Breakpoint) 查看变量(Watch) 单步执行(Step Over / Step Into) 执行到光标处(Run to Cursor),95,调试程序(Debug)(续):设置断点,设置/删除断点,断点,96,调试程序(Debug)(续):运行并查看变量,开始调试(运行),程序执行停在断点处,当前变量及内容,查看其它变量内容,单步执行(Step Over) 执行到光标处(Run to Cursor),97,调试程序(Debug)(续):一个范例,98,程序设计实践:程序设计风格(Style or Convention)(一),为什么要强调程序设计风格: 可以改善软件的可读性,帮助程序员理解代码 。,99,程序设计风格(Style or Convention)(一)(续),变量名与常量名: 变量名应简短且富于描述(自说明)。变量名的选用应该易于记忆,即,能够指出其用途,如前面例子中用于存入学生成绩的变量score。 尽量避免单个字符的变量名,除非是一次性的临时变量,如循环变量。临时变量通常被取名为i,j,k,m和n。 常量应该全部大写,单词间用下划线隔开 。如: const int MIN_WIDTH = 4 ; #define MAX_LENGTH 100,100,程序设计风格(Style or Convention)(一)(续),main函数格式: int main() statements; return 0; ,101,程序设计风格(Style or Convention)(一)(续),if语句格式: if-else语句应该具有如下格式: if (condition) statements; if (condition) statements; else statements; if (condition) statements; else if (condition) statements; else statements; ,while语句格式: 一个while语句应该具有如下格式: while (condition) statements; for语句格式: 一个for语句应该具有如下格式: for (initialization; condition; update) statements; do_while语句格式: 一个do-while语句应该具有如下格式: do statements; while (condition);,102,程序设计风格(Style or Convention)(一)(续),switch语句格式: 一个switch语句应该具有如下格式: switch (condition) case ABC: statements; /* falls through */ case DEF: statements; break; case XYZ: statements; break; default: statements; break; ,103,运算符优先级及结合律,高级语言程序设计(一) (C Programming),第三讲:模块化程序设计(函数),105,本章目标,了解模块化程序设计思想 掌握函数的定义及调用方式 掌握函数参数传递方式 了解递归函数 了解变量存储类型及作用域 了解C预处理程序,106,模块化程序设计,将复杂问题分解为简单问题的程序设计方法称为结构化程序设计,其特点为: 自顶向下(top-down design); 逐步细化(stepwise refinement); 模块化(modular programming); 模块化的好处: 功能分解的需要; 代码重用;,107,在程序设计中如何划分函数,程序中可能有重复出现的相同或相似的计算片段,可以考虑从中抽取出共同的东西,定义为函数。这样可以缩短程序代码,提高程序的可读性和易修改性。 程序中具有逻辑独立的片段。这样做主要用于分解程序的复杂性。,108,问题3.1,问题:“某老师给某年级14班讲程序设计课,期末考试后,请统计每个班及格和不及格的学生人数。” 假设学生成绩从标准输入中输入,首先输入的是班级代号(如1,2,),然后是每个学生的成绩,每个班的成绩以-1结束,对于非法输入(成绩值大于100或小于0)应给出必要提示。,109,问题3.1:问题分析与算法设计,问题分析:有两种方法解决该问题 依次编写代码分别统计每个班成绩; 将统计某班成绩功能放到一个函数中,然后使用函数来统计每个班的成绩;,main() 统计1班成绩; 统计2班成绩; 统计3班成绩; 统计4班成绩; ,110,问题3.1:问题分析与算法设计(续),统计某班成绩的算法为:,1.读入班级代号到ClassID; 2.读入一成绩到变量 score; 3.while score值不为-1 if score 不合法 结束处理 if score 大于或等于60 PassNum加1 else FailNum加1 读入下一成绩到变量 score; 4.输出变量ClassID, PassNum和FailNum 值,111,问题3.1:代码实现,例3_1: #include int dealScore(); int main() int i; for(i=0; i 4; i+) dealScore(); return 0; ,int dealScore( ) int score; int classid, passnum, failnum; passnum = failnum = 0; scanf(“%d”, ,函数定义头部,其中 int 为函数类型 dealScore为函数名,函数返回(return)语句,函数定义体,函数原型说明,函数调用,scanf和printf标准I/O库函数,局部变量,112,标准(库)函数,标准I/O库函数 #include ( getchar, putchar) 标准数学函数 #include (sin, cos, sqrt) ,113,函数定义与调用,在ANSI C标准中,函数定义形式为: 类型 函数名(参数说明) 局部变量定义或说明 语句 ,114,函数定义与调用(续),函数名一般是标识符,一个程序只有一个main函数,其它函数名可随意取,当然最好是有助于记忆的名字。 在ANSI C标准中,函数(返回值)类型不允许省略,即使是返回整型值(int),当函数无返回值时,应其类型说明为void类型。 局部变量定义或说明可有可无。 注意:在C语言中,函数定义不允许嵌套,即在一个函数体内不能包含有其它函数的定义。,115,函数定义与调用(续),函数调用形式:函数名(实参表) 其中实参个数、类型、排列次序应和形参定义时一致。(老版本的C编译器往往不做这方面的检查) 函数通过return语句将值返回给调用函数。它有两种使用形式: 1)return expr; 2)return; 注意:使用return语句只能返回一个值。,116,问题3.2:,问题:计算一个实数的n次幂。 问题分析: 输入:一个浮点数,类型:double;一个整数,类型:int; 处理:计算浮点数的幂; 输出:计算结果(浮点数),格式:%.2f(假设小点后保留两位) 变量: double f; int n;,用一个函数power来计算xn,主函数算法设计: 1. 读入一个浮点数和一个整数分别存入变量f和n中; 2. 调用函数power计算f的n次幂; 3. 输出计算结果;,117,问题3.2:函数power分析(逐步细化),参数:两个 double x, int n 函数(返回值)类型: double 算法分析: 局部变量: double p 计算结果 int i 循环变量,算法设计: 设变量i为1,p为1 while i = n 2a. p = p * x 2b. i加1 3. 返回p值,函数可通过两种方式返回运算结果: return 语句; 函数参数,在下一章说明;,118,问题3.2:代码实现,例3-2:计算x的幂。 #include double power(double x, int n); int main( ) int n; float f; scanf(“%f %d”, ,119,问题3.2:代码实
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无人机飞行团队合作考题及答案
- 2025年医保报销流程专项考试题库及答案:案例分析题集解析
- 医疗体验升级新趋势情感化设计的运用与探索
- 区块链科技引领肥胖数据精确共享的新纪元
- 医疗行业中的区块链信息安全解决方案
- 医疗领域数字内容版权保护的挑战与机遇
- 消防安全预警系统试题及答案
- 2025年入团考试详细试题与答案解析
- 医疗信息系统的安全架构与加固
- 备考轻松指南无人机驾驶员考试试题及答案
- 2025届高考英语二轮复习专题一应用文写作课件
- 2023法律职业资格(主观题)真题带解析
- 2025年高级政工师理论考试题库(浓缩500题)
- 第37届(2020年)全国中学生物理竞赛预赛试题及参考解答
- JTG H30-2015 公路养护安全作业规程
- 土木工程CAD-终结性考核-国开(SC)-参考资料
- MOOC 创新与创业管理-南京师范大学 中国大学慕课答案
- 3 春夜喜雨课件(共16张PPT)
- 华电 电厂招聘化学试题
- 上海市住宅修缮施工资料及表式(共251页)
- 毕业设计--螺旋输送机设计说明书
评论
0/150
提交评论