C语言程序设计
2021-12-22 09:29:20 31 举报
AI智能生成
思维导图
作者其他创作
大纲/内容
第四章:分支结构程序数据
关系运算符、逻辑运算符、条件运算符
关系运算符和关系表达式
1. 关系运算符
运算符 含义
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
运算符 含义
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
注意:
(1)关系运算符都是双目运算符,其结合方向是左结合
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符。
(3)关系运算符中,>、<、>=、<=的优先级相同,==、!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“==”。
(1)关系运算符都是双目运算符,其结合方向是左结合
(2)关系运算符的优先级低于算术运算符,但是高于赋值运算符。
(3)关系运算符中,>、<、>=、<=的优先级相同,==、!=的优先级相同,前者的优先级高于后者,即“>=”的优先级高于“==”。
2. 关系表达式
用关系运算符将两个表达式连接起来的式子称为关系表达式。关系表达式的一般形式为
表达式 1 关系运算符 表达式 2
功能:比较两个表达式的大小,返回一个逻辑值。
例如:“a+b>=c-d”、“x<=3/2”、“ 'a'+!=c”、“-i-5*j==k+1”都是合法的关系表达式。
关系表达式中允许出现嵌套的情况,例如“ a>b>c”、“a!=(c==d)”等。
用关系运算符将两个表达式连接起来的式子称为关系表达式。关系表达式的一般形式为
表达式 1 关系运算符 表达式 2
功能:比较两个表达式的大小,返回一个逻辑值。
例如:“a+b>=c-d”、“x<=3/2”、“ 'a'+!=c”、“-i-5*j==k+1”都是合法的关系表达式。
关系表达式中允许出现嵌套的情况,例如“ a>b>c”、“a!=(c==d)”等。
注意:
(1)注意区分运算符“=”和“==”。“=”是赋值运算符,“==”是关系运算符。
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==1.0”的结果为0。
(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形式。因为关系运算符的优先级高于赋值运算符,表达式“a>b=0”相当于”(a>b)=0“,赋值运算符左不是变量,会出现编译错误。
关系表达式主要用于分支结构中的条件判断。关系表达式的结构是一个逻辑值“真”或“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”。例如关系表达式“(a=3)>(b=8)”的值为0。
(1)注意区分运算符“=”和“==”。“=”是赋值运算符,“==”是关系运算符。
(2)对实数进行相等判断可能得不到正确的结果,例如“1.0/3*3.0==1.0”的结果为0。
(3)关系表达式中可以出现赋值运算符,如“a>(b=0)”,但是不能写成“a>b=0”的形式。因为关系运算符的优先级高于赋值运算符,表达式“a>b=0”相当于”(a>b)=0“,赋值运算符左不是变量,会出现编译错误。
关系表达式主要用于分支结构中的条件判断。关系表达式的结构是一个逻辑值“真”或“假”,由于C语言中没有逻辑类型的数据,因此用“1”表示“真”,“0”表示“假”。例如关系表达式“(a=3)>(b=8)”的值为0。
逻辑运算符和逻辑表达式
1. 逻辑运算符
表4.2 逻辑运算符
运算符 ! && ||
名称 逻辑非 逻辑和 逻辑或
结合性 右结合 左结合 左结合
优先级 高 》 》 》 低
表4.2 逻辑运算符
运算符 ! && ||
名称 逻辑非 逻辑和 逻辑或
结合性 右结合 左结合 左结合
优先级 高 》 》 》 低
2. 逻辑表达式
用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式。逻辑表达式的一般形式为:
表达式 1 逻辑运算符 表达式 2
或
逻辑运算符 表达式 1
逻辑表达式的结果也是一个逻辑值“真”或“假”,即为“1”或“0”。逻辑运算的真值表如表 4.3 所示。
表 4.3 逻辑运算符的真值表
x y !x x&&y x||y
0 0 1 0 0
0 非0 1 0 1
非0 0 0 0 1
非0 非0 0 1 1
用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式。逻辑表达式的一般形式为:
表达式 1 逻辑运算符 表达式 2
或
逻辑运算符 表达式 1
逻辑表达式的结果也是一个逻辑值“真”或“假”,即为“1”或“0”。逻辑运算的真值表如表 4.3 所示。
表 4.3 逻辑运算符的真值表
x y !x x&&y x||y
0 0 1 0 0
0 非0 1 0 1
非0 0 0 0 1
非0 非0 0 1 1
关于逻辑表达式的说明:
(1)参与逻辑运算的数据可以是1和0,也可以是非零值和0,还可以是任何类型的数据,但最终都是以非0和0来判断他们是“真”或“假”。
(2)在逻辑表达式中也可以使用赋值运算符,如“a&&(b=0)”,但是不能写成“a&&b=0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a&&b=0”相当于“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误。
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式的值就确定了整个逻辑表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式值时,此后就不再计算右边的式子,这种情况称为“短路”。
①对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再进行运算;只有当“&&”左边的表达式值为真时才计算右边表达式的值。
②对于逻辑与(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再进行运算;只有当“||”左边的表达式值为假时才计算右边表达式的值。
(1)参与逻辑运算的数据可以是1和0,也可以是非零值和0,还可以是任何类型的数据,但最终都是以非0和0来判断他们是“真”或“假”。
(2)在逻辑表达式中也可以使用赋值运算符,如“a&&(b=0)”,但是不能写成“a&&b=0”的形式。因为逻辑运算符的优先级高于赋值运算符,表达式“a&&b=0”相当于“(a&&b)=0”,赋值运算符左边不是变量,会出现编译错误。
(3)C语言规定,只对决定整个表达式值所需的最少数目的子表达式的值就确定了整个逻辑表达式组成的逻辑表达式中,从左向右计算,当计算出一个子表达式的值就确定了整个逻辑表达式值时,此后就不再计算右边的式子,这种情况称为“短路”。
①对于逻辑与(&&)运算,若“&&”左边的表达式的值为假,则可以得出整个表达式的值为假,那么“&&”右边的表达式将不再进行运算;只有当“&&”左边的表达式值为真时才计算右边表达式的值。
②对于逻辑与(||)运算,若“||”左边的表达式的值为真,则可以得出整个表达式的值为真,那么“||”右边的表达式将不再进行运算;只有当“||”左边的表达式值为假时才计算右边表达式的值。
算术运算符、关系运算符即逻辑运算符的优先级从高到低的顺序如表4.4所示。全部运算符的优先级和结合性见附录 B。
表 4.4 各种运算符的优先级从高到低的顺序
运算符 ! 算术运算符 关系运算符 &&和|| 赋值运算符
结合性 右结合 左结合 左结合 左结合 右结合
优先级 高 》 》 》 》 》 》 》 》》 》 》 》 》 》 低
逻辑表达式举例:
① ch是英文字母。逻辑表达式为(ch>='a' && ch<='z')|| (ch>='A' && ch<='Z')。
②a,b 不同时为 0。逻辑表达式为(a==0&&b==0)或 a!=0 || b!=0 或a || b。
③ch是空格或回车。逻辑表达式为(ch==' '||(ch=='\n'))。
④year是闰年,即year能被4整除但不能被100整除,或year能被400整除。逻辑表达式为(year%4==0 && year%100!=0)||(year%400==0)。
表 4.4 各种运算符的优先级从高到低的顺序
运算符 ! 算术运算符 关系运算符 &&和|| 赋值运算符
结合性 右结合 左结合 左结合 左结合 右结合
优先级 高 》 》 》 》 》 》 》 》》 》 》 》 》 》 低
逻辑表达式举例:
① ch是英文字母。逻辑表达式为(ch>='a' && ch<='z')|| (ch>='A' && ch<='Z')。
②a,b 不同时为 0。逻辑表达式为(a==0&&b==0)或 a!=0 || b!=0 或a || b。
③ch是空格或回车。逻辑表达式为(ch==' '||(ch=='\n'))。
④year是闰年,即year能被4整除但不能被100整除,或year能被400整除。逻辑表达式为(year%4==0 && year%100!=0)||(year%400==0)。
条件运算符和条件表达式
1. 条件运算符
条件运算符由“?”和“:”两个符号组成,用于条件求值,它是一个三目运算符,需要三个操作数。条件运算符的优先级低于逻辑运算符、高于赋值运算符,它是右结合的。
2. 条件表达式
由条件运算符将3个表达式连接起来的式子称为条件表达式,其一般形式为:
表达式 1 ? 表达式2:表达式3
条件表达式的执行顺序是:先计算表达式 1 的值,若值为非0,表达式为真。则将表达式 2 的值作为整个表达式的值,否则将表达式 3 的值作为整个表达式的值。
表达式 1 ? 表达式2:表达式3
条件表达式的执行顺序是:先计算表达式 1 的值,若值为非0,表达式为真。则将表达式 2 的值作为整个表达式的值,否则将表达式 3 的值作为整个表达式的值。
关于条件表达式的说明:
(1)条件表达式中表达式 1 的类型可以与表达式 2 和表达式 3 不同,表达式 2 和表达式 3的类型也可以不同,此时系统会自动进行转换,结果为表达式 2 和表达式 3a>b 中级别类型较高的,并将其作为条件表达式的类型。例如条件表达式“ 'a'?1:2.0 ”的结果为 double 型的1.0.
(2)条件表达式中表达式 2 和表达式 3 不仅可以是数值表达式,还可以是赋值表达式或函数表达式,如“a>b?b=3:(c=4)”,但是不能写成“a>b?b=3:c=4”的形式。这是由于在表达式“a>b?b=3:c=4”中,条件运算符的优先级高于赋值运算符,上述表达式相当于“(a>b?b=3:c)=4”,因赋值运算符左边不是变量,所以会出现编译错误。
(3)条件表达式允许嵌套,例如“a>3?b:c>2?1:0”,根据条件表达式的结合性,它相当于“a>3?b:(c>2?1:0)”。
(1)条件表达式中表达式 1 的类型可以与表达式 2 和表达式 3 不同,表达式 2 和表达式 3的类型也可以不同,此时系统会自动进行转换,结果为表达式 2 和表达式 3a>b 中级别类型较高的,并将其作为条件表达式的类型。例如条件表达式“ 'a'?1:2.0 ”的结果为 double 型的1.0.
(2)条件表达式中表达式 2 和表达式 3 不仅可以是数值表达式,还可以是赋值表达式或函数表达式,如“a>b?b=3:(c=4)”,但是不能写成“a>b?b=3:c=4”的形式。这是由于在表达式“a>b?b=3:c=4”中,条件运算符的优先级高于赋值运算符,上述表达式相当于“(a>b?b=3:c)=4”,因赋值运算符左边不是变量,所以会出现编译错误。
(3)条件表达式允许嵌套,例如“a>3?b:c>2?1:0”,根据条件表达式的结合性,它相当于“a>3?b:(c>2?1:0)”。
使用 if——else 实现分支结构
if——else 语句
1. 双分支 if 语句
其一般形式如下:
if(表达式)
语句 1 ;
else
语句 2 ;
if(表达式)
语句 1 ;
else
语句 2 ;
2. 单分支 if 语句
其一般形式如下:
if (表达式)
语句;
if (表达式)
语句;
if 语句的嵌套
一个 if 语句中又包含一个或多个 if 语句的现象称为 if 语句的嵌套。
if 语句的基本形式:
if (表达式)
语句 1 ;
else
语句2;
其中“语句1”或“语句2”都可以嵌套另一个 if 语句,在缺省 else 部分的 if 语句中的“语句”也可以嵌套另一个 if 语句。因此,具体嵌套形式可以有很多种。如
if (表达式1)
if(表达式2)
语句1; }
else } 语句 1 嵌套的 if 语句
语句2; }
else
if (表达式3)
语句3; }
else } 语句 2 嵌套的 if 语句
语句4; }
if 语句的基本形式:
if (表达式)
语句 1 ;
else
语句2;
其中“语句1”或“语句2”都可以嵌套另一个 if 语句,在缺省 else 部分的 if 语句中的“语句”也可以嵌套另一个 if 语句。因此,具体嵌套形式可以有很多种。如
if (表达式1)
if(表达式2)
语句1; }
else } 语句 1 嵌套的 if 语句
语句2; }
else
if (表达式3)
语句3; }
else } 语句 2 嵌套的 if 语句
语句4; }
多分支 if 语句
多分支 if 语句是最常用的实现多路分支的方法,其一般形式如下:
if(表达式1)
语句 1 ;
else if (表达式2)
语句 2 ;
...
else if (表达式n-1)
语句 n-1 ;
else
语句 n ;
if(表达式1)
语句 1 ;
else if (表达式2)
语句 2 ;
...
else if (表达式n-1)
语句 n-1 ;
else
语句 n ;
使用 switch 语句实现分支结构
在C语言中还提供了一种 switch 语句也可以实现多分支的选择。
switch 语句的一般形式如下:
switch (表达式)
{
case 常量表达式 1:语句 1;break;
case 常量表达式 2:语句 2;break;
...
case 常量表达式 n: 语句 n ;break;
default:语句 n+1;break;
}
switch 语句的一般形式如下:
switch (表达式)
{
case 常量表达式 1:语句 1;break;
case 常量表达式 2:语句 2;break;
...
case 常量表达式 n: 语句 n ;break;
default:语句 n+1;break;
}
关于 switch 语句的几点说明:
(1)switch 后的表达式可以是任何表达式,其值只能为整型、字符型、枚举型(见9.8节)之一。
(2)每个 case后面的常量表达式的值互不相同,否则就出现互相矛盾的现象。
(3)各个 case和 default 的出现次序不影响执行结果。
(4)可以让多个 case 共用一组执行语句 。
(5) switch 语句允许嵌套使用。
(1)switch 后的表达式可以是任何表达式,其值只能为整型、字符型、枚举型(见9.8节)之一。
(2)每个 case后面的常量表达式的值互不相同,否则就出现互相矛盾的现象。
(3)各个 case和 default 的出现次序不影响执行结果。
(4)可以让多个 case 共用一组执行语句 。
(5) switch 语句允许嵌套使用。
switch 语句中不使用 break 语句时,程序在执行相应语句后,不会跳出正在执行的 switch 语句,而会继续执行其后的所有语句。
第五章:循环结构程序设计
使用 for 语句实现循环结构
for 语句的基本语法
for 语句的一般形式为:
for (表达式1;表达式2;表达式3)
循环体语句;
for (表达式1;表达式2;表达式3)
循环体语句;
for 语句的执行过程如下:
① 首先计算表达式1。
② 判断表达式2,若其值为真(非0),则执行循环体语句,然后执行第③步;若值为假(0),结束循环,转到第⑤步执行。
③ 计算表达式3。
④ 返回第②步继续执行。
⑤ 循环结束,继续执行 for 语句的下一条语句。
大部分情况下,循环体语句为一复合语句。
① 首先计算表达式1。
② 判断表达式2,若其值为真(非0),则执行循环体语句,然后执行第③步;若值为假(0),结束循环,转到第⑤步执行。
③ 计算表达式3。
④ 返回第②步继续执行。
⑤ 循环结束,继续执行 for 语句的下一条语句。
大部分情况下,循环体语句为一复合语句。
1. 可以应用于计算型的循环
格式如下:
for(循环变量赋初值;循环条件;循环变量增量)
循环体语句;
for(循环变量赋初值;循环条件;循环变量增量)
循环体语句;
说明:循环变量赋初值是一个赋值语句,用于给循环变量赋初值;循环条件是一个关系表达式,决定何时终止循环(即确定循环的终值);循环变量增量决定循环变量在完成一次循环后如何变化。三部分之间以“ ;” 隔开。
2. for 语句的一般形式中省略表达式 1
格式如下:
for(;表达式 2;表达式 3)
循环体语句;
for(;表达式 2;表达式 3)
循环体语句;
说明:省略表达式 1 时,可以将循环变量赋初值放在 for之前。注意,此时不能省略第一个“ ;”。
3. for 语句的一般形式中省略表达式 2
for(表达式1;表达式 3)
循环体语句;
循环体语句;
说明:省略表达式 2 时,表示不对循环进行控制,这时如果没有其它处理的话,会形成死循环。应避免这样使用 for 结构。
4. for 语句的一般形式中省略表达式 3
格式如下:
for(表达式1;表达式 2 ;)
循环体语句;
for(表达式1;表达式 2 ;)
循环体语句;
说明:省略表达式 3 时,可以在循环体语句中加入修改循环变量的值的语句。
5. for 语句的一般形式中表达式1 和表达式 3 也可以是逗号表达式
6. for 语句的一般形式中表达式 2 的值只要非0,就执行循环体
7. for 语句的一般形式中循环体语句可以省略
使用 while 语句实现循环结构
while 语句的基本语法
while 语句在使用时,总是先要判断一个条件,所以可以用 while 语句实现“当型”循环。while 语句的一般形式如下:
while(表达式)
循环体;
while(表达式)
循环体;
第一步:计算表达式的值,若表达式的值为“真”,则执行第二步;若表达式的值为“假”,则转到第四步。
第二步:执行循环体语句。
第三步:返回第一步。
第四步:结束循环,执行 while 语句的下一条语句。
注意,while 语句的特点是先判断循环条件,后执行循环体。
第二步:执行循环体语句。
第三步:返回第一步。
第四步:结束循环,执行 while 语句的下一条语句。
注意,while 语句的特点是先判断循环条件,后执行循环体。
使用 d0—while 语句实现循环结构
do—while 语句的基本语法
do—while 语句的一般形式如下:
do
循环体
while (表达式);
do
循环体
while (表达式);
第一步:执行循环体语句。
第二步:计算表达式的值,若表达式的值,若表达式的值为“真”(非0),返回第一步;若表达式的值为“假”(0),则执行第三步。
第三步:结束循环,执行 do—while语句的下一条语句。
注意,do—while 语句的特点是先执行循环体,后判断循环条件。因此,do—while循环 至少要执行一次循环体。
第二步:计算表达式的值,若表达式的值,若表达式的值为“真”(非0),返回第一步;若表达式的值为“假”(0),则执行第三步。
第三步:结束循环,执行 do—while语句的下一条语句。
注意,do—while 语句的特点是先执行循环体,后判断循环条件。因此,do—while循环 至少要执行一次循环体。
改变循环结构的跳转语句
break语句
break 语句用在循环语句和 switch 语句中。 在 switch 语句中的用法第 4 章已经介绍,这里介绍它的用法
break 语句的一般形式如下:
break;
当 break 语句用于在循环语句中时,可使程序终止循环语句的后继语句。
通常 break 语句总是与 if 语句一起配合使用,既满足条件时便跳出循环。
break 语句的一般形式如下:
break;
当 break 语句用于在循环语句中时,可使程序终止循环语句的后继语句。
通常 break 语句总是与 if 语句一起配合使用,既满足条件时便跳出循环。
continue 语句
continue 语句的作用是跳过循环体中 continue 后面的语句,继续下一次循环,continue 语句只能用在循环语句中,常与 if 语句一起使用。
continue 语句的一般形式如下:
continue;
continue 语句的一般形式如下:
continue;
goto 语句
说明:语句标号是一个有效的标识符,使用时在语句标号的后面跟一个“ :”出现在函数中某语句的前面。程序执行到 goto 语句时,会控制跳转到该语句标号处,达到控制循环的目的。
循环嵌套
使用循环嵌套时,注意以下几点:
(1)外循环执行一次,内循环要执行一轮。即外循环执行一次,内循环一直要执行到条件不满足时为一轮;再执行外循环一次,内循环又一直执行到条件不满足时为二轮;如此重复执行,知道外循环条件不满足时,整个循环嵌套结束。
(2)循环嵌套格式中的内循环体不允许出现交叉,即外循环要完全包含内循环。
(3)循环嵌套时,内循环中使用 break 语句和 continue 语句时,只影响包含他们的内循环,与外循环无关。
(1)外循环执行一次,内循环要执行一轮。即外循环执行一次,内循环一直要执行到条件不满足时为一轮;再执行外循环一次,内循环又一直执行到条件不满足时为二轮;如此重复执行,知道外循环条件不满足时,整个循环嵌套结束。
(2)循环嵌套格式中的内循环体不允许出现交叉,即外循环要完全包含内循环。
(3)循环嵌套时,内循环中使用 break 语句和 continue 语句时,只影响包含他们的内循环,与外循环无关。
典型算法举例
递推法
【例5.29】猴子吃桃问题:猴子第一天摘下若干个桃子,吃了一半,还觉得不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上时,只剩下一个桃子了。问第一天共摘了多少个桃子。
迭代法
用牛顿迭代法求方程附近的根
穷举法
搬砖问题:36块砖,36人搬。男搬4、女搬3、俩小孩抬一砖,要求一次全搬完,问男、女、小孩若干?
第一章:程序设计与C 语言
程序与程序设计语言
程序设计语言的发展
机器语言
采用的是二进制 难学、难记、难修改
采用的是二进制 难学、难记、难修改
汇编语言
采用助记符来替代机器指令的二进制串 汇编语言同样十分依赖机器硬件,可移植性不好
采用助记符来替代机器指令的二进制串 汇编语言同样十分依赖机器硬件,可移植性不好
高级语言
所用的运算符和运算表达式与人们日常所用的数学式子差不多,很容易理解
所用的运算符和运算表达式与人们日常所用的数学式子差不多,很容易理解
非结构化的语言
编程风格比较随意,没有编程规范可以遵循,程序中的流程可以随意跳转
编程风格比较随意,没有编程规范可以遵循,程序中的流程可以随意跳转
结构化语言
QBASIC、Pascal和C都属于结构化语言
QBASIC、Pascal和C都属于结构化语言
面向对象语言
C++、C#、Visual Basic和Java等语言均是支持面向对象程序设计方法的语言。
C++、C#、Visual Basic和Java等语言均是支持面向对象程序设计方法的语言。
程序设计语言的功能
数据表达
流程控制
顺序控制结构
分支控制结构
这三种结构的共同特点是:
①只有单一的入口和单一的出口
②结构中的每个部分都有被执行的可能
③结构中不应出现永不终止的死循环
①只有单一的入口和单一的出口
②结构中的每个部分都有被执行的可能
③结构中不应出现永不终止的死循环
循环控制结构
程序的算法表示:“软件的主体是程序,程序的核心是算法” 算法是解决问题的方法与步骤
(1)确定性(2)有穷性(3)可行性(4)有零个或多个输入(5)有一个或多个输出
(1)确定性(2)有穷性(3)可行性(4)有零个或多个输入(5)有一个或多个输出
用文字描述算法
用流程图描述算法
伪代码表示
程序设计语言表示
C语言程序设计的特点
C语言的发展历史
C语言的特点:(1)C语言语句简洁紧凑,使用方便灵活。
(2)运算符丰富,表达能力强。
(3)C语言程序可移植性好。
(4)生成的目标代码质量高,运行效率高。
(5)需要处理能力强。
(6)C语言是一种结构化语言
不足之处:C语言对语法检查不严格, C语言运算符较多
(2)运算符丰富,表达能力强。
(3)C语言程序可移植性好。
(4)生成的目标代码质量高,运行效率高。
(5)需要处理能力强。
(6)C语言是一种结构化语言
不足之处:C语言对语法检查不严格, C语言运算符较多
C语言的约定:
(1)标识符
C语言的标识符由字母,数字和下划线组成,其中第一个字符必须是字母或下划线。
(2)关键字
C语言中共有32个关键字
(3)用户自定义标识符
(4)预定义标识符(列如 scanf、print等)
(5)分隔符
分隔各个变量。空格多用于各单词之间作间隔符
(1)标识符
C语言的标识符由字母,数字和下划线组成,其中第一个字符必须是字母或下划线。
(2)关键字
C语言中共有32个关键字
(3)用户自定义标识符
(4)预定义标识符(列如 scanf、print等)
(5)分隔符
分隔各个变量。空格多用于各单词之间作间隔符
C语言的语法成分:
(1)常量
(2)变量
(3)运算符
(4)表达式。
(5)语句。在C语言中,语句是程序最基本的执行单位,以分号结尾
(6)函数定义与调用
(7)输入与输出
(1)常量
(2)变量
(3)运算符
(4)表达式。
(5)语句。在C语言中,语句是程序最基本的执行单位,以分号结尾
(6)函数定义与调用
(7)输入与输出
C语言的编辑、翻译、链接、和运行
程序设计的任务
(1)分析问题
(2)设计算法
(3)程序设计
(4)运行并调试程序
(5)分析程序运行结果
(6)编写程序文档
(1)分析问题
(2)设计算法
(3)程序设计
(4)运行并调试程序
(5)分析程序运行结果
(6)编写程序文档
运行C程序的步骤与方法
第二章:数据类型、运算符和表达式
C语言的数据类型
数据类型
基本类型
整型
字符型
实型(浮点型)
构造类型
数据类型
结构体类型
共用体类型
枚举类型
指针类型
空类型
C语言的常量
直接常量
1.整型常量
整型常量即整数,包括正整数、负整数和零。C语音中,整型常量可以用十进制、八进制和十六进制表示。
十进制表示:由数字0~9,正,负号组成,如369,—663等;
八进制表示:以0(数字0)为前缀,其后由数字0~7组成,如0163,036等;八进制数一般是无符号数。如0192、—011都是不合法的八进制常量。
十六进制表示:以0x或0X为前缀,其后由数字0~9和字母A~F(字母大小写均可)组成,如0x12cd,0X6Fa等。十六进制数一般是无符号数。
注意:
(1)在一个整型常量后面加一个字母u或U,认为是unsigned int型,如246U。
(2)在一个整型常量后面加一个字母l或L,认为是long int型,如12L。
整型常量即整数,包括正整数、负整数和零。C语音中,整型常量可以用十进制、八进制和十六进制表示。
十进制表示:由数字0~9,正,负号组成,如369,—663等;
八进制表示:以0(数字0)为前缀,其后由数字0~7组成,如0163,036等;八进制数一般是无符号数。如0192、—011都是不合法的八进制常量。
十六进制表示:以0x或0X为前缀,其后由数字0~9和字母A~F(字母大小写均可)组成,如0x12cd,0X6Fa等。十六进制数一般是无符号数。
注意:
(1)在一个整型常量后面加一个字母u或U,认为是unsigned int型,如246U。
(2)在一个整型常量后面加一个字母l或L,认为是long int型,如12L。
2.实型常量
实型常量即实数,又称为浮点数。C语言中,实数只能用十进制式表示,实数的表示方法有两种:小数形式和指数形式。
(1)小数形式:有整数部分、小数点和小数部分组成,当整数部分或者小数部分为0时,可以省略不写,但是小数点不可省略。如12.345,3.,—,123等均为正确的实数。
(2)指数形式:由尾数部分、字母E或e和指数部分组成,格式为:±尾数E指数。如1.23E—2、3.14E+3等。
注意:
(1)以小数形式表示实数时,必须有小数点,并且小数点的前后至少一边要有数字。
(2)以指数形式表示实数时,字母E(或e)的前后必须有数字,并且指数部分只能是整数。如12.—E3、1.5E、E6都是不正确的实数。
在C语音中,实型常量默认为是double型的实数、如果在数的后面加字母f或F(如1.65f、654.87F),则认为是float型的实数。
实型常量即实数,又称为浮点数。C语言中,实数只能用十进制式表示,实数的表示方法有两种:小数形式和指数形式。
(1)小数形式:有整数部分、小数点和小数部分组成,当整数部分或者小数部分为0时,可以省略不写,但是小数点不可省略。如12.345,3.,—,123等均为正确的实数。
(2)指数形式:由尾数部分、字母E或e和指数部分组成,格式为:±尾数E指数。如1.23E—2、3.14E+3等。
注意:
(1)以小数形式表示实数时,必须有小数点,并且小数点的前后至少一边要有数字。
(2)以指数形式表示实数时,字母E(或e)的前后必须有数字,并且指数部分只能是整数。如12.—E3、1.5E、E6都是不正确的实数。
在C语音中,实型常量默认为是double型的实数、如果在数的后面加字母f或F(如1.65f、654.87F),则认为是float型的实数。
3.字符型常量
(1)字符常量只能用单引号括起来,不能用双引号或其他括号。
(2)字符常量只能是单个字符,不能是字符串。
使用字符常量时,每个字符在内存占用一个字符,
(1)字符常量只能用单引号括起来,不能用双引号或其他括号。
(2)字符常量只能是单个字符,不能是字符串。
使用字符常量时,每个字符在内存占用一个字符,
4.字符串常量
字符串常量是由一对双引号“ ”括起来的零个或多个字符序列
字符串中可以使用空格字符、转义字符和其他字符,也可以使用汉字等文字符号。
字符串常量在内存中占用一段连续的存储单元,系统自动在每个字符串的尾部加上’\0’作为字符串的结束标志。
字符串常量是由一对双引号“ ”括起来的零个或多个字符序列
字符串中可以使用空格字符、转义字符和其他字符,也可以使用汉字等文字符号。
字符串常量在内存中占用一段连续的存储单元,系统自动在每个字符串的尾部加上’\0’作为字符串的结束标志。
符号常量
(1)增加程序的可读性
(2)提高程序的可维护性
(3)简化程序代码
(4)方便数组的定义
C语言的变量
变量的定义与使用
1.变量的定义
(1)类型说明符必须是C语音中的有效数据类型,如int float double char等,用于指定变量的类型,该类型决定了编译时分配给变量的内存单元的多少。
(2)变量名表可以由一个或多个变量名组成,各变量名之间用“,”分隔。
(1)类型说明符必须是C语音中的有效数据类型,如int float double char等,用于指定变量的类型,该类型决定了编译时分配给变量的内存单元的多少。
(2)变量名表可以由一个或多个变量名组成,各变量名之间用“,”分隔。
2.变量的初始化
C语音允许在定义变量的同时对变量赋值,这个过程称为变量的初始化。
C语音允许在定义变量的同时对变量赋值,这个过程称为变量的初始化。
整型变量
实型变量
字符型常量
字符型变量的类型说明符是char
运算符和表达式
赋值运算符和赋值表达式
算术运算符和算术表达式
1.基本的算求运算符
2.自增、自减运算符
C语音有两个特殊运算符“++”和“--”。
(1)++自增运算符,为单目运算符,其功能是使变量的值自加1。自增运算符有两种使用形式
①前缀方式:用于产量前面,如“int=++x”;它是“先计算,后使用”,即先将x的值自加1,然后将x的值赋给变量a。
②后缀方式:用于变量后面,如“int=x++”它是“先使用,后计算”,即先将x的值赋给变量a,然后再将x的值自加1。
C语音有两个特殊运算符“++”和“--”。
(1)++自增运算符,为单目运算符,其功能是使变量的值自加1。自增运算符有两种使用形式
①前缀方式:用于产量前面,如“int=++x”;它是“先计算,后使用”,即先将x的值自加1,然后将x的值赋给变量a。
②后缀方式:用于变量后面,如“int=x++”它是“先使用,后计算”,即先将x的值赋给变量a,然后再将x的值自加1。
数据类型转换
1.自动型转换
2. 强制类型转换
强制类型转换是采用强制类型转换运算符将某种数据类型转换成指定的数据类型,其一般形式为
(类型说明符)(表达式)
进行强制类型转换时需注意:
(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换
(2)强制类型转换是一种不安全的转换,如果是从高级类型换成低级类型。则会损失数据的精度。
(3)强制类型转换并不改变表达式变量的类型和值。
(类型说明符)(表达式)
进行强制类型转换时需注意:
(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换
(2)强制类型转换是一种不安全的转换,如果是从高级类型换成低级类型。则会损失数据的精度。
(3)强制类型转换并不改变表达式变量的类型和值。
第三章:顺序结构程序设计
C语言语句
1.说明语句
说明语句用于定义程序所用的变量与类型。
2.表达式语句
表达式语句由表达式加上分号“;”组成。其一般形式如下:
表达式;
例如:
c=a+b
是一个赋值表达式,而
c=a+b;
则是一个表达式语句。
表达式;
例如:
c=a+b
是一个赋值表达式,而
c=a+b;
则是一个表达式语句。
3.分支语句
分支语句实现分支控制过程,根据条件成立与否Z执行不同的语句。有两种分支结构,即双分支 if-else语句与多分支的switch语句。
4.循环语句
C语言中实现循环控制的语句有3种,即 for语句、while语句和do-while语句。
5.转向语句
转向语句有break语句、goto语句、continue语句、return语句。
6.复合语句
用一对大括号{ }将若干语句顺序组合在一起所形成的语句称为复合语句。C语言中,除复合语句外的其他所有语句都以分号结束。
7.空语句
空语句只有一个分号构成。
8.函数定义与调用
函数是完成特定功能的小模块,是C语言中唯一的一种子程序,常常在一个C程序中包含若干个函数,复杂的任务通过调用这些函数来完成。
9.输入与输出
C语言没有提供用于数据输入及输出的语句,所有的输入与输出都是通过系统提供的有关函数(如scanf( )和printf( )函数)来实现
数据的输入与输出
输入函数(printf( ))和输出函数(scanf( ))
1. printf()函数
printf()函数是系统提供的用于在标准输出设备(屏幕)输出数据的库函数,其一般调用格式为:
pintf("格式控制字符串“,输出项表例)
格式控制字符串用双引号括起来,表示输出的格式;而输出项表列则是要输出的数据,这些数据可以是常量、变量或表达式。
格式控制字符串中包含两种信息,格式控制说明和普通字符。
printf()函数是系统提供的用于在标准输出设备(屏幕)输出数据的库函数,其一般调用格式为:
pintf("格式控制字符串“,输出项表例)
格式控制字符串用双引号括起来,表示输出的格式;而输出项表列则是要输出的数据,这些数据可以是常量、变量或表达式。
格式控制字符串中包含两种信息,格式控制说明和普通字符。
(1)格式控制说明:按指定的格式输出数据,其格式为以%开头的格式控制字符,不同类型的数据采用不同的格式控制字符,以说明输出数据的类型、形式、长度、小数位数等。例如,int 型数据采用%d,float 型和 double 型数据都采用%f
(2)普通字符:在输出数据时,需要原样输出的字符。
2. 使用printf( )函数进行数据输出需注意:
(1)格式字符与输出项的类型要一一对应,不同类型的数据所使用的格式字符不同。
(2)一般情况下,格式字符与输出项的个数应相同。如果格式字符的个数多于输出项的个数,则多余的格式将输出不确定的值;如果格式字符的个数少于输出项的个数,则多余的输出项将不能输出。
(3)printf( )函数中可以没有输出项,此时printf函数只用来输出一个字符串;也可以有多个输出项,多个输出项之间使用逗号进行分隔。若输出项是表达式时,printf( )函数将按从左到右的顺序计算出其值后输出
(4)若要在printf( )函数中输出字符“%”,则应在格式控制字符串中使用连续两个“%”。
3. scanf( )函数
scanf("格式控制字符串",输入项表列)
格式控制字符串用双引号括起来,表示输入的格式;而输入项表列指出各变量的地址(变量名前加&)。
格式控制字符串中包含两种信息,格式控制说明和普通字符。
scanf("格式控制字符串",输入项表列)
格式控制字符串用双引号括起来,表示输入的格式;而输入项表列指出各变量的地址(变量名前加&)。
格式控制字符串中包含两种信息,格式控制说明和普通字符。
(1)格式控制说明:按指定的格式输出数据,其格式为以%开头的格式控制字符,不同类型的数据采用不同的格式控制字符。例如,int 型数据采用%d,float 型数据采用%f,而 double 型数据都采用%lf (%lf其中的l是long 的首字母,不是数字1)。
(2)普通字符:在输入数据时,需要原样输出的字符。
注意scanf( )函数的输入参数必须和格式控制字符串中的格式控制说明相对应,并且它们的类型、个数和位置都要一一对应。若程序中有多个scanf( )函数时,程序会等待用户输入并有依次赋给相应变量。
例如,语句“scanf("%d",&a);”中的格式字符串“%d”指明了要输入数据的类型为十进制整型,输入项“&x”表明从键盘输入的数据将赋值给整型变量x。
例如,语句“scanf("%d",&a);”中的格式字符串“%d”指明了要输入数据的类型为十进制整型,输入项“&x”表明从键盘输入的数据将赋值给整型变量x。
4. 使用scanf( )函数进行数输入时需注意:
(1)格式字符与输入项的类型、个数要一一对应;输入项必须是地址,不能是变量名。
(2)格式字符可以指定输入数据所占列数,系统会截取相应列数的数据。
(3)在输入数据时遇到以下情况则认为数据输入结束:空格、Tab键、回车键、非法键入、指定宽度。用户也可以自己指定其他字符作为输入间隔。
整形数据的输入与输出
表3.1 printf()、scanf( )函数中的格式字符(整型数据)
格式字符 含义
d 以十进制形式输入/输出带符号整形
o 以八进制形式输入/输出无符号整形
x,X 以十六进制形式输入/输无带符号整形
u 以十进制形式输入/输出无符号整形
格式字符 含义
d 以十进制形式输入/输出带符号整形
o 以八进制形式输入/输出无符号整形
x,X 以十六进制形式输入/输无带符号整形
u 以十进制形式输入/输出无符号整形
表3.2 printf()函数中的格式修饰符
格式字符 含义
l
用于输出长整型
—— 输出结果左对齐,右边补空格
+ 输出符号(正号或负号)
# 对 d、u 格式字符无影响;对 o 格式字符,在输出时加前缀o;对 x 格式字符,在输出时加前缀ox
m 指定数据的输出宽度。当数据的实际位数大于m时,则按实际位数输出;当数据的实际位数小于m时,若输出宽度前有“——”则左对齐右 补空格,否则右对齐左补空格
格式字符 含义
l
用于输出长整型
—— 输出结果左对齐,右边补空格
+ 输出符号(正号或负号)
# 对 d、u 格式字符无影响;对 o 格式字符,在输出时加前缀o;对 x 格式字符,在输出时加前缀ox
m 指定数据的输出宽度。当数据的实际位数大于m时,则按实际位数输出;当数据的实际位数小于m时,若输出宽度前有“——”则左对齐右 补空格,否则右对齐左补空格
表3.3 scanf ( ) 函数中的格式修饰符
格式字符 含义
l 用于输入长整型
m 指定输入数据所占的宽度
* 表示本输入项不会赋值给相应的变量
格式字符 含义
l 用于输入长整型
m 指定输入数据所占的宽度
* 表示本输入项不会赋值给相应的变量
实型数据的输入和输出
表3.4 格式字符(实型数据)
函数 格式字符 含义
f 以小数形式输出单精度或双精度数(保留 6 位小数)
printf E,e 以指数形式输出单精度或双精度数
g 以 %f、%e 中较短的输出宽度输出单精度或双精度
函数 格式字符 含义
f 以小数形式输入单精度数
E,e 以指数形式输入单精度数
scanf lf 以小数形式输入双精度数
le 以指数形式输入双精度数
函数 格式字符 含义
f 以小数形式输出单精度或双精度数(保留 6 位小数)
printf E,e 以指数形式输出单精度或双精度数
g 以 %f、%e 中较短的输出宽度输出单精度或双精度
函数 格式字符 含义
f 以小数形式输入单精度数
E,e 以指数形式输入单精度数
scanf lf 以小数形式输入双精度数
le 以指数形式输入双精度数
字符型数据的输入和输出
1. 使用 scanf( )函数和printf( )函数对字符型数据进行输入和输出
2. 使用 getchar( )函数和 putchar( )函数对字符型数据进行输入输出
(1) getchar( )函数。
设 ch 是字符型变量,函数 getchar ( )的一般调用格式为:
ch=getchar( );
运行时从键盘输入缓冲区中读取一个字符,并赋值给变量 ch。由于函数 getchar( )z只能读入一个字符,若要输入多个字符,就需要多次调用函数,一般采用循环调用的方式。
设 ch 是字符型变量,函数 getchar ( )的一般调用格式为:
ch=getchar( );
运行时从键盘输入缓冲区中读取一个字符,并赋值给变量 ch。由于函数 getchar( )z只能读入一个字符,若要输入多个字符,就需要多次调用函数,一般采用循环调用的方式。
(2) putchar( )函数。
函数putchar( )的一般调用格式为:
putchar(输入与参数);
输出一个字符,输出参数是字符型变量或字符型或字符型常量。
函数putchar( )的一般调用格式为:
putchar(输入与参数);
输出一个字符,输出参数是字符型变量或字符型或字符型常量。
数学库函数
C语言处理系统提供了许多事先编好的库函数,供用户在编程序时使用,这些先编好的函数称为库函数。
常用的数学函数有:
常用的数学函数有:
①指数函数 exp(x):计算e^x。如exp(2.3)的值为:9.974182.
②绝对值函数fabs(x):计算|x|。如fabs(-2.8)的值为:2.8
③以e为底的对数函数 log(x):计算lnx。如log(123.45)的值为4.815836。
④幂函数 pow(x,y):计算x^y。如pow(1.3,2)的值为1.69。
⑤平方根函数 sprt(x):计算√x。如sprt(4.0)的值为2.0。
用户在程序中调用数学库函数时,一定要在程序的开头使用#inclde<math.h>。
0 条评论
下一页