高职高专计算机系列教材《C语言程序设计》.docx_第1页
高职高专计算机系列教材《C语言程序设计》.docx_第2页
高职高专计算机系列教材《C语言程序设计》.docx_第3页
高职高专计算机系列教材《C语言程序设计》.docx_第4页
高职高专计算机系列教材《C语言程序设计》.docx_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

课 程: C语言程序设计任课教师: 电子信箱:教 材: 高职高专计算机系列教材总 目 录第1章C语言概述第2章数据类型、运算符与表达式第3章最简单的C程序设计顺序程序设计第4章选择结构程序设计第5章循环控制第6章数组第7章函数第8章预处理命令第9章指针第10章结构体与共用体第11章位运算第12章文件第13章常见错误和程序调试第1章 C语言概述1.1 C语言出现的历史背景1.2 C语言的特点1.3 简单的C程序介绍1.4 C程序的上机步骤1.5 习题1.1 C语言出现的历史背景C语言是国际上广泛流行的计算机高级语言,既可用来写系统软件,也可用来写应用软件。C语言是在B语言的基础上发展起来的,是用汇编语言写的。现在C语言已风靡全世界,成为世界上应用最广泛的几种计算机语言之一。1.2 C语言的特点(1) 语言简洁、紧凑,使用方便、灵活。(2) 运算符丰富。C的运算符包含的范围很广泛,共有34种运算符。(3) 数据结构丰富,具有现代化语言的各种数据结构。(4) 具有结构化的控制语句(如ifelse语句、while语句、dowhile语句、switch语句、for语句)。(5) 语法限制不太严格,程序设计自由度大。(6) C语言能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。1.3 简单的C程序介绍例 1.1 main ( ) printf (This is a C program.n); 本程序的作用是输出以下一行信息: This is a c program.例 1.2main ( )/*求两数之和*/int a,b,sum; /*这是定义变量*/ a=123; b=456; /* 以下3行为C语句 */ sum=a+b; printf (sum is %d/n, sum); 例1.3main ( ) int a, b, c; scanf (%d,%d,&a,&b); c=max (a,b);printf (max=%d,c); int max(int x,int y) int z; if (xy) z=x; else z=y;return (z); 通过以上几个例子,可以看到:(1) C程序是由函数构成的。(2) 一个函数由两部分组成: 函数的首部,即函数的第一行。 函数体,即函数首部下面的大括弧内的部分。(3) 一个C程序总是从main函数开始执行的。(4) C程序书写格式自由,。(5) 每个语句和数据定义的最后必须有一个分号。(6) C语言本身没有输入输出语句。(7) 可以用/*/对C程序中的任何部分作注释。1.4 C程序的上机步骤(1) 调用 Turbo C程序。(2) 编辑源文件。(3) 编译源程序。(4) 执行程序。(5) 可以用“Alt”和“X”键脱离Turbo C。第2章 数据类型、运算符与表达式2.1 C的数据类型2.2 常量与变量2.3 整型数据2.4 实型数据2.5 字符型数据2.6 变量赋初值2.7 各类数值型数据间混合运算2.8 算术运算符和算术表达式2.9 赋值运算符和赋值表达式2.10 逗号运算符和逗号表达式2.1 C的数据类型一个程序应包括以下两方面内容:(1) 对数据的描述。(2) 对操作的描述。c的数据类型如下:数据类型,基本类型,整型,字符型,实型(浮点型)单精度型,双精度型,枚举类型,构造类型,数组类型,结构体类型,共用体类型,指针类型,空类型2.2 常量与变量2.2.1 常量和符号常量在程序运行过程中,其值不能被改变的量称为常量。常量区分为字面常量或直接常量、符号常量例2.1符号常量的使用。 #define price 30 main ( ) int num, total; num=10; total=num * price; printf(total=%d,total); 习惯上,符号常量名用大写,变量用小写,以示区别。 使用符号常量的好处是:(1) 含义清楚。(2) 在需要改变一个常量时能做到“一改全改”。2.2.2 变量其值可以改变的量称为变量。C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。注意,大写字母和小写字母被认为是两个不同的字符。在选择变量名和其他标识符时,应注意做到“见名知意”,“先定义,后使用”2.3 整型数据2.3.1 整型常量的表示方法整型常量即整常数。c整常数可用以下三种形式表示:(1) 十进制整数。(2) 八进制整数。(3) 十六进制整数。2.3.2 整型变量1. 整型数据在内存中的存放形式数据在内存中是以二进制形式存放的。如果定义了一个整型变量i:int i; /* 定义为整型变量 */i=10; /* 给i赋以整数10 */ 每一个整型变量在内存中占2个字节。数值是以补码(complement) 表示的。2. 整型变量的分类(1) 基本整型,以int表示。(2) 短整型, 以short int表示,或以short表示。(3) 长整型, 以long int表示,或以long表示。有符号基本整型 signed int 无符号基本整型 unsigned int有符号短整型 signed short int无符号短整型 unsigned short int有符号长整型 signed long int无符号长整型 unsigned long int3. 整型变量的定义int a,b;(指定变量a、b为整型)unsigned short c,d;(指定变量c、d为无符号短整型)long e,f; (指定变量e、f为长整型)4. 整型数据的溢出例2.3整型数据的溢出。main()int a,b; a=32767; b=a+1; printf(%d,%d,a,b);运行结果为32767,-327682.3.3 整型常量的类型请注意以下几点:(1) 一个整数,如果其值在-32768+32767范围内,认为它是int型,它可以赋值给int型和long int型变量。(2) 一个整数,如果其值超过了上述范围,而在-2147483648+2147483647范围内,则认为它是长整型,可以将它赋值给一个long int型变量。(3) 如果某一计算机系统的c版本(例如turbo c)确定short int与int型数据在内存中占据的长度相同,则它的表数范围与int型相同。(4) 一个整常量后面加一个字母u,认为是unsigned int型 (5) 在一个整常量后面加一个字母l或l,则认为是long int型常量。2.4 实型数据2.4.1 实型常量的表示方法实数有两种表示形式:(1) 十进制小数形式。(2) 指数形式。1. 实型数据在内存中的存放形式 2. 实型变量的分类C实型变量分为单精度(float型)、双精度(double型)和长双精度型(long double)三类。对每一个实型变量都应在使用前加以定义。如:floatx,y,(指定x、y为单精度实数)double z; (指定z为双精度实数) long double t; (指定t为长双精度实数)3. 实型数据的舍入误差例2.4实型数据的舍入误差。main()float a,b; a = 123456,789e5; b = a + 20 ; printf(%f,b); 2.4.3 实型常量的类型 C编译系统将实型常量作为双精度来处理。例如已定义一个实型变量f,有如下语句: f = 2.45678 * 4523.65 系统将2.45678和4523.65按双精度数据存储(占64位)和运算,得到一个双精度的乘积,然后取前7位赋给实型变量f。假如a已指定为单精度实型变量:float a;a=111111111;由于float型变量只能接收7位有效数字。2.5 字符型数据2.5.1 字符常量C的字符常量是用单引号(即撇号)括起来的一个字符。还允许用一种特殊形式的字符常量,就是以一个“”开头的字符序列。n,它代表一个“换行”符。这是一种“控制字符”,在屏幕上是不能显示的。例2.5转义字符的使用。 ain() printf( ab ct derftgn); printf(htibbj k); 2.5.2 字符变量字符型变量用来存放字符常量,请注意只能放一个字符字符变量的定义形式如下:charc1,c2;用下面语句对c1、c2赋值:c1=a;c2=b;在所有的编译系统中都规定以一个字节来存放一个字符,2.5.3 字符数据在内存中的存储形式及其使用方法将一个字符常量放到一个字符变量中,是将该字符的相应的ASCII代码放到存储单元中。例2.6向字符变量赋以整数。 main() char c1,c2; c1=97; c2=98; printf(%c %cn,c1,c2);/*以字符形式输出*/ printf(%d %dn,c1,c2);/*转换为整数形式输出*/ 例2.7大小写字母的转换。main() char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; printf(%c%c,c1,c2); 2.5.4 字符串常量c语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是一对双引号括起来的字符序列。如:“how do you do.”, “CHINA,a,123.452.6 变量赋初值程序中常需要对一些变量预先设置初值。C语言允许在定义变量的同时使变量初始化。如:int a=3; /* 指定a为整型变量,初值为3 */float f=3.56;/* 指定f为实型变量,初值为3.56 */char c=a; /* 指定c为字符变量,初值为a */也可以使被定义的变量的一部分赋初值。如: int a,b,c=5;表示指定a、b、c为整型变量,只对c初始化,c的值为5。2.7 各类数值型数据间的混合运算整型(包括int,short,long)、实型(包括float,double)可以混合运算。例如:10+a+15-87651234 *b是合法的。在计算机执行时从左至右扫描,运算次序为:进行10+a的运算,先将a转换成整数97,运算结果为107。由于“*”比“+”优先,先进行i*f的运算。先将i与f都转成double型,运算结果为double型。整数107与i*f的积相加。先将整数107转换成双精度数(小数点后加若干个0,即10700000),结果为double型。将变量e化成double型,d/e结果为double型。将10+a+i*f的结果与d/e的商相减,结果为double型。上述的类型转换是由系统自动进行的。2.8 算术运算符和算术表达式1算术运算符 (+-*/%)2关系运算符 (=!=)3逻辑运算符 (!&|)4位运算符 ( |&)5赋值运算符 (=及其扩展赋值运算符)6条件运算符 (?:)7逗号运算符 (,)8指针运算符 (*和&)9求字节数运算符 (s i z e o f)10强制类型转换运算符 ( (类型) )11分量运算符 (-)12下标运算符 ()13其他 (如函数调用运算符()2.8.2 算术运算符和算术表达式1. 基本的算术运算符+(加法运算符,或正值运算符。如3+5、+3)-(减法运算符,或负值运算符。如5-2、-3)*(乘法运算符。如3*5)/(除法运算符。如5/3)%(模运算符,或称求余运算符,%两侧均应为整型数据,如7%4的值为3)。2. 算术表达式和运算符的优先级与结合性算术运算符的结合方向为“自左至右”,又称“左结合性”,有些运算符的结合方向为“自右至左”,即右结合性3. 强制类型转换运算符可以利用强制类型转换运算符将一个表达式转换成所需类型。例如: (double)a (将a转换成double类型) (int)(x+y) (将x+y的值转换成整型) (float)(5%3) (将5%3的值转换成float型)其一般形式为(类型名)(表达式)例2.8强制类型转换。 main() float x; int i; x=36; i=(int)x; printf(x=%f, i=%d,x,i); 4. 自增、自减运算符+i,-i(在使用i之前,先使i的值加(减)1) i+,i-(在使用i之后,使i的值加(减)1)=+i;(i的值先变成4, 再赋给,j的值为4) =i+;(先将 i的值3赋给,的值为3,然后i变为4)注意:(1) 自增运算符(+)和自减运算符(-),只能用于变量,而不能用于常量或表达式(2) +和-的结合方向是“自右至左”。5. 有关表达式使用中的问题说明(1)C运算符和表达式使用灵活因此务必要小心谨慎。如果有以下表达式:(i+)+(i+)+(i+)(2) c语言中有的运算符为一个字符,有的运算符由两个字符组成,在表达式中如何组合呢?如i+,是理解为(i+)+呢?还是i+(+)呢?(3) C语言中类似上述这样的问题还有一些。例如,在调用函数时,实参数的求值顺序,C标准并无统一规定。总之,不要写出别人看不懂的、也不知道系统会怎样执行的程序。2.9 赋值运算符和赋值表达式1. 赋值运算符2. 类型转换(1) 将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。(2) 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。(3) 将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(32位)中。但应注意数值范围不能溢出。(4) 字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为2个字节,因此将字符数据(8位)放到整型变量低8位中。有两种情况: 如果所用系统将字符处理为无符号的量或对unsigned char型变量赋值,则将字符的8位放到整型变量低8位,高8位补零。 如果所用系统(如turbo c)将字符处理为带符号的(即signed char),若字符最高位为0,则整型变量高8位补0;若字符最高位为1,则高8位全补1(图2.11(b)。这称为“符号扩展”,这样做的目的是使数值保持不变,(5) 将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)。(6) 将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中,如果int型数据为正值(符号位为0),则long型变量的高16位补0;如果int型变量为负值(符号位为1),则long型变量的高16位补1,以保持数值不改变。反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。(7) 将unsigned int型数据赋给long int型变量时,不存在符号扩展问题,只需将高位补0即可。将一个unsigned类型数据赋给一个占字节数相同的整型变量,将unsigned型变量的内容原样送到非unsigned型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。(8) 将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(连原有的符号位也作为数值一起传送)。3. 复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构成复合的运算符。如果在“=”前加一个“+”运算符就成了复合运算符“+=”。 a += b (其中a为变量,b为表达式) a +=b (将有下划线的“a+”移到“=”右侧) a = a + b (在“=”左侧补上变量名a) 注意,如果b是包含若干项的表达式,则相当于它有括号。如: x %= y+3 x %=(y+3) x = x %(y+3) (不要错写成x=x%y+3)凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。c语言规定可以使用10种复合赋值运算符。即:+=,-=,*=,/=,%=,=,&=,=,|=后4. 赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为 2.10 逗号运算符和逗号表达式C语言提供一种特殊的运算符逗号运算符。用它将两个表达式连接起来。如:3+5,6+8 称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。请注意并不是任何地方出现的逗号都是作为逗号运算符。第3章 最简单的c程序设计顺序程序设计3.1 C语句概述3.2 程序的三种基本结构3.3 赋值语句3.4 数据输入输出的概念及在语言中的实现3.5 字符数据的输入输出3.6 格式输入与输出3.7 顺序结构程序设计举例3.1 C语句概述C语句可以分为以下5类:(1) 控制语句,完成一定的控制功能。c只有9种控制语句,它们是: if()else(条件语句) for() (循环语句) hile() (循环语句) dohile() (循环语句) continue (结束本次循环语句) break (中止执行switch或循环语句) sitch (多分支选择语句) goto (转向语句) return (从函数返回语句)(2) 函数调用语句。由一次函数调用加一个分号构成一个语句;(3) 表达式语句。(4) 空语句。下面是一个空语句: (5) 可以用 把一些语句括起来成为复合语句,又称分程序。3.2 程序的三种基本结构有三种基本结构:(1) 顺序结构。先执行a操作,再执行b操作,两者是顺序执行的关系。(2) 选择结构。p代表一个条件,当p条件成立(或称为“真”)时执行a,否则执行b。(3) 循环结构,有两种循环结构: 当型循环结构 直到型循环结构。由选择结构可以派生出另一种基本结构: 多分支选择结构,见图3.6。3.3 赋值语句赋值语句是由赋值表达式加上一个分号构成。(1) C语言中的赋值号“=”是一个运算符,在其他大多数语言中赋值号不是运算符。(2) 关于赋值表达式与赋值语句的概念,其他多数高级语言没有“赋值表达式”一概念。作为赋值表达式可以包括在其他表达式之中,例如:if(a=b)0)t=a;3.4 数据输入输出的概念及在C语言中的实现(1) 所谓输入输出是以计算机主机为主体而言的。(2) C语言本身不提供输入输出语句,输入和输出操作是由函数来实现的。(3) 在使用c语言库函数时,要用预编译命令“include”将有关的“头文件” 包括到用户源文件中。考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加#include命令。3.5 字符数据的输入输出3.5.1 putchar函数(字符输出函数)putchar函数的作用是向终端输出一个字符:例如putchar(c);它输出字符变量c的值。c可以是字符型变量或整型变量。例3.1输出单个字符。 #include main() char a,b,c; a=b;b=o;c=y; putchar(a);putchar(b);putchar(c); 也可以输出其他转义字符,如:putchar(101)(输出字符a) putchar() (输出单引号字符) putchar(015) (输出回车,不换行,使输出的当前位置移到本行开头)3.5.2 getchar函数(字符输入函数)此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。getchar函数没有参数,其一般形式为getchar()函数的值就是从输入设备得到的字符。例如:例3.2输入单个字符#include main() charc; c=getchar(); putchar(c); 应该在该函数的前面(或本文件开头)加上“包含命令”#include3.6 格式输入与输出3.6.1 printf函数(格式输出函数)1. printf函数的一般格式为printf(格式控制,输出表列) 如:printf(%d, %cn,i,c) 括弧内包括两部分:(1) “格式控制”,也称“转换控制字符串”,它包括两种信息: 格式说明,由“%”和格式字符组成。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。 普通字符,即需要原样输出的字符。(2) “输出表列”是需要输出的一些数据,可以是表达式。2. 格式字符对不同类型的数据用不同的格式字符。常用的有以下几种格式字符:(1) d格式符。%d, %md, %ld(2) o格式符, (3) x格式符,(4) u格式符,(5) c格式符,(6) s格式符,%s,%ms,%-ms,%mns,%-mns,(7) f格式符,%f,%nf%-nf与%nf, (8) e格式符, %e %m.ne和%-m.ne。(9) g格式符,在使用printf函数时,还有几点要说明:(1) 除了x,e,g外,其他格式字符必须用小写字母,(2) 可以在printf函数中的“格式控制”字符串。(3) 上面介绍的d、o、x、u、c、s、f、e、g等字符,如用在“%”后面就作为格式符号。(4) 如果想输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示, 3.6.2 scanf函数(格式输入函数)1. 一般形式scanf(格式控制,地址表列)“格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。例3.9用scanf函数输入数据。ain() int a,b,c; scanf(“%d%d%d”,&a,&b,&c); printf(%d,%d,%dn,a,b,c); 输入数据时,在两个数据之间以一个或多个空格间隔,也可以用回车键、跳格键tab。用“%d%d%d”格式输入数据时,不能用逗号作两个数据间的分隔符2. 格式说明以%开始,以一个格式字符结束,中间可以插入附加的字符。说明:(1) 对unsigned型变量所需的数据,可以用%u,%d或%o,%x格式输入。(2) 可以指定输入数据所占列数,系统自动按它截取所需数据。(3) 如果在%后有一个“*”附加说明符,表示跳过它指定的列数。(4) 输入数据时不能规定精度3. 使用scanf函数时应注意的问题(1) scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。(2) 如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。(3) 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入(4) 在输入数据时,遇以下情况时该数据认为结束。 遇空格,或按“回车”或“跳格”(tab)键。 按指定的宽度结束,如“%3d”,只取3列。 遇非法输入。3.7 顺序结构程序设计举例例3.10输入三角形的三边长,求三角形面积。include ain() float a,b,c,s,area; scanf(%f,%f,%f,&a,&b,&c); s=10/2(a+b+c); area=srt(s(s-a)(s-b)(s-c); printf(a=%7.2f, b=%7.2f, c =%7.2f, s =%7.2fn,a,b,c,s); printf(area=%72fn,area); 例3.11从键盘输入一个大写字母,要求改用小写字母输出。 #include main() char cl,c2; cl=getchar(); printf(%c,%dn,cl,cl); c2=cl+32; printf(%c,%dn,c2,c2); 例3.12求ax2+bx+c=0方程的根。include ain(); float a,b,c,disc,x1,x2,p,; scanf(a=%f,b=%f,c=%f,&a,&b,&c); disc=b*b-4*a*c; p=-b/(2*a);=srt(disc)/(2*a); x1=p+;x2=p-; printf(nnx1=%5.2fnx2=%5.2fn,x1,x2); 第4章 选择结构程序设计4.1关系运算符和关系表达式4.2逻辑运算符和逻辑表达式4.3if语句4.4switch语句4.5程序举例习题选择结构,是三种基本结构之一。在大多数程序中都会包含选择结构。它的作用是,根据所指定的条件是否满足,决定从给定的两组操作选择其一。4.1 关系运算符和关系表达式所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。4.1.1 关系运算符及其优先次序C语言提供6种关系运算符:优先级相同 (高): (小于) =(小于或等于) (大于) =(大于或等于)优先级相同 (低): = = (等于) !=(不等于) 关于优先次序:(1) 前4种关系运算符(,=,=)的优先级别相同,后两种也相同。(2) 关系运算符的优先级低于算术运算符。(3) 关系运算符的优先级高于赋值运算符。4.1.2 关系表达式用关系运算符将两个表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。关系表达式“ab”的值为“真”,表达式的值为1。关系表达式“bca”的值为“假”,表达式的值为0。4.2.1 逻辑运算符及其优先次序C语言提供三种逻辑运算符:(1) &逻辑与(相当于其他语言中的aND)(2) | 逻辑或(相当于其他语言中的)(3) ! 逻辑非(相当于其他语言中的NT)(1) !(非)&(与)(或), 即“!”为三者中最高的。(2) 逻辑运算符中的“&”和“|”低于关系运算符,“!”高于算术运算符。4.2.2 逻辑表达式逻辑表达式的值应该是一个逻辑量“真”或“假”。c语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将一个非零的数值认作为“真”。例如,要判别某一年year是否闰年。闰年的条件是符合下面二者之一:能被4整除,但不能被100整除。能被4整除,又能被400整除。可以用一个逻辑表达式来表示:(year4=0&year100!=0)|year400=0当year为某一整数值时,如果上述表达式值为真(1),则year为闰年;否则year为非闰年。可以加一个“!”用来判别非闰年:!(year4=0 & year100!=0)|year400=0)若表达式值为真(1),year为非闰年。也可以用下面逻辑表达式判别非闰年:(year4!=0)|(year100=0 & year400!=0)若表达式值为真,year为非闰年。请注意表达式中右面的括弧内的不同运算符(,!,&0,=)的运算优先次序。4.3 if语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。4.3.1 if语句的三种形式C语言提供了三种形式的if语句:1 if(表达式)语句2 if(表达式)语句1 else语句23 if(表达式1) 语句1else if(表达式2)语句2else if(表达式3)语句3else if(表达式m)语句melse语句n说明:(1) 三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。(2) 第二、第三种形式的if语句中,在每个else前面有一分号,整个语句结束处有分号。(3) 在if和else后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句,此时用花括号“”将几个语句括起来成为一个复合语句。例4.1输入两个实数,按代数值由小到大的次序输出这两个数。这个问题的算法很简单,只需要作一次比较即可。对类似这样简单的问题可以不必先写出算法或画流程图,而直接编写程序。或者说,算法在编程者的脑子里,相当于在算术运算中对简单的问题可以“心算”而不必在纸上写出来一样。 程序如下: main() float a,b,t; scanf(f,f,&a,&b); if(ab) t=a;a=b;b=t; printf(52f,52f,a,b); 4.3.2 if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:if()if()语句1else语句2内嵌ifelseif()语句3else语句4内嵌if应当注意if与else的配对关系。else总是与它上面的最近的if配对。4.3.3 条件运算符若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理。例如,若有以下if语句:if(ab)max=a; elsemax=b;可以用下面的条件运算符来处理:max=(ab)?ab;其中“(ab)?ab”是一个“条件表达式”。它是这样执行的:如果(ab)条件为真,则条件表达式取值a,否则取值b。条件运算符要求有3个操作对象,称三目(元)运算符,它是c语言中唯一的一个三目运算符。条件表达式的一般形式为图4.11表达式1?表达式2表达式3。说明:(1) 条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。(2) 条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。条件运算符的优先级别比关系运算符和算术运算符都低。(3) 条件运算符的结合方向为“自右至左”。(4) 条件表达式不能取代一般的if语句,只有在if语句中内嵌的语句为赋值语句(且两个分支都给同一个变量赋值)时才能代替if语句。(5) 条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。例4.4输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 main()charch; scanf(c,& ch); ch=(ch=a & ch=Z)?(ch32)ch; printf(c,ch) 4.4 Switch 语 句Switch语句是多分支选择语句。当然这些都可以用嵌套的if语句来处理,但如果分支较多,则嵌套的if语句层数多,程序冗长而且可读性降低。c语言提供Switch语句直接处理多分支选择,它的一般形式如下:switch(表达式) case常量表达式1:语句1 case常量表达式2:语句2 case常量表达式n:语句n default :语句n1 例如,要求按照考试成绩的等级打印出百分制分数段,可以用Switch语句实现:Switch(grade) caseaprintf(85100n); casebprintf(7084n); casecprintf(6069n); caseDprintf(60n); defaultprintf(errorn); 说明:(1) switch后面括弧内的“表达式”, ANSI标准允许它为任何类型。(2) 当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。(3) 每一个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。(4) 各个case和default的出现次序不影响执行结果。例如,可以先出现“default:”,再出现“case D:”,然后是“case a:”。 (5) 执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行Switch语句时,根据Switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。(6) 多个case可以共用一组执行语句,如: casea caseb casecprintf(60n);break;grade的值为a、b或c时都执行同一组语句。4.5 程序举例例4.5写程序,判断某一年是否闰年。例4.6求ax2bxc=0方程的解。例3.12曾介绍过基本的算法,实际上应该有以下几种可能: a=0,不是二次方程。 b2-4ac=0,有两个相等实根。 b2-4ac0,有两个不等实根。 b2-4ac0,有两个共轭复根。例4.7运输公司对用户计算运费。路程(S)越远,每公里运费越低。标准如下: s250km没有折扣 250S500 2折扣 500S1000 5折扣 1000S2000 8折扣 2000S3000 10折扣 3000S 15折扣第5章 循 环 控 制5.1 概述5.2 goto语句以及用goto语句构成循环5.3 while语句5.4 do while语句5.5 for 语句5.6 循环的嵌套5.7 几种循环的比较5.8 break语句和continue语句5.9程序举例5.1 概述循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。 (1) 用goto语句和if语句构成循环; (2) 用while语句; (3) 用do|while语句; (4) 用for语句。5.2 goto语句以及用goto语句构成循环goto语句为无条件转向语句,它的一般形式为 goto语句标号;语句标号用标识符表示,它的定名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。不能用整数来做标号。例如:goto label-1;可读性差。但也不是绝对禁止使用goto语句。一般来说,可以有两种用途:(1) 与if语句一起构成循环结构;(2) 从循环体中跳转到循环体外,但在c语言中可以用break语句和continue语句(见5.8节)跳出本层循环和结束本次循环。例5.1用if语句和goto语句构成循环,求n。 此问题的算法是比较简单的,可以直接写出程序: main( ) int i, sum=0;i=1;loop: if(i=100) sum=sum+i; i+; goto loop; printf(%d,sum);5.3while语句while语句用来实现“当型”循环结构。其一般形式如下:while (表达式) 语句当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。例5.2求n。用传统流程图和NS结构流程图表示算法。根据流程图写出程序:main() int i,sum=0

温馨提示

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

评论

0/150

提交评论