3 算法、控制结构

时间:2022-09-08 18:47:47

+一个完成某种特定任务的过程可分解成一组操作步骤,这组操作步骤即构成一个算法

+算法结构
顺序结构
选择结构
循环结构

+条件
布尔类型及相关运算符

+布尔类型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;

+关系运算符
3 算法、控制结构
比较结果为bool类型

+逻辑运算符
3 算法、控制结构

一、选择语句
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项的累加和
3 算法、控制结构
循环结构: 如果条件成立,则重复执行循环体,否则结束循环
循环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)函数的算法设计
3 算法、控制结构

#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;
}