C - Part1 (Introduction To C Language)
C - Part1 (Introduction To C Language)
Introduction to C Language
Instructor: Professor I. Charles Ume
ME4447/6405
History of C Language
In 1972, the Unix Operating system was being developed. During this time, the concept of a system programming language having attributes of both low level and high level languages also developed. System programming languages have advantages of a high level language but allow the programmer to take control of the underlying hardware if desired. Brian W. Kernighan and Dennis M. Ritchie developed C at Bell Laboratories as a system programming language. Their underlying goal was to develop a language that was simple and flexible enough to be used in a variety of different processors. In 1983, the American National Standards Institute(ANSI) established a committee with a goal to produce an unambiguous and machine-independent definition of the language C. This ANSI C was completed in 1988. Currently, C and C++ are the most popular computer languages. (Note: C++ is an object oriented version of C)
ME4447/6405
References
Texts: B.W. Kernighan and D.M. Ritchie, The C Programming Language, 2nd Edition, Prentice Hall, 1988 Websites: http://cm.bell-labs.com/cm/cs/who/dmr/ctut.pdf (Note: this is a tutorial on C written by Kernighan himself)
ME4447/6405
ME4447/6405
Mathematical Operators + * / % ++ -Addition Subtraction Multiplication Division Modulus Increment Decrement x = x + y; x = x y; x = x*y; x = x/y; x = x %y x++; x--;
(Note: Modulus is the same as remainder from division Example: x=7%3 => x=1) TheGeorge GeorgeW. W.Woodruff WoodruffSchool Schoolof ofMechanical MechanicalEngineering Engineering The
ME4447/6405
Operators
Relational and Logical Operators == != < > <= >= && || Equal to Not Equal to Less than Greater than Less than or equal to Greater than or equal to Logical AND Logical OR
(Note: When using the logical operations, any nonzero value is considered true. Only 0 value is considered false)
ME4447/6405
Operators
Bitwise Operators & Bitwise AND | Bitwise inclusive OR ^ Bitwise exclusive OR ~ Bitwise NOT >> Shift Bits Right << Shift Bits Left
Examples : y = 0x0A & 0x02 => y = 0x02 z = 26 ^ 9 r = 23 >> 2 => z = 19 => r = 5 0000 1010 & 0000 0010 = 0000 0010 0001 1010 ^ 0000 1001 = 0001 0011 0001 0111 >>2 = 0000 0101
(Note: if 0x prefix is used before a constant, the constant is hexadecimal) (Note: One must distinguish the bitwise operations & and | from the logical operators && and ||. For example, if x is 1 and y is 2, then x & y is zero while x && y is one.)
ME4447/6405
Separators
These separators are used to group together lines of code and initialize arrays. This separator is used to separate lines of code.
{ ; ( [ /*
) ] */
These separators are used to specify parameters and to change mathematical operator precedence. These separators are used to index arrays. These separators indicate a string constant. These separators indicate a character constant. These separators indicate a comment. You can also use // to add a single line comment.
Example:
ME4447/6405
Data Types
Description nothing a single byte (signed or unsigned) one word (signed or unsigned) long integer, at least 32 bits (signed or unsigned) single-precision floating point double-precision floating point
Data Type Size in Bytes void 0 char 1 int 2 long 4 float 4 double 8
(Note: The size in bytes a data type uses varies between every development system so be careful.
Declaring a variable ME4447/6405 Before any variable is used in a C program, it must be declared.
Example: Declaring a integer variable x int x; An initial value can be assigned during a variable declaration. Example: Declaring a float variable y with initial value 6.1 float y = 6.1; A variable declared using a lower precision can be assigned to a variable declared using a higher precision Example: Assigning x to y x = 4; y = x; /* y now contains 4.0 */
A variable declared using a higher precision can be assigned to a variable declared using a lower precision by type casting. Type casting temporarily re-declares the type of variable. Example: Assigning y to x x = (int)y; /* y is temporarily re-declared as int and assigned to x. The re-declaration of a float to int has the effect keeping The George W. Woodruff School ofMechanical Mechanical Engineering The George W. Woodruff only School of Engineering the integer part. Therefore, x now contains 6*/
ME4447/6405
Arrays
Examples:
1. Declaring an array of integers that holds five values. int myarray[5]; 2. Filling an array with an initial value. int myarray[5] = { -300, -400, -2, 4, 5}; 3. Alternative way to declare an array with initial values. int myarray[] = { -300, -400, -2, 4, 5}; (Note: the compiler is smart enough to figure out that it needs an array of 5 to hold all the initial values.) 4. You can declare multi-dimensional arrays int myarray[3][2] = {{1,2},{3,4},{3,1}};
ME4447/6405
Indexing Arrays
To use a value stored in an array, the array must be indexed using the [] separator. Example: indexing a one-dimensional array int x; int myarray[5] = { -300, -400, -2, 4, 5}; x = myarray [1]; /*x now contains 400*/
Example: indexing a two-dimensional array int x; int myarray[3][2] = {{1,2},{3,4},{3,1}}; x = myarray[1][1]; /* x now contains 4 */
(Note: An array starts from index 0 in C language. Therefore in example 1, there was really 6 slots. The reason for this is the last slot of any array contains 0 to terminate the array)
ME4447/6405
Control Flow
The first basic method to control the flow of a program is by using if/else
Syntax:
if (condition) { execute this code if condition is true } else { execute this code if condition is false (Note: if there is no code here, else can be omitted) }
ME4447/6405
Control Flow
Syntax:
if (condition1){ execute this code if condition 1 is true } else if (condition2){ execute this code if condition 1 is false and condition 2 is true } else if (condition3){ execute this code if condition 1&2 is false and condition 3 is true } else { execute this code if conditions 1,2,&3 are false }
ME4447/6405
Control Flow
The second basic method to control the flow of a program is by using for or while loops Syntax: for ( initial; condition; modify){ (Note: initial: initializes the loop control variable condition: loop while the condition on loop control variable is true adjust: code to adjust the loop control variable. Executed once per loop) execute this code while condition is true }
ME4447/6405 Syntax: while (condition){ execute this code while condition is true }
It is sometimes convenient to be able to exit from a loop other than by testing at the top or bottom. The break statement causes the innermost enclosing loop to be exited immediately.
Example:
/* find the first a in a character string*/ int i = 0; while(mystring[i] != 0){ if (mystring [i] == a ){ break; } i++; } /* i now contains index of character a in mystring */
ME4447/6405
Functions
Functions are the building blocks of a C program. Functions are sections of code that perform a single, well-defined service. Like a variable, functions must be declared before they are used. Functions cannot be declared or initialized within another function
Function Body
Return Statement
ME4447/6405 Example: Using the multiply function int result; result = Multiply(6,7); /* result now contains 42 */
Example: Use an array as a parameter, void ArrayFunction(int SomeArray[]) { .. .. return; } Example: Using the array function int MyArray[10]; ArrayFunction(MyArray);
ME4447/6405
Files in a Project
*.c
Source File. They contain functions. If the source file contains a function called main, variable declarations outside of any functions (global variables), and function declarations can also be included. file.The programmer can then use the functions in the library file. A function called main is not allowed in a library file.
*.lib Library file. If the source file will never change then the programmer can create a library
*.h Header File. Every *.c or *.lib file without a function called main has a header file. They
in the *.c or *.lib file.
contain global variable declarations and function declarations for global variables and functions
*.o
Object File. After a compilation of a source file, an object file is created. This is done primarily to save the compiler time. The compiler will only compile source files that have recently been changed. a user compiles a program, a compiler creates object files from the source files then a linker links any functions used in the object files together to create an executable file. The execution always starts from the function called main.
*.exe Executable program. This is the only file extension that varies from system to system. When
ME4447/6405
Pre-Processor
Pre-Processor directives are instructions for the compiler. Pre-processor directives are prefixed by the # character. Only two different pre-processor commands are discussed here.
#include <filename.h> The include directive is used to link C source files and library files together. For this discussion we will use this to link the library files. This directive must appear before global variable declarations and function declarations. #define NAME VALUE The define directive is used to set definitions. Similar to EQU in assembly. Example: #define PI 3.14
ME4447/6405
Library Functions
ME4447/6405 Using arguments and format specifiers, we can print a variables value to the screen. Format Specifiers %d Integer signed decimal integer %i Integer signed decimal integer %o Integer unsigned octal integer %u Integer unsigned decimal integer %x Integer unsigned hexadecimal int (with a, b, c, d, e, f) %X Integer unsigned hexadecimal int (with A, B, C, D, E, F) %f Floating point signed value %c Character Single character %s String pointer Prints characters until a null-terminator %% None Prints the % character Example: Printing a variables value int x = 12; int y = 10; int z = x + y; printf(%d plus %d equals %d,x,y,z) printf(%X plus %X equals %X,x,y,z)
ME4447/6405
To display non-graphical characters ( such as a new-line character) and separators, an escape sequence is needed. Escape Sequences \n \r \t \\ \' \" \? LF CR HT \ ' " ? Newline (linefeed) Carriage return Tab (horizontal) Backslash Single quote (apostrophe) Double quote Question mark
ME4447/6405 B. Formatted Input int scanf(const char *format[, address, ...]); scans a series of input fields one character at a time formats each field according to a corresponding format specified in the format string.
Example: Entering a number int x; printf(Please input an integer:); scanf(%d,&x); Example: Entering a string char buffer[80]; printf(Please input a string); scanf(%s,buffer);
ME4447/6405
sin (x) cos (x) tan (x) asin (x) acos (x) atan (x) exp (x) log (x) pow (x, y) ceil (x) floor (x) fabs (x)
sine of x cosine of x tangent of x sin-1 (x) cos-1 (x) tan-1 (x) exponential function ex natural logarithm ln(x) xy smallest integer not less than x largest integer not greater than x absolute value |x|
ME4447/6405
Other Functions:
Character Class Tests. It declares functions for testing characters, such as to test whether a letter is in lower-case or upper-case. String Functions. Such as copy string, comparing string, etc. Utility Functions. It declares functions for number to string conversions. memory storage allocation and similar tasks.
ME4447/6405
Variable Scope
Any variable declared in a level is only available to higher numbered levels. If a variable is declared in Level 1a, only Level 2a, and Level 2b will have access to the variable. If we declare a variable in the Base Level then it becomes a global variable Base Level { Level 1 a: inside a function { Level 2a } { Level 2b } } { Level 1 b: inside a function }
ME4447/6405
Formally, C is pass by instance, which means that a function receives copies of the values of its parameters. int multbytwo(int z) { z = z * 2; return z; } /* Somewhere in main function */ int z = 5 j = multbytwo(z); /* j contains 10 and z still contains 5*/ Exception: When the argument passed to a function is an array, the function does not receive a copy of the array, and it therefore can modify the array. ( Call by reference)
ME4447/6405
Example: Integer to binary conversion # include <stdio.h> #define true 1 int IntToBinary(int x, int bin[]); /* global variables and function declarations come next*/ void main(void) { int x; int limit; int binaryarray[20]; /* Declare an integer variable */ /* Declare an integer variable */ /* Declare an integer array */ /* pre-processor commands come first*/
/* Let the user input a variable and make sure it is positive*/ while(true) { printf(\n Input a positive integer:); scanf(%d,&x); if(x < 0) { printf(\n Not a positive integer.); } else { break; } } George W. Woodruff School of Mechanical Engineering The
ME4447/6405 /* Call the Int to Binary function to store the bits in binaryarray */ limit = IntToBinary(x,binaryarray); /* Now print the contents of the binary array. */ for(int counter = 0; counter < limit; counter = counter ++) printf(\n Bit %d is %d,counter,binaryarray[counter]); /* End the program*/ return; } /* Now define the function IntToBinary */ int IntToBinary(int x, int bin[]) { int counter = 0; while( x > 0 ) { if((x & 0x01) bin[counter] = 1; else bin[counter] = 0; x = x >> 1; counter = counter + 1; } TheGeorge GeorgeW. W.Woodruff WoodruffSchool Schoolof ofMechanical MechanicalEngineering Engineering return counter; The }