조건 - c c++ switch case string



switch 문을 사용한 범위 검사 (5)

C ++에서는 항상 그렇듯이 표준 라이브러리 알고리즘을 선호합니다. 이 경우 범위 조회를 수행하려고합니다. 순서가 지정된 일련의 경계에서 쉽게 수행 할 수 있습니다.

double const boundaries[] = { 18.5, 25, 30, 35 };

switch (upper_bound(begin(boundaries), end(boundaries), BMI) - boundaries) {
    case 0: cout << "You are underweight "       << endl; break;
    case 1: cout << "You are normal"             << endl; break;
    case 2: cout << "You are overweight"         << endl; break;
    case 3: cout << "You are obese"              << endl; break;
    case 4: cout << "You are gravely overweight" << endl; break;
};

사실, 나는 너에게 권하고 싶다.

Coliru 의 라이브 데모보기

#include <iostream>
#include <algorithm>

const char* bmi_classification(double bmi) {
    static double const boundaries[] = { 18.5, 25, 30, 35 };

    double const* lookup = std::upper_bound(std::begin(boundaries), std::end(boundaries), bmi);
    switch (lookup - std::begin(boundaries)) {
        case 0: return "underweight";
        case 1: return "normal";
        case 2: return "overweight";
        case 3: return "obese";
        case 4: return "gravely overweight";
    }
    throw std::logic_error("bmi_classification");
}

int main() {
    for (double BMI : { 0.0, 18.4999, 18.5, 24.0, 25.0, 29.0, 30.0, 34.0, 35.0, 999999.0 }) {
        std::cout << "BMI: " << BMI << " You are " << bmi_classification(BMI) << "\n";
    }
}

인쇄물

BMI: 0 You are underweight
BMI: 18.4999 You are underweight
BMI: 18.5 You are normal
BMI: 24 You are normal
BMI: 25 You are overweight
BMI: 29 You are overweight
BMI: 30 You are obese
BMI: 34 You are obese
BMI: 35 You are gravely overweight
BMI: 999999 You are gravely overweight

보너스

switch 를 사용하지 않고도 더 우아해질 수 있습니다.

콜리 루에서 라이브

const char* bmi_classification(double bmi) {
    constexpr int N = 5;
    static constexpr std::array<char const*, N> classifications {
        { "underweight", "normal", "overweight", "obese", "gravely overweight" }};
    static constexpr std::array<double, N-1> ubounds {
        { 18.5, 25, 30, 35 }};

    auto lookup = std::upper_bound(std::begin(ubounds), std::end(ubounds), bmi);
    return classifications.at(lookup - std::begin(ubounds));
}

https://ffff65535.com

선생님은 if-else 문과 switch 문을 모두 사용하는 프로그램을 할당 했으므로 두 방법을 모두 구현하는 방법을 알고 있습니다. 프로그램은 사용자에게 무게와 높이를 각각 파운드와 미터로 입력하도록 요청했습니다. 이것은 나의 시도이다.

스위치가없는 경우

#include "stdafx.h"
#include <iostream>

using namespace std;


int main()
{
    double height, weight, BMI, heightMeters, weightKilo;
    const double KILOGRAMS_PER_POUND = 0.45359237;
    const double METERS_PER_INCH = 0.0245;

    cout << "Please enter your height (inches) and weight (pounds)" << endl;
    cin >> height >> weight;

    weightKilo = weight*KILOGRAMS_PER_POUND;
    heightMeters = height*METERS_PER_INCH;
    BMI = weightKilo / (heightMeters*heightMeters);

    if (BMI < 18.5) {
        cout << "You are underweight " << endl;
    }
    else if (BMI >= 18.5 && BMI < 25.0) {
        cout << "You are normal" << endl;
    }
    else if (BMI >= 25.0 && BMI < 30.0) {
        cout << "You are overweight" << endl;
    }
    else if (BMI >= 30.0 && BMI < 35) {
        cout << "You are obese" << endl;
    }
    else {
        cout << "You are gravely overweight" << endl;
    }
}

스위치로

#include "stdafx.h"
#include <iostream>

using namespace std;


int main()
{
    double height, weight, heightMeters, weightKilo;
    int BMI, q;
    const double KILOGRAMS_PER_POUND = 0.45359237;
    const double METERS_PER_INCH = 0.0245;

    cout << "Please enter your height (inches) and weight (pounds)" << endl;
    cin >> height >> weight;

    weightKilo = weight*KILOGRAMS_PER_POUND;
    heightMeters = height*METERS_PER_INCH;
    BMI = weightKilo / (heightMeters*heightMeters);

    if (BMI < 18.5) {
        q = 1;
    }
    else if (BMI >= 18.5 && BMI < 25.0) {
        q = 2;
    }
    else if (BMI >= 25.0 && BMI < 30.0) {
        q = 3;
    }
    else if (BMI >= 30.0 && BMI < 35) {
        q = 4;
    }
    else {
        q = 5;
    }

    switch (q) {
        case 1: cout << "You are underweight" << endl; break;
        case 2: cout << "You are a normal weight " << endl; break;
        case 3: cout << "You are overweight" << endl; break;
        case 4: cout << "You are obese" << endl; break;
        case 5: cout << "You are gravely overweight" << endl; break;
    }
}

