2013-11-26 27 views
11

Profesörüm anahtar bildirimi oluşturmamızı istedi. Programı yapmak için sadece "SWITCH" ifadesini kullanabiliyoruz. Bir sayı girmemizi ve numara aralığındaki numarayı göstermemizi ve aşağıda gösterildiği gibi hangi evrak numarasının alınacağını görmemizi istiyor. Şimdi ... Bu tür bir program için IF bildirimini kullanmak daha kolay olduğunu biliyorum. Vaka 1: Durum 2: Vaka 3 ... Vaka 30 çalışacak ancak numara aralığından dolayı çok fazla zaman alacaktır.C - Birden fazla kasa numarası ile geçiş

#include <stdio.h> 
main() 
{ 
     int x; 
     char ch1; 
     printf("Enter a number: "); 
     scanf("%d",&x); 
     switch(x) 
     { 
       case 1://for the first case #1-30 
       case 30: 
         printf("The number you entered is >= 1 and <= 30"); 
         printf("\nTake Briefcase Number 1"); 
         break;   
       case 31://for the second case #31-59 
       case 59: 
         printf("The number you entered is >= 31 and <= 59"); 
         printf("\nTake Briefcase Number 2"); 
         break;     
       case 60://for the third case #60-89 
       case 89: 
         printf("The number you entered is >= 60 and <= 89"); 
         printf("\nTake Briefcase Number 3"); 
         break;     
       case 90://for the fourth case #90-100 
       case 100: 
         printf("The number you entered is >= 90 and <= 100"); 
         printf("\nTake Briefcase Number 4"); 
         break;  
       default: 
        printf("Not in the number range"); 
        break; 

       } 
     getch(); 
     } 

Profesörüm, bunun nasıl yapılacağına dair daha kısa bir yol olduğunu ancak bize nasıl yapamayacağımızı anlattı. Kısalmayı düşünebilmemin tek yolu, IF'yi kullanmaktır ama biz buna izin verilmez. Bunu nasıl yapabileceğime dair herhangi bir fikir var mı? aralıkları tutarlı iseniz

+0

Sadece kontrol etmek için, ilk durumun 1'den 30'a kadar gittiğinden emin misiniz? ve 1 ila 29 değil mi? –

+3

Düşünüyor musunuz? Vaka 1: vaka 30: 'aralığındaki herhangi bir sayıyla eşleşecek mi? Yapmayacak. – John3136

+0

İlk 'case' etiketleriniz sadece 2 değer buluyor: 1 ve 30; 2..29'u görmezden geliyorlar. Bir sonraki 'menzil', vb. Için Ditto. Sadece anahtarı kullanarak, bir acı dünyası içindesiniz. –

cevap

21

, bu vakayı kullanabileceğiniz bu gibi aralıkları:

switch (x){ 

case 1: 
case 2: 
case 3: 
case 4: 
case 5: 
case 6: 
    printf ("The number you entered is >= 1 and <= 6\n"); 
    break; 
} 

:

switch (x){ 

case 1 ... 30: 
    printf ("The number you entered is >= 1 and <= 30\n"); 
    break; 
} 

sadece çapraz derleyici çözüm böyle vaka ifadeleri kullanmaktır Düzenleme:switch (x/10)'un etkisine bir şey kullanmak, bunu yapmanın başka bir iyi yoludur. Aralıklar 10 arasındaki farklar olmadığında GCC durum aralıkları kullanmak daha kolay olabilir, ancak diğer yandan profesörünüz cevap olarak GCC uzantısını alamayabilir.

7

, o zaman bazı verilerin atabilirsin:

switch (x/10) 
{ 
    case 0: 
    case 1: 
    case 2: // x is 0 - 29 
    break ; 

    // etc ... 
} 

Aksi takdirde kenarlarındaki hackery biraz yapmanız gerekecek.

GCC ve clang
+0

+1: Daha fazla veya daha az - '(x - 1)/10 ', 1.30 için' [012] 'verecekti; tekrar et. Sorun -8.0 olacak (0 da veriyor). –

3
Try this ... 

#include <stdio.h> 
#include <stdio.h> 
main() 
{ 
     int x; 
     char ch1; 
     printf("Enter a number: "); 
     scanf("%d",&x); 
     int y=ceil(x/30.0); 
     switch(y) 
     { 

       case 1: 
         printf("The number you entered is >= 1 and <= 30"); 
         printf("\nTake Briefcase Number 1"); 
         break;   

       case 2: 
         printf("The number you entered is >= 31 and <= 60"); 
         printf("\nTake Briefcase Number 2"); 
         break;     

       case 3: 
         printf("The number you entered is >= 61 and <= 90"); 
         printf("\nTake Briefcase Number 3"); 
         break;     

       case 4: 
         printf("The number you entered is >= 91 and <= 100"); 
         printf("\nTake Briefcase Number 4"); 
         break;  
       default: 
        printf("Not in the number range"); 
        break; 

       } 
     getch(); 
     } 
+1

Geçerli ceil() 'kullanımınız biraz yanlış. Tamsayı bölümü tamsayı bölümü olduğu için, 'x' ile tamsayı bölümündeki tamsayı bölüşümünde denersiniz. Muhtemelen ceil (x/30.0) 'mu demek istediniz? –

+0

Cevabımı düzenleyerek değişiklikler yapın .. – uhs

+2

Ne yazık ki düzenleme 6 karakterden az olduğu için bunu kendim yapıyorum. Bunu kendiniz yapabilseydiniz, bu yorumları da memnuniyetle silebilirim. –