Lưu trữ

Archive for the ‘OOP – JAVA’ Category

Class – Object – Method – Lớp – Đối tượng – Phương thức – Cách tạo mới 1 đối tượng trong lập trình Java

Tháng Mười Một 19, 2009 1 comment

Chào các bạn hôm nay tôi sẽ trình bày về
Class – Object – Method – Lớp – Đối tượng – Phương thức – Cách tạo mới 1 đối tượng trong lập trình Java

Tổng quan:
/*tạo lớp*/
class class_name{
/*khai báo …. . . . .*/
/*tạo đối tượng */
class_name object_name=new class_name
/*gán giá trị */
object_name.data_member_name=”. . . .”;
/* in giá trị */

}

Chúng ta tìm hiểu qua ví dụ sau:

Yêu cầu tạo ra lớp thành viên có tên Mai Van P và Bui Ta P thuộc lớp thanhvien và in ra thông tin
Các bước thực hiện:
1/ Tạo lớp thanhvien
2/ Khai báo giá trị
3/ Tạo đối tượng
4/ Gán giá trị cho đối tượng
5/ In thông tin
Viết code :
class thanhvien{
/* Khai bao lop thanhvien*/
String ten;
public static void main(String[]args){
/*bat dau tao doi tuong cho lop thanhvien*/
thanhvien tv1=new thanhvien();
thanhvien tv2=new thanhvien();
/*New là hàm tạo*/
/*gán giá trị */
tv1.ten=”Mai Van P”;
tv2.ten=”Bui Ta P”;
/*in thông tin*/
System.out.println(“Danh sach 2 thanh vien la “);
System.out.println(“\tTen thanh vien 1 la:= “+tv1.ten);
System.out.println(“\tTen thanh vien 2 la:= “+tv2.ten);

}
}

Hôm sau tôi sẽ trình bày 1 cách khác để thể hiện code  các ví dụ này

Ví dụ 2:

Yêu cầu tạo lớp sinhvien có các thuộc tính như tên , quê quán và tuổi
In ra thông này
Các bạn có thể download code 2 ví dụ trên tại đây

Ghi rõ nguồn Viet Matrix khi phát hành lại thông tin này

Using looping statements – Sử dụng vòng lặp trong java

Tháng Mười Một 18, 2009 3 comments

Chào các bạn những bài trước tôi đã cung cấp 1 số kiến thức cơ bản về java
Nay tôi sẽ trình bày về vòng lặp for
Cấu trúc :
for (initialization Expr ; test Expr; iterationexpr)
{
statement_1
statement_2
. . . . .
. . . . .
}

Chúng ta xét ví dụ sau:

class testforloop{
public static void main(String[]args){
for (int i=1;i<=8;i=i+1){
System.out.println(“\tVong lap cua i la:=”+i);
}
}
}


Giải thích:
1/ Tên với là testforloop và save với tên trùng với tên lớp là testforloop vì lớp này có phương thức main
2/ int i=1 ; i<=8;i=i++
Ban đầu khai báo i là kiểu interger và gán cho nó giá trị là 1 . Sau đó in giá trị 1 ra màn hình , vòng lặp sẽ so sánh
giá trị i có nhỏ hơn hay bằng 8 không ? nếu nhỏ hơn thì i=i+1 nghĩa là 1=1+1 –> in ra giá trị thứ 2 là 2 , tiếp tục đến khi i>8 kết thúc vòng lặp

Hôm sau tôi sẽ trình bày vòng lặp while và do – while
Các bạn có thể download code ví dụ trên tại đây

Ghi rõ nguồn Viet Matrix khi phát hành lại thông tin này

Các toán tử quan hệ (if-else / switch – case . . . ) java

Tháng Mười Một 17, 2009 Để lại phản hồi

Chào các bạn những bài trước tôi đã giới thiệu về lập trình hướng đối tượng , chạy 1 chương trình java thế này và cấu trúc if – else . switch – case .Nay tôi sẽ trình bày các tóan tử sử dụng trong cấu trúc if-else . . .

Các toán tử quan hệ :
> , < , >= , <= , == ,!=
and (&&) , or (||) , not (!)

Chúng ta sẽ xem xét ví dụ dưới đây (kết hợp giữa cấu trúc if và toán tử quan hệ )
[ Bài tiếp theo tôi sẽ giải thích vì sao chúng ta có code như vậy ]

class student{
/* khai báo class student */
boolean allpass;
int totalmarks;
student(){
allpass=true;
totalmarks=180;
}
void printstatus(){
if((allpass !=false) && (totalmarks > 175))
System.out.println(“Ok tot roi ban da vuot qua ky thi roi “);
else
System.out.println(“Thoi dung buon co gang lan sau”);

}
}
class scholarship{
public static void main(String[]args){

student sv1=new student();
System.out.println(“\tThong tin ky thi “);
sv1.printstatus();

}
}

Các bạn nhớ save lại với tên scholarship.java , vì sao tôi sẽ giải thích ở bài tiếp theo
Các bạn có thể download code tại đây

Kết quả của code trên

Alexbtp – Ghi rõ nguồn Viet Matrix khi phát hành lại thông tin này


The Switch-Case Construct – cấu trúc switch – case (java)

Tháng Mười Một 17, 2009 Để lại phản hồi

Chào các bạn hôm trước tôi trình bày cấu trúc if – else

http://vietmatrix.wordpress.com/2009/11/12/ph%E1%BA%A7n-1-bai-2-ussing-conditinal-statements-s%E1%BB%AD-d%E1%BB%A5ng-c%E1%BA%A5u-truc-di%E1%BB%81u-ki%E1%BB%87n/

Nay sẽ trình bày tiếp thêo cấu trúc switch – case

