1、第3章 C+程序设计基础,上海电力学院计信学院,本章主要内容,3.1 C+语句的类型 3.2 数据的输入输出 3.3 程序的流程控制,3.1 C+语句的类型,语句是组成C+程序的最基本的部分,执行语句会产生相应的效果: 程序的执行部分 程序的功能 语句 声明语句 执行语句 空语句 复合语句,3.1.1 声明语句,声明语句主要用于声明变量、常量和函数等: char ch; const int MAX_LEN=128; double sqrt(double);,3.1.1 执行语句,表达式语句 A=5; /赋值语句 a+=9; /复合赋值语句 控制语句 条件判断语句 if( )else(条件语句)
2、 switch(多分支选择语句) 循环执行语句 for( ) (循环语句) while( ) (循环语句) dowhile( ) (循环语句) 转向语句 break(终止执行switch或循环语句) continue(结束本次循环) goto(转向语句) return(从函数返回语句),空语句 只由分号“;”组成的语句称为空语句 ; 复合语句 将两条以上的语句用括起,即称作复合语句,也可将其称为块语句或块程序。 a=a+b;if(a=b)cout“a=0“endl;,复合语句 把多个语句用括号括起来组成的一个或多个语句称复合语句; 语句1;语句2;语句n;,复合语句可以作为整体一条语句使用,#
3、include using namespace std; void main() int a,b;cout a b; cout “主函数中的a=“ a endl;cout “主函数中的b=“ b endl; ,请分别输入整型变量a和b的值: 8 复合语句中的a=0 复合语句中的b=1 主函数中的a=4 主函数中的b=8,局部范围的变量会覆盖较大范围的同名变量,如复合语句中的a,b,bool a=false,b=true;cout “复合语句中的a=“ a endl; cout “复合语句中的b=“ b endl; ,3.2 数据的输入输出,3.2.1 输入流(cin) 3.2.2 输出流(co
4、ut) 3.2.3 C+保留的输入输出方式,3.2.1 cin输入流,通过键盘输入不同类型数据 形式: cin变量1变量2变量n; 连续输入多个变量时,各个变量之间要添加空白符 如:double price,total;int n;cinpricen; /输入时注意空白符分隔total=n*price;,3.2.2 cout输出流,变量值以及文本字符串输出到屏幕。变量和字符串可以组合输出 形式: cout变量1变量2变量n; couttotal; cout“字符串”变量; cout“总价为:”total;,3.2.3 C+保留的输入输出方式,putchar函数 putchar函数是有参函数,参
5、数可以是变量、数值和表达式。当参数是数字时,按ASCII码表输出相应字符。 一般形式为:putchar(a); getchar函数 getchar函数是无参函数,其作用是从系统默认输入设备接收一个字符。无论用户输入多少个字符,getchar()只能接受第一个字符。 一般形式为:getchar();,3.3 程序的流程控制,3.3.1 选择结构 3.3.2 循环结构 3.3.3 转向语句,顺序结构,就是指按照语句在程序中的先后次序一条一条顺序地执行。 顺序结构由语句实现。,开始,例:已知正方型边长,求正方型面积,#include using namespace std; void main()
6、,输入数据,进行计算,输出结果,简单程序设计的基本步骤:,cout“ the edge =“edgeendl; cout“the area =“areaendl;,int edge,area;,cinedge;,area=edge*edge;,输入数据,计算,输出结果,变量名取名规则:按义取名,cout“Please input the edge :”,int circumference ;,circumference=edge*4;,cout“the circumference=“ circumferenceendl;,及周长,#include #include using namespac
7、e std; int main() double a,b,c,disc,x1,x2,p,q;coutabc;disc=b*b-4*a*c;p=-b/(2*a); q=sqrt(disc)/(2*a); x1=p+q; x2=p-q; cout“x1=“x1“ x2=“x2endl;return 0; ,例3 求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,它们的值满足b2-4ac0。,x1=(-b+sqrt(b*b-4*a*c)/(2*a); x2=(-b-sqrt(b*b-4*a*c)/(2*a);,输入数据,进行计算,输出结果,简单程序设计的基本步骤:,3.3.
8、1 选择语句和选择结构,选择语句 if语句 if语句用于两者选一 switch语句 用于多分支选一,选择结构,程序的流程由多路分支组成,在程序的一次执行过程中,根据不同的情况,只有一条支路被选中执行,而其他分支上的语句被直接跳过。 选择结构由选择控制语句实现。,1,0,if语句形式1,if(条件表达式) 语句1;,if (a0) couta“是个大于0的数”endl;,if (a0) couta“是个大于0的数”;coutendl;,如:if( a=b,if(x) if( x!=0 ) if(!x) if( x=0 ),例 输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不
9、是,不转换。然后输出最后得到的字符。,#include using namespace std; int main( ) char ch;coutch;if (ch=A ,Ch为大写字母?,转换为小写字母,输出字母,NO,YES,ch,例 : 输入两个实数,按代数值由小到大得顺序输出这两个数。,#include using namespace std; void main() int a,b,temp;coutab;if(ab) temp=a; a=b; b=temp; couta“ “bendl; ,思路: 1、将两个数保存在变量a、b中; 2、如果a=b,直接按顺序输出a、b既可;否则,交
10、换a、b的值,使a=b,再按顺序输出a、b; 3、如何交换a、b的值? a=b;b=a; ? 引入辅助变量temp,temp=a; a=b; b=temp; ,if语句形式2,if (条件表达式)语句1;else语句2;,if (ab) max=a; elsemax=b; cout“max=”maxendl;,输入一个年份,判断是否闰年,闰年的条件是 能被4整除,但不能被100整除的年份都是闰年; 或者,能被400整除的年份是闰年。(year % 4 = 0 & year % 100 != 0) | (year % 400 = 0),#include using namespace std;
11、int main( ) int year;bool leap;coutyear;leap=(year%4 = 0 ,请输入一个年份: 1900 1900 年不是闰年,if语句形式3,if (条件表达式) if (条件表达式) 语句1;else语句2;else语句3;,if (ab) if(ac)max=a;elsemax=c; elseif(bc)max=c;elsemax=b;,if语句的嵌套,if (条件1)if (条件2) 语句1else 语句2 elseif(条件3) 语句3else 语句4,内嵌if,内嵌if,if (条件1)if (条件2) 语句1else 语句2,if (条件1)
12、 if (条件2) 语句1 else语句3,内嵌if,if (条件1)语句1 elseif(条件2) 语句2else 语句3,内嵌if,注意else与if的配对,else 必须与if 配对使用,不能单独使用;在多层嵌套中,else总是与前面最近的未匹配的if 配对,与程序书写格式无关。,例: if (a=b)if(b=c)cout“a=b=c”;elsecout“a!=b”;,修改: if (a=b) if(b=c)cout“a=b=c”;elsecout“a!=b”;,实现if else 正确配对方法:加 ,例 考虑下面程序输出结果:main() int x=100,a=10,b=20;in
13、t v1=5,v2=0;if(ab)if(b!=15)if(!v1)x=1;elseif(v2) x=10;coutx;,结果:100,例:有一函数,-1 (x0) -#include using namespace;void main() int x,y;cinx;if ( x0 )y=-1 ;else if ( x=0) y=0;else y=1;coutxy;,程序2 void main() int x,y;cinx;if ( x=0 )if(x0) y=1 ;else y=0;else y=-1;coutx“ “y;,程序3 main() int x,y;cinx;y=-1;if (
14、x!=0 )if(x0) y=1 ;else y=0; coutx“ “y;,程序4 void main() int x,y;cinx;y=0;if ( x=0 )if(x0) y=1 ;else y=-1; coutx“ “y;,思考:以上程序能够实现预定得功能吗?,if(条件1)语句1 else if(条件2)语句2 else if(条件3)语句3 else if(条件4)语句4 else 语句5,条件1,语句1,非0,0,条件2,条件3,语句5,语句3,语句2,非0,非0,0,0,例,条件4,语句4,非0,例:编写程序,对输入的考试分数按照90分以上A等,8980分B等,7970分C等,
15、6960分D等,60分以下E等划分等级,并输出结果。,main() int score; char grade;cinscore;if ( score=90 ) grade = A;else if ( score = 80 ) grade = B;else if ( score = 70 ) grade = C;else if ( score = 60 ) grade = D;else grade = E;cout“grade =”grade;,main() int score; char grade;cinscore;if ( score=90 ) grade = A;else if ( s
16、core = 80 ) grade = B;elseif ( score = 70 ) grade = C;else if ( score = 60 ) grade = D;else grade = E;cout“grade =”grade;,switch多分支语句,前面介绍的if语句,常用于两情况的选择结构,要表示两种以上条件的选择结构,则要用if语句的嵌套形式,但如果嵌套的if语句比较多时,程序可读性就差。因此,C语言提供了switch语句来直接实现多种情况的选择结构。,switch多分支语句,switch( 表达式) case 常量表达式1:语句组 1; break;case 常量表达式
17、2:语句组 2;break;.case 常量表达式n:语句组 n;break; default:语句组 ; ,整型或字符型表达式,是常量且不同的常量 表达式值互不相同,switch(identity) case 1: cout“VIP会员的购物总额为:“;total=count*price*0.7;break;case 2: cout“高级会员的购物总额为:“;total=count*price*0.75;break;case 3: cout“中级会员的购物总额为:“;total=count*price*0.8; break;case 4: cout“初级会员的购物总额为:“;total=co
18、unt*price*0.9;break;default: cout“普通顾客的购物总额为:“;total=count*price; ,常量表达式1常量表达式n是常量,且值必须互不相同; 常量表达式起语句标号作用,必须用break跳出switch语句的执行; case后可包含多个可执行语句,且不必加 ; switch可嵌套 多个case可共用一组执行语句,运行结果: Very good! Good! Pass! Fail! Data error!,例: score = 5;switch(score) case 5: cout“Very good!”;case 4: cout“Good!”;cas
19、e 3: cout“Pass!”;case 2: cout“Fail!”;default : cout“data error!”;,break; break;break;break;,void main( ) int x=1, y=0, a=0, b=0;switch(x) case 1: switch(y) case 0: a+; break;case 1: b+; break;case 2: a+; b+; break;case 3: a+; b+; break;cout “a=” a “,b=” b;,运行结果:a=2, b=1,switch嵌套,3.3.2 循环语句和循环结构,C+循环
20、语句: while语句 do while语句 for语句 循环语句用来实现循环结构,while语句,条件表达式?,循环体,循环语句后的语句,while (条件表达式) 循环体语句;,利用while循环结构求和1+2+3+10,观察各个加数之间的关系和变化 后面的数比前面的依次多1,设i 为加数变量, 初值取 1, 从 110 变化; 将和存放在一个变量sum中,一般初始化为0; 假设sum=sum+i; 表示把当前的i和前i-1个数之和; 当i10时,不再执行sum=sum+i计算。,#include using namespace std;int main( ) int i=1, sum=0
21、;while ( i=10 ) sum += i;+i;cout “sum=”sum ;return 0;,while语句特点,先判断条件表达式,如果为真执行循环体,否则退出循环直接执行while语句之后的语句。 说明 循环体语句可能一次也不执行 当第一次条件表达式就为0时 永真循环 while(非0) 当循环语句中存在如下语句时,强制退出循环 break语句 return语句 goto语句,如何求解前n个自然数之和,#include using namespace std;int main( ) int i=1, sum=0;int n;cinn;while ( i=10 ) sum +=
22、i;+i;cout “sum=”sum ;return 0;,编程序, 输出100以内能被3整除的数,#include using namespace std;int main( ) int i = 1;while ( i=100 ) if ( i % 3 = 0 )cout “t “ i ;i+;return 0;,编程序计算 5!,#include using namespace std;int main( ) int i=1, f=1;while ( i=5 ) f *= i;+i;cout “f=”f ;return 0;,编程序计算 1!+2!+3!+n!,while ( i=5 )
23、 f *= i;+i;,int sum=0; while ( i=5 ) f *= i;+i;sum+=f;,do while语句,do 循环体语句;while (表达式);,包括循环变量更新语句,do while语句特点,先执行循环体语句,再判断表达式真假 至少执行一次循环体语句 do while语句可以转化为while语句,while语句,输入一个整数,将各位数字反转后输出,#include using namespace std; int main( ) int n, d ; cout n;cout “反转后的数字序列为:“;do d =n % 10;cout d;n /= 10; wh
24、ile (n != 0);coutendl;return 0; ,for语句,for ( 表达式1 ; 表达式2; 表达式3 )循环体语句;, 表示其中的表达式可以省略,循环变量初始化,for循环实现1n个自然数之和,#include using namespace std;int main( ) int i, n,sum=0;coutn;for ( i=1; i=n; i+) sum += i;cout sum;return 0;,表达式1,表达式3,for语句,for(循环变量赋初值;循环条件;循环变量增值) 循环体语句; ,注意: for语句中表达式1, 表达式2 ,表达式3 类型任意,
25、都可省略,但分号;不可省 无限循环: for ( ; ; ) for语句可以转换成while结构,表达式1;while( 表达式2 )循环体语句;表达式3;,输出100以内能被3整除的正整数while和for,#include using namespace std;void main( ) int i = 0;while ( i=100 ) if ( i % 3 = 0 )cout “t“ i ;i+;,int i; for(i=0; i=100;i+ ) if ( i % 3 = 0 )cout “t“ i ;,输入一个整数,求出它的所有因子,#include using namespac
26、e std; void main( ) int n, k;cout n;cout “数 ” n “的因子是:“;for ( k=1; k = n; k+)if (n % k = 0)cout k “t“;cout endl; ,k=sqrt(n), coutk“t”;if(k!=n/k)coutn/k“t”; ,循环的嵌套,当一个循环的循环体语句中包括另一个循环语句时,就形成了循环的嵌套: 三种循环可以互相嵌套,层数不限 循环语句之间不能相互交叉,几种嵌套形式,(1) while() while() .,(2) do do while( );.while( );,(3) while() do
27、while( );.,(4) for( ; ;) do while();while() .,嵌套循环的跳转 禁止从外层循环跳入内层循环 禁止跳入同层的另一循环,输出以下图案,*,#include using namespace std; void main() int i,j,k;for(i=1;i=1;k-)cout “*“;coutendl; ,编程输出下列图形,# $# $# $# $# $,3.3.3 转向语句,break语句 continue语句 goto(转向语句) return(从函数返回语句),break语句,形式: break; 功能 终止并跳出switch 终止并跳出当前循
28、环,输出100以内能被3整除的正整数,#include using namespace std;void main( ) int i = 0;while ( 1 ) if ( i % 3 = 0 )cout 100)break;i+;,continue语句,形式: continue; 功能 结束本次循环。即跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断 仅用于循环语句中,输出100以内能被3整除的正整数for和continue,#include using namespace std;void main( ) int i ;for(i=0; i=100;i+ ) if ( i %
29、3 != 0 )continue;cout “t“ i ;,求输入的n个整数中正数的个数及其平均值,int main( ) int i, count=0, num,n;float sum=0.0;coutn;for ( i=1; i num;if (num=0) continue;count+;sum+=num;cout“正数的个数是: “ count endl;cout“平均值是: “sum/countendl;return 0;,练习,判断输入的数据n是否是素数 求Fibonacci数列:1,1,2,3,5,8,的前40个数,要求每行输出5个,F1 = 1 ( n = 1 )F2 = 1
30、( n = 2 )Fn = Fn-1 + Fn-2 (n =3 ),goto语句,goto语句也称为无条件转移语句,其一般格式为: goto 语句标号; goto语句的语义是改变程序流向,转去执行语句标号所标识的语句。 为了避免破坏程序的结构,尽量避免使用该goto语句。,求1+2+3+100,#include using namespace std; void main() int i=1,sum=0; loop: sum+=i+;if (i=100)goto loop;cout “the sum is: “ sum endl; ,注意:,滥用goto语句将使程序流程无规则、可读性差,现代程
31、序设计方法主张限制使用goto语句。 用goto语句实现的循环完全可用while或for循环来表示。 一般地,goto语句只在一个地方有使用价值:当要从多重循环深处直接跳转到循环之外时,如果用break语句,将要用多次,而且可读性并不好,这时goto可以发挥作用。,return语句,return语句又称返回语句。其一般形式为: return 表达式; return语句一般用于返回系统程序执行的结果或状态,也可以用来停止执行当前函数,转而执行调用该函数后面的语句。 return语句所返回表达式的类型必须与函数的类型一致。 函数体中可以有多个return语句,但只有一个起作用。,小结与复习建议,主要内容if语句的三种形式if语句的嵌套switch语句while语句,dowhile语句和for语句 达到的目标熟练掌握if语句,switch语句,while语句,dowhile语句 和for语句透彻理解各种语句表示的功能 实验三四五 作业,