admin 管理员组

文章数量: 887021


2023年12月16日发(作者:inputbox格式语法参数)

第一讲 C语言概述

1.1 C语言发展概述

C语言是在1972年至1973年间由美国的贝尔实验室的e和on以及英国剑桥大学的ds等为描述和实现UNIX操作系统而设计的。

最初的C语言是附属于UNIX的操作系统环境,而它的产生却可以更好地描述UNIX操作系统。时至今日,C语言已独立于UNIX操作系统。它已成为微型、小型、中型、大型和超大型(巨型)计算机通用的一种程序设计语言。

随着C语言的不断发展、应用和普及,目前,C语言已经能够在多种操作系统下运行,实用的C语言编译系统种类繁多,如Microsoft

C、Turbo C等。

1.2 C语言的特点

C语言能够成为目前广泛的高级设计语言之一,完全是由其语言特点决定的。

(1)语言基本组成部分紧凑简洁。

(2)C语言运算符丰富,表达能力强。

(3)C语言数据结构丰富,结构化好。

(4)具有结构化的控制语句。

(5)C语言提供了某些接近汇编语言的功能。

(6)C语言程序所生成的目标代码质量高。

(7)C语言程序可移植性好。

C语言的弱点:

(1)运算符的优先级较复杂,不容易记忆

(2)C语言的语法限制不太严格,一定程度上降低了某些安全性。

1.3 简单的C语言程序。

1.3.1 C语言程序的构成

1.3.2 C语言程序的特点

(1)C程序是由函数构成的,其中至少包括一个函数main( )。

(2)函数体是由左右花括号{ }括起来的部分。

(3)C语言中的每个基本语句都以“;”结束。

(4)C语言书写格式自由,一行内可以写一个语句,也可以写多个语句。

(5)#include语句是编译预处理语句,其作用是将由双引号或尖括号括起来的文件内容读入该语句位置处。

对程序说明:

(1)可用/*…*/对C程序中的任何部分作注释。

(2)C语言中所有变量都必须先定义类型,然后再使用。

(3)一个C语言程序通过函数之间的相互调用来实现相应的功能。即可以是系统提供的库函数,也可以是根据需要自己定义的函数。

1.4 C语言上机步骤

运行环境:DOC操作系统下的Turbo C

1.4.1 C程序上机步骤

1.编辑:在TurboC环境下。将C语言源程序通过键盘输入到计算机

中,并以文件形式存盘,源程序都是以.C为扩展名。

2.编译:通过编辑程序将源程序输入到计算机后,需要经过C语言编译器将其生成目标程序。得到的目标文件都是以.OBJ为文件扩展名。

3.连接:经过编译后生成的目标文件需经过连接后才能生成可执行代码。其扩展名是.EXE。

所谓连接,是将目标文件和库函数或其他目标程序连接成可执行的目标程序。

4.执行:连接后源程序的目标程序就是可执行文件了。在DOS系统下,只要键入可执行文件名,按回车键就可以了。

1.4.2 Turbo C系统菜单

C的主屏幕和主菜单功能

2.文件菜单及功能

1.4.3 程序调试方法

一个计算机程序必须对其进行测试来确定其可以正确地工作,这一过程称为调试。

程序错误

语法错误:通过编译和连接就会找到

运行错误:通过调试自己找出问题所在

1.设置和使用观察变量

2.单步执行程序

3. 设置和使用断点

2.1 常量和变量

2.2 整型数据

2.3 字符型数据

2.4 浮点型数据

2.5 变量的初始化

第二章 数据类型与表达式

2.1 常量和变量

2.1.1 常量:在程序运行过程中其值不能被改变的量。

2.1.2 变量:在程序运行过程中其值可以被改变的量。

标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。

1.标识符的有关规定:

(1)由英文字母、数字、下划线组成,且第一个字符必须是字母或下划线,一般不超过8个字符;

(2)大小写字母的含义不同。

(3)不能使用C语言中的关键字做标识符,

(4)用户取名时,应当尽量遵循“简洁明了”和见名知意的原则。

2.变量名的有关规定:

(1)使用变量名前,一定先定认,后使用,否则不能做为变量名。

(2)每一个变量属于一种类型,便于在编译时据此检查该变量所进行的运算是否合法。

(3)变量名的定义:存储属性、数据类型、变量名表

3.数据类型

2.2 整型数据

2.2.1整型常量

(1)十进制整数:数码直接开头的十进制数。如1234,-234。

(2)八进制整数:以0开头的常量是八进制数。如011=(11)8

(3)十六进制整数:以0x开头的数是十六进制。如0x123即(123)16

例2.1 三种进制表示方法的转换

源程序a1.c

main()

{

Int x=1246,y=01246,z=0x1246;

Printf(“%d,%d,%dn”,x,y,z);

Printf(“%o,%o,%on”,x,y,z);

Printf(“%x,%x,%xn”,x,y,z);

}

C:>a1

1246,678,4678

2336,1246,11106

4de,2a6,1246

