2014-01-07 3 views
9

Я пытаюсь написать код, который имеет много сравнениебольшего, чем и меньше, чем на коммутаторе заявление C

 
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”. 

тогда я пытался решить с помощью переключателя, но он не работал, мне нужно решить его с помощью оператора if или есть способ его решить с помощью коммутатора?

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

'switch' может обрабатывать только точные сравнения с постоянными интегральными значениями. Вам придется использовать 'if' и' else'. –

+0

define 'did not work' – deW1

+0

* Семь ошибок компиляции должны были сказать вам * что-то * (и 1 предупреждение:' control достигает конца не-void функции'). – usr2564301

ответ

4

Там нет чистого способа решить эту проблему с выключателем, так как случаи должны быть целыми типами. Взгляните на if-else if-else.

2

(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 цикл должен отлично работать для этого случая.

+0

a> 1000 оценивает значение boolean не является интегральным 1 или 0. –

+0

@ EricFortin It's C. – Maroun

+0

@ Марун Марун. Вы правы. –

0

Почему у вас есть предпочтение использованию переключателя?

Я спрашиваю, потому что это звучит ужасно, как «вопрос о домашнем задании». Компилятор должен иметь дело с конструкцией if/else так же эффективно, как и с коммутатором (даже если вы не имели дело с диапазонами).

Коммутатор не может обрабатывать диапазоны, как вы показали, но вы можете найти способ включения коммутатора путем категоризации ввода сначала (используя if/else), а затем с помощью оператора switch для вывода ответа.

4

Если вы используете 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"); 
} 
+0

Почему другие компиляторы не понимают использование эллипсов в инструкции switch (вызывая «нестандартное»)? –

6

переключателя менее и если-то еще менее метод. Предупреждение: не пытайтесь включить это для своего назначения как «свое» решение, потому что вас могут спросить, как это работает.

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

Буду благодарен, если вы объясните это шаг за шагом, спасибо в любом случае – Salahuddin

+1

Цикл 'for' - это все, что имеет значение - используйте отладчик или просматривайте его с помощью пера и бумаги. Ну, это и * согласованная * обработка операторов равенства в вашем списке описаний. – usr2564301

1

Это может прийти немного слишком поздно, но:

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

функция Где опция() просто функция, если еще. Это позволяет сохранить чистый вид коммутатора и логической части в другом месте.

Смежные вопросы