大一上第一学期期中复习知识点梳理 之 c++基本控制结构程序设计

一、分支结构语句

1、if语句

判断条件表达式的值必须是bool型或可转换为bool型。

2、盲点:switch语句:
 根据给定条件从多个分支语句序列中选择一个作为执行入口。

判断条件表达式的值必须是整型或可提升为整型。
分支条件的值必须是整型或可提升为整型的常量。

switch(表达式):

 {  case 常量表达式1:《语句序列1;》《break;》

   case 常量表达式2:《语句序列2;》《break;》

…………………………

   case 常量表达式n:《语句序列n;》《break;》

  《default:语句序列;》 }

格式要求:

表达式作为判断条件只能取整型、字符型、布尔型、枚举类型等开关值,不能取实型这样的连续值。

执行流程:

先求表达式的值,然后在常量表达式中找到与之相等的分支作为执行入口,并从该分支的语句序列开始执行下去,直到遇到break语句或}为止。  当表达式的值与所有常量表达式的值均不相等时,若有default分支,则执行其语句序列,否则跳出switch语句序列。

注意事项:

各个case(包括default)分支出现的次序可以任意,通常default在最后。

break语句可选,若没有break语句,则每一个case分支都只作为switch语句的执行入口,执行完该分支后,还将继续执行其后的所有分支。

每个常量表达式取值必须各不相同,否则歧义。

允许多个常量表达式对应同一个语句序列。

比较(与嵌套if语句):switch语句可读性比嵌套if语句好,但不是所有多分支问题都可用switch语句来完成,这是因为switch语句中限定了条件表达式的取值只能是开关量不能是连续量。

特别注意:break陷阱!虽不是必须的,但是如果没有会继续向下贯穿执行,可能出错!

例:

1)与字符型相关

char score;
cin>>score;
switch(score)
{
case 'A':case 'a': cout<<"excellent"; break;
case 'B':case 'b':cout<<"good";break;
default:cout<<"fail";
}

2)与整型相关

int s,a,b,c,d;
cin>>s>>a>>b>>c>>d;
switch(s/7)
{
      case 1:case 2:case 3: a=b+c;d=a; (break;)
      case 4:case 5: a=b-c;d=-a; (break;)
      default: a=b+c+d;d=2*a;
}

3)与枚举类型相关

#include <iostream>
using namespace std;

enum Week { SUN=1, MON, TUE, WED, THU, FRI, SAT };
Week cal( int day )
{
    switch(day%7)
    {
    case 0: return SUN;
    case 1: return MON;
    case 2: return TUE;
    case 3: return WED;
    case 4: return THU;
    case 5: return FRI;
    case 6: return SAT;
    }
}
void show( Week w )
{
    switch(w)
    {
    case SUN:cout<<"SUN"<<endl;break;
    case MON:cout<<"MON"<<endl;break;
    case TUE:cout<<"TUE"<<endl;break;
    case WED:cout<<"WED"<<endl;break;
    case THU:cout<<"THU"<<endl;break;
    case FRI:cout<<"FRI"<<endl;break;
    case SAT:cout<<"SAT"<<endl;break;
    }
}
int main()
{
    Week w = cal(100);
    show( w );
    return 0;
}

3、条件运算符( ? : )

   逻辑条件 ? 表达式1 : 表达式2
   条件成立结果为表达式1,否则结果为表达式2
4、 分支嵌套
   允许候选分支中出现分支结构
5、 分支判断的优化
1)当条件为多个表达式的“与逻辑”(&&)组合时,只要有表达式为false,后续表达式将不再计算。
2)当条件为多个表达式的“或逻辑”(||)组合时,只要有表达式为true,后续表达式将不再计算。

二、循环结构语句

1、易错点:while语句与do-while语句辨析:
while语句:当型循环

while(判断条件)
{   
         语句  
 } //注意:结束处无分号。

do-while语句:直到型循环

do{
          语句
}while(判断条件)  //注意:结束处有分号。

注意:while语句可以写为空语句:例,while(i++<100); 判断条件为bool型,循环体可以为空。

差别:判断条件的先后。

 do-while语句无论条件表达式的值是真是假,循环体都至少执行一次;

 while语句如果如果条件表达式如果初值为假,则循环体一次也不会执行。

写法易错点:

while语句结束处无分号,do-while语句结束处有分号。

2、for循环语句:计数型循环

先判断型。
for(表达式1;表达式2;表达式3)循环体语句
表达式1:循环初始条件;表达式2:循环执行的判断条件;表达式3:修改循环变量。
3个表达式可部分或全部省略,但两个分号不能省略。
注意:for(;;) { } 等价于 for(;1;) { } (系统约定表达式2的值为1)
初始条件、计数条件、计数累加和循环体都可以为空。需要有初始计数值和计数变化(递增或递减)。
比较(与while语句与do-while语句相比):for语句既可用于循环次数已确定的情况,也可用于循环次数不确定而只给出循环结束条件的情况。

