
C语言程序设计教程电子教案推荐课件.ppt
317页C 语言程序设计语言程序设计教程教程刘新铭刘新铭 吉顺如吉顺如 辜碧容辜碧容 郑君华郑君华编著编著2021/8/2212 2目目目目 录录录录 第第第第1 1章章章章 C C语言概述语言概述语言概述语言概述第第第第2 2章章章章 数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式数据类型、运算符和表达式第第第第3 3章章章章 C C程序中的输入、输出程序中的输入、输出程序中的输入、输出程序中的输入、输出第第第第4 4章章章章 C C程序的控制结构程序的控制结构程序的控制结构程序的控制结构第第第第5 5章章章章 数数数数 组组组组第第第第6 6章章章章 函数函数函数函数第第第第7 7章章章章 编译预处理命令编译预处理命令编译预处理命令编译预处理命令第第第第8 8章章章章 指指指指 针针针针第第第第9 9章章章章 结结结结 构构构构 体体体体第第第第1010章章章章 文文文文 件件件件第第 1 章章 C语言概述语言概述2021/8/2234 4学习目标学习目标 对C语言有一个概括的了解,能够编写包含键盘输入、计算和显示输出等操作的简单C程序。
5 5主要内容主要内容•C C语言的产生与特点语言的产生与特点 •简单简单C C程序的组成程序的组成•C C语言语言应用程序开发的基本步骤应用程序开发的基本步骤6 61.1 C1.1 C语言的产生及特点语言的产生及特点 C C语言是为了编写系统程序而在语言是为了编写系统程序而在19681968年开始年开始研发的计算机高级语言研发的计算机高级语言C C语言表达能力强,使用灵活,程序结构清语言表达能力强,使用灵活,程序结构清晰,紧凑,可移植性好晰,紧凑,可移植性好C C语言是进一步学习面向对象的程序设计语语言是进一步学习面向对象的程序设计语言言 C++ C++和和VC VC 的基础的基础7 7 【例【例【例【例1-11-11-11-1】从键盘输入三个整数,输出它们的和】从键盘输入三个整数,输出它们的和】从键盘输入三个整数,输出它们的和】从键盘输入三个整数,输出它们的和 main() /* main() /* main() /* main() /* 计算三个整数的和计算三个整数的和计算三个整数的和计算三个整数的和 */ */ */ */ { { { { int x,y,z,sum; int x,y,z,sum; int x,y,z,sum; int x,y,z,sum; scanf(" scanf(" scanf(" scanf("%%%%d,d,d,d,%%%%d,d,d,d,%%%%d",&x,&y,&z);d",&x,&y,&z);d",&x,&y,&z);d",&x,&y,&z); sum sum sum sum====x+y+z; x+y+z; x+y+z; x+y+z; printf("sum printf("sum printf("sum printf("sum=%=%=%=%d d d d\\\\n "n "n "n ",,,,sum);sum);sum);sum); } } } } 语语语语句句句句 函函函函数数数数体体体体 主函数名主函数名最简单的最简单的最简单的最简单的C C C C程序的组成程序的组成程序的组成程序的组成对程序的对程序的注释注释1.2 C1.2 C语言程序的结构及书写格式语言程序的结构及书写格式 一一一一.C.C.C.C程序的结构程序的结构程序的结构程序的结构 8 8 main() main() { { int x,y,z,sum; int x,y,z,sum; scanf("%d,%d,%d",&x,&y,&z); scanf("%d,%d,%d",&x,&y,&z); sum=x+y+z; sum=x+y+z; printf("sum=%d printf("sum=%d\\n",sum)n",sum) } }定义变量定义变量x x,y,z,y,z和和sumsum从键盘输入三个整从键盘输入三个整数赋给变量数赋给变量x x,y,y和和z z显示变量显示变量sumsum的值的值计算计算x+y+z,x+y+z,并将结并将结果赋给变量果赋给变量sumsum程序说明程序说明9 9一般一般C C程序的组成程序的组成【例【例【例【例1-21-21-21-2】采用模块结构,改写例】采用模块结构,改写例】采用模块结构,改写例】采用模块结构,改写例1-11-11-11-1的程序。
的程序add(int x,int y,int z )add(int x,int y,int z )add(int x,int y,int z )add(int x,int y,int z ) { { { { return(x+y+z); return(x+y+z); return(x+y+z); return(x+y+z); } } } } main() main() main() main() { { { { int x,y,z; int x,y,z; int x,y,z; int x,y,z; printf("Please Input Three Integers:\n "); printf("Please Input Three Integers:\n "); printf("Please Input Three Integers:\n "); printf("Please Input Three Integers:\n "); scanf("%d,%d,%d ",&x,&y,&z); scanf("%d,%d,%d ",&x,&y,&z); scanf("%d,%d,%d ",&x,&y,&z); scanf("%d,%d,%d ",&x,&y,&z); printf("sum printf("sum printf("sum printf("sum====%d\n ",add(x,y,z));%d\n ",add(x,y,z));%d\n ",add(x,y,z));%d\n ",add(x,y,z)); } } } }函数函数add()add()主函数主函数main()main()调用函数调用函数add()add()1010 …… …… 函数函数函数函数1 1主函数主函数主函数主函数main()main()函数函数函数函数2 2函数函数函数函数k k注意:注意: 每个每个C C程序必定有一个、而且只能有一个程序必定有一个、而且只能有一个主函数主函数main() main() 。
主函数可以调用其它子函数,而子函数不主函数可以调用其它子函数,而子函数不可以调用主函数,子函数彼此之间也可以相可以调用主函数,子函数彼此之间也可以相互调用C C程序的组成程序的组成1111二二.C.C程序的书写格式程序的书写格式1.C1.C程序允许一行写一个或多个语句程序允许一行写一个或多个语句 ,当,当一个语句分几行书写时,在换行前应加一个语句分几行书写时,在换行前应加上上“\”“\”符,然后从下一行的开头继续符,然后从下一行的开头继续2.2.习惯上,书写习惯上,书写C C程序时均使用小写英文字程序时均使用小写英文字母3.3.C C程序一般都采用缩进格式的书写方法,程序一般都采用缩进格式的书写方法,不同结构层次的语句,从不同的起始位不同结构层次的语句,从不同的起始位置开始,同一结构层次中的语句,缩进置开始,同一结构层次中的语句,缩进同样个数的字符位置同样个数的字符位置4.4.应当在程序中适当地添加一些注释行应当在程序中适当地添加一些注释行 12121.3 C1.3 C程序的编辑、调试和运行程序的编辑、调试和运行编辑源程序编辑源程序编辑源程序编辑源程序 生成目标程序生成目标程序生成目标程序生成目标程序 经编译经编译经编译经编译 经连经连经连经连 接库接库接库接库 修改源程序修改源程序修改源程序修改源程序 函数函数函数函数 生成生成生成生成exeexeexeexe文件文件文件文件 运行运行运行运行 运行时出错运行时出错运行时出错运行时出错编译编译编译编译出错出错出错出错1313第第1 1章章 结束结束 第第 2 2 章章 数据类型、运算符和表达式数据类型、运算符和表达式 2021/8/22141515学习目标学习目标1. 1. 掌握基本数据类型的概念和常量表示掌握基本数据类型的概念和常量表示方法,掌握变量的定义方法,能够根方法,掌握变量的定义方法,能够根据实际情况选用适当的数据类型据实际情况选用适当的数据类型2. 2. 熟练掌握数值表达式的构造方法,能熟练掌握数值表达式的构造方法,能够利用表达式完成数值计算够利用表达式完成数值计算1616主要内容主要内容•C C数据类型概述数据类型概述•常量和变量常量和变量•算术运算表达式算术运算表达式•赋值表达式赋值表达式•自增、自减表达式自增、自减表达式17172.1 2.1 概概 述述C C语言支持的数据类型语言支持的数据类型基本基本数据数据类型类型整型整型单精度型单精度型主要主要数据数据类型类型构造构造数据数据类型类型指针指针类型类型实型实型字符型字符型数组类型数组类型结构体类型结构体类型双精度型双精度型1818基本数据类型说明符基本数据类型说明符整型:整型:intint long long字符型:字符型:charchar实型:实型:floatfloat double double long double long double19192.2 2.2 常常 量量常量∶在程序运行过程中,其值不能被改在程序运行过程中,其值不能被改 变的量。
变的量 一一. . 不同数制整型常量的表示不同数制整型常量的表示例如例如: 12 : 12 :十进制数:十进制数 12 12 012 012 :八进制数:八进制数 12 12(等于十进(等于十进制数制数10,10,用前导符用前导符0 0表示八进制数表示八进制数常量)) 0x12 0x12:十六进制数:十六进制数 12 12(等于十(等于十进制数进制数 18 18,用前导符,用前导符0X0X或或0x0x表示十六进表示十六进制数制数常量))2020二二. .字符常量的表示字符常量的表示1.1.用用用用‘’‘’‘’‘’括起来的可显示字符括起来的可显示字符括起来的可显示字符括起来的可显示字符, , , ,如如如如∶ ‘∶ ‘∶ ‘∶ ‘A’A’A’A’、、、、‘‘‘‘$’$’$’$’、、、、‘‘‘‘3’ 3’ 3’ 3’ 等等等等( ( ( (转义字符除外转义字符除外转义字符除外转义字符除外) ) ) )2. 2. 2. 2. 用八进制数表示其用八进制数表示其用八进制数表示其用八进制数表示其ASCASCASCASC代码的字符代码的字符代码的字符代码的字符, , , ,如如如如‘‘‘‘\101’\101’\101’\101’表表表表示西文字符示西文字符示西文字符示西文字符 A A A A、、、、‘‘‘‘\63’\63’\63’\63’表示数字字符表示数字字符表示数字字符表示数字字符 3 3 3 3。
3. 3. 3. 3. 用十六进制数表示其用十六进制数表示其用十六进制数表示其用十六进制数表示其ASCASCASCASC代码的字符代码的字符代码的字符代码的字符, , , ,如如如如:‘\x41’:‘\x41’:‘\x41’:‘\x41’表示西文字符表示西文字符表示西文字符表示西文字符A A A A、、、、 ‘ ‘ ‘ ‘\x2A’\x2A’\x2A’\x2A’表示字符表示字符表示字符表示字符 * * * *4. 4. 4. 4. 用用用用‘‘‘‘\’ ’\’ ’\’ ’\’ ’表示字符表示字符表示字符表示字符’ ’ ’ ’ ,,,,‘‘‘‘\”’\”’\”’\”’表示字符表示字符表示字符表示字符””””,,,, ‘‘‘‘\\ ’\\ ’\\ ’\\ ’表示字符表示字符表示字符表示字符\ \ \ \ 5. 5. 5. 5. 用双引号括起来的字符序列表示字符串常量,其用双引号括起来的字符序列表示字符串常量,其用双引号括起来的字符序列表示字符串常量,其用双引号括起来的字符序列表示字符串常量,其中最后一个字符是字符串结束符中最后一个字符是字符串结束符中最后一个字符是字符串结束符中最后一个字符是字符串结束符‘‘‘‘\0’\0’\0’\0’,不显式,不显式,不显式,不显式地表示出来。
如地表示出来如地表示出来如地表示出来如:“English” :“English” :“English” :“English” 2121【例【例2-12-1】常量的例子】常量的例子 main() { float r; printf("Please Input Radius:\n"); scanf("%f",&r); printf("The Circumference of Cirle: %f\n", 2*3.1415926*r); }定义浮点型定义浮点型变量变量r r人机对话,通知用户人机对话,通知用户输入半径的值输入半径的值从键盘输入半径的值,从键盘输入半径的值,并将值赋给变量并将值赋给变量r r显示结果显示结果常量常量2 2常量常量3.14159263.14159262222三三. . 符号常量符号常量 可以用可以用可以用可以用#define#define#define#define命令定义符号常量,在程序的执命令定义符号常量,在程序的执命令定义符号常量,在程序的执命令定义符号常量,在程序的执行过程中不允许改变符号常量的值。
行过程中不允许改变符号常量的值行过程中不允许改变符号常量的值行过程中不允许改变符号常量的值例【例2-22-2】说明符号常量的例子】说明符号常量的例子#define PRICE 30 main( ) { int num,total; num=10; total=num*PRICE; printf("total=%d",total); }通过通过#include#include定义符号常定义符号常量量PRICEPRICE为为3030定义二个整型变量定义二个整型变量numnum和和totaltotal使变量使变量numnum的值为的值为1010执行运算执行运算10×3010×30并把运算的结果赋并把运算的结果赋予变量予变量totaltotal显示结果显示结果23232.3 2.3 变量的定义和初始化变量的定义和初始化变量变量: :在程序运行时,其值可变的量被称为变量在程序运行时,其值可变的量被称为变量, , 分为整型变量、实型变量和字符型变量分为整型变量、实型变量和字符型变量一一. C. C语言中的标识符语言中的标识符 C C语言把用户给常量、变量、函数、标号和其它语言把用户给常量、变量、函数、标号和其它对象所起的名字统称为标识符。
对象所起的名字统称为标识符用户定义的标识符须遵循如下规则:用户定义的标识符须遵循如下规则: 标识符只能由字母、数字和下划线三种字符组成,标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,标识符的长度不且第一个字符必须为字母或下划线,标识符的长度不超过超过3232个字符同时,个字符同时,C C语言的关键字和库函数名不语言的关键字和库函数名不能作为标识符能作为标识符 2424例如,下面的字符序列均为合法的例如,下面的字符序列均为合法的C C语言标识符:语言标识符:a a,,b b,,wordword,,_file_file,,file2file2,,F_name, f_nameF_name, f_name注意:注意:C C编译程序字母区分大小写,所以上述编译程序字母区分大小写,所以上述F_nameF_name和和 f_name f_name是二个不同的标识符是二个不同的标识符下面的字符序列为不合法的下面的字符序列为不合法的C C语言标识符:语言标识符:2L ── 2L ── 违反了违反了标识符第一个字符必须为字母标识符第一个字符必须为字母 或下划线或下划线的规定。
的规定a** ── a** ── 违反了违反了标识符只能由字母、数字和下标识符只能由字母、数字和下 划线三种字符组成划线三种字符组成的规定int ── int ── 违反了违反了C C语言的关键字和库函数名不语言的关键字和库函数名不 能作为标识符能作为标识符的规定 2525二二. . 变量分类变量分类 1. 1.整型变量分类整型变量分类有符号整型说明符有符号整型说明符有符号整型说明符有符号整型说明符无符号整型说明符无符号整型说明符无符号整型说明符无符号整型说明符整整整整型型型型intintintintsignedsignedsignedsigned signed int signed int signed int signed int unsignedunsignedunsignedunsignedunsignedunsignedunsignedunsigned int int int int 长长长长整整整整型型型型longlonglonglonglonglonglonglong intintintintsignedsignedsignedsigned longlonglonglongsignedsignedsignedsigned long int long int long int long int unsignedunsignedunsignedunsigned longlonglonglongunsignedunsignedunsignedunsigned long int long int long int long int 2626有符号整型有符号整型有符号整型有符号整型无符号整型无符号整型无符号整型无符号整型占字节数占字节数占字节数占字节数整整整整型型型型 int int int int-32768 ~32767 -32768 ~32767 -32768 ~32767 -32768 ~32767 unsigned unsigned unsigned unsigned 0 ~65535 0 ~65535 0 ~65535 0 ~65535 2 2 2 2字字字字节节节节长长长长整整整整型型型型 long long long long -2 -2 -2 -231313131~(2~(2~(2~(231313131-1)-1)-1)-1) unsigned unsigned unsigned unsigned longlonglonglong 0~4,294,967,295 0~4,294,967,295 0~4,294,967,295 0~4,294,967,2954 4 4 4字字字字节节节节整型变量的值域整型变量的值域27272.2.浮点型变量的分类及其值域浮点型变量的分类及其值域Long doubleLong doubleLong doubleLong double取值取值取值取值(绝对值(绝对值(绝对值(绝对值) ) ) ) 范围范围范围范围 占字节数占字节数占字节数占字节数10101010-4931-4931-4931-4931~10~10~10~104932493249324932 单精度单精度单精度单精度型型型型双精度双精度双精度双精度型型型型10101010-37-37-37-37~10~10~10~1038383838 4 4 4 4 float float float float double double double double 10101010-307-307-307-307~10~10~10~10308308308308 浮点浮点浮点浮点型型型型说明符说明符说明符说明符81628283.3.字符型变量及其值域字符型变量及其值域说明符说明符说明符说明符取值范围取值范围取值范围取值范围(字符的(字符的(字符的(字符的ASCASC码值)码值)码值)码值)占字节数占字节数占字节数占字节数 char char0 ~ 2550 ~ 255 1 1在设计程序时,应当根据数据本身的特点和变化范围正确选择变量类型。
2929三三. .变量的定义和初始化变量的定义和初始化 变量的定义格式:变量的定义格式: 类型说明符类型说明符 变量名表变量名表 ; intint、、unsignedunsigned、、longlong、、floatfloat、、doubledouble、、charchar等等变量名只能由字母变量名只能由字母变量名只能由字母变量名只能由字母、数字和下划线三种、数字和下划线三种、数字和下划线三种、数字和下划线三种字符组成,且第一字符组成,且第一字符组成,且第一字符组成,且第一个字符必须为字母个字符必须为字母个字符必须为字母个字符必须为字母或下划线或下划线或下划线或下划线例如,语句:例如,语句: int a1,a2,age;; float x,y,z;; char ch;;分别定义了整型变量分别定义了整型变量a1,a2,age,浮点型变量,浮点型变量x,y,z和字符型变量和字符型变量ch3030变量的初始化:变量的初始化: 在定义变量的同时对变量预在定义变量的同时对变量预 先设置初值。
先设置初值 例如,执行语句例如,执行语句: : int num=20; float pi=3.14; char c1,c2= ' M' ; 变量变量num、、pi、、c2的初值分别为的初值分别为20、、 3.14和和 字符字符M3131四四. .各类数值型数据间的混合运算各类数值型数据间的混合运算 高高 double float double float long long unsigned unsigned 低低 int char int char当各种当各种不同类型的数据混合运算时不同类型的数据混合运算时,,其运算结果的其运算结果的类型由上图所示的类型转换原则确定类型由上图所示的类型转换原则确定。
3232【例【例2-32-3】设程序中定义变量:】设程序中定义变量:int i; float f; double d; 执行运算:执行运算:i+(f*d)-(f+i) (i+(f*d)-(f+i) (这里的这里的 * * 表示乘法表示乘法) )下图给出了在运算过程中所发生的数据类型的转换下图给出了在运算过程中所发生的数据类型的转换 i+ ( f * d ) - ( f + i ) i+ ( f * d ) - ( f + i ) double double double double double double double double double double double double double double double double double double33332.4 2.4 算术运算符和算术运算表达式算术运算符和算术运算表达式一一. . 算术算术运算符运算符算术算术运算符运算符包括:包括: + + (加)(加) - - (减)(减) * * (乘)(乘) / / (除)(除) % % (求余)(求余)操作符操作符操作符操作符 % % 只作用于整数只作用于整数只作用于整数只作用于整数x%y x%y 的值就是的值就是的值就是的值就是 x x除以除以除以除以 y y 的余数。
的余数3434 操作符操作符 / / 的两种含义:的两种含义:整数除法(整除)整数除法(整除) 当被除数和除数都是整型数据时,当被除数和除数都是整型数据时,“\”“\”运算的结果为整型运算的结果为整型例如:例如:5/25/2的值为的值为2 2(而不是(而不是2.52.5))实数除法实数除法 当被除数和除数中至少有一个是当被除数和除数中至少有一个是实数型数据时,实数型数据时,“\”“\”运算的结果为运算的结果为实数型 例如:例如:5.0/25.0/2的值为的值为2.52.53535二二. .算术运算表达式算术运算表达式 用算术运算符和括号将运算对象连接起来、用算术运算符和括号将运算对象连接起来、并符合并符合C C语言语法规则的式子,称为算术运算表语言语法规则的式子,称为算术运算表达式或算术表达式达式或算术表达式 例如例如: :设设r r、、x x、、y y是已经定义的数值型变量是已经定义的数值型变量, ,则则: 3.14*r*r: 3.14*r*r、、x+2*y-3/zx+2*y-3/z、、(x-y)*(x-y/2)(x-y)*(x-y/2)均是合法的算术运算表达式,单独的均是合法的算术运算表达式,单独的r r、、x x、、y y也也是合法的算术运算表达式。
实际上,单独的常是合法的算术运算表达式实际上,单独的常量或变量是最简单的算术运算表达式量或变量是最简单的算术运算表达式注意:注意:算术算术运算运算表达式表达式中的分数线须用中的分数线须用中的分数线须用中的分数线须用 / / / / 表示表示表示表示 例如:例如:例如:例如: 2+3×i 2+3×i 2+3×i 2+3×i k×j k×j k×j k×j 表示为表示为表示为表示为C C C C语言表达式就是:语言表达式就是:语言表达式就是:语言表达式就是:(2+3*i)/(k*j) (2+3*i)/(k*j) (2+3*i)/(k*j) (2+3*i)/(k*j) 或或或或 (2+3*i)/k/j (2+3*i)/k/j (2+3*i)/k/j (2+3*i)/k/j3636C C程序中,称表达式的运算结果为程序中,称表达式的运算结果为表达式的值表达式的值。
C C语言规定,在表达式求值时,须按运算符优先级的语言规定,在表达式求值时,须按运算符优先级的高低次序执行高低次序执行对算术运算而言,必须遵循先括号对算术运算而言,必须遵循先括号内后括号外,先乘、除及求余运算,后加减的运算内后括号外,先乘、除及求余运算,后加减的运算优先级规则优先级规则C C语言规定了运算符二种不同的结合方向:语言规定了运算符二种不同的结合方向:l左结合:左结合:当参于运算的数据两侧的运算符优先级当参于运算的数据两侧的运算符优先级 相同时,运算顺序为自左至右相同时,运算顺序为自左至右C C语言规定语言规定算术运算符遵循左结合的规则算术运算符遵循左结合的规则 例如,计算算术运算表达式例如,计算算术运算表达式 a+b-c a+b-c 时,时, 运算符运算符““+”+”和和““–”–”具有相同的优先级,所以先执行具有相同的优先级,所以先执行 a+ba+b,, 其结果再和其结果再和c c相减3737l右结合:右结合:当参于运算的数据两侧的运算符优先级当参于运算的数据两侧的运算符优先级 相同时,运算顺序为自右向左。
相同时,运算顺序为自右向左 C C语言提供的运算符中有少量运算符遵循右结合的语言提供的运算符中有少量运算符遵循右结合的规则 教材的附录部分列出了教材的附录部分列出了C C语言中所有运算符以及它语言中所有运算符以及它 们的优先级和结合性们的优先级和结合性 38382 .5 2 .5 赋值运算符与赋值运算表达式赋值运算符与赋值运算表达式一一. .赋值运算符赋值运算符 赋值符号赋值符号“=”“=”就是赋值运算符,它的作用是将一就是赋值运算符,它的作用是将一个数据赋给一个变量个数据赋给一个变量例如:执行程序段例如:执行程序段 int a; int a; a=3; a=3; a=a-5; a=a-5; 当执行语句当执行语句“a=3;” “a=3;” 就完成一次赋值运算,把赋就完成一次赋值运算,把赋 值运算符右边的值值运算符右边的值3 3赋给赋值运算符左边的变量赋给赋值运算符左边的变量a a,, 赋值后,赋值后,a a的值为的值为3 3 。
再执行语句再执行语句“a=a-5;”“a=a-5;”,赋值,赋值 运算符右边的表达式运算符右边的表达式a-5a-5的运算结果为的运算结果为-2, -2, 将将-2-2赋赋 给给a a 最后,变量最后,变量a a的值变为的值变为-2-2 3939复合的赋值运算符复合的赋值运算符复合的赋值运算符的格式:复合的赋值运算符的格式: 算术运算符算术运算符 = 所以,所以,+=、、-=、、*=、、/=、、%= 都是复合的赋值运算符都是复合的赋值运算符二二. .赋值运算表达式赋值运算表达式 将一个变量通过赋值运算符或复合的赋值运算符与将一个变量通过赋值运算符或复合的赋值运算符与一个表达式连接而成的式子称为赋值运算表达式一个表达式连接而成的式子称为赋值运算表达式赋值运算表达式的格式为:赋值运算表达式的格式为: 变量名变量名 = = 表达式表达式 或或 变量名变量名 复合的赋值运算符复合的赋值运算符 表达式表达式 例如:例如:x=1.414 , m1=x=1.414 , m1=''E E'',s=3.14159*r*r,s=3.14159*r*r 或或 a+=5 a+=5,,x/=a+1 x/=a+1 上述各例都是合法的赋值运算表达式。
上述各例都是合法的赋值运算表达式4040 赋值运算表达式的作用是把赋值运算符右边表达式赋值运算表达式的作用是把赋值运算符右边表达式的值赋给赋值运算符左边的变量的值赋给赋值运算符左边的变量当算术运算符和赋当算术运算符和赋值运算符同时出现在一个表达式中时,算术运算符的值运算符同时出现在一个表达式中时,算术运算符的优先级高于赋值运算符优先级高于赋值运算符 C C语言允许赋值运算表达式中的表达式部分还是一语言允许赋值运算表达式中的表达式部分还是一个赋值表达式,这样就构成了多重赋值多重赋值个赋值表达式,这样就构成了多重赋值多重赋值表达式中,赋值运算符遵循右结合的法则,即:表达式中,赋值运算符遵循右结合的法则,即:自右向左的运算顺序自右向左的运算顺序 例如:多重赋值语句例如:多重赋值语句 a=b=c=x+8; a=b=c=x+8; 在执行时等价于依次执行三个语句:在执行时等价于依次执行三个语句: c=x+8; c=x+8; b=c; b=c; a=b; a=b;4141 将一个变量通过复合的赋值运算符与一个表达式连将一个变量通过复合的赋值运算符与一个表达式连接而成的式子同样称为赋值运算表达式。
接而成的式子同样称为赋值运算表达式 例如:例如: a+=5 a+=5,,x/=a+1x/=a+1 下面的例子说明了复合的赋值运算符的运算规则下面的例子说明了复合的赋值运算符的运算规则 表达式表达式 a+=5 a+=5 等价于等价于 a=a+5 a=a+5表达式表达式 a*=4-b a*=4-b 等价于等价于 a=a*(4-b) a=a*(4-b)表达式表达式 a%=b-1 a%=b-1 等价于等价于 a=a%(b-1) a=a%(b-1)注意:注意: 复合的赋值运算符右边的表达式是作为一个整体复合的赋值运算符右边的表达式是作为一个整体参与其左边算术运算符所规定的运算的参与其左边算术运算符所规定的运算的 4242【例【例【例【例2-42-42-42-4】赋值运算表达式举例】赋值运算表达式举例】赋值运算表达式举例】赋值运算表达式举例1 1 1 1))))y=3*(x-1)y=3*(x-1)y=3*(x-1)y=3*(x-1);;;; /* /* /* /* 将将将将3*(x-1) 3*(x-1) 3*(x-1) 3*(x-1) 的结果的结果的结果的结果 赋值给变量赋值给变量赋值给变量赋值给变量y y y y。
/*/*/*/2 2 2 2))))a=(b=4)+(c=6)a=(b=4)+(c=6)a=(b=4)+(c=6)a=(b=4)+(c=6);;;; /* /* /* /* 这里的赋值运算表这里的赋值运算表这里的赋值运算表这里的赋值运算表 达式达式达式达式(b=4)(b=4)(b=4)(b=4)、、、、(c=6)(c=6)(c=6)(c=6)参于算术运算,参于算术运算,参于算术运算,参于算术运算,C C C C 言规定言规定言规定言规定, , , , 将赋值运算符右边表达式的值将赋值运算符右边表达式的值将赋值运算符右边表达式的值将赋值运算符右边表达式的值 作为赋值运算表达式的值作为赋值运算表达式的值作为赋值运算表达式的值作为赋值运算表达式的值所以,赋所以,赋所以,赋所以,赋 值运算表达式值运算表达式值运算表达式值运算表达式(b=4)(b=4)(b=4)(b=4)的值为的值为的值为的值为4, (c=6)4, (c=6)4, (c=6)4, (c=6) 的值为的值为的值为的值为6,6,6,6,最后将它们的和赋值给变量最后将它们的和赋值给变量最后将它们的和赋值给变量最后将它们的和赋值给变量a a a a,,,, 由于算术运算符的优先级高于赋值运由于算术运算符的优先级高于赋值运由于算术运算符的优先级高于赋值运由于算术运算符的优先级高于赋值运 算符,所以表达式中的括号是必须的。
算符,所以表达式中的括号是必须的算符,所以表达式中的括号是必须的算符,所以表达式中的括号是必须的 */ */ */ */43433 3 3 3))))a+=a*=a+2a+=a*=a+2a+=a*=a+2a+=a*=a+2;;;; /* /* /* /* 这里的语句等价于:这里的语句等价于:这里的语句等价于:这里的语句等价于: a=a*(a+2); a=a*(a+2); a=a*(a+2); a=a*(a+2); a=a+a; */ a=a+a; */ a=a+a; */ a=a+a; */ 三三三三. . . .字符型与整型的关系字符型与整型的关系字符型与整型的关系字符型与整型的关系1.1.字符型数据的值在内存表现为它们的字符型数据的值在内存表现为它们的字符型数据的值在内存表现为它们的字符型数据的值在内存表现为它们的ASCASCASCASC代码代码代码代码值(值(值(值(0 -- 2550 -- 2550 -- 2550 -- 255之间的一个整数之间的一个整数之间的一个整数之间的一个整数) ) ) ) 2. 2. 2. 2. 字符常量以其字符常量以其字符常量以其字符常量以其ASCASCASCASC代码值参与整数运算。
代码值参与整数运算代码值参与整数运算代码值参与整数运算如:如:如:如: ‘ ‘ ‘ ‘A’+2 A’+2 A’+2 A’+2 的值为的值为的值为的值为 67676767字符字符A A的的ASCASC码值码值为为65654444【例【例【例【例2-52-52-52-5】字符型变量参与算术运算】字符型变量参与算术运算】字符型变量参与算术运算】字符型变量参与算术运算 main() main() main() main() { { { { int a; int a; int a; int a; char i; char i; char i; char i; a='B'-1; a='B'-1; a='B'-1; a='B'-1; i=a+10; i=a+10; i=a+10; i=a+10; printf("a printf("a printf("a printf("a::::%d, a%d, a%d, a%d, a::::%c\n",a,a);%c\n",a,a);%c\n",a,a);%c\n",a,a); printf("i printf("i printf("i printf("i::::%d, i%d, i%d, i%d, i::::%c\n",i,i);%c\n",i,i);%c\n",i,i);%c\n",i,i); } } } } 以字符格式输以字符格式输出变量出变量a a的值的值结果为字符结果为字符A A以整型格式输以整型格式输出变量出变量a a的值的值结果为结果为67674545【【例2-6】】大小写字母的转换 main()main() { { char c1='a',c2='B'; char c1='a',c2='B'; c1=c1-32; c1=c1-32; c2=c2+32; c2=c2+32; printf("c1: %c, c2 %c",c1,c2); printf("c1: %c, c2 %c",c1,c2); } }大小写英文字母大小写英文字母的的ASCASC码值相差码值相差323246462.6 2.6 自增、自减运算符自增、自减运算符++++、、----功能功能: (: (设设i i为整型变量为整型变量) )++i:++i:在使用在使用i i之前之前, ,先执行先执行i+=1,i+=1,使使i i的值加的值加1 1。
i:--i:在使用在使用i i之前之前, ,先执行先执行i-=1,i-=1,使使i i的值减的值减1 1i++:i++:在使用在使用i i之后,执行之后,执行i+=1, i+=1, 使使i i的值加的值加1 1i--:i--:在使用在使用i i之后,执行之后,执行i-=1, i-=1, 使使i i的值减的值减1 1上上述述““使使用用””指指的的是是i i加加1 1或或减减1 1前前后后的的其其他他操操作作, ,如赋值、运算、显示等如赋值、运算、显示等若若不不存存在在其其它它操操作作,,则则i++i++与与++i++i一一样样,,执执行行i+=1, i+=1, 使使i i的的值值加加1 1;;i--i--与与--i--i一一样样, , 执执行行i-i-=1, =1, 使使i i的值减的值减1 14747【例【例2-72-7】自加、自减运算符的应用自加、自减运算符的应用 main() main() { { int i=10,j; int i=10,j; float pi=3.14,pa; float pi=3.14,pa; j =i++; j =i++; pa=++pi; pa=++pi; printf("j=%d, pa=%f\n",j,pa); printf("j=%d, pa=%f\n",j,pa); printf("i=%d, pi=%f\n", i++,--pi); printf("i=%d, pi=%f\n", i++,--pi); } }先将先将i i的值赋给变量的值赋给变量j j再执行再执行i+=1i+=1;;先执行先执行pi+=1pi+=1;;再将再将pipi的值赋给变量的值赋给变量papa先将先将i i的值输出的值输出再执行再执行i+=1i+=1;;先执行先执行pi-=1pi-=1;;再将再将pipi的值输出的值输出48482.7 2.7 位运算符位运算符 位运算以字节位运算以字节(byte)(byte)中的每一个二进位中的每一个二进位(bit)(bit)为运为运算对象,最终的运算结果是整型数据。
算对象,最终的运算结果是整型数据 位运算分为按位逻辑运算和移位运算位运算分为按位逻辑运算和移位运算一一. .按位逻辑运算符按位逻辑运算符 按位逻辑运算符包括:按位逻辑运算符包括: 按位逻辑与运算符:按位逻辑与运算符:“&”“&” 按位逻辑或运算符:按位逻辑或运算符:“|”“|” 按位逻辑非运算符:按位逻辑非运算符:“~”“~” 按位逻辑异或运算符:按位逻辑异或运算符:“^”“^”运算法则运算法则设用设用x x、、y y表示字节中的二进位,取值为表示字节中的二进位,取值为0 0或或1 1按位逻辑运算符的运算法则为逻辑运算符的运算法则为:: 4949按位逻辑与运算:按位逻辑与运算:x&yx&y的结果为的结果为1 1,当且仅当,当且仅当x x、、y y均为均为1 1,否则,否则x&yx&y的的结果为结果为0 0按位逻辑或运算:按位逻辑或运算:x|yx|y的结果为的结果为0 0,当且仅当,当且仅当x x、、y y均为均为0 0,否则,否则x|yx|y的的结果为结果为1 1。
按位逻辑异或运算:按位逻辑异或运算:x^yx^y的结果为的结果为1 1,当且仅当,当且仅当x x、、y y的值不相同,否则的值不相同,否则x^yx^y的结果为的结果为0 0按位逻辑非运算:按位逻辑非运算: 当当x=1x=1时,时,~x=0, ~x=0, 而当而当x=0x=0时时, ~x=1, ~x=1 位运算表达式的格式:位运算表达式的格式:整型变量名整型变量名 运算符运算符(&(&、、| |、、^) ^) 整型变量名整型变量名或或 ~ ~整型变量名整型变量名5050【例【例2-82-8】位运算符的应用】位运算符的应用设有:设有: int a=55,b=36; int a=55,b=36; 计算计算: a&b: a&b、、a|ba|b、、a^ba^b及及~a~a的结果 假定每个整型变量占二个字节假定每个整型变量占二个字节(16bit)(16bit),则在内存中的二进,则在内存中的二进 制数制数a a、、b b为:为: a: 00000000 00110111 b: 00000000 00100100 a: 00000000 00110111 b: 00000000 00100100 按上述按位运算的法则,列出下述算式:按上述按位运算的法则,列出下述算式: a&b: a|b:a&b: a|b: 00000000 00110111 00000000 00110111 00000000 00110111 00000000 00110111 & 00000000 00100100 | 00000000 00100100 & 00000000 00100100 | 00000000 00100100 00000000 00100100 00000000 00110111 00000000 00100100 00000000 00110111 a^b:a^b: 00000000 00110111 00000000 00100100 a: 00000000 00110111 00000000 00110111 00000000 00100100 a: 00000000 00110111 ^ 00000000 00100100 ~a: 11111111 11001000 ^ 00000000 00100100 ~a: 11111111 11001000 00000000 00010011 00000000 00010011结果:结果:a&b=24, a|b=37a&b=24, a|b=37 a^b=13, ~a=ffc8 a^b=13, ~a=ffc8(用十六进制表示)(用十六进制表示)5151二二. .移位运算符移位运算符 C C语言提供的移位运算实现将整数数据按二语言提供的移位运算实现将整数数据按二进位右移或左移的功能。
进位右移或左移的功能向右移位运算符向右移位运算符: : “>>”, “>>”, 向左移位运算符向左移位运算符: : “<<” “<<”移位运算表达式的格式:移位运算表达式的格式:整型变量名整型变量名 移位运算符移位运算符 整型常量整型常量其中,整型常量指出右移或左移的位数其中,整型常量指出右移或左移的位数例【例2-92-9】移位运算符的应用】移位运算符的应用设定义设定义 int a=55,b=36; int a=55,b=36; 计算计算 (a+b)>>2 (a+b)>>2、、(a-b)<<3(a-b)<<3的结果 a+b a+b和和a-ba-b的结果的结果9191和和1919在内存中的二进制数分别为:在内存中的二进制数分别为: a+b: 00000000 01011011 a+b: 00000000 01011011 和和 a-b: 00000000 00010011 a-b: 00000000 000100115252 a+b: 00000000 01011011 a+b: 00000000 01011011(a+b)>>2: 00000000 010110(a+b)>>2: 00000000 010110左边补左边补0 0 结果结果: 00000000 00010110: 00000000 00010110 a-b: 00000000 00010011 a-b: 00000000 00010011(a-b)<<3: 00000 00010011(a-b)<<3: 00000 00010011右边补右边补0 0结果结果: 00000000 10011000: 00000000 1001100053532.8 2.8 其他运算符和表达式其他运算符和表达式 一一. .强制类型转换运算符强制类型转换运算符 C C语言提供的强制类型转换运算符可以将一语言提供的强制类型转换运算符可以将一个表达式转换成指定的数据类型。
个表达式转换成指定的数据类型 格式:格式: (类型说明符)(表达式)(类型说明符)(表达式)例如:例如:(double)(x+y) /* (double)(x+y) /* 将表达式将表达式x+yx+y的结果转换的结果转换 成双精度型成双精度型 */ */ (int)a /* (int)a /* 将变量将变量a a的值转换成的值转换成intint类型类型 */ */5454【例【例2-102-10】强制类型转换运算符的使用】强制类型转换运算符的使用 main( ) main( ) { { float x=3.6,y=6.6; float x=3.6,y=6.6; printf("x+y=%f\n",x+y); printf("x+y=%f\n",x+y); printf("x+y=%f\n",(int)x+(int)y); printf("x+y=%f\n",(int)x+(int)y); } }将将x x的值强制转换的值强制转换成整型值成整型值3 3将将y y的值强制转换的值强制转换成整型值成整型值6 65555二二. .逗号运算符和逗号表达式逗号运算符和逗号表达式 C C语言通过逗号运算符语言通过逗号运算符““,,” ” 将两个以上的表将两个以上的表达式连接起来,组成逗号表达式。
达式连接起来,组成逗号表达式逗号表达式的一般格式:逗号表达式的一般格式:表达式表达式1 1,表达式,表达式2 2,,…………,表达式,表达式k k 逗号表达式的运算:逗号表达式的运算: 依次求表达式依次求表达式1 1、表达式、表达式2 2、、…………、表达式、表达式k k 的值,并的值,并以最后一个表达式以最后一个表达式k k的值作为整个的值作为整个 逗号表达式的值逗号表达式的值 例如,语句:例如,语句:x=(a=3,6*3)x=(a=3,6*3);;等价于:等价于: a = 3 a = 3;; x=6*3 x=6*3;; x = 6*3 x = 6*3;;将表达式将表达式6*36*3的结果的结果作为整个逗号表达式作为整个逗号表达式的值的值5656第第2章章 结束结束 第第 3 3 章章C C程序中的输入、输出程序中的输入、输出2021/8/22575858学习目标学习目标 对对C C语言的输入、输出有一个初步的了语言的输入、输出有一个初步的了解,学会使用解,学会使用scanf()scanf()、、 printf() printf()函数函数实现整型、浮点型和字符型数据的输入、实现整型、浮点型和字符型数据的输入、输出。
输出5959主要内容主要内容 · C · C · C · C语言的输入、输出语言的输入、输出语言的输入、输出语言的输入、输出 · printf() · printf() · printf() · printf()函数函数函数函数 · scanf() · scanf() · scanf() · scanf()函数函数函数函数 · getchar() · getchar() · getchar() · getchar()函数和函数和函数和函数和putchar()putchar()putchar()putchar()函数函数函数函数60603.1 3.1 概述概述 C C C C语言中没有输入、输出语句,通过调用库函数语言中没有输入、输出语句,通过调用库函数语言中没有输入、输出语句,通过调用库函数语言中没有输入、输出语句,通过调用库函数中的输入、输出函数中的输入、输出函数中的输入、输出函数中的输入、输出函数 printf() printf() printf() printf()、、、、scanf()scanf()scanf()scanf()、、、、getchargetchargetchargetchar()()()()和和和和putchar() putchar() putchar() putchar() 实现输入、输出。
实现输入、输出实现输入、输出实现输入、输出 在使用输入、输出函数时,应当在源程序的开在使用输入、输出函数时,应当在源程序的开在使用输入、输出函数时,应当在源程序的开在使用输入、输出函数时,应当在源程序的开始处使用始处使用始处使用始处使用 #include
如和格式字符组成如和格式字符组成如和格式字符组成如%d%d%d%d、、、、%f%f%f%f、、、、 %f%f%f%f等,它们的作用是将待输出的等,它们的作用是将待输出的等,它们的作用是将待输出的等,它们的作用是将待输出的 数据按指定的格式输出数据按指定的格式输出数据按指定的格式输出数据按指定的格式输出l普通字符:普通字符:普通字符:普通字符:即需要按原样输出的字符即需要按原样输出的字符即需要按原样输出的字符即需要按原样输出的字符例如,语句:例如,语句:例如,语句:例如,语句: printf("Totalprintf("Total Number is %d, Number is %d, Price is %f\n",total,price) Price is %f\n",total,price);;;; 中的中的中的中的 Total Number isTotal Number is 、、、、 Price isPrice is6363●●输出表列部分输出表列部分:: 这部分是需要输出的数据值,通常是这部分是需要输出的数据值,通常是 表达式表达式, , 如上例中的如上例中的totaltotal、、priceprice。
常用的常用的printf()printf()格式字符格式字符 格式字符格式字符格式字符格式字符 说说说说 明明明明 c (*) c (*) 以字符形式输出,只输出一个字符以字符形式输出,只输出一个字符以字符形式输出,只输出一个字符以字符形式输出,只输出一个字符d (*) d (*) 以带符号的十进制形式输出整数(正数不输出符号)以带符号的十进制形式输出整数(正数不输出符号)以带符号的十进制形式输出整数(正数不输出符号)以带符号的十进制形式输出整数(正数不输出符号) e e或或或或,E ,E 以以以以指数形式指数形式指数形式指数形式输出实数,数字部分小数位数为输出实数,数字部分小数位数为输出实数,数字部分小数位数为输出实数,数字部分小数位数为6 6位位位位 f (*) f (*) 以小数形式输出单、双精度数,隐含输出以小数形式输出单、双精度数,隐含输出以小数形式输出单、双精度数,隐含输出以小数形式输出单、双精度数,隐含输出6 6位小数位小数位小数位小数 l l 用于用于用于用于长整型数据长整型数据长整型数据长整型数据,可加在格式符,可加在格式符,可加在格式符,可加在格式符d d,,,,o o,,,,x x,,,,u u前面前面前面前面 如如如如∶ ∶ ∶ ∶2.5E-32.5E-3相相相相当于当于当于当于∶ ∶ ∶ ∶2.5×102.5×10-3-3如如如如∶ ∶ ∶ ∶%ld,%lo, %lx%ld,%lo, %lx等等等等6464接上页接上页接上页接上页格式字符格式字符格式字符格式字符 说说说说 明明明明 o o 以以以以八进制无符号形式八进制无符号形式八进制无符号形式八进制无符号形式输出整数(不输出前导符输出整数(不输出前导符输出整数(不输出前导符输出整数(不输出前导符0 0)))) s (*) s (*) 输出字符串输出字符串输出字符串输出字符串 u u 以无符号十进制形式输出整数以无符号十进制形式输出整数以无符号十进制形式输出整数以无符号十进制形式输出整数 x x或或或或X X 以以以以十六进制无符号形式十六进制无符号形式十六进制无符号形式十六进制无符号形式输出整数(不输出前导符输出整数(不输出前导符输出整数(不输出前导符输出整数(不输出前导符0x0x),),),), 用用用用x x则输出十六进制数的则输出十六进制数的则输出十六进制数的则输出十六进制数的a~fa~f以小数形式,用以小数形式,用以小数形式,用以小数形式,用X X时,则用时,则用时,则用时,则用 大写字母输出大写字母输出大写字母输出大写字母输出 6565【例【例【例【例3-13-13-13-1】输出格式控制符的应用】输出格式控制符的应用】输出格式控制符的应用】输出格式控制符的应用 main( ) main( ) main( ) main( ) { { { { int x=35; int x=35; int x=35; int x=35; float y=123.456; float y=123.456; float y=123.456; float y=123.456; char ch=' A'; char ch=' A'; char ch=' A'; char ch=' A'; printf("x=%d\n",x); printf("x=%d\n",x); printf("x=%d\n",x); printf("x=%d\n",x); printf("y=%f\n",y); printf("y=%f\n",y); printf("y=%f\n",y); printf("y=%f\n",y); printf("y=%10.2f\n",y); printf("y=%10.2f\n",y); printf("y=%10.2f\n",y); printf("y=%10.2f\n",y); printf("y=%-10.2f\n",y); printf("y=%-10.2f\n",y); printf("y=%-10.2f\n",y); printf("y=%-10.2f\n",y); printf("ch=\' %c\' \n",ch); printf("ch=\' %c\' \n",ch); printf("ch=\' %c\' \n",ch); printf("ch=\' %c\' \n",ch); printf("String : \"%s\"\n"," Shanghai"); printf("String : \"%s\"\n"," Shanghai"); printf("String : \"%s\"\n"," Shanghai"); printf("String : \"%s\"\n"," Shanghai"); } } } } 以整数格式以整数格式以整数格式以整数格式输出表达式输出表达式输出表达式输出表达式x x的值的值的值的值\n\n为转义字为转义字为转义字为转义字符,输出时符,输出时符,输出时符,输出时将光标移到将光标移到将光标移到将光标移到下一行的开下一行的开下一行的开下一行的开始处始处始处始处按原样输出按原样输出按原样输出按原样输出字符串字符串字符串字符串StringString%-m.nf%-m.nf与与与与%m.n%m.n相似,只是在相似,只是在相似,只是在相似,只是在其右边以空格补足不足部分。
其右边以空格补足不足部分其右边以空格补足不足部分其右边以空格补足不足部分 %m.nf %m.nf 表示以小数形式输出表示以小数形式输出表示以小数形式输出表示以小数形式输出, , 输输输输出结果共占出结果共占出结果共占出结果共占mm位,其中小数部分位,其中小数部分位,其中小数部分位,其中小数部分占占占占n n位如果输出结果不足位如果输出结果不足位如果输出结果不足位如果输出结果不足mm个个个个 字符,则在其左边以空格补足字符,则在其左边以空格补足字符,则在其左边以空格补足字符,则在其左边以空格补足 6666格式转义字符格式转义字符 字符形式字符形式字符形式字符形式 功功功功 能能能能\n (*) \n (*) 换行换行换行换行\t (*) \t (*) 横向跳格(即跳到下一个输出区)横向跳格(即跳到下一个输出区)横向跳格(即跳到下一个输出区)横向跳格(即跳到下一个输出区)\v \v 竖向跳格竖向跳格竖向跳格竖向跳格\b \b 退格退格退格退格 \r \r 回车回车回车回车 \” (*) \” (*) 双引号字符双引号字符双引号字符双引号字符 \\ (*) \\ (*) 反斜杠字符反斜杠字符反斜杠字符反斜杠字符““““\ \””””\’ (*) \’ (*) 单引号字符单引号字符单引号字符单引号字符\ddd 1\ddd 1到到到到3 3位位位位8 8进制数所代表的字符进制数所代表的字符进制数所代表的字符进制数所代表的字符\xhh 1\xhh 1到到到到2 2位位位位1616进制数所代表的字符进制数所代表的字符进制数所代表的字符进制数所代表的字符 6767【例【例【例【例3-23-23-23-2】转义字符的应用】转义字符的应用】转义字符的应用】转义字符的应用main( )main( )main( )main( ) { { { { printf("Chinese\tEnglish\n"); printf("Chinese\tEnglish\n"); printf("Chinese\tEnglish\n"); printf("Chinese\tEnglish\n"); printf("\"Welcome ,friends!\"\n"); printf("\"Welcome ,friends!\"\n"); printf("\"Welcome ,friends!\"\n"); printf("\"Welcome ,friends!\"\n"); printf("\101, \x41\n"); printf("\101, \x41\n"); printf("\101, \x41\n"); printf("\101, \x41\n"); } } } }转义字符转义字符转义字符转义字符'\t''\t'使字符串使字符串使字符串使字符串"English“"English“输出到第输出到第输出到第输出到第2 2个输出区个输出区个输出区个输出区 转义字符转义字符转义字符转义字符\”\”用以输出用以输出用以输出用以输出双引号字符。
双引号字符双引号字符双引号字符 \101\101以八进制形式以八进制形式以八进制形式以八进制形式给出大写字母给出大写字母给出大写字母给出大写字母A A的的的的ASCASC码值码值码值码值6565 \x41\x41以十六进制形式以十六进制形式以十六进制形式以十六进制形式给出大写字母给出大写字母给出大写字母给出大写字母A A的的的的ASCASC码值码值码值码值65656868 二二. .格式输入函数格式输入函数scanfscanf()() 功能功能∶ ∶从键盘输入数据,并存入相应变量从键盘输入数据,并存入相应变量 的存储单元的存储单元使用格式使用格式∶ ∶ scanfscanf(格式控制,地址表)(格式控制,地址表)与与与与printf()printf()函数的格式函数的格式函数的格式函数的格式控制类似,以控制类似,以控制类似,以控制类似,以%d%d%f,%c,%s%f,%c,%s为最常用为最常用为最常用为最常用由取地址运算符由取地址运算符由取地址运算符由取地址运算符“&”“&”取出变量的存储取出变量的存储取出变量的存储取出变量的存储单元的起始地址单元的起始地址单元的起始地址单元的起始地址6969 格式字符格式字符格式字符格式字符 说说说说 明明明明 c c c c 用以输入单个字符用以输入单个字符用以输入单个字符用以输入单个字符 d d d d 用以输入有符号的十进制整数用以输入有符号的十进制整数用以输入有符号的十进制整数用以输入有符号的十进制整数 f f f f 用以输入实数,可以用小数形式或指数形式输入用以输入实数,可以用小数形式或指数形式输入用以输入实数,可以用小数形式或指数形式输入用以输入实数,可以用小数形式或指数形式输入 L L L L 用以输入长整型数据以及用以输入长整型数据以及用以输入长整型数据以及用以输入长整型数据以及doubledoubledoubledouble型数据型数据型数据型数据 o o o o 用以输入无符号的八进制整数用以输入无符号的八进制整数用以输入无符号的八进制整数用以输入无符号的八进制整数 s s s s 用以输入字符串,将字符串送到一个字符数组中,用以输入字符串,将字符串送到一个字符数组中,用以输入字符串,将字符串送到一个字符数组中,用以输入字符串,将字符串送到一个字符数组中, 在输入时以非空白字符开始,以第一个空白字符在输入时以非空白字符开始,以第一个空白字符在输入时以非空白字符开始,以第一个空白字符在输入时以非空白字符开始,以第一个空白字符 结束。
字符串以串结束标志结束字符串以串结束标志结束字符串以串结束标志结束字符串以串结束标志’\0’’\0’’\0’’\0’作为其最后一个字作为其最后一个字作为其最后一个字作为其最后一个字符符符符 u u u u 用以输入无符号的十进制整数用以输入无符号的十进制整数用以输入无符号的十进制整数用以输入无符号的十进制整数 x x x x或或或或X X X X 用来输入无符号的十六进制整数(大小写作用相同)用来输入无符号的十六进制整数(大小写作用相同)用来输入无符号的十六进制整数(大小写作用相同)用来输入无符号的十六进制整数(大小写作用相同) * * * * 表示本输入项在读入后不赋给相应的变量表示本输入项在读入后不赋给相应的变量表示本输入项在读入后不赋给相应的变量表示本输入项在读入后不赋给相应的变量 域宽域宽域宽域宽 指定输入数据所占宽度(列数),域宽应为正整数指定输入数据所占宽度(列数),域宽应为正整数指定输入数据所占宽度(列数),域宽应为正整数指定输入数据所占宽度(列数),域宽应为正整数常用的常用的常用的常用的scanf()scanf()scanf()scanf()格式字符表格式字符表格式字符表格式字符表 7070 【例【例【例【例3-33-33-33-3】输入格式控制符的应用】输入格式控制符的应用】输入格式控制符的应用】输入格式控制符的应用 main( ) main( ) main( ) main( ) { { { { int a,b; float c,d; char e; int a,b; float c,d; char e; int a,b; float c,d; char e; int a,b; float c,d; char e; scanf("%d %d",&a,&b); scanf("%d %d",&a,&b); scanf("%d %d",&a,&b); scanf("%d %d",&a,&b); scanf("%f, %f",&c,&d); scanf("%f, %f",&c,&d); scanf("%f, %f",&c,&d); scanf("%f, %f",&c,&d); scanf("%c",&e); scanf("%c",&e); scanf("%c",&e); scanf("%c",&e); printf("%d+%d=%d\n",a,b,a+b); printf("%d+%d=%d\n",a,b,a+b); printf("%d+%d=%d\n",a,b,a+b); printf("%d+%d=%d\n",a,b,a+b); printf("%f-%f=%f\n",c,d,c-d); printf("%f-%f=%f\n",c,d,c-d); printf("%f-%f=%f\n",c,d,c-d); printf("%f-%f=%f\n",c,d,c-d); printf("%c\n",e); printf("%c\n",e); printf("%c\n",e); printf("%c\n",e); } } } }当二个当二个当二个当二个%d%d之间没有分隔符时,之间没有分隔符时,之间没有分隔符时,之间没有分隔符时,相应的二个输入数据之间也相应的二个输入数据之间也相应的二个输入数据之间也相应的二个输入数据之间也必须用空格分隔必须用空格分隔必须用空格分隔必须用空格分隔当二个当二个当二个当二个%f%f之间用逗号分隔时,相应之间用逗号分隔时,相应之间用逗号分隔时,相应之间用逗号分隔时,相应的二个输入数据之间也必须用逗号的二个输入数据之间也必须用逗号的二个输入数据之间也必须用逗号的二个输入数据之间也必须用逗号分隔分隔分隔分隔71713.3 3.3 3.3 3.3 字符输入、输出函数字符输入、输出函数字符输入、输出函数字符输入、输出函数getchar()getchar()getchar()getchar()和和和和putchar() putchar() putchar() putchar() 一一一一. . . .字符输出函数字符输出函数字符输出函数字符输出函数putchar()putchar()putchar()putchar()putchar()putchar()putchar()putchar()函数用以输出字符变量的值。
函数用以输出字符变量的值函数用以输出字符变量的值函数用以输出字符变量的值调用调用调用调用putchar()putchar()putchar()putchar()函数的一般格式:函数的一般格式:函数的一般格式:函数的一般格式: putchar(putchar(putchar(putchar(整型表达式整型表达式整型表达式整型表达式) ) ) );;;; 其中,其中,其中,其中,““““整型表达式整型表达式整型表达式整型表达式””””的值应当在字符的值应当在字符的值应当在字符的值应当在字符ASCASCASCASC码值的范码值的范码值的范码值的范围内通常,围内通常,围内通常,围内通常,putchar()putchar()putchar()putchar()的参数是字符型变量、字符的参数是字符型变量、字符的参数是字符型变量、字符的参数是字符型变量、字符常量,也可以是整型变量、整型常量常量,也可以是整型变量、整型常量常量,也可以是整型变量、整型常量常量,也可以是整型变量、整型常量7272【例【例【例【例3-43-43-43-4】字符输出函数】字符输出函数】字符输出函数】字符输出函数 putchar() putchar() putchar() putchar() 的应用的应用的应用的应用 #include
入一个字符入一个字符入一个字符 调用调用调用调用getchar( )getchar( )getchar( )getchar( )函数的一般格式:函数的一般格式:函数的一般格式:函数的一般格式: getchar() getchar() getchar() getchar()【例【例【例【例3-53-53-53-5】字符输入函数】字符输入函数】字符输入函数】字符输入函数 getchar() getchar() getchar() getchar() 的使用的使用的使用的使用 #include
序设计2.2.熟练掌握熟练掌握熟练掌握熟练掌握 for for for for 语句、语句、语句、语句、while while while while 语句和语句和语句和语句和 do…while do…while do…while do…while 语句,会利用这三种语句进行语句,会利用这三种语句进行语句,会利用这三种语句进行语句,会利用这三种语句进行循环结构的程序设计循环结构的程序设计循环结构的程序设计循环结构的程序设计3.3.掌握掌握掌握掌握 break break break break 语句和语句和语句和语句和 continue continue continue continue 语句与上述语句与上述语句与上述语句与上述语句配合使用的方法语句配合使用的方法语句配合使用的方法语句配合使用的方法7777主要内容主要内容–程序算法的概念程序算法的概念–顺序结构顺序结构–分支结构分支结构–循环结构循环结构7878 4.1 4.1 程序算法简介程序算法简介计算机科学家沃思提出公式:计算机科学家沃思提出公式: 数据结构 + 算法 = 程序 数据结构数据结构──对数据的描述。
如前面所介绍的各对数据的描述如前面所介绍的各 种数据类型就是最简单的数据结构种数据类型就是最简单的数据结构 算法算法──对操作的描述对操作的描述, ,是为解决一个问题而采取是为解决一个问题而采取 的方法和步骤通常用流程图表示算法的方法和步骤通常用流程图表示算法一一. .算法的概念算法的概念 计算计算1+2+3+4+…+1001+2+3+4+…+100可以二种不同的算法:可以二种不同的算法:算法一:算法一:先作先作1+21+2,再加,再加3 3,再加,再加4 4,一直加到,一直加到100100,最后得到,最后得到 结果:结果:50505050算法二:算法二:利用等差数列求和公式:利用等差数列求和公式: n(n+1) n(n+1) 2 21+2+3+……+n=1+2+3+……+n=7979 比较算法一和算法二:比较算法一和算法二: 算法二不具有普遍性,许多级数求和问题是不能简单地用公算法二不具有普遍性,许多级数求和问题是不能简单地用公 式表示的,如:式表示的,如: cos1+cos2+cos3+……+cosn cos1+cos2+cos3+……+cosn 算法一所反复实施的是二个数的加法运算:算法一所反复实施的是二个数的加法运算:1 1、、1 1++2 2、、(1+2)+3(1+2)+3、、(1+2+3)+4(1+2+3)+4、、…………、、(1+2+3+……+99)+100(1+2+3+……+99)+100这种看似枯燥、单一,反复实施的运算利用这种看似枯燥、单一,反复实施的运算利用C C语言提供的选语言提供的选择结构和循环结构却是很容易实现的,而且这一算法适用于择结构和循环结构却是很容易实现的,而且这一算法适用于不同的级数求和问题。
由于计算机具有极高的运算速度,这不同的级数求和问题由于计算机具有极高的运算速度,这样的程序结构恰好发挥了计算机的特长样的程序结构恰好发挥了计算机的特长结论:结论: 对计算机而言,算法一优于算法二对计算机而言,算法一优于算法二选择一个好的算法是设计出高质量程序的前提选择一个好的算法是设计出高质量程序的前提 8080【例【例4-14-1】为计算】为计算1+2+3+……+n1+2+3+……+n设计一个算法,其中设计一个算法,其中 n n的值由键盘输入的值由键盘输入步骤步骤1 1::从键盘输入从键盘输入n n的值的值步骤步骤2 2::0 0 sum sum (使变量(使变量sumsum具有初值具有初值0 0))步骤步骤3 3::1 1 i i(使变量(使变量i i具有初值具有初值1 1))步骤步骤4 4::sum+isum+i sum sum (用(用sum+isum+i的值取代的值取代sumsum原原 来的值)来的值)步骤步骤5 5::i+1i+1 i i (使变量(使变量i i的值增的值增1 1))步骤步骤6 6::若若i≤n, i≤n, 再返回到步骤再返回到步骤4 4,否则结束。
否则结束说明:说明:算法中,步骤算法中,步骤4 4到步骤到步骤6 6组成一个循环,最后的计算组成一个循环,最后的计算结果存放在变量结果存放在变量sumsum中上述算法中的每一个步骤都可以用上述算法中的每一个步骤都可以用C C语言来描述,并语言来描述,并最终成为一个完整的最终成为一个完整的C C程序 8181二二. . 算法的表示算法的表示 算法用流程图来表示所谓流程图就是用一些算法用流程图来表示所谓流程图就是用一些图框表示各种操作,形象直观,易于理解图框表示各种操作,形象直观,易于理解 常用的流程图符号常用的流程图符号 ::或开始、结束框开始、结束框开始、结束框开始、结束框输入、输出框输入、输出框输入、输出框输入、输出框处理框处理框处理框处理框判断框判断框判断框判断框流程线流程线流程线流程线8282 按算法一计算按算法一计算1 1++2 2++3 3++……..……..++n n 的流程图,的流程图, 其中其中n n的值由键盘输入的值由键盘输入 开始开始输入输入n0 sum1 isum++i faci+1 i i≤n ?y输出输出sumn结束结束返回8383三三. . 算法的特性算法的特性1.1.有穷性:有穷性:一个算法所包含的操作步骤必须是有限的。
一个算法所包含的操作步骤必须是有限的2.2.确定性:确定性:指算法中的每一个步骤的含义必须是明确指算法中的每一个步骤的含义必须是明确 的,不能有二义性的,不能有二义性3.3.由零个或多个输入:由零个或多个输入:如果算法中的如果算法中的n n是已知的数据,是已知的数据, 而不是来自外部,可以没有输入而不是来自外部,可以没有输入4.4.有一个或多个输出:有一个或多个输出:通过输出了解算法的结果通过输出了解算法的结果5.5.有效性:有效性:算法中的每一个步骤都应当是可以被执行算法中的每一个步骤都应当是可以被执行 的,并能得到确定的结果的,并能得到确定的结果84844.2 4.2 顺序结构顺序结构 语句语句1 1语句语句2 2 顺序结构:顺序结构:顺序结构:顺序结构: 顺序结构是最简单的顺序结构是最简单的顺序结构是最简单的顺序结构是最简单的程序结构,在执行时,程序结构,在执行时,程序结构,在执行时,程序结构,在执行时,按语句的先后次序依按语句的先后次序依按语句的先后次序依按语句的先后次序依次执行,次执行,次执行,次执行,直至结束。
直至结束直至结束直至结束 8585【例【例4-24-2】编写程序,要求从键盘输入圆的半径】编写程序,要求从键盘输入圆的半径r r,, 计算圆的面积计算圆的面积s s和周长和周长l l #define PI 3.1415926#define PI 3.1415926 main() main() { { float s,l,r; float s,l,r; printf("Please Input r"); printf("Please Input r"); scanf("%f",&r); scanf("%f",&r); s=PI*r*r; s=PI*r*r; l l==2*PI*r;2*PI*r; printf("r=%f,s printf("r=%f,s==%f,l%f,l==%f\n",r,s,l);%f\n",r,s,l); } }将将r r2 2表示为表示为r*rr*r或或用函数表示为用函数表示为∶∶pow(r,2)pow(r,2)定义符号常量定义符号常量8686【例【例4-34-3】从键盘上输入一个三位正整数,然后逆序】从键盘上输入一个三位正整数,然后逆序 输出输出 main() main() { { int a,b; int a,b; scanf("%d",&a); scanf("%d",&a); b=a%10; b=a%10; a/=10; a/=10; printf("%d",b); printf("%d",b); b=a%10; b=a%10; printf("%d",b); printf("%d",b); a/=10; a/=10; printf("%d\n",a); printf("%d\n",a); } } 取出个位数取出个位数得到由百位数数字得到由百位数数字和个位数数字组成和个位数数字组成的二位数的二位数87874.3 4.3 关系运算符和关系运算表达式关系运算符和关系运算表达式 一一. .关系运算符关系运算符关系运算符用于表达式之间的比较:关系运算符用于表达式之间的比较:大于比较运算符:大于比较运算符: > > 小于比较运算符:小于比较运算符: < < 大于等于比较运算符:大于等于比较运算符: >= >= 小于等于比较运算符:小于等于比较运算符:<= <= 等于比较运算符:等于比较运算符: == == 不等于比较运算符:不等于比较运算符:!= != 关系运算符按运算优先级可分为二组:关系运算符按运算优先级可分为二组:> >、、< <、、>=>=、、<= <= 具有相同的运算优先级,具有相同的运算优先级,== == 和和!=!=具具有相同的运算优先级。
后一组的运算优先级又低于有相同的运算优先级后一组的运算优先级又低于前一组同优先级的关系运算符遵循同优先级的关系运算符遵循左结合左结合 ── ── 自左至右的自左至右的结合方向结合方向 8888二二二二. . . . 关系运算表达式关系运算表达式关系运算表达式关系运算表达式 二个表达式通过关系运算符连接而成为关系运二个表达式通过关系运算符连接而成为关系运二个表达式通过关系运算符连接而成为关系运二个表达式通过关系运算符连接而成为关系运算表达式算表达式算表达式算表达式 关系运算表达式的一般形式为:关系运算表达式的一般形式为:关系运算表达式的一般形式为:关系运算表达式的一般形式为: < < < <表达式表达式表达式表达式1><1><1><1><关系运算符关系运算符关系运算符关系运算符><><><><表达式表达式表达式表达式2> 2> 2> 2> 例如:例如:例如:例如: c>a+b c>a+b c>a+b c>a+b、、、、a! =2a! =2a! =2a! =2、、、、-5<=b-c -5<=b-c -5<=b-c -5<=b-c 都是合法的关系都是合法的关系都是合法的关系都是合法的关系 运算表达式。
运算表达式运算表达式运算表达式关系运算表达式的结果为逻辑值关系运算表达式的结果为逻辑值关系运算表达式的结果为逻辑值关系运算表达式的结果为逻辑值 1 1(表示(表示““真真””))── ── 当关系运算表达式当关系运算表达式 成立时成立时(True)(True) 逻辑值逻辑值 = = 0 0(表示(表示““假假””))── ── 当关系运算表达式当关系运算表达式 不成立时不成立时(False)(False) 8989 关系运算符的优先级关系运算符的优先级高高 算术运算符:算术运算符:+ - * / %+ - * / % 关系运算符:关系运算符:> < >= <=> < >= <= 关系运算符:关系运算符:== !=== !=低低 赋值运算符:赋值运算符:= += -= *= /= %== += -= *= /= %=9090【例【例【例【例4-44-44-44-4】设:】设:】设:】设:a=3, b=4, c=5a=3, b=4, c=5a=3, b=4, c=5a=3, b=4, c=5,判断下列各关系运算表达式的,判断下列各关系运算表达式的,判断下列各关系运算表达式的,判断下列各关系运算表达式的结果。
结果1)(1)(1)(1) x = b > ax = b > ax = b > ax = b > a(2)(2)(2)(2) 由于由于由于由于关系运算符优先于赋值运算符关系运算符优先于赋值运算符关系运算符优先于赋值运算符关系运算符优先于赋值运算符,所以,所以,所以,所以 原式等价于原式等价于原式等价于原式等价于 x = ( b > a ),x = ( b > a ),x = ( b > a ),x = ( b > a ),由题设可知由题设可知由题设可知由题设可知 b>a b>a b>a b>a 成立,结果为成立,结果为成立,结果为成立,结果为1, 1, 1, 1, 故最后执行赋值运算故最后执行赋值运算故最后执行赋值运算故最后执行赋值运算 x=1x=1x=1x=1 (2) a != b >= c(2) a != b >= c(2) a != b >= c(2) a != b >= c 由于由于由于由于关系运算符关系运算符关系运算符关系运算符 != != != != 的运算优先级低于关系运算符的运算优先级低于关系运算符的运算优先级低于关系运算符的运算优先级低于关系运算符 >=>=>=>=, , , ,所以所以所以所以原式等价于原式等价于原式等价于原式等价于 a != ( b >= c ),a != ( b >= c ),a != ( b >= c ),a != ( b >= c ),由题设可知由题设可知由题设可知由题设可知 b>=c b>=c b>=c b>=c 不成立,不成立,不成立,不成立,结果为结果为结果为结果为0, 0, 0, 0, 原式可化为原式可化为原式可化为原式可化为 a!=0,a!=0,a!=0,a!=0,由题设可知由题设可知由题设可知由题设可知a!=0a!=0a!=0a!=0成立,结果成立,结果成立,结果成立,结果为为为为1 1 1 1。
9191(3) ( a > b ) > ( b < c)(3) ( a > b ) > ( b < c)(3) ( a > b ) > ( b < c)(3) ( a > b ) > ( b < c)由题设可知,由题设可知,由题设可知,由题设可知,a>b a>b a>b a>b 不成立,结果为不成立,结果为不成立,结果为不成立,结果为0, b
92924.4 4.4 逻辑运算符和逻辑运算表达式逻辑运算符和逻辑运算表达式 逻辑运算符包括逻辑运算符包括逻辑运算符包括逻辑运算符包括∶∶∶∶ ! ! (逻辑非运算)(逻辑非运算)(逻辑非运算)(逻辑非运算)&&&& (逻辑与运算)(逻辑与运算)(逻辑与运算)(逻辑与运算)|||| (逻辑或运算)(逻辑或运算)(逻辑或运算)(逻辑或运算) 逻辑表达式逻辑表达式逻辑表达式逻辑表达式∶∶∶∶ 用逻辑运算符连接而成的表达式用逻辑运算符连接而成的表达式用逻辑运算符连接而成的表达式用逻辑运算符连接而成的表达式逻辑逻辑逻辑逻辑 运算的结果为逻辑值,以运算的结果为逻辑值,以运算的结果为逻辑值,以运算的结果为逻辑值,以1 1 1 1表示表示表示表示““““真真真真”(true),”(true),”(true),”(true), 以以以以0 0 0 0表示表示表示表示““““假假假假”(false)”(false)”(false)”(false)9393高高 逻辑运算符:逻辑运算符:! ! 算术运算符:算术运算符:+ +、、 - -、、 * * 、、/ / 、、% % 关系运算符:关系运算符:> > 、、< <、、 >= >=、、 <= <= 关系运算符:关系运算符:== == 、、!= != 逻辑运算符:逻辑运算符:&& && 、、||||低低 赋值运算符:赋值运算符:= =、、 += +=、、 -= -=、、 *= *=、、 /= /=、、n %=n %=运算符的优先级:运算符的优先级:注意:注意: C C++允许算术运算表达式参与逻辑运算,在参++允许算术运算表达式参与逻辑运算,在参与逻辑运算时,与逻辑运算时,一切非零值均作为逻辑值一切非零值均作为逻辑值一切非零值均作为逻辑值一切非零值均作为逻辑值1 1 1 1,而将,而将,而将,而将零值作为逻辑值零值作为逻辑值零值作为逻辑值零值作为逻辑值0 0 0 0。
9494逻辑运算法则:逻辑运算法则: (设(设A A,,B B是参与逻辑运算的二个量)是参与逻辑运算的二个量)逻辑逻辑““与与””运算法则:运算法则:( ( 运算符:运算符:&& )&& ) A && B A && B 的结果为的结果为1, 1, 当且仅当当且仅当A, BA, B的值均为的值均为 非非0 0,否则,,否则,A && B A && B 的结果为的结果为0 0 例如:例如: 1 && 0 1 && 0 的结果为的结果为0 0 -5 && 3.14 -5 && 3.14 的结果为的结果为1 1 0 && 0 0 && 0的结果为的结果为0 0 9595逻辑逻辑““或或””运算法则:运算法则:( ( 运算符:运算符:|| )|| ) A || B A || B 的结果为的结果为0, 0, 当且仅当当且仅当A A、、B B的值均为的值均为0 0,, 否则,否则,A || B A || B 的结果为的结果为1 1 例如:例如: 1 || 0 1 || 0 的结果为的结果为1 1 -5 || 3.14 -5 || 3.14 的结果为的结果为1 1 0 || 0 0 || 0的结果为的结果为0 0 逻辑逻辑““非非””运算法则:运算法则:( ( 运算符:运算符: !!) ) !A !A 的结果为的结果为0, 0, 当且仅当当且仅当A A的值为非的值为非0 0,, 否则,否则,!A!A的结果为的结果为1 1。
例如:例如: !0 !0 的结果为的结果为1 1 !3.14 !3.14 的结果为的结果为0 09696【例【例4-54-5】设】设 int a= 3, b = 4, c = 5 int a= 3, b = 4, c = 5;判断下列;判断下列表达式的值:表达式的值: 说明:说明: 由于逻辑与、或运算的优先级低于关系运算符,由于逻辑与、或运算的优先级低于关系运算符, 故将下列各式中的括号去除后对结果没有影响故将下列各式中的括号去除后对结果没有影响1) (a>b)||(c>a)(1) (a>b)||(c>a) 由题设可知,原式等于由题设可知,原式等于 0 || 1, 0 || 1, 结果为结果为1 12) (!ca)||(ba)||(b3)||(4<3) (!5<3)&&(4>3)||(4<3) 由于逻辑非运算的优先级高于关系运算符,而由于逻辑非运算的优先级高于关系运算符,而!5!5 的值为的值为 0, 0,故原式又等于故原式又等于 (0<3)&&(4>3)||(4<3) (0<3)&&(4>3)||(4<3) 也即是:也即是:1 && 1||01 && 1||0,按自左向右的结合方向,,按自左向右的结合方向, 最后结果为最后结果为1 1。
9797【【【【例例例例4-64-64-64-6】】】】设设设设 int int int int a= a= a= a= 3, 3, 3, 3, b b b b = = = = 4, 4, 4, 4, c c c c = = = = 5 5 5 5;;;;判判判判断断断断表表表表达达达达式式式式a= a= a= a= (b=!a) && (c=b)(b=!a) && (c=b)(b=!a) && (c=b)(b=!a) && (c=b)的值 原表达式等价于原表达式等价于原表达式等价于原表达式等价于a=((b=!a) && (c=b)) a=((b=!a) && (c=b)) a=((b=!a) && (c=b)) a=((b=!a) && (c=b)) C C C C语言规定:语言规定:语言规定:语言规定: 在在在在执执执执行行行行“&&”“&&”“&&”“&&”运运运运算算算算时时时时,,,,如如如如果果果果“&&”“&&”“&&”“&&”运运运运算算算算符符符符左左左左边边边边表表表表达达达达式式式式的的的的值值值值为为为为0 0 0 0,,,,则则则则已已已已经经经经可可可可以以以以确确确确定定定定“&&”“&&”“&&”“&&”运运运运算算算算的的的的结结结结果果果果一一一一定定定定为为为为0 0 0 0,,,,故故故故不不不不再再再再执执执执行行行行“&&”“&&”“&&”“&&”运运运运算算算算符符符符右右右右边边边边表表表表达达达达式式式式规规规规定定定定的的的的运运运运算算算算。
类类类类似似似似地地地地,,,,在在在在执执执执行行行行“||”“||”“||”“||”运运运运算算算算时时时时,,,,如如如如果果果果“||”“||”“||”“||”运运运运算算算算符符符符左左左左边边边边表表表表达达达达式式式式的的的的值值值值为为为为1 1 1 1,,,,则则则则已已已已经经经经可可可可以以以以确确确确定定定定“||”“||”“||”“||”运运运运算算算算的的的的结结结结果果果果一一一一定定定定为为为为1 1 1 1,,,,故故故故不不不不再再再再执执执执行行行行“||”“||”“||”“||”运运运运算算算算符符符符右右右右边边边边表表表表达达达达式式式式规规规规定定定定的的的的运算 由题设可知,由题设可知,由题设可知,由题设可知,!a!a!a!a的值为的值为的值为的值为0 0 0 0,故赋值运算表达式,故赋值运算表达式,故赋值运算表达式,故赋值运算表达式b=!ab=!ab=!ab=!a的值的值的值的值为为为为0 0 0 0,按,按,按,按C C C C语言规定,赋值运算表达式语言规定,赋值运算表达式语言规定,赋值运算表达式语言规定,赋值运算表达式(c=b)(c=b)(c=b)(c=b)将不被执行,将不被执行,将不被执行,将不被执行,c c c c的值还是的值还是的值还是的值还是5 5 5 5,,,,b b b b的值为的值为的值为的值为0 0 0 0,由于逻辑运算表达式,由于逻辑运算表达式,由于逻辑运算表达式,由于逻辑运算表达式(b=!a) (b=!a) (b=!a) (b=!a) && (c=b)&& (c=b)&& (c=b)&& (c=b)的值为的值为的值为的值为0 0 0 0,故,故,故,故a a a a的值为的值为的值为的值为0 0 0 0,整个赋值运算表达式,整个赋值运算表达式,整个赋值运算表达式,整个赋值运算表达式为为为为0 0 0 0。
9898逻辑表达式的应用举例逻辑表达式的应用举例1.1.1.1.数学中的数学中的数学中的数学中的 1≤x 1≤x 1≤x 1≤x<<<<5,5,5,5,并且并且并且并且 x≠3 x≠3 x≠3 x≠3可用逻辑表达式可用逻辑表达式可用逻辑表达式可用逻辑表达式表示为:表示为:表示为:表示为: x>=1 && x<5 && x!=3 x>=1 && x<5 && x!=3 x>=1 && x<5 && x!=3 x>=1 && x<5 && x!=3;;;;2.x2.x2.x2.x是是是是3 3 3 3的倍数或的倍数或的倍数或的倍数或5 5 5 5的倍数,可用逻辑表达式表示的倍数,可用逻辑表达式表示的倍数,可用逻辑表达式表示的倍数,可用逻辑表达式表示为:为:为:为: x%3==0 || x%5==0 x%3==0 || x%5==0 x%3==0 || x%5==0 x%3==0 || x%5==0;;;;99994.5 4.5 选择结构选择结构 在在在在许许许许多多多多场场场场合合合合,,,,需需需需要要要要根根根根据据据据不不不不同同同同的的的的情情情情况况况况执执执执行行行行不不不不同同同同的的的的语语语语句句句句。
称称称称这这这这种种种种程程程程序序序序结结结结构构构构为为为为选选选选择择择择结结结结构构构构C C C C语语语语言言言言提提提提供供供供的的的的条条条条件件件件语语语语句句句句和和和和开开开开关关关关语语语语句句句句可可可可用用用用于于于于实实实实现现现现选选选选择择择择结结结结构构构构程序设计程序设计程序设计程序设计 100100一一. if. if语句和语句和if…else…if…else…语句语句 ifif语句语句ifif语句的格式语句的格式:: if(if(表达式表达式) ) 语句语句 值为值为0 0值为非值为非0 0表达式表达式语句语句执行时,首先计算表达式的值,若其值不为执行时,首先计算表达式的值,若其值不为0 0 ( (表示真表示真) ),则执行语句部分,否则,则执行语句部分,否则, , 跳过语句跳过语句部分,执行其后面的语句部分,执行其后面的语句 101101【例【例4-74-7】从键盘输入实数】从键盘输入实数a a,输出,输出a a的绝对值的绝对值 main() main() { { float a; float a; printf("Enter a float\n"); printf("Enter a float\n"); scanf("%f",&a); scanf("%f",&a); if(a<0) if(a<0) a=-a; a=-a; printf("a=%f\n",a); printf("a=%f\n",a); } }若若a<0a<0成立,执行成立,执行a=-aa=-a否则直接执行否则直接执行printfprintf语句语句102102【例【例4-84-8】从键盘输入一个正整数】从键盘输入一个正整数n n,如果,如果n n是一个三位数,是一个三位数,将其逆序输出,否则,直接结束。
将其逆序输出,否则,直接结束 main()main() { { int a,b; int a,b; scanf("%d",&a); scanf("%d",&a); if((a>=100)&&(a<1000)) if((a>=100)&&(a<1000)) printf("The End\n"); printf("The End\n"); } }{ { b=a%10; b=a%10; a/=10; a/=10; printf("%d",b); printf("%d",b); b=a%10; b=a%10; printf("%d",b), printf("%d",b), a/=10; a/=10; printf("%d\n",a); printf("%d\n",a); } }复合语句复合语句取出个位数字取出个位数字取出由百位数字取出由百位数字和十位数字构成和十位数字构成的二位数的二位数103103 if……else……if……else……语句语句 if……else……if……else……语句的格式:语句的格式:if(if(表达式表达式) ) 语句语句1 1 else else 语句语句2 2值为非值为非0 0值为值为0 0表达式表达式语句语句1 1语句语句2 2执行时,首先计算表达式的值,若其值不为执行时,首先计算表达式的值,若其值不为0 0,则执行语,则执行语句句1, 1, 否则,执行语句否则,执行语句2 2。
语句语句1 1和语句和语句2 2必定有一个、而且必定有一个、而且只能有一个被执行之后,执行其后续语句只能有一个被执行之后,执行其后续语句 104104【例【例4-94-9】从键盘上输入两个整数】从键盘上输入两个整数a a和和b b,按先大后,按先大后 小的顺序输出小的顺序输出 main() main() { { int a,b; int a,b; printf("Please enter two integers\n"); printf("Please enter two integers\n"); scanf("%d,%d",&a,&b); scanf("%d,%d",&a,&b); if(a>b) if(a>b) printf("MAX=%d, MIN=%d,\n",a,b); printf("MAX=%d, MIN=%d,\n",a,b); else else printf("MAX=%d, MIN=%d,\n", b,a); printf("MAX=%d, MIN=%d,\n", b,a); } }a>ba>b成立,执行成立,执行这一语句这一语句a>ba>b不成立,执不成立,执行这一语句行这一语句105105例例4.10 4.10 输入输入a,b,ca,b,c,利用求根公式求一元二次方程,利用求根公式求一元二次方程 ax ax2 2+bx+c=0 +bx+c=0 的根。
的根 流程图流程图 ::开始输入a,b,c计算b*b-4*a*c并赋值给变量deltadelta>=0 ?计算:sqrt(delta)并将结果赋给变量delta输出实根结 束计算:sqrt(-delta)并将结果赋给变量delta输出复根开始开始输入输入a,b,ca,b,c计算计算b*b-4*a*cb*b-4*a*c并赋值给变量并赋值给变量deltadelta delt>=0?Yes No计算计算:sqrt(delta):sqrt(delta)并将结果赋给变量并将结果赋给变量 delta delta输出实根输出实根计算计算:sqrt(-delta):sqrt(-delta) 并将结果赋给变量并将结果赋给变量 delta delta输出复根输出复根结束结束106106#include
输入 main()main() { { int a,b,c,max; int a,b,c,max; print{("Please enter three integers:\n"); print{("Please enter three integers:\n"); scanf("%d,%d,%d",&a,&b,&c); scanf("%d,%d,%d",&a,&b,&c); if (a>b) if (a>b) max=a; max=a; else else max=b; max=b; if (max 在某些情况下,条件语句在某些情况下,条件语句if……else……if……else……可以用条件运算表可以用条件运算表达式来代替达式来代替 条件运算表达式的格式:条件运算表达式的格式: 表达式表达式1? 1? 表达式表达式2 2:表达式:表达式3 3 执行时,先判断表达式执行时,先判断表达式1 1的值,如果其不为的值,如果其不为0 0,则以表达式,则以表达式2 2 的值作为条件运算表达式的值,否则,以表达式的值作为条件运算表达式的值,否则,以表达式3 3的值作为的值作为 条件运算表达式的值条件运算表达式的值 例如,赋值语句:例如,赋值语句: y=x>0? 10 y=x>0? 10::-10-10;; 等价于等价于:条件语句:条件语句: if (x>0) if (x>0) y y==10; 10; else else y y==-10; -10; 只有在只有在ifif语句内嵌的语句为语句内嵌的语句为赋值语句、且两个分支都给赋值语句、且两个分支都给同一个变量赋值时,才能用同一个变量赋值时,才能用条件表达式代替条件表达式代替ifif语句语句 109109【例【例4-124-12】从键盘输入二个整数,输出其中的较大者。 从键盘输入二个整数,输出其中的较大者main()main() { { int a,b; int a,b; printf("Please input two integers:\n "); printf("Please input two integers:\n "); scanf("%d,%d ",&a,&b); scanf("%d,%d ",&a,&b); printf("MAX=%d\n ", (a>b)? a:b); printf("MAX=%d\n ", (a>b)? a:b); } }使用条件运算符使用条件运算符使程序变得简洁使程序变得简洁110110二二. .条件语句的嵌套条件语句的嵌套 C C语言允许在条件语句中又包含另一个条件语语言允许在条件语句中又包含另一个条件语 句,称之为条件语句的嵌套句,称之为条件语句的嵌套 在在ifif语句中又嵌套语句中又嵌套了另一个了另一个ifif语句语句【例【例4-134-13】从键盘上输入一个字符,判断它是英文字母、】从键盘上输入一个字符,判断它是英文字母、 数字或其它字符。 数字或其它字符 输入的是数字?输入的是数字?输入的是字母输入的是字母 ?? 显示:是数字显示:是数字 显示:是字母显示:是字母 显示:是其它字符显示:是其它字符 结结 束束yesnoyesno流程简图:流程简图:111111程序:程序:程序:程序:#include 则输出出错信息 输入输入a,b,ca,b,c 开始开始 a≠0 ? a≠0 ?其余部分请参阅图其余部分请参阅图4 - 64 - 6中的相应部分中的相应部分 显示:显示: Error! Error! 结束结束计算计算b*b-4*a*cb*b-4*a*c并赋值给变量并赋值给变量deltadelta delta delta >=0=0? ?其余部分请参阅图其余部分请参阅图4 - 64 - 6中的相应部分中的相应部分 yesnoyesno流程图:流程图:113113“if” “if” 和和“else”“else”的正确配对的正确配对 复合语句和条件语句的嵌套结构为解决一些较为复杂的复合语句和条件语句的嵌套结构为解决一些较为复杂的编程问题提供了必要的条件但同时也使程序的结构变得编程问题提供了必要的条件但同时也使程序的结构变得复杂,不易读懂特别是在程序中有多个复杂,不易读懂特别是在程序中有多个{ }{ }和和if…else…if…else…的情况 在在阅阅读读程程序序之之前前,,必必须须能能正正确确地地将将“{”“{”和和“}”“}”配配对对、、将将“if”“if”和和“else”“else”配对,使程序的结构变得清晰和有条理。 配对,使程序的结构变得清晰和有条理if” “if” 和和“else”“else”配对应遵循下述规律:配对应遵循下述规律:自上而下,自上而下,“else”“else”总是和上面离它最近的总是和上面离它最近的“if”“if”配对而且,配对而且,每每一一个个“else”“else”只只能能和和一一个个“if”“if”配配对对由由于于单单独独的的“if”“if”也也是是条件语句,所以,允许无条件语句,所以,允许无“else”“else”配对的配对的“if”“if”单独存在单独存在同理,同理,“{”“{”和和“}”“}”配对应遵循下述规律:配对应遵循下述规律:自上而下,自上而下,“}”“}”总是和上面离它最近的总是和上面离它最近的“{”“{”配对114114【例【例4-154-15】如果变量】如果变量x x的值是的值是-15, -15, 变量变量y y的值是的值是-10, -10, 则执则执 行下面的程序段后,屏幕上显示的内容是什么?行下面的程序段后,屏幕上显示的内容是什么?if(x>0)if(x>0)if(x>10)if(x>10)printf("A");printf("A");elseelseprintf("B");printf("B");elseelseif(y<-8)if(y<-8)if(y>-20)if(y>-20)printf("C");printf("C");elseelseprintf("D");printf("D");printf("E"); printf("E"); 为了看清程序结构,必须先将为了看清程序结构,必须先将ifif和和elseelse正确配对。 正确配对115115if(x>0)if(x>0)if(x>10)if(x>10)printf("A");printf("A");elseelseprintf("B");printf("B");elseelseif(y<-8)if(y<-8)if(y>-20)if(y>-20)printf("C");printf("C");elseelseprintf("D");printf("D"); printf("E"); printf("E");if(x>0)if(x>0) if(x>10) if(x>10) printf("A"); printf("A"); else else printf("B"); printf("B"); else else if(y<-8) if(y<-8) if(y>-20) if(y>-20) printf("C"); printf("C"); else else printf("D"); printf("D"); printf("E"); printf("E");将将ifif和和elseelse正确配对:正确配对:该程序段采用了缩进格式,该程序段采用了缩进格式,这种格式更容易反映出程这种格式更容易反映出程序结构。 序结构 116116 显示:显示:E Ex>0x>0 ? ?x>10 ?x>10 ? 显示:显示:A A 显示:显示:B B y<-8 y<-8 ? ? y>-20 y>-20 ? 显示:显示:C C 显示:显示:D Dyesyesnonoyesnonoyes流程图:流程图:117117switch switch switch switch 语句的格式:语句的格式:语句的格式:语句的格式: switch(switch(switch(switch(整型表达式整型表达式整型表达式整型表达式) ) ) ) { { { { case case case case 整型常量表达式整型常量表达式整型常量表达式整型常量表达式1:1:1:1:语句序列语句序列语句序列语句序列1 1 1 1 〖〖〖〖 break; break; break; break; 〗〗〗〗 case case case case 整型常量表达式整型常量表达式整型常量表达式整型常量表达式2:2:2:2:语句序列语句序列语句序列语句序列2 2 2 2 〖〖〖〖 break; break; break; break; 〗〗〗〗 …… …… …… …… case case case case 整型常量表达式整型常量表达式整型常量表达式整型常量表达式k:k:k:k:语句序列语句序列语句序列语句序列k k k k 〖〖〖〖 break; break; break; break; 〗〗〗〗 〖〖〖〖 default: default: default: default:语句序列语句序列语句序列语句序列k+1 k+1 k+1 k+1 〗〗〗〗 } } } }三三. .开关语句开关语句 开关语句用于在程序中实现多路选择。 开关语句用于在程序中实现多路选择118118Yes语句序列语句序列1 1语句序列语句序列2 2有有 break break ? ?有有 break break ? ?语句序列语句序列k-1k-1有有 break break ? ?语句序列语句序列k k语句序列语句序列k+1k+1开开关关语语句句之之后后的语句的语句有有 break break ? ?开关:开关:整型表达式整型表达式………YesYesYesnonononoSwitch语句的执行流程:119119说明:说明:说明:说明: 格式中的格式中的格式中的格式中的breakbreakbreakbreak语句不是必须的,应根据需要而语句不是必须的,应根据需要而语句不是必须的,应根据需要而语句不是必须的,应根据需要而 定 格式中的格式中的格式中的格式中的defaultdefaultdefaultdefault语句不是必须的,在缺省的情语句不是必须的,在缺省的情语句不是必须的,在缺省的情语句不是必须的,在缺省的情 况下,相当于语句序列况下,相当于语句序列况下,相当于语句序列况下,相当于语句序列k+1k+1k+1k+1是空语句。 是空语句是空语句是空语句 格式中的格式中的格式中的格式中的{ }{ }{ }{ }是必须的是必须的是必须的是必须的1)switch(1)switch语句与语句与ifif语句的不同之处在于:语句的不同之处在于: switch switch语句只能对整型语句只能对整型( (含字符型含字符型) )表达式的值是否等于表达式的值是否等于 给定的值进行判断,而给定的值进行判断,而ifif语句可以用于判断各种表达式语句可以用于判断各种表达式2)switch(2)switch语句中,语句中,casecase后面只能是常量后面只能是常量3)(3)同一个同一个switchswitch语句中,任意两个语句中,任意两个casecase后面的常量值不能后面的常量值不能 相同 注意:注意:120120【例【例4-164-16】编写一个四则运算计算器程序】编写一个四则运算计算器程序, , 可以实现输入二可以实现输入二 个数和一个四则运算符,输出运算结果的功能个数和一个四则运算符,输出运算结果的功能main()main() { { float operandl,operand2,result; float operandl,operand2,result; char operator; char operator; scanf("%f,%c,%f",&operandl,&operator,&operand2); scanf("%f,%c,%f",&operandl,&operator,&operand2); switch(operator) switch(operator) { { case '+': case '+': result result==operandl+operand2;operandl+operand2; break; break; case '-': case '-': result=operandl result=operandl一一operand2;operand2; break; break; case '*': case '*': result=operandl*operand2; result=operandl*operand2; break; break; case '/': case '/': result result==operandloperandl//operand2;operand2; break; break; default: default: printf("Illegal operator , error!\n"); printf("Illegal operator , error!\n"); } } printf("result=%f\n",result); printf("result=%f\n",result); } }由由operatoroperator的值的值决定执行哪一个决定执行哪一个casecase语句语句执行执行breakbreak语句后语句后就结束就结束switchswitch语句语句121121【例【例4-174-17】用】用 switch switch 语句实现从键盘输入成绩,转换成相应的语句实现从键盘输入成绩,转换成相应的 等级后输出等级后输出(90 - 100(90 - 100为为A,80 - 89A,80 - 89为为B,70 - 79B,70 - 79为为C,C, 60 - 69 60 - 69为为D,59D,59及以下为及以下为E) E) 。 main()main() { { int score; int score; printf("Please Input A Score: "); printf("Please Input A Score: "); scanf("%d",&score); scanf("%d",&score); printf("\n"); printf("\n"); switch(score/10) switch(score/10) { { case 10: case 10: case 9: printf("%c\n",'A');break; case 9: printf("%c\n",'A');break; case 8: printf("%c\n",'B');break; case 8: printf("%c\n",'B');break; case 7: printf("%c\n",'C');break; case 7: printf("%c\n",'C');break; case 6: printf("%c\n",'D');break; case 6: printf("%c\n",'D');break; default: printf("%c\n",'E'); default: printf("%c\n",'E'); } } } } 用以将输入的成绩用以将输入的成绩按等级与按等级与1010以内的以内的某一个非负整数某一个非负整数相对应相对应 case10case10、、case9case9执行相同的语句执行相同的语句122122 4.6 4.6 循环结构循环结构 在程序中,若干个在一定条件下反复执行的语句在程序中,若干个在一定条件下反复执行的语句就构成了循环体,循环体连同对循环的控制就组成就构成了循环体,循环体连同对循环的控制就组成了循环结构。 循环结构也是最常见的程序结构几了循环结构循环结构也是最常见的程序结构几乎所有实用的程序都包含循环结构乎所有实用的程序都包含循环结构在在C C程序中常用的循环语句包括:程序中常用的循环语句包括:● ● whilewhile语句语句● ● do — whiledo — while语句语句● ● forfor语句语句123123 一一.while.while语句语句 while while语句的格式:语句的格式: while while(表达式)(表达式) 语句语句 语语 句句表达式表达式 值为非值为非0 0值为值为0 0执行流程:执行流程:循环体循环体循环控制循环控制, ,称控制称控制循环的变量为循环的变量为循环变量循环变量124124【例【例4-184-18】编程求】编程求1+2+3+4+…+n (n1+2+3+4+…+n (n由键盘输入由键盘输入) ),, 并输出结果并输出结果 根据例根据例4-14-1给出的算法和流程图,设计如下的程序:给出的算法和流程图,设计如下的程序:main( )main( ) { { int n, i=1,sum=0; int n, i=1,sum=0; printf("Please input n:\n "); printf("Please input n:\n "); scanf("%d",&n); scanf("%d",&n); printf("1+2+……+%d = %d",n,sum); printf("1+2+……+%d = %d",n,sum); } }流程图while(i<=n) sum+=i++;循环体,在循环循环体,在循环体中须有修改体中须有修改循环变量的语句循环变量的语句125125【例【例4-194-19】编程计算级数】编程计算级数 1+1+ 的和的和, , 当最后一项小于当最后一项小于0.000010.00001时结束。 时结束 分析:分析:这也是一个连加问题,可以采用类似于例这也是一个连加问题,可以采用类似于例4-184-18的的 算法来实现用变量算法来实现用变量sumsum存放部分和级数第存放部分和级数第i i项项 的分母为的分母为(i-1)×i (i=2,3,….)(i-1)×i (i=2,3,….) main() main() { { int i=2; int i=2; float sum=1.0; float sum=1.0; while(1.0/((i-1)*i)>=0.00001) while(1.0/((i-1)*i)>=0.00001) printf(“SUM=%f”,sum); printf(“SUM=%f”,sum); } }循环的次数循环的次数预先不知预先不知{ { sum+=1.0/((i-1)*i);sum+=1.0/((i-1)*i); i++; i++;} }循环体是复循环体是复合语句合语句126126二二.do-while.do-while语句语句do-whiledo-while语句的格式:语句的格式: do do 语句语句 while( while(表达式表达式) );;语句语句表达式表达式值为非值为非0值为值为0执行流程:执行流程:循环体循环体循环控制循环控制127127【例【例4-204-20】用】用do do -- while while 语句实现【例语句实现【例4-184-18】。 main() main() { { int n, i=1,sum=0; int n, i=1,sum=0; printf("Please input n:\ "); printf("Please input n:\ "); scanf("%d ",&n); scanf("%d ",&n); do do sum+=i++; sum+=i++; while(i<=n); while(i<=n); printf("1+2+……+%d = %d \n ",n,sum); printf("1+2+……+%d = %d \n ",n,sum); } }循环体至少被循环体至少被执行一次执行一次128128【例【例4-214-21】编程计算】编程计算n! n! ,,n n由键盘输入由键盘输入 开开 始始 1 1 fac fac 2 2 i ifac×ifac×ifacfac i+1 i+1 i i从键盘输入从键盘输入n n i ≤ n ? i ≤ n ?输出输出 fac fac 结结 束束流程图流程图:129129 main() main() { { int n, i=2; int n, i=2; long int fac=1; long int fac=1; printf("Please input n:\ "); printf("Please input n:\ "); scanf("%d",&n); scanf("%d",&n); do do fac*=i++; fac*=i++; while(i<=n); while(i<=n); printf("%d!=%ld\n",n,fac); printf("%d!=%ld\n",n,fac); } }程序:程序:130130说明:表达式说明:表达式1 1用于给循环变量赋初值用于给循环变量赋初值, , 表达式表达式2 2给出执行给出执行循环体的条件循环体的条件, , 表达式表达式3 3用于修改循环变量。 用于修改循环变量三三.for.for语句语句forfor语句的格式:语句的格式:forfor(表达式(表达式1 1;表达式;表达式2 2;表达式;表达式3 3)) 语句语句( (循环体循环体) ) 表达式表达式1 1 表达式表达式2 2 语句语句 表达式表达式3值为非值为非0 0值为值为0 0执行流程:执行流程:131131【例【例4-224-22】编程计算】编程计算1-3+5-7+……-991-3+5-7+……-99 分析:分析:原题就是计算原题就是计算1+(-3)+5+(-7)+……+(-99)1+(-3)+5+(-7)+……+(-99),这还是一个连,这还是一个连加问题主要应解决加数符号的交叉变化主要应解决加数符号的交叉变化在程序中用变在程序中用变量量j j表示符号,以表示符号,以1 1表示正号、-表示正号、-1 1表示负号表示负号 main() main() { { int i,j,sum=0; int i,j,sum=0; j=1; j=1; for(i=1;i<=99;i+=2) for(i=1;i<=99;i+=2) { { sum+=i*j; sum+=i*j; j*=-1; j*=-1; } } printf("1-3+5-7+……-99=%d\n",sum); printf("1-3+5-7+……-99=%d\n",sum); } }132132【例【例4-234-23】编程求】编程求1 1到到100100以内所有能被以内所有能被3 3整除但不能被整除但不能被7 7整除整除 的整数的和。 的整数的和 分析:分析:本例还是一个连加问题,只是要求加数能被本例还是一个连加问题,只是要求加数能被3 3整除且整除且 不能被不能被7 7整除 main() main() { { int i,sum=0; int i,sum=0; for(i=1;i<=100;i++) for(i=1;i<=100;i++) if((i%3==0)&&(i%7!=0)) if((i%3==0)&&(i%7!=0)) sum+=i; sum+=i; printf("SUM=%d\n",sum); printf("SUM=%d\n",sum); } }133133C C语言允许语言允许forfor语句一般格式中的表达式语句一般格式中的表达式1 1,表达式,表达式2 2和表达式和表达式3 3空缺,但它们所具有的功能应当在适当的空缺,但它们所具有的功能应当在适当的地方由另外的语句来实现。 地方由另外的语句来实现例例4-23-14-23-1与例与例4-234-23程序的功能是一样的程序的功能是一样的例【例4-23-14-23-1】】 main() main() { { int i=1,sum=0; int i=1,sum=0; for(;i<=100;i++) for(;i<=100;i++) if((i%3==0)&&(i%7!=0)) if((i%3==0)&&(i%7!=0)) sum+=i; sum+=i; printf("SUM=%d\n",sum); printf("SUM=%d\n",sum); } } 对循环变量对循环变量i i赋初值赋初值省却了对循环省却了对循环变量变量i i赋初值的赋初值的表达式表达式1 1134134例例4-23-24-23-2与例与例4-234-23程序的功能也是一样的程序的功能也是一样的例【例4-23-24-23-2】】 main() main() { { int i=1,sum=0; int i=1,sum=0; for(;i<=100;) for(;i<=100;) { { if((i%3==0)&&(i%7!=0)) if((i%3==0)&&(i%7!=0)) sum+=i; sum+=i; i++; i++; } } printf("SUM=%d\n",sum); printf("SUM=%d\n",sum); } }省却了修改循环省却了修改循环变量变量在这里修改在这里修改循环变量循环变量135135 四四. .循环的嵌套循环的嵌套 循环的嵌套是指一个循环体内又包含另一个完整循环的嵌套是指一个循环体内又包含另一个完整 的循环结构。 的循环结构 例如:例如:(1) while( ) (2) while( )(1) while( ) (2) while( ) { { { { …… …… …… …… while( ) do while( ) do { { { { … … … … } } } } } while( ); } while( ); …… …… } }外循环外循环内循环内循环136136再如:再如:(3) do (4) for()(3) do (4) for() { { { { …… for() …… for() while( ) { while( ) { { … { … … } … } } } } } } } while( ); while( ); 外循环外循环内循环内循环注意:注意:在循环嵌套时,外循环必须完全包含内循环。 在循环嵌套时,外循环必须完全包含内循环 137137【例【例4-244-24】编程输出如下由】编程输出如下由“*”“*”组成的三角形组成的三角形 * * *** *** ***** ***** ******* ******* ********* *********外循环控制外循环控制输出输出5 5行行* *字符字符 内循环控制一行内循环控制一行输出输出2*i-12*i-1个个* *字符字符输出一行输出一行* *字符字符后换行后换行 main() main() { { int i,j; int i,j; for(i=1;i<=5;i++) for(i=1;i<=5;i++) { { for(j=1;j<=2*i-1;j++) for(j=1;j<=2*i-1;j++) printf("*"); printf("*"); printf(" \n"); printf(" \n"); } } } } 138138 4.7 continue4.7 continue语句和语句和breakbreak语句语句continuecontinue语语句句和和breakbreak语语句句属属于于转转向向语语句句,,它它们们常常用用在循环体中在循环体中, , 用于改变循环的执行顺序。 用于改变循环的执行顺序一一.continue.continue语句语句在循环体中执行在循环体中执行continuecontinue语句后,程序将立即跳过语句后,程序将立即跳过continuecontinue语句之后尚未执行的语句,提前结束本轮语句之后尚未执行的语句,提前结束本轮循环,返回到循环的开始处循环,返回到循环的开始处, , 准备执行下一轮循环准备执行下一轮循环 注意:注意: ((1 1)) continuecontinue、、breakbreak语句必须和语句必须和ifif语句配合使用,语句配合使用, 否则,循环体中否则,循环体中continue continue 、、breakbreak语句后面的语句后面的 部分将是多余的部分将是多余的 ((2 2))continue continue 、、breakbreak语句只对其直接所属的循环语句只对其直接所属的循环 语句起作用语句起作用 139139【例【例4-254-25】从键盘输入整数,如果是奇数,则继续输入,如】从键盘输入整数,如果是奇数,则继续输入,如 果是非果是非0 0偶数,则显示该偶数后继续输入,如果是偶数,则显示该偶数后继续输入,如果是0 0则输则输 出出“The end.”“The end.”后结束。 后结束 分析:分析: 题目要求不断地从键盘输入整数,直到输入题目要求不断地从键盘输入整数,直到输入0 0时结束这可时结束这可 以用循环结构来实现以用循环结构来实现 main() main() { { int n=1; int n=1; while(n!=0) while(n!=0) { { printf(" Please input an integer:\n "); printf(" Please input an integer:\n "); scanf("%d",&n); scanf("%d",&n); if(n%2==1) if(n%2==1) continue; continue; else else if(n!=0) if(n!=0) printf(" %d\n ",n); printf(" %d\n ",n); } } printf(" The end.\n "); printf(" The end.\n "); } }保证循环体至少保证循环体至少被执行一次被执行一次 若输入的是奇数若输入的是奇数则结束本轮循环则结束本轮循环并返回循环开始处并返回循环开始处 140140用用forfor语句来实现【例语句来实现【例4-254-25】】 。 例【例4-25-14-25-1】】 main() main() { { int n=1; int n=1; for(;n!=0;) for(;n!=0;) { { printf(" Please input an integer:\n "); printf(" Please input an integer:\n "); scanf("%d",&n); scanf("%d",&n); if(n%2==1) if(n%2==1) continue; continue; else else if(n!=0) if(n!=0) printf(" %d\n ",n); printf(" %d\n ",n); } } printf(" The end.\n "); printf(" The end.\n "); } }141141二二.break.break语句语句在循环体中执行在循环体中执行breakbreak语句后,将立即结束循环。 语句后,将立即结束循环例【例4-264-26】每次从键盘输入一个整数进行累加,一】每次从键盘输入一个整数进行累加,一 旦累加和大于旦累加和大于100100时,停止输入并输出累加和时,停止输入并输出累加和 main() main() { { int n,sum=0; int n,sum=0; while(1) while(1) { { printf("Please input an integer:\n"); printf("Please input an integer:\n"); scanf("%d",&n); scanf("%d",&n); sum+=n; sum+=n; if(sum>100) if(sum>100) break; break; } } printf("SUM=%d\n",sum); printf("SUM=%d\n",sum); } }若条件满足,若条件满足,则结束本次循环则结束本次循环永真条件永真条件142142用用forfor语句来实现【例语句来实现【例4-264-26】】 。 例【例4-26-14-26-1】】main()main() { { int n,sum=0; int n,sum=0; for(;;) for(;;) { { printf("Please input an integer:\n"); printf("Please input an integer:\n"); scanf("%d",&n); scanf("%d",&n); sum+=n; sum+=n; if(sum>100) if(sum>100) break; break; } } printf("SUM=%d\n",sum); printf("SUM=%d\n",sum); } }省却了对循环省却了对循环条件的判断条件的判断用用breakbreak语句语句控制结束循环控制结束循环143143第第4章章 结束结束 第第5 5章章数数 组组 2021/8/22144145145学习目标学习目标1.1.熟练掌握一维数组、二维数组、字符熟练掌握一维数组、二维数组、字符数组的定义、初始化。 数组的定义、初始化2.2.熟练掌握数组元素的引用方法熟练掌握数组元素的引用方法3.3.3. 3. 熟练掌握熟练掌握C C程序处理字符串的常用程序处理字符串的常用方法146146主要内容主要内容–一维数组一维数组–二维数组二维数组–字符数组和字符串字符数组和字符串1471475.l 5.l 一维数组的定义及应用一维数组的定义及应用 一一. . 一维数组的定义一维数组的定义n n 次多项式通常被表示为:次多项式通常被表示为: f(x) = a f(x) = an n x xn n+ a+ an-1n-1 x xn-1n-1+ a+ a n-2 n-2 x xn-2n-2 + …… + a + …… + a 2 2 x x 2 2 + + a a 1 1 x + a x + a0 0各项系数为:各项系数为: a an n,, a an-1n-1,, a an-2n-2 ,,…………,, a a2 2 ,, a a1 1 ,, a a0 0它们有下列特点:它们有下列特点: 同名同名 ── a ── a 同类型同类型 ── ──实数类型实数类型 以下标以下标 0,1,2,……, n-1, n 0,1,2,……, n-1, n 区别各元素区别各元素 ──── a an n、、a an-1n-1、、a an-2n-2、、、、…………、、a a2 2、、a a1 1、、a a0 0在在C C语言中,把具有一定顺序关系的同名、同类型变量的集语言中,把具有一定顺序关系的同名、同类型变量的集合称为数组,称元素的共名合称为数组,称元素的共名a a为数组名,将各元素记为:为数组名,将各元素记为:a[0]a[0],a[1],a[2],……, a[n-1],a[n] ,a[1],a[2],……, a[n-1],a[n] 。 根据元素下标的个数将数根据元素下标的个数将数组分为组分为 一维数组、一维数组、 二维数组、二维数组、……故又称数组元素为下标故又称数组元素为下标变量 148148一维数组的定义:一维数组的定义: 数据类型数据类型 数组名数组名[ [元素个数元素个数];];例如:例如: int data[4] int data[4];; 定定义义了了一一个个有有4 4个个元元素素的的一一维维数数组组datadata,,元元素素类类型为型为intint型;型; 又如:又如: char c[10] char c[10];; 定定义义了了一一个个有有4 4个个元元素素的的一一维维数数组组c c,,元元素素类类型型为为charchar型型 149149注意注意: : 1.1.在数组定义中,方括号中的元素个数只能是整数常在数组定义中,方括号中的元素个数只能是整数常量(包括符号常量)量(包括符号常量) ;; 2. 2. 数组元素的下标从数组元素的下标从0 0开始;开始; 3. 3. 数组名的命名规则与变量名相同;数组名的命名规则与变量名相同; 4. 4. 数组在内存中按其下标递增的顺序连续存储各元数组在内存中按其下标递增的顺序连续存储各元素的值素的值 ,数组名表示第一个变量的存储地址,数组名表示第一个变量的存储地址 ;;5. 5. 参加数据处理的只能是数组中的元素变量参加数据处理的只能是数组中的元素变量 ,数组,数组整体不能参加数据处理整体不能参加数据处理 150150 二二二二. .一维数组的初始化一维数组的初始化一维数组的初始化一维数组的初始化一维数组的初始化就是在定义数组时对所有的数一维数组的初始化就是在定义数组时对所有的数一维数组的初始化就是在定义数组时对所有的数一维数组的初始化就是在定义数组时对所有的数组元素赋初值。 组元素赋初值组元素赋初值组元素赋初值 例如:定义例如:定义例如:定义例如:定义 int data[4]={3 int data[4]={3 int data[4]={3 int data[4]={3,,,,0 0 0 0,,,,5 5 5 5,,,,0};0};0};0};则等号右边花括号中的数值则等号右边花括号中的数值则等号右边花括号中的数值则等号右边花括号中的数值3 3 3 3,,,,0 0 0 0,,,,5 5 5 5,,,,0 0 0 0依次被赋予依次被赋予依次被赋予依次被赋予data[0],data[0],data[0],data[0],data[1]data[1]data[1]data[1],,,,data[2]data[2]data[2]data[2]及及及及date[3]date[3]date[3]date[3]作为初值作为初值作为初值作为初值设数组设数组设数组设数组datadatadatadata从地址为从地址为从地址为从地址为2000H2000H2000H2000H的内存单元开始存放的内存单元开始存放的内存单元开始存放的内存单元开始存放, , , ,其在内存中其在内存中其在内存中其在内存中的存储情况如下图所示:的存储情况如下图所示:的存储情况如下图所示:的存储情况如下图所示: data[0] data[0]:: 2000H 2000H 0 30 3 data[1] data[1]:: 2002H 0 0 2002H 0 0 data[2] data[2]:: 2004H 0 5 2004H 0 5 data[3] data[3]:: 2006H 0 0 2006H 0 0151151 此此此此外外外外,,,,在在在在初初初初始始始始化化化化的的的的格格格格式式式式中中中中,,,,{}{}{}{}中中中中的的的的某某某某个个个个初初初初始始始始化化化化数数数数据据据据可可可可以以以以缺缺缺缺省省省省,,,,但但但但是是是是用用用用以以以以分隔数据的逗号不能省略。 默认缺省的数据为零值例如分隔数据的逗号不能省略默认缺省的数据为零值例如分隔数据的逗号不能省略默认缺省的数据为零值例如分隔数据的逗号不能省略默认缺省的数据为零值例如, , , ,执行语句:执行语句:执行语句:执行语句: int data[4]={3,,5,}; int data[4]={3,,5,}; int data[4]={3,,5,}; int data[4]={3,,5,}; 和和和和 int data[4]={3,0,5,0}; int data[4]={3,0,5,0}; int data[4]={3,0,5,0}; int data[4]={3,0,5,0};的结果也是一样的的结果也是一样的的结果也是一样的的结果也是一样的 C C C C语言还允许在数组初始化时不指明数组元素的个数语言还允许在数组初始化时不指明数组元素的个数语言还允许在数组初始化时不指明数组元素的个数语言还允许在数组初始化时不指明数组元素的个数例例例例如如如如::::用用用用int int int int b[]={1b[]={1b[]={1b[]={1,,,,2 2 2 2,,,,3 3 3 3,,,,4} 4} 4} 4} ; ; ; ;定定定定义义义义并并并并初初初初始始始始化化化化一一一一维维维维数数数数组组组组b[]b[]b[]b[]是是是是合合合合法法法法的的的的。 此此此此时时时时,,,,{}{}{}{}中中中中初初初初始始始始化化化化数数数数据据据据的的的的个个个个数数数数即即即即为为为为数数数数组组组组元元元元素素素素个个个个数数数数所所所所以以以以,,,,数数数数组组组组b[]b[]b[]b[]有有有有4 4 4 4个个个个元元元元素 说明:说明: 在初始化的格式中,在初始化的格式中,{ }{ }中的初始化数据用逗号分隔当初中的初始化数据用逗号分隔当初始化数据个数少于数组元素个数时,剩下的数组元素被赋予始化数据个数少于数组元素个数时,剩下的数组元素被赋予零值所以,零值所以, int data[4] ={3,0,5}; int data[4] ={3,0,5}; 和和 int data[4]={3,0,5,0}; int data[4]={3,0,5,0};的结果是一样的的结果是一样的 152152三三三三. . 一维数组元素的引用一维数组元素的引用一维数组元素的引用一维数组元素的引用 数组元素在程序中可参与同类型的变量所能进行的各种数组元素在程序中可参与同类型的变量所能进行的各种数组元素在程序中可参与同类型的变量所能进行的各种数组元素在程序中可参与同类型的变量所能进行的各种运算运算运算运算, , , ,并遵循与同类型变量相同的运算规则。 并遵循与同类型变量相同的运算规则并遵循与同类型变量相同的运算规则并遵循与同类型变量相同的运算规则 在程序中,通过数组名和下标引用相应的数组元素在程序中,通过数组名和下标引用相应的数组元素在程序中,通过数组名和下标引用相应的数组元素在程序中,通过数组名和下标引用相应的数组元素 【例【例【例【例5-15-15-15-1】】】】 用用用用1 1 1 1,,,,3 3 3 3,,,,5 5 5 5,,,,7 7 7 7,,,,9 9 9 9,,,,11111111,,,,13131313,,,,15151515,,,,17171717,,,,19191919为数组为数组为数组为数组 a[] a[] a[] a[]的各元素赋值,然后按的各元素赋值,然后按的各元素赋值,然后按的各元素赋值,然后按a[9]a[9]a[9]a[9]、、、、a[8]a[8]a[8]a[8]、、、、a[7]a[7]a[7]a[7]、、、、……………………、、、、 a[0] a[0] a[0] a[0]的顺序输出。 的顺序输出的顺序输出的顺序输出 main( ) main( ) main( ) main( ) { { { { int i ,a[10]; int i ,a[10]; int i ,a[10]; int i ,a[10]; for( i=0;i<=9; i++) for( i=0;i<=9; i++) for( i=0;i<=9; i++) for( i=0;i<=9; i++) a[i]=2*i+1; a[i]=2*i+1; a[i]=2*i+1; a[i]=2*i+1; for(i=9;i>=0;i--) for(i=9;i>=0;i--) for(i=9;i>=0;i--) for(i=9;i>=0;i--) printf("%d, ", a[ i ]); printf("%d, ", a[ i ]); printf("%d, ", a[ i ]); printf("%d, ", a[ i ]); } } } }153153【例【例【例【例5-25-25-25-2】】】】 输入输入输入输入4 4 4 4个整数个整数个整数个整数a a a a0 0 0 0,a,a,a,a1 1 1 1, a, a, a, a2 2 2 2, a, a, a, a3 3 3 3将它们从小到大按升将它们从小到大按升将它们从小到大按升将它们从小到大按升 序排序后输出。
