(C/C++学习笔记) 八. 程序控制语句

时间:2023-03-09 16:13:27
(C/C++学习笔记) 八. 程序控制语句

八. 程序控制语句

● 基础知识

算法的基本控制结构: 顺序结构(sequential structure), 选择结构(case structure), 循环结构(loop structure)

case structure: ① if statement; ② nested if statement; ③ if...else if statement; ④ switch statement;

loop structure: ① while statement; ② do...while statement; ③ for statement

这些控制结构关键字后面的括号都是"测试条件(test-condition)"

(C/C++学习笔记) 八. 程序控制语句流程图 flowchart

※ 块语句(Block Statement: 用花括号{}括起来的多条语句(也可以是一条, 不过这时花括号可以省略)

"语句块"又叫"复合语句(compound statements)"

● if statement

if statement;

if (test_expr)

statement_2

statement_1

if (test_expr)

statement_2

else

#include <iostream>

using namespace std;

void main()

{

int input;

cout << "Input a value:" << endl;

cin >> input; //输入一整型数

if(input%2!=0)

cout << "The value is odd number" << endl;

}

(C/C++学习笔记) 八. 程序控制语句

(C/C++学习笔记) 八. 程序控制语句

(C/C++学习笔记) 八. 程序控制语句

如果判定为假(0), 则不进行任何输出, 程序执行完毕.

注意下列容易混淆的if条件表达式:

if(a=1)实际上等于两个操作,

1. a = 1

2. if(a)

那么if(1)其实就是if(true)就是条件为真, 这通常是程序调试时看if语句下的代码是否工作

,这里a可以为左值,也可以是右值。

值)就继续,这里的真包括非0数字和字符,

if(!a);就是如果a为假(false或者0)就继续,这个和最后一个等价

:C++中没有!==

if ...else statement;

#include <iostream>

using namespace std;

void main()

{

int input;

cin >> input;

if(input>90)

cout << "It is Good" << endl;        //这一语句可以加花括号,但一般不用,因为这不是一个复合语句

else

cout << "It is not Good" << endl;

}

(C/C++学习笔记) 八. 程序控制语句

(C/C++学习笔记) 八. 程序控制语句

(C/C++学习笔记) 八. 程序控制语句

//其它案例

//if, else后跟的语句可以是复合语句

#include <iostream>

using namespace std;

int main()

{

int a=10,b=5,max;

if(a>b)

{

max=a;

cout<<a<<endl;

}

else

{

max=b;

cout<<b<<endl;

}

return 0;

}

(C/C++学习笔记) 八. 程序控制语句

//上面的例子如果实现没有给定两个数

#include <iostream>

using namespace std;

int main()

{

int a,b,max;

cout<<"input two numbers:"<<endl;

cin>>a;

cin>>b;        //这里也可以写成: cin>>a>>b; 或者cin>>a,b

if(a>b)

{

max=a;

cout<<a<<endl;

}

else

{

max=b;

cout<<b<<endl;

}

return 0;

}

在控制台输入两个数字的方法: ①输一个,回车换行,输一个; ②在同一行输入,但两个数之间有逗号或空格.

● if...else if ...else statement;

if (test_expr_1)

statement_1;

else if(test_expr_2)

statement2;

else if(test_expr_3)

statement_3;

...

else if(test_expr_m)

statement_m;

else

statement_n;

#include <iostream>

using namespace std;

void main()

{

char input;

cin >> input;

if(input == 'A')

{

cout << "very good" <<endl;

return ;

}else if(input == 'B')

{

cout << "good" <<endl;

return ;

}else if(input == 'C')

{

cout << "normal" <<endl;

return ;

}else if(input == 'D')

{

cout << "failure" <<endl;

return ;

}

else        //如果没有除了上面的条件的情况,比如只可能有A,B,C,D四种值,这个else分支可以省略

cout << "input error" << endl;

}

(C/C++学习笔记) 八. 程序控制语句

(C/C++学习笔记) 八. 程序控制语句

int a=0

if(1) a=3;

if(0) a=4;

else a=5;

表示真,这个if总是成立,也就是说 a=3 总是要执行的;

