Nov
21
2010

Bài 4 – Biến và kiểu dữ liệu

(Bài học lên mạng ngày 21/11/2010) Nếu đã từng lập trình qua với Pascal/C/C++, bạn sẽ thấy thật thoải mái khi lập trình với PHP vì sự “dễ dãi” đến không ngờ của nó trong việc quản lý biến.

Biến & dữ liệu

Đúng như tên gọi, biến là một phần tử chứa các giá trị thay đổi (biến thiên). Để chỉ định một biến, bạn viết dấu $ rồi đến tên của biến.

Ví dụ:

<?php $a = 1; $a = ‘hello world’; $a = 23.45; $a = &$a; ?>

Bài tập 4.1:

  1. Có thể chỉ dùng chữ cái (a,b,c…) để đặt tên biến hay không?
  2. Có thể chỉ dùng chữ số (0,1,2,3…) để đặt tên biến hay không?
  3. Có thể dùng kết hợp chữ cái và chữ số để đặt tên biến hay không?
  4. Có thể dùng các ký tự + – * / để đặt tên biến hay không?
  5. Tên biến có phân biệt chữ hoa và chữ thường không? (Ví dụ, biến $abc với biến $Abc là khác nhau hay giống nhau)
  6. Tên biến có thể bắt đầu bằng một chữ số hay không? (Ví dụ $1abc, $2cdh, $3kkklm…)
  7. Tên biến có thể bắt đầu bằng dấu gạch dưới _ hay không? (Ví dụ $_1c, $_2c, $_3m…)
  8. Có được đặt 1 biến tên là $php hay không?
  9. Có được đặt 1 biến tên là $echo hay không?

Với tất cả các câu trả lời, phải có dẫn chứng chứng minh.

Biến trong PHP có thể mang một kiểu giá trị bất kì. Và PHP sẽ căn cứ vào giá trị sau cùng mà biến lưu giữ để “quyết định” xem biến đó cần có kiểu gì. Với ví dụ trên, biến $a sẽ có kiểu dữ liệu thay đổi sau mỗi lệnh gán dữ liệu, cụ thể như sau:

Các bạn có thể xem mã nguồn chi tiết trong file vidu-4-1.txt

(Tôi vừa “sực nhớ” ra một tiện ích khá thú vị của cửa sổ lệnh MS DOS. Đó là khi bạn gõ đường dẫn trong cửa sổ này, bạn chỉ cần gõ một vài chữ đầu tiên, sau đó nhấn phím TAB, thì nó sẽ tự điền đường dẫn tiếp theo cho bạn, thay vì phải gõ đầy đủ từ đầu đến cuối. Ví dụ tôi chỉ cần gõ php m rồi nhấn phím tab, thì nó sẽ tự điền cho tôi là php manguon, sau đó tôi gõ tiếp \vi và nhấn phím tab thì nó sẽ tự điền vô thành php manguon\vidu-4-1.txt)

Một số chú ý khi xem ví dụ 4-1:

  • Lệnh echo được sử dụng để hiển thị dữ liệu ra màn hình
  • Dấu , được sử dụng để hiển thị nhiều kiểu dữ liệu khác nhau
  • Dấu nháy đơn ‘ được sử dụng để bao chuỗi nhằm tăng tốc chương trình
  • Hàm var_dump($a) được sử dụng để hiển thị kiểu và giá trị của biến $a
  • Hàm rand() được sử dụng để tạo ra một giá trị ngẫu nhiên
  • int(1) nghĩa là dữ liệu kiểu nguyên (int là viết tắt chữ integer – số nguyên) và có giá trị là 1
  • string(11) nghĩa là dữ liệu kiểu chuỗi ký tự, tuy nhiên, con số trong ngoặc đơn lúc này là biểu thị độ dài của chuỗi (11 ký tự), thay vì giá trị của biến.
  • float(23.45) nghĩa là dữ liệu kiểu số thực và có giá trị là 23.45 (hai mươi ba phết bốn mươi lăm / hai mươi ba phẩy bốn mươi lăm)

Nhìn vào kết quả chạy chương trình ví dụ, bạn sẽ thấy ngay, khi gán cho biến $a một số nguyên thì $a mang kiểu dữ liệu int, khi gán cho $a một số thực thì $a mang kiểu dữ liệu float, khi gán cho $a một chuỗi thì $a mang kiểu dữ liệu string.

