INF 131 C-Programming
INF 131 C-Programming
2
C Programming
Introduction
• Why Learn C?
3
C Programming
Why Learn C?
4
C Programming
C Program Structure
5
C Programming
Canonical First Program
#include <stdio.h>
main()
{
/* My first program */
printf("Hello World! \n");
}
6
C Programming
Canonical First Program Continued
#include <stdio.h>
main()
{
/* My first program */
printf("Hello World! \n");
}
7
C Programming
More on the Canonical First Program
#include <stdio.h>
main()
{
/* My first program */
printf("Hello World! \n");
}
/* My first program */
• Comments can be inserted into C programs by bracketing text with the /* and
*/ delimiters. As will be discussed later, comments are useful for a variety of
reasons. Primarily they serve as internal documentation for program structure
and functionality.
9
C Programming
Header Files
11
C Programming
Comments
• Note that the /* opens the comment field and the */ closes the comment
field. Comments may span multiple lines. Comments may not be nested one
inside the another.
/* this is a comment. /* this comment is inside */ wrong */
12
C Programming
Why use comments?
Best programmers comment as they write the code, not after the fact.
13
C Programming
Symbolic Constants
#include <stdio.h>
#define TAXRATE 0.10
main () {
float balance;
float tax;
balance = 72.10;
tax = balance * TAXRATE;
printf("The tax on %.2f is %.2f\n",balance, tax);
}
The tax on 72.10 is 7.21
• The whole point of using #define in your programs is to make them easier
to read and modify. Considering the above program as an example, what
changes would you need to make if the TAXRATE was changed to 20%?
15
C Programming
Use of Symbolic Constants
• Obviously, the answer is one, where the #define statement which declares
the symbolic constant and its value occurs. You would change it to read
#define TAXRATE 0.20
• Without the use of symbolic constants, you would hard code the value 0.20
in your program, and this might occur several times (or tens of times).
16
C Programming
Variables, Expressions, and Operators
17
C Programming
Declaring Variables
18
C Programming
Basic Format
• where data_type is one of the four basic types, an integer, character, float,
or double type. Examples are
int i,j,k;
float length,height;
char midinit;
19
C Programming
Basic Data Types: INTEGER
• INTEGER: These are whole numbers, both positive and negative. Unsigned
integers(positive values only) are also supported. In addition, there are short
and long integers. These specialized integer types will be discussed later.
int
int age;
20
C Programming
Basic Data Types: FLOAT
• FLOATING POINT: These are numbers which contain fractional parts, both
positive and negative, and can be written in scientific notation.
float
• Typical floating point values are 1.73 and 1.932e5 (1.932 x 105). An example
of declaring a float variable called x is
float x;
21
C Programming
Basic Data Types: DOUBLE
• DOUBLE: These are floating point numbers, both positive and negative,
which have a higher precision than float variables.
double
double voltage;
22
C Programming
Basic Data Types: CHAR
char
• Typical character values might be the letter A, the character 5, the symbol “,
etc. An example of declaring a character variable called letter is
char letter;
23
C Programming
Expressions and Statements
a + b
3.0*x - 9.66553
tan(angle)
sum = x + y + z;
printf("Go Buckeyes!");
24
C Programming
The Assignment Operator
• In C, the assignment operator is the equal sign = and is used to give a variable
the value of an expression. For example:
i=0;
x=34.8;
sum=a+b;
slope=tan(rise/run);
midinit='J';
j=j+3;
• When used in this manner, the equal sign should be read as “gets”. Note that
when assigning a character value the character should be enclosed in single
quotes.
25
C Programming
The Assignment Operator Evaluation
a=7;
• two things actually occur. The integer variable a gets the value of 7, and the
expression a=7 evaluates to 7. This allows a shorthand for multiple
assignments of the same value to several variables in a single statement. Such
as
x=y=z=13.0;
26
C Programming
Initializing Variables
• C Variables may be initialized with a value when they are declared. Consider
the following declaration, which declares an integer variable count which is
initialized to 10.
• In general, the user should not assume that variables are initialized to some
default value “automatically” by the compiler. Programmers must ensure that
variables have proper values before they are used in expressions.
27
C Programming
Initializing Variables Example
• The following example illustrates the two methods for variable initialization:
#include <stdio.h>
main () {
int sum=33;
float money=44.12;
char letter;
double pressure;
letter='E'; /* assign character value */
pressure=2.01e-10; /*assign double value */
printf("value of sum is %d\n",sum);
printf("value of money is %f\n",money);
printf("value of letter is %c\n",letter);
printf("value of pressure is %e\n",pressure);
}
• which produces the following output:
value of sum is 33
value of money is 44.119999
value of letter is E
value of pressure is 2.010000e-10
28
C Programming
Arithmetic Operators
Negation - Modulus %
Multiplication * Addition +
Division / Subtraction -
• When the / operator is used to perform integer division the resulting integer
is obtained by discarding (or truncating) the fractional part of the actual
floating point value. For example:
1/2 0
3/2 1
• The modulus operator % only works with integer operands. The expression
a%b is read as “a modulus b” and evaluates to the remainder obtained after
dividing a by b. For example
7 % 2 1
12 % 3 0
29
C Programming
Increment/Decrement Operators
• In C, specialized operators have been set aside for the incrementing and
decrementing of integer variables. The increment and decrement operators are
++ and -- respectively. These operators allow a form of shorthand in C:
30
C Programming
Prefix versus Postfix
• The difference between prefix and postfix forms shows up when the operators
are used as part of a larger expression.
– If ++k is used in an expression, k is incremented before the expression is
evaluated.
– If k++ is used in an expression, k is incremented after the expression is
evaluated.
• Assume that the integer variables m and n have been initialized to zero. Then
in the following statement
a=++m + ++n; m 1, n 1, then a 2
• whereas in this form of the statement
a=m++ + n++; a 0 then m 1, n 1
31
C Programming
Advanced Assignment Operators
32
C Programming
Precedence & Associativity of Operators
- ++ -- R L
* / % L R
+ - L R
= R L
33
C Programming
Precedence & Associativity of Operators Examples
1 + 2 * 3 - 4
1 + 6 - 4
7 - 4
3
• The programmer can use parentheses to override the hierarchy and force a
desired order of evaluation. Expressions enclosed in parentheses are
evaluated first. For example:
(1 + 2) * (3 - 4)
3 * -1
-3
34
C Programming
The int Data Type
• A typical int variable is in the range +-32,767. This value differs from
computer to computer and is thus machine-dependent. It is possible in C to
specify that an integer be stored in more memory locations thereby increasing
its effective range and allowing very large integers to be stored. This is
accomplished by declaring the integer variable to have type long int.
long int national_debt;
• long int variables typically have a range of +-2,147,483,648.
• There are also short int variables which may or may not have a smaller
range than normal int variables. All that C guarantees is that a short int
will not take up more bytes than int.
• There are unsigned versions of all three types of integers. Negative integers
cannot be assigned to unsigned integers, only a range of positive values. For
example
unsigned int salary;
• typically has a range of 0 to 65,535.
35
C Programming
The float and double Data Types
float
double
long double
• In general, the accuracy of the stored real values increases as you move down
the list.
36
C Programming
The char Data Type
• Variables of type char take up exactly one byte in memory and are used to
store printable and non-printable characters. The ASCII code is used to
associate each character with an integer (see next page). For example the
ASCII code associates the character ‘m’ with the integer 109. Internally, C
treats character variables as integers.
37
C Programming
ASCII Character Set
Ctrl Decimal Code Decimal Char Decimal Char Decimal Char Decimal Char
^@ 0 NUL 32 sp 32 sp 64 @ 96 `
^A 1 SOH 33 ! 33 ! 65 A 97 a
^B 2 STX 34 " 34 " 66 B 98 b
^C 3 ETX 35 # 35 # 67 C 99 c
^D 4 EOT 36 $ 36 $ 68 D 100 d
^E 5 ENQ 37 % 37 % 69 E 101 e
^F 6 ACK 38 & 38 & 70 F 102 f
^G 7 BEL 39 39 71 G 103 g
^H 8 BS 40 ( 40 ( 72 H 104 h
^I 9 HT 41 ) 41 ) 73 I 105 I
^J 10 LF 42 * 42 * 74 J 106 j
^K 11 VT 43 + 43 + 75 K 107 k
^L 12 FF 44 , 44 , 76 L 108 l
^M 13 CR 45 - 45 - 77 M 109 m
^N 14 SOH 46 . 46 . 78 N 110 n
^O 15 ST 47 / 47 / 79 O 111 o
^P 16 SLE 48 0 48 0 80 P 112 p
^Q 17 CS1 49 1 49 1 81 Q 113 q
^R 18 DC2 50 2 50 2 82 R 114 r
^S 19 DC3 51 3 51 3 83 S 115 s
^T 20 DC4 52 4 52 4 84 T 116 t
^U 21 NAK 53 5 53 5 85 U 117 u
^V 22 SYN 54 6 54 6 86 V 118 v
^W 23 ETB 55 7 55 7 87 W 119 w
^X 24 CAN 56 8 56 8 88 X 120 x
^Y 25 EM 57 9 57 9 89 Y 121 y
^Z 26 SIB 58 : 58 : 90 Z 122 z
^[ 27 ESC 59 ; 59 ; 91 [ 123 {
^\ 28 FS 60 < 60 < 92 \ 124 |
^] 29 GS 61 = 61 = 93 ] 125 }
^^ 30 RS 62 > 62 > 94 ^ 126 ~
^_ 31 US 63 ? 63 ? 95 _ 127 DEL
38
C Programming
Automatic Type Conversion
• How does C evaluate and type expressions that contain a mixture of different
data types? For example, if x is a double and i an integer, what is the type of
the expression
x+i
• In this case, i will be converted to type double and the expression will
evaluate as a double. NOTE: the value of i stored in memory is unchanged.
A temporary copy of i is converted to a double and used in the expression
evaluation.
• This automatic conversion takes place in two steps. First, all floats are
converted to double and all characters and shorts are converted to ints. In the
second step “lower” types are promoted to “higher” types. The expression
itself will have the type of its highest operand. The type hierarchy is as
follows
long double
double
unsigned long
long
unsigned
int 39
C Programming
Automatic Type Conversion with Assignment Operator
x=i;
i=x;
40
C Programming
Type Casting
(double) i
(type) expression
• Some examples,
(char) 3 + 'A'
x = (float) 77;
(double) k * 57
41
C Programming
Input and Output
• Basic Output
• printf Function
• Format Specifiers Table
• Common Special Characters for Cursor Control
• Basic Output Examples
• Basic Input
• Basic Input Example
42
C Programming
Basic Output
43
C Programming
printf Function
44
C Programming
Format Specifiers Table
• The following table show what format specifiers should be used with what
data types:
Specifier Type
%c character
%d decimal integer
%o octal integer (leading 0)
%x hexadecimal integer (leading 0x)
%u unsigned decimal integer
%ld long int
%f floating point
%lf double or long double
%e exponential floating point
%s character string
45
C Programming
Common Special Characters for Cursor Control
\n newline
\t tab
\r carriage return
\f form feed
\v vertical tab
\b backspace
\” Double quote (\ acts as an “escape” mark)
\nnn octal character value
46
C Programming
Basic Output Examples
#include <stdio.h>
main() {
int pin;
printf("Please type in your PIN\n");
scanf("%d",&pin);
printf("Your access code is %d\n",pin);}
• The format identifier used for a specific C data type is the same as for the
printf statement, with one exception. If you are inputting values for a
double variable, use the %lf format identifier.
• White space is skipped over in the input stream (including carriage return)
except for character input. A blank is valid character input.
49
C Programming
Program Looping
50
C Programming
Introduction to Program Looping
51
C Programming
Relational Operators
• Our first use of these operators will be to set up the condition required to
control a conditional loop. Relational operators allow the comparison of two
expressions. Such as
a < 4
• which reads a “less than” 4. If a is less than 4, this expression will evaluate to
TRUE. If not it will evaluate to FALSE.
52
C Programming
Relational Operators Table
53
C Programming
for Loop
• The for loop is C’s form of an unconditional loop. The basic syntax of the for
statement is,
for (initialization expression; test expr; increment expr)
program statement;
• Here is an example
sum=10;
for (i=0; i<6; ++i)
sum = sum+i;
• The operation for the loop is as follows
1) The initialization expression is evaluated.
2) The test expression is evaluated. If it is TRUE, body of the loop is executed. If it is
FALSE, exit the for loop.
3) Assume test expression is TRUE. Execute the program statements making up the
body of the loop.
4) Evaluate the increment expression and return to step 2.
5) When test expression is FALSE, exit loop and move on to next line of code.
54
C Programming
for Loop Example
• Sample Loop:
sum = 10;
for (i=0; i<6; ++i)
sum=sum+i;
for ( 11 ; 22 ; 44 )
{
TRUE
} 33
55 FALSE
56
C Programming
General Comments about for Loop
– If there are multiple C statements that make up the loop body, enclose them in
brackets (USE INDENTATION FOR READABILITY)
– Any of the control expressions can be omitted (but always need the two
semicolons for syntax sake).
product=1;
for (i=1;i<=6;)
product*=i++;
57
C Programming
General Comments about for Loop Continued
– Since test performed at beginning of loop, body may never get executed
x=10;
for (y=10;y!=x;++y)
printf ("%d",y);
58
C Programming
while Loop
while(control expression)
program statement;
59
C Programming
while Loop Example
60
C Programming
do while Loop
61
C Programming
do while Loop Example
62
C Programming
do while Loop Example: Error Checking
• The user will remain in this loop continually being prompted for and entering
integers until a positive one is entered. A sample session using this loop looks
like this
63
C Programming
Decision Making Statements
64
C Programming
Introduction to Decision Making Statements
65
C Programming
if Statement
if (control expression)
program statement;
• Because of the way in which floating point types are stored, it makes it very
difficult to compare such types for equality. Avoid trying to compare real
variables for equality, or you may encounter unpredictable results.
66
C Programming
if Statement Examples
– Customize output
if (grade>=90)
printf("\nCongratulations!");
printf("\nYour grade is "%d",grade);
– Nested ifs
if (letter>='A')
if (letter>='Z')
printf("The letter is a capital \n");
67
C Programming
if-else Statement
• Used to decide between two courses of action. The syntax of the if-else
statement is
if (expression)
statement1;
else
statement2;
• If the expression is TRUE, statement1 is executed; statement2 is
skipped.
• If the expression is FALSE, statement2 is executed; statement1 is
skipped.
• Some examples
if (x<y) if (letter == 'e') {
min=x; ++e_count;
else ++vowel_count; }
min=y; else
++other_count;
68
C Programming
if-else Ladder
• What if we wanted to extend the task shown in the previous example and not
just counts how many e’s there are in a piece of text, but also make counts of
the other vowels? This is possible by nesting if-else statements together to
make what is called an if-else ladder. For example, consider the following
code if (letter == 'a')
++a_count;
else if (letter == 'e')
++e_count;
else if (letter == 'i')
++i_count;
else if (letter == 'o')
++o_count;
else if (letter == 'u')
++u_count;
else
++const_count;
• As soon as a TRUE control expression is found, the statement associated with
it is executed and the rest of the ladder is bypassed. If no control expressions
are found to be TRUE, the final else statement acts as a default.
69
C Programming
switch Statement
• The switch statement is a better way of writing a program which employs an
if-else ladder. It is C’s built-in multiple branch decision statement. The
syntax for the switch statement is as follows:
switch (integer expression) {
case constant1:
statement1;
break;
case constant2:
statement2;
break;
...
default:
statement;
}
• The keyword break should be included at the end of each case statement. In
general, whenever a break statement is encountered in C, it interrupts the
normal flow of control. In the switch statement, it causes an exit from the
switch shunt. The default clause is optional. The right brace at the end
marks the end of switch statement.
70
C Programming
switch Statement Example
switch(n) {
case 12:
printf("value is 12\n");
break;
case 25:
printf("value is 25\n");
break;
case 99:
printf("value is 99\n");
break;
default:
printf("number is not part of the Xmas date\n");
}
71
C Programming
switch Statement Operation
72
C Programming
switch Statement Example: Characters
switch(ch) {
case 'a':
++a_count;
break;
case 'b':
++b_count;
break;
case 'c':
case 'C': /* multiple values, same statements */
++c_count; }
73
C Programming
switch Statement Example: Menus
switch(choice) {
case 'S':
check_spelling();
break;
case 'C':
correct_errors();
break;
case 'D':
display_errors();
break;
default:
printf("Not a valid option\n"); }
74
C Programming
Conditional Operator
75
C Programming
Conditional Operator Examples
s = (x<0) ? -1 : x*x;
• If x is less than zero, then s=-1. If x is greater than or equal to zero, then
s=x*x.
• The following code sets the logical status of the variable even
if (number%2==0)
even=1;
else
even=0;
even=(number%2==0) ? 1 : 0;
76
C Programming
Logical Operators
77
C Programming
Logical Operators Precedence
• The negation operator, !, has the highest precedence and is always performed
first in a mixed expression. The remaining logical operators have a precedence
below relational operators.
done=0;
while(!done) {
…
}
78
C Programming
Array Variables
79
C Programming
Introduction to Array Variables
• Arrays are a data structure which hold multiple values of the same data type.
Arrays are an example of a structured variable in which 1) there are a
number of pieces of data contained in the variable name, and 2) there is an
ordered method for extracting individual data items from the whole.
• Consider the case where a programmer needs to keep track of the ID numbers
of people within an organization. Her first approach might be to create a
specific variable for each user. This might look like
• It becomes increasingly more difficult to keep track of the IDs as the number
of variables increase. Arrays offer a solution to this problem.
80
C Programming
Array Variables Example
• The replacement of the previous example using an array looks like this:
int id[3]; /* declaration of array id */
id[0] = 101;
id[1] = 232;
id[2] = 231;
• In the first line, we declared an array called id, which has space for three
integer variables. Each piece of data in an array is called an element. Thus,
array id has three elements. After the first line, each element of id is
initialized with an ID number.
81
C Programming
Array Elements
• where i is called the index of the array element. The array element id[1] is
just like any normal integer variable and can be treated as such.
82
C Programming
Declaring Arrays
• Arrays may consist of any of the valid data types. Arrays are declared along
with all other variables in the declaration section of the program and the
following syntax is used
type array_name[n];
int final[160];
float distance[66];
• During declaration consecutive memory locations are reserved for the array
and all its elements. After the declaration, you cannot assume that the elements
have been initialized to zero. Random junk is at each element’s memory
location.
83
C Programming
Initializing Arrays during Declaration
• If the declaration of an array is preceded by the word static, then the array can
be initialized at declaration. The initial values are enclosed in braces. e.g.,
1 If the list of initial elements is shorter than the number of array elements, the
remaining elements are initialized to zero.
2 If a static array is not initialized at declaration manually, its elements are
automatically initialized to zero.
3 If a static array is declared without a size specification, its size equals the
length of the initialization list. In the following declaration, a has size 5.
• Multi-dimensional arrays have two or more index values which are used to
specify a particular element in the array. For this 2D array element,
image[i][j]
• the first index value i specifies a row index, while j specifies a column index.
Declaring multi-dimensional arrays is similar to the 1D case:
86
C Programming
Multi-Dimensional Array Illustration
• In C, 2D arrays are stored by row. Which means that in memory the 0th row
is put into its memory locations, the 1st row then takes up the next memory
locations, the 2nd row takes up the next memory locations, and so on.
87
C Programming
Initializing Multi-Dimensional Arrays
88
C Programming
Using Multi-Dimensional Arrays
• Again, as with 1D arrays, for loops and multi-dimensional arrays often work
hand-in-hand. In this case, though, loop nests are what is most often used.
Some examples
Summation of array elements
double temp[256][3000],sum=0;
int i,j;
for (i=0; i<256; ++i)
for (j=0; j<3000; ++j)
sum += temp[i][j];
Trace of Matrix
int voxel[512][512][512];
int i,j,k,trace=0;
for (i=0; i<512; ++i)
for (j=0; j<512; ++j)
for (k=0; k<512; ++k)
if (i==j && j==k)
trace += voxel[i][j][k];
89
C Programming
Strings
• Arrays of Characters
• Initializing Strings
• Copying Strings
• String I/O Functions
• More String Functions
• More String Functions Continued
• Examples of String Functions
• Character I/O Functions
• More Character Functions
• Character Functions Example
90
C Programming
Arrays of Characters
91
C Programming
Initializing Strings
char name[34];
name = "Erickson"; /* ILLEGAL */
scanf("%s",name);
• Note that the address operator & is not needed for inputting a string variable
(explained later). The end-of-string character will automatically be appended
during the input process.
92
C Programming
Copying Strings
93
C Programming
String I/O Functions
• There are special functions designed specifically for string I/O. They are
gets(string_name);
puts(string_name);
• The gets function reads in a string from the keyboard. When the user hits a
carriage return the string is inputted. The carriage return is not part of the
string and the end-of-string character is automatically appended.
• The function puts displays a string on the monitor. It does not print the end-
of-string character, but does output a carriage return at the end of the string.
Here is a sample program demonstrating the use of these functions:
char phrase[100];
printf("Please enter a sentence\n");
gets(phrase);
puts(phrase);
• A sample session would look like this
Please enter a sentence
The best lack all conviction, while the worst are passionate.
The best lack all conviction, while the worst are passionate.
94
C Programming
More String Functions
• Included in the string.h are several more string-related functions that are
free for you to use. Here is a brief table of some of the more popular ones
Function Operation
strcat Appends to a string
strchr Finds first occurrence of a given character
strcmp Compares two strings
strcmpi Compares two, strings, non-case sensitive
strcpy Copies one string to another
strlen Finds length of a string
strncat Appends n characters of string
strncmp Compares n characters of two strings
strncpy Copies n characters of one string to another
strnset Sets n characters of string to a given character
strrchr Finds last occurrence of given character in string
strspn Finds first substring from given character set in string
95
C Programming
More String Functions Continued
• Most of the functions on the previous page are self-explanatory. The UNIX
man pages provide a full description of their operation. Take for example,
strcmp which has this syntax
strcmp(string1,string2);
• It returns an integer that is less than zero, equal to zero, or greater than zero
depending on whether string1 is less than, equal to, or greater than
string2.
96
C Programming
Examples of String Functions
Function Result
strlen(s1) 15 /* e-o-s not counted */
strlen(s2) 9
strcmp(s1,s2) negative number
strcmp(s3,s2) positive number
strcat(s2,” tonight”) blue moon tonight
97
C Programming
Character I/O Functions
• Analogous to the gets and puts functions there are the getchar and putchar
functions specially designed for character I/O. The following program
illustrates their use:
#include <stdio.h>
main() {
int n; char lett;
putchar('?');
n=45;
putchar(n-2);
lett=getchar();
putchar(lett);
putchar('\n');
}
98
C Programming
More Character Functions
99
C Programming
Character Functions Example
• In the following program, character functions are used to convert a string to all
uppercase characters:
#include <stdio.h>
#include <ctype.h>
main() {
char name[80];
int loop;
printf ("Please type in your name\n");
gets(name);
for (loop=0; name[loop] !=0; loop++)
name[loop] = toupper(name[loop]);
printf ("You are %s\n",name);
}
100
C Programming
Math Library Functions
• “Calculator-class” Functions
• Using Math Library Functions
101
C Programming
“Calculator-class” Library Functions
• You may have started to guess that there should be a header file called
math.h which contains definitions of useful “calculator-class” mathematical
functions. Well there is! Some functions found in math.h are
acos asin atan
cos sin tan
cosh sinh tanh
exp log log10
pow sqrt
ceil floor
erf
gamma
j0 j1 jn
y0 y1 yn
102
C Programming
Using Math Library Functions
double c, a, b
c=sqrt(pow(a,2)+pow(b,2));
• Typically, to use the math functions declared in the math.h include file, the
user must explicitly load the math library during compilation. On most
systems the compilation would look like this:
cc myprog.c -lm
103
C Programming
User-defined Functions
104
C Programming
Introduction to User-defined Functions
• But can the user define and use their own functions? Absolutely YES!
105
C Programming
Reasons for Use
– Don’t have to repeat the same block of code many times in your code. Make
that code block a function and call it when needed.
– Function portability: useful functions can be used in a number of programs.
– Supports the top-down technique for devising a program algorithm. Make an
outline and hierarchy of the steps needed to solve your problem and create a
function for each step.
– Easy to debug. Get one function working well then move on to the others.
– Easy to modify and expand. Just add more functions to extend program
capability
– For a large programming project, you will code only a small fraction of the
program.
– Make program self-documenting and readable.
106
C Programming
User-defined Function Usage
107
C Programming
Function Definition
• The function definition is the C code that implements what the function does.
Function definitions have the following syntax
108
C Programming
Function Definition Example 1
109
C Programming
Function Definition Example 2
• Some functions will not actually return a value or need any arguments. For
these functions the keyword void is used. Here is an example:
void write_header(void) {
printf("Navier-Stokes Equations Solver ");
printf("v3.45\n");
printf("Last Modified: ");
printf("12/04/95 - viscous coefficient added\n");
}
• The 2nd void keyword indicates that no arguments are needed for the
function.
• This makes sense because all this function does is print out a header statement.
110
C Programming
return Statement
• A function returns a value to the calling program with the use of the keyword
return, followed by a data variable or constant value. The return statement
can even contain an expression. Some examples
return 3;
return n;
return ++a;
return (a*b);
• When a return is encountered the following events occur:
1 execution of the function is terminated and control is passed back to the
calling program, and
2 the function call evaluates to the value of the return expression.
• If there is no return statement control is passed back when the closing brace
of the function is encountered (“falling off the end”).
111
C Programming
return Statement Examples
• The data type of the return expression must match that of the declared
return_type for the function.
double absolute(double x) {
if (x>=0.0)
return x;
else
return -x;
}
112
C Programming
Using Functions
• This is the easiest part! To invoke a function, just type its name in your
program and be sure to supply arguments (if necessary). A statement using our
factorial program would look like
number=factorial(9);
113
C Programming
Considerations when using Functions
• Some points to keep in mind when calling functions (your own or library’s):
– The number of arguments in the function call must match the number of
arguments in the function definition.
– The type of the arguments in the function call must match the type of the
arguments in the function definition.
– The actual arguments in the function call are matched up in-order with the
dummy arguments in the function definition.
– The actual arguments are passed by-value to the function. The dummy
arguments in the function are initialized with the present values of the actual
arguments. Any changes made to the dummy argument in the function will NOT
affect the actual argument in the main program.
114
C Programming
Using Function Example
115
C Programming
Introduction to Function Prototypes
116
C Programming
Function Prototypes
• Now the program reads in a "natural" order. You know that a function called
compute_sum will be defined later on, and you see its immediate use in the
main program. Perhaps you don’t care about the details of how the sum is
computed and you won’t need to read the actual function definition.
int factorial(int n) {
int result;
if (n<=1)
result=1;
else
result = n * factorial(n-1);
return result;
}
118
C Programming
Storage Classes
• Every variable in C actually has two attributes: its data type and its storage
class. The storage class refers to the manner in which memory is allocated
for the variable. The storage class also determines the scope of the variable,
that is, what parts of a program the variable’s name has meaning. In C, the
four possible Storage classes are
– auto
– extern
– static
– register
119
C Programming
auto Storage Class
• This is the default classification for all variables declared within a function
body [including main()] .
• They exist and their names have meaning only while the function is being
executed.
• When the function is exited, the values of automatic variables are not retained.
120
C Programming
extern Storage Class
121
C Programming
extern Storage Class Example
• Formatted Output
• char and int Formatted Output Example
• f Format Identifier
• e Format Identifier
• Real Formatted Output Example
• s Format Identifier
• Strings Formatted Output Example
• Formatted Input
• Formatted Input Examples
124
C Programming
Formatted Output
• Can you control the appearance of your output on the screen? Or do you have
to accept the default formatting provided by the C compiler? It turns out you
can format your output in a number of ways.
• You can control how many columns will be used to output the contents of a
particular variable by specifying the field width. The desired field width is
inserted in the format specifier after the % and before the letter code indicating
the data type. Thus the format specifier %5d is interpreted as use 5 columns to
display the integer. Further examples:
%3c display the character in 3 columns
%13x display the hexadecimal integer in 13 columns
• Within the field, the argument value is right-adjusted and padded with
blanks. If left adjustment is preferred use the syntax %-3c. If you wish to pad
with zeros use the syntax %04d.
Nice Feature:
If the value to be printed out takes up more columns than the specified field
width, the field is automatically expanded.
125
C Programming
char and int Formatted Output Example
• This program and it output demonstrate various-sized field widths and their
variants.
#include <stdio.h> w
main() { w
char lett='w'; w
int i=1,j=29;
printf ("%c\n",lett); 1
printf ("%4c\n",lett); 29
printf ("%-3c\n\n",lett); 29
printf ("%d\n",i); 0000000029
printf ("%d\n",j); 29
printf ("%10d\n",j); 35
printf ("%010d\n",j); 1d
printf ("%-010d\n",j);
printf ("%2o\n",j);
printf ("%2x\n",j);
}
126
C Programming
f Format Identifier
• For floating-point values, in addition to specifying the field width, the number
of decimal places can also be controlled. A sample format specifier would
look like this
%10.4f
field number of
width decimal places
• Note that a period separates the two numbers in the format specifier. Don’t
forget to count the column needed for the decimal point when calculating the
field width. We can use the above format identifier as follows:
printf("%10.4f",4.0/3.0); ----1.3333
127
C Programming
e Format Identifier
• When using the e format identifier, the second number after the decimal point
determines how many significant figures (SF) will be displayed. For example
printf("%10.4e",4.0/3.0); _1.333e+10
#include <stdio.h>
main() {
float x=333.123456;
double y=333.1234567890123456;
printf ("%f\n",x);
printf ("%.1f\n",x);
printf ("%20.3f\n",x);
printf ("%-20.3f\n",x);
printf ("%020.3f\n",x);
printf ("%f\n",y);
printf ("%.9f\n",y);
printf ("%.20f\n",y);
printf ("%20.4e\n",y);
}
333.123444
333.1
333.123
333.123
0000000000000333.123
333.123457
333.123456789
333.12345678901232304270
3.331e+02
129
C Programming
s Format Identifier
• For strings, the field length specifier works as before and will automatically
expand if the string size is bigger than the specification. A more sophisticated
string format specifier looks like this
%6.3s
• where the value after the decimal point specifies the maximum number of
characters printed.
• For example;
printf("3.4s\n","Sheridan"); Sher
130
C Programming
Strings Formatted Output Example
#include <stdio.h>
main() {
static char s[]="an evil presence";
printf ("%s\n",s);
printf ("%7s\n",s);
printf ("%20s\n",s);
printf ("%-20s\n",s);
printf ("%.5s\n",s);
printf ("%.12s\n",s);
printf ("%15.12s\n",s);
printf ("%-15.12s\n",s);
printf ("%3.12s\n",s);
}
an evil presence
an evil presence
an evil presence
an evil presence
an ev
an evil pres
an evil pres
an evil pres
an evil pres
131
C Programming
Formatted Input
• Modifications can be made to the control string of the scanf function which
enable more sophisticated input. The formatting features that can be inserted
into the control string are
– Ordinary characters (not just format identifiers) can appear in the scanf
control string. They must exactly match corresponding characters in the input.
These “normal” characters will not be read in as input.
– As with formatted output, a field width can be specified for inputting values.
The field width specifies the number of columns used to gather the input.
132
C Programming
Formatted Input Examples
#include <stdio.h>
main() {
int i; char lett; char word[15];
scanf("%d , %*s %c %5s",&i,&lett,word);
printf("%d \n %s \n %s\n",i,lett,word);
}
45 , ignore_this C read_this
45
C
read_
#include <stdio.h>
main() {
int m,n,o;
scanf("%d : %d : %d",&m,&n,&o);
printf("%d \n %d \n %d\n",m,n,o);
}
10 : 15 : 17
10
15
17
133
C Programming
Pointers
134
C Programming
Introduction to Pointers
• On the other hand, pointers are usually difficult for new C programmers to
comprehend and use. If you remember the following simple statement,
working with pointers should be less painful…
135
C Programming
Memory Addressing
• a memory location with a certain address is set aside for any values that will be
placed in i. We thus have the following picture:
FFD2 35 i
136
C Programming
The Address Operator
• You can find out the memory address of a variable by simply using the
address operator &. Here is an example of its use:
&v
• The above expression should be read as “address of v”, and it returns the
memory address of the variable v.
137
C Programming
Pointer Variables
138
C Programming
Pointer Arithmetic
– Integers and pointers can be added and subtracted from each other, and
– incremented and decremented.
– In addition, different pointers can be assigned to each other
• Some examples,
139
C Programming
Indirection Operator
#include <stdio.h>
main() {
int a=1,b=78,*ip;
ip=&a;
b=*ip; /* equivalent to b=a */
printf("The value of b is %d\n",b); }
The value of b is 1
• Note that b ends up with the value of a but it is done indirectly; by using a
pointer to a.
140
C Programming
“Call-by-Reference” Arguments
• What if we would like the function to change the main variable’s contents?
141
C Programming
“Call-by-Reference” Example
main() {
int i=3,j=9876;
swap(&i,&j);
printf("After swap, i=%d j=%d\n",i,j);
}
142
C Programming
Pointers and Arrays
• We have actually seen this fact before: when using scanf to input a character
string variable called name the statement looked like
• Given this fact, we can use pointer arithmetic to access array elements.
143
C Programming
Pointers and Arrays Illustration
144
C Programming
Pointers and Arrays Examples
• The next examples show how to sum up all the elements of a 1D array using
pointers:
– Normal way
int a[100],i,*p,sum=0;
– Another way
int a[100],i,*p,sum=0;
145
C Programming
Arrays as Function Arguments
• When you are writing functions that work on arrays, it is convenient to use
pointers as arguments. Once the function has the base address of the array, it
can use pointer arithmetic to work with all the array elements. The alternative
is to use global array variables or -- more horribly -- pass all the array elements
to the function.
• Note that all the sum function needed was a starting address in the array
and the number of elements to be summed together (n). A very efficient
argument list.
146
C Programming
Arrays as Function Arguments Example
double position[150],length;
length=sum(position,150); /* sum entire array */
length=sum(position,75); /* sum first half */
length=sum(&position[10],10);/* sum from element
10 to element 20 */
147
C Programming
Pointers and Character Strings
main() {
char *cp;
cp="Civil War";
printf("%c\n",*cp);
printf("%c\n",*(cp+6));
}
C
W
148
C Programming
Pointers and Character Strings Example
main() {
char *name;
printf("Who are you?\n");
scanf("%s",name);
printf("Hi %s welcome to the party, pal\n",name);
}
Who are you?
Seymour
Hi Seymour welcome to the party, pal
149
C Programming
Structures
• Introduction to Structures
• Structure Variable Declaration
• Structure Members
• Initializing Structure Members
• Structures Example
• Structures Example Continued
• More Structures Example Continued
• Structures within Structures
• Initializing Structures within Structures
• Pointers to Structures
• Pointers to Structures: ->
150
C Programming
Introduction to Structures
struct student {
char name[45];
keyword char class;
float gpa;
structure
data type name int test[3]; member name & type
int final;
char grade;
};
151
C Programming
Structure Variable Declaration
• You can declare a structure type and variables simultaneously. Consider the
following structure representing playing cards.
struct playing_card {
int pips;
char *suit;
} card1,card2,card3;
152
C Programming
Structure Members
• The different variable types stored in a structure are called its members. To
access a given member the dot notation is use. The “dot” is officially called
the member access operator. Say we wanted to initialize the structure card1
to the two of hearts. It would be done this way:
card1.pips=2;
card1.suit="Hearts";
• Once you know how to create the name of a member variable, it can be treated
the same as any other variable of that type. For example the following code:
card2.pips=card1.pips+5;
• would make card2 the seven of some suit.
• Structure variables can also be assigned to each other, just like with other
variable types:
card3 = card1;
• would fill in the card3 pips member with 2 and the suit member with
“Hearts”. In other words, each member of card3 gets assigned the value of
the corresponding member of card1.
153
C Programming
Initializing Structure Members
154
C Programming
Structures Example
• What data type are allowed to structure members? Anything goes: basic types,
arrays, strings, pointers, even other structures. You can even make an array of
structures.
• Consider the program on the next few pages which uses an array of structures
to make a deck of cards and deal out a poker hand.
#include <stdio.h>
struct playing_card {
int pips;
char *suit; } deck[52];
void make_deck(void);
void show_card(int n);
main() {
make_deck();
show_card(5);
show_card(37);
show_card(26);
show_card(51);
show_card(19);
}
155
C Programming
Structures Example Continued
void make_deck(void) {
int k;
for(k=0; k<52; ++k) {
if (k>=0 && k<13) {
deck[k].suit="Hearts";
deck[k].pips=k%13+2; }
if (k>=13 && k<26) {
deck[k].suit="Diamonds";
deck[k].pips=k%13+2; }
if (k>=26 && k<39) {
deck[k].suit="Spades";
deck[k].pips=k%13+2; }
if (k>=39 && k<52) {
deck[k].suit="Clubs";
deck[k].pips=k%13+2; }
}
}
156
C Programming
More on Structures Example Continued
void show_card(int n) {
switch(deck[n].pips) {
case 11:
printf("%c of %s\n",'J',deck[n].suit);
break;
case 12:
printf("%c of %s\n",'Q',deck[n].suit);
break;
case 13:
printf("%c of %s\n",'K',deck[n].suit);
break;
case 14:
printf("%c of %s\n",'A',deck[n].suit);
break;
default:
printf("%c of %s\n",deck[n].pips,deck[n].suit);
break; }
}
7 of Hearts
K of Spades
2 of Spades
A of Clubs
8 of Diamonds
157
C Programming
Structures within Structures
158
C Programming
Initializing Structures within Structures
• which sets the today element of the structure veteran to the eleventh of
November, 1918. The now element of the structure is initialized to eleven
hours, eleven minutes, eleven seconds. Each item within the structure can be
referenced if desired. For example,
++veteran.now.sec;
if (veteran.today.month == 12)
printf("Wrong month! \n");
159
C Programming
Pointers to Structures
• One can have pointer variable that contain the address of complete structures,
just like with the basic data types. Structure pointers are declared and used in
the same manner as “simple” pointers:
• The above code has indirectly initialized the structure down_card to the
Eight of Clubs through the use of the pointer card_pointer.
160
C Programming
Pointers to Structures: ->
161
C Programming
Unions
• Introduction to Unions
• Unions and Memory
• Unions Example
162
C Programming
Introduction to Unions
• Unions are C variables whose syntax look similar to structures, but act in a
completely different manner. A union is a variable that can take on different
data types in different situations. The union syntax is:
union tag_name {
type1 member1;
type2 member2;
…
};
• For example, the following code declares a union data type called intfloat
and a union variable called proteus:
union intfloat {
float f;
int i;
};
union intfloat proteus;
163
C Programming
Unions and Memory
• Once a union variable has been declared, the amount of memory reserved is
just enough to be able to represent the largest member. (Unlike a structure
where memory is reserved for all members).
• In the previous example, 4 bytes are set aside for the variable proteus since
a float will take up 4 bytes and an int only 2 (on some machines).
• Data actually stored in a union’s memory can be the data associated with any
of its members. But only one member of a union can contain valid data at a
given point in the program.
• It is the user’s responsibility to keep track of which type of data has most
recently been stored in the union variable.
164
C Programming
Unions Example
• The following code illustrates the chameleon-like nature of the union variable
proteus defined earlier.
#include <stdio.h>
main() {
union intfloat {
float f;
int i;
} proteus;
proteus.i=4444 /* Statement 1 */
printf(“i:%12d f:%16.10e\n”,proteus.i,proteus.f);
proteus.f=4444.0; /* Statement 2 */
printf(“i:%12d f:%16.10e\n”,proteus.i,proteus.f);
}
i: 4444 f:6.2273703755e-42
i: 1166792216 f:4.440000000e+03
• After Statement 1, data stored in proteus is an integer the the float member
is full of junk.
• After Statement 2, the data stored in proteus is a float, and the integer
value is meaningless.
165
C Programming
File Input and Output
166
C Programming
Introduction to File Input and Output
• So far, all the output (formatted or not) in this course has been written out to
what is called standard output (which is usually the monitor). Similarly all
input has come from standard input (usually associated with the keyboard).
The C programmer can also read data directly from files and write directly to
files. To work with files, the following steps must be taken:
2 Connect the internal FILE variable with an actual data file on your hard
disk. This association of a FILE variable with a file name is done with the
fopen() function.
3 Perform I/O with the actual files using fprint() and fscanf()
functions.
4 Break the connection between the internal FILE variable and actual disk
file. This disassociation is done with the fclose() function.
167
C Programming
Declaring FILE variables
#include <stdio.h>
• The first step is using files in C programs is to declare a file variable. This
variable must be of type FILE (which is a predefined type in C) and it is a
pointer variable. For example, the following statement
FILE *in_file;
168
C Programming
Opening a Disk File for I/O
• Before using a FILE variable, it must be associated with a specific file name.
The fopen() function performs this association and takes two arguments: 1)
the pathname of the disk file, and 2) the access mode which indicates how the
file is to be used. The following statement
in_file = fopen("myfile.dat","r");
• connects the variable in_file to the disk file myfile.dat for read
access. Thus, myfile.dat will only be read from. Two other access modes
can be used:
169
C Programming
Reading and Writing to Disk Files
• These functions take an additional (first) argument which is the FILE pointer
that identifies the file to which data is to be written to or read from. Thus the
statement,
fscanf(in_file,"%f %d",&x,&m);
• will input -- from the file myfile.dat -- real and integer values into the
variables x and m respectively.
170
C Programming
Closing a Disk File
• The fclose function in a sense does the opposite of what the fopen does: it
tells the system that we no longer need access to the file. This allows the
operating system to cleanup any resources or buffers associated with the file.
fclose(in_file);
171
C Programming
Additional File I/O Functions
• Many of the specialized I/O functions for characters and strings that we have
described in this course have analogs which can be used for file I/O. Here is a
list of these functions
Function Result
fgets file string input
fputs file string output
getc(file_ptr) file character input
putc(file_ptr) file character output
• Another useful function for file I/O is feof() which tests for the end-of-file
condition. feof takes one argument -- the FILE pointer -- and returns a
nonzero integer value (TRUE) if an attempt has been made to read past the end
of a file. It returns zero (FALSE) otherwise. A sample use:
if (feof(in_file))
printf ("No more data \n");
172
C Programming
Sample File I/O Program
• The program on the next few pages illustrates the use of file I/O functions. It is
an inventory program that reads from the following file
lima beans
1.20
10
5
thunder tea
2.76
5
10
Greaters ice-cream
3.47
5
5
boneless chicken
4.58
12
10
• which contains stock information for a store. The program will output those
items which need to be reordered because their quantity is below a certain
limit
173
C Programming
Sample File I/O Program: main
#include <stdio.h>
#include <ctype.h>
#include <string.h>
struct goods {
char name[20];
float price;
int quantity;
int reorder;
};
FILE *input_file;
void processfile(void);
void getrecord(struct goods *recptr);
void printrecord(struct goods record);
main() {
char filename[40];
printf("Example Goods Re-Order File Program\n");
printf("Enter database file \n");
scanf("%s",filename);
input_file = fopen(filename, "r");
processfile();
}
174
C Programming
Sample File I/O Program: processfile
void processfile(void) {
struct goods record;
while (!feof(input_file)) {
getrecord(&record);
if (record.quantity <= record.reorder)
printrecord(record);
}
}
175
C Programming
Sample File I/O Program: getrecord
176
C Programming
Sample File I/O Program: printrecord
177
C Programming
Sample File I/O Program: sample session
178
C Programming
Dynamic Memory Allocation
179
C Programming
Introduction to Dynamic Memory Allocation
180
C Programming
Dynamic Memory Allocation: sizeof
• The sizeof() function returns the memory size (in bytes) of the requested
variable type. This call should be used in conjunction with the calloc()
function call, so that only the necessary memory is allocated, rather than a
fixed size. Consider the following code fragment:
struct time {
int hour;
int min;
int sec;
};
int x;
x=sizeof(struct time);
• x now contains how many bytes are taken up by a time structure (which
turns out to be 12 on many machines). sizeof can also be used to determine
the memory size of basic data type variables as well. For example, it is valid to
write sizeof(double).
181
C Programming
Dynamic Memory Allocation: calloc
182
C Programming
Dynamic Memory Allocation: free
• When the variables are no longer required, the space which was allocated to
them by calloc should be returned to the system. This is done by,
free(appt);
183
C Programming
Command-Line Arguments
184
C Programming
Introduction to Command-Line Arguments
• In every program you have seen so far, the main function has had no dummy
arguments between its parentheses. The main function is allowed to have
dummy arguments and they match up with command-line arguments used
when the program is run.
• The two dummy arguments to the main function are called argc and argv.
185
C Programming
Command-Line Arguments Example
• Note that *argv[0] is the program name itself, which means that
*argv[1] is a pointer to the first “actual” argument supplied, and
*argv[n] is the last argument. If no arguments are supplied, argc will be
one. Thus for n arguments, argc will be equal to n+1.
186
C Programming
Command-Line Arguments: Sample Session
#include <stdio.h>
main(int argc, char *argv[]) {
if (argc == 2)
printf("The argument supplied is %s\n", argv[1]);
else if (argc > 2)
printf("Too many arguments supplied.\n");
else
printf("One argument expected.\n");
}
a.out
One argument expected.
a.out help
The argument supplied is help
a.out help verbose
Too many arguments supplied.
187
C Programming
Operator Precedence Table
Description Represented by
1 Parenthesis () []
1 Structure Access . ->
2 Unary ! ++ -- - * &
3 Multiply, Divide, Modulus * / %
4 Add, Subtract + -
5 Shift Right, Left >> <<
6 Greater, Less Than, etc. > < => <=
7 Equal, Not Equal == !=
8 Bitwise AND &
9 Bitwise Exclusive OR ^
10 Bitwise OR |
11 Logical AND &&
12 Logical OR ||
13 Conditional Expression ? :
14 Assignment = += -= etc
15 Comma ,
188
C Programming