O conjunto de técnicas e conceitos que permite aos programadores desenvolverem programas de formas estruturadas, decompondo problemas complexos em etapas mais simples, é conhecido como: