3 算法、控制结构
+一个完成某种特定任务的过程可分解成一组操作步骤,这组操作步骤即构成一个算法。
+算法结构
顺序结构
选择结构
循环结构
+条件
布尔类型及相关运算符
+布尔类型bool
true false 1个字节
#include <iostream>
using namespace std;
int main()
{
bool x=true;
cout<<x<<endl;//true被显示为1
}
int y;
y=x;//将bool型变量x赋值给int型变量y,c++将自动转换类型,true被转换成1
cout<<y<<endl;
x=5;//将int型常量5赋值给bool型变量x,5被转换为true,即非0值转为true
// 此时编译系统会提示warning
cout<<x<<endl;//显示变量x的值,true被显示为1
return 0;
+关系运算符
比较结果为bool类型
+逻辑运算符
一、选择语句
if (表达式)
{语句}
else
if(表达式)语句;
else if(表达式)语句;
else 表达式;
switch - case
//求倒数
#include <iostream>
using namespace std;
int main()
{
double x;
cin>>x;
if(x!=0)
{
double y;
y=1/x;//求x的倒数,结果赋值给y
cout<<y;//显示y的值,即x的倒数
}
else
cout<<"0的倒数没有意义";
return 0;
}
//判断闰年
#include <iostream>
using namespace std;
int main()
{
int year;
cin>>year;
if((year%4==0&&year%100!=0)||year%400==0)//闰年判断条件
cout<<year<<"是闰年"<<endl;
else
cout<<year<<"不是闰年"<<endl;
return 0;
}
+条件运算符"?"
int a=5,b=10,c;
if(a>b)c=1;
else c=b;
表达式?表达式1:表达式2
如果表达式结果为true,则计算表达式1,将其结果作为整个条件表达式的结果;否则计算表达式2,将其结果作为整个条件表达式的结果
3目运算符,优先级为13,结合性从右到左
c=a>b?a:b;
+switch-case
多分支
switch(表达式)
{
case 常量表达式1:语句1;
case 常量表达式2:语句2;
default:语句//功能完成退出
//break语句跳出switch语句,继续执行switch语句的下一条语句,即return语句
return 0;
}
二、循环语句
求解:奇数数列1 3 5 7 9.....前N项的累加和
循环结构: 如果条件成立,则重复执行循环体,否则结束循环
循环4要素: 循环变量及其初始值、循环条件、循环体
+while语句
while(表达式)
语句
循环条件一开始就不成立,则循环体一次也不执行。循环条件一致为true,循环体将无休止地执行,俗称为死循环
#include <iostream>
using namespace std;
int main()
{
int N;
cin>>N;
int n=1,sum=0;//定义循环变量n(初始值为1)
//定义保存累加结果的变量素描(初始值0)
while(n<=N)
{
sum+=2*n-1;//当前项的值2n-1累加到sum上
n++;//将n加1,准备下一次累加,该语句使得循环条件n<=N趋向于false
//执行完循环体最后一个语句之后,转到while重新判断循环条件
}
//循环结束后,继续执行while语句的下一条语句
cout<<sum<<endl;
return 0;
}
+do-while
do
语句
while(表达式);
+for 语句
for(表达式1;表达式2;表达式3)
语句
+逗号运算符 ,
表达式1,表达式2,....,表达式n
将最后一个表达式的结果作为整个逗号表达式的结果
逗号运算符的优先级为15(最低),结合性为从左到右
三、控制语句
造成程序执行顺序跳转的语句被统称为控制语句
break 结束循环 ,跳出switch 继续执行下一条switch
continue 结束本次循环,转入下一次循环
四、算符设计与评价
+算法应具有的5个特性
有穷性:执行步骤有限
确定性:算法每个步骤必须有明确的定义,不能含糊不清,或有二义性
有效性:算法的每个步骤应该能被计算机执行,并得到有效的结果
输入: 算法可以有0个或多个输入,输入是算法处理的原始数据
输出:算法至少有一个输出,输出是算法处理的结果
+计算复杂度
O(1)
x*=x;
O(N)
for(int n=1;n<=N;n++) x*=x;
决定计算机执行算法所需要的时间
#include <iostream>
using namespace std;
int main()
{
int x;
cin>>x;
bool yes_no=true;
for(int n=2;n<x;n++)
{
if(x%/n==0)//如果x能被某个n整除,zex就不是素数
{
yes_no=false;break;
}
//如果x不能被n整除,则yes_no 保持为true不变,继续检查下一个数
}
if(yes_no==true) cout<<"是素数"<<endl;
else cout<<"不是素数"<<endl;
return 0;
}
+内存占有量
求反正切(arctan)函数的算法设计
#include <isostream>
using namespace std;
int main()
{
double x;
cin>>x;//输入正切值x
double sum=0;//sum用于保存累加和
int n=0;//n用于保存当前的数列项序号,初始值为0
double a=x;//a用于保存数列项分子的值,初始值等于x
double b=1;//b用于保存数列项分母的值,初始值为1
double f;//f用于保存数列项的值
do
{
f=a/b;
sum=((n%2==0)?sum+f:sum-f);//偶数项做加法,奇数项做减法
n++;//数列项序号加1,准备累加下一项
a*=x*x;b+=2;//计算出下一项的分子和分母
}//while(f>1e-5);//循环条件为f(n)>=10^-5
//循环结束后,sum中保存的是反正切函数的结果(以弧度为单位的角度)
cout<<sum*180/3.1415926<<endl;//将弧度单位转换成以度为单位,显示结果
return 0;
}