C: Introduction, Pointers Instructors: Steven Ho, Nick Riasanovsky

Similar documents
Two s Complement Review. Two s Complement Review. Agenda. Agenda 6/21/2011

CS 61c: Great Ideas in Computer Architecture

CS61C : Machine Structures

CS61C : Machine Structures

CS61C : Machine Structures

CS61C Machine Structures. Lecture 3 Introduction to the C Programming Language. 1/23/2006 John Wawrzynek. www-inst.eecs.berkeley.

CS 110 Computer Architecture. Lecture 2: Introduction to C, Part I. Instructor: Sören Schwertfeger.

CS61C : Machine Structures

CS 61C: Great Ideas in Computer Architecture Introduction to C

Number review... Lecture 3 Introduction to the C Programming Language (pt 1) Has there been an update to ANSI C?

CS 61C: Great Ideas in Computer Architecture (Machine Structures) Introduc)on to C (Part I) We are here!

CS 61C: Great Ideas in Computer Architecture Lecture 2: Introduction to C, Part I

CS 110 Computer Architecture. Lecture 2: Introduction to C, Part I. Instructor: Sören Schwertfeger.

Intro to C: Pointers and Arrays

Processor. Lecture #2 Number Rep & Intro to C classic components of all computers Control Datapath Memory Input Output

CS 61C: Great Ideas in Computer Architecture C Pointers. Instructors: Vladimir Stojanovic & Nicholas Weaver

CS 61C: Great Ideas in Computer Architecture Introduc=on to C, Part I. We are here!

Agenda. Peer Instruction Question 1. Peer Instruction Answer 1. Peer Instruction Question 2 6/22/2011

Agenda. Address vs. Value Consider memory to be a single huge array. Review. Pointer Syntax. Pointers 9/9/12

HW1 due Monday by 9:30am Assignment online, submission details to come

CS 61C: Great Ideas in Computer Architecture Lecture 2: Introduction to C, Part I

CS 61C: Great Ideas in Computer Architecture. Lecture 2: Numbers & C Language. Krste Asanović & Randy Katz

CS 102 Computer Architecture. Lecture 2: Introduction to C, Part I. Instructor: Sören Schwertfeger.

Agenda. CS 61C: Great Ideas in Computer Architecture. Lecture 2: Numbers & C Language 8/29/17. Recap: Binary Number Conversion

Number Representation & I See The C

Processor. Lecture #2 Number Rep & Intro to C classic components of all computers Control Datapath Memory Input Output }

CS61C : Machine Structures

Topics Introduction to Microprocessors

C Arrays, Strings, More Pointers Instructor: Steven Ho

IT 252 Computer Organization and Architecture Introduction to the C Programming Language

Number Review. Lecture #3 More C intro, C Strings, Arrays, & Malloc Variables. Clarification about counting down

CS 61C: Great Ideas in Computer Architecture. C Arrays, Strings, More Pointers

CS61C : Machine Structures

CS 61c: Great Ideas in Computer Architecture

Review: C Strings. A string in C is just an array of characters. Lecture #4 C Strings, Arrays, & Malloc

Introduction to C. Robert Escriva. Cornell CS 4411, August 30, Geared toward programmers

Lectures 5-6: Introduction to C

ECE 250 / CS 250 Computer Architecture. C to Binary: Memory & Data Representations. Benjamin Lee

Introduction to C. Sean Ogden. Cornell CS 4411, August 30, Geared toward programmers

Introduction to C. Zhiyuan Teo. Cornell CS 4411, August 26, Geared toward programmers

Lectures 5-6: Introduction to C

CS 220: Introduction to Parallel Computing. Beginning C. Lecture 2

Introduction to C. Ayush Dubey. Cornell CS 4411, August 31, Geared toward programmers

CS 326 Operating Systems C Programming. Greg Benson Department of Computer Science University of San Francisco

Instructor: Randy H. Katz hbp://inst.eecs.berkeley.edu/~cs61c/fa13. Fall Lecture #4. Agenda

CS61C : Machine Structures

C Review. MaxMSP Developers Workshop Summer 2009 CNMAT

CS61C : Machine Structures

Motivation was to facilitate development of systems software, especially OS development.

Motivation was to facilitate development of systems software, especially OS development.