三、转向语句

continue:跳出后续语句继续循环(跳本轮循环);continue只能用在循环语句中,用来终止本次循环,当程序执行到continue语句时,将跳过其后尚未执行的循环体语句,开始下一次循环,下一次循环是否执行则取决于循环条件的判断。

break:结束当前循环(不能结束嵌套循环);break只能用在switch和循环语句中,从break语句处跳出switch语句或循环语句转去执行switch或循环语句之后的语句

goto:可跳出多重循环到另一标签位(函数内)

四、枚举类型

1、定义

注意:枚举类型不能有交集。

注意:枚举常量表示的仅有整型常量。

2、枚举变量的使用

1)基本概念

取值范围:整数型的一个子集。

占用内存大小与整数型相同。

主要目的:增加程序可读性。

用处:描述状态量。

允许操作:只有赋值运算和关系运算。

2)赋值运算

将枚举常量值赋给枚举变量和两个同类型变量之间的赋值。不能直接将整型量赋给枚举变量,两个不同类型的枚举变量之间也不能相互赋值。

可允许将一个枚举常量赋值给整型变量(枚举常量本身是一个整数值)。

只接受同类型枚举变量或常量赋值,不接受复合赋值、自增、自减(会提升类型)。例如:b=a+1;

3)关系运算

两个枚举变量之间或一个枚举变量和一个枚举常量之间可以应用关系运算符,对它们取值(序号)进行比较。

4)输入输出

枚举变量不能直接输入,可以直接输出,但输出的是变量的整数值。其输入输出常采用switch语句将其转化为字符或字符串。

五、常用算法

枚举法(穷举法):适合求解的问题:可能的答案时有限个且答案是可知的,但又难以用解析法描述。 常采用循环结构。

筛选法(排除法)

递推法(迭代法):通过问题的一个或多个已知解,用同样的方法逐个推算出其他解。 常采用循环结构。

ps/

 

 

 

六、文件输入/输出

 当文件ifile结尾时,判断文件结束函数ifile.eof()的返回值是否为逻辑真,读取过程结束。

头文件名:

#include<fstream>

定义: 

ifstream ifile;   //定义输入文件,ifile为文件名;用于读

ofstream ofile;  //定义输出文件,ofile为文件名;用于写

打开文件:

ifile.open("d:\\myfile.txt");  

ofile.open("d:\\myfile.txt");

" "内为磁盘文件路径名。

数据读出与写入文件:

cin换成ifile,cout换成ofile。

例,ifile.get(); ifile>>a;

       ofile<<a;

关闭文件:

ifile.close();

ofile.close();

七、算法概念与表示方法

1、算法特征

可执行性;确定性;有穷性;可输入/输出信息。

2、表示

1)流程图

矩形框:执行的指令;菱形框:判断其中的表达式的值是真还是假;箭头线:指令的流程方向。

块:代表一条指令或一个指令组。指令组时一个整体,在整个算法中呈现一条指令的特点,要么一起执行,要么一起都不执行。

2)伪码

3、算法描述的3种基本结构

顺序结构

分支结构:根据条件判断选择执行路径。

循环结构:用于实现重复性动作。

                 循环结构流程图中的块通常称为循环体。

                 通常循环条件有一个初值,在循环开始之前给出,作为第一次执行循环体的判断条件。绝大多数情况下初值为真。

                 通常在循环体中要包含修改循环条件的指令,使得循环执行有限步后条件不再成立。

 

PS/附一些课堂例题写法:

1、统计一个整数二进制表示中1的个数

int count=0;
for(i=0;i<32;i++)
{
     if((x&(1<<i))==0) continue;
     count++;
}

2、判断整数是否为素数

for(int i=2;i<x&&x%i!=0;i++);

3、求100以内素数

for(int i=0;i<100;i++) a[i]=1+i; 
a[0]=0;  //1不是素数
for(int i=1;i<100;i++)
{
      if(a[i]==0) continue;
      for(int j=i+1;j<n;j++)
          if(a[j]%a[i]==0) a[j]=0;  //是a[i]倍数的元素置0
}

 4、辗转相除法求两个整数的最大公约数【书递推法示例】

int num1,num2,resd;
cin>>num1>>num2;
for(;;)
{
resd=num1%num2;
if(resd==0) break;
num1=num2; num2=resd;
}
cout<<nunm2<<endl;

5、将一个8位二进制数转换为十进制数输出【书递推法示例】

算法思想:变形为y=(···((a[n]*x+a[n-1])*x+a[n-2])*x+a[n-3]···)*x+a[0] 。

const int n=8;
char bin[n]; int x=2,a,dec,i;
for(i=n-1;i>=0;i--) cin>>bin[i];
dec=0;
for(i=n-1;i>=0;i--)
{
a=bin[i]-'0';
dec=dec*x+a;
}
cout<<dec<<endl;

 

posted @ 2022-10-25 19:55  Au0702  阅读(467)  评论(0)    收藏  举报