gccprintf()abscanf()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:
ifwhilefor
❖ 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:
gccgcc -Wall prog.c
which reports all warnings to anything it finds that is potentially wrong or non ANSI compliant
-ogcca.outgcc -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 ab |
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 statementsexpressionsome statements1expressionsome statements2expression{ }
❖ 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 | ab | |
a >= b | ab | |
a < b | ab | |
a <= b | ab | |
a == b | ab | |
a != b | ab | |
a && b | ab | |
a || b | ab | |
! a | logical not a |
A relational or logical expression evaluates to 10
❖ 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;
}
expr1expr2expr3
| 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_typevoidparametersvoid
❖ 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 | 217-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
NAMEreplacement_textNAME"…"
❖ 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.7r[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
TemperatureDollarsVolts
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
plateDon'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 |
gcccharshortintlongfloatdoubleifelsewhilefor
Produced: 2 Aug 2024