表示假,这个if总是不成立的,则else的条件总是成立的,也就是说 a=5总是要执行;

这个程序的执行过程为:

先a=0;然后a=3;最后 a=5;

所以最好的结果为5.

● if的特殊案例

(C/C++学习笔记) 八. 程序控制语句

while (x--); 这里目的就是将x减到0 ;

当x=0时 while(x--) ;跳出循环,不过x还要执行一次x=x-1; 所以x=-1; 答案 -1;

※ 在C++中, 整数 0 被认为是false, 而其余整数则可看成true.

,0 为什么?

while循环中(s+=i--, --i)等价于 s+=i, i--, --i

进入循环后

第一次运行后:s=10, i=8

第二次运行后:s=18, i=6

第三次运行后:s=24, i=4

第四次运行后:s=28, i=2

第五次运行后:s=30, i=0

退出循环

死记:

执行else语句;

if(i)判断的是变量的值.

,如果i等于0,则i==0表示真(非零)执行if后语句,否则执行else语句.

if(i==0) 和if(!i)判断的是表达式的值.

,!0表示真(非零)执行if后语句

再来个更绕的:

才可以运行下一行程序.

● 三目运算符:?

的值, 如果为真, 则执行表达式2,并返回表达式2的结果 ; 如果表达式1的值为假, 则执行表达式3 ,并返回表达式3的结果。

x = 10;

y = x> 9? 100: 200;

//等价于

x = 10;

if(x>9) y=100;

else y=200;

● if和指针

当把一个指针作为条件表达式时,所要判断的条件实际上就是"该指针是否为一空指针"。在if,while,for或do/while等语句中,或者在条件表达式中,都可以使用指针。请看下例:

if(p)    //等价于(p!=NULL)或if(p !=0)

{

/*dO something*/

}

else

{

/* dOsomethingelse */

}

※ if (p == NULL), if (p == 0) 和if(p) 都可用来判断指针是否为空

● switch statement

switch statement;

switch (expression)

{

case constant_expr_1:    //constant_expr是常量表达式

statement(s);

break;

case constant_expr_2:

statement(s);

break;

...

case constant_expr_n:

statement(s);

break;

default:

statement(s);

}

//根据输入的字符输出字符串

#include <iostream>

#include <iomanip>    //C++的I/O流控制头文件,但不包含这个头文件也可移执行

using namespace std;

void main()

{

char input;

cin >> input;

switch (input)

{

case 'A':

cout << "very good" << endl;

break;

case 'B':

cout << "good" << endl;

break;

case 'C':

cout << "normal" << endl;

break;

case 'D':

cout << "failure" << endl;

break;

default:

cout << "input error" << endl;

}

}

(C/C++学习笔记) 八. 程序控制语句

如果把第一个break;去掉, 得到的结果是:

(C/C++学习笔记) 八. 程序控制语句

不过其它的case是正常的:

(C/C++学习笔记) 八. 程序控制语句

不是每一个 case 都需要包含 break, 如果 case 语句不包含 break,控制流将会继续后续的 case,直到遇到 break 为止。

(C/C++学习笔记) 八. 程序控制语句

//上面的程序还可以如下的if statement;实现

#include <iostream>

using namespace std;

void main()

{

int input;

cin >> iInput;

if(input = 'A')

{

cout << "very good" <<endl;

return ;

}

if(input = 'B')

{

cout << "good" <<endl;

return ;

}

if(input = 'C')

{

cout << "normal" <<endl;

return ;

}

if(input = 'D')

{

cout << "failure" <<endl;

return ;

}

cout << "input error" << endl;

}

● nested if statement

nested if statement;

if(test_expr_1)        //第一种判断语句的嵌套:if语句中有if...else语句

{

if(test_expr_2)

statement_1;

else

statement_2;

}

if(test_expr_1)        //第二种判断语句的嵌套:if...else语句中有if...else语句

{

if(test_expr_2)

statement_1;

else

statement_2;

}

else

{

if(test_expr_2)

statement_1;

else

statement_2;

}

整除, 不能被100整除但能被400整除

