Hiển thị các bài đăng có nhãn Lập trình cơ sở. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Lập trình cơ sở. Hiển thị tất cả bài đăng

Thứ Sáu, 19 tháng 3, 2010

// // Leave a Comment

Phân tích thiết kế phần mềm theo hướng đối tượng

Qui trình phát triển phần mềm là 1 “công thức” cho việc phát triển một phần mềm, nó nói với deverloper là các công đoạn để phát triển một phần mềm như thế nào. Ví dụ về qui trình: ví như qui trình nấu cơm:vo gạo -> đổ nước vào nồi vừa đủ -> mang vào nồi cắm điện và bật nút xuống trạng thái cook -> cơm chin -> ăn cơm.
Vậy vì sao khi làm phần mềm đòi hỏi phải có qui trình. Qui trình là sản phẩm công sức của trí tuệ và kinh nghiệm thực tế của người đi trước hay của bản thân cá nhân mình. Qui trình nói lên từng bước tiến hành nó phải làm như thế nào ở bước này và bước kế tiếp.
Có rất nhiều qui trình phát triển phần mềm, tùy theo từng phần mềm mà áp dụng các qui trình khác nhau nhưng căn bản nhất vẫn là qui trình thác nước(đây là một mô hình được coi là cổ điển, nó có mặt trong tất cả các mô hình phát triển phần mềm.). có thể tham khảo thêm một số qui trình như: Qui trình xoắn ốc, Qui trình Prototype …
ở đây là qui trình thác nước đã được cải tiến(có sự quay lại.)
1. Giai đoạn khảo sát hiện trạng.
Đây là giai đoạn đầu tiên nhất trong quá trình phát triển phần mềm, nó cho biết hiện trạng bài toán như thế nào. Ví như hiện trạng về mô hình tổ chức, hiện trạng về các nghiệp vụ, hiện trạng về quá trình tin học của khách hàng mà phần mềm chúng ta nhắm tới. trong đó hiện trạng về nghiệp vụ là quan trọng nhất mục tiêu của giai đoạn này là phải hiểu rõ được qui trình nghiệp vụ của khách hàng như là có bao nhiêu quá trình nghiệp vụ, những nghiệp vụ đó họ làm như thế nào?….
2. Giai đoạn xác định yêu cầu.
Có 2 loại yêu cầu là yêu cầu chức năng và yêu cầu phi chức năng.
Yêu cầu chức năng: đây là yêu cầu bất khả kháng mà khách hàng đưa ra cho bạn, nếu không có nó thì coi như bạn chết..
Cứ tưởng tượng là 23h55 tối nay bạn phải nộp bài đồ án cuối kỳ nếu không nộp coi như bạn rớt môn học này. mà giờ là 12h trưa bạn mới ngủ dậy[tối qua coi c1 khuya quá]. Trong khi đó chương trình của bạn chưa làm được gì cả thì công việc đầu tiên bạn nghĩ phải làm gì thì nó chính là các yêu cầu chức năng.
Yêu cầu phi chức năng là yêu cầu của hệ thống mà mình đưa ra,ví dụ như chức năng bảo mật thông tin, chức năng phân quyền người dùng, chức năng có thể đáp ứng yêu cầu của dữ liệu trong khoảng thời gian bao nhiêu….
Trong giai đoạn này là giai đoạn sông còn, vì yêu cầu là rất khó biết. giả sử bạn đang làm trang web cá nhân cho bạn, bạn đang trong giai đoạn phân tích yêu cầu cho trang web của chính bạn chắc rằng bạn sẽ không biết được yêu cầu của mình nó như thế nào, cho dù đưa ra được yêu cầu rồi thì bạn có chắc là ngày mai ngủ dậy nó vẫn còn là như vậy không?(vì bản chất của đề án hay yêu cầu là thay đổi). Vì vậy việc xác định yêu cầu đúng là rất quan trọng trong suốt quá trình làm phần mềm. thử tưởng tượng điều gì xảy ra nếu trong môn đồ họa máy tính thầy yêu cầu bạn làm chương trình vẽ con mèo, bạn mê ngủ sau đó về nhà bạn vẽ ra con khỉ thì chắc bạn biết điều gì đã xảy ra với mình rồi.hihi
3. Giai đoạn phân tích.
Trong giai đoạn này chúng ta sẽ phân tích các yêu cầu, và mô hình hóa chúng kết quả của quá trình này là cho ra một sơ đồ lớp đối tượng trong chương trình chúng ta.
4. Thiết kế
Giai đoạn này chúng ta sẽ thiết kế các thuật toán, và thiết kế mô hình dữ liệu nó cho ra một mô hình lớp và dữ liệu ở mức chi tiết.
5. Cài đặt
Phần này chúng ta sẽ chính thức bắt tay vào code.
6. Kiểm chứng
Bạn sẽ test chương trình của mình
7. Triển khai
Bạn sẽ mang chương trình của mình đi triển khai
Read More

