The tasks now mix the control-flow tools you have used separately. Some need one decision; others need repeated work. Choose from the contract rather than the title. A whole-number average needs a zero guard, while moving a partial final load still needs another trip. Those are different rules even though both use division.
Trace a small example before running it. Write down the loop state after each iteration and check why the next iteration should happen. When you call a helper, match every argument to a parameter and decide whether its return value must be used. The final tasks combine more than one input, so also test a zero value on either side. None of these tasks introduces a new language construct.