The book is divided into two parts. The first one, An elementary introduction to coding, can serve as a textbook for a one-semester undergraduate course on error-correcting codes. It starts with the concept of coding and presents the classical sphere-packing bound. Then it deals with binary codes, general linear codes, Reed-Solomon codes, binary Golay codes and their relation to combinatorial designs. There are also chapters on Shannon entropy, universal hashing, asymptotic results and 3-dimensional codes. The second part starts with subfield codes and trace codes, and then it proceeds with cyclic codes. There is also a chapter on the applications of orthogonal arrays in statistics and computer science, including linear shift registers and cryptography. Chapters on the geometric description of codes and additive codes contain some advanced topics like quantum codes. The final chapter explores relationships of codes to sphere-packings and designs, and also presents the linear-programming bound and some algebraic-geometric codes. Because of the second part, the book can also be used as supplementary reading for a graduate course.