Thứ Tư, 30 tháng 12, 2009

// // Leave a Comment

Ôn tập kiến thức C



Cái này cũng khá cơ bản, cũng đáng để xem. . .
Read More
// // Leave a Comment

C++ Hook

Hook – Ví dụ nhỏ dành cho “người mù”
Hook là gì?

Trong Windows, khi chúng ta thực hiện các thao tác nhấp chuột, nhấn phím… thì hệ điều hành sẽ chuyển các sự kiện này thành các thông điệp (message) rồi đưa vào hàng đợi (queue) của hệ thống. Sau đó, các thông điệp được trao lại cho từng ứng dụng cụ thể để xử lý.

Hook là một kỹ thuật cho phép một hàm có thể chặn, theo dõi, xử lý, hoặc hủy bỏ các thông điệp trước khi chúng “mò” đến được ứng dụng.

Hai ví dụ thường gặp của Hook là ứng dụng soạn thảo văn bản tiếng Việt (Unikey, Vietkey…) và ứng dụng tra từ điển trực tiếp trên màn hình (Click’n’See, Lạc Việt MTD, English Study…). Chúng xử lý thông điệp từ bàn phím để đổi văn bản sang tiếng Việt, hoặc xử lý thông điệp từ con chuột để lấy văn vản dưới con trỏ. Chương trình KeyLogger chuyên ăn cắp mật khẩu cũng sử dụng kỹ thuật này.

Hook hoạt động như thế nào?

Xét ở mặt phạm vi hoạt động thì có 2 loại Hook: Hook toàn cục (có phạm vi ảnh hưởng đến toàn hệ thống) và Hook cục bộ (chỉ có tác dụng trên ứng dụng được cài Hook).

Xét về mặt chức năng, Hook có 15 loại ứng với nhóm sự kiện mà nó sẽ xử lý. Ví dụ:
- WH_KEYBOARD: cho phép đón nhận các thông điệp từ bàn phím
- WH_MOUSE cho phép đón nhận các sự kiện có liên quan đến con trỏ chuột
- WH_MSGFILTER và WH_SYSMSGFILTER: cho phép theo dõi chính các thông điệp được xử lý bởi menu, scrollbar, dialog…
Các loại còn lại bạn có thể tìm thấy trong CD MSDN tại /winui/winui/windowsuserinterface/windowing/hooks/abouthooks.htm

Ứng với mỗi loại Hook, Windows sẽ có một chuỗi các hàm lọc (filter function) để xử lý. Ví dụ, khi người dùng nhấn phím, thông điệp này sẽ được truyền qua tất cả các hàm lọc thuộc nhóm WH_KEYBOARD.

Các hàm lọc này sẽ do chúng ta tùy ý định nghĩa. Mục tiêu của hàm lọc và bắt lấy thông điệp để giám sát, sửa đổi và chuyển tiếp, hoặc ngăn chặn không cho nó đến được ứng dụng. Hàm lọc được gọi bởi Windows nên còn gọi là hàm CallBack.

Muốn cài đặt một Hook toàn cục (Hook hệ thống), thì hàm lọc phải được đặt trong file DLL.

Cài đặt Hook có khó không?

Về cơ bản, chỉ cần biết chút kiến thức về hệ điều hành Windows (cơ chế hoạt động và quản lý thông điệp). Thêm một ít kiến thức về C++, API, và DLL (Dynamic Link Library). Tuy nhiên, Hook là một… nghệ thuật (và người Hook cũng là 1 nghệ sỹ ), và chúng ta có thể làm đủ trò tùy vào trí tưởng tượng và “nội công” của mình.

Sơ lượt các bước cài đặt (một Hook hệ thống)

1. Bước 1: tạo file DLL chứa hàm lọc. Mọi hàm lọc đều có dạng như sau:
Code:

LRESULT CALLBACK <tên hàm>(int nCode, WPARAM wParam, LPARAM lParam)