CS 261 Fall C Introduction. Variables, Memory Model, Pointers, and Debugging. Mike Lam, Professor

IMPORTANT QUESTIONS IN C FOR THE INTERVIEW

Data III & Integers I

Lecture 03 Bits, Bytes and Data Types

Pointers, Arrays, Memory: AKA the cause of those Segfaults

Outline. Lecture 1 C primer What we will cover. If-statements and blocks in Python and C. Operators in Python and C

CS61C Machine Structures. Lecture 4 C Pointers and Arrays. 1/25/2006 John Wawrzynek. www-inst.eecs.berkeley.edu/~cs61c/

More C Pointer Dangers

PRINCIPLES OF OPERATING SYSTEMS

CS 61C: Great Ideas in Computer Architecture. Lecture 3: Pointers. Krste Asanović & Randy Katz

C Introduction. Comparison w/ Java, Memory Model, and Pointers

Arrays and Memory Management

CSE 303: Concepts and Tools for Software Development

High Performance Computing in C and C++

Kurt Schmidt. October 30, 2018

Class Information ANNOUCEMENTS

Announcements. CSCI 334: Principles of Programming Languages. Lecture 18: C/C++ Announcements. Announcements. Instructor: Dan Barowy

Programming in C. What is C?... What is C?

Programming in C UVic SEng 265

Programming in C. What is C?... What is C?

CENG 447/547 Embedded and Real-Time Systems. Review of C coding and Soft Eng Concepts

CSE 374 Programming Concepts & Tools

Agenda. Components of a Computer. Computer Memory Type Name Addr Value. Pointer Type. Pointers. CS 61C: Great Ideas in Computer Architecture

CSCI 171 Chapter Outlines

Programming in C - Part 2

Procedures, Parameters, Values and Variables. Steven R. Bagley

C Language Part 1 Digital Computer Concept and Practice Copyright 2012 by Jaejin Lee

Lecture 2, September 4

Under the Hood: Data Representations, Memory and Bit Operations. Computer Science 104 Lecture 3

Recap. ANSI C Reserved Words C++ Multimedia Programming Lecture 2. Erwin M. Bakker Joachim Rijsdam

Chapter 11 Introduction to Programming in C

CS 231 Data Structures and Algorithms, Fall 2016

CSCI-243 Exam 1 Review February 22, 2015 Presented by the RIT Computer Science Community

Introduction Slide 1/20. Introduction. Fall Semester. Parallel Computing

CS 61C: Great Ideas in Computer Architecture Introduc)on to C, Part II

Chapter 11 Introduction to Programming in C

edunepal_info

Work relative to other classes

Data III & Integers I

C Compilation Model. Comp-206 : Introduction to Software Systems Lecture 9. Alexandre Denault Computer Science McGill University Fall 2006

P.G.TRB - COMPUTER SCIENCE. c) data processing language d) none of the above

CS61, Fall 2012 Section 2 Notes

Ricardo Rocha. Department of Computer Science Faculty of Sciences University of Porto

CS61C : Machine Structures

High Performance Computing MPI and C-Language Seminars 2009

CS 31: Intro to Systems Pointers and Memory. Kevin Webb Swarthmore College October 2, 2018

Algorithms, Data Structures, and Problem Solving

Review of the C Programming Language for Principles of Operating Systems

cs3157: another C lecture (mon-21-feb-2005) C pre-processor (3).

CS Programming In C

Transcription:

C: Introduction, Pointers Instructors: Steven Ho, Nick Riasanovsky

Overflow Overflow is when the result of an arithmetic operation can t be represented by the (FINITE) hardware bits i.e. the result is mathematically incorrect Examples: Unsigned: 0b1 1 + 1 10 = 0b0 0 = 0? Two s: 0b01 1 + 1 10 = 0b10 0 = -2 (n-1) ten? 0b 0000 0001 0010 1110 1111 Solution: add more bits unsigned 6/19/2017 CS61C Su18 - Lecture 1 2

Sign Extension Want to represent the same number using more bits than before Easy for positive #s (add leading 0 s), more complicated for negative #s Sign and magnitude: add 0 s after the sign bit One s complement: copy MSB Two s complement: copy MSB Example: Sign and magnitude: 0b 11 = 0b 1001 One s/two s complement: 0b 11 = 0b 1111 6/19/2017 CS61C Su18 - Lecture 1 3

