Chủ Nhật, 15 tháng 3, 2015

tổng quan về lập trình hướng đối tượng OOP C++

Mục tiêu của kỹ sư lập trình:
Tạo ra sản phẩm tốt một cách có hiệu quả
Nắm bắt được công nghệ

Độ phức tạp và độ lớn ngày càng cao:
Một số hệ Unix chứa khoảng 4M dòng lệnh
MS Windows chứa hàng chục triệu dòng lệnh
Người dùng ngày càng đòi hỏi nhiều chức năng, đặc biệt là chức năng thông minh
Phần mềm luôn cần được sửa đổi


Cần kiểm soát chi phí:
Chi phí phát triển
Chi phí bảo trì
Giải pháp chính là sử dụng lại (tái sử dụng):
Giảm chi phí và thời gian phát triển
Nâng cao chất lượng

Để sử dụng lại (mã nguồn):
Cần dễ hiểu
Được coi là chính xác
Có giao diện rõ ràng
Tính module hóa
Không yêu cầu thay đổi khi sử dụng trong chương trình mới

Tính tái sử dụng (reusability): thiết kế các thành phần có thể được sử dụng trong nhiều phần mềm khác nhau
Tính mở rộng (extensibility)
Tính mềm dẻo (flexibility):
Có thể dễ dàng thay đổi khi thêm mới dữ liệu hay tính năng.
Các thay đổi không làm ảnh hưởng nhiều đến toàn bộ hệ thống

Sự tiến hóa của các phương pháp lập trình:
Lập trình không có cấu trúc
Lập trình có cấu trúc (lập trình thủ tục), hướng chức năng
Lập trình hướng đối tượng

Là phương pháp xuất hiện đầu tiên:
Các ngôn ngữ như Assembly, Basic
Sử dụng các biến toàn cục
Lạm dụng lệnh GOTO
Nhược điểm?
Khó hiểu, khó bảo trì, hầu như không thể sử dụng lại
Chất lượng kém, Chi phí cao
Không thể phát triển các ứng dụng lớn

Trong thế giới thực, chung quanh chúng ta là những đối tượng, đó là các thực thể có mối quan hệ với nhau.
Ví dụ: Các phòng trong một công ty
Lập trình hướng đối tượng (Object Oriented Programming – LTHĐT)?
Là phương pháp lập trình lấy đối tượng làm nền tảng để xây dựng thuật giải, xây dựng chương trình.

Lập trình hướng đối tượng là phương pháp
lập trình dựa trên kiến trúc lớp (class)
và đối tượng (object)

Đối tượng (object):
Trong thế giới thực, đối tượng được hiểu như là một thực thể: người, vật hoặc một bảng dữ liệu…
Mỗi đối tượng sẽ tồn tại trong một hệ thống và có ý nghĩa nhất định trong hệ thống.
Đối tượng giúp biểu diễn tốt hơn thế giới thực trên máy tính
Mỗi đối tượng bao gồm 2 thành phần: thuộc tính và thao tác (hành động).

Ví dụ đối tượng: một người
Một người có các thuộc tính: tên, tuổi, địa chỉ, màu mắt…
Các hành động: đi, nói, thở…

Lớp (class):
Các đối tượng có các đặc tính tương tự nhau được gom chung thành lớp đối tượng. Một lớp đối tượng đặc trưng bằng các thuộc tính, và các hành động (hành vi, thao tác).
Thuộc tính (Attribute): Một thành phần của đối tượng, có giá trị nhất định cho mỗi đối tượng tại mỗi thời điểm trong hệ thống.
Thao tác (Operation): Thể hiện hành vi của một đối tượng tác động qua lại với các đối tượng khác hoặc với chính nó.

Mỗi thao tác trên một lớp đối tượng cụ thể tương ứng với một cài đặt cụ thể khác nhau. Một cài đặt như vậy được gọi là một phương thức (method).
Cùng một phương thức có thể được áp dụng cho nhiều lớp đối tượng khác nhau, một thao tác như vậy được gọi là có tính đa hình (polymorphism).
Một đối tượng cụ thể thuộc một lớp được gọi là một thể hiện (instance) của lớp đó.
Ví dụ Joe Smith, 25 tuổi, nặng 58kg, là một thể hiện của lớp người.