Bài tập 4.2:

Với quy ước rằng int đại diện cho một biến có kiểu int, float đại diện cho biến có kiểu float và string đại diện cho biến có kiểu string, hãy cho biết:

  1. int + int tạo ra dữ liệu kiểu gì?
  2. int + float tạo ra dữ liệu kiểu gì?
  3. float + int tạo ra dữ liệu kiểu gì?
  4. int + string tạo ra dữ liệu kiểu gì?
  5. string + float tạo ra dữ liệu kiểu gì?
  6. Int . int tạo ra dữ liệu kiểu gì? (dấu . được sử dụng khi các bạn dùng nối chuỗi ở ví dụ của lý thuyết bài 3)
  7. Float . float tạo ra dữ liệu kiểu gì?
  8. String . float tạo ra dữ liệu kiểu gì?
  9. Int + float . string tạo ra dữ liệu kiểu gì?
  10. int * int tạo ra dữ liệu kiểu gì?
  11. int / float tạo ra dữ liệu kiểu gì?
  12. float / int tạo ra dữ liệu kiểu gì?
  13. int / string tạo ra dữ liệu kiểu gì?
  14. string * float tạo ra dữ liệu kiểu gì?
  15. Int / int tạo ra dữ liệu kiểu gì? (dấu . được sử dụng khi các bạn dùng nối chuỗi ở ví dụ của lý thuyết bài 3)
  16. Float / float tạo ra dữ liệu kiểu gì?
  17. float * string tạo ra dữ liệu kiểu gì?
  18. Int / float + string tạo ra dữ liệu kiểu gì?
  19. Int % float tạo ra dữ liệu kiểu gì? (dấu % được dùng để lấy phần dư trong một phép chia. Ví dụ 10/2 được 5 dư 0 nên 10%2=0; 10/3=3 dư 1 nên 10%3=1)
  20. int % int tạo ra dữ liệu kiểu gì?

Với tất cả các câu trả lời, phải có dẫn chứng chứng minh.

Bài tập 4.3: Chuyển từ kiểu nguyên về kiểu chuỗi

Sử dụng các phép toán + – * / % . (nối chuỗi), thêm vào mã lập trình ở chỗ bôi vàng để có được kết quả như hình minh hoạ.

Bài tập 4.4: Chuyển từ kiểu chuỗi về kiểu nguyên

Sử dụng các phép toán + – * / % . (nối chuỗi), thêm vào mã lập trình ở chỗ bôi vàng để có được kết quả như hình minh hoạ.

Bài tập 4.5: Chuyển từ kiểu nguyên về kiểu thực

Sử dụng các phép toán + – * / % . (nối chuỗi), thêm vào mã lập trình ở chỗ bôi vàng để có được kết quả như hình minh hoạ.

Bài tập 4.6:

  1. Dữ liệu kiểu chuỗi trong PHP có độ dài tối đa bao nhiêu ký tự? Giải thích.
  2. Dữ liệu kiểu số nguyên trong PHP có thể lớn đến bao nhiêu? Giải thích.
  3. Dữ liệu kiểu số thực trong PHP có thể lớn đến bao nhiêu? Giải thích.

Chú ý: không được đi “search” thông tin rồi điền vô, mà các bạn phải tự tìm cách “thực nghiệm” và đưa ra kết luận. Kể cả là kết luận dự đoán tôi cũng chấp nhận.

“Ép” kiểu

Qua các bài tập 4.3, 4.4, 4.5 các bạn có thể tự rút ra kết luận về một số cách thức chuyển đổi qua lại các kiểu dữ liệu khác nhau. Tuy nhiên, sẽ rất khó khăn để chuyển từ kiểu dữ liệu số thực về ngược lại kiểu dữ liệu số nguyên chỉ với các phép toán + – * / % và .

Trong thực tế, PHP cung cấp cho chúng ta một cách thức để chuyển kiểu dữ liệu nhanh gọn hơn, đó là “ép” kiểu. Để ép một kiểu dữ liệu bất kỳ về kiểu nguyên, bạn chỉ cần thêm toán tử (int) vào trước giá trị của nó.

Ví dụ:

Tương tự (float) dùng để ép kiểu về giá trị số thực và (string) để ép kiểu về giá trị chuỗi ký tự:

Hoặc như các bạn đã biết từ các bài tập trước, có thể dùng dấu nháy kép “ để ép kiểu của biến về string một cách đơn giản thế này:

