700 likes | 811 Views
第 10 章 C 语言程序设计初步. 10.1 引论. 汇编程序. 机器语言. 汇编语言. 高级语言. 面向过程. 面向对象. 程序设计语言的发展经历了三个阶段:. 高级语言表达方式接近被描述的问题,接近于自然语言和数学表达式,易于人们接受和掌握. 机器语言是用二进制表示的,计算机能直接识别和执行的语言 如: 10000000 (加) 10010000 (减), 机器语言执行速度最快。由于用二进制表示,因而程序可读性差,非专业人员难于掌握. 二进制指令通过符号化 如 ADD A, B. C 语言发展史. 产生背景 产生过程
E N D
10.1引论 汇编程序 机器语言 汇编语言 高级语言 面向过程 面向对象 • 程序设计语言的发展经历了三个阶段: 高级语言表达方式接近被描述的问题,接近于自然语言和数学表达式,易于人们接受和掌握 机器语言是用二进制表示的,计算机能直接识别和执行的语言如:10000000(加)10010000(减),机器语言执行速度最快。由于用二进制表示,因而程序可读性差,非专业人员难于掌握 二进制指令通过符号化 如 ADD A, B
C语言发展史 • 产生背景 • 产生过程 • 时间: 1972~1973 • 地点: 美国贝尔实验室 • 目的: UNIX操作系统 • 设计人: Ken.Thompson和Dennis.M.Ritchie • C标准 • 标准C: K&R合著《The C Programming Language》 • ANSI C: 1983年 • 87 ANSI C: 1987年 • 1990年国际标准的ANSI C
2. C语言的特点 (1)高效性:C程序往往紧凑且运行速度快。 (2)移植性:C程序不经修改或很少修改就可以到其他系统上运行。 (3)运算符丰富:有算术、关系、逻辑、位、自增/自减、赋值运算符等等。 (4)数据结构丰富:数据类型有整型、实型、字符、数组、指针、结构体等,能实现如链表、树、栈等结构运算。 (5)对硬件操作:能直接访问内存的物理地址,并进行位操作。 (6)自由度大:语法限制不严格。如:不检查数组下标是否越界,整型与字符型可通用,条件可用0和非0表示假与真,指针操作灵活等。
函数体 语句结束标志 10.1.3 C语言程序的基本结构 一个C语言程序可以是非常简单的,也可以是特别复杂的,这取决于程序所要实现的功能。我们先来认识一个最为简单的C程序。 【例1】 最简单的C程序。 printf是C语言中的输出函数,它的功能是把要输出的内容送到显示器去显示。双引号内字符串原样输出,“\n”是回车换行符。 void main ( ) { printf ("This is a C Language Program!\n"); } C语言规定:语句以分号结束 main是主函数的函数名,表示这是一个主函数。每一个C源程序都必须有,并且只能有一个主函数(main函数),这是整个C程序运行的入口点 运行结果: This is a C Language Program!
数据类型名 定义的变量名,以“,”分隔 两个赋值语句,使a和b的值分别为12和34 求和的值给sum 调用内部函数,输出计算的和数 【例2】计算输入的两个整数的和 。 /* 求两数的和。*/ void main ( ) { int a, b, sum; /* 这是定义变量*/ a=12; b=34; sum=a+b; printf("The sum is %d\n",sum); } 运行结果:the sum is 46
自定义函数声明 带两个形参 返回值为整型数 自定义函数调用 自定义函数max 【例3】计算输入的两个整数的最大值 。 /* This is the third C program */ #include <stdio.h> int max (int a, int b); void main ( ) { int x, y, z; printf("Input two numbers:\n"); scanf ("%d%d", &x, &y); z = max (x, y); printf ("maxnum = %d\n", z); } int max (int a, int b) { int c; if (a > b) return a; else return b; return (c); } 调用内部函数,接受键盘输入数据 返回a、b中最大值 假设输入:10 20↙ 运行结果:max = 20
总结C源程序的结构特点 (1) 一个C语言源程序可以由一个或多个源文件组成,每个源文件以“.c”作为扩展名。 (2) 每个源文件可由一个或多个函数组成。 (3) 一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数,整个程序的运行从主函数开始。 (4) 源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。 (5) 每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头之后不能加分号。 (6) 标识符、关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
开 始 编 辑 源程序file.c 编 译 目标程序 file.obj 有 有错? 无 链 接 可执行程序file.exe 库函数和其它目标程序 执 行 不正确 正确 结果正确? 结 束 调试C程序的流程 10.1.4 C语言的编辑、编译和运行 程序代码的录入,生成源程序*.c或*.cpp 编 辑 语法分析查错,翻译生成目标程序*.obj 编 译 与其它目标程序或库链接装配,生成可执行程序*.exe 链 接 运 行
10.2 算法基础 10.2.1 算法(Algorithm)的概念 【例10.2.1】 输入3个数,求其最大值。 • 问题分析:设num1,num2,num3存放3个数,max存放其最大值。为求最大值,就必须对3个数进行比较,可按如下步骤去做: ⑴ 输入3个数num1,num2,num3。 ⑵ 先把第1个数num1的值赋给max。 ⑶ 将第2个数num2与max比较,如果num2>max,则把第2个数num2的值赋给max(否则不做任何工作)。 ⑷ 将第3个数num3与max比较,如果num3>max,则把第3个数num3的值赋给max(否则不做任何工作)。 ⑸ 输出max的值,即最大值。 • 人们使用计算机,就是要利用计算机处理各种不同的问题,而要做到这一点,人们就必须事先对各类问题进行分析,确定解决问题的具体方法和步骤,再编制好一组让计算机执行的指令即程序,让计算机按人们指定的步骤有效地工作。这些具体的方法和步骤,其实就是解决一个问题的算法。根据算法,依据某种规则编写计算机执行的命令序列,就是编制程序,而书写时所应遵守的规则,即为某种语言的语法.
10.2.2 算法的基本特征 一个算法应具有以下5个基本特征: • 有穷性 • 确定性 • 有效性 • 有零个或多个输入 • 有一个或多个输出 算法必须总是在执行有限个操作步骤和可以接受的时间内完成其执行过程。也就是说,对于一个算法,要求其在时间和空间上均是有穷的。例如:一个采集气象数据并加以计算进行天气预报的应用程序,如果不能及时得到结果,超出了可以接受的时间,就起不到天气预报的作用。 算法中的每一步都必须有明确的含义,不允许存在二义性。例如:“将成绩优秀的同学名单打印输出”,在这一描述中“成绩优秀”就很不明确,是每门功课均为95分以上?还是指总成绩在多少分以上? 算法中描述的每一步操作都应能有效地执行,并最终得到确定的结果。例如:当Y=0时,X/Y是不能有效执行的。
下图列出了标准的流程图符号: 处理框 判断框 过程框 终点框 流程线 I/O框 连接点 准备框 10.2.3 算法的表示 • 自然语言可以是中文、英文、数学表达式等。用自然语言表示通俗易懂,缺点是可能文字过长,不太严格,表达分支和循环的结构不很方便。 • 【例10.2.2】求1+2+…+m的值N,当N>10000时结束。 • 算法可表示如下: • ① n=0 • ② m=0 • ③ m加1 • ④ N加m • ⑤ 判N是否大于10000,如果满足关系结束;不满足关系继续执行③。 • 用自然语言表示 • 用流程图表示 • 用伪代码表示 • 计算机语言表示算法 伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法的,它不用图形符号,因此,书写方便,格式紧凑,也容易懂,同时也便于向计算机语言算法的转换。 【例10.2.4】用伪代码表示求10!的算法。 begin(开始) 置t的初值为1(1t) 置i的初值为2(2i) 当(while)i<=10,执行(do) begin 使t=ti 使i=i+1 end 打印t的值(print t) end(结束)。 计算机是无法识别流程图和伪代码形式,只有用计算机语言编写的程序才能被计算机执行。因此在用流程图和伪代码形式描述出算法后,还要将它转换成计算机语言程序。 【例10.2.5】用C语言程序来描述求10!。 #include <stdio.h> void main(void) { long i,t; t=1L;i=2L; while(i<=10L) { t=t*i; i=i+1; } printf("%ld\n",t); }。
单精度型float 双精度型double 短整型short 整型int 长整型long 10.3 基本数据类型 10.3.1 数据概述 整 型 实型 基本类型 字符类型char 本节所介绍的数据类型 枚举类型enum C 数 据 类 型 数组 构造类型 结构体struct 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作 共用体union 指针类型 空类型void
常量与符号常量 . 常量 定义:程序运行时其值不能改变的量(即常数) 常量的分类: 直接常量( 值常量) 整型常量 如,15、0、-7 浮点型常量 如,5.0、-12.36 字符型常量 如,'A'、’a’ 指针常量 如,NULL 字符串常量 如,”ABC” 符号常量 用标识符来代表常量。 其定义格式为: 【例10.3.1】 #include <stdio.h> #define PI 3.14 main( ) { float area; area=10*10*PI; printf(“area=%f\n”,area); } 运行结果:area=314.000000 • 行尾不能有分号 • define前面一定要有# • 符号常量名最好使用大写 • 符号常量名最好有意义 #define 符号常量 常量 #define NUM 20 #define PI 3.1415926
变量 定义:程序运行时其值可以被改变的量 变量的两要素 :变量名 、变量值 变量的使用:先说明,后使用 例: 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; • 例: • int x, y, z; • float radius, length, char ch;
10.3.2 整型数据 1. 整型常量 • 十进制整数:由数字0~9和正负号表示.如:123,-456,0 • 八进制整数:由数字0开头,后跟数字0~7表示.如:0123,011 • 十六进制整数:由0x或0X开头,后跟0~9,a~f,A~F表示.如0x123,0Xff 2. 整型变量 • 整型变量的分类
整型变量的说明 • 变量的说明,也即变量的定义,一般形式为: 类型说明符 变量名标识符1,变量名标识符2,...; 例如: int a,b,c; /* a,b,c为整型变量*/ long m,n; /* m,n为长整型变量*/ unsigned p,q; /* p,q为无符号整型变量*/ • 在书写变量说明时,应注意以下几点: • 允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 • 最后一个变量名之后必须以“;”号结尾。 • 变量说明必须放在变量使用之前。 • 也可在说明变量为整型的同时,给出变量的初值。其格式为: • 类型说明符 变量名标识符1=初值1,变量名标识符2=初值2,...; 【例10.3.2】 main( ) { int a=3,b=5; printf(“a+b=%d\n”,a+b); } 程序的运行结果为:a+b=8
5. 10.3.3 实型数据 • 实型常量(实数或浮点数) • 十进制小数形式:由数字0~9和小数点组成.如:0.0,5.6,-5. • 指数形式:由十进制数,加阶码标志e或E以及阶码(只能为整数,可以带符号)组成. 其一般形式为:aEn 其中:a为十进制数,n为十进制整数,都不可缺少。其可表示为a×10n 注意: 实型常量不分单精度和双精度。一个实型常量可以赋给一个float或double型变量,根据变量的类型截取实型常量中相应的有效位数字。 【例10.3.3】 main( ) { float a; a=0.123456789; printf("a=%f",a); } 运行结果为: a=0.123457 • 实型变量 合法的实数表示: 2.1E5 表示2.1×105,3.7E-2 表示3.7×10-2。 非法的实数表示: 345(无小数点),E7(阶码标志E之前无数字), -5(无阶码标志),50.-E3(负号位置不对) • 单精度实型(float) float f = 3.14, g; 这种定义的变量在内存中占4个字节(32位)的存储单元。 • 双精度实型(double) double x, y; 这种定义的变量在内存中占8个字节(64位)的存储单元。
转义字符及其含义: 转义字符 含义 转义字符 含义 \t \n 换行 水平制表 垂直制表 \b 退格 \v \r 回车 \f 换页 \a 响铃 \\ 反斜线 \‘ 单引号 \“ 双引号 < 2位16进制数代表的字符 \ddd 3位8进制数代表的字符 \xhh 10.3.4 字符型数据 • 字符型常量 • 定义:用单引号括起来的单个普通字符或转义字符. • 字符常量的值:该字符的ASCII码值 如 ‘a’ ‘A’ ‘?’ ‘\n’ ‘\101’ • 转义字符:反斜线后面跟一个字符或一个代码值表示 如 ‘A’——65, ‘a’——97, ‘0’——48 , ‘\n’——10
字符型变量 • 字符型数据类型符是char(字符character) • 在内存中占1个字节(16位) • 字符变量存放字符ASCII码 • char与int数据间可进行算术运算 • 存在有符号和无符号之分。默认情况下为有符号 【例10.3.4】 main( ) { char a,b; a=120; b=121; printf("%c,%c\n%d,%d\n",a,b,a,b); } 程序运行结果为: x,y 120,121 (思考???) 例: char ch; unsigned char C = 'B'; 例: a = ‘D’; // a = 68; x = ‘A’ + 5; // x = 65 + 5; s = ‘!’ + ‘G’ // s = 33 + 71;
基本算术运算符:+ - * / % 结合方向:从左向右 优先级: - ---->* / % -----> + - (2) (3) (4) 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据 10.3.5算术运算符和算术表达式 1 例:5 % 2 = -5 % 2 = 1 % 10 = 5 % 1 = 5.5 % 2 例:5 / 2 = -5 / 2.0 = 2 -1 -2.5 1 0 ()
自增、自减运算符++ -- 作用:使变量值加1或减1 种类: 前置 ++i, --i (先执行i=i+1或i=i-1,再使用i值) 后置 i++,i-- (先使用i值,再执行i=i+1或i=i-1) 例:j = 3; k = ++j; j = 3; k = j++; j = 3; printf (“%d”, ++j); j = 3; printf(“%d”, j++); a = 3; b = 5; c = (++a) * b; a = 3; b = 5; c = (a++) * b; //k=4,j=4 //k=3,j=4 //4 //3 //c=20,a=4 //c=15,a=4
表达式和算术表达式 表达式:用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合C语言语法规则的式子。 算术表达式:表达式中的运算符都是算术运算符的表达式。 例:3 + 5 * 8、(x + y) / 2 - 1等
10.4 顺序结构程序设计 10.4.1 C语言语句 1. 控制语句: 完成一定功能的语句称为控制语句。C语言有9种控制语句,参见表10.4-1 。 2. 表达式语句 由一个表达式构成一个语句,称为表达式语句。一般形式为: 表达式; 表达式语句可分为 : (1) 赋值语句 赋值语句由赋值表达式后跟一个分号组成。例如:a=3; (2) 函数调用语句 函数调用语句由函数调用表达式后跟一个分号组成。 例如:printf(“This is a C statement.”); (3) 空语句 空语句是只有一个分号而没有表达式的语句。
3. 特殊语句 C语言中还包括一些其他语句,如复合语句等。 把多个语句用花括号{}括起来组成的语句称复合语句。在程序中可以把复合语句看成是一条语句,而不是多条语句。 例如: {x=y+z; a=b+c; printf(“%d %d”,x,a); } 注:复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。
10.4.2 printf函数 1. 一般格式 printf ("格式控制字符串",表达式1,表达式2,…,表达式n); • 功能 按照“格式控制字符串”的要求,将表达式1,表达式2,…,表达式n的值显示在计算机屏幕上。 • 说明 格式控制字符串用于指定输出格式。它包含两类字符: 常规字符:包括可显示字符和用转义字符表示的字符。 格式控制符:以%开头的一个或多个字符,以说明输出数据的类型、形式、长度、小数位数等。其格式为: 格式控制符 (格式转换符) 格式控制符 (修饰符) 常规字符 (转义符) 常规字符 %[修饰符]格式转换字符 例:long int x = 0x8AB6; printf (“The Value of x is %ld\n”, x);
【例10.4.1】 转义字符的使用 main( ) {char a,b,c; a=’n’; b=’e’; c=’\167’; /* 8进制数167代表的字符w */ printf(“%c%c%c\n”,a,b,c); /* 以字符格式输出 */ printf(“%c\t%c\t%c\n”,a,b,c); /* 每输出一个字符跳到下一输出区 */ printf(“%c\n%c\n%c\n”,a,b,c); /* 每输出一个字符后换行 */ } 2. 转义字符 就以一个“\”开头的字符序列,称为转义字符 运行结果如下: new n□□□□□□□e□□□□□□□w “□”代表空格,下同 n e w
“a=”、“□”、“b=”为普通字符 “%d”是格式说明 3. printf函数的调用 格式控制用于指定输出参数的输出格式,格式控制由两部分组成:格式说明和普通字符。普通字符(包括转义字符)将被简单地复制显示(或执行)。一个格式说明项将引起输出参数项的转换与显示。 例如: main( ) { int a=3,b=4; printf(“a=%d□b=%d\n”,a,b); } 输出结果为: a=3□b=4 【例10.4.2】 main( ) {char ch1=’a’,ch2=’b’; printf(“ch1=%c,ch2=%c\n”,ch1,ch2); printf(“ch1=%d,ch2=%d\n”,ch1,ch2); } 程序运行结果为:??? “\n”为转义字符
4. 格式字符串 【例10.4.3】 输出形式举例 main( ) {int num1=123; long num2=1234567; float real=123.4567; printf(“%d,%6d,%-6d,%2d\n”,num1,num1,num1,num1); printf(“%ld,%8ld,%4ld\n”,num2,num2,num2); printf(“%f,%10f,%10.2f,%-10.2f\n”,real,real,real,real); printf(“%s,%10.5s,%-10.5s\n”,”student”,”student”,”student”) } 输出结果如下: 123,□□□123,123□□□,123 1234567,□1234567,1234567 123.456700,123.456700,□□□□123.46,123.46□□□□ student,□□□□□stude,stude□□□□□ 例如,以下语句输出六位十进制整数: printf(“%6d\n”,111); printf(“%-6d\n”,111); 输出结果为: □□□111 (输出右对齐,左边填空格) 111□□□ (输出左对齐,右边填空格) 例如,语句printf(“%+d,%+d\n”,111,-111); 输出结果为: +111,-111 输出八进制或十六进制时,可以使用以下形式: printf(“%#o,%#x\n”,10,16); 输出结果为: 012,0x10 在Turbo C中printf函数格式字符串一般形式为: 说明: ⑴ 格式字符:格式字符用来表示输出数据的类型,在格式控制字符串不能略,其常用符号和含义参见表10.4-3。 (2) 标志字符:标志字符包括-、+、#三种,具体含义参见表10.4-4。 ⑶ 宽度指标符:用来设置输出数据项的最小宽度,通常用十进制整数来表示输出的位数。如果输出数据项所需实际位数多于指定宽度,则按实际位数输出,如果实际位数少于指定的宽度则用空格填补。 ⑷ 精度指示符:以“.”开头,用十进制整数指精度。对于float或double类型的浮点数可以用“m.n”的形式在指定宽度的同时来指定其精度。其中,“m”用以指定输出数据所占总的宽度,“n”称为精度。 ⑸ 长度修正符:常用的长度修改符为h和l两种,h表示输出项按短整型输出,l表示输出项按长整型输出。
4.2 格式化输入scanf int a; scanf ("%d", &a); 已 知:int a , b; 函数调用:scanf ("%d%d", &a , &b); 假设输入:10□20↙ 变量的值: a的值是10,b的值是20 取地址运算符(与按位“与”同符号),只能作用于变量! • 一般格式 scanf (“格式控制字符串”,变量1的地址,变量2的地址, …,变量n的地址); • 功能 第一个参数格式控制字符串的控制下,接受用户的键盘输入,并将输入的数据依此存放在变量1、变量2、……、变量n中。 • 格式控制符与后续参数中的变量地址的对应关系
scanf函数的格式控制符 • 一般形式: %[*] [width] [l | h] Type • 说明: • [ ]:表示可选项,可缺省。|表示互斥关系。 • width:指定输入数据的域宽,遇空格或不可转换字符则结束。 • Type:各种格式转换符(参照printf)。 • *:抑制符,输入的数据不会赋值给相应的变量。 • l:用于d、u、o、x|X前,指定输入为long型整数;用于e|E、f前,指定输入为double型实数。 • h:用于d、u、o、x|X前,指定输入为short型整数。
printf ("input the student's Scores(chinese, math, english): "); scanf ("%f,%f,%f", &chinese, &math, &english); total = chinese + math + english; //计算总分 average = total / 3; //计算平均分 printf ("\n===NO=======birthday==sex==chinese==math== english==total==average\n"); printf ("%08ld %4d-%02d-%02d %c %-5.1f %-5.1f %-5.1f %-5.1f %-5.1f\n", no, year, month, day, sex, chinese, math, english, total, average); } 【例】数据的格式化输入 输入一学生的学号(8位数字)、生日(年-月-日)、性别(M:男,F:女)及三门功课(语文、数学、英语)的成绩,现要求计算该学生的总分和平均分,并将该学生的全部信息输出(包括总分、平均分)。 #include <stdio.h> void main ( ) { unsigned long no; //学号 unsigned int year, month, day; //生日(年、月、日) unsigned char sex; //性别 float chinese, math, english; //语文、数学、英语成绩 float total, average; //总分、平均分 printf ("input the student's NO: "); scanf ("%8ld", &no); printf ("input the student's Birthday(yyyy-mm-dd): "); scanf ("%4d-%2d-%2d", &year, &month, &day); fflush (stdin);//清除键盘缓冲区 printf ("input the student's Sex(M/F): "); scanf ("%c", &sex); 假设输入 : input the student's NO:20040101↙ input the student's Birthday(yyyy-mm-dd):1987-9-8↙ input the student's Sex(M/F):M↙ input the student's Scores(chinese, math, english):90,80,90↙ 输出结果 : ===NO=======birthday==sex==chinese==math==english==total==average 20040101 1987-09-08 M 90.0 80.0 90.0 260.0 86.7
10.4.4其他输入输出函数 1. getchar int getchar ( void );//应包含的.h文件为stdio.h • 功能:从键盘读一字符 • 返值:正常,返回读取字符的ASCII码值;出错,返回EOF(-1)。 • 说明:以回车符为输入结束条件;输入多个字符时,返回第一个字符的值;输入字符回显。
运行结果(假设输入为:1234↙): ch1 = 1, ch2 = 2 a = 34 【例】利用getchar输入字符 #include <stdio.h> #include <conio.h> void main ( ) { char ch1, ch2; int a; ch1 = getchar ( ); ch2 = getchar ( ); scanf ("%d", &a); printf ("ch1 = %c, ch2 = %c\n", ch1, ch2); printf ("a = %d\n", a); }
2. putchar int putchar ( int c );//应包含的.h文件为stdio.h • 功能:在显示器上输出字符c。 • 返值:正常,返回字符的代码值;出错,返回EOF(-1)。 • 说明:该函数带有一个参数c,它为要显示字符的ASCII码值,有一个int型返回值。
运行结果: A is as good as B 【例】利用字符输出函数输出字符 #include <stdio.h> void main ( ) { int a = 65; char b = 'B'; putchar (a); //不自动回车 putchar ('\n'); puts (“is as good as ”); //自动回车 putc (b, stdout); }
10.5.1 关系运算和逻辑运算 10.5 选择结构程序设计 1. 关系运算符和关系表达式 • 关系运算符 • 注意: • C语言用0表示假,非0表示真。 • 一个关系表达式的值不是0就是1,0表示假,1表示真。 • 关系表达式 用关系运算符连接起来的式子称为关系表达式。 关系表达式的一般形式为:表达式 关系运算符 表达式 例:a + b > c – d x > 3 / 2 'a' + 1 < c –i – 5 * j == k + 1
2. 逻辑运算符和逻辑表达式 • 逻辑运算符 • 逻辑运算真值表
!、~、++、--、sizeof 高 算术运算符 移位运算符 关系运算符 &、|、^ &&、|| 赋值运算符 低 2. 逻辑运算符和逻辑表达式 • 逻辑表达式 用逻辑运算符连接起来的式子称为逻辑表达式。 逻辑表达式的一般形式为:表达式 逻辑运算符 表达式 例:a < b && b < c、x > 10 || x < -10、!x && !y 例: a = 4; b = 5; !a a && b a || b !a || b 4 && 0 || 2 5 > 3 && 2 || 8 < 4 - !0 ‘c’ && ‘d’ • 逻辑运算符的优先级 //值为0 //值为1 //值为1 例如: a <= x && x <= b 等价于: a > b && x > y 等价于: a == b || x == y 等价于: !a || a > b 等价于: !a > b 等价于: c = a || b 等价于: a | 7 && b & 8 等价于: a >> 2 && b << 1 等价于: (a <= x) && (x <= b) //值为1 (a > b) && (x > y) //值为1 (a == b) || (x == y) (!a) || (a > b) //值为1 已知:a = 4; b = 5; 问:c = b > 3 && 2 || 8 < b - !a;的值? (!a) > b //值为1 c = (a || b) (a | 7) && (b & 8) 答:c 的值为1。 等价于:c = (((b > 3) && 2) || (8 < (b – (!a)))); (a >> 2) && (b << 1)
10.5.2 选择结构的程序设计 T F T F 表达式 表达式 【例10.5.4】在学生分数高于或等于60分时显示Pass,否则显示Fail 程序片段如下: if (grade>=60) printf(“Pass\n”); else printf(“Fail\n”); 语句2 语句1 语句 例10.5.4流程图 分数大于 等于60 打印Failed 打印Passed 1. if语句 • 简单if语句形式 • 格式: if (表达式) 语句; • 执行流程: 例如:下面的程序段同样是输出两个整数中的最大数。 int a, b; printf ("input two numbers: "); scanf ("%d%d", &a, &b); if (a > b) printf ("max = %d\n", a); else printf ("max = %d\n", b); • if_else形式 例如:下面的程序段是输出其中的大数。 【例10.5.3】 if (Number1< Number2) { Number1= Number2; } printf (“The bigNumber is %d”, Number1); • 格式: if (表达式) 语句1; else 语句2; • 执行流程:
2. if语句的嵌套 if 和else子句中,可以是任意合法的C语句或语句块,如果这子句是个if语句,则构成了if语句的嵌套。 【例10.5.6】根据输入的百分制成绩(score),要求输出成绩等级(grade)A、B、C、D、E。90分以上为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。用if语句实现,程序如下: main(){ int score;char grade;printf(“\n Please input a score(0~100):”);scanf(“%d”,&score);if (score>=90)grade=’A’;else if (score>=80)grade=’B’;else if (score>=70)grade=’C’;else if (score>=60)grade=’ D’;else grade=’E’;printf(“The grade is %c.\n”,grade);} 程序的运行情况如下:Please input a score(0~100):86The grade is B.
非0 =0 expr1 例if (a>b) printf(“%d”,a); else printf(“%d”,b); printf(“%d”,a>b?a:b); 取expr2值 取expr3值 3. 条件运算符 • 一般形式: expr1 ? expr2 : expr3 • 执行过程 • 功能:相当于条件语句,但不能取代一般if语句
switch 表达式 case E 1 E 2 En default 语句组1 语句组2 语句组n 语句组 …... 10.5.3 switch 语句 • 一般格式: switch ( 表达式) { case E1: 语句组 1; break; case E2: 语句组 2; break; ……. case En: 语句组 n; break; [default: 语句组 ; break;] } • 执行过程:
【例10.5.7】根据天气情况,安排活动。 #include <stdio.h> main() { int w_con; /* 天气情况变量定义 */ printf("天气如何?[1:晴天,2:多云,3:下雨]"); scanf("%d",&w_con); switch (w_con) { case 1 : printf("上街购物!\n"); break; case 2 : printf("去游泳!\n"); break; case 3 : printf("在家看电视!\n");break; default: printf("错误选择!\n"); } } break作用:控制转向switch语句的后继语句。
10.5.4 程序设计举例 • 【例10.5.7】输入三个整数,输出其中的最大数 • 【例10.5.8】输入三个整数,按值从大到小的顺序输出。 • 【例10.5.9】对分段函数:x (x<1) y= 2x-1 (1≤x<10) 3x-11 (x≥10) 用scanf()函数输入x的值,求y值。 • 【例10.5.10】若运行时从键盘上输入2.0<回车>,求以下程序的输出结果 • 【例10.5.12】执行以下程序时,为了使输出结果为:t=4,则给a和b输入的值应满足的条件是: A) a>b B)a<b C)a>0&&a<b D)a<0&&a<b
10.6 循环结构程序设计 C语言中用如下语句实现循环 • while语句。 • do-while语句。 • for语句。 • 用goto语句和if语句构成循环。
10.6.1 循环结构的程序设计 while F expr T 循环体 1. while语句 • 一般形式: while (表达式) 循环体语句; • 执行流程: 特点:先判断表达式,再执行循环体 其中: (1)while后面的括号( )不能省。 (2)while后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。 (3)表达式语句称为“循环体”,可以是任何语句,通常是一个复合语句。 (4)若循环体中又含有“循环语句”,则称为循环嵌套,也称多重循环。
【例】 利用while语句,编写程序,求1+2+3+…+100的值 #include <stdio.h> void main ( ) { int i = 1, sum = 0; while ( i <= 100 ) { sum += i; i++; } printf ("sum = %d\n", sum); } 循环初值 循环终值 循环条件 循环体 循环变量增值 运行结果: sum = 5050
while语句注意事项: (1) 如果while后的表达式的值一开始就为假,循环体将一次也不执行。 (2)当循环体由多个语句组成时,必须用左、右花括号括起来,使其形成复合语句 。 (3)为了使循环最终能够结束,而不至于使循环体语句无穷执行(即产生“死循环”),每执行一次循环体,条件表达式的值都应该有所变化,这既可以在表达式本身中实现,也可以在循环体中实现。 int a = 0, b = 0; while (a > 0) //a > 0为假,b++不可能执行 b++; int num = 0; //字符计数 while ( 1 ) { if (getche ( ) == '\n') //如果输入的字符是回车符,则返回 return; num++; }
do 循环体 while T expr F 10.6.2 do-while循环语句 do 循环体语句; while(表达式); • 一般形式: • 执行流程: 特点:先执行循环体,再判断表达式 • 其中: • while后面的括号( )不能省。 • while最后面的分号;不能省。 • 语句部分称为循环体,当需要执行多条语句时,应使用复合语句。 • do必须与While联合使用。 • C语言中的do-while语句是在表达式的值为真时重复执行循环体,这一点与别的语言中类似语句有区别,在程序设计时应引起注意。