Вам нужно сбросить счетчик всякий раз, когда вы получаете новое большее число.
Я не проверял это, но оно должно работать:
cate = 0;
par = INT_MIN;
for (i = 0; i < n; i++) {
fscanf(fptr, "%d", &b);
// skip odd numbers
if ((b % 2) != 0)
continue;
// get new larger number
if (b > par) {
par = b;
cate = 1;
continue;
}
// increment count on existing largest number
if (b == par)
++cate;
}
ОБНОВЛЕНИЕ:
Я не понимаю, почему явно пропускают итерации, а не только выбирают итерации, которые имеют значение?Есть ли какое-то преимущество?
Да, это лучший стиль.Он допускает простые одноуровневые операторы if
, которые могут иметь свои собственные комментарии.
Это позволяет избежать беспорядочного соединения if
или тройного уровня if/else
лестница.
ИМО, этораспространенное заблуждение [особенно среди начинающих программистов на C], что комплекс if
будет выполняться быстрее [или как-то «лучше»], чем несколько простых.
Первый if
можно было бы подумать о «пропустить это»итерация "тест.Здесь есть только один.Но для более сложного кода их может быть несколько.
Множественные экранированные условия можно обрабатывать в одном if
с if (c1 || c2 || c2 || ... || c10) continue;
, но это быстро запутывается.
Здесь для правильной отступной if/else
лестничной логики нам понадобится:
if (cond1)
do_stuff1;
else
if (cond2)
do_stuff2;
else
if (cond3)
do_stuff3;
Если мы не находимся в цикле, вот "уловка", чтобы избежать if/else
лестничной логики,используя do { ... } while (0);
:
do {
if (cond1) {
do_stuff1;
break;
}
if (cond2) {
do_stuff2;
break;
}
if (cond3) {
do_stuff3;
break;
}
} while (0);