发布日期:2015-12-08 11:21 来源: 标签: 编程语言 C++教程 C++语句 C++判断语句
本章我们主要学习C++中if、switch、while、do……while四种条件语句的区别与用法,下面我们就做一下具体讲解,希望大家多多支持中国站长网络学院。
"表达式"的值首先被计算,如果结果是非0,则"语句1"被执行,否则,执行"语句2"。
if语句:
示例一:
if (balance > 0) {
interest = balance * creditRate;
balance += interest;
}
else {
interest = balance * debitRate;
balance += interest;
}
结合现实我们知道,一个条件的成立与否往往会需要执行两种不同的动作,比如:公交车有否上下客,决定汽车停或继续行驶。为此,C++设立了if 语句的变种,即当给定的条件满足时,执行一个语句;当条件不满足时,执行另一个语句。这也被称为if-else语句。
例如:
    if (有上下客)
    汽车停;
    else
    继续行驶;
同样,语句1或语句2也都可以是复合语句,如:
    if (点不被多边形遮挡)
    {
     把点从原始点表中取出;
     把点加入到显示点表中;
    }
    else
    {
     把点从原始点表中取出;
     把点加入到非显示点表中;
    }
示例二:
if (balance > 0)
interest = balance * creditRate;
else
interest = balance * debitRate;
balance += interest;
我们还可以使用条件表达式将上述语句进一步简化为:
interest = balance * (balance > 0 ? creditRate : debitRate);
balance += interest;
或:
balance += balance * (balance > 0 ? creditRate : debitRate);
同样考虑到两个复合语句中的共同部分,我们可以作如下简化:
把点从原始点表中取出;
    if (点不被多边形遮挡)
    {
     把点加入到显示点表中;
    }
    else
    {
     把点加入到非显示点表中;
    }
也可以使用上一章的条件运算符将上述语句进一步简化为:
把点从原始点表中取出;
点不被多边形遮挡? 把点加入到显示点表中: 把点加入到显示点表中;
if (callHour > 6) {
 if (callDuration <= 5)
  charge = callDuration * tarrif1;
 else
  charge = 5 * tarrif1 + (callDuration - 5) * tarrif2;
}
else
charge = flatFee;
现实生活中的各种条件是很复杂的,在一定的条件下,又需要满足其它的条件才能确定相应的动作。为此,C++ 提供了if语句的嵌套功能,也即一个if语句能够出现在另一个if语句或if-else语句里。例如:
if (callHour > 6) {
 if (callDuration <= 5)
  charge = callDuration * tarrif1;
 else
  charge = 5 * tarrif1 + (callDuration - 5) * tarrif2;
}
else
 charge = flatFee;
