0

I'm working on a quiz with 80 numbered questions. After every 4 questions there will be an unnumbered 5th bonusquestion. These 100 questions have index-numbers (1-100) in a database table. Maybe it'd have been more logical to use a separate table for the bonusquestions, but the client wants the questions in one table in that order.

I don't want to display the bonusquestion index-numbers in the interface of the quiz, therefore i need to skip every 5th index-number from the range of 100 questions.

I did manage to make a simple calculation which works well when i check it in a loop, but somehow i feel it's a rather dirty solution (ceil). Is there any way of writing this code in a neater or more logical way?

ActionScript:

for (var i:Number = 1; i < 101; i++) {
    var displayIndex:Number = Math.ceil((i/5) * 4);
    trace("i:" + i + " / " + displayIndex);
}

PHP:

for ($i = 1; $i < 101; $i++) {
    echo "i: " . $i . " / displayIndex: " . (ceil(($i/5) * 4) . "<br>");
}

Edit: Let me try to visualize this

index-number =  1 -> display-number =  1
index-number =  2 -> display-number =  2
index-number =  3 -> display-number =  3
index-number =  4 -> display-number =  4
index-number =  5 -> display-number =  none
index-number =  6 -> display-number =  5
index-number =  7 -> display-number =  6
index-number =  8 -> display-number =  7
index-number =  9 -> display-number =  8
index-number = 10 -> display-number =  none
etc...
4

2 に答える 2

1

試す

if($i % 5 != 0) {
  // do your stuff
}
else {
  // skipped
}

予想される出力によると:-

for ($i = 1; $i < 101; $i++) {
    echo 'index-number = '. $i.' -> display-number ='. (($i % 5 != 0) ? $i : 'none').'<br>';  
}

出力:-

index-number = 1 -> display-number =1
index-number = 2 -> display-number =2
index-number = 3 -> display-number =3
index-number = 4 -> display-number =4
index-number = 5 -> display-number =none
index-number = 6 -> display-number =6
index-number = 7 -> display-number =7
index-number = 8 -> display-number =8
index-number = 9 -> display-number =9
index-number = 10 -> display-number =none
and so on....
于 2014-07-10T12:16:20.630 に答える
1

あなたの仕事は非常にエキゾチックなので、あなたの決定はそれを達成するのに十分公平である可能性があります. それはそれを十分に単純化していますが、あなた以外の誰もそれを理解することはできません.

コメントを追加することをお勧めします。ただし、他にも多くの方法があり、それらはよりエレガントとは言えませんが、より自明である可能性があります。

$counter = 1;
for ($i = 1; $i < 21; $i++) {
    $displayNum = $counter;
    if ($i % 5 == 0) {
        $counter--;
        $displayNum = "none";
    }
    echo "index-number = $i -> display-number = $displayNum <br/>";
    $counter++;
}

結果は次のようになります。

index-number = 1 -> display-number = 1 
index-number = 2 -> display-number = 2 
index-number = 3 -> display-number = 3 
index-number = 4 -> display-number = 4 
index-number = 5 -> display-number = none 
index-number = 6 -> display-number = 5 
index-number = 7 -> display-number = 6 
index-number = 8 -> display-number = 7 
index-number = 9 -> display-number = 8 
index-number = 10 -> display-number = none 
index-number = 11 -> display-number = 9 
index-number = 12 -> display-number = 10 
index-number = 13 -> display-number = 11 
index-number = 14 -> display-number = 12 
index-number = 15 -> display-number = none 
index-number = 16 -> display-number = 13 
index-number = 17 -> display-number = 14 
index-number = 18 -> display-number = 15 
index-number = 19 -> display-number = 16 
index-number = 20 -> display-number = none 

三項演算子で縮小しようとすると、説明的ではなく暗号である、あなたと同じようなコードになってしまいます。

繰り返しをスキップして、continueその前に目的の出力を追加できます。まったく同じ結果が次の方法で達成できます。

$counter = 1;
for ($i = 1; $i < 21; $i++) {
    if ($i % 5 == 0) {
        echo "index-number = $i -> display-number = none <br/>";
        continue; // more explanatory for SKIP THIS ITERATION
    }
    echo "index-number = $i -> display-number = $counter <br/>";
    $counter++;
}

このようにして印刷noneし、反復の実行をスキップするため、$counterインクリメントされず、6 回目の反復では 5 になります。

于 2014-07-10T13:21:30.143 に答える