The Switch-Case Construct
Cú pháp:
switch( Expression or variable name)
{
case exp1:
Statements;
break;
case exp2:
Statements;
break;
case exp3:
Statements;
break;
default:
Statements;

}

Ví dụ:
class switchcase{
public static void main(String[]args){

char x=’d';
switch(x){
case ‘a’:
System.out.println(“Gia tri cua x la :”+x);
break;
case ‘h’:
System.out.println(“Gia tri cua x la :”+x);
break;
default:
System.out.println(“Khong co gia tri nao tru hop”);
}

}
}


Ví dụ thêm về cấu trúc switch – case với số int

class switchcaseso{
public static void main(String[]args){
int vietmatrix=8;
switch(vietmatrix){
case 1:
System.out.println(“Viet Matrix duoc gan gia tri la:”+vietmatrix);
break;
case 2:
System.out.println(“Viet Matrix duoc gan gia tri la:”+vietmatrix);
break;
case 3:
System.out.println(“Viet Matrix duoc gan gia tri la:”+vietmatrix);
break;
case 8:
System.out.println(“Viet Matrix duoc gan gia tri la:”+vietmatrix);
break;
default:
System.out.println(“Viet Matrix Revolutions”);
}
}
}

Các bạn có thể download code tại đây
Ghi rõ nguồn Viet Matrrix khi phát hành lại thông tin này

(Phần 1) Bài 2: Ussing Conditinal Statements [Sử dụng cấu trúc điều kiện ]

Tháng Mười Một 12, 2009 Để lại phản hồi

Chào các bạn ở những bài trước tôi đã giới thiệu về
- Nguyên tắc hoạt động của máy tinh
- Sơ lượt về lập trình hướng đối tường – OOP
- Thuật toán và ngôn ngữ lập trình
- Giới Thiệu về java
- Viết chương trình đầu tiên java
Nay tôi sẽ giới thiệu với các bạn bài tiếp theo
Bài 2: Ussing Conditinal Statements [Sử dụng cấu trúc điều kiện ]
- Đầu tiên : cấu trúc If – Else
Cú pháp:
if(boolean expression)
{
statement(s)
}
else
{
statements(s)
}

Ví dụ : yêu cầu bài tập như sau
- Viết 1 chương trình khai báo biến age(tuổi) = 19 . Sử dụng cấu trúc
if – else để xuất ra câu thông báo theo điều kiện
Nếu age nhỏ hơn 18 thì xuất câu thông báo
“Bạn chưa đến tuổi công dân”
Ngược lại lớn hơn hay bằng 19 xuất câu thông báo
“Bạn đã đến tuổi công dân”

Bài giải:
Lưu ý đây là ví dụ đơn giản về if – else
(chưa chặt chẽ về logic các trường hợp xảy ra )
class IfElse{
// Khai bao ten lop
public static void main(String[]args){

int age; // khai báo biến age là kiểu số nguyên
age=19; // gán cho biến age là 19
if(age<18){
System.out.println(“\t Ban chua den tuoi cong dan “);
}else{
if(age>=18){
System.out.println(“\t Ban da den tuoi cong dan”);
}
}
}
}

Save với tên IfElse.java
Biên dịch
javac IfElse.java
Thông dịch (chạy chương trình)
java IfElse
Kết quả
“Ban da den tuoi cong dan”

Các bạn có thể download code ở đây

Bài 1: Chương trình java đầu tiên

Tháng Mười 29, 2009 Để lại phản hồi


Viết code như sau (dùng trình soạn thảo nào cũng được như notepad chẳng hạn)
Code như sau
==========================
class vietmatrix{
public static void main(String[]args){
System.out.println(“Viet Matrix Revolutions – Lap trinh  java”);
}
}

=========================
Save với tên vietmatrix.java đặt trong đĩa C:\java chẳng hạn  (nhớ save với tên vietmatrix.java còn vì sao tôi sẽ giải thích sau )
cú pháp dịch file vietmatrix.java
1/ c:\> cd java (chuyển qua nơi chứa code)
2/ c:\java>javac vietmatrix.java
3/ c:\java>java vietmatrix

kết quả nhận được ” Viet Matrix Revolutions – Lap trinh java “


Giải thích:
- Save với tên vietmatrix.java vì đã tạo lớp (class) vietmatrix và dùng phương thức main() nên bạn phải save tên file trùng với tên class ,nếu không sẽ báo lỗi
Cú pháp tạo 1 lớp:

class tên_class{
//
///
}

- public static void main (String[]args)

Từ khóa public là 1 chỉ định truy xuất , nó cho biết thành viên của lớp có thể được truy xuất từ bất cứ đâu trong chương trình
Từ khóa statics cho phép main được gọi tới mà không cần tạo ra 1 thể hiện (instance)của lớp
Từ khóa void thông báo cho máy tính biết rằng phương thúc sẽ không trả lại bất cứ giá trị nào khi thực thi chương trình
String args[] là tham số dùng trong phương thức main , các biến số trong dấu ngoặc đơn nhận từng thông tin được chuyển vào main . Những biến này là tham số của phương thức . Thậm chí ngay khi không có 1 thông tin nào được chuyển vào main phương thức vẫn được thực hiện với các dữ liệu rỗng – không có gì trong dấu ngoặc đơn
args [] là 1 mảng kiểu string các đối số (arguments) từ các dòng lệnh được lưu vào mảng . Mã nằm giữa dấu ngoặc móc {} của main được gọi là method block . Các lệnh được thực thi trong main cần được viết trong khối này .

Alexbtp – Viet Matrix Revolutions – Ghi rõ nguồn khi phát hành lại thông tin này

Nạp Java, chương trình đầu tiên

Tháng Mười 29, 2009 Để lại phản hồi

Trước tiên cần kéo phiên bản JDK mới nhất từ trang web: java.sun.com (Java SE). Cần kéo về riêng tài liệu: Java SE Documentation.

