programming - switch in c++ شرح




أكبر من وأقل من في بيان التبديل C (4)

أحاول كتابة رمز يحتوي على الكثير من المقارنة

Write a program in “QUANT.C” which “quantifies” numbers.  Read an integer “x” and test it, producing the 
following output: 

x greater than or equal to 1000 print “hugely positive” 
x from 999 to 100 (including 100) print “very positive” 
x between 100 and 0 print “positive” 
x exactly 0 print “zero” 
x between 0 and -100 print “negative” 
x from -100 to -999 (including -100) print “very negative” 
x less than or equal to -1000 print “hugely negative” 

Thus -10 would print “negative”, -100 “very negative” and 458 “very positive”.

ثم حاولت حلها باستخدام التبديل ولكن لم تنجح، لا بد لي من حلها باستخدام بيان إذا كان هناك طريقة لحلها باستخدام التبديل؟

#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; }

إذا كنت تستخدم غك، لديك "الحظ" لأنه يدعم بالضبط ما تريد باستخدام امتداد اللغة:

#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-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");
}

طريقة تبديل أقل وأقل من ذلك. تحذير: لا تحاول تحويل هذا إلى المهمة الخاصة بك كحل "الخاص بك"، لأنك قد يطلب منك فقط كيف يعمل.

#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;
}

لماذا لديك تفضيل لاستخدام التبديل؟

أنا أسأل لأن هذا يبدو بفظاعة مثل "سؤال الواجبات المنزلية". يجب على المترجم التعامل مع إذا / آخر بناء بنفس الكفاءة كما التبديل (حتى لو كنت لا تتعامل مع نطاقات).

لا يمكن التبديل التعامل مع النطاقات كما كنت قد أظهرت، ولكن هل يمكن أن تجد وسيلة لتشمل التبديل عن طريق تصنيف المدخلات أولا (باستخدام إف / آخر) ثم استخدام بيان التبديل لإخراج الجواب.


(a>1000) إلى 1 [ترو] أو 0 [فالس].

تجميع وسوف تحصل على الخطأ

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

وهذا يعني، لديك لاستخدام integer constant قيمة integer constant لتسميات case . If-else if-else إف If-else if-else حلقة يجب أن تعمل على ما يرام لهذه الحالة.





switch-statement