C 程序设计(清华大学课件)ppt.ppt_第1页
C 程序设计(清华大学课件)ppt.ppt_第2页
C 程序设计(清华大学课件)ppt.ppt_第3页
C 程序设计(清华大学课件)ppt.ppt_第4页
C 程序设计(清华大学课件)ppt.ppt_第5页
已阅读5页,还剩157页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C 程序设计,第 1 章 C 语言概述 第 2 章 数据类型与数据对象 第 3 章 运算与操作 第 4 章 基本程序结构 第 5 章 分支结构 第 6 章 分支结构,C 程序设计,第 1 章 C 语言概述,提 纲,1.1 C 语言简介 1.2 C 语言的关键字和标识符 1.3 C 程序基本结构 1.4 C 程序开发流程 1.5 Turbo C 3.0 上机环境与基本操作 1.6 Visual C+ 6.0 上机环境与基本操作,1.1 C 语言简介,C 语言历史 Ritchie & Kernighan(Bell Labs.) 从 B 语言脱胎而来 为开发 UNIX 而设计 C 语言标准 ANSI C 标准化委员会:1983 ANSI C:C89 ISO/IEC 9899:1990:C90 C99,C 语言特点,中级语言:介于高级语言与低级语言之间 高级语言的结构化与模块化 低级语言的控制性与灵活性 结构化 顺序结构、分支结构、循环结构 模块化 函数、函数库 可移植性,1.2 C 语言的关键字和标识符,字符集(ASCII码字符集) 大小写英文字母 数字 特殊符号 标识符 关键字 预定义标识符,标识符,标识符定义 以下划线或英文字母开头 区分大小写 例:Prog 与 prog 是两个不同的标识符 除了开头字母,标识符中其他字符可以使用下划线、字母、数字按照任意形式书写,不允许空格 有效标识符:programming、_id_、Windows_Vista 无效标识符:0xff、 标识符定义技巧 使用下划线增强可读性:a_very_long_identifier C 未规定标识符长度,建议不超过31个字符,并尽可能简短 标识符不允许同名 标识符的命名应尽可能表达其意义,增强程序可读性,关键字,关键字定义 程序中预先定义的标识符,在语言中具有特殊意义 不允许定义与关键字同名的标识符 关键字列表 预定义标识符:库函数名与预编译指令 define、undef、include、ifdef、ifndef、endif、line,1.3 C 程序基本结构,编写程序,显示字符串 “Hello World!“,#include int main() printf( “Hello World!n“ ); return 0; ,主函数的函数头,全局惟一,预编译指令,包含标准头文件,函数体,花括号内为语句序列,标准库函数,在输出设备(一般为屏幕)上输出一行文本 函数调用,需要了解该函数原型,即函数如何使用的细节信息;printf 函数原型位于“stdio.h“中,故需包含该头文件 双引号内为字符串内容;n为转义字符,表示换行 分号表示语句结束,函数结束执行,程序退出,数据对象,编写程序,计算用户输入的两个整数之和,#include int main() int a, b, sum; printf( “The program adds two integers.n“ ); printf( “The first number: “ ); scanf( “%d“, ,数据的输入与存储,a,b,sum,数据的输入与存储,1,a,b,sum,数据的输入与存储,1,2,a,b,sum,数据的输入与存储,1,2,3,a,b,sum,C 程序结构特点,由一个或多个函数组成 具有惟一一个主函数 main 程序执行由主函数开始,其他函数由主函数调用或间接调用 程序执行流程与函数定义顺序无关 每个函数包含函数头与函数体两部分 C 标准库包含大量库函数,程序员可直接使用 库函数原型位于相应头文件中,使用函数前必须包含该头文件,1.4 程序设计的基本流程,1.5 Turbo C 环境,Turbo C 集成开发环境 文件的创建和保存 源文件的编辑 编译与链接 程序的执行,Turbo C 用户界面,文件的创建和保存,使用 File | New 命令,创建文件,新文件缺省名 noname00.cpp,使用你的文件名代替,扩展名使用 .c,确保系统按照 C 语言而不是 C+ 格式编译源文件,创建文件,新文件缺省名 noname00.cpp,保存文件,使用你的文件名代替,扩展名使用 .c,确保系统按照 C 语言而不是 C+ 格式编译源文件,打开文件,输入目录和文件名,或者选择目录和文件名,打开指定的源文件或头文件,编辑文件,使用 Edit 菜单编辑和修改源文件,编辑文件,使用 Edit 菜单编辑和修改源文件 注意:Turbo C 环境中的快捷键与 Windows 操作系统不同,查找文件,使用 Search 菜单查找和替换文本内容,编译和链接文件,使用 Compile 菜单编译和链接程序 Compile:只编译;Make:编译和链接;Link:链接;Build all:强制编译和链接全部文件,运行程序,使用 Run 菜单运行程序 Run:直接运行;Go to cursor:运行到光标处停止;Trace into:进入函数内部调试;Step over:直接运行函数体,跳过其调试,Visual C+ 集成开发环境,Turbo C 集成开发环境 文件的创建和保存 源文件的编辑 编译与链接 程序的执行,Visual C+ 用户界面,文件的创建和保存,编译和链接,作 业,第 18 页 第 2、3 题,C 程序设计,第 2 章 数据类型与数据对象,提 纲,2.1 数据类型概述 2.2 整数类型 2.3 实数类型 2.4 字符类型 2.5 常数 2.6 变量 2.7 常量 2.8 用户自定义类型,2.1 数据类型概述,2.2 整数类型,整数类型 定义 a 为整数:int a; 整数的符号:确定是否表示负数 signed、unsigned 定义 b 为无符号整数:unsigned int b; 整数的长短:确定整数取值范围的大小 long、short 定义 c 为短整数:short int c;,整数的取值范围,2.3 实数类型,单精度实数:float 有效位数:7 双精度实数:double 有效位数:16 实数的取值范围 最小数与最大负数,0,最小正数与最大数 最大负数与 0 以及 0 与最小正数之间的数无法表示 建议使用 double,不要使用 float,double 类型的使用,编写程序,计算用户输入的两个实数之和,#include int main() double a, b, sum; printf( “The program adds two real numbers.n“ ); printf( “The first real number: “ ); scanf( “%lf“, ,float 类型的使用,编写程序,计算用户输入的两个实数之和,#include int main() float a, b, sum; printf( “The program adds two real numbers.n“ ); printf( “The first real number: “ ); scanf( “%f“, ,2.4 字符类型,字符类型 定义格式:char ch; 实际存储时字符类型量存储字符的对应 ASCII 值 可使用 signed 与 unsigned 修饰字符类型 字符类型的取值范围,ASCII 码表,字符类型的使用,编写程序,接受用户输入的某个字符并输出,#include int main() char c; printf(“The program gets and prints a character.n“); printf(“Please input a character: “); scanf(“%c“, ,2.5 常数,定义:程序中单独出现的值,也称文字 例:3.14、100 等 整数类型常数 十进制、十六进制、八进制 浮点类型常数 字符类型常数 字符串类型常数,整数类型常数,十进制表示:普通整数表示 十六进制表示:逢十六进一,无正负号 以“0x”或“0X”开头的 09、A/aF/f 序列 例:0x55、0X1F、0x2a 0x5516 = 8510 八进制表示:逢八进一,无正负号 以“0”开头的 07 序列 例:055 0558 = 4510 注意不要与十进制混淆!,浮点数类型常数,一般形式:小数表示法 由整数部分、小数点与小数部分组成 例:3.1416、2.718281828 指数形式:科学计数法 由尾数部分、字符E/e与指数部分组成 例:3.14e3 = 3.14103、2.7E2 = 2.7102,字符类型常数,单引号引起来的单个字符 例:C、a 单引号是字符常数的界定符,不是内容! 字符常数的值:该字符对应的 ASCII 值 可以像普通整数参与运算 例:c = A + 2; / c 为字符型变量,结果为 C,值 67,字符串类型常数,双引号引起来的字符序列 例:“Programming in C“、“Hello World!n“ 双引号是字符串常数的界定符,不是字符串的内容! 转义序列 字符串不仅可以包含可打印字符,也可以包含表示特殊活动的特殊字符 格式:使用反斜杠开始转义序列,后跟一个或多个字符 转义序列整体作为单个字符进行处理,样式固定 例:“n“、“,C 语言预定义的转义序列,符号常数,符号常数的宏定义 #define 指令:预处理命令 格式:#define 符号常数 常数 例:#define PI 3.14 宏定义不是常量! 目的与意义 增强程序可读性 使用有意义的名字命名 增强程序的可维护性 将值定义为符号常数,则程序中仅需要修改一次,#include #define PI 3.1416 int main() double radius, area; / scanf(“%lf“, ,变量,变量的定义 变量的使用 变量的特征 变量的赋值 变量的初始化,变量的定义,先定义再使用 定义格式:变量类型 变量名称, 变量名称; 单独定义例:float sum; 同时定义例:double b, c; 变量名称应既有惟一性:不允许重名 定义变量的目的 在程序执行期间保存待处理的数据、保存中间或最终结果,不同类型的变量保存不同类型的数据,变量的使用,#include int main() double radius; /* 定义变量radius为实数类型 */ radius = 2.1; /* 将变量radius赋值为2.1 */ radius = 2.0 * radius; /* radius的值发生变化 */ radius = radius + 2.2; /* radius的值再次发生变化 */ printf(”%lf”,m); /* 输出计算结果 */ return 0; ,变量的特征,变量的特征:VANT 变量总是具有值(Value) 变量总是与内存中的地址(Address)相对应 变量总是具有名称(Name) 变量总是具有确定的类型(Type) 变量的存储表示图,变量的赋值,赋值表达式 格式:变量名称 表达式 例:a = 0 赋值语句:赋值表达式加分号 格式:变量名称 表达式; 例:a = b + c;,赋值流程,赋值流程,a = 1;,赋值流程,a = 1; b = 2;,赋值流程,a = 1; b = 2; sum = a + b;,变量的初始化,在定义变量时显示设定变量的值 格式:数据类型 常量名称 = 初始值; 例:int zero = 0; 例: double p = 1.5, d = 0.1; / 定义p和d为双精度浮点数类型,初始值分别为1.5和0.1 例: float x, y, z = 0.3; / 定义x、y、z为实型变量,仅变量z进行了初始化 例: char c = a; / 定义字符型变量c,其初始值为字符a 注意事项 未初始化的变量并不意味值为0:全局变量为0,而局部变量为以前残存值,可能为0,也可能不为0 不能使用未初始化或未赋值的变量参与程序运算,常 量,常量的定义:程序执行期间其值不可改变的量 格式:const 数据类型 常量名称 初始值; 例:const int zero 0; 常量的意义 解决直接出现的文字无法解释其意义的问题 常量与变量 常量不可改变值,其他与变量同 定义常量时必须进行初始化! 常量初始值必须能够在编译期间计算出来 优先使用常量而不是符号常数,2.8 用户自定义类型,枚举类型 typedef 关键字,枚举类型,枚举类型的声明 枚举:一一列举 格式:enum 枚举类型标识符 枚举文字1, 枚举文字2, ,枚举文字n ; 例:enum _BOOL FALSE, TRUE ; 例:enum _WEEKDAY SUN, MON, TUE, WED, THU, FRI, SAT ; 枚举类型声明中的元素为枚举文字,不是变量,枚举类型,枚举类型变量的定义 定义枚举类型变量时不能省略 enum 关键字! 例:enum _BOOL flag; 例: enum _WEEKDAY weekday; 枚举类型的变量可以赋值,但只能使用枚举文字进行赋值,不建议直接使用整数赋值 枚举类型的意义 将多个文字组织在一起,表达从属于特定类型的性质 取代魔数,使源代码更易理解,typedef 关键字,自定义类型的格式 格式:typedef 原类型描述 新类型名; 例:typedef unsigned int UINT; 例:typedef enum _BOOL FALSE, TRUE BOOL; 例:typedef enum SUN, MON, TUE, WED, THU, FRI, SAT WEEKDAY; 自定义类型的性质 新类型与原类型相同,并未产生新类型,重新命名的自定义类型使程序更易理解 若整数可以用于表示两类不同数据对象,使用自定义类型可以区分它们 自定义类型不是简单的类型替换,虽然它们确实等同,作 业,第 36 页 第 1 题,C 程序设计,第 3 章 运算与操作,提 纲,3.1 表达式 3.2 算术操作符 3.3 赋值操作符 3.4 表达式求值 3.5 逗号操作符 3.6 混合运算与类型转换,3.1 表达式,表达式的定义 操作数与操作符序列,表达运算过程 操作数 文字常数与符号常数、量、函数调用、括号 操作符:运算逻辑 表达式值:运算结果 表达式求值:计算表达式值的过程 类比:按普通四则运算理解表达式求值过程,逐一计算表达式中所有操作符,直至完成,3.2 算术操作符,算术操作符 加(+)、减(-)、乘(*)、除(/) 余(%):仅适用于整数 特别说明 整数除法的结果仍然是整数,余数舍弃,不四舍五入 例:7 / 2 结果为 3 要想得到余数,使用取余操作符 例:7 2 结果为 1 取负操作符可以作用在单操作数上 例:int a = 1; int b = -a;,前缀递增递减操作符,递增递减操作符的优先级非常高 前缀递增递减 格式:+变量名称; -变量名称; 例一:设 a 为 1,+a 等价于 a = a + 1,a 结果为 2 例二:设 a 为 1,-a 等价于 a = a - 1,a 结果为 0 计算要诀:先递增递减,再参与运算 例三:设 a 为 1,b = +a * 3 等价于 a = a + 1; b = a * 3,a 结果为 2, b 结果为 6 例四:设 a 为 1,b = -a * 3 等价于 a = a - 1; b = a * 3,a 结果为 0, b 结果为 0,后缀递增递减操作符,后缀递增递减 格式:变量名称+; 变量名称-; 例一:设 a 为 1,a+ 等价于 a = a + 1,a 结果为 2 例二:设 a 为 1,a- 等价于 a = a - 1,a 结果为 0 计算要诀:先参与运算,再递增递减 例三:设 a 为 1,b = a+ * 3 等价于 b = a * 3; a = a + 1,a 结果为 2, b 结果为 3 例四:设 a 为 1,b = a- * 3 等价于 b = a * 3; a = a - 1,a 结果为 0, b 结果为 3 注意事项 操作数必须为变量,而不能为其他表达式 不要在复杂表达式中使用递增递减操作符!,3.3 赋值操作符,赋值操作符(=)与赋值表达式 例:int a, b; /* 变量定义 */ a = a; /* 直接给变量赋值 */ b = b + a; /* 直接给变量赋值 */ 例: const double pi = 3.1416; /* 常量定义 */ double area, radius; /* 变量定义 */ radius = 1.3; /* 直接给变量赋值 */ area = pi * radius * radius; /* 计算右侧子表达式的值后再给变量赋值 */ 赋值语句兼有表达式计算和赋值的双重功能 赋值号将其右边表达式的结果赋值给左边的目标变量 注意,赋值号左边一定是变量名(或等价于变量的数组元素名),赋值语句对该变量实施写操作。 当右边表达式的计算结果类型与左边变量的类型不一致,则先将右边表达式的值转换为与左边目标变量相同的类型,然后进行赋值。例如: i = d + 1; 其中i为int类型,d为double类型。于是此运算的处理过程是先将1转换为double类型(1.000000),然后执行d+1.000000,结果为double类型,最后再把double类型的结果转换为int类型再赋给i。 当然这种由“长型”向“短型”的转换可能会导致数据精度上的一些损失。例如将浮点数赋值给一个整型变量,会舍弃小数点后面的数据,此种情况称之为“截断”。,关于赋值操作符的注意事项,赋值号左边一定是变量名(或等价于变量的数组元素名),赋值语句对该变量实施写操作 当右边表达式的计算结果类型与左边变量的类型不一致时,则先将右边表达式的值转换为与左边目标变量相同的类型,然后进行赋值 例:i = d + 1; / i 为 int 类型,d 为 double 类型 运算过程:先将 1 转换为 double 类型(1.000000),然后执行 d+1.000000,结果为 double 类型,最后再把 double 类型的结果转换为 int 类型再赋给 i 注意:转换过程可能会导致数据精度损失,复合赋值表达式,加赋:x += a 等价于 x = x + a 减赋:x -= a 等价于 x = x - a 乘赋:x *= a 等价于 x = x * a 除赋: x /= a 等价于 x = x / a 除法作用于整数上时,结果也为整数 余赋: x %= a 等价于 x = x % a :两个整数进行整数除法,结果为余数 特别说明 x *= a + b 等价于 x = x * (a + b),3.4 表达式求值,表达式求值顺序 与数学运算类似,按照操作符的优先级与结合性进行 典型运算复合数学直觉 特殊运算的优先级难以记忆,使用括号,3.5 逗号操作符,用逗号操作符连接的表达式叫逗号表达式 逗号表达式的计算顺序 从左到右计算每个子表达式的值,结果为最后一个子表达式的值 例:z = (x = m + n, y = m n, x / y); 若 m 为 5,n 为 3,则 z 值为 4 不建议使用逗号表达式,3.6 混合运算与类型转换,不同类型数据参与运算时必须统一数据类型才能进行实际运算 类型的转换以不损失精度为一般前提 例外情况:偶尔也会损失精度 类型转换的分类 隐式类型转换 显式类型转换,隐式类型转换与显式类型转换,隐式类型转换 程序自动进行,程序员不需要干预 转换原则:一般以不损失精度为前提 赋值时右边表达式值先转换为变量类型后再进行 显式类型转换 程序员手工进行的类型转换 格式:(转换后的数据类型)原表达式 例:设 int a; double g = 9.80665; a = g; / 进行隐式类型转换,小数部分舍弃,a 值为 9 a = (int)g * 4; / 进行显式类型转换,a 值为 4*9=36 a = (int)(g * 4); / 进行显式类型转换,a 值为 39,隐式类型转换示例,指出下述代码执行后 result 的结果 char c = A; int i = 6; float f = 10.0; double d = 0.2, result; result = (c / i) + (4 + f * d) * (f i) ; /发生类型转换 运算过程 计算 c / i:c 由 char 转换为 int 型,结果为 10 计算 4 + f * d:转换为 double 型,结果为 double 类型 计算 f i:转换为 float 型,结果为 float 类型 对三个中间结果进行计算:转换为 double 类型,结果为 double 类型,作 业,第 45 页 第 3 题,C 程序设计,第 4 章 基本程序结构,提 纲,4.1 语句与注释 4.2 字符输入输出 4.3 格式化输出 4.4 格式化输入 4.5 程序的顺序结构,4.1 语句与注释,简单语句 复合语句 空语句 注释,简单语句与复合语句,简单语句 表达式后面添加分号构成的语句 例:int n; 例:double d, total; 例:total = n + d; 例:printf(“%d + %lf = %lfn“, n, d, total); 无逻辑意义的语句例:n + d; 复合语句 格式:花括号对括起来的语句序列,可以作为整体看待 例: a = 1; b = a + 1; ,空语句与注释,空语句 格式:单独出现的分号 目的:满足语法规则要求;作为未来添加程序代码的占位标记 注释 注释的目的:增强程序的可读性、可维护性 注释的格式 格式一:“/*”与“*/”对,注释其中的部分,可出现在程序代码的任意地方 例一: int /* 此处内容为注释 */ a; 格式二:“/”,注释从此字符序列开始直至本文本行结束 例二: int a; / 此处内容为注释 同一种注释标记不可以嵌套 “/”不跨行,“/*”与“*/”对可跨行,4.2 字符输入输出,基本事实 输入输出是语言与算法必须具备的功能 C 语言本身没有输入输出语句或命令,输入输出需使用标准库函数 输入输出函数原型位于头文件“stdio.h”中 典型输入输出函数 字符输出函数 putchar 字符输入函数 getchar 格式化输出函数 printf 格式化输入函数 scanf,字符数据对象的输出,使用 putchar 函数输出字符 A,#include “stdio.h“ int main() char c; c = 65; putchar(c); return 0; ,字符数据对象的输入,使用 getchar 函数获取用户输入的字符,然后调用 putchar 函数输出该字符,#include “stdio.h“ int main() char c; c = getchar(); / 只有用户输入回车后,此函数才结束 putchar(c); return 0; 字符输入输出功能过于简单,不能完成复杂任务,4.3 格式化输出,基本事实 输入输出是语言与算法必须具备的功能 C 语言本身没有输入输出语句或命令,输入输出需使用标准库函数 输入输出函数原型位于头文件“stdio.h”中 典型输入输出函数 格式化输出函数 printf 格式化输入函数 scanf,格式化输出函数 printf,格式化输出函数 printf 调用格式 格式: printf( “输出格式规约字符串“, 输出项列表 ); 例一:printf( “The program prints a greeting.n“ ); 例二:printf( “Hello, %s.n“, name ); 例三:printf( “%f + %f = %fn“, a, b, sum ); 例四:printf( “%d + %lf = %lfn“, n, d, sum ); %y:格式描述符 %d:十进制整数 %f:float类型浮点数; %lf:double类型浮点数 %c:单个字符 %s:字符串 %u:无符号整数 其他无须记忆,用时查表,printf 使用示例,输出单个字符 char c = A; /* 已定义某个字符变量c,并已初始化或赋值 */ printf(“%cn“, c); 输出整数 int n = 10; /* 已定义某个整型变量n,并已初始化或赋值 */ printf(“%dn“, n); 输出多个整数,中间使用任意字符序列分隔 int m = 1; n = 2; /* 已定义整型变量m、n,并已初始化或赋值 */ printf(“%d; %dn“, m, n); 输出浮点数 double d = 10.0; /* 已定义某个实型变量n,并已初始化或赋值 */ printf(“%lfn“, d); 输出字符串,以下两种方式均可 printf(“%sn“, “This is a string.“); printf(“This is a string.n“);,printf 使用示例,写出下述程序的执行结果,#include int main() int x, y, z; /* 定义整型变量 */ x = 1; /* 变量赋值 */ y = 2; /* 变量赋值 */ z = 3; /* 变量赋值 */ printf(“Result is as follows:n“); /* 输出提示信息 */ printf(“x = %d, y = %d, z = %dn“, x, y, z); /* 输出变量 */ printf(“x + y = %dnx + y + z = %dn“, x+y, x+y+z); /* 输出结果 */ return 0; ,printf 使用示例,执行结果如下:,Result is as follows: x = 1, y = 2, z = 3 x + y = 3 x + y + z = 6,编制程序,输出下述数据。说明:(1)表中数据来自总参谋部测绘局编制的世界地图集(星球地图出版社,2004年1月第2版),数据可能已不准确;(2)面积单位为万平方公里,人口单位为万人;(3)如果不知道每字段宽度到底为多少,请仔细数数作为分隔标记的短横数目,- COUNTRY AREA(10K km2) POP.(10K) - China 960.00 129500.00 Iceland 10.30 27.57 India 297.47 97000.00 Madagascar 62.70 1635.00 Maldive 0.03 27.80 -,输出精度与格式对齐,场 宽,左右对齐,场宽、精度与对齐,输出格式 %对齐标志场宽.精度格式描述符 对齐标志:确定每列左侧还是右侧对齐 缺省右对齐,左对齐使用减号 例:%-d 表示按照左对齐格式输出整数 场宽:确定每列占用多少字符宽度,数据输出一般不会截断 确定输出最小宽度,超出部分照常输出 例:%3d 表示按照右对齐、占三位格式输出整数,若整数长度超出三位,则照常输出数据,场宽、精度与对齐,精度:确定输出多少位数据以保证其精度 精度数字前有小数点标志,在场宽中占用一位! 例:%-5.2f 表示按照左对齐、整体占五位且小数点后两位格式输出浮点数 数据的截断 例一:按 %-5.2f 格式输出 12.3456,结果为12.35,注意四舍五入 例二:按 %-5.2f 格式输出 123.456,结果为123.46,注意截断后的数据仍然超出了场宽,照常输出 字符串截断输出特例:%13.13s 表示按照整体占 13 位且多余部分截断的方式输出字符串,程序代码,#include int main() double area1, area2, area3, area4, area5; double pop1, pop2, pop3, pop4, pop5; area1 = 960.00; pop1 = 129500.00; area2 = 10.30; pop2 = 27.57; area3 = 297.47; pop3 = 97000.00; area4 = 62.70; pop4 = 1635.00; area5 = 0.03; pop5 = 27.80; printf(“-n“); printf(“COUNTRY AREA(10K km2) POP.(10K)n“); printf(“-n“); printf(“%-10.10s %13.2lf %9.2lfn“, “China“, area1, pop1); printf(“%-10.10s %13.2lf %9.2lfn“, “Iceland“, area2, pop2); printf(“%-10.10s %13.2lf %9.2lfn“, “India“, area3, pop3); printf(“%-10.10s %13.2lf %9.2lfn“, “Madagascar“, area4, pop4); printf(“%-10.10s %13.2lf %9.2lfn“, “Maldive“, area5, pop5); printf(“-n“); return 0; ,4.4 格式化输入函数 scanf,格式化输入函数 scanf 调用格式 格式:scanf( “输入格式规约字符串“, 输入项列表 ); 例: scanf( “%d,%d“, 输入时需要输入两个整数之间 的逗号!,scanf 使用示例,编写程序,接受输入的三个实数,计算并输出它们的算术平均值。注意,平均值输出时仅需保留小数点后两位,#include int main() double a, b, c, average; printf(“The program gets three real numbers, “); printf(“and prints their average value.n“); printf(“Input format as 1.2, 2.3, 3.4.n“); scanf(“%lf, %lf, %lf“, ,scanf 使用示例,程序执行过程:,The program gets three real numbers, and prints their average value. Input format as 1.2, 2.3, 3.4. 1.1, 2.2, 3.4 The average is 2.23,注意其中浮点数的输入格式,中间的逗号不能省略!,4.5 程序的顺序结构,顺序结构 由一组顺序执行的处理块组成,每个处理块可能包含一条或一组语句,完成一项任务 顺序结构是最基本的算法结构,顺序结构示例,编写程序,读入一英文小写字母,输出其对应大写字母,#include int main() char c1, c2; /* 定义字符型变量c1和c2 */ printf(“Please input a lower-case character: “); /* 输出提示语句 */ c1 = getchar(); /* 从键盘接收一个字符 */ c2 = c1 - 32; /* 将小写字母通过ASCII值的计算转换成大写 */ printf(“The upper-case of %c is %c.n“,c1, c2); /* 输出结果 */ return 0; ,条件表达式(三元表达式),格 式 表达式1 ? 表达式2 : 表达式3 计算过程 先计算表达式1的值,若为真,则结果为表达式2的值,否则为表达式3的值 示 例 x = ( a b ) ? a : b; 等价于:if( a b ) x = a; else x = b;,顺序结构示例,编写程序,接受用户输入的两个整数,输出其中较大者,#include int main() int a, b, max; /* 输入部分 */ printf( “The program gets two numbers and prints the greater one.n“ ); printf( “The first number: “ ); scanf( “%d“, ,作 业,第 60 页 第 3、7 题,C 程序设计,第 5 章 分支结构,提 纲,5.1 逻辑值 5.2 关系操作符与关系表达式 5.3 逻辑操作符与逻辑表达式 5.4 if 分支结构 5.5 switch 分支结构 5.6 分支结构的嵌套,5.1 逻辑值,简单语句 复合语句 空语句 注释,5.1 逻辑值,逻辑值(布尔值):非真即假 逻辑值的 C 语言表示 真:非 0 假:0 例:2 表示真,2.3 表示真,0 表示假 布尔类型 定义类型:typedef enum _BOOL FALSE, TRUE BOOL; 目的:取代 C 语言中的非 0 判断 使用方法:BOOL b; b = TRUE;,5.2 关系操作符与关系表达式,关系操作符 大于()、等于(=)、小于(=)、不等于(!=) 关系表达式 关系操作符与两个操作数构成的表达式 多个关系表达式可连接起来构成复杂关系表达式 运算结果为逻辑值:真或假 尽量使用 BOOL 类型表示逻辑值! 示 例 例:a b,a c 等价于 a = (bc) 例:a = b c 等价于 a = (bc) 例:a = b + c = d 等价于 a = (b+c)=d),5.3 逻辑操作符与逻辑表达式,逻辑操作符:逻辑与(&)、逻辑或(|)、逻辑非(!) 逻辑表达式 逻辑操作符与一个或两个操作数构成的表达式,结果仍为真或假 x & y:若 x、y 均为真,则结果为真,否则为假 x | y:若 x、y 均为假,则结果为假,否则为真 !x:若 x 为真,则结果为假,否则为真 逻辑操作的真值表,逻辑表达式的计算,关系操作符与逻辑操作符的优先级 从高到低顺序:逻辑非“!”;小于“=”、大于“”、不大于“ b & c = d;a b & !(c = d) 错误例:0 3 | !(2 1) & 8 = 4 的结果为 TRUE 还是 FALSE?,复杂逻辑表达式,给定年份 year,判断是否为闰年,闰年规定为: 能够被 400 整除的年份一定是闰年 其他能够被 100 整数的年份一定不是闰年 其他能够被 4 整除的年份一定是闰年,year % 4 = 0 & year % 100 != 0 | year % 400 = 0,5.4 if 分支结构,If 分支结构的三种格式 格式一:if( 条件表达式 ) 语句序列 格式二:if( 条件表达式 ) 语句序列 1 else 语句序列 2 格式三:if( 条件表达式 1 ) 语句序列 1 else if( 条件表达式 2 ) 语句序列 2 else 语句序列 n 特别说明 条件表达式必须位于括号内,一般为关系或逻辑表达式 语句序列也称语句块 先计算条件表达式值,若为真则执行语句序列 1,否则执行语句序列 2 语句序列 1 与语句序列 2 可以为复合语句、单语句或空语句 语句序列 1 与语句序列 2 只能有一个被执行 若仅用于确定某条语句是否执行,else 分支可以省略,简单 if 分支结构,书写格式 if( 条件表达式 ) 语句块 A / 可能为语句序列或单一语句,后者可省略前后大括号对 ,简单 if 分支结构示例,编制程序,接受用户输入的整数,判断该数是否为正整数,#include int main() int a; /* 输入部分 */ printf(“The program gets a number, “); printf(“and shows if it is a positive.n“); printf(“The number: “); scanf(“%d“, ,if-else 分支结构,书写格式 if( 条件表达式 ) 语句块 A else 语句块 B ,if-else 分支结构示例,编写程序,接受用户输入的整数,如果该整数为奇数则将其乘 3 加 1 后输出,偶数除以 2 后输出,#include int main() int a, result; /* 输入部分 */ printf(“The program gets a number.n“); printf(“If it is an even, divide it by 2,n“); printf(“otherwise multiply it by 3 then plus 1.n“); printf(“The number: “); scanf(“%d“, ,if-else if-else 分支结构,书写格式 if( 条件表达式1 ) 语句块 1 else if( 条件表达式2 ) 语句块 2 . else 语句块 n ,if-else if-else 语句示例一,编写程序,接受用户输入的两个整数,判断大小关系,#include int main() int x, y; printf(“The program gets two numbers, and compares them.n“); printf(“The first number: “); scanf(“%d“, ,if-else if-else 语句示例二,已知2007年10月1日为星期一。编制程序,接受用户输入的131之间的整数,按照下述格式将该日星期几信息打印在对应栏下。例如,2007年10月9日打印在星期二“Tu”下面,而2007年10月10日则打印在星期日“We”下面:,Calendar 2007-10 - Su Mo Tu We Th Fr Sa - 9 -,Calendar 2007-10 - Su Mo Tu We Th Fr Sa - 10 -,程序代码,#include typedef enum SUN, MON, TUE, WED, THU, FRI, SAT WEEKDAY; int main() int day; WEEKDAY weekday; /* 输入部分 */ printf(“The program gets a day(131), n“); printf(“ and prints a calendar of 2007-10 (just the day).n“); printf(“The day: “); scanf(“%d“, ,程序代码,/* 在指定位置输出该日的星期几信息 */ if(weekday = SUN) printf(“%2dn“, day); else if(weekday = MON) printf(“%6dn“, day); else if(weekday = TUE) printf(“%10dn“, day); else if(weekday = WED) printf(“%14dn“, day); else if(weekday = THU) printf(“%18dn“, day); else if(weekday = FRI) printf(“%22dn“, day); else /* 已不再需要if分支,只可能为SAT */ printf(“%26dn“, day); printf(“-n“); return 0; ,5.5 switch 分支结构,计算过程 先计算表达式的值 依次与常数表达式比较 若相同则执行该分支(子句) 否则转向 default 分支 最后退出 switch 语句 特别说明 switch 后面的表达式必须为整型、字符型或枚举型 case 后面必须为常量表达式,且各个 case 值必须不同 若无 default 分支,且无 case 分支匹配,则不执行 case 分支中的语句可以有多条,不需要花括号,switch( 表达式 ) case 常数表达式 1: 语句序列 1 case 常数表达式 2: 语句序列 2 case 常数表达式 n: 语句序列 n default: 默认语句序列 ,switch 语句的执行流程,switch 示例,/* 输出部分 */ printf( “Calendar 2007-10n“ ); printf( “-n“ ); printf( “Su Mo Tu We Th Fr San“ ); printf( “-n“ ); /* 在指定位置输出该日的星期几信息 */ switch( weekday ) case SUNDAY: printf( “%2dn“, date ); break; case MONDAY: printf( “%6dn“, date ); break; case TUESDAY: printf( “%10dn“, date ); break; case WEDNESDAY: printf( “%14dn“, date ); break; case THURSDAY: printf( “%18dn“, date ); break; case FRIDAY: printf( “%22dn“, date ); break; case SATURDAY: printf( “%26dn“, date ); break; default: ; /* 没有缺省情况需要处理 */ printf( “-n“ ); return 0; ,break

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论