2.2.2整型变量

原则:使用变量前,先定义,后使用。

(1)基本型:用int表示;

(2)短整型:用short int或short表示;

(3)长整型:用long int或long表示;

(4)无符号型:

无符号整型:用unsigned int或unsigned表示;

无符号短整型:用unsigned short int或unsigned short表示;

无符号长整型:用unsigned long int或unsigned long表示;

2.2.3 整型变量使用

不同的整型数据,应根据其特性和取值范围,将其定义成不同类型的整型变量。

例2.2不同类型的数据进行算术运算。

源程序a2.c

Main()

{

Int a,b,s1,s2;

Unsigned x;

a=10;b=-30;x=20;

S1=a+x;s2=b+x;

Printf(“a+x=%d,b+x=%dn”,s1,s2);

}

C:>a2

运行结果为

a+x=30,b+x=-10

2.2.3 整型变量使用

不同的整型数据,应根据其特性和取值范围,将其定义成不同类型的整型变量。

例2.3 整型数据各类型所能表示的范围

源程序a3.c

main()

{int a,b;

long c,d;

unsigned e,f;

a=32767;b=1;

c=2147483647;d=1;

e=65535;f=1;

Printf(“int: %d,%d,n”,a,a+b);

Printf(“long: %d,%ldn”,c,c+d);

Printf (“unsigned: %u,%un”,e,e+f);

}

C:>a3

运行结果为

Int: 372767,-32768

Long: 2147483647,-2147483648

Unsigned:65535,0

2.3 字符型数据

2.3.1 字符型常量

字符常量是由一对单引号括起来的单个字符构成,例如:‘A’,‘b’,’2’,’%’’;’等。一个字符型常量是该字符集中对应的编码值:‘0’~‘9’的ASCⅡ编码值是48~57。显然‘0’与数字0是不同的。

2.3.2 字符型变量

字符型数据分为两类:一般字符类型(char) 和无符号字符类型(unsigned char)。

例2.4 字符型数据与整型数据可以通用

源程序a3.c

Main()

{char c1,c2;

Printf(“%c,%cn”,c1,c2);

Printf(“%d,%dn”,c1,c2);

}

C:>a4

运行结果为

A,B

65,66

2.3.3 字符串常量

字符串常量是由一对双引号括起来的字符序列,例:“fsdf”,”A”等。

字符串常量中不能直接包括单引号、双引号和反斜杠““。

字符串常量与字符常量的区别:

(1)字符串常量是用双引号括起来的字符序列。

(2)字符串常量有串尾标记”0”;

(3)字符串常量允许扩展表示法;

(4)C语言中没有专门的字符串变量。字符串如果需要存放在变量中,需要用字符型数组来存放。

注意:不要将单个字符组成的字符串常量与字符常量混淆。‘a’为字符串常量,不能把一个字符串常量赋给一个字符变量。例如:下面的用法都是错误的:

Char c1,c2;

C1=“a”

C2=“CHINA”;

字符‘0’由系统自动加入到每个字符串的结束处,不必由编程人员加入。

字符串“CHINA”在内存中的存放形式如下图,其长度是六个字节,而不是5个字节。字符‘0’所对应的ASCⅡ值为0,即“空”字符。

2.4 浮点型数据

2.4.1 浮点型常量

浮点型常量有两种表示形式。

十进制数形式

它是由数字和小数组成,如:3. 14159,-7.2,8.9

指数法形式

如:180000.0用指数法可表示为1.8e5,1.8称为尾数,5称为指数。

0.00123用指数法可表示为1.23e-3

注意:

(1)字母e 或E之前(即尾数部分)必须是有数字的。

(2)e或E后面的指数部分必须是整数。

如:e-3,9.8e3.1,e5都是不合法的。

2.4.2 浮点型变量(实型变量)

把带有小数点的数称为浮点数,或实型数。浮点型变量又称为实型变量,按能表示数的精度,分为:单精度浮点型变量和双精度浮点型变量,其定认方法如下:

float a,b; /*单精度变量的定义*/

double c,d; /*双精度变量的定义*/

单精度:占4个字节,有效位为7位,数值范围为10-37~1038

双精度:占8个字节,有效位为15~16位,数值范围约为10-307~10308

浮点型常量不存在单精度型和双精度型之分。

2.5 变量的初始化

变量的初始人化:在定义变量的同时给变量赋予初值。

方法:

(1)先说明变量类型,然后再赋值。

(2)在对变量类型说明的同时,给变量赋初值。

先定义后赋值

int a,b,c;

char d;

floatb f;

a=2;

b=5;

c=10;

d=‘a’;

f=5.7;

定义和赋值同时进行

int a=5;

short b=10;

char c=‘a’;

float d=7.8;

3.对几个变量同时赋一个初值

Int a1=10,a2=10,a3=10;

初始化不是在编译阶段完成的,而是在程序运行时执行本函数时

赋以初值的。相当于一个赋值语句。例如:

int a=10;

相当于:

int a;

a=10; 又如:

Int a;,b,c=20;

相当于:

Int a,b,c;

C=20;

第三讲 运算符以及数据类型

2.6 运算符及表达式

2.7 数据类型转换

2.8 类型定义

2.6 运算符及表达式

C语言运算符可以分为:算术运算符、逻辑运算符、关系运算符、位运算符、赋值运算符。

2.6.1 算术运算符和算术表达式

1. 算术运算符:加、减、乘、除及取模即:+,-,*,/,%来表示。

C语言规定:

(1)模运算符%,仅用于整型变量或整型常量。

(2)优先级:一个表达式中如有多个运算符,则计算先后次序为相应运算符的优先级高的优先。乘、除、模优先级高于加、减的优先级。

(3)结合方向:是一个运算对象两侧的运算符的优先级别相同时,应遵循的处理规则。

算术运算符的结合方向是从左至右;

赋值运算符的结合方向是从右至左。

算术表达式:由算术运算符、括号以及操作对象组成的符号C语言语法规则的表达式称为算术表达式。

2.6.2 赋值语句

1. 赋值运算符

语言的赋值运算符是“=”,它的作用是赋值运算符右边表达式的值赋给其左边的变量。

例如:a=10,x=a+5,前者是把常量10赋给变量a,后者是将表达式a+5的值赋给变量x.

注意:如果“=”两侧的类型不一致,在赋值时要进行类型转换。例如a=b,执行该语句时,b的结果转换为a的类型后才能进行赋值运算。

2. 复合赋值运算符

C语言允许在赋值运算符“=“之前加上其它运算符,以构成其复合运算符。复合运算符多数为双目。

复合运算符有:

+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=

例:

a+=2 等价于 a=a+2

x*=y+5 等价于 x=x*(y+5)

x%=8 等价于 x=x%8

赋值运算符都是自右向左执行。

3. 赋值语句与赋值表达式

赋值语句最简单的形式是:

<变量>= <表达式>;

功能:是赋值运算符右边的“表达式”的值赋给左边的变量。

赋值表达式也可以包含复合的赋值运算符,例:

如果a=10,表达式a+=a-=a*a的值为-180。其步骤为:

(1)先进行a-=a*a的计算,它相当于a=a-a*a=10-10*10=-90.

(2)再进行a+=-90的计算,它相当于a=a+(-90)=-90-90=-180.

4. 自增自减运算符

i++(或i--)表示在使用该表达式值之后将i值加1(或减1)。

++i(或--i)表示在使用该表达式值之前将i值加1(或减1)。

说明:

(1)++和--仅适用于变量,不能用于常量或表达式。

(2)++和--运算符的结合方向是“至右向左”。

Main()

{int a=100;

printf(“a++=%dn”,a++);

printf(“++a=%dn”,++a);

printf(“a--=%dn”,a--);

printf(“--a=%dn”,--a);

}

输出结果:

a++=100

++a=102

a--=102

--a=100

2.6.3 关系运算符和关系表达式

1. 关系运算符

关系运算符均为两目运算符。共有六种:

> 大于 < 小于

>= 大于等于 <= 小于等于

== 等于 != 不等于

关系运算符要求两个操作数是同一种数据类型,其结果为一逻辑值,即关系成立时,其值为真(true),用非0值表示;关系不成立时,其值为假(false),用0表示。

关系运算符的优先级借低于算术运算符,关系运算符==和!=低于前四种运算符,并且结合方向均为自左至右。

2. 关系表达式

由关系运算符将两个表达式连接起来的有意义的式子称为关系表达式。

如:a+b

先进行a+b和c-6两个算术表达式的运算,得到两个值后再进行比较,从现而求出关系表达式的值。其值为0或非0。

关系表达式的值是一个逻辑值,即“真”或“假”。用1表示“真”,用0表示“假”。

如:

a=4,b=1,C=a>b;c的值为1,

若a=1,b=8,x=a>b;x的值为0。

2.6.4 逻辑运算符和逻辑表达式

1.逻辑运算符

逻辑运算符有“&&“(逻辑与)、”||“(逻辑或)和”!“(逻辑非)三种。

逻辑运算符的操作对象为零或非零整数值,见表2.4.

表2.4 逻辑运算规则

逻辑表达式

由逻辑运算符和其操作对象组成表达式称为逻辑表达式。

2.6.5 位运算符

位(bit)运算是C语言的一大特色,可直接对构成内存的基本单位

“字节”(byte)进行按位操作。按位与(&)

操作规则:参加运算的两个运算量,如果两个相应的位均为1,则该

位的结果为1,否则为0,见表2.5

表2.5 接位与

例如:(1)清零。

(2)取一个数中的某些位。

高位清零:

00101101 10011100

& 00000000 11111111

00000000 10011100

低位清零:

00101101 10011100

& 11111111 00000000

00101101 00000000

按位或(|)

操作规则:参加运算的两个运算量,其相应的位中只有一个为1,则该位的结果为1,否则为0。

表2.6 按位或

例如:

