# 資料結構與物件導向程式設計 Data Structures and Object-oriented Programming (CSCS10021) Grading: * Lab & Quizzes (Programming, demo): 20% * Three Programming assignments, including program demonstration: First(5%)+Second(10%)+Third(10%). There are guidelines for completing the assignments. * Two midterms: First (10%) + Second(15%) * One final written exam: 30% Main Content: * C++ Functions and Scopes * Pointers and References * Classes and Objects * Data Sharing and Member Functions * Operator Overloading * Inheritance * Polymorphism and Virtual Functions * Streams and File I/O * Template and STL * Data structures: stack, queue, graph, map, trees, ... ## Introduction to Programming ### The Components of a Computer #### CPU * The ==central processing unit (CPU)== is the brain of a computer * ==Executes intructions retrieved from memory== * Speed is measured in megahertz (MHz) * 1 MHz = 1 million pulses per second ex. single core, dual core, quad core #### Memory * Memory stores data and program instructions of programs * A memory unit is an ordered sequence of bytes (1 byte = 8 bits) * A memory byte is non-empty. Its initial content may be meaningless ex. RAM (random-access memory), SRAM (static random-access memory), DRAM (dynamic random-access memory) #### Communication Devices ex. modem, bluetooth, network interface controller, Wi-Fi #### Storage Devices :::info **How is data stored?** Examples of data types include: * numbers * characters * strings They are encoded as a series of bits (zeros and ones). Digital devices have two stable states, which are referred to as zero and one. ::: * Volatile memory loses its contents when the power is turned off * Programs and data are permanently stored in storage devices, e.g., hard drives * They are moved to memory when necessary ex. Disk, CD, tape, USB flash drive #### Input Devices ex. keyboard, mouse #### Output Devices ex. monitor, printer * The monitor dispplays text and graphics * The resolution and dot pitch determine the quality of the monitor ### Programming Languages #### Machine Language * Machine language is a set of primitive instructions built into every computer for the CPU * The instructions are in the form of binary code * These programs are difficult to read and modify ex. We might write an instruction in binary like the following to add two numbers: > 1101101110011110 #### Assembly Language A program called **assembler** is used to translate assembly language programs into machine code. ex. We might write an instruction to add two numbers as follows: > ADDF3, R1, R2, R3 Which is 1101101110011110 in machine code #### High-Level Language High-level languages are English-like and easy to learn and program. ex. The following is a high-level language statement that computes the area of a circle with a radius of 5: > area = 5 * 5 * 3.1415; :::warning High-Level Languages: * Ada (named for Ada Lovelace) * BASIC (Beginner All-purpose Symbolic Instructional Code) * C (whose developer designed *B* first) * C++ (an object-oriented language, based on *C*) * C# (a *Java*-like language ceveloped by Microsoft) * COBOL (COmmon Business Oriented Language) * Delphi (*Pascal*-like visual language developed by Borland) * FORTRAN (FORmula TRANslation) * Java (a popular obejct-oriented language, similar to *C++*) * Pascal (named for Blaise Pascal) * Python * Ruby * Visual Basic (*BASIC*-like visual language developed by Microsoft) ::: ## C++ Basics ### "Hello World!" ``` #include <iostream> using namespace std; int main() { //Display "Hello World!" to the console cout<<"Hello World!"<<endl return 0; } ``` :::warning **::endl** It is a function, is a manipulator. It terminates a line and flushes the buffer. **<< "Hello World!\n"** '\n' sends the newline character but does not flush the buffer :::Flushing the buffer A buffer flush is the transfer of computer data ==from a temporary storage area to the computer's permanent memory==. For instance, if we make any changes in a file, the changes we see on one computer screen are stored temporarily in a buffer. ::: **using namespace std;** The functions *cout* and *endl* are defined in *namespace std*. ::: #### Namespaces A namespace is a declarative region that provides a scope to the identifiers (e.g., functions, variables, data type, etc.) ``` //In A.h, we have the following: namespace Peter { int a = 1; int foo(int n) { if (n <= 0) return 1; return n * foo(n-1); } } ``` ``` //In B.h, we have the following: namespace Mary { int a = 0; int foo(int n) { if (n <= 0) return 0; return n + foo(n-1); } } ``` ``` #include "A.h" #include "B.h" #include <iostream> using namespace Mary; int main() { std::cout<<Peter::foo(5)<<std::endl; std::cout<<foo(5)<<std::end; } ``` Avoid multiple declarations. ``` // In A.h, we have the following: #indef __A_file__ // directive #define __A_file__ namespace ns_A { int a = 1; int foo(int n) { if(n <= 0) return 1; return n * foo(n-1); } }; #endif ``` ``` #include "A.h" #include <iostream> using namespace ns_A, std; int main() { cout<<foo(5)<<std::endl; return 0; } ``` Display the message "Hello World!" on the console window. ``` #include <iostream> using namespace std; // argc: number of arguments // argv[]: store the arguments int main(int argc, char **argv) { // Display Hello World to the console cout << “Hello World!" << endl; return 0; } ``` #### Integrated Development Environments (IDEs) * Helps rapidly develop programs * Helps while editing, compiling, debugging, and others * Compiles and runs program * ex. Microsoft Visual C++, Dev-C++, Eclipse, NetBeans, etc. #### Extending the C++ Program ``` #include <iostream> **using namespace std;** int main() { cout << "Programming is fun!" << endl; cout << "I like programming!" << endl; cout << "I want to learn more..." << endl; return 0; // normal exit } ``` We can perform mathematical computations and display the results to the console. ``` #include <iostream> using namespace std; int main() { cout << (1 + 2 + 3) / 3 << endl; return 0; } ``` ``` #include <iostream> int main() { std::cout << (1 + 2 + 3) / 3 << std::endl; return 0; } ``` ### Display the records of students ``` #include <iostream> using namespace std; class STUDENT { protected: int score; // data field string name; public: void printf( ) { // member function cout << “Name:” << name << endl; cout << ‘Score:” << score << endl; } }; const int NUM = 80; STUDENT s[NUM]; // 80 objects int main() { …… for ( int i = 0; i < NUM; ++i ) s[i].printf( ); return 0; } ``` Or with easier management: ``` #include <iostream> #include “student.h” using namespace std; const int NUM = 80; ns_s::STUDENT s[NUM]; int main() { …… for ( int i = 0; i < NUM; ++i ) s[i].printf( ); return 0; } ``` ``` //In student.h #ifndef __STUDENT_RECORD__ #define __STUDENT_RECORD__ #include <iostream> using namespace std; namespace ns_s { class STUDENT { protected: int score; string name; public: void printf() { cout << “Name:” << name << endl; cout << ‘Score:” << score << endl; } }; }; #endif ``` ### About Header Files What are header files? The two files **string** and **string.h** are not the same file: * **string.h**: stores declaration of functions that are defined in *C* * **string**: stores declarations of functions that are declared in *C++* Different functions are defined in these two files. ## Lab 1 **Input format** The input begins with an integer n on a line, which means that there are n test cases. And the first character of each following row is the command. \+ : add two vectors. \* : dot product of two vectors. x : cross product of two vectors. p : print the vector. Each vector contains three integers. E.g. where x, y, z [𝑥, 𝑦, 𝑧] are three integers. **Constraints** Use class and switch to implement. **Output Format** You must output the result after doing the calculation. E.g. + 1 2 3 4 5 6 means [1, 2, 3] + [4, 5, 6] = [5, 7, 9] If the result number is [5, 7, 9], then you have to print [5,7,9]. **Sample Input** 7 p 2 3 4 \+ 1 2 3 4 5 6 \+ 8 9 3 0 2 7 \* 1 9 14 2 5 3 \* 2 7 5 11 3 0 \x 1 2 4 2 3 5 x 10 7 3 10 7 3 **Sample Output** [2,3,4] [5,7,9] [8,11,10] 89 43 [-2,3,-1] [0,0,0] **My Solution** ```c++= #include<iostream> #include<vector> using namespace std; //implement calculation class calculation { public: vector<int> addition(); int dotProduct(); vector<int> crossProduct(); vector<int> printVector(); }; vector<int> calculation::addition(){ vector<int>v1; vector<int>v2; vector<int>v(3); //output vector int a; //placeholder for input element for(int i = 0;i < 3;i++){ cin >> a; v1.push_back(a); } for(int i = 0;i < 3;i++){ cin >> a; v2.push_back(a); } for(int i = 0;i < 3;i++){ v[i] = v1[i] + v2[i]; } return v; } int calculation::dotProduct(){ vector<int>v1; vector<int>v2; vector<int>v(3); //new vector int newV; //sum of total of new vector int a; for(int i = 0;i < 3;i++){ cin >> a; v1.push_back(a); } for(int i = 0;i < 3;i++){ cin >> a; v2.push_back(a); } for(int i = 0;i < 3;i++){ v[i] = v1[i] * v2[i]; } newV = v[0] + v[1] + v[2]; return newV; } vector<int> calculation::crossProduct(){ vector<int>v1; vector<int>v2; vector<int>v(3); //output vector int a; for(int i = 0;i < 3;i++){ cin >> a; v1.push_back(a); } for(int i = 0;i < 3;i++){ cin >> a; v2.push_back(a); } //formula for cross product v[0] = v1[1] * v2[2] - v1[2] * v2[1]; v[1] = v1[2] * v2[0] - v1[0] * v2[2]; v[2] = v1[0] * v2[1] - v1[1] * v2[0]; return v; } vector<int> calculation::printVector(){ vector<int>v; int a; for(int i = 0;i < 3;i++){ cin >> a; v.push_back(a); } return v; } int main(){ int n; calculation calc; cin >> n; vector<vector<int>>outVec(n, vector<int>(3)); vector<bool>dotFlag(n); //picks out if the output is a single integer for(int i = 0 ; i < n ; i++){ char command; cin >> command; switch(command) { case '+': //addition outVec[i] = calc.addition(); dotFlag[i] = false; break; case '*': //dot product of two vectors outVec[i][0] = calc.dotProduct(); dotFlag[i] = true; break; case 'x': //cross product of two vectors outVec[i] = calc.crossProduct(); dotFlag[i] = false; break; case 'p': //print the vector outVec[i] = calc.printVector(); dotFlag[i] = false; break; } } for(int i = 0;i < n;i++){ if(dotFlag[i] == false){ cout << "["; for(int j = 0;j < 3;j++){ cout << outVec[i][j]; if(j < 2){ cout << ","; } } cout << "]" << endl; }else{ cout << outVec[i][0] << endl; //used specifically for the dot product } } system("pause"); return 0; } ```