Несколько операторов if в C ++ - PullRequest
4 голосов
/ 05 июня 2011

Я занимаюсь первой проблемой проекта Эйлера, и я только что это сделал

#include <iostream>
using namespace std;

int main(){

int threes =0;
int fives = 0;
int both = 0;
for (int i = 0; i < 10; i++){

       if(i%3==0){
   threes += i;
   }

       if(i%5==0){
   fives += i;
   }

      if ( i % 5 == 0 && i % 3 == 0){
      both += i;
  }

}

cout << "threes = " << threes << endl;
cout << "fives = " << fives << endl;
cout << "both = " << both << endl;

cout << " threes + fives - both = " << endl;
int result = (threes + fives) - both;
cout << result<< endl;

return 0;
}

Мой профессор недавно исправил меня за то, что я сделал это в другой задаче, сказав что-то о других утверждениях, но я не понимаюПОЧЕМУ я должен добавить еще перед следующим, если.для чего стоит у меня другая версия с else if (i% 5) {fives + = ....}, и они оба работают и получают мне правильный ответ.

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

Если это работает, зачем использовать операторы switch когда-либо?

Ответы [ 5 ]

5 голосов
/ 05 июня 2011

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

Причина, по которой вы получаете правильный ответ в обоих направлениях, заключается в том, что вы идете только к 10 в цикле for, если вы увеличите его до i

Например:

for( int i = 0; i < 10; i++ )
{
   if( ( ( i % 3 ) == 0 ) && ( ( i % 5 ) == 0 ) )
   {
      both++;
   }
   else if( ( i % 3 ) == 0 )
   {
      threes++;
   }
   else if( ( i % 5 ) == 0 )
   {
      fives++;
   }
}
3 голосов
/ 05 июня 2011

Ветвь else в операторе if-else выполняется только в том случае, если ветвь if равна false. Если у вас есть только два if оператора подряд, они оба будут выполнены, что может быть пустой тратой. В приведенном ниже коде else запрещает выполнение второго вычисления, если первое удовлетворено.

if (expensive_computation1()) {
  ...
}
else if (expensive_computation2()) {
  ...
}

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

2 голосов
/ 05 июня 2011

В этом случае, может быть, вы действительно хотите это:

if (i % 5 == 0 && i % 3 == 0) {
    both += i;
} else if (i % 3 == 0) {
    threes += i;  
} else if (i % 5 == 0) {
    fives += i;
}

(почему вы делаете += i вместо ++ Я не знаю, но вы не объяснили, поэтому я просто скопировалit)

В вашем коде threes и fives были увеличены , даже если , это также увеличит both, что в зависимости от вашей проблемы может оказаться не тем, что вы хотите.Если вы выполните описанный выше способ if / else, увеличится только одна из трех переменных.

0 голосов
/ 05 июня 2011

Почему использование if-else вместо нескольких if's?
if-else & if приведет к тем же результатам, но if-else достигает их впроизводительность улучшена.с несколькими if's каждые, если условие должно быть проверено.При if-else должна быть выполнена только одна условная проверка, а остальные условия вообще не нужно проверять.

Это не повлияет на маленькую программу, подобную той, которая у вас есть, но, несомненно, окажет некоторое влияние на потенциально дорогую функцию, вызываемую многократно и снова.это работает, зачем когда-либо использовать операторы switch?
При вложенных условиях if-else код трудно читать и понимать.Конструкция switch-case помогает представить условия в гораздо более удобном для чтения и понимания формате.

0 голосов
/ 05 июня 2011

Для меня это выглядит как стилистика.Вы можете использовать какой-нибудь инструмент для автоформатирования, который соответствует определенному стилистическому стилю (K & R, ANSI, GNU и т.у тебя может быть счастливый профессор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...