(1) 01000001

| 00101001

01101001

(2) 01000001

| 00000000

01000001

(3) 01000011

| 11111111

11111111

(4) 01000001

| 10111110

11111111

例如:将某一个数的某些位置为1。一个整数a,要将其低字节全置为1,即低字节为11111111,可将该数与255(十六进制为FF,二进制为11111111)按按位或即可。

按位异或(^)

操作规则:参加运算的两个运算量,当相应位相同时,其结果在该位为0,相应位不同时,其结果在该位为1,即按位相加,但不进位。

表2.7 按位异或

(1)使指定位翻转。即由1变为0,由0变为1。例:

01100110

^ 00001111

01101001

(2)不使用临时变量,交换两个值。方法为:若有两个数a和b,

通过

下面的赋值语言可将 a和b的值互换:

a=a^b;

b=b^a;

b=a^b;

4. 按位求反(~)

操作规则:运算符~是一个单目运算符,用来对一个数二进制表示按位求反,即瘵0变成1,将1变成0。

表2.8 按位求反

例: ~01101001

10010110

将一个数的某些位变为0。方法是:瘵该数a与~b按位求与,此处的b为这样的一个数,即要求a 中变为0的那些位均为1,其余位均为0。如要将a的最低位变为0,则可使用下述表达式实现。

A=a&~1

5 . 左移(<<)

操作规则:将一个数的各二进制位全部左移若干位,左移后,右边的这些位用0填补,左边移出的位舍弃不用。

例:a=a<<2;

若a=15,即二进制00001111,左移两位后变为00111100。若再向左移4位,则变为11000000。

将一个数左移1位,相当于该数乘以2,左移2位相当于该数乘以4。

如上例中a=15,则a=a<<2,此时a=15*4=60。但是这种情况仅指左移时没有1被移出去的情况,左移运算要比乘法运算快得多。

6.右移(>>)

操作规则:将一个数的各二进制位全部右移若干位,右移后,右边移出的位被舍弃,而左边的填补分两种情况:

(1)该数为无符号数,则高位补0。

例:a=a>>2;

右a=15,二进制为00001111,右移两位后为00000011。

(2)该数为有符号数,若原来的符号位为0(最高位为0,即正数)则高位补0,若原来的符号位为1(即表示该数为负数),高位补0或1,取决于所使用的计算机系统。有的系统补0,称为逻辑右移,有的系统补1,称为算术右移。

例:a:1111

a>>1:0011(逻辑右移)

a>>1:1111(算术右移)

2.6.6 其他运算符

逗号运算符

逗号运算符为“,“。逗号表达式是用逗号运算符把两个表达式组合成的一个表达式。其一般形式为

〈表达 式1〉,〈表达式2〉

说明:

(1)逗号表达式的执行过程是:先求表达式1的值,再求表达式2的值,表达式2的值就是整个逗号表达式的值。

(2)一个逗号表达式可以与另一个表达式构成一个新逗号表达式。

(3)逗号运算符是所有运算符中级别最低的。

(4)逗号表达式常用于for语句中,它可以表达多个初值或多个步长增量。

逗号表达式的一般形式可以扩展为

〈表达式1〉,〈表达式2〉,〈表达式3〉,……〈表达式N〉

表达式n的值是整个表达式的值。

条件运算符

条件运算符是一个三目运算符,把三表达式组合成一个表达式。其一般形式为

〈表达式1〉?〈表达式2〉:〈表达式3〉;

功能:计算〈表达式1〉的值,如果该值为真(非0值),则计算〈表达式2〉的值,并且该值即为条件表达式值。若〈表达式1〉的值为假(0),则计算〈表达式3〉的值,并将该值作为条件表达式的值。

说明:

(1)条件运算符优先级别高于赋值运算符,低于关系运算符和算术运算符。

(2)条件运算符结合方向是“自右至左”。

(3)〈表达式1〉与〈表达式2〉、〈表达式3〉类型可以不同。

3. Sizeof运算符

sizeof运算符是测试变量、表达式或类型名所占用的字节

数。有两种用法。

sizeof〈表达式〉:测试表达式所占用的字节数。

sizeof〈表达式〉:测试类型名所占用的字节数。

例如: sizeof(float)其值为4。

sizeof运算符可以出现的表达式中。

main()

{ int a=4;

fload b=5.6;

printf (“%d,%dn”, sizeof(a), sizeof(b));

}

输出结果:

2,4

2.7 数据类型转换

在内存中,字符是以系统中所使用字符的编码值形式存储的,C语言允许字符型数据和整型数据之间通用一个字符型数据,即可以以字符形式输出,也可以以整型形式输出,同时,字符型数据可能赋给整型变量,整型数据也可以赋给字符型变量,只是当整型变量数据的大小超过字符型变量的表示范围时,需要截取相应的有效位。

除字符型数据和整型数据之间可以通用之外,不同类型的数据在进行混合运算时,往往需要进行强制类型转换。因此类型转换有

两种方式:一种是自动类型转换;另一种是强制类型转换。

