Thứ Ba, 25 tháng 12, 2007

Lập trình C

Bài 1 Lệnh khai báo thư viện vd : #include Thư viện stdio.h là thư viện chuẩn trong C các bạn có thể biết thêm 1 số thư viện khác như thư viện dùng đẻ xử lý chuỗi ký tự thư viện dùng để cấp phát bộ nhớ cái nì quên rồi ai biết thì trích dùm tôi, lâu rồi nên quên nhưng tôi nhớ là khai báo thư viện này thì sử dụng được lệnh clrscr(); Khai báo hàm : * Có 2 kiểu khai báo hàm : void main() <=== hàm không trả về giá trị vd: #include void main() { printf("Test test test"); } kiểu khai báo thứ 2 : int main() <=== hàm trả về giá trị kiểu int vd: #include int main { int a; printf("\n Nhap gia tri"); scanf("%d",&a); return(a); } Tiếp theo ta học đến phần kiểu dự liệu cơ bản: * int Kích thước :16 bit Khoảng giá trị : -32768->32767 * float Kích thước : 32 bit Khoảng giá trị :6 ký số, ví dụ như 6,55555 * char Kích thước : 8bit Khoảng giá trị : -128 ->127 Chương tiếp ???? Biến và Hằng. Biến: trong C biến là một vùng nhớ có tên dùng để lưu trữ các giá trị khi tính toán, các giá trị của biến có thể thay đổi trong suốt thời gian chương trình thực thi. các thuộc tính của biến gồm có kiểu dữ lệu của biến (type), TênBiến (name),và Miền giá trị (Domain).Các kiểu dữ liệu của biến và miền giá trị đã được giới thiệu ở trên. để khai báo một biến ta thực hiện cú pháp sau:
Code:
          type name[=giá trị khởi tạo];
[=giá trị khởi tạo] có thể có hoặc không. ví dụ:
Code:
          int a;
       long b=10;
Ta có thể khai báo nhiều biến có cùng kiểu dữ liệu trên cùng một dòng. ví dụ:
Code:
        int a,b=10,c,d;
Hằng: là một vùng nhớ có tên giống như biến, tuy nhiên giá trị của hằng là không thay đổi suốt chương trình. Để khai báo một hằng ta dùng từ khóa const với cú pháp như sau:
Code:
 const type name=giátrị;
Lưu ý: giá trị của hằng phải xác định trong câu khai báo hằng. ví dụ:
Code:
const float pi=3.14;
Chương tiếp theo Các phép tóan trong C Phép gán = Phép tóan này dùng để gán một giá trị cho một biến với cú pháp sau:
Code:
     dest=source;
với dest phải là một biến. source là biến hay là một hằng số bất kỳ. ví dụ:
Code:
      int a,b=10;
   const int c=12;
   a=b; //ok a=10.
   a=11;//ok a=11.
  11=a;//false 11 không phải là biến.
  c=12;// false c là một hằng số không thể thay đổi được.
Các phép tóan đại số: Phép tóan cộng + ví dụ:
Code:
    int a=0,b=1,c=2;
 a=12+1;   //lấy 12+1=13 rồi gán cho a, kết quả(kq) a=13.
 a=b+c;    //lấy biến giá trị b cộng giá tri c tức 1+2 rồi gán cho a, kq a=3.
 a=c+10;  //lấy biến c cộng 10 rồi gán cho a, kq a=12.
 a=a+10;  //lấy biến a cộng 10 rồi gán cho a,kq a=12+10=22.
 a=a+a;   //lấy biến a cộng cho a rồi gán cho a,kq=22+22=44.
Chương trình sau cho phép bạn nhập vào 2 số và in kết quả phép tính cộng hai số ra màn hình.
Code:
#include
#include
 int main()
 {
    float a,b,c;
     printf("Chuong trinh tinh tong hai so\n")
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%f",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%f",&b);
     c=a+b;
     printf("\nKet Qua của phep cong: %f+%f=%f",a,b,c);
     return 0;
 }
Phép toán nhân *
Code:
    inta,b;
 a=2*20; //lấy 2 nhân với 20 rồi gán vào cho a, kết quả (kq) a=40.
 b=a*2;  //lấy a=40 nhân với 2 rồi gán vào b, kq b=80.
 a=a*a; // lấy a=40 nhân với a=40 rồi gán lại cho a, kq a=1600
Chương trình sau cho phép bạn nhập hai số sau đó in ra kết quả tích của hai số đó.
Code:
#include
#include
 int main()
 {
    float a,b,c;
     printf("Chuong trinh tinh tich hai so\n")
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%f",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%f",&b);
     c=a*b;
     printf("\nKet Qua của phep nhan: %f*%f=%f",a,b,c);
     return 0;
 }
[b]Phép toán chia /[b] Phép chia số nguyên: kết quả của phép toán là lấy phần nguyên của phép toán. Ví dụ: 5/2 ta được 2 dư 1. Kết quả(kq) ta được 2. Chú ý: Phép toán này chỉ thực được hiện trên tập số nguyên. Vậy: Nếu ta có n=a*b+c thì phép toán chia nguyên của n/b=a và n/a=b. Chương trình sau sẽ cho phép nhập vào hai số sau đó lấy phần nguyên của kết quả phép chia.
Code:
#include
#include
 int main()
 {
    int a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%d",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%d",&b);
     c=a/b;
     printf("\nKet Qua của phép chia nguyên: %d-%d=%d",a,b,c);
     return 0;
 }
Phép toán chia đối với số thực Phép toán này có kết quả như ta chia một số thực bình thường kết quả sẽ là một số thực như 5/2=2.5.
Code:
#include
#include
 int main()
 {
    float a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%f",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%f",&b);
     c=a/b;
     printf("\nKet Qua của phep chia so thuc: %f / %f=%f",a,b,c);
     return 0;
 }
Phép toán lấy phần dư của phép chia số nguyên % (phép toán mode) Như tôi đã nói như trên nếu n=a*b+c. ta có n/a=b và n/b=a là phép toán chia nguyên còn n%a=c hay n%b=c là phép toán lấy phần dư của phép chia nguyên. ví dụ ta có 5/2 được 2 dư 1 thì 5%2 sẽ được 1.
Code:
#include
#include
 int main()
 {
    int a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%d",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%d",&b);
     c=a%b;
     printf("\nKet Qua của phép chia nguyên: %d %% %d=%d",a,b,c);
     return 0;
 }
Các phép toán luận lý Các phép toán luận lý có hai kết quả trả về là đúng hay sai, giá trị đúng là 1, giá trị sai là 0. Phép toán so sánh bằng == Phép so sánh hai biểu thức A và B ký hiệu A==B là một mệnh đề. Mệnh đề này có giá trị là đúng(bằng 1) nếu biểu thức A bằng biểu thức B, ngược lại mệnh đề này sẽ có giá trị false (bằng 0).
Code:
   int a,b;
a=1;
b=2;
b==a;//có giá trị là sai (0)
a==1;//có giá trị là đúng (1)
2==b;//có giá trị là đúng.
2==2;//có giá trị là đúng.
Ta có thể lấy giá trị của kết quả phép toán so sánh bằng cách gán giá trị trả về của phép so sánh vào một biến cụ thể.
Code:
     int a;
  a=(1==2);//Mệnh đề 1==2 là một mệnh đề sai,a sẽ được gán kết quả là a=0.
  a=(a==0);//mệnh đề a==0 là một mệnh đề đúng do đó kết quả a=1.
