440 likes | 721 Views
CHƯƠNG 2: NHỮNG VẤN ĐỀ CƠ BẢN TRONG C++. 1. Cấu trúc chương trình. #include: yêu cầu chương trình dịch chèn thêm file vào mã nguồn. using namespace cout nằm trong namespace std; Hàm main() Câu lệnh: kết thúc bởi dấu “;”
E N D
1. Cấu trúc chương trình • #include: yêu cầu chương trình dịch chèn thêm file vào mã nguồn. • using namespace • cout nằm trong namespace std; • Hàm main() • Câu lệnh: kết thúc bởi dấu “;” • Câu chú thích: Câu chú thích bắt đầu bằng dấu // hoặc nằm trong /* */. • Xét ví dụ sau: #include <iostream> using namespace std; int main() { cout << “Hello world \n”; return 0; } http://www.uniqueness-template.com/devcpp/
2. Biến • Phải khai báo biến trước khi sử dụng • Có thể khai báo biến ở mọi nới trong chương trình • Tên biến • Phân biệt chữ hoa, chữ thường • Sử dụng các ký tự từ a-z, 0-9 và dấu “_” • Ví dụ: • int var1; • int var2=10;
Kiểu dữ liệu đơn giản • Kiểu nguyên: int, long, short • Kiểu ký tự: char – lưu mã ASCII của ký tự • Ký tự nằm trong dấu ‘’. Ví dụ: ‘a’ • Ký tự đặc biệt: \n, \tab, \\, \’, \”, … • Kiểu không dấu: unsigned char, unsigned int, unsigned short, unsigned long • Kiểu dấu phẩy động: float, double, long double • Kiểu bool: có giá trị True/False
Kiểu string • string không phải là kiểu cơ bản trong C++ • string được định nghĩa trong lớp chuẩn string #include <iostream> #include <string> using namespace std; int main () { string mystring; mystring = "This is the initial string content"; cout << mystring << endl; mystring = "This is a different string content"; cout << mystring << endl; return 0; }
Biến hằng (Constant Variables) • Giá trị của hằng không thay đổi. • Có 2 cách khai báo hằng: • const float PI=3.14; • #define PI 3.14 • Định nghĩa ở đầu chương trình • Không xác định kiểu của PI
3. Toán tử • Toán tử toán học • Toán tử quan hệ • Toán tử logic
Toán tử toán học • +, -, *, /, % • int i = 1/3; // kết quả i = 0 • float x = 1.0/3; // kết quả x=0.3333 • int j = 7 % 3; // kết quả j=1 • ++, -- int i=3; int j=7; • cout << 10 * i++; // hiển thị 30, sau đó i=4 • cout << 10 * ++j; // hiển thị 80, sau đó j=8 • +=, -=, *=, /= float x=6.0; x+=3.5; tương tự x=x+3.5;
Toán tử quan hệ • So sánh 2 giá trị. • Kết quả trả về là true hoặc false • >, <, ==, !=, >=, <= • Ví dụ: int x=44; int y=12; (x == y) // false (x >= y) // true (x != y) // true
Toán tử logic • logical and : && • (x >= 5) && ( x <= 15) // true nếu x nằm trong [5,15] • logical or : || • (x == 5) || ( x == 10) // true nếu x=5 hoặc x=10 • logical negation : ! • ! (x == 5) // true nếu x khác 5 • Tương tự x != 5 • Toán tử điều kiện (conditional operator) : ? … : • <condition> ? <true expression> : < false expression> • Ví dụ: • min = (alpha<beta) ? alpha : beta; • Tương tự if (alpha < beta) min = alpha; else min = beta;
4. Thao tác vào/ra chuẩn • Sử dụng đối tượng stream để thực hiện các thao tác input/output • Được khai báo trong header file iostream
Sử dụng cout • cout là một đối tượng được định nghĩa trước trong C++, tương ứng với luồng ra chuẩn (standard output stream). • Toán tử << là toán tử chèn, định hướng nội dung cần hiển thị. • Ví dụ: string str=”Hello world”; int i=8; cout << str << endl; // endl (hoặc \n) là dấu hiệu xuống dòng. cout << ”i=” << i << endl; • Để định dạng nội dung hiển thị, sử dụng setw (nằm trong iomanip) • cout<< setw(12) << str << setw(5) << i; • Kết quả: Hello world 8
Sử dụng cin • cin là toán tử được định nghĩa trước trong C++, tương ứng với luồng vào chuẩn (standard input stream). • Toán tử >> đưa nội dung từ luồng vào chuẩn vào biến. • Ví dụ: • int temperature; cout << ”Enter temperature in Celsius: ”; cin >> temperature; • int a,b; cin>>a>>b; // tương đương cin>>a; cin>>b;
cin và string cin>>mystring • cin dừng khi nhập dấu cách • Để lưu cả dòng khi nhập, sử dụng getline #include <iostream> #include <string> using namespace std; int main () { string mystr; cout << "What's your name? "; getline (cin, mystr); cout << "Hello " << mystr << ".\n"; cout << "What is your favorite team? "; getline (cin, mystr); cout << "I like " << mystr << " too!\n"; return 0; }
Header File và Library File • Một số nhiệm vụ được thực hiện bởi Library Function. • Header File chứa khai báo các hàm mà ta cần sử dụng trong chương trình. • Ví dụ: • #include <math.h> • #include ”myprog.h” • <>: yêu cầu chương trình dịch tìm từ thư mục chuẩn. • ” ” : yêu cầu chương trình dịch tìm từ thư mục hiện tại. • Nếu không include Header File thích hợp thì chương trình dịch sẽ báo lỗi.
library header file #include <somelib.h> myprog.cpp somelib.h user header file #include ”myprog.h” myprog.h compiler object file library file myprog.obj cs.lib linker executable file myprog.exe
5. Các câu lệnh • Vòng lặp • Rẽ nhánh • Một số lệnh điều khiển khác
initialization expression false test expression exit true body of loop increment expression Vòng lặp for for ( i=0; i<15; i++ ) initialization expression test expression increment expression • Có thể đặt nhiều biểu thức trong các phần của vòng for ( ; ; ); các biểu thức đó cách nhau bởi dấu phẩy. • Ví dụ: • for(int j=0, float alpha=100.0; j<50; j++, alpha--) • { • // body for • }
Vòng lặp for ... int i; for (i=1; i<=15; i++) // thân vòng lặp for có 1 lệnh cout << i*i << ” ”; cout << endl; for (i=1; i<=15; i++) // thân vòng lặp for có nhiều lệnh { cout << setw(4) << i << ” ”; // setw(n) gán kích thước của trường hiển thị bằng n int cube = i*i*i; cout << setw(6) << cube << endl; }
Vòng lặp while • Vòng lặp while được sử dụng khi không biết trước số lần lặp. • Lặp cho đến khi biểu thức kiểm tra vẫn có giá trị True. • Ví dụ: • char c=’n’; • while ( c != ’y’) • { • cout << ”Do you want to continue: (y/n)” << endl; • cin >> c; • }
while ( c != ’y’ ) { … } test expression false test expression exit true body of loop Vòng lặp while ...
Vòng lặp do • Trong vòng lặp do, biểu thức kiểm tra được đánh giá ở cuối vòng lặp. • Thân vòng lặp được thực hiện ít nhất một lần. • Ví dụ: • char c; • do • { • cout << ”Do you want to continue: (y/n)” << endl; • cin >> c; • } • while ( c != ’y’);
do { … } while ( c != ’y’ ); test expression body of loop false test expression exit true Vòng lặp do ...
If … Else • Phụ thuộc vào điều kiện kiểm tra là true hay false • để quyết định nhánh thực hiện • Ví dụ: • int x; • cout << ”Enter a number: ”; • cin >> x; • if ( x > 100) • cout << x << ” is greater than 100” << endl; • else • cout << x << ” is not greater than 100” << endl;
test expression if ( x > 100) { … } else { … } test expression false true body of if body of else exit If … Else
Lệnh switch • Lệnh switch được sử dụng khi có nhiều nhánh rẽ • phụ thuộc vào giá trị của cùng một biến. • switch(<variable>) • { • case <constant1>: • … • break; • case <constant2>: • … • break; • default : • … • }
Lệnh switch ... char c; cout << ”Enter your choice (a/b/c) : ”; cin >> c; switch (c) { case ’a’: cout << ”You picked a!” << endl; break; case ’b’: cout << ”You picked b!” << endl; break; case ’c’: cout << ”You picked c!” << endl; break; default: cout << ”You picked neither a,b,c !” << endl; }
true variable equals const 1 first case body false variable equals const 2 true second case body false default body exit Lệnh switch ...
Một số lệnh điều khiển khác • break: thoát khỏi vòng lặp hoặc switch • continue: trở lại đầu vòng lặp. • goto: nhảy tới một nhãn xác định
6. Kiểu dữ liệu cấu trúc • Structure là một tập hợp các biến đơn giản, tương tự như record trong Pascal. • Khai báo Structure: struct part { int modelnumber; int partnumber; float cost; }; • Định nghĩa biến kiểu Structure: part part1; • Khởi tạo các thành phần của Structure: part part1={6244, 373, 217.55}; • Truy cập vào các thành phần của Structure part1.modelnumber = 6244; part.modelnumber = 6244; //sai • Hai biến cùng kiểu structure có thể gán cho nhau part part2; part2=part1;
Structure lồng • Thành phần của Structure có thể là một structure khác. struct Distance struct Room { { int feet; Distance length; float inches; Distance width; }; }; • Truy cập vào các thành phần của Structure lồng Room dining; dining.length.feet=13; • Khởi tạo Structure lồng: Room dining = {{13, 6.5}, {10, 0.0}};
7. Kiểu liệt kê (Enumeration) • Định nghĩa enum: enum days_of_week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; • Khai báo biến kiểu enum days_of_enum day1, day2; • Giá trị của các biến kiểu enum là những giá trị mà enum đã định nghĩa trước. • Các giá trị của enum được lưu dưới dạng số nguyên, bắt đầu từ 0. • Ta có thể thay đổi giá trị nguyên của giá trị đầu trong enum enum days_of_week {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat}; days_of_enum day=Mon; cout << day; // Hiển thị 2
8. Hàm • Khai báo hàm xác định tên hàm, kiểu trả về, và các tham số cần thiết trong lời gọi hàm. • Khai báo hàm thường nằm trong Header File (.h) • Định nghĩa hàm chứa thân hàm. • Định nghĩa hàm thường nằm trong source file (.cpp) • Ví dụ • int fac(int); // function declaration • int fac(int n) // function definition { int result=1; for (int i=1; i<=n; i++) result*=i; return result; } • int x=7; cout << ”fac(” << x <<”)=” << fac(x); // call to a function;
Truyền trị (Passing by Value) • Khi truyền trị, hàm sẽ tạo ra một biến cục bộ để lưu giá trị của biến được truyền. • Giá trị của biến được truyền không thay đổi. • Ví dụ: void f(int val) { val++; } int x=4; f(x); cout << x; // x = 4
Truyền tham chiếu (Passing by Reference) • Tham chiếu cung cấp bí danh (alias) cho biến. • Khi truyền tham số theo kiểu tham chiếu thì biến cục bộ là bí danh của biến được truyền. • Địa chỉ của biến được truyền cho hàm. • Hàm có thể truy cập trực tiếp trên biến được truyền. • Ví dụ: void swap (int & a, int& b) { int tmp; tmp = a; a = b; b = tmp; } int x=3; int y=5; swap(x,y); // a,b là bí danh của x,y
Tham số hằng • Tham chiếu hằng không cho phép hàm thay đổi giá trị của biến được truyền. • Ví dụ: void f( int& a, const int& b ) // b là tham số hằng { a=5; // ok b=7; // fail }
Hàm có tham số mặc định #include <math.h> double logn (double x, double base=10) // mặc định gán base = 10 { return log(x)/log(base); } double y=5.6; cout << ”log(y) = ” << logn(y) << endl; // sử dụng giá trị mặc định cout << ”ln(y) = ” << logn(y,2.71828) << endl; // base = e cout << ”ld(y) = ” << logn(y,2) << endl; // base = 2
Hàm không có kiểu trả về • Sử dụng kiểu void • void cũng được sử dụng để khai báo hàm không có tham số. #include <iostream> using namespace std; void printmessage () { cout << "I'm a function!"; } int main () { printmessage (); return 0; } void printmessage (void) { cout << "I'm a function!"; }
main() main() …. …. Function1() …. …. Function1() …. …. Function1() …. …. …. …. …. …. …. …. Function1() …. …. Inline Fuction …. …. …. …. void Function1(); inline void Function1(i);
Chồng hàm (Overloaded Function) • Hàm chồng thực hiện các nhiệm vụ khác nhau phụ thuộc vào các tham số truyền. • Ví dụ: void print(int a) // in số nguyên { cout << ”integer : ” << a; } void print(string s) // in xâu ký tự { cout << ”string : ” << s; } int x=4; print(x); string st=“Hello”; print(st);
Phạm vi của biến • Một khối lệnh (block) nằm trong dấu { … } • Phạm vi của biến là khối lệnh mà biến được khai báo • Biến được khai báo ở ngoài hàm là biến toàn cục (global variable), ở trong hàm là biến cục bộ (local variable).