1、第一章第一章 程序设计与C语言初步 算法、实体与程序 程序设计方法与程序设计语言 Backus-Naur范式 C+语言的程序结构 面向对象程序设计思维方式 概述 程序程序:完成一定功能的指令或语句序列 程序设计程序设计:编写计算机程序的活动 程序设计方法 程序设计语言 本课程以面向对象程序设计方法为核心,并选用C+程序设计语言为工具来介绍程序设计一、算法与程序 例例:求解最大公约数的欧几里德算法。步骤1:如果p a;cinb;c=a+b;coutc;n这个程序实现的算法是:输入a 输入b 计算a+b的和并存于c中 输出c的值(即a+b的和)a,b,c称为变量,是用来记录程序所需要的数据。程序在
2、计算机内部的表示 机器语言:二进制指令 汇编语言:用简单的符号表示二进制指令 高级语言 要把高级语言程序翻译成计算机能理解的机器语言 翻译 编译编译 解释解释二、程序设计的演变1.早期的程序设计手工作坊式手工作坊式2.结构化程序设计 采用三种基本结构:顺序、循环、选择分支顺序、循环、选择分支 单入口/单出口控制结构 以流程为主,围绕操作本身来设计3.面向对象程序设计 围绕被操作的数据来设计结构化程序设计 结构化程序设计的主要思想:由三种基本控制结构组成程序 这三种结构的示意图如下:可以看到,三种基本结构都具有以下特点:有一个入口。有一个出口。结构中每一部分都应当有被执行到的机会,也就是说,每一
3、部分都应当有一条从入口到出口的路径通过它(至少通过一次)。没有死循环(无终止的循环)。面向对象程序设计 1)实体:现实生活中的客观事物(人、动物、企业、部门等等)。一个实体应 有一个名字,应有描述这个实体特征的数据(状态),应有作用于这些实体上面的操作(行为)。2)对象:面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用 于构成系统的一个基本单位。C+使用类类来描述对象三、C+语言程序 源程序(源代码)用程序设计语言编写的程序存放在一个文本文件中。后缀为.cpp 目标程序(目标代码)用编译程序将源程序转换为计算机能理解的形式 后缀为.obj 可执行代码 把目标代码和现有的库通过链
4、接程序产生可执行代码 后缀为.exe开发一个C+程序的过程源程序源程序目标程序目标程序可执行代码可执行代码库库编译程序链接程序.cpp.hpp.obj.exe1.编辑编辑 2.编译编译 3.链接链接 4.运行运行四、程序设计语言的定义程序设计语言的定义1.程序设计语言的描述 语法语法(syntax):由程序语言基本符号组成程序中各个语法成分的一组规则。语义语义(semantics):程序设计语言中按语法规则构成的各个语法成分的意义。2.字符集 字符集字符集:任何一种语言都是建立在某一个有限的字符集上的。C+语言使用的是ASCII字符集。单词单词:由字符集中的若干字符构成且具有某一特定含义的字符
5、序列。保留字保留字:有些语言中预先规定一些单词具有特殊的意义,并保留其名字,不允许程序员另作它用,这种单词被称为保留字。关键字关键字:还有些语言规定一些特殊单词在一定的上下文中具有预先定义的特殊意义,这种单词被称为关键字。注意注意 C/C是大小写字母是敏感的,同一字母的大写状态和小写状态将视为22个不同字符。下划线视为一个字母。3.语法描述 形式化定义程序设计语言的语法一般包括一个明确定义的字符集和一组有限的规则,这些规则规定符号如何组成表达式、语义 和程序等形式。较常用的语法定义方法是Backus-Naur范式(简写为BNF)和语法图。Backus-Naur范式(BNF)元符号:元符号:BN
6、F规定了一些符号作为描述语法的机制,称作元符号,包括::=表示“定义为”。|表示“或者”。表示“任选”,即方括号内的内容可以出现一次或不出现。表示“重复”,即花括号内的内容可以出现零次或任意多次。终结符号:终结符号:BNF中不必定义的符号或字符串,如A、B、0、1等 非终结符号:非终结符号:在用法规则中需要加以定义的语法变量,如字母、数字、标识符等每一个非终结符号都必须有一个规则定义它,非终结符号按规则总是可以展开为一串终结符号。例:标识符的BNF描述。标识符 :=字母 字母|数字 字母 :=A|B|Z|a|b|z|_数字 :=0|1|9 整数的BNF描述整数 :=正负号 无符号整数无符号整数
7、 :=数字 数字 正负号 :=+|-数字 :=0|1|9 非零数字非零数字 :=1|9数字 :=0|非零数字|0语法图 语法图是与BNF等价的另一种语法描述方法,但比BNF更加直观。一条BNF可转换成一个语法图BNF转换为语法图的规则 (1)每一个终结符号的出现对应于(2)每一个非终结符号X的出现对应于 X (3)形如P:=V1 V2 Vk则转换为 V1V2 Vk (4)形如P:=V1|V2|Vk则转换为V1V2Vk (5)形如P:=V 则转换为 V (6)形如P:=V 则转换为 V例:标识符可用以下语法图来定义 字母 字母 数字五、C C程序的基本结构程序的基本结构1.基本概念 程序程序:一
8、个程序是实体的属性及行为在计算机内的表示。类类:是对一群具有相同属性,表现相同行为的对象的描述。对象对象:具体的单个存在的实体。主函数主函数:具有特定名字“main”函数,由它去激活(调用)一个对象的行为(函数)。2.C+程序的基本结构 例1:一个很特殊的例子-只有一个主函数#include void main()coutComputer Science.n;注意:C+语言程序中有一个特殊的函数,称为主主函数函数main(),这是程序执行的入口,用于实现单入口/单出口结构。一个一个C语言程序有且只有一个主函数语言程序有且只有一个主函数/银行帐户存取款程序#include /利用函数库iostr
9、eam提供的操作在屏幕上输出数据class ACCOUNT float balance;/本帐户当前的余额public:/开设帐户,同时存入金额amount.ACCOUNT(float amount)balance=amount;/往帐户中存款,存款金额为amount.void deposit(float amount)balance=balance+amount;例2:一个带有类完整的C+语言程序。/从帐户中取款,取款金额为amount;如果取款成功则用1表示,否则用0表示。int withdraw(float amount)if(amountbalance)/判断是否透支 return 0
10、;/如果透支则不作取款,返回0表示取款不成功 else balance=balance-amount;/减少当前的存款余额 return 1;/返回1表示取款成功 /查询帐户中当前的余额。float get_balance()return balance;/返回当前的余额 ;/主函数main()/开设帐户 ACCOUNT acc1(500);/开设第一个帐户acc1,同时存入500元 ACCOUNT acc2(1500);/开设第二个帐户acc2,同时存入1500元 /存款与取款 acc1.deposit(255.5);/往帐户acc1中存入255.5元 acc2.deposit(500);/
11、往帐户acc2中存入500元 acc2.withdraw(700);/往帐户acc2中取出700元 acc1.withdraw(700);/往帐户acc1中取出700元 acc2.withdraw(350);/往帐户acc2中取出350元 /查询余额并在屏幕上显示 cout帐号1的余额还有acc1.get_balance()元n;cout帐号2的余额还有acc2.get_balance()元n;return 1;由一个主函数,加上0个或者若干个其它函数、0个或若干个其它的类组成。程序的执行总是从主函数开始,而不管主函数放在程序的任何位置;由主函数调用其它函数(类的行为)、主函数执行完,程序也就
12、执行完。归纳归纳C程序的基本构成:3.两种退化现象 1)只有函数,没有类。除主函数外,还可能有一些游离的函数,这些游离的函数不属于任何类。只有函数,没有类的C程序。#include /利用该库将数据输出到屏幕 int main()cout矩形的面积是”78*42balance)return 0;else balance=balance-amount;return 1;float get_balance()return balance;第二章第二章 基本数据类型 类型的作用 标识符命名风格 常量与变量 基本数据类型 运算符与表达式 隐式类型转换与强制类型转换 简单的输入输出2.1 数据类型概述
13、一、类型 C+语言中,用八进制、十六进制与十进制表示数据。十进制:A=496在计算机中的八进制:以0前导A=0760存储形式都是十六进制:以0 x前导A=0 x1F0 111110000 数据类型:具有相同特性的所有数据的集合。用数据类型:具有相同特性的所有数据的集合。用它来说明一个数据在数据分类中的归属。它来说明一个数据在数据分类中的归属。二、类型的作用 数据类型:决定了数据的表示方式、占内存的空间大小、取值范围以及对数据可以使用的操作。C+中,所有的数据都属于特定的类型 遵循“先声明、后使用”的原则 三、C+语言的类型 在对类型的要求上程序设计语言分两类:强类型:编译时严格检查操作是否满足
14、数据所属类型 弱类型:C+语言介乎强与弱类型之间 C+数据类型基本类型复合类型整型字符型浮点型枚举类型空类型单精度浮点型双精度浮点型指针类型引用类型构造类型函数类型数组结构体共用体2.2 保留字、标识符、常量与变量 一、单词 C+程序中有五种单词:保留字保留字、标识符标识符、常量常量、运算符运算符和分界符分界符(包括空格、制表符、回车换行、注释、(包括空格、制表符、回车换行、注释、分号)分号)。二、保留字、标识符 C+程序中使用标识符对程序中的各个元素加以命名。标识符是由字母或下划线开头的字母、数字与下划线的标识符是由字母或下划线开头的字母、数字与下划线的序列序列。C+程序中区分大小写,例如A
15、ccount和account是两个不同的标识符。选择合适的标识符一个简单的C+语言程序#include void main()const float PI=3.14;float Area;float r=2;Area=PI*r*r;/计算圆的面积coutThe area is:Area;输出结果:The area is 12.560000三、常量与变量 1、常量常量:在程序的执行过程中,其值不能被改变的量称为常量 常量区分为不同的类型 整型常量整型常量:10;20;t=5;浮点型常量浮点型常量:-1.2 字符常量字符常量:A;ch=B;字符串常量字符串常量:“Avafjfkslfjskljf”
16、符号常量符号常量:用标识符表示的常量 C+程序中符号常量的定义方法:1)#define 常量名常量名 常量值常量值宏定义预处理命令 例1:#define PI 3.14159 main()float Area;float r=1.5;Area=PI*r*r;2)const 数据类型数据类型 标识符名标识符名=常量值常量值;例2:main()const float PI=3.14159;float Area,r=1.5;Area=PI*r*r;2、变量:在程序执行过程中其值可以改变的量称为变量 C+程序中,所有变量都须先定义后使用 变量定义的方法数据类型 变量名(=初值);可连续定义同一类型的多
17、个变量int a,b,c;int a;int b;int c;变量通过赋值运算改变其值Area=PI*r*r;A=2*10;四、简单的输入输出 输出:将程序中的数据送到外部设备称为程序的输出 输入:程序从外部设备获得一个变量的值称为输入 C+语言的输入输出 利用库iostream实现简单的输入输出 使用iostream提供的库函数前,须加入:#include 输出:cout输出内容;例:cout“半径为”r “的圆面积为”输入变量;例:cin r;注意:由双引号括住的东西不经任何处理就输出,由双引号括住的东西不经任何处理就输出,否则就输出变量或表达式的值。否则就输出变量或表达式的值。2.3 基
18、本数据类型 一、基本数据类型(字宽:占内存的空间大小)类型类型名字宽取值范围有效位(有符号)字符(signed)char1-128127无符号字符unsignedchar10255(有符号)短整型(signed)short(int)2-32,76832,767(-215215-1)(有符号)整型(signed)int2/4-32,76832,767(-215215-1)无符号短整型 unsignedshort(int)2065,535无符号整型unsigned(int)2/4065,535(0216-1)(有符号)长整型(signed)long(int)4-2,147,483,6482,147
19、,483,647无符号长整型 unsignedlong(int)404,294,967,295单精度浮点型 float43.4E-383.4E+387位双精度浮点型 double81.7E-3081.7E+30815位长双精度浮点型longdouble103.4E-49321.1E+493219位浮点数据的有效位 在C+程序中,单精度浮点型数据的表示以6位小数为准 标准显示6位小数例:a=1234.567890;但是由于存储空间的限制,单精度浮点数在存储时只存7位有效位,即a的值存为1234.567,当输出a的值时,显示1234.567xxx,小数点的后3位是随机数。二、转义字符 用单引号括起
20、来的单个字符是字符型常量a b 使用转义字符来表示单引号本身、以及使用转义字符来表示单引号本身、以及ASCIIASCII码表中的控制字符(不可见字符)码表中的控制字符(不可见字符)转义字符的表示方法:用单引号括住,以反斜杆开头C+语言预定义的转义字符 转义字符ASCII码含义a0 x07响铃符(BEL-bell)n0 x0A换行符(LF-LineFeed)t0 x09水平制表符(HT-HorizontalTable)v0 x0B垂直制表符(VT-VerticalTable)b0 x08回退符(BS-Backspace)r0 x0D回车符(CR-CarriageReturn)f0 x0C换页符(
21、FF-FormFeed)0 x5C反斜杠()?0 x3F问号(?)0 x27单引号()0 x22双引号()八进制的表示:ddd1到3位八进制数所代表的字符 十六进制的表示:xdd1到2位十六进制数所代表的字符例1:char ch;ch=n;coutch;/输出回车例2:表示单引号表示反斜杆例3:字符常量A的表示方法:Ch=A;Ch=65;八进制表示法 Ch=101;Ch=0101;十六进制表示法 Ch=x41;Ch=0 x41;若coutch;则都输出字符A三、字符串常量 字符串常量是括在双引号内的字符序列,简称字符串。例如:This is a string constant.His name
22、 is John.n注意:x07n张三正在开会。n 如:coutncomputeris;输出形式:computeris如果用cout ncomputeris;则出错,语法错。应用举例 例例1输入矩形的长和宽,求面积输入矩形的长和宽,求面积 include void main()/操作系统把操作系统把main函数执行当调用一个函数执行当调用一个/函数,要求执行完后返回一个值函数,要求执行完后返回一个值 float width,length,area;coutlength;coutwidth;arealength*width;cout“n Area(length*width)=”area (x+y
23、)-z表达式的求值次序:由表达式中各种运算符的优先级与结合性决定1)括号内的运算先做2)优先级高的运算先做3)同一优先级的按结合性进行二、C+语言的运算符优先优先级级类型类型操作数操作数个数个数结合性结合性运算符运算符运算符名称运算符名称用法解释用法解释1初等运算1自左向右()圆括号冗余的括号不会减慢表达式的运算速度,鼓励多使用括号使运算顺序清晰 数组下标.成员运算符 结构名.成员名-成员指针运算符 结构指针名-成员名2单目运算1自右向左!逻辑非(逻辑运算)非零为真:!0得1,!1得0按位取反(位运算)产生整数的二进制反码例:a=5;(0000 0000 0000 0101)a为 1111 1
24、111 1111 1010+自增(算术运算)1)后置运算z=a+;=z=a;a=a+1;2)前置运算z=+a;=a=a+1;z=a;自增、自减运算只适用于整型变量-自减(算术运算)-负号(不是减法)例:a=b*-c;=a=b*(-c);(类型)强制类型转换float a=1.5;double b;b=(double)a;强制强制把把a转换成转换成double类型,使计算精度提高类型,使计算精度提高sizeof求类型长度计算其后内容占用的存储空间大小单位:字节。1)sizeof(数据类型名)2)sizeof(表达式);*指针运算(间接取值)取指针变量所指向的值&取地址取对象的地址:&对象;例:a
25、=&f;b=*a;temp=&*a;=temp=&(*a);优先优先级级类型类型操作数操作数个数个数结合性结合性运算符运算符运算符名称运算符名称用法解释用法解释3算术运算2自左向右*/乘法除法注意:区分浮点除和整除10.0/4.0得2.5,10/4得2:结果截尾%求余运算(模除)只能用于整数的求模。10%6=4 10.0%6不合法4算术运算2自左向右+-加法减法5位运算2自左向右左移右移只适用于整型、字符型变量变量变量左移位数左移位数 在右端补零,移出的位永远丢失例:a=0 xAF;a右移位数右移位数 右移方法1)对于无符号数:左边高位补02)对于有符号数:*逻辑右移:左边高位补0 *算术右移
26、:左边高位补符号位例:若a为整数 10010111 11101101,则a2对于逻辑右移得 00100101 11111011 对于算术右移得 11100101 111110116关系运算2自左向右=b为假,得07关系运算2自左向右=!=等于不等于int a=4;int b=5;关系表达式 a=b 的值为0(假)a!=b的值为1(真)优先优先级级类型类型操作数操作数个数个数结合性结合性运算符运算符运算符名称运算符名称用法解释用法解释8位运算2自左向右&按位与对操作数的二进制位逐位操作A=5;(0000 0101)B=0 x23;(0010 0011)A&B 得 0000 00019位运算2自左
27、向右按位异或10=1 01=1 11,00=0AB 得 0010 011010位运算2自左向右|按位或A|B 得 0010 011111逻辑运算2自左向右&逻辑与逻辑运算是把操作数看做一个整体,非零为真,零为假A&B=4&5=T&T=1A&0=4&0=T&F=012逻辑运算2自左向右|逻辑或A|B=4|5=T|T=113条件运算符3自右向左?:条件运算条件表达式?表达式条件表达式?表达式1:表达式:表达式2当条件表达式的结果为T时执行表达式1,否则执行表达式2。例:int a,b,c,max;a=3;b=4;c=5;max=ab?a:b;max=ab?a:bc?b:c;=(ab)?a:(bc)
28、?b:c)14赋值运算2自右向左=+=-=*=/=%=&=|=赋值运算把右操作数的值赋给左操作数复合的赋值表达式的一般形式为:op=;等效于=op;A+=B;=A=A+B;A*=2+3;=A=A*(2+3);优先优先级级类型类型操作数操作数个数个数结合性结合性运算符运算符运算符名称运算符名称用法解释用法解释15逗号运算符自左向右,逗号运算符顺序求值运算符表达式表达式1,表达式,表达式2,表达式,表达式n;将几个表达式串接在一个语句行中,被逗号隔开的表达式自左向右顺序执行,整个表达式的值是最后一个表达式的值。例:int a,x;x=(a=3,6*3);结果:a=3,x=18注意:逗号表达式是优先
29、级最低的运算符例:x=a=3,6*3;结果:a=3,x=3 例:a=3,b=4,c=51)a+bc&b=c2)a|b+c&b-c3)!(a+b)+c-1&b+c/2=(a+b)c)&(b=c)=0=a|(b+c)&(b-c)=1=(!(a+b)+c-1)&(b+c/2)=1 主要应用主要应用 例例1 演示位运算演示位运算#include main()unsigned char bit1=0 x5A,bit2=0 xB7;/声明两个无符号字声明两个无符号字/符类型变量并初始化符类型变量并初始化 couthex;/以十六进制输出以十六进制输出 coutbit1&bit2 is:int(bit1&b
30、it2)n;coutbit1&0 x20 is:int(bit1&0 x20)n;coutbit1&0 xDF is:int(bit1&0 xDF)n;coutbit1|bit2 is:int(bit1|bit2)n;coutbit1|0 x20 is:int(bit1|0 x20)n;cout(bit1bit2)bit2 is:int(bit1bit2)bit2)n;coutbit12 is:int(bit12)n;cout3 is:3)n;coutdec;/以十进制输出以十进制输出 程序运行后的输出结果为:程序运行后的输出结果为:bit1&bit2 is:12 bit1&0 x20 is:
31、0 bit1&0 xDF is:5a bit1|bit2 is:ff bit1|0 x20 is:7a (bit1bit2)bit2 is:5a bit13 is:b 例例2 演示演示sizeof运算运算include void main()const float pi=3.14;char ch=0 x5A;int i;cout”(1)”sizeof(pi)”n”;/pi为float,结果为4 cout”(2)”sizeof(ch)”n”;/ch为char,结果为1 cout”(3)”sizeof(ch&(pi|0)”n”;/或结果为1,与结果为1,最后为2字节 cout”(4)”sizeof
32、(i=4+pi*8)”n”;/表达式结果赋值给i,i为int,结果为2 cout”(5)”sizeof(3.14)double float unsigned long long unsigned int int unsinged char char 例:int a=10;a=a/2.5;对于赋值运算C+语言规定了不同的类型转换规则:当赋值表达式左、右两边操作数的类型不一致时,右操作数首先转换为左操作数的类型,然后将转换结果赋值给左操作数,整个赋值表达式的结果类型是左操作数的类型。例:/演示隐式类型转换的效果。#include main()float total_salary;/声明一个浮点变量
33、 int standing=35,standing_salary;standing_salary=standing*1.5;/计算工龄工资total_salary=800.00+standing_salary;cout Salary:total_salary n;二、强制类型转换 两种形式 类型名类型名 (表达式表达式 )(类型名类型名 )表达式表达式 强制类型转换具有第二高优先级。例:已知矩形面积为20、长为8,求其宽度。语句cout Width is:20/8 n;cout Width is:float(20)/8 n;cout Width is:(float)20/8 n;cout Wi
34、dth is:20/float(8)n;cout Width is:20/(float)8 n;cout Width is:float(20/8)b)intt=a;a=b;b=t;二、单入口单出口控制结构实现单入口单出口程序只需三种基本的控制结构 顺序结构 选择结构 当条件p(条件表达式)成立,则执行一个分支,否则执行另一个分支 多路分支 循环结构 实现反复执行某一部分的操作 循环结构三要素:循环条件循环条件p 循环体循环体A 循环变量循环变量:在每次循环中都必须有语句修改此变量的值,以使循环条件表达式的值可能改变,从而跳出循环pANY3.2选择结构一、if语句 if(条件表达式条件表达式)子
35、语句;子语句;if语句的有效范围是单个语句,如果子语句有多个语句,则必须用括起来,成为一个复合语句 if(条件表达式条件表达式)子语句子语句1;else 子语句子语句2;例例1 输入输入24小时制的时间,转换并输出小时制的时间,转换并输出12小小时制的时间并注明是上午还是下午(上午用时制的时间并注明是上午还是下午(上午用A.M表示,下午用表示,下午用P.M表示)表示)#include main()int hour;char noon=A;cout hour;if(hour 12)hour=hour-12;noon=P;cout The hour is hour noon 12)hour=hou
36、r-12;noon=P;“noon=P;”不是if的子语句,而是主流程if语句的下一个顺序语句程序程序2:程序程序3:#include void main()float x;coutx;if(x12)cout P.M:;x=x-12;else cout A.M:;coutxn;(改进)#include void main()float x;coutx;if(x=12)cout A.M:;else cout P.M:;x=x-12;coutxn;/注意书写层次结构例例2main()int standing;/用户输入的工龄float standing_salary;/根据用户输入工龄计算出来的工
37、龄工资cout standing;if(standing=0)&(standing=47)standing_salary=standing*1.5;cout Input accepted.Your standing salary is standing_salary n;else standing_salary=0;cout Invalid input.x07n;嵌套if语句1)if(表达式表达式1)if(表达式表达式2)子语句子语句1;else子语句子语句2;else 子语句子语句3;2)if(表达式表达式1)子语句子语句1;else if(表达式表达式2)子语句子语句2;else if(表
38、达式表达式n)子语句子语句n;else 子语句子语句n1;例例3 从键盘上输入从键盘上输入3个数个数A,B,C,求出三数中最大者并输出。求出三数中最大者并输出。#include void main()int A,B,C,max;coutABC;max=A;if(Bmax)max=B;/求出A、B中的较/大值,记录在max中,然后再比较C与max if(Cmax)max=C;cout MAX(A,B,C):maxB)if(AC)coutMaximumisA;elsecoutMaximumisC)coutMaximumisB;elsecoutMaximumisc)coutc”;c=a+b;else
39、 cout“a+b=c”;二、switch语句 多分支选择语句 switch语句的一般形式如下:switch(表达式表达式)case 常量表达式常量表达式1:语句序列语句序列1;break;case 常量表达式常量表达式2:语句序列语句序列2;break;case 常量表达式常量表达式n:语句序列语句序列n;break;default:语句序列语句序列n+1;break;说明 表达式可为任何类型。Switch在入口时判断表达式与哪个常量表达式匹配。若表达式的值与某个case后面的常量相等,则执行与该case后面相应的语句;若与所有列出的常量都不相等,则执行default后面的语句。case后只
40、能是常量表达式,不能是变量表达式,其值只能是整型、字符型、枚举型,不能是其他类型。每个常量表达式的值都不相同。case部分与default部分出现次序不影响执行结果。每部分不限单个语句,可写多个语句,不用加。break;语句用于执行完一个分支后跳出此switch语句例例4:#include main()int choice;/用户输入的选择cout 1.Applen;/给出选择菜单cout 2.Pearn;cout 3.Bananan;cout 4.Orangen;cout choice;/用户输入选择switch(choice)/对用户的选择分别作处理case 1:cout Your cho
41、ice is apple.n;case 2:cout Your choice is pear.n;case 3:cout Your choice is banana.n;case 4:cout Your choice is orange.n;default:cout You did not make a choice.n;break;break;break;break;break;3.3循环结构循环结构一、一、C+的循环语句的循环语句1.while语句 while(循环条件表达式循环条件表达式)循环体语句循环体语句;当表达式的值为T(非零)时,循环条件成立,执行循环体语句。while语句的作用
42、范围只到while后第一个分号(单语句)。若循环体有多个语句则需用 括起来。在循环体中应有使循环趋向于结束的语句 循环变量初始化需在while语句前完成例:给定一个正整数给定一个正整数n,求出平方值不超过,求出平方值不超过n的正整数并输出。的正整数并输出。程序流程图如右:源程序:#include main()int n;/用户给定的正整数int max;/所求的最大整数cout n;/判断用户输入是否合法if(n=0)cout Input error!n;else/利用循环求出平方大于n的最小整数max=1;while(max*max=n)max=max+1;/输出结果cout The max
43、imum integer is:max-1 n;2.do-while语句 do循环体语句循环体语句;while(循环条件表达式循环条件表达式p);先执行一次循环体语句,然后判别表达式,当为T时,返回执行循环体语句,直到表达式为F,结束循环 while语句和do-while语句基本等价,只有当表达式一开始就为假时,两种语句结果不一样i=20;sum=0;i=20;sum=0;while(i=10)do sum+=i;sum+=i;i+;i+;while(i=10);结果 sum=0结果 sum=203.for语句for(表达式表达式1;表达式表达式2;表达式表达式3)循环体语句循环体语句;表达式
44、1:循环变量赋初值表达式2:循环条件表达式3:循环变量增量(计数表达式)执行过程:1)求解表达式12)求解表达式2,若其值为T,执行循环体语句,跳到第3)步;若为F,结束循环,跳到第4)步3)求解表达式3,然后跳到第2)步4)循环结束,执行for语句的下一条语句适用于循环次数已知的循环for语句中的三个表达式中任一个或全部均可语句中的三个表达式中任一个或全部均可省略,但分号必须保留省略,但分号必须保留1)sum=0;for(i=1;i=100;i+)sum+=i;2)sum=0;i=1;for(;i=100;i+)sum+=i;3)sum=0;for(i=1;i+)if(i=100)break
45、;sum+=i;4)sum=0;for(i=1;i=100;)sum+=i;i+;5)sum=0;i=1;for(;i=100;)sum+=i;i+;6)sum=0;i=1;for(;)if(i=100)break;sum+=i;i+;7)for(sum=0,i=1;i=100;i+)sum+=i;while(i=100)while(1)二、循环的嵌套 三种循环可以相互替代 一个循环体内又包含另一个完整的循环结构循环的嵌套 各种循环可以相互嵌套三、转向语句转向语句一般形式功能描述例子 break语句 break;1.用于switch语句,使流程跳出switch结构,继续执行下一个语句2.用于循
46、环语句(while,do-while,for)3.除此之外,不能用于其他任何语句 for()if()break;a=1;continue语句 continue;结束本次循环,即跳过循环体中下面尚未执行的语句,而接着进行下一次循环的判断。for()if()continue;a=1;return语句 return 表达式;结束被调用函数,转向主调函数原处的下一条语句,将表达式结果送回主调函数例1(break的用法)键盘输入m和n(10mn32000),求出mn间所有素数且按每行8个数形式输出#include#include#include void main()int m,n,x,k,j;j=0;
47、/j计算输出个数 do cout”nEnter m,n(10mnmn;while(m=n)|(n=32000);cout”n*n”;for(x=m;x=n;x+)/对mn的数判别 k=sqrt(x);for(i=2;i=k+1)/不是用break跳出的,找到一个素数if(j%8=0)coutendl;/每行8个数 coutsetw(8)x;j=j+1;/以每行8个数的形式输出,每个数占8个字符的位置 cout”n*n”;例2(continue的用法)在键盘上输入若干个正数,累加求和,在键盘上输入若干个正数,累加求和,最后输出累加和以及平均值。最后输出累加和以及平均值。问题分析:问题分析:事先不
48、知道要输入多少个数,但知道输事先不知道要输入多少个数,但知道输入数是正数,我们可边输入边统计其个入数是正数,我们可边输入边统计其个数,若发现输入的是数,若发现输入的是0或负数时,输入结或负数时,输入结束。当输入数是大于束。当输入数是大于0时则累加并累计数时则累加并累计数的个数。的个数。源程序如下:#include void main()double sum,num;int n;sum=0.0;n=0;num=1.0;/设置初值 while(num0)coutnum;if(num=0)continue;sum=sum+num;n=n+1;cout”nThe total is:”sumendl;c
49、out”nThe average is:”(sum/n)0是否成立。显然,当n=0时退出循环。四、设计正确的循环循环不变式循环不变式 一个或者多个表达式 用于保证循环的正确性 在循环前成立在每次执行循环体后仍成立在循环结束后也成立例:公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱买100只鸡,问公鸡、母鸡、小鸡各多少只?cock公鸡的个数;hen母鸡的个数;chicken小鸡的个数;得方程:cock+hen+chicken=1005*cock+3*hen+chicken/3=100#include void main()int cock,hen,chicken;for(cock=0;
50、cock=100/5;cock+)for(hen=0;hen=100/3;hen+)chicken=100-cock-hen;if (chicken%3=0)&(5*cock+3*hen+chicken/3)=100)cout“cock=”cock“then=”hen“tchicken=”chickenendl;运行结果:cock=0 hen=25 chicken=75cock=4 hen=18 chicken=78cock=8 hen=11 chicken=81cock=12 hen=4 chicken=842033第四章第四章 函数 函数的声明与调用 参数传递方式 标识符的作用域 变量的生