<?php $a=12.34; $b = “$a”; var_dump($b); ?>

Nói thêm về dữ liệu kiểu chuỗi

String là kiểu dữ liệu mà bạn cần quan tâm nhiều hơn các kiểu khác, vì “mai mốt” bạn sẽ phải giải quyết nhiều vấn đề với chuỗi hơn bất cứ kiểu dữ liệu nào khác (trừ khi bạn là một chuyên gia toán hay vật lý học J).

Để tạo ra một giá trị kiểu string, chúng ta có thể dùng nháy đơn, nháy kép hoặc ép kiểu bằng cú pháp (string)…

<?php $s1 = ‘123456’; $s2 = “123456”; $s3 = (string)123456; ?>

Sử dụng dấu ‘ luôn giúp bạn tăng tốc chương trình so với việc dùng “, vì PHP “đối xử” với các giá trị đặt trong “ theo một cách riêng. PHP sẽ truy tìm xem trong chuỗi đó có dấu \ hay không, nếu có, nó sẽ diễn dịch dấu \ và ký tự theo sau thành những nội dung đặc biệt:

Cặp ký tự Ứng xử của PHP Ghi chú
\n Biến \n thành ký tự điều khiển “xuống dòng” Tương tự như việc bạn gõ phím Enter
\t Biến \t thành ký tự điều khiển “nhảy tab” Tương tự như việc bạn gõ phím Tab
\’ \’ sẽ được giữ nguyên là \’ Nếu bạn bao chuỗi bằng dấu nháy đơn ‘ thì cặp ký tự \’ trong đó sẽ được biến thành một dấu nháy đơn ‘ . Còn khi bao chuỗi bằng nháy kép, nó sẽ GIỮ NGUYÊN GIÁ TRỊ
\” Biến \” thành ký tự nháy kép ” Đây là cách để bạn đưa một ký tự nháy kép vào chuỗi được bao bằng nháy kép
\$ Biến \$ thành ký tự $ Thông thường, $a đặt ở trong nháy kép sẽ được PHP diễn dịch thành giá trị của biến a. Nhưng khi bạn viết \$a thì chữ $a sẽ được ghi ra màn hình thay vì giá trị của biến a
\\ Biến \\ thành ký tự \ Do ký tự \ được PHP dò tìm như một ký tự điều khiển đặc biệt, nên khi muốn viết nó ra màn hình, bạn phải ghi là \\ . Cách làm này có tác dụng cả khi đặt chuỗi trong nháy kép cũng như nháy đơn

Bài tập 4.7: Hãy dùng lệnh echo để viết ra màn hình các dòng chữ sau đây

Xin chao, toi la Long “/\/\e`o /\/\un”

Toi co rat nhieu $… am phu :D

Nen /\/guoi ta goi toi la Ty Phu Khong /\/ha`

Chú ý :