Ta dùng sơ đồ đối tượng để mô tả các lớp đối tượng. Sơ đồ đối tượng bao gồm sơ đồ lớp và sơ đồ thể hiện.
Sơ đồ lớp mô tả các lớp đối tượng trong hệ thống, một lớp đối tượng được diễn tả bằng một hình chữ nhật gồm 3 phần:
Phần đầu chỉ tên lớp
Phần 2 mô tả các thuộc tính
Phần 3 mô tả các thao tác của các đối tượng trong lớp

Trừu tượng hóa dữ liệu và các hàm/thủ tục liên quan.
Chia hệ thống ra thành các lớp/đối tượng.
Mỗi lớp/đối tượng có các tính năng và hành động chuyên biệt.
Các lớp có thể được sử dụng để tạo ra nhiều đối tượng cụ thể.

Các lớp đối tượng - Classes
Đóng gói - Encapsulation
Thừa kế - Inheritance
Đa hình - Polymorphism

Cách nhìn khái quát hóa về một tập các đối tượng có chung các đặc điểm được quan tâm (và bỏ qua những chi tiết không cần thiết).

Đóng gói: Nhóm những gì có liên quan với nhau vào làm một, để sau này có thể dùng một cái tên để gọi đến
Các hàm/ thủ tục đóng gói các câu lệnh
Các đối tượng đóng gói dữ liệu của chúng và các thủ tục có liên quan

Che dấu thông tin: đóng gói để che một số thông tin và chi tiết cài đặt nội bộ để bên ngoài không nhìn thấy
Che giấu những gì mà người dùng không cần.
Che giấu những gì mà mình cần giữ bí mật

Thừa kế
Là cơ chế cho phép một lớp D có được các thuộc tính và thao tác của lớp C, như thể các thuộc tính và thao tác đó đã được định nghĩa tại lớp D.
Cho phép cài đặt nhiều quan hệ giữa các đối tượng:
Đặc biệt hóa (“là”)
Khái quát hóa

Đa hình
Là cơ chế cho phép một tên thao tác hoặc thuộc tính có thể được định nghĩa tại nhiều lớp và có thể có nhiều cài đặt khác nhau tại mỗi lớp trong các lớp đó.

Các ưu điểm của OOP
Nguyên lý kế thừa: tránh lặp, tái sử dụng.
Nguyên lý đóng gói – che dấu thông tin: chương trình an toàn không bị thay đổi bới những đoạn chương trình khác
Dễ mở rộng, nâng cấp
Mô phỏng thế giới thực tốt hơn.

Các đặc tính chính của OOP
Chương trình được chia thành các đối tượng.
Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được đối tượng.
Các hàm thao tác trên các vùng dữ liệu của đối tượng được gắn với cấu trúc dữ liệu đó.
Dữ liệu được đóng gói lại, được che giấu và không cho phép các hàm ngoại lai truy nhập tự do.
Các đối tượng tác động và trao đổi thông tin với nhau qua các hàm.
Có thể dễ dàng bổ sung dữ liệu và các hàm mới vào đối tượng nào đó khi cần thiết.
Chương trình được thiết kế theo cách tiếp cận từ dưới lên (bottom-up).

sự khác biệt giữa c và c++