Chương trình cho phép bạn nhập vào 2 số và in ra giá trị đúng sai của biểu thức so sánh hai số.
Code:
#include
#include
 int main()
 {
    int a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%d",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%d",&b);
     c=(b==a);
     printf("\nKet Qua cua phep so sanh: (%d == %d)=%d",a,b,c);
     return 0;
 }
Phép so sánh không bằng != Phép so sánh A!=B là một mệnh đề, mệnh đề này đúng(bằng 1) khi A khác B (hay A không bằng B) và có giá trị sai (bằng 0) khi A==B.
Code:
   int a,b;
a=1;
b=2;
1!=2; //Mệnh đề 1 khác 2 có giá trị đúng (1).
a!=b;//Mệnh đề a khác b có giá trị đúng.
2!=b;//Mệnh đề 2 khác b có giá trị sai (0).
Ta có thể lưu giá trị của phép so sánh không bằng vào biến.
Code:
    inta;
 a=(1!=2);//1 khác 2 là một mệnh đề đúng do đó biến a sẽ có giá trị 1.
 a=(1!=a);//1 khác a (a=1) là một mệnh đề sai do đó biến a sẽ có giá trị là 0.
Chương trình cho phép bạn nhập vào hai số, in ra giá trị đúng sai của phép toán so sách khác nhau giữa hai số.
Code:
#include
#include
 int main()
 {
    int a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%d",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%d",&b);
     c=(b!=a);
     printf("\nKet Qua cua phep so sanh: (%d != %d)=%d",a,b,c);
     return 0;
 }
Phép toán so sánh lớn hơn >, lớn hơn bằng >=, nhỏ hơn <>
Code:
   1>2;     //Mệnh đề(MĐ) có giá trị Sai.
1>=2;   //MĐ có giá trị Sai.
1<2;>
Phép toán Or || Cho A B là các mệnh đề mệnh phép toán A or B (A||B) có kết quả là một mệnh đề, và mệnh đề này chỉ sai khi và chỉ khi A và B cùng là hai mệnh đề sai. Ta có bảng chân trị sau:
Code:
     A \ B  0  1
    0    0  1
    1    1  1
ví dụ:
Code:
    (1<2)||(1==2); 1="=" 1="=" 1="=" 1="=" 1="=">
Phép toán and && Hai mệnh đề A và B, phép toán and hai mệnh đề A và B (A&&B) là một mệnh đề,mệnh đề này có giá trị là đúng khi và chỉ khi A và B là hai mệnh đề đúng. bảng chân trị
Code:
      A/B   0   1
    0    0   0
    1    0   1
ví dụ:
Code:
   int a;
a=(1==1)&&(0<1); 1="=" a="1;" a="(1">2)&&(1==1);// Do mệnh đề 1>2 là mệnh đề sai nên kết quả a=0;
Các cấu trúc điều khiển trong C Cấu trúc tuần tự: Gọi A B là hai đoạn mã trong C.
Code:
     A;
    B;
Thì theo cấu trúc tuần tự đoạn mã A sẽ được thực thi trước sau đó mới tới đoạn mã B. Ví dụ minh họa việc thực hiện tuần tự các câu lệnh trong C.
Code:
#include
     int main(){
          int i;
          printf("Ban nhap vao mot so nguyen");
          scanf("%d",&1);
          printf("So nguyen cua ban vua nhap co gia tri la %d",i);
          return 0;
     }
Thứ thực hiện câu lệnh tuần tự sẽ lệnh khai báo biến i --> lệnh printf nhắc nhap so nguyen -->lệnh scanf cho phep nhan bien i-->printf xuất số nguyên và cuối cùng là lệnh return 0. Cấu trúc lệnh rẻ nhánh Cấu trúc if , if else Cấu trúc if có dạng như sau:
Code:
  if(A)
{
          S1;
}
Với cấu trúc trên nhóm lệnh S1 chỉ được thực hiện khi và chỉ khi MệnhĐềA có đạt giá trị đúng.
Code:
#include
int main(){
    int a,abs;
    printf("Ban hay nhap vao mot so");
   scanf("%d",&a);
  asb=a;
   if(a<0)
   {
           abs=-1*a;
   }
   printf("|%d|=%d",a,asb);
return 0;
}
Với chương trình trên cho phép bạn nhập vào một số và tính trị tuỵêt đối của số vừa nhập. nếu bạn nhập vào a=2 là một số dương thì a<0 là một mệnh đề sai câu lệnh asb=-1*a sẽ không được thực hiện lúc này asb sẽ bằng a=2. khi bạn nhập a=-2 lúc này mệnh đề a<0 là đúng câu lệnh abs=-1*a sẽ đựơc thực hịên và abs sẽ bằng 2. Các điều lưu ý nếu mệnh đề A không phải là một mệnh đề mà là một giá trị nào đó ví dụ if(2) hay if(2-2) thì các câu lệnh trong if chỉ được thực hiện khi giá trị tính toán trong ngọăc khác không. do đó ở đây các bạn sẽ gặp một lỗi rất phiền tóai là mệnh đề A là một câu so sánh mà bạn lại viết sai như sau: Thay vì bạn viết a==b bạn lại viết a=b bạn sẽ gặp rắc rối như sau:
Code:
  inta,b;
 a=1;
 b=2;
 if(a=b)
{
    printf("a va b bang nhau vi:%d=%d",a,b);
}
ở đây bạn thấy ý muốn của tôi là so sánh a có bằng b không nếu bằng xuất ra câu trong if. Nếu đúng theo suy nghĩ thì câu xuất ra sẽ không được xuất tuy nhiên, tôi lại viết sai là a=b tức gán a bằng b câu kết thúc câu lệnh này a=2 và là một số khác không nên câu lệnh trong if vẫn được thực hiện.
Cấu trúc if else Cú pháp của cấu trúc này như sau:
Code:
   if(A)
   {
        S1;
   }
   else
  {
        S2;
   }
Thứ tự thực hiện của cấu trúc này như sau: Nếu mệnh đề A là một mềnh đề đúng hay giá trị của A là khác 0(Nếu A không phải là mệnh đề) thì nhóm lệnh S1 được thực hiện ngược lại thì lệnh S2 sẽ được thực hiện. Chương trình Giải Phương trình dạng Ax+B=0;
Code:
#include
int main()
{
  float  A,B;
  printf("Ban nhap vao theo yeu cau sau:\n");
  printf("Nhap vao he so A=");
  scanf("%f",&A);
  printf("Nhap vao he so B=");
  scanf("%f",&B);
  if(A==0) //Nếu bạn nhập A bằng 0 thì khối lệnh trong if được thực hiện.
  {
        if(B==0)// trường hợp này A==0 và B==0 pt có vô số nghiệm
        {
            
             printf("Phương trình trên có vô số nghiệm");
        }
        else //trường hợp này A==0 và B!=0 pt sẽ vô nghiệm
       {
            printf("Phuong trinh trên vô nghiệm");
       }
  }
  else //trường hợp này A!=0 nghịêm pt là -B/A
  {
      printf("phuong trinh tren co nghiem x=%f",-B/A);
  }

  return 0;
}
Cấu trúc switch : Dạng :
Code:
switch(biến/biểu thức) {
case  : Lệnh 1;
                      break;
case  : Lệnh 2;
                        break;
......
case  : lệnh n;
                        break;
[default] :lệnh(n+1);
}
cấu trúc này nhằm kiểm tra biến/biểu thức nếu thuộc 1 trong các trường hợp có giá trị i thì thực hiênh lệnh i. Nếu không thì mặc định sẽ thực hiện lệnh (n+1).
Vòng lặp. Cấu trúc lặp với while
Code:
    while(A)
   {
           S;
   }