Chương trình nạp JDK chạy rất đơn giản. Sau khi nạp JDK xong, cần mở tệp nén tài liệu ra, sau đó chép vào thư mục chính của JDK.

Chúng ta có thể chuẩn bị chương trình bằng cách sử dụng môi trường phát triển tích hợp (IDE)- như Eclipse, NetBeans, IntelliJ hay JCreator – các môi trường này có nhiều chức năng: soạn thảo chương trình, dịch, chạy chương trình, hướng dẫn người sử dụng trong khi soạn thảo chương trình, và tìm lỗi.

Có thể viết mã nguồn trong chương trình chỉnh soạn thảo văn bản text nào đó và sau đó dịch và chạy chương trình từ dòng lênh (command line).

Nếu không sử dụng IDE:

  • nhớ để thư mục có chứa trình biên dịch Java (javac.exe) và trình thông dịch – máy ảo Java (java.exe) trên đường dẫn chính(PATH),
  • mã nguồn Java chuẩn bị trong trình soạn văn bản cần được lưu trong định dạng thuần văn bản một tệp với đuôi mở rộng “.java” (ví dụ như “Test.java”),
  • để biên dịch file nguồn thì sử dụng lệnh javac (ví dụ như javac Test.java),
  • kết quả của việc biên dịch thành công xuất hiện một hoặc nhiều tệp lớp (có đuôi mở rộng là “class” như Test.class),
  • để thực hiện chương trình chúng ta phải chạy chương trình java đưa ra một tên lớp (không cần có đuôi mở rộng) với tư cách là đối số (như java Test).


Những điểm cần lưu ý:
1.    Mã nguồn có thể được phân bố trên một số các tệp có đuôi mở rộng là “.java”. Mỗi tệp gồm một định nghĩa đầy đủ của một hay nhiều lớp.
2.    Tên của mỗi tệp phải giống hệt (như trong trường hợp viết thư) tên của lớp dùng chung (được chuẩn hóa bằng từ khóa public) chứa trong tệp (chúng ta sẽ tìm hiểu nghĩa của từ này sau). Một tệp nguồn có thể chứa nhiều nhất một lớp pulic.
3.    Để chạy một máy ảo (với câu lệnh java) chúng ta đưa vào với tư cách đối số tên của lớp chứa phương pháp main.

Sau đây là chương trình đầu tiên của chúng ta:

public class Test {

   public static void main( String[] args ) {
      System.out.println( "Hello World!");
   } 

}

Giải thích:

1.    Từ khóa của ngôn ngữ được đánh dấu màu xanh da trời.
2.    Hiện tại chúng ta không cần phải quan tâm đến những từ lạ như: public, static, void. Chúng ta sẽ tìm hiểu về chúng trong bài tới.
3.    Chương trình Java là một trường các định nghĩa lớp. Ở đây chúng ta mới có một lớp tên là Test. Từ khóa class được sử dụng để xác định các lớp. Một định nghĩa lớp                theo sau tên đó và kết thúc bằng dấu ngoặc cong (đánh dấu màu đỏ ở đây)
4.    Lớp Test bao gồm phương pháp tên là main.
5.    Cấu trúc của một phương pháp được đặt trong dấu ngoặc cong (ở đây đánh dấu màu xanh lá cây).
6.    Một chương trình được thực hiện bắt đầu bằng phương pháp main (tuyên bố đúng theo cách này: public static void main(String[] args); từ args có thể được thay thế
bằng từ khác vì nó là tên của một biến thể).
7.    Như chúng ta có thể thấy phương pháp main có một tham số tên là args. Nó chỉ ra một mảng các chuỗi (các đối tượng của loại String) mà giữ các đối số đưa vào trong            chương trình trên startup (từ dòng lệnh hay một cách nào đó khác). Chúng ta không sử dụng các chuỗi đó trong chương trình này.
8.    Bên trong phương pháp main gọi phương pháp println. Phương pháp này sẽ in đối số ra bảng nhắc câu lệnh. Việc gọi một phương pháp là một biểu thức. Kết thúc                bằng một dấu chấm phẩy biểu thức sẽ trở thành một câu lệnh được thực hiện bởi chương trình.
9.    Trước mắt chúng ta không cần băn khoăn tại sao và vì cái gì chúng ta phải viết System.out.println. Chúng ta sẽ tìm hiểu ở phần sau.
10.   Đối số đưa vào gọi phương pháp println là một dãy chuỗi.
11.   Chương trình phải được biên soạn: javac Test.java.
12.   Việc biên soạn thành công sẽ tạo ra tệp Test.class.
13.   Sau khi chạy chương trình (bằng cách ghõ “java Test” trên dòng lệnh) chúng ta thấy dòng nhắn “Hello World”.

Các ký tự khoảng trắng (dấu cách, tab, dòng mới) giữa các cấu trúc ngôn ngữ (tên biến thể hay phương pháp, từ khóa, dãy…) được lược bỏ trong quá trình biên dịch.
Các ghi chú cũng được lược bỏ.
Có ba loại ghi chú trong Java:
•    dòng chữ theo sau cặp ký tự // cho đến hết dòng là một ghi chú một dòng đơn.
•    dòng chữ đặt giữa cặp ký tự /* và */ là ghi chú đa dòng (nó có thể nằm trên một số các dòng).
•    dòng chữ đặt giữa các chuỗi ký tự /** và */ là một ghi chú javadoc. Nó được xử lý bởi một chương trình tạo ra các tư liệu (loại ghi chú này là ghi chú đa dòng).

Ví dụ:

/**
 The class TestCom demonstrates
 the use of comments
 (this is a javadoc comment)
*/

public class TestComm {

  /*
     This is a 
     multiline 
     comment
  */

  /* it is a 
     comment too */

  // this is a single-line comment

