Chapter 7 C Language Preliminaries Chapter 7: C Language Preliminaries 1 CS1101C Textbook C: How To Program by H.M. Deitel and P.J. Deitel Prentice Hall, 2nd Edition ISBN 0-13-288333-3 Chapter 7 CS1101C Textbook 2 Introduction 1972 by Dennis Ritchie at Bell Lab. ALGOL60 CPL BCPL B C ANSI C: standardised. C is a high-level language. C is a procedural language. C is baffling to look at, easy to mess up, and tricky to learn. Chapter 7 Introduction 3 Introduction Some articles (more in CS1101C web site, under ‘CA Activities/Readings & Preparation’): The Ten Commandments for C Programmers The Top 10 Ways to get screwed by the C programming language Chapter 7 Introduction 4 Algorithmic Problem Solving Understanding the problem Writing an algorithm Verifying the algorithm Converting to code Chapter 7 Algorithmic Problem Solving 5 From Problem to Algorithm Conversion from inches to centimetres. Step 1: Understanding the problem. What is the the data (input)? Length in inches. Let’s call it inches. What is the unknown (output)? Length in centimetres. Let’s call it cm. Chapter 7 From Problem to Algorithm 6 From Problem to Algorithm Step 2: Devising a plan. First draft of plan (algorithm): Get length in inches Compute length in centimetres Report length in centimetres What is the relationship between the data and the unknown? 1 inch = 2.54 centimetres Chapter 7 From Problem to Algorithm 7 From Problem to Algorithm Step 2: Devising a plan. (continue…) Do I know how to compute the length in cm? Yes. Length in cm is: 2.54 times length in inches Complete plan (algorithm): Get length in inches Compute length in centimetres, using 2.54 * length in inches Report length in centimetres Chapter 7 From Problem to Algorithm 8 From Problem to Algorithm Step 2: Devising a plan. (continue…) Is the plan correct? Walk through the plan. Work out on some examples: 1 inch, 2 inches, 3.5 inches, 0 inch, etc. Chapter 7 From Problem to Algorithm 9 From Problem to Algorithm Step 3: Carrying out the plan. Convert algorithm to program. Compile and run. Step 4: Looking back. Check the output. Is the output correct? In general, an algorithm may need to go through a few rounds of refinements. Chapter 7 From Problem to Algorithm 10 From Algorithm to Program inch2cm.c /* * Converts length from inches to centimetres * Author: Garfield Date: 25 July 1997 * Note: This program contains a hard-to-spot error! */ #include <stdio.h> /* printf, scanf definitions */ #define CM_PER_INCH 2.54 /* conversion constant */ int main (void) { float inches, cm; /* length in inches length in centimetres */ /* get the length in inches */ printf ("Enter a length in inches: "); scanf ("%f", &inches); /* convert to length in centimetres */ cm = CM_PER_INCH * inches; /* display the length in centimetres */ printf ("That equals %.2f centimetres.\n\n", cm); return 0; /* indicate program ends successfully */ } Chapter 7 From Algorithm to Program 11 Sample Runs garfield@decunx:~/c[xx]: cc -o inch2cm inch2cm.c garfield@decunx:~/c[xx]: inch2cm Enter a length in inches: 2 That equals 5.08 centimetres. garfield@decunx:~/c[xx]: inch2cm Enter a length in inches: 5.9 That equals 14.99 centimetres. garfield@decunx:~/c[xx]: inch2cm Enter a length in inches: 0 That equals 0.00 centimetres. garfield@decunx:~/c[xx]: inch2cm Enter a length in inches: –2 That equals –5.08 centimetres. garfield@decunx:~/c[xx]: inch2cm Enter a length in inches: 1.2e4 That equals 30480.00 centimetres. Chapter 7 Sample Runs 12 Preprocessor Directives C system = C language + preprocessor + libraries Preprocessor modifies program before it is compiled. Common directives: #include and #define # must be first non-blank character on the line. Chapter 7 Preprocessor Directives 13 Preprocessor Directives #include <stdio.h> Includes header file stdio.h from /usr/include directory into program. stdio.h contains functions prototypes of scanf(), printf() and others, so that inch2cm.c can use these functions. #include "file" assumes file in current directory. Chapter 7 Preprocessor Directives 14 Preprocessor Directives #define CM_PER_INCH 2.54 Defines constant macro (or symbolic constant) CM_PER_INCH as 2.54 Preprocessor replaces each occurrence of CM_PER_INCH in the rest of program to 2.54. cm = CM_PER_INCH * inches; cm = 2.54 * inches; Purpose? Chapter 7 Preprocessor Directives 15 Comments /* this is a line of comments */ Comments are text enclosed in /* and */. Some compilers accept //. Comments provide documentation for program readability. Every program should have its author and date written documented. Every program and function should have a statement to describe its purpose. Chapter 7 Comments 16 Comments Right dosage is important. Too much: i++; /* increment i by 1 */ sum += num; /* add num to sum */ /* multiply CM_PER_INCH by inches */ /* and store result in cm */ cm = CM_PER_INCH * inches; Chapter 7 Comments 17 Comments Comments add values to readers. Should describe what the steps do and explain difficult logic, instead of translating C statements into English. Comments explain the purpose; program statements show the logic. Self-explanatory codes do not need much comments. Name variables appropriately. Examples: ‘width’ instead of ‘w’. Chapter 7 Comments 18 Comments Do not fill in comments as an after-thought. Documentation should begin at design, and follows through every phase. Spot the error: float inches, cm; Chapter 7 /* length in inches length in centimetres */ Comments 19 The main() Function C program consists of functions. At least one function must be present: main(). Execution of the program starts at this function. Example: int main (void) { /* body of function */ } Chapter 7 The main() Function 20 The main() Function Function consists of header and body. Function header: The type of the function -- eg: int. The name of the function -- eg: main The parameter list enclosed in parentheses -eg: void Chapter 7 The main() Function 21 The main() Function Function type: the type of value this function produces. If function type is not ‘void’, then there should be a return statement to return the result of the function. Example: return 0; Execution of the function ends when the return statement is executed, or when the last statement is executed. Where is the result returned to? Chapter 7 The main() Function 22 The main() Function A function returns its result (and control) to its caller. The caller for the main() function is the operating system. Zero is usually returned to UNIX to signal the successful completion of the program. Chapter 7 The main() Function 23 The main() Function A function parameter lists the arguments which the function takes from its caller. For example: printf ("Enter a length in inches: "); scanf ("%f", &inches); "Enter a length in inches: " is an argument to the printf() function. "%f" and &inches are arguments to the scanf() function. A void parameter indicates no argument. Chapter 7 The main() Function 24 The main() Function Function body: Declarations Executable statements Example: int main (void) { int a, b, c; b = 5; c = 3; a = b + c; return 0; } Chapter 7 declarations statements The main() Function 25 The main() Function Declarations are statements that declare local variables used in the function. Compiler allocate memory space for all variables. Chapter 7 The main() Function 26 Keywords Keywords are reserved words in C language with special meanings, and cannot be redefined. auto break case char const continue Chapter 7 default do double else enum exterm float for goto if int long register return short signed Keywords sizeof static struct switch typedef union unsigned void volatile while 27 Identifiers Identifiers are names given to objects (variables and functions). Two types of identifiers: standard and userdefined. Standard identifiers are predefined names, like printf and scanf. They may be redefined, but preferably not. User-defined identifiers are created by programmers to name variables and functions. Chapter 7 Identifiers 28 Identifiers Syntax for an identifier: consists of letters, digits and underscore (_), but may not begin with digit. Avoid naming an identifier starting with underscore (_). Choose appropriate identifiers for variable names and function names. Compare these identifiers for a particular variable: sum_of_list_of_numbers s sum Chapter 7 Identifiers 29 Identifiers Identifiers are case sensitive. By convention, identifiers for constant macros (symbolic constants) are usually in upper-case letters. Example: CM_PER_INCH Chapter 7 Identifiers 30 Constants Constants are often used in programs for values that do not change. Examples: perimeter = 2 * (length + breadth); rem = count % 7; printf ("Hello\n"); Types of constants: numeric constants, character constants, and string constants. Chapter 7 Constants 31 Constants Numeric contants: integers (decimal, octal, and hexadecimal) and floating-point numbers. Examples: 123, -345, +12 0123, 05 0x2A, 0x88 1.234, -0.00987, 1.2e-4, -3.5E3 Chapter 7 Constants 32 Constants Character contants: a single character enclosed in single quotes. Examples: 'A', 'b', '^', '9', '+' String contants: a sequence of characters enclosed in double quotes. Examples: "Hello\n", "ABC", "34.56" A null character, \0, is appended at the end of the string. 'K' and "K" are different. Chapter 7 Constants 33 Variable Declarations Variables must be declared before they can be used. Variables are declared in the declaration statements in a function. The declaration of a variable consists of its name and its type of value. float inches; float cm; or float inches, cm; Chapter 7 Variable Declarations 34 Data Types A data type defines a set of values and a set of operations permissible on those values. Basic data types: int, float, double, char. int: integer data type. Example of values of this type: 123, -900, 987654321, +31. An integer occupies a fixed number of bytes, so there is a range of values that can be represented. Chapter 7 Data Types 35 Data Types float: floating-point data type. Example of values of this type: 4.3, -123.00, +0.02, 1.2e4, 86e3, 3.9e-12. A floating-point representation consists of mantissa (fraction part) and exponent, with an assumed base. double: double-precision floating-point data type. It uses twice the number of bits in the mantissa, hence it may represent more precise values. Chapter 7 Data Types 36 Data Types char: character data type. Example of values of this type: 'a', 'P', '3', '#', ' '. Chapter 7 Data Types 37 Programming Style Indentation: to show the hierarchy of logic. if (x < y) { printf ("x is smaller than y\n"); if (y < z) printf ("y is smaller than z\n"); else printf ("y is larger than or equal to z\n"); } else printf ("x is larger than or equal to y\n"); Chapter 7 Programming Style 38 Programming Style Blank lines: to separate functions, or logical blocks. Naming of identifiers. int main (void) { float inches, cm; /* length in inches length in centimetres */ /* get the length in inches */ printf ("Enter a length in inches: "); scanf ("%f", &inches); /* convert to length in centimetres */ cm = CM_PER_INCH * inches; /* display the length in centimetres */ printf ("That equals %.2f centimetres.\n\n", cm); return 0; /* indicate program ends successfully */ } Chapter 7 Programming Style 39 Data Validation Examine this run: garfield@decunx:~/c[xx]: inch2cm Enter a length in inches: –2 That equals –5.08 centimetres. Should -2 be accepted? Data validation: to validate input data and take necessary actions. A rugged program should not terminate abruptly under all circumstances -- ultimate aim. Chapter 7 Data Validation 40 Data Validation But this is too ambitious. An easy way out is to make assumptions, and document them in the program as pre-conditions. Compromise: include simple data validation checks, whenever possible. Chapter 7 Data Validation 41 Variables and Memory A variable has name, type and value. Each variable is allocated some memory location(s) to hold its value. Such allocation occurs at the variable declaration statements. Every memory location has an address. However, programmer only needs to refer to the variable by its name, and leaves it to the system to work out the address. Chapter 7 Variables and Memory 42 Variables and Memory Example: float inches, cm; Address Chapter 7 Memory 1000 1001 1002 : : Program 1500 inches 1508 cm Variables and Memory inch2cm 43 Variables and Memory Initially, the value of a variable is undefined. A variable must be initilialised before its value is used. 3 ways to assign a value into a variable Initialising the variable at declaration Use the assignment statement Use the input function Chapter 7 Variables and Memory 44 Variables and Memory Initialisation at declaration: float inches = 3.2; Using assignment statement: inches = 3.2; Using an input function: scanf ("%f", &inches); 1500 (inches) ? before Chapter 7 Variables and Memory User enters 3.2 1500 (inches) 3.2 after 45 Variables and Memory Destructive write, non-destructive read. before after int a, b; a = 40; b = 50; b = a + b; Chapter 7 2340 (a) 2340 (a) ? 40 2344 (b) 2344 (b) ? 50 2340 (a) 2340 (a) 40 40 2344 (b) 2344 (b) 50 90 Variables and Memory 46 Homework Try exercises behind chapter 7. Chapter 7 Homework 47