#include <iostream>

using namespace std;

void main()

{

int year;

cout << "please input number" << endl;

cin >> year;

if(year%4==0)

{

if(year%100==0)

{

if(year%400==0)

cout << "It is a leap year" << endl;

else

cout << "It is not a leap year" << endl;

}

else

cout << "It is not a leap year" << endl;

}

else

cout << "It is not a leap year" << endl;

}

//代码简化

#include <iostream>

using namespace std;

void main()

{

int year;

cout << "please input number" << endl;

cin >> year;

if(iYear%4==0 && year%100!=0 || year%400==0)

cout << "It is a leap year" << endl;

else

cout << "It is not a leap year" << endl;

}

(C/C++学习笔记) 八. 程序控制语句

● while statement

到10累加

#include <iostream>

using namespace std;

void main()

{

int sum=0,i=1;

while(i<=10)

{

sum=sum+i;

i++;

}

cout << "the result :" << sum << endl;

}

(C/C++学习笔记) 八. 程序控制语句

(C/C++学习笔记) 八. 程序控制语句

//实现无限循环

while(1)        //因为测试条件表达式(test-conditon)1表示真

{

...

}

//在C++中while(1)等同于while(true), 但是在C语言中, 不存在true, 所以不能用while(1)

//为了跳出循环,循环体内部要用break语句来跳出。

例如,可以在循环体内部用if来判断,if(x==5)break;

//不进行循环

while(0)

{

...

}

● do...while statement

do...while statement;    //就算循环条件不成立, 循环体也会执行一次

到10累加

#include <iostream>

using namespace std;

void main()

{

int sum=0,i=1;

do

{

sum=sum+i;

i++;

}while(i<=10);

cout << "the result :" << sum << endl;

}

(C/C++学习笔记) 八. 程序控制语句

(C/C++学习笔记) 八. 程序控制语句

● while 和 do...while比较

while 和 do...while比较

到10累加

#include <iostream>

using namespace std;

void main()

{

int i=0,j=0;

cout << "before while j=" << j << endl;

while(i>1)

{

j++;

}

cout << "after while j=" << j << endl;

}

(C/C++学习笔记) 八. 程序控制语句

//do...while

#include <iostream>

using namespace std;

void main()

{

int i=0,j=0;

cout << "before do_while j=" << j << endl;

do

{

j++;

}while(i>1);

cout << "after do_while j=" << j << endl;

}

(C/C++学习笔记) 八. 程序控制语句

● for statement

for statement;

for (initial; condition; increment)        //initial是循环变量, condition是循环条件, increment是循环条件改变

statements;

//for (初值; 循环条件;迭代器)

//for(表达式; 表达式2; 表达式) {/*循环体*/} 这个整体称为for语句/for循环

//(表达式; 表达式2; 表达式) 称为for语句/for循环的条件表达式

//{/*循环体*/}称为for语句/for循环的语句或循环体

● 循环次数:

; i++), 那么int i=0执行1次, i<100执行101次; i++执行100, 循环体执行100-0=100次;

; i++)这一整条语句来说, 它执行了101次, 即与i<100执行的次数相同

次, i<100执行101次; i++执行100, 循环体执行100-1+1=100次

注意i的取值不仅关系到循环次数; 如果在循环体中也要用到变量i (比如循环体中有一个数组a[i]), 把我们就要根据实际情况, 选择i的值

到10累加

#include <iostream>

using namespace std;

void main()

{

int sum=0;        //sum是用来累加和的变量

int i;                //在C++中,可以不用先定义变量i,而是直接在for后面测试条件中定义并初始化,如for(int i=1;i<=10;i++)

for(i=1;i<=10;i++)    //i叫作loop counter(循环计数器)或loop control variable(循环控制变量)

时,停止循环,不执行循环语句,而执行下一条语句

cout << "the result :" << sum << endl;

}

(C/C++学习笔记) 八. 程序控制语句

※ 循环语句里面可能还有内嵌循环

)可以表示无限循环, 还可以用for表示无限循环,建议使用计数控制,也就是说循环执行到指定次数,就跳出循环