  public static void main( String[] args ) {
    // another comment
    System.out.println( "Comments" );   // and one more
  }

}


Khi biên dịch một chương trình, trình biên dịch kiểm tra tính đúng đắn về mặt cú pháp. Nếu có bất cứ một lỗi nào, quá trình biên dịch dừng lại, không có tệp lớp đầu ra và trình biên dịch in ra thông điệp báo gặp lỗi.
Ví dụ nêu chúng ta quên không dùng dấu ngoặc móc kết thúc trong khi gọi phương pháp println trong chương trình thử nghiệm:

System.out.println( "Hello World!";

trình biên dịch sẽ tạo ra dòng nhắn sau:

Test.java:4: ‘)’ expected
System.out.println( “Hello World!”;
^
1 error


Một chương trình biên dịch không có lỗi thì đúng về mặt cú pháp nhưng việc chạy chương trình có thể không thành công nếu có lỗi runtime.
Chương trình sau có thể được biên dịch một cách dễ dàng:

public class TestRTE {

  static String aString;
  
  public static void main( String[] args ) {

    System.out.println( aString.length());
  }
}


Nhưng khi chạy sẽ gây ra lỗi sau:

Exception in thread “main” java.lang.NullPointerException
at TestRTE.main(TestRTE.java:7)

Ở đây chúng ta cố gắng có được độ dài của một chuỗi không tồn tại (gọi lệnh length()).
Lỗi đó gọi là exceptions (ngoại lệ). JVM báo cho chúng ta biết loại ngoại lệ và về lớp và phương pháp gây ra. Nó cũng sẽ in số dòng trong tệp nguồn nơi mà lỗi xảy ra.

Viet Matrix Revoluitons

Nhập môn lập trình hướng đối tượng

Tháng Mười 29, 2009 Để lại phản hồi

Ngôn ngữ hướng đối tượng là ngôn ngữ dựa trên khái niệm về đối tượng và lớp.

Những định nghĩa chính xác về các thuật ngữ này sẽ được trình bày sau này trong các phần sau. Hiện tại thay vì tập trung vào các công thức trừu tượng, chúng ta sẽ sử dụng trí tượng tượng và nhớ rằng những khái niệm đó sẽ được giải thích đầy đủ ở những bài sau.

Vậy một “đối tượng” là gì? Bằng trực giác chúng ta có thể thấy rằng đối tượng là một vật mà có thể tách riêng, được gọi tên và phân biệt bằng các thuộc tính của nó.
Ví dụ chúng ta có thể xem những thứ sau là đối tượng: một chiếc xe đạp, một chiếc ô tô, một con chó hay một người đàn ông.

Mỗi đối tượng trên có những thuộc tính khác nhau. Một người đàn ông có tên và tuổi. Một chiệc xe hơi có màu sắc và có thể được đặc trưng bởi động cơ hay số cửa.

Hai chiếc xe hơi khác nhau có cùng một miền các thuộc tính: nhãn hiệu, màu của động cơ. Kể cả khi nhãn hiệu, màu sắc và động cơ có khác nhau thì hai chiếc xe vẫn giống nhau theo một nghĩa nào đó (bởi vì chúng được đặc trưng bằng một miền thuộc tính giống nhau). Chúng ta nói rằng những chiếc xe hơi là đối tượng của một lớp.

Lớp là sự mô tả các thuộc tính không đổi của một nhóm các thực thể giống nhau.

Ngoài ra, một điều nữa cần chú ý đó là một đối tượng có thể thực hiện một số thao tác. Vì thế những đối tượng khác có thể đưa ra các yêu cầu đồi với đối tượng đó, đòi hỏi nó phải thực hiện một thao tao nào đó. Ví dụ như đối tượng lái xe có thể yêu cầu đối tượng xe chuyển bánh hay dừng lại.
Chúng ta nói rằng một thông điệp được gửi đến một đối tượng yêu cầu đối tượng thực hiện một thao tác nào đó.

Các đối tượng không thể chấp nhận các thông điệp tùy ý: đối tượng xe hơi có thể khởi động hoặc dừng lại nhưng không thể hát.
Miền các thông điệp được vật thể hiểu (chấp nhận) cũng là đặc trưng của nó.
Do vậy một lớp không chỉ miêu tả những thuộc tính chung của một nhóm các đối tượng giống nhau như màu sắc, tuổi tác hay cân nặng mà còn miêu tả miền các thông điệp được chấp nhận (được hiểu) bởi các đối tượng của lớp này.

Những khái niệm trên là cách nhìn trừu tượng về một thế giới thực.
Kết hợp được những khả năng đó vào ngôn ngữ lập trình, chúng ta có thể dễ dàng chuyển những vấn đề của thế giới thực vào trong các chương trình.
Điều này đã được thực hiện bởi ngôn ngữ hướng đối tượng. Đây là một đặc tính vô cùng quan trong đã làm đơn giản hóa việc lập trình.
Chúng ta hãy xem xét một lớp các thiết bị điện tử với những đặc tính sau: chiều rộng, chiều cao, trạng thái (bật, tắt) và thoả mãn những yêu cầu bật lên và tắt đi.
Chúng ta cố gắng mô tả tình huống này trong một ngôn ngữ lập trình. Các thông điệp được chấp nhận bởi một đối tượng của lớp được thực hiện như là các phương pháp (một phương pháp là một loại hàm).

class ElDev {
  width, height; <-- attributes: width, height, state
  isOn;
================= messages
  method on()
    isOn = true; <--- the request on (switch the device on)
  
  method off()
    isOn = false; <--- the request off (switch the device off)
}

Chú ý: Mã trên chỉ là tượng trưng, không có liên quan gì đến định nghĩa lớp trong Java hay trong bất cứ môn ngôn ngữ nào khác.

Giả sử chúng ta có hai đối tượng thuộc lớp các thiết bị điện được quy ước là a và b. Chúng ta có thể tạo ra một chuỗi các hành động: bật thiết bị a, bật thiết bị b, tắt thiết bị a, tắt thiết bị b với sự trợ giúp của các thông điệp đuợc gửi tới những đối tượng này (nói cách khác: bằng cách gọi các phương pháp cho những đối tượng này). Ví dụ: sử dụng cú pháp ngôn ngữ Java (hay C++) chúng ta có thể viết chuỗi các yêu cầu trên như sau:

a.on();  // thông điệp chuyển tới đối tượng, yêu cầu nó bật lên
b.on();  // để b bật lên
a.off(); // để a tắt đi

Bên cạnh việc phản ánh các vấn đề trong ngôn ngữ lập trình, hướng đối tượng còn có thêm một tiện ích khác.
Thông thường các thuộc tính của đối tượng không phải lúc nào cũng sẵn có. Trong một chương trình các đối tượng liên lạc với nhau thông qua các thông điệp điều khiển những thuộc tính của chúng.
Dữ liệu của đối tượng cần được ẩn đi và được truy cập bằng các thông điệp được chuyển đến đối tượng.

Dữ liệu (thuộc tính) có thể được giấu đi và được truy cập bằng các thông điệp chuyển đến đối tượng.


Cách tiếp cận đó gọi là encapsulation (sự tóm gọn) và cho phép tạo ra các chương trình đáng tin cậy hơn.

Ngôn ngữ hướng đối tượng cho phép tái sử dụng các lớp cũ khi tạo ra các lớp mới. Nó đơn giản hóa việc lập trình và tránh mắc lỗi.
Nó cũng phản ánh các tình huống trong thế giới thực.

Ví dụ, một máy vi tính là một ứng dụng điện tử. Vì thế  nó là một đối tượng của lớp ElDev. Nhưng máy vi tính có các đặc điểm cụ thể ngoài các đặc điểm được nêu trong định nghĩa của lớp ElDev (chiểu rộng, chiều cao, trạng thái).
Do đó chúng tạo nên một lớp phụ của lớp thể hiện các thiết bị điện tử.
Trong ngôn ngữ lập trình chúng ta phản ánh lớp phu này thông qua sự kế thừa. Một lớp có thể kế thừa các thuộc tính và phương pháp từ các lớp khác và thêm vào một số các thuộc tính đặc biệt.
Chúng ta sẽ tạo ra một lớp có tên Computer kế thừa từ lớp ElDev làm ví dụ. Chúng ta không cần viết tất cả các thuộc tính và thông điệp của thiết bị điện tử (chúng ta không cần thực hiện các phương pháp on() và off()). Nhưng chúng ta phải thêm vào các thuộc tính đặc trung cho máy vi tính như yêu cầu thực hiện một chương trình nào đó.
Các chương trình là các đối tượng của lớp Program. Một thông điệp chuyển vào máy vi tính yêu cầu thực hiện một chương trình phải đưa vào ở dạng đối số.
Sự kế thừa được thể hiện bằng cách sử dụng từ khóa extends (mở rộng). Vì thế lớp Computer mới của chúng ta mà kế thừa từ lớp ElDev và thêm vào phương pháp run mới có thể đuợc viết như sau:

class Computer extends ElDev {
    method run(Program p)
       if (isOn()) execution_of_the_program_p;
}

Nó có thể được sử dụng trong một chương trình như sau:

Computer a, b, c;
Program x, y, z;
...
a.on(); a.run(x); ... a.off();

Viet Matrix Revolutions

Java là gì?

Tháng Mười 29, 2009 Để lại phản hồi

Dĩ nhiên trước hết Java là một ngôn ngữ lập trình phổ thông.

Sự giống nhau về cú pháp với ngôn ngữ C và C++
giúp cho lập trình viên dễ dàng nắm được ngôn ngữ Java hơn. Đồng thời Java cũng thể hiện được tính năng vượt trội từ những điểm khác biệt của nó. Lập trình viên Java không phải quan tâm đến việc quản lý bộ nhớ (phần thu thập dữ liệu rác sẽ làm công việc này cho lập trình viên: loại bỏ những đối tượng không dùng đến trong bộ nhớ). Java không có con trỏ số học mà cho phép truy cập vào một vị trí bất kỳ trong bộ nhớ vì con trỏ này thường gây ra lỗi.

Việc kiểm tra kiểu nghiêm ngặt
phát hiện ra nhiều lỗi đơn giản trong quá trình biên dịch, điều này sẽ giúp quá trình chuyển đổi an toàn.

Việc xử lý các trường hợp ngoại lệ một cách hợp lý bởi trình biên dịch giúp cho công việc lập trình trong Java an toàn và đáng tin cậy hơn. Cơ cấu đồng quy xây dựng sẵn tạo nên sự đồng bộ của các tuyến đang thực hiện song song (chính là các phần được thực hiện đồng thời trong một chương trình).

Tất cả những điều trên mặc dù là có vẻ hơi kỳ lạ lúc này, nhưng sẽ được giải thích kỹ lưỡng trong các bài học sau.

Chắc chắn một đặc điểm quan trọng của ngôn ngữ Java là tính hướng đối tượng của nó. Nói chung, điều này có nghĩa là các chương trình dễ dàng hơn để viết và đáng tin cậy hơn những chương trình được xây dựng trên các ngôn ngữ phi đối tượng. Thật không may Java không phải hoàn toàn hướng đối tượng vì một số cấu trúc cú pháp của nó không hướng đối tượng.

Những điểm ưu việt của Java với tư cách là ngôn ngữ lập trình có thể cần xem lại. Nhưng điều này không phải vì tính thuần khiết hay tính vượt trội mới đáng để học.
Quan trọng hơn đó là tính phổ thông trong tất cả các ứng dụng máy tính đạt được với bộ máy giao nền ảo và một miền các thư viện tiêu chuẩn phong phú tích hợp trong môi trường Java.

Categories: OOP - JAVA Thẻ:

Thuật toán và các ngôn ngữ lập trình (p2)

Tháng Mười 29, 2009 1 comment
1.	Hỏi người sử dụng giá của CPU
2.	Hỏi người sử dụng giá của bảng mạch chủ
…
n-1. 	Tính tổng các giá trị đó
n. 	Hiển thị kết quả cho người sử dụng

Hai trường hợp còn lại dẫn tới các thuật toán phức tạp hơn rất nhiều.

Cần nhớ rằng thuật toán đơn giản trên có một biểu thức khá chung chung. Việc dịch nó sang một ngôn ngữ lập trình cụ thể yêu cầu phải đưa ra rất nhiều quyết định, ví dụ như:
•    Tương tác với người sử dụng nên diễn ra như thế nào: dữ liệu đầu vào được cung cấp như thế nào và kết quả cần được hiển thị ra sao?
•    Thực hiện việc tính tổng như thế nào: giá cả của các thành phần được lưu giữ riêng biệt hay được thêm tăng dần vào kết quả tổng?
•    Xử lý với các dữ liệu đầu vào không đúng như thế nào?
Những quyết định này liên quan đến cái gọi là giao diện giữa người sử dụng và các chương trình ứng dụng (cách mà chương trình giao tiếp với người sử dụng) và cũng liên quan tới cấu trúc của thuật toán về khả năng chịu lỗi và dễ dàng sửa đổi. Ví dụ, thuật toán trên phải kiểm tra xem dữ liệu đầu vào có phải thực sự là các con số hay không. Lập trình viên cũng cần cân nhắc lưu giữ giá của các thành phần phòng trường hợp được yêu cầu liên quan đến dữ liệu đầu ra sau này: bên cạnh tổng số tiền, “báo cáo tính toán” chi tiết được yêu cầu (thể hiện giá của các thành phần hay thậm chí số phần trăm trong tổng giá trị của máy tính).
Phản ứng nhỏ nhất với các dữ liệu đầu vào sai cũng làm thay đổi trật tự các bước trong thuật toán. Bên cạnh trật tự giản đơn của các bước, giải pháp cho bất cứ một vấn đề nào thường yêu cầu một số điều sau:
•    Kiểm tra một điều kiện và dựa trên việc đưa ra quyết định kèm theo có liên quan đến các bước tiếp theo của thuật toán
•    Việc thực hiện lặp đi lặp lại các chỉ dẫn cụ thể (theo số lần cho sẵn hoặc cho đến khi điều kiện đó được hoàn thành).
Sau khi đã tính đến khả năng lỗi trong dữ liệu đầu vào và yêu cầu phải lưu giữ các giá thành phần, thuật toán để tính giá trị một chiếc máy vi tính có dạng như sau:

1. Hỏi người sử dụng giá của CPU.
2. Nếu giá trị đưa ra không phải một con số, báo cho người sử dụng biết lỗi và quay lại bước 1.
3. Lưu giá của CPU đã đưa ra (cho việc sử dụng sau này)
4. Hỏi người sử dụng giá của bảng mạch chủ.
5. Nếu giá đưa ra không phải một con số, báo cho nguời sử dụng biết về lỗi và quay lại bước 4.
6. Lưu giá của bảng mạch chủ đã đưa ra (để có thể sử dụng sau này)
…  những thành phần khác
…  những thành phần khác
n-1. Tính tổng giá của các thành phần khác
n.   Hiển thị kết quả

Trong biểu đồ, các quyết định được biểu diễn bằng hình thoi.

Ví dụ: biểu đồ phát triển của thuật toán tính thuế.
Thuat toan - Tinh thue

Các thuật toán thường được viết ở dạng giải mã – xét ở góc độ nào đó, là dạng được nghi thức hóa của ngôn ngữ thông thường, không phụ thuộc vào bất cứ ngôn ngữ lập trình nào. Giải mã gần giống với ngôn ngữ lập trình hơn ngôn ngữ thông thường và dễ dàng đưa vào chương tình được viết bằng môt ngôn ngữ lập trình hạn định. Vô số sách hướng dẫn về lập trình đưa ra các dạng khác nhau của giải mã. Người ta có thể dễ dàng đưa ra bản giải mã của riêng mình.
Giải mã sử dụng các biến số – cách thể hiện bằng ký hiệu của dữ liệu (Bài tiếp theo sẽ giải thích thêm về biến thể; hiện tại cứ xem chúng như các biến thể trong công thức toán học).
Thao tác trên các biến thể được mã hoá với sự trợ giúp của các toán tử – các ký hiệu của thao tác toán học: cộng, trừ, nhân, chia…(bài tiếp theo sẽ trình bày nhiều hơn về vấn đề này). Giải mã cũng sử dụng các từ và biểu thức một cách chính xác để định nghĩa các đoạn của thuật toán (hành động, chỉ dẫn). Ví dụ: đưa ra quyết định có thể được viết như sau:

if (điều kiện) then …

 

hoặc

if (điều kiện) then …
else …


Và các vòng lặp (nói cách khác là thực hiện lặp đi lặp lại của các đoạn của thuật toán)

execute until (điều kiện) …

 

execute modifying value of the variable i from p to l


Trong khi đó dữ liệu đầu vào và đầu ra có thể được biểu diễn bằng từ như: read và write.

Chúng ta có thể sử dụng các ký hiệu +, -, * để thể hiện các thao tác của việc thêm, bớt, nhân; dấu ngoặc đơn để thể hiện thao tác nhóm và các từ đặc biệt để thể hiện hành động và quyết định. Thuật toán để tính thuế có thể được viết như sau:

read income
if (income > 74048) then  tax = 17048.44 + 0.4 * (income - 74048)
else if (income > 37024) then
       tax = 6541.24 + 0.3 * (income - 37024)
else  tax = 0.19 * income - 493.32
write tax


Những khái niệm trong thuật toán này đã thể hiện được hai vấn đề:

Một, lỗi trong dữ liệu đầu vào thay đổi trật tự các bước tiến hành bởi thuật toán và đưa trở về đọc lại chỉ dẫn dữ liệu đầu vào. Trong giải mã hành động đó được mô tả là đi đến một đoạn cụ thể nào đó trong thuật toán (lệnh go to…), thể hiện bằng một nhãn (nhãn là các từ kết thúc bằng dấu ‘:’). Dấu giải mã là {, }, dùng để nhóm các hành động. Ví dụ:

if (điều kiện) then {
hành động 1
hành động 2
}

Nếu điều kiện được thoả mãn, thì hành động trong dấu ngoặc được thực hiện.

dataInput1:
  write "Give the price of the CPU"
  read CPUprice
  if (CPUprice is not a number) then {
      write "Wrong data"
      go to dataInput1
  }
dataInput2:
  write "Give the price of the motherboard"
  read MBprice
  if (MBprice  is not a number) then {
      write "Wrong data"
      go to dataInput2
  }
...
result = sum of prices
write result 


Tuy nhiên những thuật toán như thế (và chương trình) rất khó đọc, logic phức tạp và dễ mắc lỗi.
Đó là lý do tại sao hầu hết các ngôn ngữ lập trình không sử dụng lệnh go to nữa. Thay vào đó người ta sử dụng các vòng lặp. Thuật toán tính giá trị của máy vi tính cần được thể hiện ở một dạng khác. Vòng lặp được sử dụng và giới thiệu biến kiểu boolean được gọi là dataRequired (dữ liệu yêu cầu) với hai giá trị có thể xảy ra: có, yes và không, no.

dataRequired = yes
  execute until (dataRequired) {
     write "Give the price of the CPU"
     read CPUprice
     if (CPUprice is not a number) then write "Wrong data"
     else dataRequired = no
  }
  
dataRequired = yes
  execute until (dataRequired) {
     write "Give the price of the motherboard"
     read MBprice
     if (MBprice is not a number) then write "Wrong data"
     else dataRequired = no
  }
...
result = sum of prices
write result


Ngay từ đầu, giá trị của các biến thể dữ liệu yêu cầu là có và điều kiện là thực hiện cho đến khi hoàn thành. Do đó bắt đầu thực hiện các chỉ lệnh đã được nhóm lại giữa các dấu ngoặc móc. Nếu dữ liệu đọc (giá CPU) không phải là một số thì tín hiệu “dữ liệu sai” được hiển thị. Giá trị của các dữ liệu yêu cầu biến thế không thay đổi sau đó và những hành động được nhóm lại giữa các dấu ngoặc móc lại được thực hiện (bởi vì điều kiện là thực hiện cho đến khi hoàn thành xong). Ngược lại, nếu giá của CPU là một con số, thì dữ liệu yêu cầu biến thế sẽ có giá trị là không. Trong trường hợp đó điều kiện thực hiện cho đến khi không được hoàn thành nữa và hành động trong các dấu ngoặc móc không được thực hiện. Thuật toán sẽ tiếp tục thực hiện những chỉ dẫn từ sau dấu ngoặc “}” – đọc giá của motherboard.

