Computer Science
People use computers because they can provide services and help in the solving of problems. Thus, many courses and much research throughout the College utilize various aspects of computing.
The discipline of computer science includes all aspects of the effective design and use of computer systems. Core areas within the undergraduate curriculum include multiple views of problem-solving, hardware design, operating systems, data organization (structure) and processing (algorithms), software design, concepts of programming languages, and the theory of computation. Some topics, such as networks and compilers, explore elements of computer systems in more detail, while other areas, such as artificial intelligence, computational linguistics, bioinformatics, human-computer interactions, and computer vision, integrate computer science with interdisciplinary studies.
Formal coursework is concentrated within the Department of Computer Science. Introductory courses emphasize multiple views of problem-solving, each with a different supporting computer programming language. The curriculum emphasizes basic concepts and fundamental techniques; and courses make extensive use of MathLAN, the local-area network we share with the Department of Mathematics and Statistics, which includes about 170 workstations and eight servers. Our outstanding facilities include several computer-equipped classrooms, an open lab, and convenient study and tutoring areas.
The computer science major prepares students who plan careers in computer science, in the use of computing in other disciplines, in teaching, or in other professions. The curriculum is strongly influenced by national recommendations of such professional bodies as the Association for Computer Machinery, the Computer Society of the Institute of Electrical and Electronics Engineers, and the Liberal Arts Computer Science Consortium. Students regularly supplement this formal coursework with independent projects, internships, and student-faculty research. In addition, students often work with faculty throughout the College on a variety of special projects that involve computing.
A minimum of 32 credits in the department, including
- Computer Science 301
- Computer Science 341
- one of Computer Science 211 or 213
- one of Computer Science 302 or 362
- one of Computer Science 323 or 325
In addition, computer science majors are required to take Mathematics 218.
Computer Science courses numbered below 151 do not satisfy major requirements.
To prepare for these courses, most majors will take the standard introductory sequence (Computer Science 151, 161, and 207). Students with significant background in computer science, such as Advanced Placement coursework, can often arrange with the department for special accommodations.
Most majors will prepare by taking the standard prerequisites for Mathematics 218 (Mathematics 131, 133, and 215), but students with significant background in mathematics can often bypass one or more of them.
All majors are encouraged to take statistics (Mathematics 209 or 335-336), Physics 220, and a course in technology and society (such as a foundation course in Technology Studies). Students considering graduate school in computer science should take both Computer Science 211 and 213. Students planning to work in industry should take Computer Science 323 or 325 together with coursework in another discipline that uses computing in a significant way. Student considering a career in computing are encouraged to participate in an independent project, internship, or research experience.
- Core courses of study.
- Completion of Computer Science 211 or Physics 220, and
- Completion of Computer Science 213
- Additional coursework that is not used to fulfill another requirement.
- Completion of a 200- or 300-level course in computer science, or
- Completion of a statistics course at the 200 level or higher (Math 209, 309, 335, or 336), or
- Completion of Math 220 Differential Equations, Math 306 Mathematical Modeling, Math 314 Topics in Applied Mathematics, or Math 321 Foundations of Abstract Algebra, or
- Completion of Physics 220 Electronics, or
- Completion of Psychology 222 Industrial Psychology or 260 Cognitive Psychology.
- Participation in local activities related to computer science, judged to be excellent by department faculty. Such activities might include:
- Giving talks at Extras sessions, or
- Doing independent projects (totaling four credits or more) in computer science, or
- Carrying out research under the direction of a member of the department, or
- Developing a successful software package with positive assessment by department faculty.
- Participation in the study or use of computer science outside of the department, judged to be excellent by department faculty. Such activities might include:
- Achieving a score at or above the 75th percentile on the Graduate Record Examination in Computer Science, or
- Receiving an award in the Mathematical Competition in Modeling, or
- Achieving a strong performance in the ACM Programming Competition, or
- Having a paper accepted by a refereed computer science journal or conference, or
- Developing a successful software package with positive assessment by outside referees or evaluators, or
- Contributing to an open source software package or resource, or
- Carrying out supervised research elsewhere.
A study of core topics and great ideas in the field of computer science, focusing on underlying algorithmic principles and social implications. Topics may include multimedia and hypermedia, networks, architecture, programming languages, software design, artificial intelligence, databases, cryptography, and the theory of computing. Incudes formal laboratory work.
A lab-based introduction to basic ideas of computer science, including recursion, abstraction, scope and binding, modularity, the design and analysis of algorithms, and the fundamentals of programming in a high-level, functional language. Variable topic course. Includes formal laboratory work.
Study of basic concepts of computer science, with an emphasis on problemsolving techniques from functional and imperative perspectives. Functional elements include data types, procedures as first-class objects, recursion, and binding. Control structures, linked data structures, memory management, macro processing, compilation and linking, and data representation provide basic elements of imperative problem-solving. Additional topics include an introduction to GNU/Linux operating system. Includes formal laboratory work. A student who receives credit for Computer Science 153 cannot receive credit for Computer Science 151 or 161.
A continuation of Computer Science 151, bringing in some concepts more closely tied to the architecture of computers, compilers, and operating systems, such as macro processing, compilation and linking, pointers and memory management, data representation, and software development tools. Additional topics include assertions and invariants, data abstraction, linked data structures, an introduction to the use of the GNU/Linux operating system, and programming in a low-level, imperative language. Variable topic course. Includes formal laboratory work.
An examination of computational techniques for producing and processing text in natural languages and an introduction to the theoretical basis for those techniques, both in linguistics and in computer science. Topics include generative grammars, parsing, algorithms for automatic indexing, information retrieval, and natural-language interfaces.
An introduction to the ideas and practices of computation: message passing, information hiding, classes and interfaces, inheritance, polymorphism, and reflection. The course also includes data structures and the associated algorithms, packages and libraries, exceptions, and the use of an integrated software-development environment. Includes formal laboratory work.
Study of both traditional and alternative computer architectures. Introduction to digital logic, microcode, Von Neumann architectures, data representations, fetch/execute model, RISC/CISC, instruction formats and addressing, machine and assembly language, memory architecture and algorithms, I/O architecture, and elements of distributed systems. Includes formal laboratory work.
Study of the principal components of typical operating systems and an introduction to parallel algorithms. Topics from operating systems: storage management, scheduling, concurrent processing, synchronization, data protection, and security. Discussion of models of parallelism and algorithms for problems in such areas as lists, trees, searching, sorting, graphs, geometry, and strings. Includes formal laboratory work.
Study of methods and principles for user-centered design through laboratory exercises and a significant team design and evaluation project. Consideration of human capabilities, emerging technologies, social impacts, and alternative views of the design process.
An introduction to current principles, approaches, and applications of artificial intelligence, with an emphasis on problem-solving methods, knowledge representation, reasoning with uncertainty, and heuristic search. Study of a range of AI approaches, such as rule-based systems, neural networks, and systems for machine learning. Review of several applications areas such as game playing, natural language processing, robotics, theorem proving, and perception.
Study of structures used to organize data and of the algorithms used to manipulate these structures. Assignments to implement data structures and to use them in computer science and other applications programs. Emphasis on mathematical principles behind the data structures.
Description and analysis of key issues in the design, syntax, semantics, and implementation of programming languages, with examples from several highlevel languages, illustrating important paradigms (functional, object-oriented, imperative, declarative). Additional topics may include denotational semantics, type-inference algorithms, program verification, and the lambda calculus.
Study of software life cycle and its consequences. Consideration of various algorithms with an emphasis on strategies that can be applied. Emphasis on design, coding, testing, and documenting of large software packages through work on a large project.
Study of database theory and design along with software development methodology. Emphasis on design principles and methods, project management, and the use of appropriate tools. A large project provides motivation and practical experience.
A formal study of computational devices, their related languages, and the possibility and difficulty of computations. Examples are pushdown automata and Turing machines, context-free languages and recursively enumerable sets, and the halting problem and NP-completeness.
Study of traditional and modern techniques for implementation of high-level languages, through either interpretation or translation to low-level languages. Topics include formalisms for describing syntax and semantics of languages, theory of parsing, regular expressions, intermediate languages, and optimization. Students construct interpreters or compilers for high-level languages. Includes formal laboratory work.
This course focuses on the communications protocols used in computer networks — their functionality, specification, verification, implementation, and performance. The course also considers the use of network architectures and protocol hierarchies to provide more complex services. Existing protocols and architectures are used as the basis of discussion and study. Includes formal laboratory work.
* Indicates courses not offered every year.
Catalog has Moved
Please refer to the new 2012–13 Grinnell College Catalog.
The Grinnell College Catalog has moved. Information on this page is provided for archive purposes.