Review Bits can be used to represent anything! n bits can represent up to 2 n things Number Representation Bits can represent anything! n bits can represent up to 2 n things Unsigned, Bias, 1 s, 2 s Overflow Sign Extension 6/20/2017 CS61C Su17 Lecture 2 4

Question: Take the 4-bit number x = 0b1010. Which of the following numbers does x NOT represent in the schemes discussed last lecture? unsigned sign and magnitude biased notation one s complement two s complement (A) (B) (C) (D) -4-6 10-2 2^3 + 2^1 = 10-1 * 2^1 = -2 2^3 + 2^1 - (2^3-1) = 3 -x = ~x = 0b0101 = 5 ---> x = -5 -x = ~x + 1 = 0b0101 + 1 = 0b0110 = 6 ---> x = -6 5

Overview Higher-Level Language Program (e.g. C) Assembly Language Program (e.g. MIPS) Machine Language Program (MIPS) Machine Interpretation Compiler Assembler Hardware Architecture Description (e.g. block diagrams) temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; lw $t0, 0($2) lw $t1, 4($2) sw $t1, 0($2) sw $t0, 4($2) This week_ 0000 1001 1100 0110 1010 1111 0101 1000 1010 1111 0101 1000 0000 1001 1100 0110 1100 0110 1010 1111 0101 1000 0000 1001 0101 1000 0000 1001 1100 0110 1010 1111 Architecture Implementation Logic Circuit Description (Circuit Schematic Diagrams) 6/20/2017 CS61C Su17 Lecture 2 6

Agenda Basic C Concepts Compilation Variable Types Administrivia C Syntax and Control Flow MTS Pointers Address vs. Value 6/20/2017 CS61C Su17 Lecture 2 7

Prerequisites Official prerequisites: Some C experience is required before CS61C C++ or JAVA okay Average CS61C class: 9/10 already know JAVA 1/2 already know C++ 1/3 already know C 1/10 already know C# 1/20 have not taken 61B or equivalent If you have no experience in these languages, then start early and ask a lot of questions in discussion! 6/20/2017 CS61C Su17 Lecture 2 8

Disclaimer You will not learn how to fully code in C in these lectures! K&R is THE resource Brian Harvey s notes (on course website) Other online sources HW, Labs for practice Projects will solidify knowledge 6/20/2017 CS61C Su17 Lecture 2 9

Introduction C is not a very high level language, nor a big one, and is not specialized to any particular area of application. But its absence of restrictions and its generality make it more convenient and effective for many tasks than supposedly more powerful languages. Kernighan and Ritchie With C we can write programs that allow us to exploit underlying features of the architecture 6/20/2017 CS61C Su17 Lecture 2 10

C Concepts These concepts distinguish C from other programming languages that you may know: Compiler Typed variables Typed functions Header files (.h) Structs Enums Pointers Creates useable programs from C source code Must declare the kind of data the variable will contain Must declare the kind of data returned from the function Allows you to declare functions and variables in separate files Groups of related values Lists of predefined values Aliases to other variables 6/20/2017 CS61C Su17 Lecture 2 11

Compilation C is a compiled language C compilers map C programs into architecture-specific machine code (string of 0s and 1s) Unlike Java, which converts to architecture-independent bytecode (run by JVM) Unlike python, which directly interprets the code Main difference is when your program is mapped to low-level machine instructions 6/20/2017 CS61C Su17 Lecture 2 12

Compilation Advantages Excellent run-time performance: Generally much faster than Python or Java for comparable code because it optimizes for the given architecture Fair compilation time: enhancements in compilation procedure (Makefiles) allow us to recompile only the modified files 6/20/2017 CS61C Su17 Lecture 2 13

Compilation Disadvantages Compiled files, including the executable, are architecture-specific (CPU type and OS) Executable must be rebuilt on each new system i.e. porting your code to a new architecture Edit Compile Run [repeat] iteration cycle can be slow 6/20/2017 CS61C Su17 Lecture 2 14

declaration assignment int x = 2; float y = 1.618; char z = 'A'; Typed Variables in C You must declare the type of data a variable will hold Declaration must come before or simultaneously with assignment Type Description Examples int signed integer 5,-12,0 short int (short) smaller signed integer long int (long) larger signed integer char single text character or symbol'a', 'D', '? float floating point non-integer numbers0.0, 1.618, -1.4 double greater precision FP number Integer sizes are machine dependant! Common size is 4 or 8 bytes (32/64-bit), but can t ever assume this Can add unsigned before int or char 6/20/2017 CS61C Su17 Lecture 2 15