Một vấn đề khác chúng ta gặp phải ở đây là thuật toán lặp đi lặp lại các hành động giống nhau (gần như là một). Xem xét trường hợp đọc giá của CPU, motherboard và các thành phần khác – tất cả các thao tác này giống hệt nhau. Vì vậy chúng ta có thể cô lập các hành động này và viết chung ở dạng gọi là quy trình/thủ tục hay chức năng/hàm. Khi đã viết như vậy chúng có thể được thực hiện lặp đi lặp lại cho vô số các bộ phận khác của một máy vi tính.

Điều này có nghĩa là vấn đề tính toán giá của một chiếc máy tính được chia nhỏ ra thành hai vấn đề:
•    dữ liệu vào và xác minh dữ liệu
•    tính toán thực sự

Mỗi vấn đề được giải quyết một cách riêng rẽ, tập trung vào điểm đặc trưng của mỗi môi trường. Cách lập trình này đuợc gọi là lập trình cấu trúc.

Tóm lại:
•    các chương trình được tạo ra để giải quyết các vấn đề và thực hiện một số nhiệm vụ.
•    truớc khi viết một chương trình để giải quyết một nhiệm vụ nào đó, cần phải tìm ra một thuật toán để giải quyết vấn đề.
•    thuật toán là một công thức, một loạt các câu lệnh thực hiện trên dữ liệu, bản mô tả việc chuyển dữ liệu đầu vào thành dữ liệu đầu ra.
•    một chương trình là bản ghi lại các thuật toán và dữ liệu trong một ngôn ngữ lập trình nhất định.
•    để một chương trình được thực hiện, sự biểu diễn của nó trong ngôn ngữ lập trình phải đuợc dịch sang ngôn ngữ máy tính mà CPU có thể hiểu được. Công việc này do các chương trình chuyên dụng được gọi là translator (máy dịch), compiler (trình biên dịch) hay interpreter (thông dịch) thực hiện.