另一例:
if ( cos( value ) < 0 ) // value 的cos函数小于零
{
 if ( value > 0 ) // 若value 大于零
  value = value - PI;
 else
  value = value + PI;

示例三:
if (ch >= '0' && ch <= '9')
 kind = digit;
else {
if (ch >= 'A' && ch <= 'Z')
  kind = upperLetter;
else {
if (ch >= 'a' && ch <= 'z')
  kind = lowerLetter;
else
  kind = special;
  }
}
为了改进这条语句的可读性,我们可以将语句写成下面的形式: 
if (ch >= '0' && ch <= '9')
 kind = digit;
else if (cha >= 'A' && ch <= 'Z')
 kind = capitalLetter;
else if (ch >= 'a' && ch <= 'z')
 kind = smallLetter;
else
 kind = special;
例如,下面的if语句: 
if ( x < 0 ) y = -1;
else if ( x == 0 ) y = 0;
  else y = 1;
我们可以把它修改为:
if ( x >= 0)
  if ( x > 0 ) y = 1;
  else y = 0;
else y = -1;
switch语句:
switch (operator) {
case '+': result = operand1 + operand2;
 break;
case '-': result = operand1 - operand2;
 break;
case 'x':
case '*': result = operand1 * operand2;
 break;
case '/': result = operand1 / operand2;
 break;
default: cout << "unknown operator: " << ch << '\n';
 break;
}
因为case 'x'没有break语句,所以case 'x'与case '*'执行相同的语句系列,也就是说,把'x'扩展成为乘法运算符了。
很显然,switch语句可以写成if-else语句的形式。例如,上面的语句,我们可以写为: 
if (operator == '+')
 result = operand1 + operand2;
else if (operator == '-')
 result = operand1 - operand2;
else if (operator == 'x' || operator == '*')
 result = operand1 * operand2;
else if (operator == '/')
 result = operand1 / operand2;
else
 cout << "unknown operator: " << ch << '\n';
但是,使用switch语句比用if-else语句简洁得多,可读性也好得多。遇到多分支选择的情形,我们应当尽量选用switch语句,避免采用嵌套较深的if-else语句。
对于一条路线需要分为多个分支路线时,用前面的if 语句书写变得异常繁琐,而且不易阅读。为此,C++提供了另外一套语句形式--switch语句
下面我们通过一个具体例子来进一步加深对if-else控制结构的认识,程序的功能是:要求用户输入一个整数,整数范围为1~5之间,然后,计算机根据整数的值,发出鸣叫声。例如,输入数字1,则鸣叫一声,输入数字2,则鸣叫两声,…,如果是1~5之外的数,则没有叫声。程序中定义了一个宏BEEP,当程序中遇到BEEP,便用cout << "\a \n"替换,有关宏的内容在第9章详细介绍。\a是一个转义字符,它使计算机发出鸣叫声。
例4-12
#include <iostream.h>
#define BEEP cout << "\a \n"
void main()
{
 int num;
 cout << "Please enter a number: ";
 cin >> num;
 // Use multiple if statements to beep.
 if (num == 1){
  BEEP;
 }
 else if (num == 2){
  BEEP;BEEP;
 }
 else if (num == 3){
  BEEP; BEEP; BEEP;
 }
 else if (num == 4){
  BEEP; BEEP; BEEP; BEEP;
 }
 else if (num == 5){
  BEEP; BEEP; BEEP; BEEP; BEEP;
 }
}
由于这个程序if嵌套的次数较多,不是很直观。其实,这个程序用可以处理多分支的switch语句,会更加清晰,可读性更好:
例4-13
#include <iostream.h>
#define BEEP cout << "\a \n"
void main()
{
 int num;
 cout << "Please enter a number: ";
 cin >> num;
 switch (num)
 {
  case 1: BEEP;
  break;
  case 2: BEEP; BEEP;
  break;
  case 3: BEEP; BEEP; BEEP;
  break;
  case 4: BEEP; BEEP; BEEP; BEEP;
  break;
  case 5: BEEP; BEEP; BEEP; BEEP; BEEP;
 }
}
while语句
while语句的一般形式如下:
while (表达式)
语句;
while语句的执行过程如下:首先计算"表达式"(称之为循环条件)的值,如果其结果值非0,则执行"语句"(称之为循环体)。这个过程重复进行,称之为循环,直至"表达式"的值为0时,才结束循环。
do-while语句
do-while语句类似于while语句,但是它先执行循环体,然后检查循环条件。do-while语句的一般形式为:
do  
语句;
while (表达式);
如果"表达式"的值非0,循环继续进行,否则,循环终止。
与while语句相比,我们使用do-while语句要少一些。但是,对于有些情况,循环体至少要执行一次,do-while语句就很有用。例如,假定我们要重复读一个值,并打印它的平方,终止的条件是该值为0。我们可以用do-while语句表示为:
  do {
    cin >> n;
    cout << n * n << '\n';
    }
  while (n != 0);
  // 无break语句
int sum = 0, number;
cin >> number;
while (number != 0) {
 sum += number;
 cin >> number;
}
// 有break语句
int sum = 0, number;
while (1) {
 cin >> number;
 if (number == 0)
   break;
 sum += number;
}
这两段程序的产生的效果是一样的。需要注意的是:break语句只是跳出当前的循环语句,对于嵌套的循环语句,break语句的功能是从内层循环跳到外层循环。
例:
int i = 0, j, sum = 0;
while (i < 5) {
 for ( j = 0; j < 5; j++) {
   sum + = i + j;
   if ( j == i) break;
 }
 i++;
}
本例中break语句执行后,程序立即终止for循环语句,并转向for循环语句的下一个语句,即while循环体中的i++语句,继续执行while循环语句。
终止当前的循环语句意思是在多重循环中,break只能退出它所在的那重循环;只能退出内重循环到外重循环中,要退出外重循环还要在外重循环中使用break。
do {
  cin >> num;
  if (num < 0) continue;
  // 处理num...
  } while (num != 0);
它等价于:
do {
  cin >> num;
  if (num <= 0) {
    // 处理num...
  }
} while (num != 0);
如果我们循环终止的条件改为读n个整数,而不是等到某个整数为0,上述代码可以修改为:
for (i = 0; i < n; ++i) {
  cin >> num;
  if (num < 0) continue; // 跳转到: ++i
    // 处理num...
}
根据上面的分析,我们可以编写出完整的程序。
简单的计算器
#include <iostream.h>
int main()
{
 double displayed_value;
 double new_entry;
 char command_character;
 displayed_value = 0.0;
 cout << "计算器演示程序" << endl
 << "----" << endl;
 cout << "在'>' 提示后输入一个命令字符"
 << endl;
 cout << "Value : " << displayed_value << endl;
 cout << "command>";
 cin >> command_character;
 while (command_character != 'Q') {
   switch(command_character) {
     case 'C':
       displayed_value = 0.0;
       break;
     case '+':
       cout << "number>";
       cin >> new_entry;
       displayed_value += new_entry;
       break;
     case '-':
       cout << "number>";
       cin >> new_entry;
       displayed_value -= new_entry;
       break;
     case '*':
       cout << "number>";
       cin >> new_entry;
       displayed_value *= new_entry;
       break;
     case '/':
       cout << "number>";
       cin >> new_entry;
       displayed_value /= new_entry;
       break;
     default:
       cout << "不可理解的输入!";
       cin.ignore(100,'\n');
       } //End of switch
 cout << "Value : " << displayed_value << endl;
 cout << "command>";
 cin >> command_character;
} //End of while
return 0;
}
下面给出本程序的一个运行实例:
计算器演示程序
----
在'>' 提示后输入一个命令字符
    Value : 0
    command>+↙
    number>1.23↙
    Value : 1.23
    command>*↙
    number>6.4↙
    Value : 7.872
    command>C↙
    Value : 0
    command> Q↙
键入'Q'后,程序运行终止。
#include<iostream.h> //C++库函数说明
int area(int length, int width); // area函数说明
void main() //主函数,程序从该函数开始执行
{
 int this_length, this_width;
 cout << "Enter the length: "; //调用cout和cin库函数
 cin >> this_length;
 cout << "Enter the width: ";
 cin >> this_width;
 cout << "\n";
 cout << "The area of a " << this_length << "x" << this_width;
 cout << " rectangle is " << area(this_length, this_width); //调用area函数
}
int area(int length, int width) // area函数定义
{
 int number;
 number = length * width;
 return number;

 
int Normalize (void)
{ //... }
int Solve (void)
{ //...
 Normalize();
 //...
}
int main (void)
{
 //...
 Solve();
 //...
}
main、Solve和Normalize函数在栈中的内存分布如下:
下图执行Normalize时的栈内存分布

应该注意到:调用一个函数,涉及到为该函数在栈中分配内存和释放内存的开销。对于大多数的函数而言,同函数的实际计算量相比可以忽略不计。
#include <iostream.h>
void reverse(int n)
{
 int num;
 if(n<=1)
 {
  cin>>num;
  cout<<"Reverse numbers"<<endl;
  cout<<num<<endl;
 }
 else
 {
  cin>>num;
  reverse(n-1);
  cout<<num<<endl;
 }
}
void main()
{
 int i;
 i=5;
 cout<<"Enter number"<<endl;
 reverse(i);





相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。