Characters Encode characters as numbers, same as everything! ASCII standard defines 128 different characters and their numeric encodings (http://www.asciitable.com) char representing the character a contains the value 97 char c = a ; or char c = 97; are both valid A char takes up 1 byte of space 7 bits is enough to store a char (2 7 = 128), but we add a bit to round up to 1 byte since computers usually deal with multiples of bytes 6/20/2017 CS61C Su17 Lecture 2 16

Typecasting in C (1/2) C is a weakly typed language You can explicitly typecast from any type to any other: int i = -1; if(i < 0) printf( This will print\n ); if((unsigned int)i < 0) printf( This will not print\n ); This is possible because everything is stored as bits! Can be seen as changing the programmer s perspective of the variable 6/20/2017 CS61C Su17 Lecture 2 17

Typecasting in C (2/2) C is a weakly typed language You can explicitly typecast from any type to any other: int i = -1; if(i < 0) printf( This will print\n ); if((unsigned int)i < 0) printf( This will not print\n ); Can typecast anything, even if it doesn t make sense: struct node n; /* structs in a few slides */ int i = (int) n; More freedom, but easier to shoot yourself in the foot 6/20/2017 CS61C Su17 Lecture 2 18

Typed Functions in C // function prototypes int my_func(int,int); void sayhello(); // function definitions int my_func(int x,int y) { sayhello(); return x*y; } void sayhello() { printf( Hello\n ); } You have to declare the type of data you plan to return from a function Return type can be any C variable type or void for no return value Place on the left of function name Also necessary to define types for function arguments Declaring the prototype of a function allows you to use it before the function s definition 6/20/2017 CS61C Su17 Lecture 2 19

Structs in C Way of defining compound data types A structured group of variables, possibly including other structs typedef struct { int lengthinseconds; int yearrecorded; } Song; Song song1; song1.lengthinseconds = 213; song1.yearrecorded = 1994; Song song2; song2.lengthinseconds = 248; song2.yearrecorded = 1988; 6/20/2017 CS61C Su17 Lecture 2 20

21

Type of Language Program-mi ng Unit Compilation Function Oriented Function Creates machine-dependent code C Java Object Oriented Class = Abstract Data Type Creates machine-independent bytecode Execution Loads and executes program JVM interprets bytecode Hello World #include<stdio.h> int main(void) { printf("hello\n"); return 0; } public class HelloWorld { public static void main(string[] args) { System.out.printl("Hello"); } } Memory manage-me nt Manual (malloc, free) Automatic (garbage collection) From http://www.cs.princeton.edu/introcs/faq/c2java.html 6/20/2017 CS61C Su17 Lecture 2 22

Agenda Basic C Concepts Compilation Variable Types Administrivia C Syntax and Control Flow MTS Pointers Address vs. Value 6/20/2017 CS61C Su17 Lecture 2 23

Administrivia Lab 0 is today! Make sure you have registered for a lab account. Find a partner for labs HW0 is due this Monday Main portion is on EdX (link will be on website) Submit mini-bio by filling out the form Don t forget about office hours and Guerilla Sessions! (check times on website) 6/20/2017 CS61C Su17 Lecture 2 24

Agenda Basic C Concepts Compilation Variable Types Administrivia C Syntax and Control Flow MTS Pointers Address vs. Value 6/20/2017 CS61C Su17 Lecture 2 25

C and Java operators nearly identical For precedence/order of execution, see Table 2-1 on p. 53 of K&R arithmetic: +, -, *, /, % assignment: = augmented assignment: +=, -=, *=, /=, %=, &=, =, ^=, <<=, >>= bitwise logic: ~, &,, ^ bitwise shifts: <<, >> boolean logic:!, &&, equality testing: ==,!= subexpression grouping: ( ) order relations: <, <=, >, >= increment and decrement: ++ and -- member selection:., -> conditional evaluation:? : 6/20/2017 CS61C Su17 Lecture 2 26

Generic C Program Layout Handled by Preprocessor #include <system_files> #include local_files Dumps other files here (.h and.o) #define macro_name macro_expr Macro substitutions /* declare functions */ /* declare global variables and structs */ int main(int argc, char *argv[]) { /* the innards */ } /* define other functions */ Remember rules of scope! (internal vs. external) Programs start at main() main() must return int 6/20/2017 CS61C Su17 Lecture 2 27

Sample C Code #include <stdio.h> #define REPEAT 5 int main(int argc, char *argv[]) { int i; int n = 5; for (i = 0; i < REPEAT; i = i + 1) { printf("hello, world\n"); } return 0; } 6/20/2017 CS61C Su17 Lecture 2 28

C Syntax: main To get arguments to the main function, use: int main(int argc, char *argv[]) What does this mean? argc contains the number of strings on the command line (the executable path counts as one, plus one for each argument). argv is an array containing pointers to the arguments as strings (more on pointers later) 6/20/2017 CS61C Su17 Lecture 2 29

main Example $./foo hello 87 Here argc = 3 and the array argv contains pointers to the following strings: argv[0] = "./foo" argv[1] = "hello" argv[2] = "87" We will cover pointers and strings later 6/20/2017 CS61C Su17 Lecture 2 30

C Syntax: Variable Declarations All variable declarations must appear before they are used (e.g. at the beginning of a block of code) A variable may be initialized in its declaration; if not, it holds garbage! Variables of the same type may be declared on the same line Examples of declarations: Correct: int x; int a, b=10, c; Incorrect: short x=1, float y=1.0; z = c ; 6/20/2017 CS61C Su17 Lecture 2 31

C Syntax: True or False No explicit Boolean type in C (unlike Java) What evaluates to FALSE in C? 0 (integer) NULL (a special kind of pointer: more on this later) What evaluates to TRUE in C? Anything that isn t false is true Same idea as in Scheme: only #f is false, anything else is true! 6/20/2017 CS61C Su17 Lecture 2 32

C Syntax: Control Flow Should be similar to what you ve seen before if-else if (expression) statement if (expression) statement1 else statement2 while while (expression) statement do statement while (expression); 6/20/2017 CS61C Su17 Lecture 2 33

C Syntax: Control Flow Should be similar to what you ve seen before for for (initialize; check; update) statement switch switch (expression) { case const1: statements case const2: statements default: statements } break 6/20/2017 CS61C Su17 Lecture 2 34

switch and break Case statement (switch) requires proper placement of break to work properly Fall through effect: will execute all cases until a break is found switch(ch){ case + : /* does + and - */ case - : break; case * : break; default: } In certain cases, can take advantage of this! 6/20/2017 CS61C Su17 Lecture 2 35

Has there been an update to ANSI C? Yes! It s called the C99 or C9x std Use option gcc -std=c99 at compilation References http://en.wikipedia.org/wiki/c99 http://home.tiscalinet.ch/t_wolf/tw/c/c9x_changes.html Highlights: Declarations in for loops, like Java (#15) Java-like // comments (to end of line) (#10) Variable-length non-global arrays (#33) <inttypes.h> for explicit integer types (#38) <stdbool.h> for boolean logic definitions (#35) 6/20/2017 CS61C Su17 Lecture 2 36

Agenda Basic C Concepts Compilation Variable Types Administrivia C Syntax and Control Flow MTS Pointers Address vs. Value 6/20/2017 CS61C Su17 Lecture 2 37

Meet The Staff Damon Jonathan Bribe Food York Peppermint Patties Kit Kat Biggest Fear: Heights Sharks Unpopular Opinion EE > CS Poke in Berkeley is terrible Cafe Getaway Pipeline Co. Brewed Awakening 6/20/2017 CS61C Su17 Lecture 2 38

Agenda Basic C Concepts Compilation Variable Types Administrivia C Syntax and Control Flow MTS Pointers Address vs. Value 6/20/2017 CS61C Su17 Lecture 2 39

Address vs. Value Consider memory to be a single huge array Each cell/entry of the array has an address Each cell also stores some value Don t confuse the address referring to a memory location with the value stored there... 101 102 103 104 105... 23 42... 6/20/2017 CS61C Su17 Lecture 2 40

Pointers A pointer is a variable that contains an address An address refers to a particular memory location, usually also associated with a variable name Name comes from the fact that you can say that it points to a memory location Location (address) Data... Variable names 101 102 103 104 105... 23 42 104... y p x 6/20/2017 CS61C Su17 Lecture 2 41

Pointer Syntax int *x; Declare variable x as the address of an int x = &y; Assigns address of y to x & called the address operator in this context z = *x; Assigns the value at address in x to z * called the dereference operator in this context 6/20/2017 CS61C Su17 Lecture 2 42

Pointer Example int *p,x,y; p? x? y? Declare x=3; y=4; p? x 3 y 4 Assign vals p = &x; p x 3 y 4 Assign ref *p = 5; p x 5 y 4 Dereference (1) y = *p; p x 5 y 5 Dereference (2) 6/20/2017 CS61C Su17 Lecture 2 43

Pointer Types (1/2) Pointers are used to point to one kind of data (int, char, a struct, etc.) Pointers to pointers? Oh yes! (e.g. int **pp) Exception is the type void *, which can point to anything (generic pointer) Use sparingly to help avoid program bugs and other bad things! 6/20/2017 CS61C Su17 Lecture 2 44

Pointer Types (2/2) Functions can return pointers char *foo () { return Hello World ; } Placement of * does not matter to compiler, but might to you int* x is the same as int *x int *x,y,z; is the same as int* x,y,z; but NOT the same as int *x,*y,*z; 6/20/2017 CS61C Su17 Lecture 2 45

Pointers and Parameter Passing Java and C pass parameters by value Procedure/function/method gets a copy of the parameter, so changing the copy does not change the original Function: void addone (int x) { x = x + 1; } Code: int y = 3; addone(y); y remains equal to 3 6/20/2017 CS61C Su17 Lecture 2 46

Pointers and Parameter Passing How do we get a function to change a value? Pass by reference : function accepts a pointer and then modifies value by dereferencing it Function: void addone (int *p) { *p = *p + 1; } Code: int y = 3; addone(&y); y is now equal to 4 6/20/2017 CS61C Su17 Lecture 2 47

Pointers in C Why use pointers? When passing a large struct or array, it s easier/faster to pass a pointer than a copy of the whole thing In general, pointers allow cleaner, more compact code Careful: Pointers are likely the single largest source of bugs in C Most problematic with dynamic memory management, which we will cover later Dangling references and memory leaks 6/20/2017 CS61C Su17 Lecture 2 48

Pointer Bugs Local variables in C are not initialized, they may contain anything (a.k.a. garbage ) Declaring a pointer just allocates space to hold the pointer it does not allocate the thing being pointed to! void f() { int *p,x; x = *p; } BAD void f2() { int *ptr; *ptr = 5; } BAD 6/20/2017 CS61C Su17 Lecture 2 49

Question: How many errors (syntax and logic) in this C code (assume C99)? #include <stdio.h> void flip_sign(int *n){ *n = -(*n);} void main(); { (A) int *p, x=5, y; // init 2 (B) 3 y = *(p = &x) + 1; (C) 4 int z; (D) 5+ flip_sign(p); printf("x=%d,y=%d,p=%d\n", x, y,*p); } 50

Answer: How many errors (syntax and logic) in this C code (assume C99)? #include <stdio.h> (1) void flip_sign(int *n){ *n = -(*n);}; void main(); { (A) int *p, x=5, y; // init (B) 3 y = *(p = &x) + 1; (C) 4 int z; (D) 5+ flip_sign(p); printf("x=%d,y=%d,p=%d\n", x, y,*p); * } (3) (4) 2 (2) (5) 51

Question: What is output from the corrected code below? #include <stdio.h> void flip_sign(int *n){*n = -(*n);} int main() { int *p, x=5, y; // init (A) y = *(p = &x) + 1; (B) int z; (C) (D) flip_sign(p); printf("x=%d,y=%d,*p=%d\n",x,y,*p); } x, y, *p 5, 6, -5-5, 6, -5-5, 4, -5-5,-6, -5 52

Summary C is an efficient (compiled) language, but leaves safety to the programmer Weak type safety, variables not auto-initialized Use pointers with care: common source of bugs! Pointer is a C version (abstraction) of a data address Each memory location has an address and a value stored in it * follows a pointer to its value & gets the address of a value C functions pass by value 6/20/2017 CS61C Su17 Lecture 2 53