Cần nhớ rằng các chương trình không chỉ phản ánh các bước (câu lệnh, hành động) của thuật toán mà còn thể hiện dữ liệu xử lý. Những dữ liệu này có thể là các bản sao tách biệt hay nhóm lại thành từng bộ (có liên kết và theo một trật tự nào đó). Trong những trường hợp như vậy chúng ta có thể về cấu trúc dữ liệu.

Do đó, có thể nêu ra một định nghĩa khác của chương trình (tác giả là N. Wirth).

CHƯƠNG TRÌNH là một công thức cụ thể của một thuật toán trừu tượng dựa trên sự biểu diễn cụ thể của cấu trúc dữ liệu.

Hai định nghĩa không trái ngược nhau. Định nghĩa đầu tiên, trích dẫn ngay từ đầu bài nhấn mạnh các hành động thực hiện bởi một chương trình còn định nghĩa thứ hai nhấn mạnh việc tạo ra một chương trình.

Chương trình (mã nguồn) được viết bằng ngôn ngữ lập trình. Mỗi ngôn ngữ lập trình có bảng chữ cái của nó – đó là một loạt các ký tự (chữ cái và con số) từ đó xây dựng nên các ký hiệu của ngôn ngữ (chuỗi các ký tự). Các quy tắc cú pháp xác định tiêu chuẩn cho phép xây dựng ký hiệu và các trật tự xuất hiện trong chương trình. Ngữ nghĩa xác định ý nghĩa của ký hiệu.

