版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章程序设计初步面向过程的程序设计和算法C++的输入与输出编写顺序结构的程序关系运算与逻辑运算分支结构程序设计循环结构程序设计转向语句3.1
面向过程的程序设计和算法在面向过程的程序设计中,程序设计者必须指定计算机执行的具体步骤,程序设计者不仅要考虑程序要“做什么”,还要解决“怎么做”的问题,根据程序要“做什么”的要求,写出一个个语句,安排好它们的执行顺序。怎样设计这些步骤,怎样保证它的正确性和具有较高的效率,这就是算法需要解决的问题。3.1.1
算法的概念一个面向过程的程序应包括以下两方面内容:(1)对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data
structure)。(2)
对操作的描述。即操作步骤,也就是算法(algorithm)。对于面向过程的程序,可以用下面的公式表示:程序=算法+数据结构作为程序设计
,必须认真考虑和设计数据结构和操作步骤(即算法)。算法是处理问题的一系列的步骤。算法必须具体地在执行时每一步应当怎样做。算法是求解特定问题的一组有限的操作序列。计算机算法可分为两大类别:数值算法和非数值算法。数值算法的目的是求数值解。非数值算法包括的面十分广泛,最常见的是用于事务管理领域。目前,计算机在非数值方面的应用远远超过了在数值方面的应用。一个算法应该具有以下特点:①有穷性
一个算法应包含有限的操作步骤,不能是无限的。②确定性
算法中的每一步骤都应当是确定的,而不应当是含糊的,
的。③有零个或多个输入,一个或多个输出。④有效性算法中的每一个步骤都应当能有效地执行。C++既支持面向过程的程序设计,又支持面象的程序设计。无论面向过程的程序设计还是面
象的程序设计,都离不开算法设计。3.1.2
算法的表示1.自然语言用中文或英文等自然语言描述算法。但容易产生歧义性,在程序设计中一般不用自然语言表示算法。2.流程图可以用传统的流程图或结构化流程图。用图的形式表示算法,比较形象直观,但修改算法时显得不大方便。3.伪代码(pseudo
code)伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。如if
x
is
positive
thenprint
xelseprint
-x用伪代码写算法并无固定的、严格的语
则,只需把意思表达清楚,并且书写的格式要写成清晰易读的形式。它不用图形符号,因此书写方便、格式紧凑,容易修改,便于向计算机语言算法(即程序)过渡。4.用计算机语言表示算法用一种计算机语言去描述算法,这就是计算机程序。算法例:求1×2×3×4×5A:①先求1×2,得到结果2。②将步骤①得到的结果2再乘以3,得到结果6。③将6再乘以4,得24。④将24再乘以5,得120。这就是最后结果。这样的算法虽然是正确的,但太繁琐。B:设P为被乘数,i为乘数。①1
→
P②2
→
i③P×i
→
P④i+1
→i⑤if
i≤5返回步骤③,否则算法结束,返回P的值开始P=1i=2P=P
×ii=i+1i≤5
?false结束true3.2C++的输入与输出标准I/O流C/C++语言本身并不带输入和输出(即I/O)
功能,而是提供了输入输出库,也称为I/O库。通过I/O库,
可以完成输入和输出的操作。大多数C程序使用一种称为stdio(标准I/O)的I/O库,该库也能够在C++中使用。但是,
在C++程序中,一种称为iostream(I/O
流库)的I/O库用得
。在C++中,I/O使用了流的概念――字符(或字节)流。每一个I/O
设备传送和接收一系列的字节,称之为流。输入操作可以看成是字节从一个设备流入内存,而输出操作可以看成是字节从内存流出到一个设备。“
o”cin>>变量要使用C++标准的I/O流库的功能,必须包括头文件:#include<iostream>iostream文件提供基本的输入输出功能。通过包含iostream流库,内存中就创建了一些用于处理输入和输出操作的对象。标准的输出流(通常是屏幕)称为cout,标准的输入流(通常是键盘)称为cin。int
v1,v2;//
...cout<<
"The
sum
of
v1
+
v2
=
";cout
<<
v1
+
v2;cout
<<
'\n';“\n”表示换行符(newline),输出换行符时它结束当前的行并将随后的输出导向到下一行。除了显式地使用换行符外 还可以使用预定义的iostream
符(manipulator
)endl。符在iostream
上执行的是一个操作而不只是简一个换行单地提供数据,例如endl在输出流中符,然后刷新输出缓冲区。一般不写cout
<<
'\n';而是写成cout
<<
endl;连续出现的输出操作符可以连接在一起例如:cout
<<
"The
sum
of
v1+
v2
=
"
<<
v1
+v2
<<
endl;连续的输出操作符按顺序应用在cout
上。为了便于阅读连接在一起的输出操作符可以分写在几行下面的三行组成一条输出语句cout
<<
"The
sum
of
"<<
v1
<<
"
+
"<<
v2
<<
"
=
"
<<
v1
+
v2
<<
endl;类似地输入操作符>>用来从标准输入读入一个值,例如:double
a;//
...cout
<<
"Please
enter
a
number:
";cin
>>
a;连续出现的输入操作符也可以连接起来,例如:char
a,b;//
...cout
<<
"Pleaseentertwo
char:
";cin
>>a
>>b;cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中取。如果一次输入过多,就会留在那儿慢慢用。输入的数据类型必须与要提取的数据类型一致,否则会出错。缺省情况下,输入操作符丢弃任何中间空白(空格、制表符、换行符以及回车)。#include
<iostream>#include<cstdlib>usingnamespacestd;int
main(){char
a,b,c;cin>>a;cout<<"a:
"<<a<<endl;cin>>b;cout<<"b:
"<<b<<endl;cin>>c;cout<<"c:
"<<c<<endl;system("pause");//暂停return
0;}如果希望将键盘上输入的所有字符(包括间隔字符)都作为输入字符赋给字符变量,则必须使用函数cin.get()。#include
<iostream>using
namespace
std;int
main(){char
a,b,c;cin.get(a);cin.get(b);cin.get(c);cout<<a<<b<<c;}清空输入缓冲输入缓冲的清空可以通过sync()来完成。cin.sync();//使得所有输入缓冲中未被
的内容从此被忽略。ignore(int,
int)第1个参数为要提取的字符数量,第2个参数表示遇到该字符则结束(提取该结束字符),对所提取的字符不保存、不处理,作用是空读。cin.ignore(255,
‘\n’);//清除多余的字符和回车符。向一个字符数组中输入字符串时,可用函数cin.getline()。getline()以回车作为结束,在此之前输入的所有字符都会放入字符数组中。例:#include
<iostream>using
namespace
std;int
main(){char
city[11];cin.getline(city,10);cout<<"城市名:"<<city;}注意:与get不同的是,getline会从输入流中删除分隔符(即字符并删除它),而get会将分隔符留在流中。3.2.2
格式控制每一个iostream
库对象都
一个格式状态(format
state),它控制格式化操作的细节,比如整型值的进制基数或浮点数值的精度。C++为程序员提供了一组预定义的
符(manipulator),可用来修改对象的格式状态。例:int
a=123;cout<<showpos<<a;显示结果:+123缺省情况下,浮点值显示6位有效位数,这个值可以用成员函数precision(int)来修改。cout.precision(int)//设置有效位数(普通显示方式)//设置精度(定点或科学记数方式)cout.precision(
)//返回当前的有效位(精度)设置值fixed//定点数格式输出(默认6位精度)例:#include
<iostream>using
namespace
std;int
main(){double
n=1234567.123456789;cout
<<
"Precision:"<<cout.precision()
<<
endl<<n
<<
endl;cout.precision(8);cout
<<
"\nPrecision:
"<<
cout.precision()<<
endl<<
n
<<endl;cout<<"\nfixed:"<<fixed<<endl<<n;return
0;}Precision:
61.23457e+006Precision:
81234567.1fixed:1234567.12345679cout.width(int)//设置显示宽度,只对紧随其后的输出有效cout.fill(char)//设置填充字符(系统默认为空格)#include
<iostream>using
namespace
std;int
main(){int
a=1234;cout<<a<<endl;cout.width(8);cout<<a<<endl;cout<<a<<endl;cout.fill('0');cout.width(8);cout<<a<<endl;cout.width(8);cout<<a<<endl;return
0;}1234123412340000123400001234练习:1、依次输入学号和
,并输出。2、取圆周率为3.1415926,分别输入半径为40和928.335,求圆面积要求各数据按域宽20位输出,先输出半径,再输出其面积,输出精度为小数点后10位。3.2.3
在输入流与输出流中使用控制符iomanip头文件中提供了在输入输出流中使用的控制符,其用法参见
P53。本节内容
,要求编程测试表3.1中的所有控制符。3.2.4
文件的输入与输出iostream库也支持文件的输入和输出,所有能应用在标准输入和输出上的操作符,也都
可以应用到已经被打开的输入或输出或两者
兼有文件上。为了打开一个文件供输入或输
出除了iostream
头文件外还必须包含头文件:#include
<fstream>为了打开一个输出文件
须
一个ofstream
类型的对象:可以使用如ofstream
outfile(
"name-of-file"
);为了测试是否已经成功地打开了一个文件,下代码:if
(
!outfile
)//如文件能打开,!outfile返回truecerr<<"文件不能打开!\n";须一个类似地,为了打开一个文件供输入,ifstream
类型的对象:ifstream
infile(
"name
of
file"
);if(
!infile
)cerr<<"文件不能打开!\n";例:输出文件data.txt中的数#include
<iostream>#include
<fstream>using
namespace
std;int
main(){ifstream
infile("data.txt");int
a=0;if
(!infile){cerr<<"错误:输入文件不能打开!\n";return
-1;}for
(;infile>>a;)cout<<a<<'\t';cout<<endl;return
0;}123
4
723
15
7924data.txt例:将文件a.txt中的内容读入数组s,再写入文件b.txt中#include
<iostream>#include
<fstream>using
namespace
std;int
main(){ifstream
infile("a.txt");ofstream
outfile("b.txt");if
(!infile){cerr<<"错误:输入文件不能打开!\n";return
-1;}if
(!outfile){cerr<<"错误:输出文件不能打开!\n";return
-2;}char
s[20];infile.getline(s,19);cout<<s<<endl;if
(outfile<<s)cout<<"输出完成!";return
0;}o
world!a.txt例2:从文件a.txt读入一个矩阵到二维数组中。#include
<iostream>#include
<fstream>using
namespace
std;int
main(){ifstream
infile;int
m[3][3];infile.open("a.txt");//打开文件for(int
i=0;i<3;i++)for(int
j=0;j<3;j++)infile>>m[i][j];infile.close();//关闭文件for(int
i=0;i<3;i++){for(int
j=0;j<3;j++)cout<<m[i][j]<<"\t";cout<<endl;}return
0;}123422211110355415a.txt3.3
编写顺序结构的程序例3.5
求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,它们的值满足b2-4ac≥0。根据求x1,x2的算法。它可以编写出以下C++程序:#include
<iostream>//由于程序要用到数学函数sqrt,故应包含头文件cmath#include
<cmath>using
namespace
std;int
main(
){double
a,b,c,x1,x2;cin>>a>>b>>c;x1=(-b+sqrt(b*b-4*a*c))/(2*a);x2=(-b-sqrt(b*b-4*a*c))/(2*a);cout<<"x1="<<x1<<endl;cout<<"x2="<<x2<<endl;return
0;}顺序结构的程序中的各执行语句是顺序执行的。这种程序最简单,最容易理解。3.4
关系运算与逻辑运算关系运算所谓的关系运算,在C,C++语言里,就是比较运算。算术运算所得的结果是数值,而关系运算所得的结果为逻辑值,也称布尔值。即以前所学的bool类型允许的值:真或假。真用true表示,假用false表示。逻辑值与数值的关系逻辑值数值true→1false→0false←0true←非0while('3')b++;while(a=3)b++;while('3')b++;while(0.3)b++;while(3)b++;while(-3)b++;while(a=3)b++;关系操作符有:
==(比较左右值是否相等)>
(比较左值是否大于右值)>=(比较左值是否大于或等于右值,也称为不小于)<
(比较左值是否小于右值)<=(比较左值是否小于或等于右值,也称为不大于)!=(比较左右值是否不相等)比较是否相等,使用两个连写的等号表示。因此
==和=是两个不同的概念,后者指赋值运算。C/C++的不等于用
!=
表示,而不是
更常见的
<>,请注意!3.4.2
逻辑运算逻辑运算有三个操作符:!
(非,取逻辑反,NOT)&&(逻辑与,并且,AND)||(逻辑或,或者,OR)①&&(与)操作的所有可能条件及结果:真&&
真=真真&&
假=假假&&
假=假②||
(或)操作的所有可能条件及结果:真||
真=真真||假=真假||
假=假③!操作:!真=假!假=真短路求值只要a为0,后面的表达式不再执行。只要a为1,后面的表达式不再执行。a&&ba||b如:int
a=1,b=0,c=2;c=b&&a/b>2;c=a||++b;3.4.3
运算优先级例:a+b>a+c
→
(a+b)>(a+c)a>b&&x>y
→
(a>b)&&(x>y)!a||a>b
→
(!a)||(a>b)5>3&&8<4-!0
自左至右扫描求解。高!↑算术运算符关系运算符&&和||低赋值运算符3.5
分支结构程序设计if语句if(条件表达式)语句;或if(条件表达式){语句1;语句2;…}编译器必须在if条件表达式的后面找到1个作为语句结束符的“;”号以标志语句的结束。从语法上来说,块可以被认为是单个语句。例:#include
<iostream>using
namespace
std;int
main(){char
c;cout<<"press
a
key
:
";cin.get(c);if(c=='b')cout<<'\a';return
0;}3.5.2
if…else语句if(条件表达式)语句1;else语句2;例:#include
<iostream>using
namespace
std;int
main(){char
c;cout<<"press
a
key
:
";cin.get(c);if(c=='b')cout<<'\a';elsecout<<"bye!"<<endl;return
0;}3.5.3
if语句的嵌套if(表达式1)语句1;else
if(表达式2)语句2;else语句3;else连接到其上面第1个没有配对的且为可见的if上(就近配对)。思考:int
a=0,b=0;cin>>a;if(a>10)b=1;else
if(a>5)b=2;elseb=3;cout<<b<<endl;int
a=0,b=0;cin>>a;if(a>10)b=1;if(a>5)b=2;elseb=3;cout<<b<<endl;3.5.4
switch语句switch语句也称为开关语句,它是多分支结构,而if语句是两分支结构,在实际中常常会碰到多分支选择问题,例如学生成绩分类(90分以上为A,80-89分为B,70-79分为C)。当条件值为一系列整数值时,用switch语句比较简捷。switch语句的格式:switch(整型或字符型变量){case变量可能值1
:分支一;[break;]case变量可能值2
:分支二;[break;]case
变量可能值3
:分支三;[break;]...default:最后分支;}当表达式的值与某一个case后面的常量表达值相等时,就执行此case后面的语句,若所有
case中的常量表达式都没有与表达式值匹配,就执行default后面的语句。例:根据考试成绩grade的等级值’A’,’B’,’C’,’D’和’E’,输出百分制分数段。#include
<iostream>usingnamespace
std;int
main(){chargrade='D';switch(grade){case
'A':cout<<"90--100\n";
break;case'B':cout<<"80--89\n";
break;case'C':cout<<"70--79\n";
break;case'D':cout<<"60--69\n";
break;case'E':cout<<"<60\n";
break;default:cout<<"error\n";}return
0;}注意:①switch后面括号中的表达式只能是整型、字符型或枚举型表达式。②各个case(包括default)的出现次序可以任意。③case常量表达式的值必须唯一。④case与default并不改变控制流程,程序从相匹配的语句起向下执行,不再判断!⑤if与switch互相弥补。例:double
grade;cin>>grade;if(grade>=90&&grade<=100)cout<<"A\n";else
if(grade>=80&&grade<90)cout<<"B\n";…例:重已知邮寄
的计费标准如下,输入量以及邮寄距离,计算出邮资。重量(克)邮资(元/件)15530945126014(每千公里加收1元)75及以上15(每千公里加收1元)重量在档次之间按高档靠3.5.5
条件运算符条件运算符要求有3个操作对象,称三目(元)运算符,它是C++中惟一的一个三目运算符。条件表达式的一般形式为表达式1?表达式2
∶表达式3条件运算符的执行顺序是:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。例输入一个字符,判别它是否为大写字母,如果是,将它转
换成小写字母;如果不是,不转换。然后输出最后得到的字符。#include
<iostream>using
namespace
std;int
main(
){charch;cin>>ch;ch=(ch>='A'
&&
ch<='Z')?(ch+32):ch;//判别ch是否大写字母,是则转换cout<<ch<<endl;return0;}3.6
循环结构程序设计C++提供了3种循环语句的形式来描述循环结构,分别是while语句、do-while语句和for语句。3.6.1
while语句while语句的作用是判断一个条件表达式,以便决定是否应当进入和执行循环体。当满足该条件时进行循环,不满足该条件时,则不再执行循环,其表现形式为:while(条件表达式)循环体while循环由4个部分组成:循环变量初始化,继续条件,循环体和改变循环变量的值。循环变量初始化继续条件循环体
改变循环变量非00inti=1;//循环变量初始化while(i<=10){sum+=i;//继续条件//循环体i++;//改变循环变量的值}3.6.2
do…while语句do…while语句的形式为:do循环体while(条件表达式);当流程到达do后立即执行循环体语句,然后再对条件表达式进 试,若条件表达式的值为非0,则重复循环,否则退出。do…while循环在循环体底部进行继续条件的测试,所以它至少将执行一次循环体;而while循环在循环的顶部测试,有可能
不执行循环体。循环变量初始化循环体
改变循环变量继续条件非00例:#include
<iostream>using
namespacestd;int
main(){char
c;do
{cout<<"请输入一个字母:"<<endl;cin>>c;}
while(c<'A'||(c>'Z'&&c<'a')||c>'z');cout<<c<<endl;return
0;}3.6.3
for语句for语句是C++编程中最主要的循环语句。for语句的一般表现形式为:for(表达式1;表达式2;表达式3)循环体例:for(int
i=1;i<=10;i++)cout<<"
o!"<<endl;for语句头上的括号由两个分号隔开了三个部分,分别表示:①循环变量初始化(int
i=1);②条件判断(i<=10),表示循环的继续判断,当条件为真时继续循环,否则结束循环。③循环变量的增量(i++),表示循环的状态修正。for语句的执行过程:①先求解表达式1。②求解表达式2,若为0,则结束循环,转到⑤。③若表达式2为真,执行循环体,然后求解表达式3。④转回②。⑤执行for语句下面的一个语句。表达式1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 3C数码配件年终大促宣传及营销方案
- 2026年政府会计实务操作强化题库
- 2026年幼儿园健康知识调查方案
- WindowsServer系统配置管理项目化教程(WindowsServer2025)-实训指导书任务3管理信息中心服务器的本地磁盘
- 2026年瓷砖销售问题解决方案及措施
- 2026年环保工程师大气模拟题集
- 2026年法务专员招聘笔试题
- 2026年大班防火知识安全教育
- 2026年心理健康知识活动策划方案
- 2026年交通运输工程师笔试精
- 个体诊所药品管理制度培训
- 2026年中医博士研究生入学考试综合试卷(含答案及解析)
- 煤矿井下电气作业操作资格培训课件
- 2026年高考英语全国I卷考试真题及答案
- 雨课堂学堂在线学堂云《政治学基础(暨南)》单元测试考核答案
- 2026高考作文十大热考主题:长征精神(标题、金句、人物、分论点、范文)
- 2026西北政法大学专职辅导员招聘7人备考题库及答案详解(有一套)
- 2025年全国农产品质量安全检测技能竞赛理论知识考试题库(含答案)
- 2026年创伤后成长问卷测评
- 【中考数学冲刺】2026届内蒙古中考模拟数学试卷3 附解析
- 砌体结构增大截面法加固施工工艺
评论
0/150
提交评论