Bên trong hàm lọc, chúng ta có thể tùy ý làm đủ chuyện trời đất. Tuy nhiên, phải tuân thủ theo một số nguyên tắt sau:
- Nếu nCode < 0 thì không được làm gì mà phải gọi ngay hàm CallNextHookEx() (sẽ trình bày sau) và trả về giá trị... return bởi nó.
- Nếu có xử lý ít nhiều thì hàm lọc phải trả về giá trị khác 0

2. Bước 2: tạo chương trình cài đặt Hook. Chương trình này sử dụng 3 hàm API sau đây để “móc” hàm lọc vào các sự kiện:
Read More
// // Leave a Comment

C++ Keywords: inline










Khi một hàm thực hiện lời gọi đến hàm khác, thì lời gọi hàm phải gửi một yêu cầu để gọi hàm và quá trình đó sẽ trả lại những giá trị cần thiết, nếu có. C++ cho phép bạn thực hiện một hàm chức năng, do đó, khi nó được gọi, một bản sao của toàn bộ hàm được đặt ở nơi mà hàm này đang được gọi. Điều này có nhĩa là lời gọi hàm không gửi một yêu cầu nào tới hàm đó mà nó thực hiện chuyển nhượng: Tự thân hàm được truy cập, trong đó là cần thiết.


Để tạo một inline function, gõ từ khoá inline đặt đằng trước hàm
Ví dụ:

#include <iostream>

using namespace std;



inline double Sum(const double * Numbers, const int Count)

{

double s = 0;



for(int i = 0; i < Count; i++)

s += Numbers[i];



return s;

}



int main()

