gcc
printf()
a
b
scanf()
atoi()
❖ This term, your Teaching Team consists of ... |
Changwei Zou | ||
K17-501E | ||
non-technical/personal issue - by appointments ... | ||
technical/course contents - Use CSE Help, or Course Forum |
Mingqin Yu | ||
... who are they? | ||
cs9024@cse.unsw.edu.au |
❖ This term, your Teaching Team consists of ... (cont) |
Deniz Dilsiz | ||
Ziming Gong | ||
Janhavi Jain | ||
Joffrey Ji | ||
Leman Kirme | ||
Ziting Li | ||
Kisaru Liyanage | ||
Thirasara Beruwawela Pathiranage | ||
Adiyat Rahman | ||
Fritz Rehde | ||
Finn Xu | ||
Oliver Xu | ||
Sijia Xu | ||
Nimish Ukey | ||
Mingqin Yu |
❖ Schedule (topics are not absolutely fixed ...) |
Lectures Weekly Prac/Quiz Weekly Tut Assignment Introduction, C language -- Large Assignment Dynamic data structures prac/quiz Tutorial | Analysis of algorithms prac/quiz Tutorial | Graph data structures prac/quiz Tutorial | Graph algorithms prac/quiz Tutorial | Mid-term test (online) (Thursday, 6pm-7pm) -- | Search tree data structures prac/quiz Tutorial | Search tree algorithms prac/quiz Tutorial | String algorithms prac/quiz Tutorial | Randomised algorithms, Review prac/quiz Tutorial | due Final Exam (on campus) --
❖ Assessment Summary |
weekly_lab = mark for weekly practicals/quizzes (out of 2*8) mid_term = mark for mid-term test (out of 12) large_assn = mark for large assignment (out of 12) exam = mark for final exam (out of 60) total = weekly_lab + mid_term + large_assn + exam
To pass the course, you must achieve:
total
❖ Weekly Practical Exercises and Quizzes |
In weeks 2-5, 7-10 :
Practical exercises are provided at the bottom of tutorial web pages (e.g., Tutorial in Week 2).
After completing each weekly practical exercise, please proceed to the weekly quiz on Moodle.
Weekly Quizzes (practical exercises) contribute 16% to overall mark ( 2 marks each x 8 weeks).
Do them yourself! and Don't fall behind!
❖ Large Assignment |
The large assignment gives you experience applying tools/techniques
(but to a larger programming problem than weekly practical exercises)
The assignment will be carried out individually.
The assignment will be released late Week 1 and is due in week 10.
The assignment contributes 12% to overall mark.
Submit your answers in week 10 on Moodle
❖ Mid-term Test |
1-hour online test in Week 6 (Thursday, 6-7pm).
Format:
❖ Final Exam |
2-hour written exam during the exam period.
Format:
❖ Complete weekly quizzes and the large assignment on time |
Answers to the quizzes and the large assignment (assessed online via Moodle) will be released to students on completion.
For some assessment items, a late penalty may not be appropriate.
Such assessments will receive a mark of zero if not completed by the specified date. Examples include:
For more details, see COMP9024 Course Outline.
❖ Start with reading, debugging and modifying a runnable program in COMP9024 on GitHub. |
❖ Course Goals |
COMP9021 …
❖ Pre-conditions |
There are no prerequisites for this course.
However we will move at fast pace through the necessary programming fundamentals. You may find it helpful if you are able to:
if
while
for
❖ Post-conditions |
At the end of this course you should be able to:
❖ Access to Course Material |
Ideas for the COMP9024 material are drawn from
❖ Resources |
Textbook
Good books, useful beyond COMP9024 (but coding style …)
❖ Resources (cont) |
Supplementary textbook:
Also, numerous online C resources are available.
❖ Lectures |
Lectures will:
Lecture documents (e.g., programs, notes or slides) will be made available before lecture each week
❖ Weekly Tutorials |
The weekly tutorials/classes, with tutors, aims to:
You may bring your own laptop to access materials or take notes
Important - tutorials provide an opportunity for a more intimate classroom experience where you can interact more closely with the tutors and other students.
Tutorials on Github
❖ Plagiarism (cont) |
Examples of Plagiarism (student.unsw.edu.au/plagiarism):
Using same or similar idea without acknowledging the source
This includes copying ideas from a website, internet
Presenting work as independent when produced in collusion with others
This includes students providing their work to another student
Your submissions will be checked for and will be reported to the Academic Integrity Unit at UNSW.
❖ Summary |
The goal is for you to become a better programmer
❖ Why C? |
❖ Brief History of C |
C and UNIX operating system share a complex history …
❖ Basic Structure of a C Program |
// include files // global definitions // function definitions function_type f(arguments) { // local variables // body of function return …; } . .
|
. . . . . // main function int main(arguments) { // local variables // body of main function return 0; }
|
❖ Exercise: What does this program compute? |
#include <stdio.h> int f(int m, int n) { while (m != n) { if (m > n) { m = m-n; } else { n = n-m; } } return m; } int main(void) { printf("%d\n", f(30,18)); return 0; }
❖ Example: Insertion Sort in C |
Insertion Sort algorithm (in Pseudo Code):
insertionSort(A): | Input array A[0..n-1] of n elements | | for all i=1..n-1 do | | element=A[i], j=i-1 | | while j≥0 and A[j]>element do | | A[j+1]=A[j] | | j=j-1 | | end while | | A[j+1]=element | end for
❖ Example: Insertion Sort in C (cont) |
#include <stdio.h> // include standard I/O library defs and functions #define SIZE 6 // define a symbolic constant void insertionSort(int array[], int n) { // function headers must provide types int i; // each variable must have a type for (i = 1; i < n; i++) { // for-loop syntax int element = array[i]; int j = i-1; while (j >= 0 && array[j] > element) { // logical AND array[j+1] = array[j]; j--; // abbreviated assignment j=j-1 } array[j+1] = element; // statements terminated by ; } // code blocks enclosed in { } } int main(void) { // main: program starts here int numbers[SIZE] = { 3, 6, 5, 2, 4, 1 }; /* array declaration and initialisation */ int i; insertionSort(numbers, SIZE); for (i = 0; i < SIZE; i++) printf("%d\n", numbers[i]); // printf defined in <stdio> return 0; // return program status (here: no error) to environment }
❖ Compiling with gcc |
C source code: | prog.c | |
↓ | a.out | (executable program) |
To compile a program prog.c
gcc prog.c
To run the program, type:
./a.out
❖ Compiling with gcc |
Command line options:
gcc
gcc -Wall prog.c
which reports all warnings to anything it finds that is potentially wrong or non ANSI compliant
-o
gcc
a.out
gcc -o prog prog.c
❖ Sidetrack: Printing Variable Values with printf() |
Formatted output written to standard output (e.g. screen)
int printf(const char *formatString, ...);
formatString
%d | decimal | %f | floating-point | |||
%c | character | %s | string | |||
\n | new line | \" | quotation mark |
Examples:
int num = 3; printf("The cube of %d is %d.\n", num, num*num*num);
The cube of 3 is 27.
char ch = 'z'; int num = 1234567; printf("Your \"login ID\" will be in the form of %c%d.\n", ch, num);
Your "login ID" will be in the form of z1234567.
printf("%8.3f\n", 3.14159);
3.142
❖ Basic Elements |
Algorithms are built using
❖ Assignments |
;
{ }
+, -, *, /, %
=, +=, -=, *=, /=, %=
++
--
// suppose k=6 initially k++; // increment k by 1; afterwards, k=7 n = k--; // first assign k to n, then decrement k by 1 // afterwards, k=6 but n=7
// again, suppose k=6 initially ++k; // increment k by 1; afterwards, k=7 n = --k; // first decrement k by 1, then assign k to n // afterwards, k=6 and n=6
❖ Assignments (cont) |
C assignment statements are really expressions
v = getNextItem(); while (v != 0) { process(v); v = getNextItem(); }
is often written as
while ((v = getNextItem()) != 0) { process(v); }
❖ Exercise: What are the final values of a b |
a = 1; b = 5; while (a < b) { a++; b--; }
a = 1; b = 5; while ((a += 2) < b) { b--; }
❖ Conditionals |
if (expression) { some statements; } if (expression) { some statements1; } else { some statements2; }
some statements
expression
some statements1
expression
some statements2
expression
{ }
❖ Conditionals (cont) |
Indentation is very important in promoting the readability of the code
Each logical block of code is indented:
// Style 1
if (x)
{
statements;
}
|
// Style 2 (my preference)
if (x) {
statements;
}
|
// Preferred else-if style
if (expression1) {
statements1;
} else if (exp2) {
statements2;
} else if (exp3) {
statements3;
} else {
statements4;
}
|
❖ Conditionals (cont) |
Relational and logical operators
a > b | a b | |
a >= b | a b | |
a < b | a b | |
a <= b | a b | |
a == b | a b | |
a != b | a b | |
a && b | a b | |
a || b | a b | |
! a | logical not a |
A relational or logical expression evaluates to 1
0
❖ Loops |
C has two different "while loop" constructs
// while loop
while (expression) {
some statements;
}
|
// do .. while loop
do {
some statements;
} while (expression);
|
The do .. while
❖ Loops (cont) |
The "for loop" in C
for (expr1; expr2; expr3) { some statements; }
expr1
expr2
expr3
Example: |
for (i = 1; i < 10; i++) { printf("%d %d\n", i, i * i); }
|
❖ Exercise: What is the output of this program? |
int i, j; for (i = 8; i > 1; i /= 2) { for (j = i; j >= 1; j--) { printf("%d%d\n", i, j); } printf("\n"); }
❖ Functions |
Functions have the form
return-type function-name(parameters) { declarations statements return …; }
return_type
void
parameters
void
❖ Functions (cont) |
When a function is called:
return
❖ Functions (cont) |
When a return
return expression;
expression
// Euclid's GCD (the Greatest Common Divisor) algorithm (recursive version)
int euclid_gcd(int m, int n) {
if (n == 0) {
return m;
} else {
return euclid_gcd(n, m % n);
}
}
The return statement can also be used to terminate a function of return-type void
return;
❖ Basic Data Types |
char | character | 'A' 'e' '#' | ||
short, int, long | integer | 2 17 -5 | ||
float | floating-point number | 3.14159 | ||
double | double precision floating-point | 3.14159265358979 |
There are other types (e.g., unsigned long
float x; char ch = 'A'; int j = i;
❖ Aggregate Data Types |
Families of aggregate data types:
char s[50]
int v[100]
struct student { char name[30]; int zID; }
❖ Arrays |
An array is
int a[20]; // array of 20 integer values/variables char b[10]; // array of 10 character values/variables
❖ Arrays (cont) |
Larger example:
#define MAX 20 int i; // integer value used as index int fact[MAX]; // array of 20 integer values fact[0] = 1; for (i = 1; i < MAX; i++) { fact[i] = i * fact[i-1]; }
❖ Sidetrack: C Style |
We can define a symbolic constant at the top of the file
#define SPEED_OF_LIGHT 299792458.0 #define ERROR_MESSAGE "Out of memory.\n"
Symbolic constants make the code easier to understand and maintain
#define NAME replacement_text
NAME
replacement_text
NAME
"…"
❖ Sidetrack: C Style (cont) |
UNSW Computing provides a style guide for C programs:
C Coding Style Guide (http://wiki.cse.unsw.edu.au/info/CoreCourses/StyleGuide)
Not strictly mandatory for COMP9024, but very useful guideline
Style considerations that do matter for your COMP9024 assignments:
❖ Strings |
"String" is a special word for an array of characters
'\0'
char
If a character array s[11]
"hello"
0 1 2 3 4 5 6 7 8 9 10 --------------------------------------------- | h | e | l | l | o | \0| | | | | | ---------------------------------------------
❖ Array Initialisation |
Arrays can be initialised by code, or you can specify an initial set of values in declaration.
Examples:
char s[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; char t[6] = "hello"; int arr[5] = {5, 4, 3, 2, 1}; int vec[] = {5, 4, 3, 2, 1};
In the last case, C infers the array length (as if we declared vec[5]
❖ Sidetrack: Reading Variable Values with scanf() atoi() |
Formatted input read from standard input (e.g. keyboard)
scanf(format-string, expr1, expr2, …);
Converting string into integer
int value = atoi(string);
Example:
#include <stdio.h> // includes definition of BUFSIZ (usually =512) and scanf() #include <stdlib.h> // includes definition of atoi() ... char str[BUFSIZ]; int n; printf("Enter a string: "); scanf("%s", str); n = atoi(str); printf("You entered: \"%s\". This converts to integer %d.\n", str, n);
Enter a string: 9024 You entered: "9024". This converts to integer 9024.
❖ Arrays and Functions |
When an array is passed as a parameter to a function
int total, vec[20]; … total = sum(vec);
Within the function …
❖ Arrays and Functions (cont) |
Since functions do not know how large an array is:
int total, vec[20]; … total = sum(vec,20);
Also, since the function doesn't know the array size, it can't check whether we've written an invalid subscript (e.g. in the above example 100 or 20).
❖ Exercise: Arrays and Functions |
Implement a function that sums up all elements in an array.
Use the prototype
int sum(int[], int)
int sum(int vec[], int dim) { int i, total = 0; for (i = 0; i < dim; i++) { total += vec[i]; } return total; }
❖ Multi-dimensional Arrays |
Examples:
Note: q[0][1]==2.7
r[1][3]==8
Multi-dimensional arrays can also be initialised (must provide # of columns):
float q[][2] = { { 0.5, 2.7 }, { 3.1, 0.1 } };
❖ Sidetrack: Defining New Data Types |
C allows us to define new data type (names) via typedef
typedef ExistingDataType NewTypeName;
Examples:
typedef float Temperature; typedef int Matrix[20][20];
❖ Sidetrack: Defining New Data Types (cont) |
Reasons to use typedef
Temperature
Dollars
Volts
typedef float Real; Real complex_calculation(Real a, Real b) { Real c = log(a+b); … return c; }
Matrix
❖ Structures |
A structure
struct
typedef struct { char name[30]; int zID; } StudentT;
❖ Structures (cont) |
One structure can be nested inside another:
typedef struct {
int day, month;
} DateT;
typedef struct {
int hour, minute;
} TimeT;
typedef struct {
char plate[7]; // e.g. "DSA42X"
double speed;
DateT d;
TimeT t;
} TicketT;
❖ Structures (cont) |
Possible memory layout produced for TicketT
--------------------------------- | D | S | A | 4 | 2 | X | \0| | 7 bytes + 1 padding --------------------------------- | 68.4 | 8 bytes --------------------------------- | 2 | 6 | 8 bytes --------------------------------- | 20 | 45 | 8 bytes ---------------------------------
Note: padding is needed to ensure that
plate
Don't normally care about internal layout, since fields are accessed by name.
❖ Structures (cont) |
Defining a structured data type itself does not allocate any memory
We need to declare a variable in order to allocate memory
DateT christmas;
The components of the structure can be accessed using the "dot" operator
christmas.day = 25; christmas.month = 12;
❖ Structures (cont) |
With the above TicketT
#define NUM_TICKETS 1500 typedef struct {…} TicketT; TicketT tickets[NUM_TICKETS]; // array of structs // Print all speeding tickets in a readable format for (i = 0; i < NUM_TICKETS; i++) { printf("%s %6.2f %d/%d at %d:%d\n", tickets[i].plate, tickets[i].speed, tickets[i].d.day, tickets[i].d.month, tickets[i].t.hour, tickets[i].t.minute); } // Sample output: // // DSA42X 68.40 2/6 at 20:45
❖ Structures (cont) |
A structure can be passed as a parameter to a function:
void print_date(DateT d) { printf("%d/%d\n", d.day, d.month); } int is_winter(DateT d) { return ( (d.month >= 6) && (d.month <= 8) ); }
❖ Abstract Data Types |
A data type is …
❖ Abstract Data Types (cont) |
Users of the ADT see only the interface
Builders of the ADT provide an implementation
ADT interface provides
❖ Abstract Data Types (cont) |
ADT interfaces are opaque
❖ Stack vs Queue |
Queue, aka FIFO data structure (first in, first out)
Insert and delete are called enqueue and dequeue
Applications:
❖ Compilers |
Compilers are programs that
gcc
❖ Compilers (cont) |
Compilation/linking with gcc
gcc -c Stack.c produces Stack.o, from Stack.c and Stack.h gcc -c brackets.c produces brackets.o, from brackets.c and Stack.h gcc -o rbt brackets.o Stack.o links brackets.o, Stack.o and libraries producing executable program called rbt
Note that stdio,assert
gcc
-c
-o
❖ Summary |
gcc
char
short
int
long
float
double
if
else
while
for
Produced: 2 Aug 2024