2016-04-20 26 views
6

Logic của tôi là:Làm cách nào tôi có thể sử dụng các phạm vi trong câu lệnh trường hợp chuyển đổi trong C?

if number is between 1 to 10, execute first case statement 
if number is from 20 to 30, execute second case statement 

có giải pháp nào khác ngoài giải pháp bên dưới không?

case '1' ... '10': 
case '20' ... '30': 
+0

Tùy chọn duy nhất của bạn là làm như bạn không muốn hoặc như pzaenger đề xuất. – Steve

+0

Nếu bạn muốn một giải pháp không di động, gcc có thể sử dụng trường hợp dựa trên phạm vi. – Boiethios

+4

Ý của bạn là '1 ... 10', không phải' '1' ... '10''. Và cấu trúc đó là phần mở rộng gcc, không phải là tiêu chuẩn C. –

Trả lời

4

Lựa chọn 1: sử dụng case 0 cho 0-9, case 1 cho 11-20 và vân vân.

Phương án 2: sử dụng if

Lựa chọn 3:

Một cách tồi tàn đang sử dụng vào mùa thu qua trường hợp như thế này:

#include <stdio.h> 

int main(void) { 
    int i=1; 

    for(i=1;i<=25;i++) 
    { 
    switch(i) 
    { 
     case 1: 
     case 2: 
     case 3: 
     case 4: 
     case 5: 
     case 6: 
     case 7: 
     case 8: 
     case 9: 
     case 10: 
      printf("%d is in between 1-10\n", i); 
      break; 

     case 11: 
     case 12: 
     case 13: 
     case 14: 
     case 15: 
     case 16: 
     case 17: 
     case 18: 
     case 19: 
     case 20: 
      printf("%d is in between 11-20\n", i); 
      break; 

     default: 
      printf("%d is above 20\n", i); 
    } 
    } 
    return 0; 
} 

Output:

1 is in between 1-10 
2 is in between 1-10 
3 is in between 1-10 
4 is in between 1-10 
5 is in between 1-10 
6 is in between 1-10 
7 is in between 1-10 
8 is in between 1-10 
9 is in between 1-10 
10 is in between 1-10 
11 is in between 11-20 
12 is in between 11-20 
13 is in between 11-20 
14 is in between 11-20 
15 is in between 11-20 
16 is in between 11-20 
17 is in between 11-20 
18 is in between 11-20 
19 is in between 11-20 
20 is in between 11-20 
21 is above 20 
22 is above 20 
23 is above 20 
24 is above 20 
25 is above 20 

https://ideone.com/Cw6HDO

+0

cảm ơn, nhưng nếu tôi phải kiểm tra số nghìn – user3205621

+1

Trong trường hợp đó 'chuyển' có thể không phải là cách để đi. –

+1

Nếu bạn phải kiểm tra hàng nghìn con số, bạn nên đề cập đến điều đó trong câu hỏi ban đầu của mình. – abelenky

0

C không hỗ trợ giá trị trường hợp khác với số nguyên đơn (hoặc số nguyên giống như - ký tự, giá trị đếm). Vì vậy, lựa chọn của bạn là:

  • Theo đề nghị của pzaenger trong một chú thích bây giờ xóa: chuyển đổi số bạn đang làm việc với thành cái gì đó bạn có thể bật (trong trường hợp này, chia cho 10).
  • Nhiều báo cáo trường hợp (tận dụng lợi thế của lần truy cập): case 1: case 2: case 3: ... case 10: do_something();
  • Sử dụng if thay vì case.
4
void SwitchDemo(int value) 
    { 
    switch(value/10) 
     { 
     case 0: ...; break; // 0 - 9 
     case 1: ...; break; // 10 - 19 
     ... 
     } 
    } 

hay, cụ thể cho câu hỏi dao động:

void SwitchDemo(int value) 
    { 
    switch((value-1)/10) 
     { 
     case 0: ...; break; // 1 - 10 
     case 1: ...; break; // 11 - 20 
     ... 
     } 
    } 
-1

Chuyển phát biểu trong c chỉ có thể hoạt động trên một biểu thức hằng số, các báo cáo trường hợp không thể bao gồm so sánh năng động.

Example of something which is, and is not, a "Constant Expression" in C?

Đối với một cái gì đó đơn giản này một nếu/cấu trúc khác có thể được rõ ràng hơn và đơn giản hơn, tùy thuộc vào trình biên dịch báo cáo trường hợp của bạn có thể được dịch sang một loạt các báo cáo phân nhánh so anyways.

+0

' switch() '** có thể ** vận hành một biểu thức không liên tục trong phần _expression_ của 'switch (expression) ...' – chux

10

Các GCC hỗ trợ biên dịch, như một phần mở rộng ngôn ngữ, case ranges như:

switch(i) { 
    case 0 ... 9: return true; 
    default: return false; 
} 

mở rộng ngôn ngữ này cũng được chấp nhận bởi Clang/LLVM. Vì vậy, sử dụng nó nếu bạn có thể đủ khả năng hạn chế mã của bạn để GCC & Clang trình biên dịch.

Xem thêm this.

Tôi không biết tại sao tiện ích mở rộng này không được bao gồm trong tiêu chuẩn C11.

0

Bạn sẽ không thể thực hiện việc này trong tiêu chuẩn C với tuyên bố switch-case.
(như câu trả lời khác đã chỉ ra, một số trình biên dịch có phần mở rộng phi tiêu chuẩn cho phép này)

Thay vào đó, tôi khuyên bạn nên thực hiện một cấu trúc dữ liệu như:

struct RangeData 
{ 
    int start; 
    int end; 
    void (*func)(int); 
}; 

RangeData ranges[] = { { 1, 10, Handle10s  }, 
         { 20, 30, Handle20s  }, 
         {5000, 10000, HandleBigNumbers} }; 

Sau đó, nó phải được rất dễ dàng để tạo ra một vòng lặp nhỏ mà chu kỳ thông qua, tìm thấy phạm vi thích hợp và gọi hàm thích hợp.

void DoNumber(int value) 
{ 
    for(int i=0; i<ARRAYSIZE(ranges); ++i) 
    { 
     if (ranges[i].start <= value && value <= ranges[i].end) 
     { 
      ranges[i].func(value); 
     } 
    } 
} 
Các vấn đề liên quan