In this paper, we describe a system called C-Tutor, an intelligent tutoring system (ITS) for novice C programmers. A program analyzer is the most important part of the ITS for programming. Our program analyzer is a compound of a reverse engineering system and a didactic system. Since a novice program usually contains many bugs, information about the intentions of the programmer is inevitable to recognize a buggy program. In our approach, the intentions of a programmer are automatically extracted as a problem description from a sample program by a reverse engineering system called GOES (GOal Extraction System). Based on the problem description, students' programs are recognized by a didactic system called ExBug (Execution-guided deBugger). As a learning environment, Curriculum Network constructs the knowledge base as genetic graphs to teach programming. C-Tutor is a complete ITS which provides both a program analyzer and a learning environment. Tested with real students' programs, program analyzer gives acceptable recognition results. Program analyzer and learning environment are closely related so that students can learn C language during programming. New problems can be easily set because GOES automatically generates problem descriptions for program analyzers. This makes C-Tutor a more practical tutoring system for a real C language course. (C) 1997 Elsevier Science Ltd.