Cấu trúc while sẽ làm việc như sau: Trong khi Mệnh đề A còn đúng hay giá trị A khác 0(nếu A không phải mệnh đề) thì câu lệnh S sẽ được thực hiện. Câu lệnh S sẽ được thực hiện lặp đi lặp lại đến khi A sai hay khác 0. Đọan mã tính giai thừa của một số.
Code:
 #include

   int main()
  {
     long i=1,kq=1,n;
     printf("Ban muon tinh giai thua cua so nao ? n=");
     scanf("%d",&n);
     while(i<=n)
      {
        kq=kq*i;
        i++;
      }
    printf("ket qua %d!=%d",n,kq);
    return 0;
  }
do ............while()
Code:
   do
  {
     S;
  }while(A)
cấu trúc này tương tự như cấu trúc sau;
Code:
     S;
    while(A)
   {
      S;
   }
Tức lệnh S sẽ được thực hiện sau đó nếu Mệnh đề A là một mệnh đề đúng hay là một giá trị khác 0 thì lệnh S tiếp tục thực hiện. Và chỉ thóat khỏi vòng while khi A là mệnh đề sai hay có giá trị là 0.
Cấu trúc lặp với for() Vòng lặp for có dạnh như sau:
Code:
 for(X,Y,Z)
{
       S;
}
Vòng lặp này rất khó giải thích tuy nhiên thông thường chúng được thực hiện với ý nghĩa như sau:
Code:
int i;
 for(i=1;i<10;i=i+1)
 {
       S;
 }
thao tác thực hịên: Đầu tiên X được thực hịên sau đó nếu Y là một mệnh đề đúng hay có giá trị khác 0 thì S sẽ được thực hiện sau đó Z sẽ được thực hiện. Và S sẽ được thực hịên đến khi Y sai hay Y có giá trị 0. Nếu như vậy tại sao tôi lại nói là khó giải thích vì for có thể có những trường hợp sau:
Code:
   for(X;Y;)
  for(X;;)
  for(;;)
tức thiếu 1 trong X,Y,Z, hay thiếu hết(nhưng phải có đủ 2 dấu 2 chấm) thì vẫn không bị coi là lỗi cú pháp. Ví dụ
Code:
#include

int main()
{
 for(;;)
 {
   break;

 }
 return 0;
}
tuy nhiên việc này là vô nghĩa ta không nên sử dụng theo kiểu này. Ví dụ trương trình tính giai thừa của một số nguyên:
Code:
#include
int main()
{
   unsigned int n, i;
   unsigned long kq=1;

   printf("Ban nhap vao so nguyen duong");
   scanf("%d",&n);
   if (n<0 )
        return 1;
   for(i=1;i<=n;i++)
   {
       kq=kq*i;
   }
  
   printf("ket qua %d!= %d",n,kq);
   return 0;
}
Câu lệnh break Các bạn đã thấy tác dụng của break trong phần cấu trúc switch, ngòai ra break còn có tác dụng là thóat khỏi vòng lặp ngay lập tức. ví dụ đọan code sau cho phép bạn nhập một dãy các ký tự kết thúc là phím enter.
Code:
  char ch;
  while(1)
 {
      ch=getchar();
      if(ch==13) break;
 }
Bạn thấy đó while(1){,,,,,,} là một vòng lặp không ngừng tuy nhiên ta có thể cho nó ngừng bằng lệnh beak; Biến Trỏ Định nghĩa: Biến trỏ là một biến dùng để chứa địa chỉ của biến khác. Để khai báo một biến trỏ ta có cú pháp sau:
Code:
KDL *TênBiến;
ví dụ:
Code:
int *x;
Ta nói x là một biến trỏ chứa địa chỉ của một biến có kiểu DKL là int (hay trỏ tới một biến có kiểu dữ liệu int). Do biến trỏ chỉ chứa địa chỉ của biến khác nên độ lớn của nó thường là 2 byte bất kể nó chứa địa chỉ của biến có kiểu dữ liệu nào.
Code:
   int *a;
  double *b;
  if(sizeof(a)==sizeof(b))
 {
          printf("hai bien nay co kich thuong bang nhau");
 }
Để sử dụng biến trỏ này ta phải trỏ nó tới một biến, bằng cách gán địa chỉ của biến cần trỏ tới vào biến trỏ với tóan tử lấy địa chỉ &
Code:
TênBiếnTrỏ=&TênBiếnThường;
Ví dụ:
Code:
int *ptr;
int a=1;
ptr=&a;
Ta có thể thay đổi để biến trỏ đang trỏ tới biến này sang trỏ tới một biến khác.
Code:
int *ptr;
int a=1,b=2;
ptr=&a;
//..............
ptr=&b;
ta có thể vừa khai báo vừa trỏ tới một biến khác
Code:
int a;
int *ptr=&a;
Cách sử dụng biến trỏ: để biết cách làm việc của biến trỏ ta lưu ý một số phép toán như sau: & phép toán này đặt trước một biến thường dùng để lấy địa chỉ của biến. * phép toán này được đặt trước biến trỏ dùng để lấy nội dung của biến mà biến trỏ trỏ tới. ví dụ:
Code:
int a=2,*b=&a;
printf("Noi dung cua bien a la :%d",*b);
ví dụ trên tôi đã dùng biến trỏ b trỏ đến biến a và thông qua tóan tử * tôi truy cập được nội dung của biến a. Ngòai ra ta còn có thể thông qua tóan tử * để sửa đổi nội dung của biến mà con trỏ đang trỏ tới.
Code:
int a=2,*ptr=&a;
*ptr=3;
printf("Noi dung cua bi thay doi bang:%d",a);
ví dụ trên ta sẽ nhận được a=3; do ta đã dùng * thông qua ptr truy cập và sử đổi nội dung của biến a. Đến đây các bạn vẫn chưa thấy hết tinh hoa của con trỏ phần tiếp theo tôi sẽ mở rộng vấn đề con trỏ thêm. Có rất nhiều người nói nếu bạn là một lập trình viên C mà không nắm hết con trỏ tức là bạn chưa biết gì về C. Hẹn gặp lại.
Mối tương quan giữa biến trỏ và mảng Khi ta khai báo một mảng thì tên mảng chính là tên biến trỏ và biến trỏ này luôn trỏ đến vị trí ô nhớ đầu tiên của mảng. Và biến trỏ này là biến trỏ hằng tức nó luôn trỏ tới vị trí đầu tiên của mảng, ta không thể thay đổi cho biến trỏ này trỏ đến biến khác.
Code:
int a[5]={1,2,3,4,5};
printf("giá trị a[0] là: %d",*a);
Ta có thể dùng biến trỏ để trỏ đến bất cứ phần từ nào trong mảng
Code:
int*ptr;
ptr=a;
printf("gia tri a[0] là:%d",*ptr);
tại sao tôi không dùng ptr=&a; như tôi đã đề cập ở trên a là một hằng con trỏ luôn chứa địa chỉ của biến a[0], do để ptr trỏ đến phần tử đầu tiên của mảng ta chỉ cần gán ptr=a;tức ptr=&a[0], nếu bạn thích thì bạn cũng co thể viết lại là ptr=&a[0]. Và từ đây ptr có thể thao tác tương tự như là một mảng để lấy giá trị của phần tử thứ i trong a thông qua ptr ta chỉ vịêc viết ptr[i].
Code:
int a[5]={1,2,3,4,5}
int *ptr=a;
for(int i=0;i<5;i++)
   printf("%d",ptr[i]);
