CS1010E Lecture 1
Basics of C Programming
with Numerical Computations
Henry Chia (hchia@[Link])
Semester 1 2017 / 2018
1 / 24
Lecture Outline
Edit-compile-run cycle
Declaring variables
Program input/output
Assignment statement
Arithmetic with typed-expressions
Types of errors
Program style
2 / 24
Edit-Compile-Run Cycle
Edit
– vim editor to create .c
source file
Compile (include linking)
– gcc compiler generates
[Link] or [Link]
Run
– loads the executable
– ./[Link] or ./[Link]
3 / 24
Motivating Example
Given x (miles), convert to y (kms) using
y = kx
– x and y and variables;
– k is a constant of proportionality ≈ 1.609;
Given a value for x, what is y?
y x
= 1.609 ×
4 / 24
Sample C Program
5 / 24
The main Function
/* preprocessor directives */
int main(void) { Memory
/* declarations (memory) */
6
/* statements (process) */ ?
Process
return 0;
}
Program execution must begin with the main function
The statement
return 0;
in the main function signifies the successful termination of
the program
6 / 24
Declaring Variables – Defining Memory
type
– integer: int
– floating point (double precision): double
value
– Examples of integer values: 1, 0, -100
– Examples of floating point values: 1.0, 0.123, -1.23
identifier – a meaningful name (case-sensitive)
– must consist only of letters, digits, and underscores
– cannot begin with a digit
– cannot be a reserved word
– avoid using standard identifier names
7 / 24
Declaring Variables – Syntax
declaration
type variable-id ;
= value
,
type
int
double
Examples:
– Unknown value: int x;
– Initialized: int height=3;
– Multiple: double r1, r2 = 1.23, r3, radius = 4.0;
It is advisable to always declare and initialize variables to
an initial value (typically zero).
8 / 24
Declaring Variables – Example
/* preprocessor directives */
int main(void) {
double miles, kms; /* distances in miles and kilometers */
/* statements */
return 0;
}
miles ? kms ?
/* preprocessor directives */
int main(void) {
double miles = 0, kms = 0; /* distances in miles and kilometers */
/* statements */
return 0;
}
miles 0 kms 0
9 / 24
Program Input – scanf <stdio.h>
scanf-statement
scanf ( format-spec , & variable-id ) ;
format-spec
" %d "
%lf
Requires preprocessor directive: #include <stdio.h>
Conversion specifiers %d for integer; %f for floating-point
Reading(scanf) a floating-point value(%lf) into(&) miles:
scanf("%lf", &miles);
Reading two integers: scanf("%d%d", &miles, &kms);
10 / 24
Program Input – Example
#include <stdio.h>
int main(void) {
double miles = 0, kms = 0; /* distances in miles and kilometers */
/* Get the distance in miles */
scanf("%lf", &miles); /* assume 10.0 is read as input */
return 0;
}
miles 0 kms 0
10.0
11 / 24
Program Output – printf <stdio.h>
printfStatement
printf ( formatString ) ;
, expr
formatString
" text "
%d expr
var-id
%f
value
\n
Requires preprocessor directive: #include <stdio.h>
%d and %f as placeholders to output int and double values
12 / 24
Program Output – Example
#include <stdio.h>
int main(void) {
double miles = 0, kms = 0; /* distances in miles and kms */
/* Get the distance in miles */
printf("Enter the distance in miles> ");
scanf("%lf", &miles); /* assume 10.0 is read as input */
/* Verify the distance entered */
printf("The distance entered is %f miles\n", miles);
return 0;
}
miles 0 kms 0
10.0
How about the following?
printf("The distance entered is %d miles\n", miles);
13 / 24
Assignment Statement
Set a variable to the value of an expression:
statement assignment-statement
assignment-statement variable-id = expr ;
scanf-statement
expr
variable-id
printf-statement
value
expr op expr
( expr )
14 / 24
Arithmetic
Expression involving an operation over two other expressions
Arithmetic operations: +, -, *, /, % (remainder or modulo)
Example expression involving operators:
Operations over expressions are grouped in order of
1. Precedence: 2+3*4 → (2+(3*4)) since * before +
2. Associativity: 2*3*4 → ((2*3)*4) since * is L→R
Use parentheses ( ) to group explicitly
15 / 24
Typed Expressions
All expressions are typed. In particular, for op ∈ {+, -, *, /}
– exprint op exprint → exprint
– expri op exprj → exprdouble if i or j is double
Exercise:
– 22+7 → – 22/7.0 →
– 22.0-7.0 → – 22/7 → (quotient)
– 22.0*7 → – 22%7 → (remainder)
% operates over integers only
What happens when v = 34 πr3 is written as
v = 4/3 * 3.142 * r * r * r;
16 / 24
Type Conversions
Numeric conversions:
– Safe
⊲ 1.0 * exprint → exprdouble
⊲ (double) exprint → exprdouble
– Unsafe:
⊲ (int) exprdouble → exprint
Examples:
– 1.0*22/7 → 22.0/7 → 3.142857..
– (double)22/7 → 22.0/7 → 3.142857..
– 1.0*(22/7) → 1.0*3 → 3.0
– (double)(22/7) → (double)3 → 3.0
– (int)(22.0/7) → (int)3.142857.. → 3
17 / 24
Typed Assignment
Expressions are evaluated before assignment. Consider:
– typed expression evaluation, then
– possible type conversion during assignment
Study the following program fragment:
int miles=3;
double kms;
miles = miles * 1.609;
kms = miles;
What are the values stored in the variables miles and kms?
miles(int) 3 kms(double) ?
18 / 24
Sample Program
#include <stdio.h>
int main(void) {
double miles=0, kms=0; /* distances in miles and kms */
/* Get the distance in miles */
printf("Enter the distance in miles> ");
scanf("%lf", &miles); /* assume 10.0 is read as input */
/* Convert the distance to kilometers */
kms = 1.609 * miles;
/* Display the distance in kilometers */
printf("%f miles is equivalent to %f kms\n", miles, kms);
return 0;
}
miles 0 kms 0
10.0 16.09
19 / 24
Constant
A named constant can be used in place of a value
#define preprocessor directive for defining constants
No variable is declared for the constant
#include <stdio.h>
#define KMS_PER_MILE 1.609
int main(void) {
double miles=0, kms=0; /* distances in miles and kms */
/* Get the distance in miles */
printf("Enter the distance in miles> ");
scanf("%lf", &miles); /* assume 10.0 is read as input */
/* Convert the distance to kilometers */
kms = KMS_PER_MILE * miles;
/* Display the distance in kilometers */
printf("%f miles is equivalent to %f kms\n", miles, kms);
return 0;
}
20 / 24
Errors
Compile error
Edit Program
– Syntax errors or inconsistencies that
are detected by the compiler
Compile y
Runtime error
Error?
n
– Program compiles, starts to execute
Runtime
but terminates prematurely
y
Error?
Logical error
n
Logical y
– Program compiles, executes and
Error? terminates, but with wrong result
n
21 / 24
Program Style
/*
This program converts miles to kilometers.
*/
#include <stdio.h>
int main(void) {
/* statements within a block are indented */
}
Comments:
– Use block comments: /* ... */
– Use comments, only when necessary
– The header comment is always useful
Spaces:
– Blank spaces to improve statement readability
– Blank lines to separate different sections of code
– Indentation to define blocks of code { ... }
22 / 24
Program Style
Compare the following programs. Which is more readable?
/*
This program converts miles to kilometers.
*/
#include <stdio.h>
#define K 1.609 /* kms per mile */
int main(void) {
double x=0, y=0; /* x miles; y kms */ /*
This program converts miles to kilometers.
/* Get the distance in miles */ */
printf("Enter the distance in miles> "); #include <stdio.h>
scanf("%lf", &x);
#define KMS_PER_MILE 1.609
/* Convert the distance to kilometers */ int main(void) {
y = K * x; double miles=0, kms=0;
/* Display the distance in kilometers */ printf("Enter the distance in miles> ");
printf("%f miles = %f kms\n", x, y); scanf("%lf", &miles);
return 0; kms = KMS_PER_MILE * miles;
}
printf("%f miles = %f kms\n", miles, kms);
return 0;
}
23 / 24
Lecture Summary
Importance of type-awareness in C programming
Variables declared with appropriate type according to their
usage within the program
When writing program instructions, keep in mind the type of
variables/values and its effect on the instructions
Maintain type-consistency with operations, assignments,
input and output
Handle any instance of type-inconsistency carefully
24 / 24