1) Что мешает использовать OUT-параметры? Желание записать композицию нескольких функций и не вводить промежуточных переменных? Это идёт от желания (предрассудка?) быть ближе к обычной математической записи? Не буду возражать на все 100% против возврата структур... но проблемы там возникают. А бонусы - ну давайте подумаем. Если возвращается структура, то она обычно неинкапсулирована (код работает с её составляющими). Те же комплексные числа или векторы. В таком случае я сразу предпочту записать в несколько отдельных строк и с отдельными пром. переменными, а не воротить одно выражение, иллюзорно простое (как тензорная форма, в которой в индексах ногу свернёшь, сложность только маскируется во многих случаях, лучше уж видеть всю пачку обычных уравнений).
Если же объекты действительно инкапсулированные, т.е. атомарны с точки зрения алгоритма, то они обычно являются указательными (длинные числа и т.п.)
2) Умение работать с нумерованными массивами с 0 - фундаментально, потому что любые операции со смещениями (хоть в той же обработке растровых изображений), представления многомерных структур в виде одномерных развёрток требуют думать именно вот от этого нуля. Лучше один раз объяснить, почему ноль, нарисовать массив снутри, добиться, чтоб при написании индекса эта картинка в голове всплывала, отбить житейское понимание индекса "как номера".
3) Цикл с условием в конце не нужен вообще. В алгоритмах - точно не нужен. Единичные случаи его использования как раз возникают далеко не в прикладном коде (типа "попробовать несколько раз выполнить операцию, пока не получится").
Пожелание - не использовать безграмотный термин "цикл с постусловием", иначе сразу ощущение, что человек не знает, что такое постусловие.