ES 036 Programming Fundamentals C++ Basics eagleson@uwo.ca www.eng.uwo.ca/people/reagleson Dr. Roy Eagleson Converting C++ programs in to machine language Text Editor Preprocessor Compiler Linker Loader 1-Jul-16 ES036 QMR/RE 2 Converting C++ in to machine language Text Editor The program is written using the text editor is known as source code. The source code (human readable instructions) is saved on to the secondary storage section of the computer system (disk) with an extension ‘.cpp’ to let the compiler know that it is written in C++ language. The source code needs to be grammatically correct 1-Jul-16 ES036 QMR/RE 3 Converting C++ in to machine language Preprocessor: A program that modifies the source code by adding other files and performing various text replacements It executes automatically before the translation period starts. Examples: #include <iostream> adds a file called a header file to the source code. It contains, among other things, the prototypes for cin and cout functions. #define PI 3.141593 replaces all instances of PI in a program with 3.141593. Compilation (step 3) follows immediately after the preprocessing, so, none can access the modifications made by the preprocessor 1-Jul-16 ES036 QMR/RE 4 Converting C++ in to machine language Compiler translates preprocessed source code into an object code that contains machine readable instructions The object code is saved on to the disk by the compiler with an extension ‘.obj’ along with the same source-code name This file is basically a binary file 1-Jul-16 ES036 QMR/RE 5 Converting C++ in to machine language Linker: scans the standard library, selects the needed function (precompiled) and upon linking them into the object file, produces an executable file with extension ‘.exe’ (for UNIX based system it is ‘.out’) and stores it on to the disk. Libraries are a collection of functions/objects Examples: 1-Jul-16 The linker adds the precompiled (in binary form) function definitions for cin, cout, etc. If one separates his program into more than one source file, the object code for each source file is added. ES036 QMR/RE 6 Converting C++ in to machine language Loader: The loader places the executable file on to the primary storage location (RAM) of the computer system, from where the CPU executes the program, instruction by instruction 1-Jul-16 ES036 QMR/RE 7 Converting C++ in to machine language Text Editor /* hello.cpp */ #include <iostream> int main() { cout<<"hello world\n"; return 0; } Preprocessor adds iostream text (prototype for cout) Compiler converts to machine code hello.obj Object code Linker -add library -add cout object code -add object code for other functions hello.exe Loader copies file to RAM and CPU executes the program when the icon is double-clicked, for example Program Example 1-Jul-16 Executable image ES036 QMR/RE 8 Converting C++ in to machine language Integrated Development Environment (IDE) program: It manages all the previously discussed steps and combines an editor, compiler, linker and debugger into a single development environment. Advantage: all the pieces are designed to work together; for example, if the compiler detects an error, the system is switched to the editor with the file positioned at the problem line. Debugger: The debugger locates the problem in the program during the compilation time 1-Jul-16 ES036 QMR/RE 9 //The first C++ Program #include <iostream> //preprocessor directive using namespace std; //”using” directive // entry point int main() //first function called in C++ {// function body begins with curly bracket cout << “Hello world!"; /* printing a string on the standard output*/ return 0; /*represents successful termination of the program*/ } // function body ends with curly bracket 1-Jul-16 ES036 QMR/RE 10 Comments in C++ Comments allow us to put some descriptions in our code Compiler completely ignores them // this is a comment Starting from ‘//’ to the end of the line /* this is also a comment */ Everything between ‘/*’ and ‘*/’ a = b /* comment inside a statement */ + c; 1-Jul-16 ES036 QMR/RE 11 Preprocessing Directive The line begins with ‘#’ characters are known as preprocessor directives. #include <iostream> causes the preprocessor to include a copy of the standard input /output file iostream (this is a C++ system file) The angle bracket indicates that this file is available at a system dependent place. The iostream file contains information on the function cout used in the program 1-Jul-16 ES036 QMR/RE 12 Function main Every C++ (and C) program executes its instructions from the function called main. This is the first function, called in C++ environment. Any function in C++ has a prototype as, Return_data_type Function_name (Argument_list_with_data_types) According to the prototype, the main function returns an integer (int) type value without taking any argument to process. Note: one can use (optional) the keyword void inside the parentheses as int main(void), to represent that the function takes no argument. 1-Jul-16 ES036 QMR/RE 13 Curly Brackets The left curly bracket begins the body of each function This right curly bracket ends the body of each function. A function definition looks like the following: Return_data_type Function_name(Argument_list_with_data_types) { Body of the function; } 1-Jul-16 ES036 QMR/RE 14 Producing Output With cout cout is an ostream object streams output to standard output uses the << (output) operator General Form: cout << expression << expression; Note: An expression is any C++ expression (string constant, identifier, formula or function call) 1-Jul-16 ES036 QMR/RE 15 return 0 return is a keyword for C++ (and C) programming language A returned zero value is interpreted as successful termination of the program. Non-zero values are interpreted as unsuccessful termination 1-Jul-16 ES036 QMR/RE 16 Good Programming Approach Purpose of a program it presents the computer with a set of instructions and it provides the programmer a clear, easy to read description of what it does. The goal of a programmer Create a simple and easy to read programs. Make the program as clear, concise and simple as possible 1-Jul-16 ES036 QMR/RE 17 Good Programming Approach Comment the program Pick meaningful names for the variables Indentation Clarity Simplicity Do not write a long function Avoid complex logics Write many short statements instead of a very long one Make the program as simple and easy to understand as possible 1-Jul-16 ES036 QMR/RE 18 C++ Variables (Objects) Variables are boxes that can hold things Each box has a name (“identifier”) Size of the box depends on the “type” of things you are planning to put there You have to tell the compiler in advance (“declare”), Names of each of the boxes you want The type of things that will go in each box 1-Jul-16 ES036 QMR/RE 19 Why Use Types Computer sees everything in 1’s and 0’s “Type” is how we interpret these patterns What is 1101101? Integer (int): it is 109 Character (char): it is ‘m’ Floating point (float): it is 1.53x10-43 1-Jul-16 ES036 QMR/RE 20 Declaring Objects Type Tell the compiler in advance Types Names Names can have A-Z, az, 0-9 and ‘_’ Case sensitive Cannot start with a digit Cannot be a reserved word 1-Jul-16 Name int alice; float bob, chad; int alice = 10; int alice(10); float bob, chad = 2.4; float bob(1.5), chad(2.4); Element atom; ES036 QMR/RE 21 Identifier sum Box Built in type 75 Holds int type objects Size is 32 bits (4 bytes) Identifier Outer box atom Na User defined type 11 Inner boxes 22.989770 Holds Element type objects Size is 10 bytes 1-Jul-16 ES036 QMR/RE 22 Some Built In Types Data Type Range of Values Size char -128 to 127 1 byte int -2,147,483,648 to 2,147,483,647 4 bytes float 6 Digits of Precision ±3.402823x10±38 15 Digits of Precision ± 1.797693x10±308 True or False 4 bytes double boolean 1-Jul-16 ES036 QMR/RE 8 bytes 1 byte 23 Mixing types: avg = (a + b)/2; avg, a and b must be same type Exception It is OK to mix numerical types i.e. int, float, double Be 1-Jul-16 careful not to loose precision ES036 QMR/RE 24 C++ Reserved Words asm, auto, bool, break, case, catch, char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, export, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t, while 1-Jul-16 ES036 QMR/RE 25 Where to Declare Immediately prior to use int main() { … int sum; sum = a + b; … return 0; } 1-Jul-16 At the beginning int main() { int sum; … sum = a + b; … return 0; } ES036 QMR/RE 26 C++ Statements One C++ instruction that ends with a semicolon Can take more than one line Declaration statements Assignment statements 1-Jul-16 int sum(0), a(5), b(10); sum = a + b; float temp_c(0); float temp_f(78); temp_c = (temp_f – 32)*5/9; ES036 QMR/RE 27 Compound Statements Use { and } to group any number of statements This block is treated as one statement 1-Jul-16 { cout << “Hello”; return 0; } ES036 QMR/RE 28 Concepts Presented So Far How to write a simple C++ program? What is a variable? How to tell the compiler what variables I want? What is a C++ statement? 1-Jul-16 ES036 QMR/RE 29 #include <iostream> using namespace std; // entry point int main() { float w_lb, w_kg; Pre-processor directives “using” directives main: single C++ statement ! A declaration statement cout << "Enter weight (lb): "; cin >> w_lb; An assignment statement w_kg = w_lb * 0.454; cout << “Weight is " << w_kg << “kg\n"; return 0; } // end function main 1-Jul-16 ES036 QMR/RE 30 #include <iostream> // without “using namespace std;” // entry point int main() { float w_lb, w_kg; std::cout << "Enter weight (lb): "; std::cin >> w_lb; w_kg = w_lb * 0.454; std::cout << “Weight is " << w_kg << “kg\n"; return 0; } // end function main 1-Jul-16 ES036 QMR/RE 31 Symbolic Constants Objects that won’t let you change the initial value So, they must be given a value in its declaration As a matter of style, names are all caps E.g. const double PI = acos(-1.0); Always use to these to represent numeric values within your program Or for anything that you know will not change 1-Jul-16 ES036 QMR/RE 32 Calculating Things Using calculator 4-2+5-1 = ? +, - *, / and = are the operators 3+2*5 vs (3+2)*5 Need to consider operator precedence * and / have higher precedence than +, C++ operators have these and more 1-Jul-16 ES036 QMR/RE 33 C++ Operators Operators take one or more input values and produce one output value E.g. + , - , * , / , < , > , <= , >= , && , || Operators come in three flavours operators – take one input value Binary operators – take two input values Ternary operators – take three input values Unary 1-Jul-16 ES036 QMR/RE 34 C++ Operator Map Operators Binary Arithmetic + - add - - sub * - mul / - div % - mod 1-Jul-16 Logical && - and || - or Unary Bitwise & - and | - or ^ - xor Copy = +=, -=, *=, /=, %= &&=, ||=, &=, |=, ^= Comparison < - less-than > - gt.-than <= - less-or-eq >= - gt-or-eq == - equal != - not-equal ES036 QMR/RE Arithmetic - - negate ++ - increment -- - decrement Logical ! - negate Bitwise ~ - negate Pointer * , & 35 Unary Operators int a(9); Negate: -a gives -9 Logical-invert: !a gives 0 * and & are pointer operations (discussed later) Increment: ++ Decrement: - 1-Jul-16 ES036 QMR/RE 36 More Unary Expressions int a(9), b; Pre-Increment : b = a++; b is 9 and a is 10 Pre-Decrement : b b is 10 and a is 10 Post-Increment: b = ++a; = --a; b is 8 and a is 8 Post-Decrement: b 1-Jul-16 = a--; b is 9 and a is 8 ES036 QMR/RE 37 Arithmetic Operators: + - * / % a+b, a-b, a*b, a/b Integer division: 11/4 gives 2 Floating point division: 11.0/4 gives 2.75 Modulo operator: % (only for integers) 11%4 gives 3 10%5 gives 0 1-Jul-16 ES036 QMR/RE 38 Copy Operator (Assignment operator) Simple copy: a = b; Overwrites the left object (l-value) with the result of the expression on the right (r-value) l-value must be writable Copy with add a += b; is the same as a = a + b; Other copy-with-subtract, multiplication, division behaves the same a 1-Jul-16 -= b; a *= b; a /= b; etc ES036 QMR/RE 39 Comparison Operators < , > , =<, =>, ==, != All yield Boolean true (1) or false (0) 11<4 is false. 11<11 is false 11>4 is true. 11>11 is false 11>=11 and 11<=11 both are true 4==4 is true. 4!=4 is false Don’t 1-Jul-16 use floating-point values with == or != ES036 QMR/RE 40 Logical Operators Logical AND: && exp1 && exp2 && exp3 && exp3 Yields true if all the expressions are true If an expression is false, skips the rest Logical OR: || exp1 || exp2 || exp3 || exp3 Yields true if any expression is true If an expression is true, skips the rest These are called “short-circuit” operators 1-Jul-16 ES036 QMR/RE 42 Examples of Logical Operators (-6<0)&&(12>=10) true && true results in true (3.0 >= 2.0) || (3.0 >= 4.0) true || false results in true true && false (3.0 >= 2.0) && (3.0 >= 4.0) results in false 1-Jul-16 ES036 QMR/RE 43 Expressions A series of operators and their inputs E.g. x+3-y+5 Evaluated from left-toright Be careful with division Pay attention to operator precedence 1-Jul-16 x3 4 5 y3 is not the same as x 3/ 5 4/ y 3 Correct form: (x+3)/5 + 4/(y+3) ES036 QMR/RE 44 Operator Precedence Use parenthesis if you are not sure! Unary (++, --, !, -) Arithmetic (*, /, %, +, -) Comparison (< , <= , > , >=, ==, !=) Logical (&&, ||) Assignment (= , +=,-=,*= ,/= ,%=, etc) 1-Jul-16 ES036 QMR/RE 45 Expression Examples 2*x*x-3*y/5*y+6 Should really be 2*x*x-(3*(y/5)*y)+6 (2*x*x-3*y)/(5*y+6) 1-Jul-16 ES036 QMR/RE 3y 2x y6 5 2 2x 3 y 5y 6 2 46 Expressions With Side Effects r r r x = = = = x + y--; x + y; y ++x - y; x+1; r = is equivalent to = y-1; (two actions!) is equivalent to x - y; (two actions!) Keep it simple Not 1-Jul-16 r = --x + y++; ES036 QMR/RE 47 Using Standard Utilities C++ compilers comes with a vast collection of utilities: i/o, math etc This is called the “standard library” You need to: Include proper header files. E.g. #include<iostream> Use using namespace std; statement Or use std:: prefix 1-Jul-16 ES036 QMR/RE 48 Standard Input and Output Called the i/o stream objects #include <iostream> Input is usually from keyboard Output is usually to a console window cout object is the output stream (ostream) cin object is the input stream (istream) 1-Jul-16 ES036 QMR/RE 49 Producing Output With cout cout is an ostream object streams output to standard output uses the << (output) operator General Form: cout << expression << expression; Note: An expression is any C++ expression (string constant, identifier, formula or function call) 1-Jul-16 ES036 QMR/RE 50 //Example1 for input and output #include <iostream> #include <string> 1 using namespace std; 2 int main() 4.5 { output int i, j; 1,2, double x; 4.5 cm string units = “ cm”; cin >> i >> j; cin >> x; cout << “output \n”; cout << i << ‘,’ << j << ‘,’ << endl << x << units << endl; return 0; } // Input stream: 1-Jul-16 ES036 QMR/RE 51 Changing cout behaviour Use setf() and unsetf() to set following attributes E.g. cout.setf(ios::scientific); Flag ios::showpoint Meaning ios::fixed fixed decimal notation display the decimal point ios::scientific scientific notation 1-Jul-16 ios::right right justification ios::left left justification ES036 QMR/RE 52 cout Precision and justification With #include <iomanip> you can use setw(n) and setprecision(n) E.g. cin >> n; cout << setprecision(4) << “Sqrt with 4 digits: ” << sqrt(n) << endl << “Sqrt right justified: ” << setw(10) << sqrt(n) << endl; 1-Jul-16 ES036 QMR/RE 53 Characters and input with cin >> discards leading whitespace get() method is used to input whitespace characters 45 Example: c int x; char y; cin >> x >> y; cin >> x; cin.get(y); 1-Jul-16 39 b x: 45 y: ‘c’ x: 39 y: ‘\n ’ ES036 QMR/RE 54 Math Functions with <cmath> abs(x) computes absolute value of x sqrt(x) computes square root of x, where x >=0 pow(x,y) computes xy ceil(x) nearest integer larger than x floor(x) nearest integer smaller than x exp(x) computes ex log(x) computes ln x, where x >0 log10(x) computes log10x, where x>0 1-Jul-16 ES036 QMR/RE 55 Trigonometric Functions sin(x) sine of x, where x is in radians cos(x) cosine of x, where x is in radians tan(x) tangent of x, where x is in radians asin(x) sine-1(x), returns angle in radians [-π/2, π/2] acos(x) cosine-1(x), returns angle in radians [0,π] atan(x) tan-1(x), returns angle in radians [-π/2, π/2] atan2(y,x) tan-1(y/x), returns angle in radians [-π, π] sinh(x) Hyperbolic sine of x cosh(x) Hyperbolic cosine of x tanh(x) Hyperbolic tan of x 1-Jul-16 ES036 QMR/RE 56 Now you can … Create a simple project in Visual Studio Write C++ code that contains Getting user input Displaying information Complex calculations Compile and run above C++ code Make it work! Answer questions at the end of chapter 2 1-Jul-16 ES036 QMR/RE 57 Next Step Chapter 3 Control Structures if-else statements switch statements while and do-while loops for loops break and continue statements 1-Jul-16 ES036 QMR/RE 58