第3章程序设计初步.ppt
第3章 程序设计初步第4章 函数与预处理第5章 数组第6章 指针第7章 自定义数据类型,第2篇 面向过程的程序设计,第3章 程序设计初步,3.1 面向过程的程序设计和算法3.2+程序和语句3.3 赋值语句3.4 C+的输入与输出3.5 编写顺序结构的程序3.6 关系运算和逻辑运算3.7 选择结构和if语句,3.8 条件运算符和条件表达式3.9 多分支选择结构和switch语句3.10 编写选择结构的程序3.11 循环结构和循环语句3.12 循环的嵌套3.13 break语句和continue语句3.14 编写循环结构的程序,面向过程的程序:对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构。对操作的描述。即操作步骤,也就是算法。程序=算法+数据结构算法:为解决一个问题而采取的方法和步骤。,3.1.1 算法的概念,3.1 面向过程的程序设计和算法,自然语言:流程图:传统的流程图或结构化流程图。用图的形式表示算法,比较形象直观,但修改算法时显得不大方便伪代码:介于自然语言和计算机语言之间的文字和符号来描述算法。用计算机语言表示算法:用一种计算机语言去描述算法,即计算机程序。,3.1.2 算法的表示,如:if x is positive then print xelse print-x,例:c+程序。#include/预处理命令using namespace std;/在函数之外的声明部分int a=3;/在函数之外的声明部分int main()/函数首部 float b;/函数内的声明部分 b=4.5;/执行语句 coutab;/执行语句 return 0;/执行语句,3.2 C+程序和语句,程序应该包括数据描述(由声明语句来实现)和数据操作(由执行语句来实现)C+程序中最小的独立单位是语句(statement)。语句一般是用分号结束的(复合语句是以右花括号结束的)。C+语句可以分为以下4种:声明语句:在C+中,对变量(以及其他对象)的定义被认为是一条语句,并且可以出现在函数中的任何行。执行语句:通知计算机完成一定的操作。包括:,控制语句:完成一定的控制功能。函数和流对象调用语句。表达式语句。由一个表达式加一个分号构成一个语句。,if()else(条件语句)for()(循环语句)while()(循环语句)dowhile()(循环语句)continue(结束本次循环语句)break(中止执行switch或循环语句)switch(多分支选择语句)goto(转向语句)return(从函数返回语句),例如:sort(x,y,z);/sort函数调用coutxendl;/流对象调用语句,i=i+1/是一个赋值表达式i=i+1;/是一个赋值语句,下面是一个空语句:;即只有一个分号的语句,它什么也不做。,空语句:复合语句:用 把一些语句括起来称为复合语句,如下面是一个复合语句。z=x+y;if(z100)z=z-100;coutz;,赋值语句是由赋值表达式加上一个分号构成。C+中的赋值号“”是一个运算符,可以写成:a=b=c=d;赋值表达式可以包括在其他表达式之中。例如:if(a=b)0)cout0endl;,3.3 赋值语句,有关流对象cin、cout和流运算符的定义等信息是存放在C+的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中:#include 把由cin和流提取运算符“”实现输入的语句称为输入语句或cin语句;把由cout和流插入运算符“”实现输出的语句称为输出语句或cout语句。,3.4 C+的输入与输出,cout语句的一般格式为:cout变量1变量2变量n;注意:一个cout语句可以分写成若干行,也可写成多个cout语句。不能用一个插入运算符“”插入多个输出项。系统会自动判别输出数据的类型。不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,可用getchar函数。,3.4.1 输入流与输出流的基本操作,例:cout“aabbcc”endl;cout“aa”“bbcc”endl;,例:cout“aabbcc”endl;cout“aa”;cout“bbcc”;cout endl;,例:couta,b,c;couta+b+c;couta b cendl;,例:cinabc;cinabc;cina;cinb;cinc;,例:char c1,c2;int a;float b;cinc1c2ab;2 5 88 123.456c1=2,c2=5,a=88,c=123.456,空格做分隔符!,C+提供了在输入输出流中使用的控制符(有的书中称为操纵符),见书中表3.1。注意:如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。举例:输出双精度数。,3.4.2 在输入流与输出流中使用控制符,double a=123.456789012345;(1)couta;输出:123.457(2)coutsetprecision(9)a;输出:123.456789(3)coutsetprecision(6);恢复默认格式(精度为6)(4)cout setiosflags(iosfixed);输出:123.456789(5)coutsetiosflags(iosfixed)setprecision(8)a;输出:123.45678901(6)coutsetiosflags(iosscientific)a;输出:1.234568e+02(7)coutsetiosflags(iosscientific)setprecision(4)a;输出:1.2346e02,下面是整数输出的例子:int b=123456;/对b赋初值(1)coutb;输出:123456(2)couthexb;输出:1e240(3)coutsetiosflags(iosuppercase)b;输出:1E240(4)coutsetw(10)b,b;输出:123456,123456(5)coutsetfill(*)setw(10)b;输出:*123456(6)coutsetiosflags(iosshowpos)b;输出:+123456,如果在多个cout语句中使用相同的setw(n),并使用setiosflags(iosright),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。,例3.1 各行小数点对齐。#include#include using namespace std;int main()double a=123.456,b=3.14159,c=-3214.67;coutsetiosflags(ios:fixed)setiosflags(ios:right)setprecision(2);coutsetw(10)aendl;coutsetw(10)bendl;coutsetw(10)cendl;return 0;,输出如下:123.46(字段宽度为10,右对齐,取两位小数)3.14-3214.67,先统一设置定点形式输出、取两位小数、右对齐。这些设置对其后的输出均有效(除非重新设置)而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。,1.putchar函数(字符输出函数)putchar函数的作用是向终端输出一个字符。例如:putchar(c);它输出字符变量的值。,3.4.3 用getchar和putchar 函数进行字符的输入和输出,例3.2 输出单个字符。#include/或者包含#include using namespace std;int main()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);putchar(n);putchar(66);putchar(79);putchar(89);putchar(10);return 0;,运行结果为:BOYBOY,2.getchar函数(字符输入函数)此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。getchar函数没有参数,其一般形式为getchar()函数的值就是从输入设备得到的字符。注意:getchar()只能接收一个字符。,例3.3 输入单个字符。#include using namespace std;int main()char c;c=getchar();putchar(c+32);putchar(n);return 0;,运行结果为:Aa,例如:putchar(getchar()+32);putchar(n);输出a。此时不必定义变量c。例如:用cout输出getchar函数得到字符的ASCII值:coutgetchar();输入a,这时输出的是整数97。例如:cout(c=getchar();/设c已定义为字符变量则输出为字母a例如:cout(c=getchar()+32);,scanf函数一般格式:scanf(格式控制,输入表列);printf函数的一般格式:printf(格式控制,输出表列);,3.4.4 用scanf和printf函数进行输入和输出,例3.4 用scanf和printf函数进行输入和输出。#include using namespace std;int main()int a;float b;char c;scanf(“%d%c%f”,运行情况如下:12 A 67.98(本行为输入,输入的3个数据间以空格分割)a=12,b=67.980003,c=A(本行为输出)输入的整数12送给整型变量a,字符A送给字符变量c,67.98送给单精度变量b。,例3.5 求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,它们的值满足b2-4ac0。根据求x1,x2的算法。它可以编写出以下C+程序:,3.5 编写顺序结构的程序,#include#include using namespace std;int main()float a,b,c,x1,x2;cinabc;x1=(-b+sqrt(b*b-4*a*c)/(2*a);x2=(-b-sqrt(b*b-4*a*c)/(2*a);coutx1=x1endl;coutx2=x2endl;return 0;,运行情况如下:4.5 8.8 2.4 x1=-0.327612x2=-1.17794,例如,购物在1000元以下的打九五折,1000元及以上的打九折。C+提供if语句来实现这种条件选择。如if(amount1000)tax=0.95;else tax=0.9;pay=amount*tax;,3.6 关系运算和逻辑运算,3.6.1 关系运算和关系表达式,关系运算符,种类:=!=结合方向:自左向右优先级别:,例如:ca+b 等效于 c(a+b)ab=c 等效于(ab)=c a=bc 等效于a=(bc),关系表达式的值是一个逻辑值,即“真”或“假”。,d=abf=abc,逻辑型常量只有两个,即false(假)和true(真)。逻辑型变量要用类型标识符bool来定义,它的值只能是true和false之一。如:bool found,flag=false;found=true;flag=123;/赋值后flag的值为truecoutflag;输出为数值1。,3.6.2 逻辑常量和逻辑变量,逻辑运算符:种类:!&|逻辑运算真值表,3.6.3 逻辑运算和逻辑表达式,例如:a&b 若a,b为真,则a&b为真。a|b 若a,b之一为真,则a|b为真。!a 若a为真,则!a为假。,优先级:,结合方向:,例如:(ab)&(xy)可写成 ab&xy(a=b)|(x=y)可写成 a=b|x=y(!a)|(ab)可写成!a|ab,短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符,例 a(m=ab)&(n=cd),/结果m=0,n=1,例如,要判别某一年(year)是否为闰年。闰年的条件是符合下面两者之一:能被4整除,但不能被100整除。能被100整除,又能被400整除。可以用一个逻辑表达式来表示:(year%4=0&year%100!=0)|year%400=0 可以加一个“!”用来判别非闰年:!(year%4=0&year%100!=0)|year%400=0),3.7 选择结构和if语句if语句(条件选择语句)if语句的三种形式形式一:格式:if(expression)statement执行过程:,形式二:格式:if(expression)statement1 else statement2执行过程:,例:if(xy)max=x;else max=y;,形式三:格式:,if(expr1)statement1else if(expr2)statement2else if(expr3)statement3.else statementn,执行过程:,0;=例:if(salary1000)index=0.4;else if(salary800)index=0.3;else if(salary600)index=0.2;else if(salary400)index=0.1;else index=0;,例3.6 求三角形的面积。#include#include/使用数学函数时要包含头文件cmath#include/使用I/O流控制符要包含头文件 iomanipusing namespace std;int main()double a,b,c;coutabc;,if(a+bc,运行情况如下:please enter a,b,c:2.45 3.67 4.89area=4.3565,3.7.2 if语句嵌套,例 输入两数并判断其大小关系,#include using namespace std;int main()int x,y;coutxy;if(x!=y)if(xy)printf(XYn);else printf(XYn);else printf(X=Yn);,运行:Enter integer x,y:12,23 XY Enter integer x,y:12,12 X=Y,if-else 配对原则:缺省 时,else总是和它上面离它最近的未配对的if配对,例:if(a=b)if(b=c)cout“a=b=c”endl;else cout“a!=b”endl;,修改:if(a=b)if(b=c)cout“a=b=c”endl;else cout“a!=b”endl;,实现if else 正确配对方法:加,例 考虑下面程序输出结果:#include using namespace std;int main()int x=100,a=10,b=20;int v1=5,v2=0;if(ab)if(b!=15)if(!v1)x=1;else if(v2)x=10;x=-1;printf(“%d”,x);return 0;,结果:-1,3.8条件运算符与表达式一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句,例(a=b)?Y:N(x%2=1)?1:0(x=0)?x:-x(c=a&c=z)?c-a+A:c,例 求 a+|b|cout0?a+b:a-b);,条件运算符可嵌套 如 x0?1:(x0?-1:0)优先级:14,结合方向:自右向左 如 ab?a:cd?c:d ab?a:(cd?c:d)expr1、expr2、expr3类型可不同,表达式值取较高的类型,例 x?a:b/x=0,表达式值为b;x0,表达式值为a xy?1:1.5/xy,值为1.0;xy,值为1.5,例3.7 大写字母转换成小写字母。#include using namespace std;int main()char ch;cinch;ch=(ch=A,3.9switch语句(开关分支语句)一般形式:,switch(表达式)case E1:语句组 1;break;case E2:语句组 2;break;.case En:语句组 n;break;default:语句组;break;,执行过程:,说明:E1,E2,En是常量表达式,且值必须互不相同语句标号作用,必须用break跳出case后可包含多个可执行语句,且不必加 switch可嵌套多个case可共用一组执行语句,如:case A:case B:case C:cout60”endl;break;.,例 switch(score)case 5:cout“Very good!”endl;case 4:cout“Good!”endl;case 3:cout“Pass!”endl;case 2:cout“Fail!”endl;default:cout“data error!”endl;,运行结果:score为5时,输出:Very good!Good!Pass!Fail!data error!,注意:在switch语句中,“case常量表达式”只相当于一个语句标号,表达式的值和某标号相等,则转向该标号执行,但不能在执行完成该标号的语句后自动跳出整个switch语句,所以出现了继续执行后面的case语句的情况。为了避免这种情况,提供了break语句,专门用于跳出switch语句。,#include using namespace std;int 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+;cout“a=”a“,b=”bendl;return 0;,运行结果:a=2,b=1,例3.8 编写程序,判断某一年是否为闰年。闰年条件:1、能被4整除,但不能被100整除2、能被100整除,又能被400整除,3.10 编写选择结构的程序,#include using namespace std;int main()int year;coutyear;/输入年份 if(year%4=0,例3.9 运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:s250km 没有折扣 250s500 2折扣 500s1000 5折扣 1000s2000 8折扣 2000s3000 10折扣 3000s 15折扣设每公里每吨货物的基本运费为p(price),货物重为w(wright),距离为,折扣为d(discount),则总运费f(freight)的计算公式为:f=p*w*s*(1-d),图3.8,#include using namespace std;int main()int c,s;float p,w,d,f;coutpws;if(s=3000)c=12;else c=s/250;switch(c)case 0:d=0;break;case 1:d=2;break;case 2:case 3:d=5;break;case 4:,case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);coutfreight=fendl;return 0;,运行情况如下:please enter p,w,s:100 20 300freight=588000,3.11循环结构和循环语句C+可实现循环的语句:用goto 和 if 构成循环while 语句do while 语句for 语句goto语句及用goto构成循环goto语句一般格式:,goto 语句标号;.标号:语句;,功能:无条件转移语句说明:不能用整数作标号只能出现在goto所在函数内,且唯一只能加在可执行语句前面限制使用goto语句,例 用if 和goto语句构成循环,求,#include using namespace std;int main()int i,sum=0;i=1;loop:if(i=100)sum+=i;i+;goto loop;coutsumendl;return 0;,sum=0+1sum=1+2=3sum=3+3=6sum=6+4=10sum=4950+100=5050,例 从键盘输入一组数据,以0结束输入,求数据和,#include using namespace std;int main()int number,sum=0;read_loop:cinnumber;if(!number)goto print_sum;sum+=number;goto read_loop;print_sum:coutThe total sum is sumendl;,while语句一般形式:,while(表达式)循环体语句;,执行流程:,特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环条件表达式不成立(为零)循环体内遇break,return,goto无限循环:while(1)循环体;,例 用while循环求,#include using namespace std;int main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;coutsumendl;,例 显示110的平方,#include using namespace std;int main()int i=1;while(i=10)couti”*”i“=”i*i);i+;return 0;,运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100,dowhile语句一般形式:,do 循环体语句;while(表达式);,执行流程:,特点:先执行循环体,后判断表达式说明:至少执行一次循环体dowhile可转化成while结构,例 用dowhile循环求,#include using namespace std;int main()int i,sum=0;i=1;do sum+=i;i+;while(i=100);coutsumendl;return 0;,例 while和dowhile比较,#include int main()int i,sum=0;cini;do sum+=i;i+;while(i=10);coutsumendl;return 0;,#include int main()int i,sum=0;cini;while(i=10)sum+=i;i+;coutsumendl;return 0;,3.11.4 几种循环的比较,for语句一般形式:,for(expr1;expr2;expr3)循环体语句;,执行流程:,for语句一般应用形式:,for(循环变量赋初值;循环条件;循环变量增值)循环体语句;,说明:for语句中expr1,expr2,expr3 类型任意,都可省略,但分号;不可省无限循环:for(;)for语句可以转换成while结构,expr1;while(expr2)循环体语句;expr3;,例:#includeusing namespace std;int main()int i;for(i=0;i10;i+)putchar(a+i);return 0;,运行结果:abcdefghij,例:#includeusing namespace std;int main()int i=0;for(;i10;i+)putchar(a+i);return 0;,例:#include using namespace std;int main()int i=0;for(;i10;)putchar(a+(i+);return 0;,例:#includeusing namespace std;int main()int i=0;for(;i10;putchar(a+i),i+);return 0;,#includeusing namespace std;int main()int i,j,k;for(i=0,j=100;i=j;i+,j-)k=i+j;couti“+”j“=“kendl;return 0;,#includeusing namespace std;int main()char c;for(;(c=getchar()!=n;)coutcendl;return 0;,#include using namespace std;int main()int i,c;for(i=0;(c=getchar()!=n;i+=3)coutc+iendl;return 0;,循环的嵌套三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的执行流程,(1)while()while().,(2)do do while();.while();,3)while()do while();.(,(4)for(;)do while();while().,嵌套循环的跳转禁止:从外层跳入内层跳入同层的另一循环向上跳转,例 循环嵌套,输出九九表,#include/#include using namespace std;int main()int i,j;for(i=1;i10;i+)printf(%4d,i);/coutsetw(4)i;cout“n-n;for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?%4dn:%4d,i*j);printf(“n”);return 0;,for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?%4dn:%4d,i*j);,break和continue是辅助控制语句break语句的一般格式为:break;其作用为使流程从循环体内跳出循环体,即提前结束循环,接着执行循环体下面的语句。break语句只能用于循环语句和switch语句内,不能单独使用或用于其他语句中。,3.13 break语句和continue语句,break语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中,例 break举例:输出圆面积,面积大于100时停止,#define PI 3.14159/const float PI=3.14159;#includeusing namespace std;int main()int r;float area;for(r=1;r100)break;coutr=rarea=areaendl;return 0;,例 break举例:小写字母转换成大写字母,直至输入非字母字符,#include using namespace std;int main()int i,j;char c;while(1)c=getchar();if(c=a,continue语句功能:结束本次循环,跳过循环体中尚未执行的 语句,进行下一次是否执行循环体的判断 仅用于循环语句中,例 求输入的十个整数中正数的个数及其平均值,#include using namespace std;int main()int i,num=0,a;float sum=0;for(i=0;ia;if(a=0)continue;num+;sum+=a;coutnum“个正数的和为:“sum;cout“平均值:”sum/num;return 0;,coutsetiosflags(ios:fixed)setprecision(1);coutnum个正数的和为:sumendl;cout平均值:sum/numendl;,3.14 编写循环结构的程序,分子:1,-1,1,-1分母:1,3,5,7,.,#include#include#includeusing namespace std;int main()int s;double n,t,pi;t=1,pi=0,n=1.0,s=1;while(fabs(t)=1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;coutpi=setiosflags(ios:fixed)setprecision(6)piendl;return 0;,运行结果:pi=3.141594,#include#includeusing namespace std;int main()int i,n;float s=0.0;cinn;for(i=1;i=n;i+)s+=pow(-1.0,i-1)/(2*i-1.0);s*=4.0;coutpi=“sendl;return 0;,输入的n值越大,就越逼近的精确值。,例 求Fibonacci数列:1,1,2,3,5,8,的前40个数,#include#includeusing namespace std;int main()long f1,f2;int i;f1=1;f2=1;for(i=1;i=20;i+)coutsetw(12)f1 setw(12)f2;if(i%2=0)coutendl;f1=f1+f2;f2=f2+f1;return 0;,例 判断m是否素数,#include#include using namespace std;int main()int m,i,k;cinm;k=sqrt(m);for(i=2;ik)coutm“是素数”endl;else coutm“不是素数”endl;return 0;,例 找出100200之间的素数,#include#include#includeusing namespace std;int main()int m,i,k,n=0;bool prime;,for(m=101;m=200;m+=2)prime=true;k=int(sqrt(m);for(i=2;i=k;i+)if(m%i=0)prime=false;break;if(prime)coutsetw(5)m;n+=1;if(n%10=0)coutendl;coutendl;return 0;,运行结果:101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199,例 译密码。将当前字母变成其后的第4个字母。,例如 Hello,world!译成密码:Lipps,asvph!,#includeusing namespace std;int main()char c;while(c=getchar()!=n)if(c=a,AZ 6590az 97122,运行结果如下:I am going to Beijing!M eq ksmrk xs Fimnmrk!,例、输出1100之间个位数为6的所有整数,#includeusing namespace std;int main()int i,j;for(i=0;i+)j=i*10+6;if()continue;coutj;coutendl;return 0;,i=10,j100,1)此题能否将continue换为break?2)本题若让你自己做,你会如何考虑?,作 业见附件,实验报告书写格式,1、实验名称2、实验目的3、实验内容4、实验心得,本次实验报告中的实验目的:1、了解C+程序和几种语句;2、熟悉选择结构、循环结构;3、练习使用ifelse语句、switch语句实现选择结构;使用while、dowhile、for实现循环结构并熟练掌握,