An Introduction to Algebraic and Combinatorial Coding Theory