programing

C switch 문보다 크고 작음

cafebook 2023. 11. 4. 13:18
반응형

C switch 문보다 크고 작음

비교가 많이 되는 코드를 작성하려고 합니다.

"QUANT"에 프로그램을 작성합니다.숫자를 "수치화"하는 "C".정수 "x"를 읽고 테스트하면 다음과 같은 출력이 나옵니다.

x 1000 인쇄 이상 "hugely 양성"
x 999부터 100까지(100 포함) "매우 긍정적" 인쇄
100에서 0 사이의 x "양" 인쇄
x 정확히 0 인쇄 "0"
0 ~ -100 사이의 x "음" 인쇄
x -100 ~ -999(-100 포함) 인쇄 "매우 음"
x -1000 인쇄 이하 "hugely 네거티브"

따라서 -10은 "네거티브", -100은 "매우 네거티브", 458은 "매우 포지티브"로 출력됩니다.

그리고 스위치 문을 사용해서 해결하려고 했지만, 작동이 되지 않았습니다.그것을 사용해서 풀어야 합니까?ifstatement 또는 switch statement를 사용하여 해결하는 방법이 있습니까?

#include <stdio.h>

int main(void)
{
    int a=0;
    printf("please enter a number : \n");

    scanf("%i",&a);

    switch(a)
    {
        case (a>1000):
            printf("hugely positive");
            break;

        case (a>=100 && a<999):
            printf("very positive");
            break;

        case (a>=0 && a<100):
            printf("positive");
            break;

        case 0:
            printf("zero");
            break;

        case (a>-100 && a<0):
            printf("negative");
            break;

        case (a<-100 && a>-999):
            printf("very negative");
            break;

        case (a<=-1000):
            printf("hugely negative");
            break;

    return 0;
}

케이스가 일체형이어야 하기 때문에 스위치로 이를 해결할 수 있는 깨끗한 방법이 없습니다.다른 사람들을 한번 보세요.

스위치가 없는 if-eless 방법:

#include <stdio.h>

int main(void)
{
    int a=0, i;
    struct {
        int value;
        const char *description;
    } list[] = {
        { -999, "hugely negative" },
        { -99, "very negative" },
        { 0, "negative" },
        { 1, "zero" },
        { 100, "positive" },
        { 1000, "very positive" },
        { 1001, "hugely positive" }
    };

    printf("please enter a number : \n");
    scanf("%i",&a);

    for (i=0; i<6 && a>=list[i].value; i++) ;
    printf ("%s\n", list[i].description);

    return 0;
}

for-loop에 코드가 없습니다(빈 문만 있음).;) 그러나 여전히 값이 있는 배열 위에서 실행되고 입력된 값이 있으면 종료됩니다.a다음과 같거나 더 큽니다.value배열의 요소.그 시점에서.i에 대한 인덱스 값을 보유합니다.description인쇄합니다.

gcc를 사용하는 경우 언어 확장자를 사용하여 원하는 것을 정확하게 지원하므로 "행운"이 있습니다.

#include <limits.h>
...

switch(a)
{
case 1000 ... INT_MAX: // note: cannot omit the space between 1000 and ...
    printf("hugely positive");
   break;
case 100 ... 999:
    printf("very positive");
   break;
...
}

하지만 이것은 표준이 아니며 다른 컴파일러들은 당신의 코드를 이해하지 못할 것입니다.흔히 표준 기능("휴대성")을 사용하여 프로그램을 작성해야 한다고 말합니다.

따라서 "스트리밍"을 사용하는 것을 고려해 보십시오.if-elseif-else구성:

if (a >= 1000)
{
    printf("hugely positive");
}
else if (a >= 100)
{
    printf("very positive");
}
else if ...
...
else // might put a helpful comment here, like "a <= -1000"
{
    printf("hugely negative");
}

(a>1000)1 [참] 또는 0 [false]으로 평가합니다.

컴파일하면 다음 오류가 발생합니다.

test_15.c:12: error: case label does not reduce to an integer constant

이 말은, 당신은 그 다음에integer constant의 가치case라벨. 안If-else if-else루프는 이 경우에 잘 작동할 것입니다.

용도:

switch (option(a)) {
    case (0): ...
    case (1): ...
    case (2): ...
    case (n): ...

어디서option()함수는 단순히 다음과 같은 함수입니다.if else.

이를 통해 스위치의 깔끔한 외관을 유지할 수 있으며 논리적인 부분은 다른 곳에 있습니다.

스위치 사용을 선호하는 이유는 무엇입니까?

저는 이것이 '숙제 문제'처럼 끔찍하게 들리기 때문에 물어봅니다.컴파일러는 (범위를 다루고 있지 않더라도) 스위치만큼 효율적으로 if/else 구성을 처리해야 합니다.

스위치는 표시된 것처럼 범위를 처리할 수는 없지만 입력을 먼저 범주화한 다음(if/else 사용) 스위치 문을 사용하여 답을 출력함으로써 스위치를 포함하는 방법을 찾을 수 있습니다.

type 매개변수 패턴을 when 절과 함께 사용합니다.

switch(a)
    {
        case * when (a>1000):
            printf("hugely positive");
            break;
        case * when (a>=100 && a<999):
            printf("very positive");
            break;
        case * when (a>=0 && a<100):
            printf("positive");
            break; }

언급URL : https://stackoverflow.com/questions/20972297/larger-than-and-less-than-in-c-switch-statement

반응형