Select Academic Year:     2017/2018 2018/2019 2019/2020 2020/2021 2021/2022 2022/2023
First Semester 
Teaching style
Lingua Insegnamento

Informazioni aggiuntive

Course Curriculum CFU Length(h)


The Advanced Programming and elements of Software Engineering course has two main objectives. The first goal is to provide the instruments to understand the basics of software design on both small and medium scale, using a modular approach. This means that the students are required to learn the methods and, moreover, the fundamentals such methods are based on, so that they can extend what they learned in the further course of study and professional practice. The second goal is to strengthen programming skills, especially in C language, and knowledge of fundamental algorithms for information processing.

Knowledge and understanding skills
At the end of the course it is expected that the student knows
- the software engineering fundamentals as a science that studies tools and methodologies for planning, developing and evaluating complex software applications.
- the principal design patterns and their implementation in C programming language
- some basic algorithms, data structures and their implementation in C for complex problem solving
- the concept of computational complexity of an algorithm and the methods to compute it.

Ability to apply knowledge and understanding skills

At the end of the course it is expected that the student can:
- understand the principles and organization of modern software production processes, with particular reference to modularity, information hiding and abstraction.
- design and implement software based on the principal information processing algorithms and using some design patterns
- apply the learned concepts in the development of C programs.

Judgment autonomy
At the end of the course it is expected that the student is able to:
- assess the degree of modularity and portability of software products
- evaluate the pros and cons of using a specific design pattern to a particular problem
- evaluate the computational complexity of algorithms

Communicative Skills
At the end of the course, the student is expected to have acquired adequate language skills in relation to the content of the course, so that it can be comprehensively understood by an interlocutor with adequate technical knowledge and to convey the essential concepts also to an interlocutor not technically competent.

Ability to learn independently
At the end of the course, the student is expected to have the ability to deepen his knowledge in the field of software design and development. The student will be able to extend his design and programming skills to object-oriented programming languages and to more complex software systems.


Prerequisites in terms of programming skills and C language knowledge, in particular the ability to develop simple C programs, using conditional and iterative constructs, simple and structured data types, standard I/O, operate on text files, good comprehension of functions.
In detail, the student should know

• Syntax, data types, and basic constructs of C language.
• simple data types (int, float, double, char) and structured data types (vectors, struct).
• Knowledge and understanding of pointers and pointers arithmetic.
• Knowledge of functions and understanding of the parameter passing mechanism.
• Basic knowledge about dynamic memory management (allocation and de-allocation of memory)
• File Operations in C.


Introduction to the course
Software Engineering: overview
Software quality
Principles of software engineering
Modularization Techniques
- The modular structure and its representation
- Interface, implementation and information hiding
- Notation for design
- Module Categories
- Design-specific techniques for change
- Refining by successive steps

Programming in C
C structured types and pointers use
Modularization functions and techniques
Static and dynamic data structures and their realization in C
- representation of data in memory and handling of memory
- pointers
- linked structures
- trees and lists

Design patterns
- purpose and role of design patterns
- description of some design patterns
- implementation in C

Basic algorithms and their implementation in C
Study of Computational Complexity
Implementation of search and sort algorithms in C
- iterative sorts (bubble sort, selection sort)
- recursive sorts (mergesort, quicksort)
Algorithms and data structures for graph manipulation

Teaching Methods

The course is based on a traditional didactic approach (frontal lessons) that combines a significant part of the exercises on all the topics of the program (home-based and classroom exercises, to which interactive exercises are held in the classroom).

The approximate plan is:
Lectures: 35 hours
Exercises: 15 hours
Tutorship: 35 hours

Verification of learning

The exam consists of a written test, including theory questions and programming exercises in C.

The written test consists of some exercises to verify the actual acquisition of expected learning outcomes, touching most of the program at various levels of detail and including both programming exercises and theory questions.
The evaluation is objective, based on the percentage of correctness of each response (which is associated with a fixed score, not known to the candidate, based on the difficulty level).
The test is evaluated with a maximum score of 33. In case of a score greater than or equal to 32, a full mark (‘lode’) is given. In case of a score equal to 31, the final score is 30/30.

The student is stimulated to go beyond simple study aimed at solving an exercise, applying to problems that require the ability to move from the abstract concept to its practical application. The student is always asked to motivate the answer provided. Such a task-based approach makes it possible to assess the skills and ability to apply them to simple problems, depending on the level achieved, but also to evaluate communication skills and judgment autonomy.

The number of exam sessions is defined following the Faculty regulation.

If there are few students, the written test can be replaced by an oral evaluation. In this case, the structure of the interview will be similar to the structure of the written test, with the same level of difficulty.


Course notes, provided to the students through the course website and corrected/updated every year.

Adopted texts
- Sommerville - "Software Engineering" 10 ed. , 2017

- Linguaggio C 5/ed- Di: Alessandro Bellini e Andrea Guidi - ISBN 9788838668210 (english version available)

- Algoritmi in C. Di: Robert Sedgewick (english version available)

T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduzione agli algoritmi e strutture dati (english version available)

Other consultation texts

C Primer Plus (Sixth Edition) - Stephen Prata

David Parnas’papers:
- Some Software Engineering Principles
- On the Criteria To Be Used in Decomposing Systems into Modules
- Designing Software for Ease of Extension and Contraction

More Information

The teaching material provided by the teacher CANNOT replace the textbook or the attendance of the lessons.

Questionnaire and social

Share on:
Impostazioni cookie