Cộng biến trỏ với một số nguyên Khi ta cộng biến trỏ tới một số nguyên tức ta đã thay đổi cho biến trỏ tham chiếu tới một biến khác. Còn biến trỏ này trỏ tới đâu ta có công thức tính như sau: Đầu tiên ta khai báo một biến trỏ sau đó cho nó trỏ tới một biến.
Code:
KDL *ptr, x; //KDL :kiểu dữ liệu
ptr=&x;
khi ta thực hiện phép toán cộng ptr với một biến nguyên i tức
Code:
ptr=ptr+i
thì lúc này ptr sẽ tham chiếu tới vùng nhớ có địa chỉ là ptr+sizeof(KDL)*i; Vùng nhớ này nếu ta không biết nó là gì thì không nên thay đổi giá trị của nó rất nguy hiển cho chương trình. Ví dụ:
Code:
#include

int main()
{
 int *ptr,a;
 ptr=&a;
 printf("ptr hien tai dang chi toi dia chi la %d",ptr);
 printf("\nDo lon cua kieu du lieu la %d byte",sizeof(a));
 ptr=ptr + 2;
 printf("\nSau khi cong 2 vao thi ptr chi toi dia chi la %d",ptr);

 
  return 0;

}
Như tôi đã nói ở trên khi ta làm thay đổi giá trị của một biến trỏ đến bằng phép toán cộng tức ta đã cho biến trỏ tham chiếu tới một vùng nhớ mới ta sẽ gặp nguy hiểm nếu không xác định được biến trỏ đang trỏ tới đâu vậy câu hỏi đặt ra là phép toán cộng cho biến trỏ sẽ giúp được gì cho chúng ta? Thông thường phép toán này làm việc với một biến trỏ, trỏ đến mảng sẽ có hiệu lực rất hay. Ví dụ khi ta khai báo một mảng a 7 phần tử và một biến trỏ , chỉ đến ô nhớ đầu của a như sau:
Code:
int a[7], *ptr=a;
for(int i=0;i<7;i++)
   a[i]=i;
giả sử biến int có giá trị là 2 byte(mỗi trình biên dịch sẽ có độ lớn của kiêu int khác nhau) và lúc này địa chỉ của a[0] là 8 thì ptr sẽ là 8 và ta nếu ta có phép toán :
Code:
ptr=ptr+1;
tức ptr sẽ trỏ đến địa chỉ ptr+sizeof(int)*1 tức ptr=10 đây chính là điạ chỉ của a[1]. xét ví dụ sau thông qua biến trỏ ptr để khởi gán các giá trị cho mảng a;
Code:
#include

int main()
{
   int a[7], *ptr=a,i;
   printf("mang a ban dau co gia tri la:");
   for(i=0;i<7;i++)
   {
         printf("%d ",a[i]);
    }
 
   for(i=0;i<7;i++)
   {
       *ptr=i;
         ptr++;
   }
   printf("\nNoi dung cua mang a sau khi khoi tao  la");
   for(i=0;i<7;i++)
   {
         printf("%d ",a[i]);
    }
 return 0;
}
Điều chú ý giữa biến trỏ và mảng khi ta khai báo một mảng
Code:
int a[9];
Code:
thì câu lệnh: a[i]=i[a] với i là một số nguyên.
Chứng minh :
giả sử a[i]=i[a] (1)
do trình biên dịch hiểu a[k]=*(a+k)
do đó (1) <==> *(a+i)=*(i+a) Đẳng thức đúng./
Do đó ta có ví dụ chương trình sau:
Code:
#include
int main()
{
 int a[10],i;
 for(i=0;i<10;i++)
     i[a]=i;

 printf("Noi dung cua mang a la :");
 for(i=0;i<10;i++)
     printf("  %d", a[i]);

return 0;
}

Lập trình Java