{

double Nbr[] = { 15.66, 18, 25, 128.62, 12.06, 22.18 };

double Total = Sum(Nbr, 6);



cout << "Sum = " << Total << endl;



return 0;



Trước đó, nếu bạn khai báo một hàm mà nó có thể được thực hiện ở một nơi nào đó, khi thực hiện hàm, bạn có thể gõ hoặc bỏ quả từ khoá inline:


#include <iostream>

using namespace std;



inline double Sum(const double * Numbers, const int Count);



int main()

{

double Nbr[] = { 15.66, 18, 25, 128.62, 12.06, 22.18 };

double Total = Sum(Nbr, 6);



cout << "Sum = " << Total << endl;



return 0;

}



inline double Sum(const double * Numbers, const int Count)

{

double s = 0;



for(int i = 0; i < Count; i++)

s += Numbers[i];



return s;

}
Read More
// // Leave a Comment

C++ Keywords: static

Các biến tĩnh

Tổng quát


Các từ khóa tĩnh cho phép một biến để duy trì giá trị của nó trong số các cuộc gọi chức năng khác nhau. Nếu giá trị của một sự thay đổi biến tĩnh khi biến số đã được đọc, biến giữ giá trị mới. Nếu biến cùng được truy cập một lần nữa, nó sẽ được giữ giá trị của nó gần đây nhất. Điều này có thể bởi vì, khi biến tĩnh được khai báo, trình biên dịch sử dụng một khu vực riêng biệt bộ nhớ để lưu trữ nó. Bằng cách này, khi giá trị của biến tĩnh được thay đổi, nó được cập nhật trong bộ nhớ của nó chiếm đóng. Và bởi vì đây là bộ nhớ riêng biệt, trình biên dịch có thể giám sát các giá trị của nó, ngay cả khi thoát khỏi hàm của nó.

Để khai báo một biến tĩnh, đặt từ khóa static bên trái của nó. Dưới đây là một ví dụ:

void Example(){ static int Mine;}

Bạn có thể khai báo nhiều biến tĩnh cần thiết, và bạn có thể sử dụng cùng một tên cho các biến khác nhau tĩnh trong các hàm khác nhau:

void Example(){ static int Mine;}void Function(){ static int Mine;}
Read More
// // Leave a Comment

C++ Keywords: typedef





An Alias for a Known Type

Trong C++, bạn có thể khai báo sử dụng một

trong các loại dữ liệu:

#include <iostream>

using namespace std;



int main()

{

int number = 248;

return 0;

}


Theo cách tương tự như vậy, thì bạn có thể khai báo một mảng
hoặc một con trỏ.
Bạn cũng có thể khai báo nhiều biến cùng
trên một dòng. Ví dụ:


#include <iostream>

#include <string>

using namespace std;



int main()

{

int number = 248;

double *distance = new double(390.82);

string countries[] = { "Ghana", "Angola", "Togo",

"Tunisia", "Cote d'Ivoire" };



cout << "Number: " << number << endl;

cout << "Distance: " << *distance << endl;

cout << "Countries:\n";

for(int i = 0; i < sizeof(countries) / sizeof(string); i++)

cout << '\t' << countries[i] << endl;



cout << endl;

return 0;

}

Nếu bạn dự định sử dụng kiểu dữ liệu giống nhau cho nhiều biến,
thì bạn
có thể thay đổi tên của nó. Trong C++, từ khoá typedef
cho phép bạn tạo một
bí danh cho một kiểu dữ liệu. Cú pháp khai
báo như sau:



typedef [attributes] DataType AliasName;


Từ khoá typedef là bắt buộc, còn thuộc tính thì không.



Theo sau typedef là một loại kiểu dữ liệu như int, short,

signed, unsigned, char,signed char, unsigned char, double, long,

hoặc long double. Kiểu dữ liệu có thể là một lớp hoặc được cung

cấp bởi một thư viện của trình biên dịch C++.

Ví dụ, nó có thể là lớp string. Kiểu dữ liệu cũng có thể là một

con trỏ, trỏ tới một kiểu chưa biết.

Cạnh bên phải của kiểu dữ liệu, bạn sẽ phải nhập tên mà tên đó

sẽ được sử dụng cho các loại kiểu dữ liệu hoặc con trỏ. Ví dụ:


#include <iostream>

#include <string>

using namespace std;



typedef short SmallNumber;

typedef unsigned int Positive;

typedef double* PDouble;

typedef string FiveStrings[5];



int main()

{



cout << endl;

return 0;

}




  1. Trong typedef short SmallNumber, SmallNumber được sử dụng như một kiểu dữ liệu để khai báo cho kiểu số nguyên nhỏ.

  2. Ở dòng thứ hai, typedef unsigned int Positive, Từ Positive

    được sử dụng như một biến thuộc kiểu unsigned int.


  3. Sau đó là typedef double* PDouble, thì tên PDouble được sử dụng để khai báo một con trỏ trỏ tơí double.


  4. Bằng việc định nghĩa typedef string FiveStrings[5], FiveStrings được sử dụng để khai báo một mảng gồm 5 string mà mỗi string thuộc kiểu string.



Dựa vào nguyên tắc này, mà bạn có thể khai báo nhiều biến cho

nhiều kiểu mà bạn tự định nghĩa. Ví dụ:

#include <iostream>

#include <string>

using namespace std;



typedef short SmallNumber;

typedef unsigned int Positive;

typedef double* PDouble;

typedef string FiveStrings[5];



int main()

{

SmallNumber temperature = -248;

Positive height = 1048;

PDouble distance = new double(390.82);

FiveStrings countries = { "Ghana", "Angola", "Togo",

"Tunisia", "Cote d'Ivoire" };



cout << "Temperature: " << temperature << endl;

cout << "Height: " << height << endl;

cout << "Distance: " << *distance << endl;

cout << "Countries:\n";

for(int i = 0; i < sizeof(countries) / sizeof(string); i++)

cout << '\t' << countries[i] << endl;



cout << endl;

return 0;

}


Kết quả thu được:

Temperature: -248

Height: 1048

Distance: 390.82

Countries:

Ghana

Angola

Togo

Tunisia

Cote d'Ivoire
















Type-Defining a Function





Từ khoá typedef cũng có thể được sử dụng để định nghĩa

bí danh cho một hàm. Trong trường hợp này,

bạn phải xác định kiểu trả về của hàm và kiểu của nó

của các đối số (arguments), nếu có. Một nguyên tác khác

là định nghĩa phải chỉ định rằng nó là một con trỏ hàm.

Xem ví dụ sau:

#include <iostream>

#include <string>

using namespace std;



typedef short SmallNumber;

typedef unsigned int Positive;

typedef double* PDouble;

typedef string FiveStrings[5];

typedef double (*Addition)(double value1, double value2);



double Add(double x, double y)

{

double result = x + y;

return result;

}



int main()

{

SmallNumber temperature = -248;

Positive height = 1048;

PDouble distance = new double(390.82);

FiveStrings countries = { "Ghana", "Angola", "Togo",

"Tunisia", "Cote d'Ivoire" };

Addition plus;



cout << "Temperature: " << temperature << endl;

cout << "Height: " << height << endl;

cout << "Distance: " << *distance << endl;

cout << "Countries:\n";

for(int i = 0; i < sizeof(countries) / sizeof(string); i++)

cout << '\t' << countries[i] << endl;



plus = Add;

cout << "3855.06 + 74.88 = " << plus(3855.06, 74.88) << endl;

return 0;

}


Kết quả thu được như sau:

Temperature: -248

Height: 1048

Distance: 390.82

Countries:

Ghana

Angola

Togo

Tunisia

Cote d'Ivoire

3855.06 + 74.88 = 3929.94















The Attribute of a Type-Definition

Từ khoá typedef có thể được theo bởi một thuộc tính

trước khi nhập kiểu dữ liệu. Trong hình thức đơn giản nhất,

thuộc tính có được đó ở một cấp độ truy cập như: public, private,

hoặc protected.

Ví dụ:

#include <iostream>

#include <string>

using namespace std;



typedef public short SmallNumber;

typedef private unsigned int Positive;

typedef protected double* PDouble;

typedef public string FiveStrings[5];

typedef private double (*Addition)(double value1, double value2);



double Add(double x, double y)

{

double result = x + y;

return result;

}



int main()

{

SmallNumber temperature = -248;

Positive height = 1048;

PDouble distance = new double(390.82);

FiveStrings countries = { "Ghana", "Angola", "Togo",

"Tunisia", "Cote d'Ivoire" };

Addition plus;



cout << "Temperature: " << temperature << endl;

cout << "Height: " << height << endl;

cout << "Distance: " << *distance << endl;

cout << "Countries:\n";

for(int i = 0; i < sizeof(countries) / sizeof(string); i++)

cout << '\t' << countries[i] << endl;



plus = Add;

cout << "3855.06 + 74.88 = " << plus(3855.06, 74.88) << endl << endl;

return 0;

}


Trong C++, thuộc tính của typedef thường được áp dụng

như là một lớp(class), một cấu trúc (struct) hoặc một

kiểu liệt kê (enum). Ví dụ:

#include <iostream>

#include <string>

using namespace std;



typedef struct Student;

typedef class Country;




typedef public short SmallNumber;

typedef private unsigned int Positive;

typedef protected double* PDouble;

typedef public string FiveStrings[5];

typedef private double (*Addition)(double value1, double value2);



struct Student

{

string FirstName;

string LastName;

};



typedef struct _Empl

{

string FullName;

double HourlySalary;

}Employee;



class Country

{

string Name;

string Capital;

string Code;

};



double Add(double x, double y)

{

double result = x + y;

return result;

}



typedef enum EmplStatus { esFullTime, esPartTime, esContractor };

typedef Student *PStudent;

typedef Country *PCountry;



int main()

{

Student pupil;

Country pais;

EmplStatus emplst;

PStudent ptrStd = new Student;

PCountry pPais = new Country;



return 0;

}
Read More
// // Leave a Comment

Convert string to enum - Chuyển đổi chuỗi sang kiểu liệt kê C#

Dưới đây là 2 cách mà ta có thể chuyển đổi 1 chuỗi kiểu string sang kiểu liệt kê enum:

1. Cách đơn giản nhất nè:
- Sử dụng lớp Enum sẵn có (sử dụng giống như ta nhập vào đó là 1 kiểu số nguyên . . )
- Cú pháp như sau:
var v_enum_result = (enumType)Enum.Parse(typeof(enumType), stringValue);

- Phương thức này sẽ trả về cho ta kiểu enumType mà ta mong muốn từ stringValue.

2. Cách này thì cũng tương tự như cách trên:
- Ta đi xây dựng 1 phương thức tương tự như Enum.Parse();
- Xây dựng 1 phương thức tĩnh có tên có tên: ConvertStringToEnum()
static object ConvertStringToEnum(Type t, string Value)
{
  foreach (System.Reflection.FieldInfo fi in t.GetFields())
  {
   if (fi.Name == Value)
     return fi.GetValue(null);
  }
  throw new Exception(string.Format("Can't convert {0} to {1}", Value, t.ToString()));
}

Thế là có kiểu enum xài chơi rồi . . .

*** Quên mất, sử dụng nó thế nào nhỉ?
- Khà khà, tương tự như cách thứ nhất. Ta làm như sau
- Ví dụ luôn: Convert string sang kiểu FormWindowState.

FormWindowState userWindowState = (FormWindowState)ConvertStringToEnum(typeof(FormWindowState), strFormWindowSate);


Bây giờ thì có thể cười được rồi, he he. . .
Read More