IF-ifodalarini "Switch-statement" -ga o'tkazish

Menda bir qator IF-statements mavjud va men Switch-statement da o'zgartirmoqchiman, ammo switch1 constant1 doirasida baholashni amalga oshirishda muvaffaqiyat qozonolmayman.

Bilasizlarki, Switch bu bilan ishlaydi:

switch ( expression ) {   //in my case:      switch (score) {
  case constant1:
    statement
      break;
  case constant2:
    statement
  default:
    statement
      break;

Now I've tried to put <= 60 in the constant1 field, but of course it doesn't work.

Bu Switchda ishlashni istagan ISS ifodalarini ketma-ketligi.

if (score <= 60) {
    printf("F");
}
if (score <= 70 && score > 60) {
    printf("D");
}
if (score <= 80 && score > 70) {
    printf("C");
}
if (score <= 90 && score > 80) {
    printf("B");
}
if (score <= 100 && score > 90) {
    printf("A");
}

Barchangizga rahmat!

1
qo'shib qo'ydi muallif rsp, manba
Buni amalga oshirishning iloji yo'q, lekin if zanjirini else yordamida (va && o'chirish) ishlatishingiz mumkin. shartlari)
qo'shib qo'ydi muallif UnholySheep, manba

6 javoblar

switch statement takes constants, not conditions. For instance, you cannot say >= const, so you need to change the strategy.

Masalan, sizning holatingizda 1 dan chiqarilgandan keyin ikki xonali sonning birinchi raqamini yoqishingiz mumkin:

switch ((score-1)/10) {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5: printf("F"); break;
    case 6: printf("D"); break;
    case 7: printf("C"); break;
    case 8: printf("B"); break;
    case 9: printf("A"); break;
}

0..4 holatlarida C kodirovkalari uchun kodirovkalash uchun C kodirovkasi qo'llaniladi, barcha kod "D" .

Yuqoridagi kod 1..100 ga teng ballni tekshirganingizni ta'kidlaydi.

4
qo'shib qo'ydi
Albatta, albatta! Ma'lumki, bu savolning maqsadi o'quv jarayonining bir qismi sifatida boshqa bir usulni o'rganishdir: men amerikacha harflar sinflariga raqamli yozuvlarni almashtirish bo'yicha ko'rgan barcha savollar muqarrar ravishda tilni o'rganayotgan talabalardan bo'lgan. O'qituvchilarning aql-idrok kodini yozishdan tashqari, odatda noto'g'ri fikrdir: if-then-elses zanjiri o'qishni ancha osonlashtiradi.
qo'shib qo'ydi muallif dasblinkenlight, manba
Juda toza bo'lmasa-da, aql bovar qilmas va ixtirochi bo'lib, uni yoqtiraman. Biroq men shunga o'xshash kodlarni ta'lim dasturlari tashqarisida yozishni o'ylamayman. Faqat chalkashliklarni keltirib chiqaradi.
qo'shib qo'ydi muallif neoaggelos, manba

agar yoki switch dan foydalanishingiz mumkin yoki oddiygina:

 printf("%c", 70 - ((score - 60) > 0 ? (score - 41)/10 : 0));

Live example on ideone.com

P.S. Albatta, xuddi shunday switch iborasida ishlatilishi mumkin, albatta, bu beshta case ni tashkil qiladi.

0
qo'shib qo'ydi

Izohda aytib o'tilganidek, siz bunday qila olmaysiz, chunki switch ifodasida faqat 1 ifodasi bo'lishi mumkin.

If-else ifodasini quyidagi kabi foydalaning:

if (score <= 60) {
    printf("F");
} else if (score <= 70) {
    printf("D");
} else if (score <= 80) {
    printf("C");
}
//More statements

Kalit uchun GCC kengaytmalari yoqilgan bo'lsa, siz shunday foydalanishingiz mumkin:

switch (score) {
    case 0...60:
        break;
    case 61...70:
        break;
    //..More cases with range
}
0
qo'shib qo'ydi

Agar switch faqat tenglikni tekshiradi. Shuning uchun sizning vaziyatingizda if-else konstruktsiyasi yaxshi mos keladi.

Shunday bo'lsa-da, agar siz kalit so'zini ishlatmoqchi bo'lsangiz, buni shunday qilishingiz kerak:

switch (score) 
{
  case 0:
  case 1:
  case 2:
  ...//all cases up to 58
  case 59:
  case 60:
    printf("F");
    break;
  case 61:
  ...
}

Juda chiroyli va juda zerikarli emas.

0
qo'shib qo'ydi

The correct syntax is case *constant*, so you can't ever write a case < 60.

Siz nima qila olasiz, bu kabi bir-birining tagida bir nechta buyruqlarni qo'yish kerak:

case 40:
case 41:
case 42:
case 43:
   //do stuff
break;

Agar siz kalit so'zi 40, 41, 42 yoki 43 ga teng bo'lsa, bu "narsalar" ni bajaradi. Biroq, if-statements-ni switch-statements ga o'zgartira olish uchun yaxshi sabab bo'lmasa, alohida voqea.

0
qo'shib qo'ydi

Biroz tushkunlik. Quyidagi so'zlarni sinashingiz mumkin. Bu qisqa va oddiy.

char cGrade = 9-(score/10)+65;
if( cGrade > 68 )
{
    cGrade = 70;//for 'F'
}
else if( cGrade < 65 )
{
    cGrade = 65;//for 'A'
}
0
qo'shib qo'ydi