Cuối năm 1990, James Gosling được Sun giao nhiệm vụ xây dựng phần mềm lập trình cho các mặt hàng điện tử dân dụng với mục tiêu nhỏ gọn, tương thức được với nhiều thiết bị phần cứng khác nhau. Ban đầu nhóm Gosling dự định dùng C++, nhưng sau đó nhận thấy rằng C++ còn quá cồng kềnh và đòi hỏi rất nhiều hỗ trợ phần cứng. Do vậy nhóm quyết định xây dựng một ngôn ngữ lập trình mới. Đặt tên là Oak (Cây sồi - Cửa sổ phòng làm việc của Gosling nhìn ra một gốc sồi). Oak được sử dụng đầu tiên trong dự án xanh (Green Project), trong đó nhóm đưa hệ thống vào các thiết bị dân dụng như TV, đầu Video, điện thoại và các thiết bị cầm tay. 1993, Oak được sử dụng trong Dự án Phim-theo-yêu-cầu (Video On Deman). Trong đó, Oak là nền của phần mềm quảy lý hệ thống truyền hình hỗ trợ tương tác. Từ đó, Oak có những bước trưởng thành nhanh chóng. Do có sự trùng tên, nên Oak đổi tên thành Java. Nhóm đã quyết định lấy tên này khi đi du lịch đến hòn đảo Java rất nổi tiếng của Indonesia. Năm 1993, Web/Internet ra đời vào có bước phát triển mạnh. Nhóm đã nhận ra điều này và định hướng phát triển cho Java trở thành ngôn ngữ phục phụ hoàn hảo cho lập trình trên nền Web. Lịch sử phát triển của Java đến nay đã trải qua gần 20 năm.
Java Technology: Programming Language
● As a programming language, Java can create all kinds of applications that you could create using any conventional programming language.
Java Technology:A Development Environment
● As a development environment, Java technology provides you with a large suite of tools: – A compiler (javac) – An interpreter (java) – A documentation generator (javadoc) – A class file packaging tool and so on... Java được xây dựng chủ yếu trong bộ công cụ phát triển java JDK (Java Development Kit), bao gồm các thư viện chuẩn, các trình biên dịch (Compiler) (javac), thông dịch (interpreter)(java), bộ soạn tài liệu (javadoc); JVM (java vỉtual machine) ... đây chính là platform để phát triển các ứng dụng Java. JDK 1.0 khởi đầu vào năm 1995. JDK 1.1 ra đời 1 năm sau đó (1996) với nhiều cải tiến như: - Tăng thêm thư viện giao diện AWT (Abstract Windows ToolKit) - Xây dựng hệ thống thư viện JavaBeans. - Xây dựng thư viện lập trình giao diện JFC (Java Foundation Class) - Thêm các lớp mới: java.math, java.net... Từ đó, java được cải tiến liên tục qua các phiên bản: 1.12,1.13...1.16- JDK 1.16 là lõi viết lên các IDE nổi tiếng như JBuilder 2.0 của Borland, Visual Age của IBM, Visual J++ 6.0 của MS. Năm 1998, JDK 1.2 ra đời với nhiều thay đổi, bảo mật hơn, chạy nhanh hơn và linh động hơn 1.1 --JDK 1.2 tích hợp JavaBeans và JFC vào Core Java API --Phát triển thêm đồ họa 2D, 3D --EJB (Enterprise Java Beans) và JSP(Java Server Page). Tháng 7/2002, JDK 1.4 ra đời, hỗ trợ 3 môi trường: --Java Standard Edition: Java chuẩn dành cho hầu hết môi trường phát triển ứng dụng Java. --Java Enterprise Edition: Java dành cho Enterprise. Hỗ trợ Web, EJB, JSP, servlet... --Java Mobile: môi trường phát triển các ứng dụng cho các thiết bị di động. 30/9/2004, J2SE 5.0 ra đời với hơn 100 feature mới. Code name Tiger. 11/12/2006, J2SE 6.0 ra đời dưới sự phát triển của JSR 270. Code name Mustang. Hãy nhớ lại mục đích của Java là gì? Chạy trên nhiều nền hệ điều hành, nhiều nền phần cứng, trên nhiều thiết bị khác nhau... JVM chính là chìa khóa giúp java đạt được mục đích trên. Mã nguồn Java sẽ được bộ biên dịch javac biên dịch thành mã Bytecode, chạy trên các máy ảo Java (JVM). Mỗi hệ điều hành, mỗi phần cứng sẽ có bộ máy ảo riêng cho nó. Do vậy, các ứng dụng của Java có thể chạy trên nhiều nền chừng nào máy đó còn đi kèm bộ thông dịch, bộ gỡ rối, và bộ thư viện kiểm soát mã thực thi của Java. Kiến trúc này là kiến trúc trung tính (Neutral Architecture). Mô hình biên dịch và thực thi các ứng dụng Java: -Sử dụng Text Editor viết các mã nguồn của Java: Ví dụ Hello.java -Biên dịch Hello.java thành mã Byte code Hello.class bằng trình biên dịch javac. Việc này chỉ làm 1 lần. -Thông dịch các mã bytecode bằng trình thông dịch java. Lặp lại nhiều lần. Mỗi lần chạy các ứng dụng java đều phải thông dịch từ trình thông dịch này. Các đặc điểm của Java: -Đơn giản (Simple) -Hướng đối tượng (Object Oriented) -Phân tán (Distributed) -Đa tuyến (Multithreaded) -Mạnh mẽ (Robust) -Trung tính (Architecture neutral) -Khả chuyển (Portable) -Linh động (Flexible) -Bảo mật (Security) -Hiệu quả cao (High Performance) Các đặc tính này sẽ được làm rõ hơn khi làm việc với Java Trước khi bắt đầu viết chương trình đầu tiên. Chúng ta nhắc lại một chút về kiến trúc của Java. - Mã nguồn Java được viết dưới dạng plain text, với đuôi mở rộng là .java . Source file được biên dịch bằng javac compiler thành .class file. File .class này là mã bytecode, không chạy ngay bởi vi xử lý được mà phải chạy qua Java Virtual Machine (JVM). -JVM có thể được cài đặt trên rất nhiều nền, cho nên cùng 1 file .class có thể chạy trên được Microsoft Windows, Solaris TM Operating System (Solaris OS), Linux, hay Mac OS Một vài định nghĩa: -Console: Cổng giao diện dòng lệnh. VD: cmd của windows, terminal của Linux... -Text Editor VD: Notepad, Wordpad, vi, emacs ... -Intergrated Development Environment hay IDE: Môi trường phát triển ứng dụng, tích hợp tất cả các thứ như Text Editor, Compiler, Interpreter, Debugger vào 1 gói Software dùng để phát triển phần mềm cho thuận tiện. VD: Eclipse, Netbeans, .............. Sơ lược về lịch sử lập trình: Step-by-step programming: Trong những ngày đầu của ngành IT, lập trình là một công việc khó khăn. Mỗi bước làm việc của máy đều phải theo dõi tỉ mỷ, cẩn thận. Ngôn ngữ lập trình thời đó là ngôn ngữ máy (Machine Language), sau đó cao hơn 1 chút là hợp ngữ (Asembly Language). Mỗi mã lệnh của ngôn ngữ tương ứng với một chỉ thị của CPU. Hiện nay, Asembly chủ yếu dùng để lập trình nhúng cho các con Chip. Các bạn khoa điện tử chắc sẽ rất rõ về ngôn ngữ này. Procedure language: Ngôn ngữ thủ tục. Đó là Pascal và C, ngôn ngữ thủ tục giúp các lập trình viên dễ dàng trong công việc so với giai đoạn trước. Các chuỗi hành động sẽ được tập hợp lại thành một khối gọi là hàm (function) hay thủ tục (procedure). Các khối này là các black box, người sử dụng không cần biết trong khối đó cụ thể làm những bước nào, chỉ cần biết tham số đầu vào và kết quả đầu ra như thế nào. Như hàm writeln trong Pascal hay println trong C. Vấn đề đặt ra: trong ngôn ngữ thủ tục, các hộp đen được kết nối với nhau để tạo ra một hệ thống phù hợp với yêu cầu mới. Điều này sản sinh ra một kiến trúc hộp đen cha bao gồm rất nhiều hộp đen con được kết nối với nhau (trong C có khái niệm con trỏ hàm - function pointer thực hiện công việc này). Khi muốn thay đổi dữ liệu trong một hộp đen con (không phải dữ liệu trả về), các hộp đen con khác và hộp đên cha cần phải được kiểm tra lại và biên dịch lại, nếu không dễ gây ra lỗi. Với ứng dụng lớn, đây là một việc phức tạp. Structured Development (Phát triển cấu trúc): Sự phát triển cấu trúc không thay đổi các ngôn ngữ đã dùng. Mà là một phương pháp phát triển phần mềm mới. Trong phương pháp này, lập trình viên phải lên được 100% kế hoạch của chương trình trước khi viết bất kỳ dòng code nào. Cần soạn một lượng biểu đồ lớn để xác lập tương quan giữa các hàm với nhau, với các dữ liệu. Vấn đề là: Khó có thể đưa vào thiết kế tất cả những gì xảy ra với chương trình. Một chương trình tốt phải được phát triển trên điều kiện thực tế: lập trình, thử, cáp dụng, cải tiến .... Lập trình cấu trúc đòi hỏi một thiết kế hoàn chỉnh trước khi mọi thứ được cài đặt. Do đó sẽ không có "Ôi mẹ ơi, tôi quên mất feature này rồi! " Lập trình hướng đối tượng OOP: -Đối tượng là khái niệm cơ sở trong OOP. Nó không phải là con số, không phải là cấu trúc thông thường. Theo ý kiến của mình nó áp dụng thói quen của con người vào công việc lập trình. Các sự vật trên thế giới đều có những đặc tính riêng, tiêu biểu cho sự vật đó. Các đặc tính này thông qua các giác quan sẽ lưu giữ lại "hình ảnh" của sự vật trong nhận thức của chúng ta. Các sự vật này, có tên gọi khác là các đối tượng. Việc biểu diễn lại các đặc tính, khả năng, hành động của đối tượng đó chính là OOP. Các bạn nhớ lại các bài văn miêu tả con mèo của mình hồi học cấp 1. Chúng ta nhận biết sự hiện diện của con mèo như thế nào? Đó là thông qua các đặc tính cả nó: tên nó là Mun, lông màu đen, mắt màu xanh, có bốn chân, là động vật có vú... và các hành động ngủ, bắt chuột, nhảy, vẫy đuôi... một nhóm đối tượng có tập hợp các đặc tính riêng nào đó đại diện cho nhóm đó. Ví dụ, nhóm con mèo sẽ khác với nhóm con gà. Vậy những đặc điểm nào làm nên sự khác nhau đó??? Những đặc điểm này được gọi là lớp (Class). Mỗi đối tượng là một thực thể của lớp nào đó. OOP chính là áp dụng các qui tắc của các bài văn miêu tả vào ngôn ngữ lập trình. Chúng ta xây dựng lớp Con mèo. Lớp Con mèo: các thuộc tính: +Tên +Là động vật có vú không? +màu lông +màu mắt +Số lượng chân các phương thức: +ngủ +bắt chuột +nhảy +vẫy đuôi Và con mèo Mun của IPv6 chính là một đại diện (instance) của lớp con mèo. Hay gọi là đối tượng con mèo Mun. Các phương thức trong đối tượng khi được triệu gọi sẽ làm thay đổi thuộc tính của chính nó và thay đổi thuộc tính của các đối tượng khác như thế nào? Ví dụ: như mèo Mun vồ con chuột==> con chuột chết. Ngoài ra, răng con Mun sẽ có thay đổi gì? --> dính máu. OOP chính là sự biểu diễn lại các vấn đề này. Các điểm mạnh của OOP
Chương trình Java đầu tiên: Hello World
. Chạy Hello World trên Console: Mã nguồn viết bằng Notepad: HelloWorld.java Lưu trong thư mục: C:\Java\javafiles
Code:
public class HelloWorld{
 public static void main(String args[]){
  System.out.println("Hello World!");
 }
}
Biên dịch: C:\Java\javafiles>javac HelloWorld.java Thông dịch: C:\Java\javafiles>java HelloWorld Kết quả
Cấu trúc chương trình Java.
Java là ngôn ngữ hướng đối tượng nên tất cả các hàm phương thức đều phải nằm trong khai báo lớp đối tượng. Kể cả chương trình chính.
Code:
public class HelloWorld{
       ........
}
Trên là lớp ứng dụng HelloWorld, từ khóa class cho biết khai báo lớp, từ khóa static cho biết lớp này là lớp toàn cục, cho phép tất cả các lớp khác sử dụng nó. Lớp không phải là chương trình chính. Chương trình chính được cài đặt bên trong lớp, là một phương thức tĩnh:
Code:
 public static void main(String args[]){
  System.out.println("Hello World!");
 }