2.7.1 自动类型转换

在进行计算时,首先将不同类型的数据转换成同一类型,然

后进行计算

不同类型数值转换规则:

Double float

Long

Unsigned

Int char ,short

2.7.2 强制类型转化

强制类型转化的一般形式如下所示:

(强制的类型名)〈变量〉

例如:(int)(a+b),将a+b的结果强制转换成int型;

(float) a/b,将a的结果强制转换成float型后,再进行计算。

注意:经强制类型转换后,得到的是一个所需类型的中间变量,原来变量的类型并没有发生任何变化。

2.8 类型定义

C语言允许使用typedef语句定义新类型名,以取代已有类型名,如:

typedef int counter;

作用是定义counter等价于基本数据类型名int,以后就可以利用counter来定义int型变量了。如:

counter I,n; 等价于int I, n;

类型定义的优点是:能够提高程序可读性。

注意:

(1)typedef语句不能创造新的类型,

只能为已有的类型增加一个类型名。

(2) typedef语句只能用来定义类型名,

而不能用来定义变量。

例如:分析下例程序。

# include “stdio.h”

typeref int integer;

typedef float real;

Main( )

{

integer i=5;

real f;

f=real(i)/10;

printf(%f”,f);

}

第四讲 数据的输入输出

3.1 数据的输入

3.2 数据的输出

3.3 应用举例

3.1 数据的输入

3.1.1 字符输入函数getchar

格式: getchar()

功能:从键盘上接收输入的一个字符。

例如:

char c;

c= getchar()

其中c是字符型或整型变量。

例1:从键盘输入一个字符,并将其存入字符型变量c 中。

#include”stdio.h”

Main()

{char c;

C= getchar();

}

3.1.2 格式输入函数scanf

格式:scanf(格式控制,地址表);

功能:用来输入任何类型数据,可同时输入多个类型或不同类型数据。

格式控制:是由双括号括起来字符串,主要是由“%”和格式符组成

2.地址表

Scanf函数中的“地址表”部分是由变量的地址组成的,如果有多个变量,则各变量之间用逗号隔开。地址运算符为“&“,如变量a的地址可以写为&a。

例3.2用scanf函数,从键盘

上输入一个整型数、一个浮

点数和一个字符,分别存入

变量i、f和c中。

#include”stdio.h”

main()

{

int i;

float f;

char c;

scanf(“%d,%f,%c”,&I,&f,&c);

printf(“i=%d,f=%f,c=%c”,i,f,c);

}

说明:

(1)在scanf函数“格式控制”部分中的每个格式说明符都必须在“地址表列”中有一个变量与之对应格式说明符必须要与相应变量的类型

一致。

(2)当格式说明符之间没有任何字符时,在输入数据时,两个数据之间要使用“空格”、“Tab”或“回车”键做间隔;如果格式说明符之间包含其它字符,则输入数据时,应输入与这些字符相同的字符做间隔,如:

Scanf(“%d,%f,%c”,&i,&f,&c);

在输入数据时,应采用如下形式:20,7.8,a

(3)可以在格式说明符的前面指定输入数据所占的列数,系统将自动按此列数来截取所需的数据,如:

scanf(%2d%3d”,&x,&y); 当用户输入78985时,系统将自动地将78赋给变量x,将985赋给变量y。这种方式也可用于字符型数据的输入。

(4)应该特别注意的是,scanf函数中的“地址表列”部分应当中变量的地址,而不是变量名。

3 .2 数据的输出

3.2.1 字符输出函数putchar

数据的输出一般是以终端显示器(屏幕)为处理对象。

格式:向终端输出一个字符。

说明:变量c可以是字符型,也可以是整型。

例3.3 从键盘输入一个字符,在屏幕上显示出来。

#include”stdio.h”

main()

{ char c;

c=getchar(); /*从键盘输入一个字符*/

putchar(c); /*在屏幕上显示一个字符*/

}

putchar函数也可以输出一些特殊字符(控制字符),如:putchar(‘n’)

作用是输出一个“换行”字符。

3.2.2 格式控制函数printf

格式: printf(格式控制,输出表);

功能:输出任何类型的数据。

1.格式控制

“格式控制”部分与scanf函数的相似,也是由双引号括起来的字符串,主要包括格式说明和需要原样输出的字符。

“格式说明”:由“%”和格式符组成,如%c和%f等,作用是将要输出的数据转换为指定格式后输出。

printf函数中使用的格式字符见表3.2 。

表3.2 printf函数格式字符

注意:格式字符必须小写

输出表

printf函数中的“输出表”部分由表达式组成,这些表达式应与“格式控制”字符串中的格式说明符的类型一一对应,若“输出表”中有

多个表达式,则每个表达式之间应由逗号隔开。

例3.4 从键盘输入一个整数和一个浮点数,并在屏幕上显示出来。

#include”stdio.h”

main()

{ int i;

float f;

scanf(“%d,%f”,&i,&f);

printf(“i=%d,f=%f”,I,f);

}

