This book was written to support a short course in the second or third year of
an undergraduate computer science, software engineering, or software design
program. The prerequisites are fairly modest: some programming experience
(ideally in Ð¡ or Ð¡++ or a related language such as Java) and some exposure
to the most basic concepts of discrete mathematics (sets, functions, binary re
lations, sequences) and to the language of elementary logic (connectives and
quantifiers). It is intended to be only an introduction to software specifications,
not a systematic survey of requirements engineering, formal methods, compil
ers, or computation theory suitable for a senior or graduate-level course. A
course based on this book would provide a good foundation for such courses
but should not replace them.
This innovative volume provides a hands-on introduction to techniques for specifying the behavior of software components. A text for a second-year undergraduate course in Computer Science and Computer Engineering programs, it is also suitable for self-study. This book will help students to improve their programming skills and gain a sound foundation and motivation for subsequent courses in advanced algorithms and data structures, software design, formal methods, compilers, programming languages, and theory. The main topics covered are techniques for using programmer-friendly assertional notations to specify, develop, and verify small but non-trivial algorithms and data representations, and the use of state diagrams, grammars, and regular expressions to specify and develop recognizers for formal languages. The presentation is based on numerous examples and case studies appropriate to the level of programming expertise of the intended readership.