for( ; ; )

{

...

}

● for循环与一维数组的初始化(倒序列)

for循环与一维数组的初始化(倒序列):

#include<stdio.h>

#include<stdlib.h>

void main()

{

int a[3][4]={11,10,9,8,7,6,5,4,3,2,1,0};

for (int i = 0; i <12; i++)

{

a[i/4][i%4] = i; //一维数组初始化

//以第二个下标为准来确定除数的值

printf("%d\t",i);

}

}

(C/C++学习笔记) 八. 程序控制语句

for循环与二维数组的初始化:

构建一个数组num[3][4], 如下:

1    2    3    4

5    6    7    8

9    10    11    12

#include<stdio.h>

#include<stdlib.h>

void main()

{

int num[3][4];

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 4; j++)

{

num[i][j] = i*4+j+1; //数学公式, 赋值

printf("%-6d", num[i][j]);    //打印

}

printf("\n"); //每行要换行

}

}

(C/C++学习笔记) 八. 程序控制语句

● break

#include <iostream>

using namespace std;

void main()

{

int i,n,sum;

sum=0;

cout<< "input 10 number" << endl;

for(i=1;i<=10;i++)

{

cout<< i<< ":" ;

cin >> n;

if(n<0)     //判断输入是否为负数

break;    //碰到负数,就直接跳出循环体,碰到难题就不再做了

sum+=n;     //对输入的数进行累加

}

cout << "The Result :"<< sum << endl;

}

(C/C++学习笔记) 八. 程序控制语句

● continue

#include <iostream>

using namespace std;

void main()

{

int i,n,sum;

sum=0;

cout<< "input 10 number" << endl;

for(i=1;i<=10;i++)

{

cout<< i<< ":" ;

cin >> n;

if(n<0)    //判断输入是否为负数

continue;    //碰到负数就不执行continue下面的代码,不跳出循环体,返回到循环起始语句处. 碰到难题跳过做简单的

sum+=n;    //对输入的数进行累加

}

cout << "The Result :"<< sum << endl;

}

(C/C++学习笔记) 八. 程序控制语句

● goto

#include <stdio.h>

int main()

{

int i;

for (i = 0; i<10; i++)

{

if (i == 5)

{

printf("\nWe are using goto statement when i = 5″);

goto HAI;

}

printf("%d ", i);

}

HAI: printf("\nNow, we are inside label name \"hai\" \n");

}

(C/C++学习笔记) 八. 程序控制语句

// 另一案例

#include <iostream>

using namespace std;

void main()

{

int ivar = 0 ;            //定义一个整型变量,初始化为0

int num = 0;            //定义一个整型变量,初始化为0

mylabel:                     //定义一个标签

ivar++;                    //ivar自加1

num += ivar;            //累加求和

if (ivar <10)            //判断ivar是否小于10, 当ivar大于10, 就结束循环

{

goto mylabel;            //转向标签

}

cout << num << endl;

}

(C/C++学习笔记) 八. 程序控制语句

● 循环嵌套

循环嵌套

使用双层for循环打印如下由星号组成的倒三角形:

(C/C++学习笔记) 八. 程序控制语句

#include <iostream.h>

main()    //编译器会认为主函数的默认返回值类型为int型, 并且main()和main(void) 是一样的

{

int k,i,j;

for(i=0; i<4; i++)    //虽然下面有三个for, 但实际上这是一个双层的for循环,这个for外层循环统领下面两个同级的内层循环

{

for(k=1; k<=i; k++)

cout<<" ";        //即C语言中的printf(" ")

for(j=0; j<7-i*2;j++)

cout<<"*";        //即C语言中的printf("*")

cout<<endl;            //即C语言中的printf("\n"); 也可以写成cout<<"\n"

}

}

(C/C++学习笔记) 八. 程序控制语句

(C/C++学习笔记) 八. 程序控制语句

注意:一个嵌套循环是否终止,要看第一个循环是否终止了

△花括号的问题?

(C/C++学习笔记) 八. 程序控制语句

典型的for循环例题还有: 打印菱形, 九九乘法表, 素数