● 基础知识
算法的基本控制结构: 顺序结构(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)" 流程图 flowchart ※ 块语句(Block Statement: 用花括号{}括起来的多条语句(也可以是一条, 不过这时花括号可以省略) "语句块"又叫"复合语句(compound statements)" |
● if statement
if statement; statement_1 if (test_expr) statement_2
statement_1 if (test_expr) statement_2 else statement_3 |
#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; } |
如果判定为假(0), 则不进行任何输出, 程序执行完毕. |
注意下列容易混淆的if条件表达式: if(a=1)实际上等于两个操作, 1. a = 1 2. if(a) 那么if(1)其实就是if(true)就是条件为真, 这通常是程序调试时看if语句下的代码是否工作 而 if(a==1) 是判断a是否等于1,这里a可以为左值,也可以是右值。
if(a);如果a为真(true或者非0值)就继续,这里的真包括非0数字和字符, if(!a);就是如果a为假(false或者0)就继续,这个和最后一个等价 if(a!=0);这个就是如果a不等于0:C++中没有!== if(a==0) 如果a等于0 |
● 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; } |
//其它案例 //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; }
//上面的例子如果实现没有给定两个数 #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; } |
int a=0 if(1) a=3; if(0) a=4; else a=5;
if(1) 中的1表示真,这个if总是成立,也就是说 a=3 总是要执行的; if(0) 中的0表示假,这个if总是不成立的,则else的条件总是成立的,也就是说 a=5总是要执行; 这个程序的执行过程为: 先a=0;然后a=3;最后 a=5; 所以最好的结果为5. |
● if的特殊案例
● 三目运算符:?
//<表达式1>?<表达式2>:<表达式3>; "?"运算符的含义是: 先求表达式1的值, 如果为真, 则执行表达式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; } } |
如果把第一个break;去掉, 得到的结果是: 不过其它的case是正常的: 不是每一个 case 都需要包含 break, 如果 case 语句不包含 break,控制流将会继续后续的 case,直到遇到 break 为止。 //上面的程序还可以如下的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; } |
//判断是否是闰年; 判断方法是该年份能否被4整除, 不能被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; }
|
● while statement
// 从1到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; } |
//实现无限循环 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; //就算循环条件不成立, 循环体也会执行一次 |
// 从1到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; } |
● while 和 do...while比较
while 和 do...while比较 |
// 从1到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; }
//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; }
|
● for statement
for statement; for (initial; condition; increment) //initial是循环变量, condition是循环条件, increment是循环条件改变 statements; //for (初值; 循环条件;迭代器) //for(表达式; 表达式2; 表达式) {/*循环体*/} 这个整体称为for语句/for循环 //(表达式; 表达式2; 表达式) 称为for语句/for循环的条件表达式 //{/*循环体*/}称为for语句/for循环的语句或循环体 ● 循环次数: ① 例如如果for后面的循环条件是for(int i=0; i<100; i++), 那么int i=0执行1次, i<100执行101次; i++执行100, 循环体执行100-0=100次; //对于for(int i=0; i<100; i++)这一整条语句来说, 它执行了101次, 即与i<100执行的次数相同 ② 如果for后面的循环条件是for(int i=1; i<=100; i++), 那么那么int i=0执行1次, i<100执行101次; i++执行100, 循环体执行100-1+1=100次
注意i的取值不仅关系到循环次数; 如果在循环体中也要用到变量i (比如循环体中有一个数组a[i]), 把我们就要根据实际情况, 选择i的值 |
// 从1到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(循环控制变量) sum+=i; //执行i++得到i=11以后,到表达式2时,停止循环,不执行循环语句,而执行下一条语句 cout << "the result :" << sum << endl; } |
※ 循环语句里面可能还有内嵌循环 |
//除了while(1)可以表示无限循环, 还可以用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); } } |
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"); //每行要换行 } } |
● 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; } |
● 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; } |
● 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"); }
// 另一案例 #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; } |
● 循环嵌套
循环嵌套 使用双层for循环打印如下由星号组成的倒三角形: |
#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" } } |
注意:一个嵌套循环是否终止,要看第一个循环是否终止了 △花括号的问题?
典型的for循环例题还有: 打印菱形, 九九乘法表, 素数 |