Trong java, phương thức tên main() này chính là điểm vào đầu tiên của chương trình. Khi bạn gọi java HelloWorld, trình thông dịch java sẽ nạp lớp HelloWorld vào bộ nhớ và tìm phương thức main() và thực thi nó. Các từ khóa: public: cho biết main() là phương thức chung có thể được triệu gọi từ môi trường bên ngoài. static: cho biết main() là phương thức tĩnh, nghĩa là phương thức có thể triệu gọi thông qua tên lớp mà không cần phải khởi tạo đối tượng của lớp. void: cho biết phương thức không trả về giá trị. String args[]: mảng chuỗi chứa các đối số truyền trên dòng lệnh khi bạn gọi chương trình Java. VD: bạn triệu gọi như sau: java HelloWorld abc def hehehe Thì lúc này mảng args[] sẽ chứa ba chuỗi: args[0] chứa chuỗi "abc" args[1] chứa chuỗi "def" args[2] chứa chuỗi "hehehe" System.out.println("Hello World!"); System là tên thư viện của hệ thống out là tên một đối tượng trong thư viện System println() là một phương thức của đối tượng out. Phương thức này in ra màn hình Console chuỗi Hello World!
Chương 4: Progamming Fundamentals
(những quy tắc lập trình cơ bản) Objectives At the end of the lesson, the student should be able to: ● Identify the basic parts of a Java program ● Differentiate among Java literals, primitive data types, variable types ,identifiers and operators ● Develop a simple valid Java program using the concepts learned in this chapter Mục tiêu: Sau bài học, bạn có thể: - Nhận biết được những phần cơ bản của 1 chương trình Java. - Phân biệt sự khau giữa các literals ?? Java, các kiểu dữ liệu cơ bản (nguyên thuỷ), các kiểu biến, các định danh và các toán tử. - Trình bày một chương trình Java đơn giản, hợp lệ sử dụng các khái niệm đã học trong chương này. Dissecting my First Java Program
Code:
1  public class Hello
2  {
3  /**
4  * My first Java program
5  */
6  public static void main( String[] args ){
7
8 //prints the string Hello world on screen
9  System.out.println(“Hello world”);
10
11      }
12  }
Phân tích chương trình Java đầu tiên của tôi. Dòng 1: Chỉ ra tên của lớp là Hello Trong Java, tất cả “code” được đặt bên trong 1 lớp (đã được) khai báo. The class uses an access specifier public, which indicates that our class in accessible to other classes from other packages (packages are a collection of classes). We will be covering packages and access specifiers later. Lớp sử dụng 1 truy xuất xác định là public, chỉ ra rằng lớp của chúng ta có thể được truy xuất từ các lớp khác của các gói khác (gói là 1 tập hợp của các lớp). Chúng ta sẽ tìm hiểu gói và truy xuất xác định sau. Dòng 2: Dấu “{“ bắt đầu 1 khối lệnh (ở đây là của lớp Hello). Dòng 3, 4, 5: Chú thích trên nhiều dòng (dùng cặp /*…..*/) để chương trình được rõ hơn. Khi biên dịch thì chương trình biên dịch sẽ bỏ quá các chú thích. Dòng 6: Chỉ ra tên của phương thức trong lớp Hello là phương thức chính (main) Phương thức chính (main) là điểm bắt đầu của 1 chương trình Java Mọi chương trình được viết bằng Java (trừ các Applet) được chạy (bắt đầu) với (bằng) phương thức chính main Dòng 8: Chú thích trên 1 dòng (dùng //) Dòng 9: Câu lệnh System.out.println(), in ra màn hình đoạn text được đặt trong “”,ở đây là: Hello World Dòng 11, 12: Đóng (kết thúc) phương thức chính và lớp Hello theo lần lượt. Coding Guidelines 1. Your Java programs should always end with the .java extension. 2. Filenames should match the name of your public class. So for example, if the name of your public class is Hello, you should save it in a file called Hello.java. 3. You should write comments in your code explaining what a certain class does, or what a certain method do. Hướng dẫn viết Code. 1. Chương trình Java của bạn phải luôn kết thúc với phần mở rộng là .java 2. Tên file phải trùng với tên của lớp. Ở đây, tên lớp là Hello do vậy phải lưu file là Hello.java 3. Nên viết những chú thích để chương trình được rõ hơn. Câu lệnh Java được viết trên 1 hoặc nhiều dòng và được kết thúc bằng dấu chấm phẩy ; Khối lệnh là 1 hoặc nhiều câu lệnh được đặt trong cặp { }, có thể được lồng vào nhau vô hạn. Java Identifiers ● Identifiers – are tokens that represent names of variables, methods, classes, etc. – Examples of identifiers are: Hello, main, System, out. ● Java identifiers are case-sensitive. – This means that the identifier Hello is not the same as hello. ● Identifiers must begin with either a letter, an underscore “_”, or a dollar sign “$”. Letters may be lower or upper case. Subsequent characters may use numbers 0 to 9. ● Identifiers cannot use Java keywords like class, public, void, etc. We will discuss more about Java keywords later. Các định danh Java - Định danh là những dấu hiệu cho biết tên của các biến, các phương thức, các lớp…, ví dụ: Hello, main, System.. - Định danh trong Java phân biệt chữ hoa thường. Suy ra : Hello # hello - Định danh phải được bắt đầu bằng chữ cái (hoa hoặc thường) hoặc dấu gạch dưới “_”, hay dấu đôla “$”. Các ký tự theo sau có thể là chữ số 0 đến 9. - Định danh không được sử dụng những từ khoá của Java, như: class, public, void, … Chúng ta sẽ thảo luận nhiều hơn về từ khoá Java sau. Java Identifiers Coding Guidelines 1. For names of classes, capitalize the first letter of the class name. For example: ThisIsAnExampleOfClassName 2. For names of methods and variables, the first letter of the word should start with a small letter. For example: thisIsAnExampleOfMethodName 3. In case of multi-word identifiers, use capital letters to indicate the start of the word except the first word. For example: charArray, fileNumber, className. 4. Avoid using underscores at the start of the identifier such as _read or _write. Hướng dẫn viết Code các định danh Java 1. Với tên của lớp, viết hoa các ký tự đầu tiên của tên lớp VD: ThisIsAnExampleOfClassName 2. Với tên của phương thức hay biến, ký tự đầu tiên nên viết chữ thường VD: thisIsAnExampleOfMethodName 3. Trong trường hợp định danh đa từ (đa nghĩa), viết hoa những ký tự chỉ rõ bắt đầu của từ trừ từ đầu tiên. VD: charArray, fileNumber, className 4. Tránh dùng dấu gạch dưới “_”để bắt đầu 1 định danh VD: _read, _write Java Keywords ● Keywords are predefined identifiers reserved by Java for a specific purpose. ● You cannot use keywords as names for your variables, classes, methods ... etc. ● The next slide contains the list of the Java Keywords. Từ khoá trong Java - Từ khoá là những định danh dành riêng đã được xác định trước bởi Java cho những mục đích cụ thể. - Bạn không thể sử dụng những từ khoá như tên của biến, lớp, phương thức … - Danh sách các từ khoá trong Java: 1. abstract : Dùng để thông báo 1 phương thức trừu tượng, cần có 1 phương thức con không trừu tượng lấp lên. Một phương thức trừu tượng sẽ không có phần mã lệnh (method body) mà chỉ có phần khai báo đặc tả. Các lớp kế thừa sẽ chịu trách nhiệm cài đặt phương thức abstract. 2. boolean : Kiểu biến logic, chỉ có hai giá trị đúng, sai (TRUE, FALSE). Chúng không tương tự C/C++ vì trong C/C++ giá trị thật của chúng được giữ ở số nguyên. 3. break : Từ khoá cho phép ngắt dòng lệnh để thoát ra khỏi vòng lặp. 4. byte: Kiểu biến số, có giá trị. 5. case: Nói lên một trường hợp khi phải lựa chọn. 6. catch: Sử dụng khi nhận về các kết quả lỗi. 7. char: Kiểu biến ký tự. 8. class: Lớp. 9. const: Thông báo biến đi kèm sau là hằng. 10. continue Dùng để nhảy tiếp đến một dòng lệnh lặp. 11. default Giá trị mặc định trong cấu trức lựa chon. 12. do Nằm trong câu lệnh vòng lặp do…while 13. double Kiểu số thực 14. elsse Nằm trong cặp lệnh điều khiển “Nếu thì If…else” 15. extends Dẫn xuất. 16. final Thông báo biến đi sau là hằng 17. finally Phương thức chấm dứt 18. float Kiểu số thực. 19. for Dùng để thực hiện một vòng lặp xác định. 20. goto Nhảy đến, thực hiện một lệnh di chuyển dòng lệnh. 21. if Nằm trong cặp lệnh điều khiển “Nếu thì If… else” 22. implements Cài đặt. 23. import Cho biết dùng các thư viện nào. 24. instanceof Dùng xác định kiểu đối tượng trong khi chương trình đang chạy (Runtime Type Identification). 25. int Kiểu biến nguyên 26. interface Giao diện, dùng để đặc tả giao thức giữa các đối tượng. 27. long Kiểu số nguyên 28. native Nguồn, gốc: Dùng để chỉ việc sử dụng các ngôn ngữ gắn với 1 hệ cụ thể. 29. new Dùng để tạo ra một đối tượng mới. 30. package Gói thư viện chứa các lớp. 31. private Báo cho biết biến khai báo tiếp theo sau là biến cục bộ. 32. protected Không bị chồng 33. public Báo cho biết biến khai báo tiếp theo sau là biến toàn cục. 34. return Trở về lệnh gọi. 35. short Kiểu biến số thực. 36. static Báo cho biết biến/phương thức khai báo tiếp theo sau là biến hoặc phương thức tĩnh. 37. super Đối tượng cha. 38. switch Dùng trong hệ tuỳ chọn. 39. synchronized Đồng bộ 40. this Đối tượng hiện đang xét. 41. throw Trả về lỗi. 42. throws Cho biết phương thức hay biến sẽ được trả về khi có lỗi (dùng trong khai báo phương thức). 43. transient Biến tạm. 44. try Thử làm để nhận lỗi về. 45. void Báo cho biết phương thức khai báo tiếp sau sẽ không có giá trị trả về. 46. while Dùng trong cặp câu lệnh vòng lặp. 47. byvalue ???? 48. threadsafe ???? 49. null ???? Ngoài ra có thể xem true và false là 2 từ khoá của Java Java Literals ● Literals are tokens that do not change - they are constant. ● The different types of literals in Java are: – Integer Literals – Floating-Point Literals – Boolean Literals – Character Literals – String Literals Các hằng Java - Hằng là thành phần (dấu hiệu) không thể thay đổi – chúng là hằng số. - Những loại hằng số trong Java: - Hằng kiểu nguyên. - Hằng dấu chấm động. - Hằng kiểu boolen (logic) - Hằng kí tự - Hằng kiểu chuỗi. Đoạn sau của Slide nói về: - Primitive data types( boolean, char, byte, short, int, long, float, double) - Variables (declare, initialize, output) (khởi tạo, đưa giá trị vào, giá trị ra) ● System.out.println() vs. System.out.print() ● Reference Variables vs. Primitive Variables ● Operators (Arithmetic operators, Increment and Decrement operators, Relational operators, Logical operators, Conditional Operator ( Operator Precedence) Mình nghĩ phần này cũng gần như các ngôn ngữ khác, các bạn tự đọc nha. Có gì khó hiểu thì post lên diễn đàn cùng thảo luận. Ở cuối chương này, Sang có đưa ra 1 bài tập (homework) như sau: • Compute the smallest number and display it (as you did compute and display greatest number) • If the smallest number is less than 10, display "The smallest number is less than 10!". Otherwise, display " The smallest number is greater than or equal to 10!". Question
Trích:
Mới học QT4, có 1 đoạn code sau, chưa rõ vấn đề lắm, post lên cho anh Freshboy, anh Tuantrangdream và anh em cùng giải đáp. class Tinhtong { int a = 10; int b = 20; public static void main(String args[]) { int c; c = a+b; System.out.println("Ket qua" + c); } } Hai cái dòng màu đỏ phải có chữ static thì mới thực thi được, còn ko có nó sẽ báo lỗi, vì sao vậy? . Xin giải thích kỹ chổ này giúp, cám ơn.
Trích:
class Tinhhieu { int a = 10; int b = 20; void hienthi() { int c; c = b-a; System.out.println("ket qua: " + c); } public static void main(String args[]) { Tinhhieu t = new Tinhhieu(); t.hienthi(); } } vì sao đoạn code ở trên ko sử dụng static ngay lúc khai báo biến a và b mà nó chạy được. Em cám ơn
ANSwer
Trích:
để có thể truy xuất trực tếp không thông qua object bạn chỉ việc khai báo biến a,b là public static, sau đó để có thể có thể lấy giá trị thì gọi trực tiếp thông qua class bằng cách gọi ClassName.property hoặc ClassName.method() , trong trường hợp này là Tinhtong.a hoặc Tinhtong.b Một thực thể (method hoặc biến) khi được chỉ định là static sẽ được khởi tạo một lần duy nhất khi class chứa thực thể đó được load vào JVM, khi một thực thể là static có nghĩa nó là thành phần "tĩnh" của class, nó là thuộc tính hoặc hành vi ở mức class (ko phải ở mức object), nó được khởi tạo một lần duy nhất và tồn tại ngay cả khi chưa hề có object nào được new trên class đó. Lý do hàm main phải là static vì JVM cần phải có được một gì đó bắt đầu khi application chạy trước cả khi object đầu tiên được khởi tạo, để có thể bắt đầu một chương trình trước cả khi object đầu tiên được khởi tạo JVM cần nắm được thứ gì đó đã tồn tại, đã được khởi tạo, đã được cấp phát vùng nhớ, và đã có thể chạy được, ... đó là hàm main. Vì thế hàm main phải là static. Việc ứng dụng static thì rất nhiều, bạn có thể sử dụng từ khóa static khi muốn có một thứ gì đó tồn tại duy nhất ở mức class, ko phụ thuộc vào object. Cụ thể một ví dụ là sử dụng static là Singleton pattern. Giả sử đến một lúc nào đó, bạn muốn có một object mà sẽ khởi tạo 1 lần duy nhất, tồn tại duy nhất tại bất kì đâu trong ứng dụng của bạn, khi bạn cần dùng tới nó bạn chỉ việc lấy nó ra (không muốn dùng đến từ khóa new, vì việc dùng từ khóa new để khởi tạo một 1 object mới cho cùng một chức năng là dư thừa và phí phạm tài nguyên). Bạn có thể làm như sau: Code: public class Test { private static Test objInstance = null; protected Test () { } public static synchronized Test Singleton() { if (Test .objInstance == null) { Test .objInstance = new Test (); } return Test .objInstance; } public void print () { System.out.println ("Đây là hàm dùng chung"); } } ví dụ đoạn code trên bạn có class Test có một hàm đơn giản là print(), bạn muốn sử dụng method print(), tại nhiều nơi trong ứng dụng của bạn nhưng lại không muốn mỗi lần như vây phải new một object mới (lãng phí tài nguyên). Bạn để ý thấy class Test chứa 1 property là private static với type là chính nó. Hàm contructor của class Test được overwrite thành protected. Do đó bạn sẽ không thể tạo ra đối tượng kiểu Test bằng cách viết new Test(). Hàm Singleton() là một hàm static, làm một việc duy nhất là kiểm tra objInstance có null hay không, nếu có thì tạo mới và return nó về. Khi sử dụng class Test bạn chỉ cần viết như thế này: Code: Test obj = Test.Singleton(); obj.print(); và bạn có thể yên tâm là đối tượng được trả về qua hàm Singleton() là duy nhất. ps: theo mình thì cái mà bạn còn chưa thông là cái từ khóa static, sử dụng nó thế nào, nó dùng vào việc gì, và tại sao phải tồn tại nó ?

Giới thiệu lập trình Java

JDK 6u1 The Java SE Development Kit (JDK) includes the Java Runtime Environment (JRE) and command-line development tools that are useful for developing applets and applications. Mình down bản jdk-6u1-windows-i586-p.exe . Cài đặt tại thư mục C:\Java\J2SDK .Trong thư mục bin (nằm trong thư mục J2SDK) có chứa file + javac.exe : Đây là trình biên dịch của java. Bạn muốn biên dịch HelloWorld.java thì cần phải gọi chương trình này ra. Như sau: C:\>Java\J2SDK\bin\javac.exe C:\Java\javafiles\HelloWorld.java + java.exe : trình thông dịch các chương trình java. VD: C:\> cd Java\javafiles C:\Java\javafiles>C:\Java\J2SDK\bin\java.exe HelloWorld Rõ ràng là chẳng ai muốn mỗi lần chạy java lại phải gõ đầy đủ đường đẫn đến thư mục chứa file chạy java. Vì vậy, nên cập nhật cái đường dẫn này vào PATH. Để đưa đường dẫn ( giả sử lấy đường dẫn "C:\Java\J2SDK\bin" như IPv6 dùng ) vào PATH ta chỉ cần khai báo nó trong file "Autoexec.bat" theo mẫu : SET PATH=C:\Java\J2SDK\bin Có cách làm điều này : Cách 1 : vào Run -> gõ "sysedit" -> Enter -> chọn cửa sổ "C:\Autoexec.bat" -> nhập đường dẫn vào theo mẫu trên Cách 2 : Mở Windows Explorer -> vào ổ C: -> cho hiện tất cả các file ẩn và các file hệ thống ( bằng cách vào Folder Option -> View tab ) , khi đó sẽ nhìn thấy file Autoexec.bat hiện lên trong ổ C:-> chỉ việc mở ra (bằng cách nhấp phải chuột -> edit ) mà nhập đường dẫn vào thôi. Cách 3 : Vào Control Panel -> System -> chọn tab Advance -> Environment Variables -> trong ô phía dưới tìm dòng bắt đầu bởi Path -> Edit -> trong ô Variable Value, đừng xoá, hãy thêm vào cuối dòng đó đường dẫn của ta với dấu ";" ở trước, cụ thể : " ;C:\Java\J2SDK\bin " Normally, TextPad will automatically add commands to compile and run Java applications and applets in the Tools menu in textpad. Otherwise: Add "Compile Java" and "Run Java Application" commands in your TextPad Here we talk about how to add these commands manually: 1. Choose Configure menu and click "Preferences..." command
2. Click "Tools" in left column, click "Add" in right column and choose "Program..." command
3. In "Select a File" dialog, find "javac.exe" program which you have installed with Java SDK software on your computer, and click "Open"
4. You will see a "javac" in the middle column, click it and rename it to "Compile Java".
5. Click "Apply", and expand "Tools" option in left column, you will see "Compile Java" option is there. 6. Click "Compile Java" option, and check the configuration. Make sure that "Parameters:" is $File and "Initial folder:" is $FileDir. Select Capture output and Sound alert when completed. Ignore other options/parameters. Click "Apply" if you make any changes.
7. Click "Tools" in left column again, click "Add" in right column and choose "Program..." command.
8. In "Select a File" dialog, find "java.exe" program which you have installed with Java SDK software on your computer, and click "Open"
9. You will see a "java" in the middle column, click it and rename it to "Run Java Application".
10. Click "Apply", and expand "Tools" option in left column, you will see "Run Java Application" option is there. 11. Click "Run Java Application" option, and check the configuration. Make sure that "Parameters:" is $BaseName and "Initial folder:" is $FileDir. Unselect all options.
12. Click "Apply" if you make any changes. Click "OK" to exit configuration. Then you will see two commands have been added to your Tools menu in TextPad.
13. Now "Compile Java" and "Run Java Application" have been added in your TextPad.