执行此程序,按格式输入数据:

50,8,9

i=50,f=8.900000

说明:

(1)printf函数中的“格式控制”字符串中的每一个格式说明符,都必须与“输出表”中的某一个变量相对应,如上述程序中的“%”与i对应;“%f”与f对应,而且格式说明符应当与其所对应变量的类型一致。

若要显示“%”字符,则应在“格式控制”字符串中连写两个“%”,如:

Printf(“x=%d%%”,100/4);

将显示:x=25%。

(2)对格式说明符c、d、s和f等,可以指定输出字段的宽度。

%md:m为指定的输出字段的宽度。如果数据的位数大于m,则按实际位数输出,否则输出时向右对齐,左端补以“空格”符。

%mc:m为指定的输出字段的宽度。若m大于一个字符的宽度,则输出时向右对齐,左端补以“空格”符。

%mc:m为输出时字符串所占的列数。如果字符串的长度(字符个数)大于m,则按字符串的本身长度输出,否则,输出时字符串向右对齐,左端补以“空格”符。

%-ms:mr的意义同上。如果字符串的长度小于m,则输出时字符串向左对齐,右端补以“空格”符。

%:m为浮点数据所占的总列数(包括小数点),n为小数点后面的位数。如果数据的长度小于m,则输出时向右对齐,左端补以“空格”符。

%-:m、n的意义同上。如果数据的长度小于m,则输出向左对齐,右端补以“空格”符。

(3)除了格式说明符及其输出字段的宽度外,在“格式控制”字符中的其他字符,将按原样输出。

(4)在显示数据时,可以不指定输出字段的宽度,而直接利用系统隐含的输出宽度。

3.3 应用举例

例3.5 分析下列程序,观察运行结果。

main()

{

char ch=‘a’;

int a=98;

unsigned b=1000;

long c=123456789;

float x=3.14;

double y=1.2345678;

pPrintf(“(1) a=%d,a=%c,ch=%d,ch=%cn”,a,a,ch,ch);

printf(“(2) b=%un”,b);

printf(“(3) c=%ldn”,c);

printf(“(4) x=%f,y=%fn”,x,y);

printf(“(5) x=%e,y=%en”,x,y);

printf(“(6) y=%e10.2fn”,y);}

运行的结果为

(1) a=98,a=b,ch=97,ch=a

b=1000

C=123456789

X=3.140000,y=1.234567

x=3.14000e+00,y=1.23456e+00

Y=1.23

例3.6 从键盘上输入一个大写字母,把它转换面小

写字母,然后显示出来。

#include”stdio.h”

main()

{

char x1,x2;

printf(“x1=?n”);

scanf(“%c”,&x1);

x2=x1+32;

printf(“%c,%cn”,x1,x2);

}

运行结果

x1=?

A

A,a

例3.7 分别输入一个浮点数,一个整数,一个字符型数。#include “stdio.h”

main()

{

float f;

int I;

char c;

scanf(“%f%d%c”,&f,&I,&c);

printf(“%f%d%c”,f,I,c);

}

例3.8 从键盘输入一个字符并鸣笛输出。

#include “stdio.h”

Main()

{

Char c;

C=getchar( );

Putchar(‘007’);

Putchar(c);

}

第五讲 条件语句

4.1 语句和复合语句

4.2 if语句

4.3 switch语句

4.4 应用举例

第四章 条件语句

结构化程序的三种基本结构:顺序结构、选择分支结构和循环结构。

顺序结构:是指每个程序都是按照语句的书写顺序依次执行的。

选择分支结构:是指通过对特定条件的判断,来选择一个分支执行。

循环结构:循环是指在给定条件下,重复执行某段程序,直到不满足条件为止。

4.1 语句和复合语句

表达式语句:一个表达式的后面跟随一个分号构成的语句。

如:x=x+a;

说明:分号“;”是语句的终结符,而不是语句的分隔符即分号是语句的最末组成部分。

复合语句:由左右花括号括起来的语句;

形式:{说明部分;语句部分}

一个复合语句在语法上等同于一个语句,在程序中,凡是单个语句能够出现的地方,都可以出现复合语句。一个复合语句又可以出现在其他复合语句内部。

在复合语句的后面必须有一个分号,做为该语句的终结符。

4.2 if语句

If语句是条件选择语句,它是通过对给定条件的判断,来决定所要执行的操作。

4.2.1 if语句的三种形式

If语句的第一种形式

格式:if(表达式)〈语句〉

功能:首先计算表达式的值,若表达式的值

为“真”(为非0),则执行语句,若表达

式的值为“假”(为0),不执行语句。

例如:

If(x>y) printf(“%d”,x);

2. If语句的第二种形式

格式:if(表达式) 〈语句1〉

else 〈语句2〉

功能:首先计算表达式的值,

若表达式的值为“真”(为非0)。

则执行语句1,若表达式的值为

“假”(为0),则执行语句2。

例如:

if (x>y) printf(“%d”,x);

