C/C++ L2

2018/07/03 C/C++

C/C++程序语言设计 Level2。

MAC

选择结构程序设计

顺序结构程序设计中,各语句是按照自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的、不需要判断的。这是最简单的程序结构。实际上,在很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作选择其一,这是选择结构要解决的问题。

用if语句处理选择结构

实例1

#include <iostream>
using namespace std;

int main(){
    float a, b, c, t;
    cin >> a >> b >> c;
    if(a>b){
        t=a;
        a=b;
        b=t;
    } 
    if(a>c){
        t=a;
        a=c;
        c=t;
    }
    if(b>c){
        t=b;
        b=c;
        c=t;
    }
    cout << a << " " << b << " " << c << endl;
    return 0;
}

if语句的一般形式是:

if(表达式)
    语句1
else
    语句2

if(表达式)
    语句1
else if(表达式)
    语句2
else
    语句3

逻辑运算符

有时要求判断的条件不是一个简单的条件,而是由几个给定简单条件组成的复合条件。例如语句“如果周六不下雨,我就去公园玩”,这里包含两个简单的复合条件,第一是否周六,第二是否下雨,只有两个条件都满足的情况下才能去公园玩。

常见的两个逻辑表达式分别是AND以及ORAND表示“和”,也就是两个条件同时为真时整个式子才为真,其余情况都为假。OR表示“或”,也就是两个条件至少有1个为真时整个式子为真,其余情况为假。

在C语言中,用&&表示AND,用||表示OR。

上面提到的&&||符号是双目运算符号,还有一个逻辑符号是单目的,叫做非,用表示。如果a为假,那么!a为真,如果a为真,!a为假。

逻辑表达式

逻辑表达式的值是一个“真”或者“假”。C语言在表达逻辑运算结果的时候,以数值1表示真,以0表示假。但是当判断某个量是真还是假的时候,将0当作是假,非0当作是真。例如:

  1. a=4,则a为真,!a为假。
  2. a=4, b=5,则a&&b为真,是1。

练练手:判断year是否闰年,满足闰年满足两个条件之一:能被4整除但是不能被100整除;能被400整除。

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

三目运算符

有一种if语句,当被判别的表达式的值为真或者假的时候,都执行一个赋值语句并且向同一个变量赋值,例如:

if(a>b)
    max = a;
else
    max = b;

当a>b时将a的值赋予max,当a<=b的时候将b的值赋予max。可以看到无论是什么条件,都是赋予max某个值,这种类型的if语句可以用三目运算符来改写:

max = (a>b) ? a : b;

示例:

#include <iostream>
using namespace std;

int main(){
    char ch;
    cin >> ch;
    ch = (ch >= 'A' && ch <= 'Z') ? (ch + 32) : ch;
    cout << ch << endl;
    return 0;
}

选择结构的嵌套

在if语句中又包含一个或者多个if语句称为if语句的嵌套。

示例:

#include <iostream>
using namespace std;

int main(){
    int x, y;
    cin >> x;
    if(x<0){
        y = -1;
    }
    else{
        if(x==0){
            y = 0;
        }
        else{
            y = 1;
        }
    }
    cout << "x=" << x << ",y=" << y << endl;
    return 0;
}

switch语句

if语句只有两个分支可以使用,实际问题中会有多个分支的选择,例如,学生的成绩按照85分以上为A,70-84分为B,60-69分为C等等,人口统计分为老、中、青、少、儿童等等。尽管嵌套的if语句也能表达多分支,但是代码不够简洁。C语言使用switch来处理多分支的问题。

示例:

#include <iostream>
using namespace std;

int main(){
    char grade;
    cin >> grade;
    cout << "你的成绩区间是: ";
    switch(grade){
        case 'A': cout << "85-100" << endl; break;
        case 'B': cout << "70-84" << endl; break;
        case 'C': cout << "60-69" << endl; break;
        case 'D': cout << "<60" << endl; break;
        default: cout << "输入的数据不合理" << endl; break;
    }
    return 0;
}

注意事项:

  1. switch的条件表达,其值应该为整数类型(包括char)。
  2. case后面的表达式是常量。
  3. default不是必须的,可以省略。
  4. break语句是跳出switch,如果缺失break则会连续执行case。

示例1

改进的求解一元二次方程:

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    double a, b, c, disc, x1, x2, realpart, imagpart;
    cin >> a >> b >> c;
    cout << "结果是:" << endl;

    if(fabs(a) <= 1e-6){
        cout << "格式错误" << endl;
    } else {
        disc = b*b - 4*a*c;
        if(fabs(disc) <= 1e-6){
            cout << "两个相同的根:" << -b/(2*a) << endl;
        } else {
            if(disc > 1e-6){
                x1 = (-b+sqrt(disc))/(2*a);
                x2 = (-b-sqrt(disc))/(2*a);
                cout << "两个实数根:" << x1 << " and " << x2 << endl; 
            } else {
                realpart = -b/(2*a);
                imagpart = sqrt(-disc)/(2*a);
                cout << "两个复数根:" << endl;
                cout << realpart << "+" << imagpart << endl;
                cout << realpart << "-" << imagpart << endl;
            }
        }
    }
    return 0;
}

习题

给出100分制成绩,要求输出成绩等级ABCDE。90分以上为A,80-89分为B,70-79分为C,60-69为D,60分以下为E。

PS:使用switch语句。

Search

    Table of Contents