Ví dụ như trong ngôn ngữ lập trình có bảng chữ cái được xây dựng từ các chữ cái, con số và các ký tự đặc biệt, thì tên của các biến thể được xây dựng từ chữ cái và các con số. Một số chuỗi kỹ tự thể hiện chỉ lệnh ngôn ngữ được đặt trong dấu ngoặc và đứng sau “if”. Cách kết hợp các ký hiệu được định rõ (ví dụ công thức “nếu(a==b) a = 0;” đúng về mặt cú pháp trong khi công thức “nếu a = b a = 0” lại sai) và nghĩa của chuỗi ký hiệu đó cũng được xác định (ví dụ công thức “a = 3” nghĩa là gắn cho biến thể “a” giá trị là 3).

Có rất nhiều ngôn ngữ lập trình và chúng được phân loại theo nhiều tiêu chuẩn khác nhau.
Chắc chắn quan trọng nhất đó là tiêu chí về cấu trúc logic của ngôn ngữ và cách thức tạo ra các chương trình sử dụng nó.
Ngôn ngữ mệnh lệnh yêu cầu chi tiết về trật tự các bước thực hiện một nhiệm vụ nào đó trong khi ngôn ngữ trần thuật miêu tả mối quan hệ giữa các dữ liệu về mặt chức năng (ngôn ngữ chức năng/hàm) hay về mặt quy tắc (ngôn ngữ liên hệ, ngôn ngữ lập trình logic) và về kết quả của việc thực hiện một chương trình thu được bằng cách áp dụng các thuật toán “xây dựng trong ngôn ngữ” đặc biệt vào các mỗi quan hệ cụ thể.