else printf(“%d”,y);

3. If语句的第三种形式

格式:

if(表达式1) 〈语句1〉

else if(表达式2) 〈语句2〉

else if(表达式3) 〈语句3〉

else if(表达式n) 〈语句n〉

else 〈语句n+1〉

功能:首先计算表达式的值,若第n个表达式的值为“真”(为非0),则执行语句n,若所有的表达式的值都为“假”(为0),则执行语句n+1。其流程图如下:

例如:

if(score>89) grade=‘5’;

else if(score>74) grade=‘4’;

else if(score>59) grade=‘3’;

else grade=‘2’;

说明:

(1)if语句中的表达式可以是C语言的合法表达式。

(2)第二种、第三种格式的if语句中,在每个else前面有一个分号,整个语句结束处也有一个分号。这是由于分号是C语句中不可缺少的部分,这个分号是if语句中的内嵌语句所要求的。

(3)在if和else后面可以只含有一个内嵌的操作语句,也可以含有多个操作语句,此时应用花括号“{ }“将几个语句括起来,构成一个复合语句。

例4.1 将两个数中较大者赋给 s。

main()

{

int a,b,s;

a=10;b=20;

if(a>b) s=a;

else s=b;

printf(“s=%dn”,s);

}

执行结果:

s=20

例4.2 比较两个数,按由大到小输出。

main( )

{

int a,b,x,y;

a = 10;

b = 20;

if (a>b) {x=a;y=b;}

else {x=b;y=a;}

printf(“x=%d,y=%dn”,x,y);

}

执行结果:

x=20,y=10

4.2.2 if语句的嵌套

在if 语句中又包含一个或多个if语句,称为if语句的嵌套。一般形式如下:

if( )

if( ) 〈语句1〉

else 〈语句2〉

else

if( ) 〈语句3〉

else 〈语句4〉

if( )

if( ) 〈语句1〉

else

if( ) 〈语句2〉

else 〈语句3〉

说明:

(1)if与else的配对关系,从最内层开始,else总是与离它最近的未曾配对的if配对。

(2)if与else的个数最好相同,从内层到外层一一对应,以避免出错。

(3)如果if与else的个数不相同,可以用花括号来确定配对关系。例如:

If ( )

{if( )〈语句1〉}

else

〈语句2〉

这时{ }限定了内嵌if 语句的范围,因此else与第一个if配对。

例4.3 有一函数

编一程序,输入一个x值,输出y 值。

main( )

{

int x,y;

scanf(“%d”,&x);

if(x<0) y=-1;

else if(x==0) y=0;

else y=1;

printf(“x=%d,y=%dn”,x,y);}

4.2.3 条件运算符

如果if语句的形式如下所示:

if(表达式1)

x=〈表达式2〉;

else

x=〈表达式2〉;

无论表达式1为“真”还是为“假”,都只执行一个赋值语句且给同一个变量赋值。

可以利用条件运算符,将这种语句简单地用如下语句来表示。

x=〈表达式1〉?〈表达式2〉:〈表达式3〉;

说明:即当表达式1的值为“真”时,将表达式2的值赋给变量x;当表达式1的值为“假”时,将表达式3的值赋给变量x。

如:

a=5,b=10,c=20;

x=a>b? c*b:c/b;

因为a>b为假,则x=c/b=2。

例4.4 输入两个数,并将其中较大者显示出来。

#include “stdio.h”

main( )

{ int a,b,max;

scanf(“%d%d”,&a,&b);

max=(a>b)? a:b;

printf(“max=%d”,max);

}

条件运算符也可以嵌套使用,如:

Grade=(score>=90)?’A’:(score<=70)?’C’:’B’当score>=90时,将字符‘A’赋给变量grade;

当score<=70时,将字符‘C’赋给变量grade;

否则将字符‘B’赋给变量grade.

4.3 switch语句

Switch语句是多分支选择语句,其一般形式如下:Switch(表达式)

{

case 〈常量表达式1〉:〈语句1〉

case 〈常量表达式2〉:〈语句2〉

case 〈常量表达式n〉:〈语句n〉

default:〈语句n+1〉

}

;

可同时省略

switch语句的执行过程是:首先计算switch后面圆括号内表达式的值,若此值等于某个case后面的常量表达式的值,则转向该case后面的语句去执行;若表达式的值不等于任何case后面的常量表达式的值, 则转向default后面的语句去执行,如果没有default部分,则将不执行switch语句中的任何语句,而直接转到switch语句后面的语句去执行。

说明:

(1) switch后面圆括号内的表达式的值和case后面的常量表达式的值,都必须是整型的或字符型的,不允许是浮点型的。

(2)同一个switch语句中 的所有case后面的常量表达式的值都必须互不相同。

(3) switch语句中的case和default的出现次序是任意的,也就是说default也可以位于case的前面,且case的次序也不要求按常量表达式的大小顺序排列。