이것은 switch 문을 포함하여 내가 생각했던 방식이었습니다. switch 문에 첫 번째 코드 블록을 구현하는 방법이 있습니까?

범위를 사용하거나 복식을 사용할 수 없다는 것이 거의 확실했습니다 (18.5). 나는 선생님에게 이메일을 보냈고 그들은 나에게 줄을 따라 답을 주었다.

그것은 당신에게 이해가되지 않을 수도 있지만 때로는 이해가 안되는 프로그램을 작성해야합니다. 나는 당신에게 합법적 인 질문이 없다고 말하는 것이 아니라 누군가가 알아낼 수 있다면 그렇게 할 수 있습니다. 그러나 그 다음, 아마 그것을 알아낼 수 없습니다. 그것이 바로 도전입니다. "

그래서, 나는 묻는다 : 첫 번째 코드 블록에 대해 switch 문을 사용하는 방법이 있는가? 아니면 꼭 필요한 경우에도 코드에서 switch 문을 사용하는 가장 좋은 방법은 무엇인가?


C ++의 스위치를 사용하면 정수와 문자의 값만 확인할 수 있습니다.

BMI는 이중 유형이므로 스위치에서 값을 확인할 수 없습니다.

스위치가있는 솔루션에서 BMI 변수를 double로 선언해야합니다. 정수로 선언하면 모든 소수 결과가 정수로 형변환되고 소수 자리가 손실됩니다.


다음 코드 대신 입력에 맞춰야합니다.

if (BMI < 18.5) {
        q = 1;
    }
    else if (BMI >= 18.5 && BMI < 25.0) {
        q = 2;
    }
    else if (BMI >= 25.0 && BMI < 30.0) {
        q = 3;
    }
    else if (BMI >= 30.0 && BMI < 35) {
        q = 4;
    }
    else {
        q = 5;
    }

    switch (q) {
    case 1: cout << "You are underweight" << endl; break;
    case 2: cout << "You are a normal weight " << endl; break;
    case 3: cout << "You are overweight" << endl; break;
    case 4: cout << "You are obese" << endl; break;
    case 5: cout << "You are gravely overweight" << endl; break;

    }

너는 비슷한 것을 필요로한다.

switch (1 + (BMI >= 18.5) + (BMI >= 25) + (BMI >= 30) + (BMI >= 35)) {
    case 1: cout << "You are underweight" << endl; break;
    case 2: cout << "You are a normal weight " << endl; break;
    case 3: cout << "You are overweight" << endl; break;
    case 4: cout << "You are obese" << endl; break;
    case 5: cout << "You are gravely overweight" << endl; break;
}

논리는 if-elses를 수학 공식으로 변환하여 int를 반환하는 것입니다.


다음과 같이 할 수 있습니다.

switch ((round)BMI)
{
    case 1: case 2: case 3: .... case 15: case 16: case 17: cout<< "You are underweight " << endl; break;
    case 18: ... case 24: cout << "You are normal" << endl; break;
    case 25: ... case 29: cout << "You are overweight" << endl; break;
    case 30: ... case 34: cout << "You are obese" << endl; break;
    default: cout << "You are gravely overweight" << endl;
}

또한 도울 수 없지만 else-if 문에서 첫 번째 조건을 피할 수있는 if-else 를 사용하고 있기 때문에이 사실을 알 수 있습니다.

if (BMI < 18.5)
{
    cout << "You are underweight " << endl;
}
else if (BMI < 25.0)
{
    cout << "You are normal" << endl;
}
else if (BMI < 30.0)
{
    cout << "You are overweight" << endl;
}
else if(BMI < 35)
{
    cout << "You are obese" << endl;
}
else
{
    cout << "You are gravely overweight" << endl;
}

이 외에도 두 가지 구현이 모두 훌륭하게 보입니다.


절대적으로 무시 무시한 컴파일러 확장을 가지고 있지 않다면 C ++에서 범위를 switch 할 수 없습니다.

그러나 BMI 범위의 std::vector 를 만들면 우아하게 스위치를 사용할 수 있습니다.

std::vector<double> v = {18.5, 25.0 /*etc*/}

그런 다음 std::lower_boundstd::distance 와 함께 사용하여 위의 범위에서 주어진 BMI의 위치를 ​​얻습니다. 이것은 switchswitch 양입니다.

그런 다음 한 단계 더 나아가서 출력 메시지의 std::vector<std::string> 을 정의 할 수 있습니다. 그렇다면 switchif 블록도 필요 없습니다! 모든 선택 논리는 std::lower_bound 위임됩니다.

나는 의도적으로 당신에게 전체 코드를주지 않았다 : 나는이 힌트가 충분하다고 믿는다.





switch-statement