Core concepts of imperative programing are taught and manipulated using a pseudo-langage for recitation classes and using ADA for labs.
These concepts are: imperative algorithmics (sequence, repetitions, conditionals), refinement method, sub-program decomposition (procedures and functions) and programing modules, data structures (arrays, records, enumerations, linked structures), genericity, recursivity, tests, offensive programming (by contract) and defensive (exceptions), abstract data types, dynamic memory allocation.
I have learned these important concepts through various project in Ada including the Huffman coding, that is commonly used for lossless data compression.