Нужен совет if-construct - PullRequest
       14

Нужен совет if-construct

1 голос
/ 30 декабря 2011

У меня есть цикл for, в который я поместил несколько операторов if. Цель этих условий - проверить делимость числа, а затем вывести строку, если число делится на 3. Если число делится на 5, будет выведена другая строка. Однако, если число делится на 3 и 5, на его место будет выведена совершенно другая строка вместо других строк.

Вот мой код:

for (i = 1; i <= file_int; i++){
     if (i % 3 == 0) {
        printf("Hoppity \n");
    }
    if (i % 5 == 0) {
        printf("Hophop \n");
    }
    if (i % 5 == 0 && i % 3 == 0) {
        printf("Hop \n");
    }   
}

Как видите, последнее условие не совсем работает. Какой тип конструкции управления я должен использовать? еще

Большое спасибо.

Ответы [ 4 ]

3 голосов
/ 30 декабря 2011
for (i = 1; i <= file_int; i++){
    if (i % 5 == 0 && i % 3 == 0) {
        printf("Five and three\n");
    } else if (i % 3 == 0) {
        printf("Three\n");
    } else if (i % 5 == 0) {
        printf("Five\n");
    } else {
        printf("None of the conditions passed\n");
    }
}
1 голос
/ 30 декабря 2011

Я бы использовал else-ifs и сделал бы нас из того факта, что

(i % 5 == 0 && i % 3 == 0) <=> (i % 15 == 0):

for (i = 1; i <= file_int; i++){
  if (i % 15 == 0)
    printf("Hop \n");
  else if (i % 3 == 0)
    printf("Hoppity \n");
  else if (i % 5 == 0)
    printf("Hophop \n"); 
}

Конечно, вы также можете уйти, не используя никаких управляющих структур, кроме for -loop:

const char* values[15] = {"Hop \n", "", "", "Hoppity \n", "", 
                          "Hophop \n", "Hoppity \n", "", "", "Hoppity \n", 
                          "Hophop \n", "", "Hoppity \n", "", ""};
for (int i = 1; i <= 100; i++) 
  printf(values[i % 15]);

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

0 голосов
/ 30 декабря 2011

Просто ради этого и не рекомендую его, поскольку его может быть сложнее читать, поскольку он злоупотребляет преобразованиями из bool в int:

int msg = (i % 3 == 0) + 2*(i % 5 == 0);
switch ( msg ) {
case 3:
   cout << "Multiple of 3 and 5";
case 2: 
   cout << "Multiple of 5";
case 1:
   cout << "Multiple of 3";
}

, которые могут быть далее сжаты в:

const char* msgs[] = { "", "Multiple 3", "Multiple 5", "Multiple 3 and 5" };
cout << msgs[ (i%3==0) + 2*(i%5==0) ];

Конечно, оба решения против самого вопроса, так как они не , если конструкция , а скорее избегают использования , если в первомрегистр и ветви в общем случае во втором случае.

0 голосов
/ 30 декабря 2011

Альтернативное решение, приближенное к исходному коду. Хотя решение else действительно более эффективно (и элегантно).

for (i = 1; i <= file_int; i++){
    if (i % 3 == 0 && i % 5 != 0) {
        printf("Hoppity \n");
    }
    if (i % 5 == 0 && i % 3 != 0) {
        printf("Hophop \n");
    }
    if (i % 5 == 0 && i % 3 == 0) {
        printf("Hop \n");
    }   
}
...