Address Book TS. Lê Nguyên Khôi Trường Đại học Công nghệ, ĐHQGHN
Project 2 Address Book 1 Yêu cầu cơ bản Lưu (save) và xóa (remove) bản ghi (record) bao gồm tên (name) và số điện thoại (phone number). Hiển thị được danh sách của tất cả các bản ghi. Tìm kiếm theo tên hoặc số điện thoại. Yêu cầu nâng cao Lưu các bản ghi ra một file. Nhóm các bản ghi. Tìm kiếm với thông tin không đầy đủ. Bảo vệ dữ liệu bằng mật khẩu và mã hóa. Lưu được tên Tiếng Việt. v v
Address Book Nộp Chương Trình Thời gian: trước 12:00 thứ 2 ngày 25/03/2019 Cách thức: gửi email tới khoi.n.le@vnu.edu.vn và sonnn12@vnu.edu.vn Tiêu đề: [INT 2202 6] Address Book.cpp Nội dung: đính kèm file 18020000_addBook.cpp 18020000 là mã số sinh viên.cpp là file chương trình 2
Address Book Nộp Báo Cáo 3 Thời gian: trước 12:00 thứ 6 ngày 22/03/2019 Cách thức: gửi email tới khoi.n.le@vnu.edu.vn và sonnn12@vnu.edu.vn Tiêu đề: [INT 2202 6] Address Book.doc Nội dung: đính kèm file 18020000_addBook.doc 18020000 là mã số sinh viên.doc là file báo cáo Báo cáo bản cứng: tại buổi học lý thuyết Tuần 07 nhiều nhất 04 trang A4 in hai mặt, font chữ Arial, cỡ chữ 13, dãn dòng 1.25
Kiểu Dữ Liệu Trong C++ Số nguyên: int Số thực: double Logic: bool Ký tự: char Xâu ký tự: string (tải thư viện) Mảng: int vec[] = {0, 0, 1; char sp[] = "Thank you!"; double a[4][3]; int vec[3]; vec[0] = 0; vec[1] = 0; vec[2] = 1; 4
Kiểu Dữ Liệu Có Cấu Trúc Trong C++ 5 Kiểu Mảng: Tập hợp dữ liệu cùng kiểu Khai báo sau đó sử dụng như biến đơn lẻ Truyền cho hàm: truyền địa chỉ (tham chiếu) Kiểu cấu trúc struct: Tập hợp dữ liệu có thể khác kiểu Phải định nghĩa trước khi sử dụng Khai báo sau đó sử dụng như biến đơn lẻ Truyền cho hàm: giống biến đơn lẻ
Kiểu Dữ Liệu Cấu Trúc struct 6 Tập hợp dữ liệu, có thể khác kiểu Mỗi dữ liệu được lưu trong một biến Mỗi dữ liệu có kiểu dữ liệu cụ thể Hỗ trợ tổ chức dữ liệu phức tạp vào cùng một đối tượng Hỗ trợ làm việc giữa các dữ liệu trên cùng một đối tượng
Bài Toán Điểm Tọa Độ Point 7 Điểm trong hệ tọa độ không gian 2 chiều Cặp tọa độ x- và y- Nhập và in tọa độ của một điểm Kiểm tra 2 điểm trùng nhau Tính trung điểm của 2 điểm
Quản Lý Point Sử Dụng Biến Đơn 8 bool isequal(double _1X, double _1Y, double _2X, double _2Y) { return (_1X == _2X && _1Y == _2Y); int main() { double ax = 1.2, ay = 0.4; double bx = 2.0, by = 1.6; if (isequal(ax, ay, bx, by)) cout << "trung nhau"; else cout << "khong trung nhau"; return 0;
Quản Lý Point Sử Dụng struct 9 struct Point { double X, Y; ; bool isequal(point p1, Point p2) { return (p1.x == p2.x && p1.y == p2.y); int main() { Point p1, p2; p1.x = 1.2; p2.y = 0.4; p2.x = 2.0; p2.y = 1.6; if (isequal(p1, p2)) cout << "trung nhau"; else cout << "khong trung nhau"; return 0;
Kiểu Dữ Liệu Cấu Trúc struct 10 Định nghĩa bởi từ khóa struct Định nghĩa toàn cục Ngoài và trước int main() Tất cả các hàm đều hiểu Miêu tả: Các thành phần (trường) và kiểu của chúng Không được cấp phát bộ nhớ Chỉ có mục đích miêu tả cấu trúc Chỉ cấp phát bộ nhớ Khi khai báo biến kiểu cấu trúc
Cấu Trúc struct Point 11 Định nghĩa bởi từ khóa struct struct Point { double X; double Y; ; // định nghĩa kiểu Point bao gồm // trường dữ liệu X // trường dữ liệu Y Ý nghĩa: Point p1, p2; Mỗi biến p1, p2 thuộc kiểu Point có hai thành viên dữ liệu là X kiểu double và Y kiểu double X p1 Y X p2 Y
Cấu Trúc struct Point 12 Định nghĩa bởi từ khóa struct struct Point { double X; double Y; ; Sử dụng: Point p; p.x = 1.0; p.y = 2.1; cout << p.x; // định nghĩa kiểu Point bao gồm // trường dữ liệu X // trường dữ liệu Y p X Y // khai báo biến p kiểu Point // gán giá trị cho trường X của p // gán giá trị cho trường Y của p // lấy giá trị trường X của p
Truy Cập Thành Phần struct 13 Sử dụng toán tử chấm (.) p. X p. Y Tên gọi: biến thành phần Các thành phần của biến kiểu cấu trúc Kiểu cấu trúc struct khác nhau có thể có cùng tên biến thành phần Biến thành phần là biến cục bộ
Cấu Trúc struct Phép Gán 14 Với cấu trúc struct Point Khai báo 2 biến cấu trúc Point p1, p2; Cả 2 biến đều kiểu Point Thực hiện phép gán đơn giản hợp lệ p1 = p2; Sao chép giá trị các biến thành phần của điểm p1 cho các biến thành phần của điểm p2 p1.x = p2.x; p1 p2 p1.y = p2.y; X Y X Y
Cấu Trúc struct Phép Toán Khác 15 Các phép toán khác không được định nghĩa cho kiểu cấu trúc struct So sánh bằng/khác (==,!=) p1 == p2 biểu thức không hợp lệ So sánh thứ tự (<, >,...) p1 < p2 biểu thức không hợp lệ Các phép toán p1 + p2 biểu thức không hợp lệ Nhập & in cin >> p1 & cout << p1 không hợp lệ
Truyền Biến Cấu Trúc struct Cho Hàm Truyền tham số void in(point p) { cout << p.x; cout << p.y; 16 Truyền tham chiếu: void nhap(point& p) { cin >> p.x; cin >> p.y;
struct Point Khai Báo/Khởi Tạo 17 struct Point { double X, Y; ; void nhap(point& p); void in(point p); bool isequal(point p1, Point p2); void calmidpoint(point p1, Point p2, Point& mpoint); int main() { Point p1 = { 1.0, 2.1 ; Point p2, midpoint; nhap(p2); calmidpoint(p1, p2, midpoint); in(midpoint); return 0;
Cấu Trúc struct & Con Trỏ 18 Giống các kiểu dữ liệu khác: Point * là kiểu con trỏ tới Point Toán tử & trả về địa chỉ của biến cấu trúc Theo thứ tự ưu tiên:. được ưu tiên trước * Nếu p là con trỏ tới cấu trúc Point: *p.x tương đương *(p.x) không hợp lệ Phải sử dụng (*p).x Để thuận tiện, có thể dùng toán tử ->: kết hợp con trỏ (*) với truy cập trường (.) p->x tương đương (*p).x
struct Point Con Trỏ 19 struct Point { double X, Y; ; void nhap(point& p); int main() { Point p1, p2; nhap(p1); nhap(p2); Point *pp1 = &p1; Point *pp2 = &p2; Point *pmidpoint = new Point; pmidpoint->x = (pp1->x + pp2->x)/2; (*pmidpoint).y = ((*pp1).y + (*pp2).y)/2; return 0;
struct Point Mảng 20 struct Point { double X, Y; ; void nhap(point& p); int main() { Point mangp1[10]; Point *mangp2 = new Point[10]; for (int i = 0; i < 10; i++) { nhap(mangp1[i]); nhap(mangp2[i]); return 0;
struct TamGiac Building Block 21 struct TamGiac { Point dinha, dinhb, dinhc; ; bool istamgiac(const TamGiac& tg); bool istamgiacdeu(const TamGiac& tg); bool istamgiaccan(const TamGiac& tg); bool istamgiacvuong(const TamGiac& tg); bool istamgiacvuongcan(const TamGiac& tg); double tinhchuvi(const TamGiac& tg); int main() { TamGiac tg; if (istamgiac(tg)) return 0;
struct TamGiac Building Block 22 struct TamGiac { Point dinha, dinhb, dinhc; int type; bool istamgiac(); bool istamgiacdeu(); bool istamgiaccan(); bool istamgiacvuong(); bool istamgiacvuongcan(); double tinhchuvi(); ; int main() { TamGiac tg; if (tg.istamgiac()) return 0;
Sub Project 1 23 Cài đặt kiểu dữ liệu mới Point và TamGiac Cài đặt các hàm cần thiết cho 2 kiểu này Viết chương trình xử lý dữ liệu cho 10 tam giác kiểu TamGiac. Đếm số lượng mỗi loại tam giác In ra các cặp tam giác đồng dạng
Building Block struct RigidBody { double x, y, theta; double dx, dy, dtheta; double ddx, ddy, ddtheta; ; int main() { RigidBody foot; z 24 foot.x = 1.0; foot.y = 0.0; foot.theta = 90.0; foot.x = 0.5; foot.y = 1.0; foot.theta = -5.0; x O y
Building Block struct RigidBody { double x, y, theta; double dx, dy, dtheta; double ddx, ddy, ddtheta; ; z struct Robot { int id; RigidBody head, body; RigidBody arml, armr; RigidBody legl, legr; ; int main() { Robot rbt1; rbt1.id = 1; x O rbt1.legl.x = 1.0; rbt1.armr.y = 3.0; 25 y
struct Person 26 struct Person { int id; string name; long phone_number; ; void print() { void scan(person& student) { int main() { Person student; scan(student); student.print(); return 0;
Sub Project 2 27 In ra tất cả thông tin của 5 sinh viên Bổ sung các thông tin cần thiết của sinh viên
#include <fstream> 28 #include <fstream> using namespace std; int main { ifstream in_stream; ofstream out_stream; in_stream.open("infile.txt"); out_stream.open("outfile.txt"); int so1, so2, so3; in_stream >> so1 >> so2 >> so3; out_stream << "Tong 3 so dau la " << (so1 + so2 + so3) << endl; in_stream.close(); out_stream.close(); return 0;
Sub Project 3 29 Viết chương trình đọc dữ liệu của 5 sinh viên từ file vào chương trình. Sau đó in ra thông tin của 5 sinh viên này.
Simple Calculator Nhận Xét while (notquit) { flag = op; switch (flag) { case A_MODE: case F_MODE: if (flag == A_MODE) { switch (op) { else if (flag == F_MODE) { switch (f_name) { case SINE: sin(no * PI / 180); case COSINE: cos(no * PI / 180); Set Mode?A_MODE?F_MODE?M_MODE A Mode F Mode M Mode 30
Project 2 Address Book 31 Yêu cầu cơ bản Lưu (save) và xóa (remove) bản ghi (record) bao gồm tên (name) và số điện thoại (phone number). Hiển thị được danh sách của tất cả các bản ghi. Tìm kiếm theo tên hoặc số điện thoại. Yêu cầu nâng cao Lưu các bản ghi ra một file. Nhóm các bản ghi. Tìm kiếm với thông tin không đầy đủ. Bảo vệ dữ liệu bằng mật khẩu và mã hóa. Lưu được tên Tiếng Việt. v v
#include <string> 32 std::string là mảng ký tự: Nhiều hàm tiện ích xử lý ký tự và xâu Tìm kiếm, thay thế Viết mã nguồn ngắn, ít lỗi Sử dụng thư viện Tập trung xây dựng chương trình Viết mã nguồn dễ đọc, dễ hiểu, dễ gỡ lỗi
#include <string> Bằng Nhau 33 string str1 = "0123456789abcdefghij"; string str2 = "0123456789abcdefghij"; bool isequal = true; for (int i=0; i<20; i++;) { if ( str1[i]!= str2[i] ) { isequal = false; break; if (isequal) cout << "EQUAL" << endl; else cout << "NOT EQUAL" << endl;
#include <string> Cơ Bản 34 str1 = str2 gán giá trị xâu s.at(i) và s2[i] truy cập ký tự s.front() truy cập đầu s.back() truy cập cuối s.empty() kiểm tra xâu rỗng s.size() độ dài xâu std::string::npos = -1
#include <string> substr string a = "0123456789abcdefghij"; 35 std::string sub1 = a.substr(10); std::cout << sub1 << '\n'; // abcdefghij std::string sub2 = a.substr(5, 3); // 567 std::cout << sub2 << '\n'; try { // pos is out of bounds, throws std::string sub3 = a.substr(a.size()+3, 50); std::cout << sub3 << '\n'; catch(const std::out_of_range& e) { std::cout << "pos exceeds string size\n";
#include <string> find 36 int main() { std::string::size_type n; std::string const s = "This is a string"; n = s.find("is"); print(n, s); n = s.find("is", 5); print(n, s); n = s.find('a'); print(n, s); n = s.find('q'); print(n, s); // is is a string // is a string // a string // not found
#include <vector> 37 std::vector là mảng: Không quan tâm đến độ dài của mảng Nhiều hàm tiện ích xử lý phần tử mảng Viết mã nguồn ngắn, ít lỗi Sử dụng thư viện Tập trung xây dựng chương trình Viết mã nguồn dễ đọc, dễ hiểu, dễ gỡ lỗi
#include <vector> Sử Dụng 38 // Khởi tạo vector chứa số nguyên std::vector<int> vec_i = {7, 5, 16, 8; // Khởi tạo vector chứa ký tự std::vector<char> vec_c = {'a', 'b', 'c', 'd',; // Khai báo vector chứa xâu std::vector<char> vec_c = {'a', 'b', 'c', 'd',; // Khai báo vector chứa Person std::vector<person> vec_p (10); for (auto i : vec_p) std::cout << i; // cài đặt operator<< cho kiểu Person // hoặc gọi hàm print(person)
#include <algorithm> 39 std::sort sắp xếp std::binary_search tìm kiếm trên mảng đã sắp xếp
#include <algorithm> sort 40 std::vector<int> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3; std::sort(s.begin(), s.end()); for (auto a : s) std::cout << a << " "; std::sort(s.begin(), s.end(), std::greater<int>()); for (auto a : s) std::cout << a << " "; struct { bool operator()(int a, int b) const { return a < b; customless; std::sort(s.begin(), s.end(), customless); for (auto a : s) std::cout << a << " ";
#include <algorithm> sort 41 vector<int> v1 {1, 3, 4, 5, 9; vector<int> v2 {1, 2, 3; for (auto v : v2) { std::cout << "Searching for " << v << '\n'; if (binary_search(v1.begin(), v1.end(), v)) { std::cout << "Found " << v << '\n'; else { std::cout << "no dice!\n";
struct PS 42 struct PS { int ts; int ms; bool operator< (const PS& ps1, const PS& ps2) { return ( ps1.ts * ps2.ms < ps2.ts * ps1.ms ); bool operator< (const PS& ps1, const PS& ps2) { return ( (double)ps1.ts / ps1.ms < (double)ps2.ts / ps2.ms ); ostream& operator<< (ostream& outstream, const PS& ps) { int main() { vector<ps> vec_ps (10); std::sort(vec_.begin(), vec_.end()); for (auto ps : vec_ps) std::cout << ps << " ";
<boost/algorithm/string.hpp> 43 int main() { string input("geeks\tfor\tgeeks"); vector<string> result; boost::split(result, input, boost::is_any_of("\t")); for (int i = 0; i < result.size(); i++) cout << result[i] << endl; return 0; Output: geeks for geeks
Address Book Nộp Bài 44 Báo cáo bản cứng: tại buổi học lý thuyết Tuần 07 nhiều nhất 04 trang A4 in hai mặt, font chữ Arial, cỡ chữ 13, dãn dòng 1.25 Thời gian: trước 12:00 thứ 6 ngày 22/03/2019 Nội dung: đính kèm file 18020000_addBook.doc Thời gian: trước 12:00 thứ 2 ngày 25/03/2019 Nội dung: đính kèm file 18020000_addBook.cpp
Address Book Main Loop 45 initaddressbook(); while (notquit) { switch (mode) { default: case EDIT case FIND: case REMOVE: case SAVE: init?edit?find?remove edit find remove
Sơ Đồ Khối Luồng Điều Khiển Chính 46 Set Mode?A_MODE else else else?f_mode?m_mode if if if A Mode F Mode M Mode
Sơ Đồ Khối Luồng A Mode 47 A Mode res num? + else else else?? * if res += num if res = num if res *= num
Sơ Đồ Khối Thành Phần 48 Luồng điều khiển Luồng rẽ nhánh? else if Khối mệnh lệnh
Project 2 Address Book 49 Yêu cầu: SAVE: lưu bản ghi mới REMOVE: xóa bản ghi cũ DISPLAY: hiển thị bản ghi SEARCH: tìm bản ghi LOAD: tải danh sách bản ghi từ file STORE: lưu danh sách bản ghi ra file GROUP: nhóm bản ghi
Project 2 Address Book 50 Thông tin bản ghi: ID: kiểu Tên: kiểu Số điện thoại: kiểu Danh bạ: Tập các bản ghi Kiểu: mảng, vector,?
Project 2 Address Book 51