(4)由于switch语句中的“case常量表达式”部分只起标号的作用,而不进行条件判断,所以,在执行完某个case后的语句后,将自动转到该语句后面的语句去执行,直到遇到switch语句的右花括号或“break”语句为此,而不再进行条件判断。

所以在执行完一个case分支后,一般应跳出switch语句,转到下一条语句执行,这样可在一个case的结束后,下一个case开始前,插入一个break语句,一但执行到braek语句,将立即跳出switch

语句,如:

如:

Switch(n)

{

case 1:

x=1;

case 2:

x=2;

}

当n=1时,将连续执行下面两个语句 :

X=1;

X=2;

如:

Switch(n)

{ case 1;

x=1;

Braek;

Case 2;

X=2

Braek

}

(5)每个case的后面即可以是一个句号,也可以是多个语句,当是多个语句的时候,也不需要用花括号括起来。

(6)多个case的后面可以共用一组执行语句,如:

Switch(n);

{

Case 1:

Case 2:

x=10;

braet

}

它表示当n=1或n=2时,都执行下列两个语句:

X=10;

Braek;

例4.5 从键盘输入一个月份(1~12),并显示该月份的英文名称

#include”stdio.h”

Main( )

{ int month;

scanf(“%d”,&month);

switch(month)

{ case 1:printf(“January”);

braek;

case 2:printf(“February”);

braek;

case 3:printf(“March”);

braek;

case 4:printf(“April”);

braek;

case 5:printf(“May”);

braek;

case 6:printf(“June”);

braek;

case 7:printf(“July”);

braek;

case 8:printf(“August”);

braek;

case 9:printf(“September”);

braek;

case 10:printf(“October”);

braek;

case 11:printf(“November”);

braek;

case 12:printf(“Decmeber”);

braek;

Default:printf(“Data Error!”);

Break;

}

}

4.4 应用举例

例4.6 输入一个数值,求出它的平方根,若为负数时,求出它的复数平方根。

#include “stdio.h”

#include “math.h”

main( )

{ int n;

float root;

printf(“enter a number:t”);

scanf(“%d”,&n);

if(n>=0);

{ root=sqrt(n);printf(“sqrt(%d)=%f”,n,root); }

else

{

root=sqrt(abs(n));

printf(“sqrt(%d)=%fi”,n,root); }

}

例4.7求两个数中最小值。

#include “stdio.h”

main()

{int x,y,min;

printf(“enter two integers:n”);

acanf(“%d,%d,&x,&y);

min=x

printf(“Min=%d”,min);

}

例4.8 从键盘输入一个操作符并进行相应和操作。

#include “stdio.h”

main()

{ int x=10,y=5,z;

char op;

scanf(“%c”,&op);

switch(op)

{

case ’+’:z=x+y;braek;

case ’-’:z=x-y;braek;

case ’*’:z=x*y;braek;

case ’/’:z=x/y;braek;

default :printf(“Operater Error!”);

}

printf(%d%c%d=%d”,x,op,y,z);

}

例4.9 输入三个数,按由小到大的顺序输出。

#include “stdio.h”

main()

{ int a,b,c,temp;

printf(“enter three integers:t”);

scanf(“%d,%d,%d”,&a,&b.&c);

if(a>c) {temp=a;a=b;b=temp;}

If(a>c) {temp=a;a=c;c=temp;}

if(b>c) {temp=b;b=c;c=temp;}

printf(“%d<%d,%d”,a,b,c);

}

第六讲 循环控制

5.1 goto语句

5.2 while循环语句

5.3 do-while循环语句

5.4 for循环语句

5.2 while循环语句

用while语句来实现“当型”循环结构。

格式:while(表达式)

〈语句〉 /*循环体部分*/

功能:当表达式的值为非0时,执行while语句中的循环体。结构流程图如图所示。

说明:

(1)循环体如果包含一个以上语句,应该用花括弧括起来,以复合语句的形式出现,否则while语句范围只到while后面第一个分号处。

(2)在循环体中应有使循环趋向于结束的语句,即设置修改循环条件的语句。

(3)while语句的特点是先判断表达式的值,然后执行循环体中的语句,如果表达式的值一开始为假(值为0),退出循环,并转入下一语句去执行。

例5.2 求s=1+2+3+…100的值。

结构流程图如右图。

main( )

{ int i,s=0;

i=1;

While (i<=100);

{s=s+1;

i++;

}

printf(“s=%d”,s);

}

运行结果

s=5050

5.3 do-while循环语句

do-while循环语句,用来实现“直到型”循环结构。

格式:do

<语句>

while(表达式)

功能:先执行〈语句〉,后判断表达式的值。它的执行过程是:先执行一次指定的语句,然后判断表达式的值,当表达式的值为非零(”真“)时,返回重新执行该语句,如此反复,直到表达式的值等于0为此止,此时循环结束。

0(假)

说明:

(1)用while语句和用do-while语句处理同一问题时,若二者的循环体部分一样,其结果也一样。但在while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。

(2)如果do-while语句的循环体部分是多个语句组成的话,则必须


本文标签: 语句 表达式 运算符 变量