Phạm vi và khai báo:
Không giống như C, chúng ta có thể khai báo một biến tại một vị trí bất kỳ trong chương trình.
Một biến chỉ có tầm tác dụng trong khối lệnh nó được khai báo.
Do đó, C++ cung cấp toán tử định phạm vi (::) để xác định rõ biến nào được sử dụng khi xảy ra tình trạng định nghĩa chồng một tên biến trong một khối lệnh con.
cin
Standard input stream
Normally keyboard
cout
Standard output stream
Normally computer screen
cerr
Standard error stream
Display error messages
cin and cout (and #include <iostream.h>):
cout << "hey";
char name[10];
cin >> name;
cout<<"Hey "<<name<<", nice name." << endl;
cout << endl;
Tham số mặc nhiên
Mục đích:
Gán các giá trị mặc nhiên cho các tham số của hàm.
Khai báo tham số mặc nhiên:
Tất cả các tham số mặc nhiên đều phải để ở cuối hàm.
Chỉ cần đưa vào khai báo, không cần trong định nghĩa.
Gọi hàm có tham số mặc nhiên:
Nếu cung cấp đủ tham số dùng tham số truyền vào.
Nếu không đủ tham số dùng tham số mặc nhiên.
C++ cho phép định nghĩa các hàm trùng tên.
Qui tắc tái định nghĩa:
Các hàm trùng tên phải khác nhau về tham số: Số lượng, thứ tự, kiểu
Qui tắc gọi hàm?
Tìm hàm có kiểu tham số phù hợp
Dùng phép ép kiểu tự động
Tìm hàm gần đúng (phù hợp) nhất
Toán tử cấp phát bộ nhớ động new
int *x;
x = new int; //x = (int*)malloc(sizeof(int));
char *y;
y = new char[100]; //y = (char*)malloc(100);
Toán tử giải phóng vùng nhớ động delete
delete x; // free(x);
delete y; // free(y);
Truyền theo giá trị (tham trị)
Giá trị tham số khi ra khỏi hàm sẽ không thay đổi.
Truyền theo địa chỉ (tham chiếu)
Giá trị tham số khi ra khỏi hàm có thể thay đổi.
Tham chiếu là địa chỉ vùng nhớ được cấp phát cho một biến.
Ký hiệu & đặt trước biến hoặc hàm để xác định tham chiếu của chúng
Ví dụ 1:
int x = 10, *px = &x, &y = x;
*px = 20;
y = 30;
Ví dụ 2:
int arrget(int *a, int i) { return a[i]; }
arrget(a, 1) = 1; // a[1] = 1;
cin >> arrget(a,1); // cin >> a[1];
Ví dụ 3:
void swap1(int x, int y) { int t = x; x = y; y = t; }
void swap2(int *x, int *y) { int *t = x; x = y; y = t; }
void swap3(int &x, int &y) { int t = x; x = y; y = t; }
Bài tập :
Viết chương trình nhập vào một phân số, rút gọn phân số và xuất kết quả.
Viết chương trình nhập vào hai phân số, tìm phân số lớn nhất và xuất kết quả.
Viết chương trình nhập vào hai phân số. Tính tổng, hiệu, tích, thương giữa chúng và xuất kết quả.
Viết chương trình nhập vào một ngày. Tìm ngày kế tiếp và xuất kết quả.
Viết chương trình nhập họ tên, điểm toán, điểm văn của một học sinh. Tính điểm trung bình và xuất kết quả.
Cho một danh sách lưu thông tin của các nhân viên trong một công ty, thông tin gồm:
- Mã nhân viên (chuỗi, tối đa là 8 ký tự)
- Họ và tên (chuỗi, tối đa là 20 ký tự)
- Phòng ban (chuỗi, tối đa 10 ký tự)
- Lương cơ bản (số nguyên)
- Thưởng (số nguyên)
- Thực lãnh (số nguyên, trong đó thực lãnh = lương cơ bản + thưởng )
Hãy thực hiện các công việc sau:
a.Tính tổng thực lãnh tháng của tất cả nhân viên trong công ty.
b.In danh sách những nhân viên có mức lương cơ bản thấp nhất.
c.Đếm số lượng nhân viên có mức thưởng >= 1200000.
d.In danh sách các nhân viên tăng dần theo phòng ban, nếu phòng ban trùng nhau thì giảm dần theo mã nhân viên.

Thứ Bảy, 14 tháng 3, 2015

C/C++ nhập vào 1 ngày, tìm ngày kế tiếp và xuất kết quả

  1. C/C++ nhập vào 1 ngày, tìm ngày kế tiếp và xuất kết quả
  2. // Viet chuong trinh nhap vao 1 ngay. Tim ngay ke tiep va xuat ket qua.
  3. #pragma region +Declaration.
  4.  
  5. #pragma region _Library
  6. #include <iostream>
  7. using namespace std;
  8. #pragma endregion
  9.  
  10. #pragma region _Data Struct
  11. typedef struct Date
  12. {
  13.         int dd;
  14.         int mm;
  15.         int yyyy;
  16. } D;
  17. #pragma endregion
  18.  
  19. #pragma region _Prototype.
  20. void InputDate (D&);
  21. void OutputDate (D);
  22. D NextDate(D&);
  23. #pragma endregion
  24.  
  25. #pragma endregion
  26.  
  27. #pragma region +Main Function.
  28. void main ()
  29. {
  30.         D a;
  31.  
  32.         cout << "Input Date:" << endl;
  33.         InputDate (a);
  34.         cout << "\n\nNext Date: ";
  35.         OutputDate (NextDate(a));
  36.  
  37.         system("pause");
  38. }
  39. #pragma endregion
  40.  
  41. #pragma region +Define Function
  42. void InputDate (&a)
  43. {
  44.         int x;
  45.         do
  46.         {
  47.                 cout << "Day: ";
  48.                 cin >> a.dd;
  49.                 cout << "Month: ";
  50.                 cin >> a.mm;
  51.                 cout << "Year: ";
  52.                 cin >> a.yyyy;
  53.  
  54.                 switch (a.mm)
  55.                 {
  56.                 case 1: case 3: case 5: case 7: case 8: case 10: case 12:
  57.                         x = 31;
  58.                         break;
  59.                 case 4: case 6: case 9: case 11:
  60.                         x = 30;
  61.                         break;
  62.                 case 2:
  63.                         if ((a.yyyy % 400 == 0) || (a.yyyy % 4 == 0 && a.yyyy % 100 != 0))
  64.                                 x = 29;
  65.                         else
  66.                                 x = 28;
  67.                         break;
  68.                 default: x = 0;
  69.                 }
  70.                 if (== 0 || a.dd <= 0 || a.dd > x)
  71.                         cout << "\nEror! Please Input Date." << endl;
  72.         }while (== 0 || a.dd <= 0 || a.dd > x);
  73. }
  74. void OutputDate (D a)
  75. {
  76.         cout << a.dd << " / " << a.mm << " / " << a.yyyy << endl;
  77. }
  78. D NextDate (&a)
  79. {
  80.         int x;
  81.         switch (a.mm)
  82.                 {
  83.                 case 1: case 3: case 5: case 7: case 8: case 10: case 12:
  84.                         x = 31;
  85.                         break;
  86.                 case 4: case 6: case 9: case 11:
  87.                         x = 30;
  88.                         break;
  89.                 case 2:
  90.                         if ((a.yyyy % 400 == 0) || (a.yyyy % 4 == 0 && a.yyyy % 100 != 0))
  91.                                 x = 29;
  92.                         else
  93.                                 x = 28;
  94.                         break;
  95.                 }
  96.         if (a.dd == x)
  97.         {
  98.                 a.dd = 1;
  99.                 if (a.mm == 12)
  100.                 {
  101.                         a.mm = 1;
  102.                         a.yyyy ++;
  103.                 }
  104.                 else
  105.                         a.mm ++;
  106.         }
  107.         else
  108.                 a.dd ++;
  109.         return a;
  110. }
  111. //TÁC GIẢ CODE: TRẦN MINH AN

Thứ Năm, 12 tháng 3, 2015

tìm các cặp số thân thiết trong lập trình c/c++

lập trình c/c++ tìm các cặp số thân thiết. các cặp số thân thiết là số:
ví dụ:
220 có ước số là: 1,2,4,5,.....220
284 có ước số là: 1,2,....284
tổng các ước số của 220 (trừ chính nó ra) = 284;
tổng các ước số của 284( trừ chính nó ra) = 220;
như vậy trong anh có tôi và trong tôi có anh là cặp số thân thiết.
chương trình chạy hơi lâu vì các cặp số thân thiết là rất ít nhưng rất lớn, ví dụ như 220-284, 1184-1210,... 
bạn đọc hay suy ngẫm cải tiến thuật toán để việc tìm nhanh hơn



#include<iostream>
using namespace std;
int thanthiet(unsigned long a,unsigned long b)
{
long x=0,y=0;
for(int i=1;i<a;i++) if(a%i==0) x+=i;
for(int i=1;i<b;i++) if(b%i==0) y+=i;
if(x==b && y==a) return 1;
return 0;
}
void main()
{
unsigned long a,b;
for(a=220;a<=4000000000;a++)
for(b=a+10;b<1.5*a;b++)
if(thanthiet(a,b)) cout<<a<<" - "<<b<<endl;
system("pause");
}

Bài đăng phổ biến