1) Chữ M trong « Meo Mun » và chữ N trong « Nguoi ta », « Khong Nha » được ghép bởi các ký tự gạch chéo /\/\ . Dấu huyền trong chữ Mèo Mun và chữ Nhà là dấu ` nằm chung với dấu ~, phía dưới nút Esc trên bàn phím.

2) Các bạn phải ĐỌC THẬT KỸ đề bài. Bài này có đố mẹo!

Bài tập 4.8 : Hãy dùng lệnh echo viết ra màn hình nội dung sau đây (bài này làm bình thường, không đố mẹo gì hết :D Mục đích để giúp các bạn làm quen với việc xử lý các ký tự đặc biệt như «  ‘ \ $ khi lập trình thôi)

<?php

echo ‘this is a simple string’;

echo ‘You can also have embedded newlines in

strings this way as it is

okay to do’;

// Outputs: Arnold once said: “I’ll be back”

echo ‘Arnold once said: “I\’ll be back”‘;

// Outputs: You deleted C:\*.*?

echo ‘You deleted C:\\*.*?’;

// Outputs: You deleted C:\*.*?

echo ‘You deleted C:\*.*?’;

// Outputs: This will not expand: \n a newline

echo ‘This will not expand: \n a newline’;

// Outputs: Variables do not $expand $either

echo ‘Variables do not $expand $either’;

?>

Các bạn nộp bài trước 12h trưa thứ 3, ngày 23/11/2010 nhé. Chúc các bạn học tốt.

About the Author:

27 Comments + Add Comment

  • mình chưa hiểu ví dụ này:

    Khi ta đã gán $a = 1
    sau đó gán tiếp $a = ‘hello world’
    rồi lại gán tiếp $a = 23.45
    trình biên dịch sẽ dịch từ trên xuống dưới và lấy giá trị cuối cùng của $a là 23.45.
    Vậy lệnh ép tham chiếu $a = &$a sẽ có tác dụng gì?
    Vậy có phải ví dụ này là chỉ ra rằng trong php chúng ta o cần phải khai báo kiểu dữ liệu của biến và có thể thay đổi kiểu dữ liệu của biến 1 cách thaoi3 mái hay o?

    Mong anh Mum trả lời.Xin cảm ơn.

    • Qua ví dụ này, MMun muốn nói rằng biến trong PHP là không (cố) định kiểu, ví dụ từ đầu gán $a = 1 thì $a mang kiểu nguyên, nhưng sau đó vẫn gán một giá trị kiểu chuỗi vào cho nó v.v…

      Trong khi đó, các ngôn ngữ như Pascal/C/C++/Java thì biến $a là kiểu nguyên thì không thể gán giá trị kiểu chuỗi vô (Pascal thì MMun chắc chắn, còn các ngôn ngữ kia thì MMun mới hỏi bà chị, bả nói vậy à, còn MMun không học nên cũng không chắc lắm :D )

      • Pascal/C/C++ đều thế, đã khai báo kiểu dữ liệu thì không được phép gán kiểu khác. Jave thì ko biết :D

        $a = &$a ko phải là ép tham chiếu. “&” chỉ ra là word kế tiếp sẽ là Biến chứ ko phải là giá trị.

        • Là sao ạ, mình ko hiểu lắm

          • Mình trả lời bạn trên, quote lộn :D

        • Theo mình biết,Pascal/C/C++ /Jave đều buộc khai báo tên biến và kiểu dữ liệu trước khi sử dụng .

          $a = &$a ko phải là ép tham chiếu. “&” chỉ ra là word kế tiếp sẽ là Biến chứ ko phải là giá trị.—–> cái này mình không đồng tình với bạn vì theo mình biết cú pháp của PHP xây dựng trên nền C.Nên dấu & trước tên biến dùng để truyền 1 biến theo kiểu tham chiếu.Tức là giá trị của biến đó sẽ thay đổi sau khi hàm trả về.

          Mình xin đưa ra ví dụ sau trên C++ :

          int vd(int &n)
          {
          n=n+10;
          return n;
          }

          • Mình tưởng bạn bắt đầu học lập trình nên nói nôm na cho dễ hiểu đâu biết bạn cũng là dân lập trình :D

            sau & để chỉ ra đó là biến thì có nghĩa là truyền biến tham chiếu cho biến trc đó còn gì :D

          • PHP có tham chiếu mà :D

  • biến trong php nó hàm ý là kiểu tự do. Không phân biệt rõ ràng đó là kiểu gì nó chỉ rõ ràng khi bạn settype cho nó hoặc ép kiểu của nó. Trong c++/java biến tự do không thuộc kiểu nào thì là void. C++/java khi khai báo biến phải cho biết biến đó thuộc kiểu gì không được khai như php.
    Để tránh phiền phức về kiểu trong php khi so sánh 2 kiểu giống nhau thì nên ép nó về cùng 1 kiểu để so sánh cho chính xác.
    Dấu & trong biến thể hiện tham chiếu
    ////////////////
    $a=7;
    $a=&$b;
    $b=8;
    echo $a; ==> in ra 8
    ////nếu không có dấu &
    $a=7;
    $a=$b;
    $b=8;
    echo $a; ===>in ra 7

  • Ví dụ trên nhằm
    Nếu có &
    $a=7;
    $b=8;
    $a=&$b;
    $a=9;
    echo $b;==>in ra 9
    Nếu không có &
    $a=7;
    $b=8;
    $a=$b;
    $a=9;
    echo $b;==>in ra 8
    Nghĩa là khi có dấu & vào thì biến $a thay đổi thì $b sẽ bị thay đổi theo.
    mỗi 1 biến sẽ có 1 địa chỉ và địa chỉ này trỏ đến biến
    ví dụ: $a=7; thì sẽ phát sinh 1 địa chỉ có tên là ababbc(gì đó chẳng biết) nhưng cái địa chỉ này trỏ đến số 7. Nếu khai báo $a=&$b thì bạn báo rằng thằng b có đại chỉ là ababbc. Do đó nếu mà ababbc trỏ đến giá trị nào thì thằng b sẽ có giá trị đó
    Ai học C sẽ biết việc phức tạp của địa chỉ con trỏ .
    Nói chung dễ hiểu nhất là khi muốn thay đổi giá trị biến trong hàm thì phải dùng &. Để hiểu rõ hơn bài này thì chắc các bạn phải chờ Mèo giới thiệu đến biến toàn cục và biến cục bộ mới hiểu thấu vấn đề này

  • Các bạn đang học các vấn đề cơ bản thôi mà.
    Sao lại lôi con trỏ vào đây. Các bạn làm thế chỉ khiến cho người mới học lập trình thêm hoang mang.

  • Thôi kệ để các ban ý tranh luận với nhau cho vui, người học, nhất là học online thì có thể học từ nhiều nguồn và cần biết tiếp thu có chọn lọc :D

  • Nếu anh Mun nói vậy thì nhào vô cho xôm tụ nào =))
    “Nghĩa là khi có dấu & vào thì biến $a thay đổi thì $b sẽ bị thay đổi theo.”
    $a=7;
    $b=8;
    $a=&$b;
    $a=9;
    echo $b;==>in ra 9
    => ko sai
    thế bạn Dũng đã thử cái này chưa ?
    $a=7;
    $b=8;
    $a=9;
    $a=&$b;
    echo $b;
    mình học con trỏ bên C được cho biết chỉ là học để biết, vì tính bảo mật không cao. Nnlt java cũng loại bỏ con trỏ. Còn học để chọc ngoáy thứ gì đó thì tùy mọi người :-”

    • $a=7;
      $b=8;
      $a=9;
      $a=&$b;
      echo $b;
      bạn thấy rằng trước khi gán $a=&$b; thì $a thay đổi nghĩa là trước đó $b không có liên quan gì đến $a. Sau đó $b mới được tham chiếu và chỉ mới tham chiếu thôi chứ nó chưa nhận diện được sự thay đổi.
      Con trỏ rất phức tạp mình cũng đã nói rồi. Trong php không đặt năng vấn đề con trỏ nhưng phải biết sử dụng & để còn làm 1 số việc cần thiết
      Con trỏ không phải bảo mật kém mà nó rất trù tượng và khó hiểu sử dụng nó khá rắc rối do đó những ngôn ngữ sau này đã hạn chế đụng đến nó

    • ngôn ngữ Java và PHP o hoàn toàn loại bỏ con trỏ vì theo mình được biết,dấu & cũng là 1 dạng con trỏ ,trỏ tới vùng nhớ chứa giá trị của biến!

  • cái trên là tham chiếu, còn tham trị trong php thì sao hả bạn.
    Mà con trỏ nó trỏ tới vùng lưu trữ bộ nhớ của biến, vậy đó không phải vấn đề bảo mật hả ?

  • Con trỏ làm sao bỏ được ạ, cùng lắm thì nó được “che chắn” đi khiến cho lập trình viên không cần/không phải “nhìn thấy” và quản lý thôi. Ví dụ ngay như kiểu string trong PHP bản chất là mảng ký tự động, khi này trình thông dịch phải dùng con trỏ để quản lý nhưng coder thì không cần biết về điều đó.

    • đúng rồi, bên C khi scanf một giá trị có một đoạn là &var_name, nó cũng thuộc về con trỏ. Em được cô dạy là con trỏ bên C có tính bảo mật không cao và chỉ được dạy lý thuyết, nhưng em vẫn tò mò muốn biết, ngoài cấp phát bộ nhớ, gán giá trị gián tiếp, tham chiếu, tham trị, thì còn chức năng nào khác. Em không nghĩ là con trỏ chỉ có nhiu đó chức năng.

      • Theo anh thì nếu không có con trỏ sẽ không có bất cứ cái gì liên quan đến ngành máy tính. Con trỏ cũng quan trọng và không thể thiếu như + – * / vậy. Nhưng vẫn nhắc lại rằng nó đã được/bị “ẩn” đi. Giống như em nấu cơm thì ra siêu thị mua gạo về vo và nấu; muốn làm bánh thì lấy gạo đó xay ra thành bột rồi nhào nặn chứ không cần biết đến việc tồn tại trên đời một cái gọi là hạt thóc vậy à :D

        Anh thì không rành nhiều về thuật toán, nhưng nếu anh nhớ không lầm thì các bài toán về tìm đường đi ngắn nhất (nền tảng để phát triển các tiện ích như trên diadiem.com hay Google MAP) đều dùng giải thuật liên quan đến con trỏ á.

        • Mình xin giải thích rõ hơn về tham chiếu và tham trị như sau:

          int vd_thamchieu(int &n)
          {
          n=n+10;
          return n;
          }

          với hàm vd_thamchieu trên,bạn gọi nó và truyền giá trị n=5 như sau:

          int a=vd_thamchieu(5) ;

          vậy giá trị của a=15.

          ngược lại với ví dụ tham trị sau:

          int vd_thamtri(int n)
          {
          n=n+10;
          return n;
          }

          với hàm vd_thamchieu trên,bạn gọi nó và truyền giá trị n=5 như sau:

          int a=vd_thamtri(5) ;

          vậy giá trị của a=5.

          Ngoài ra,như anh MMun nói, trong PHP và cả Java đều o trực tiếp sử dụng con trỏ.Tuy nhiên,việc quản lý bộ nhớ,các kiểu dữ liệu như linklist,stak…ngầm định của trình biên dịch buộc phải sử dụng con trỏ.

          Và thuật toán tìm đường đi ngắn nhất có tên là Dijkstra .Trên PHP thì mình o biết nhưng trên C/C++ nhất thiết phải dùng con trỏ với kiểu dữ liệu Queue để giải quyết.

          /*Queue có thể cài đặt bằng mảng mà mình thì chưa làm nên o biết có giải quyết Dijkstra được o,nên thôi cứ phán bừa!
          */

          • cả 2 kết quả của bạn đều ra 15 cả
            Còn đây là code nêu rõ sự khác nhau của tham trị và tham chiếu trong C :
            #include
            int thamtri (int n)
            { return ++n; }

            int thamchieu (int *n)
            { return ++*n; }

            void main ()
            {
            int a = 10;
            int b = thamtri (a);
            int c = 10;
            int d = thamchieu (&c);
            printf (“Phan tham tri : a:%d b:%d \nPhan tham chieu : c:%d d:%d”,a,b,c,d);
            }

  • ái chà C từa lưa vậy ta. Đây là php mà ta mcmxc bạn đã hiểu sai tác dụng dấu & rồi . Khi nào Mèo giới thiệu đến bài về các biến toàn cục hay cục bộ gì đó chắc lúc đó sẽ comment rõ hơn cho bạn dùng & như thế nào. Giờ mà nói thì loạn xà ngầu lên. 1 số thuật toán tìm đường đi ngắn nhất, ghét đôi, cây nhị phân tìm kiếm gì gì đó bạn có thể tìm hiểu vài cuốn toán rời rạc nâng cao của KHTN. Đọc đi tư duy của bạn sẽ nâng cấp 1 bậc nhưng cảnh báo trước trình độ phải là sinh viên năm 2 trở lên hãy đọc vì dưới nửa thì khó mà tiếp thu

    • Có vẻ a T.Dũng học từ khá lâu rồi.Bây h người ta gọi môn đó là Lý Thuyết Đồ Thị.
      Cái tên toán rời rạc nâng cao chắc ít nhất 5 năm rồi người ta o dùng tới!

      Riêng về tác dụng dấu & ,sau khi tham khảo nhiều nguồn thì em vẫn xin giữ quan điểm của em.
      Mong rằng tới bài Tầm vực của biến chúng ta sẽ hiểu dấu & một cách chính xác và đầy đủ nhất.

      Xin cảm ơn tất cả mọi người!

  • Mấy hôm nay bận quá, chắc mai mới đọc bài này được :)

  • Từa lưa hết rồi :D

  • Anh Mèo ơi, em và mấy người bạn thấy anh ra nhiều bài tập quá, mà ra nhiều bài tập nhìn cũng nản nản anh àh :)
    Anh xem xét việc giảm lượng bài tập tí nhé ;)

    • Lười làm bài thì không giỏi được đâu em ạ.

      Học ở đây có bắt ép làm bài đâu, bọn em thấy nhiều quá không làm được thì cứ làm ít. Anh comment dựa trên lời giải của bọn em mà :D

Leave a comment