Lập trình hướng đối tượng chính là kết hợp dữ liệu với các thao tác trên các dữ liệu, tạo cơ hội để tạo ra và sử dụng các loại dữ liệu mới trong chương trình, phản hồi tốt hơn về vùng của vấn đề đặt ra. Lập trình thủ tục (đôi khi có liên quan với lập trình mệnh lệnh) tách riêng dữ liệu và các chức năng, không cung cấp một cách đơn giản và đầy dủ cách phản chiếu vùng của vấn đề trong cấu trúc dữ liệu mà nó sử dụng.

Rysunek - jezyki

Các ví dụ về ngôn ngữ lập trình thủ tục như ALGOL, FORTRAN, PL/I, C.O. Ngôn ngữ hướng đối tượng như Smalltalk, Java, C++ và C#. Ngôn ngữ chức năng có tiếng nhất là Haskell, và ngôn ngữ lập trình logic là Prolog.
Các kiểu phân loại khác có liên quan đến phương thức mà mã nguồn của chương trình được chuyển thành chỉ lệnh của CPU.
Có thể phân biệt hai loại ngôn ngữ ở đây đó là: ngôn ngữ biên dịch và ngôn ngữ thông dịch.
Một chương trình biên dịch dịch ngôn ngữ mã nguồn chương trình sang thành các chỉ lệnh của CPU, nó kiểm tra tính xác thực và thông báo lỗi. Do đó việc biên dịch thực chất là là thông dịch ngôn ngữ và kiểm tra cú pháp.
Trong ngôn ngữ biên dịch, văn bản chương trình (mã nguồn) được dịch sang mã nhị phân (trung gian) bằng một chương trình chuyên dụng gọi là chương trình biên dịch. Một chương trình khác – thường được gọi là linker (kết nối) tạo ra một chương trình thực hiện từ mã nhị phân trung gian (đã sẵn sàng để chạy) và lưu chương trình đó trên ổ cứng ở dạng một file chạy (ví dụ với đuôi mở rộng “exe” hay miền thuộc tính chạy). Đây là cách mà ngôn ngữ “C” hay “C++” vận hành. Trong những trường hợp khác chương trình biên dịch tạo ra mã ký hiệu, mã này được thực hiện bởi trình thông dịch. Ngôn ngữ Java cũng hoạt động tương tự như thế.

Trình thông dịch thực hiện mã nguồn trực tiếp. Nhờ đó công việc xác minh cú pháp được thực hiện trong khi chương trình đang chạy. Một số ngôn ngữ biên dịch sang mã trung gian cho phép công việc kiểm tra này xảy ra trước khi chương trình chạy. Mã nguồn hay mã trung gian của ngôn ngữ thông dịch được đọc và thực hiện bởi chương trình thông dịch, chương trình này tạo ra chỉ lệnh của CPU tương ứng với chỉ lệnh tìm thấy trong nguồn.
Các ví dụ về ngôn ngữ thông dịch như: REXX, Objechương trìnhREXX, Perl, PHP.

Tóm lại: toàn bộ quá trình lập trình có thể được mô tả qua thuật toán sau:

Rysunek - programowanie

Follow

Get every new post delivered to your Inbox.