Nov
27
2010

Thảo luận về bài tập 4 (tiếp theo)

Tôi rất vui vì các bài gửi về cho bài 4 có chất lượng khá đồng đều. Các bạn làm bài tốt :)

Từ nay, khi gửi bài, các bạn chú ý thực hiện như sau nhé:

1) Nén tất cả các folder / file liên quan đến bài giải của bạn (doc, php, txt, png, jpg…) vào một file duy nhất, đặt tên là HoVaTen_TenBaiTap.zip, ví dụ NguyenNgocLong_Bai4.zip là lời giải cho bài tập số 4 của bạn tên Nguyễn Ngọc Long; NguyenVoCaoMinh_Bai3.zip là lời giải cho bài tập số 3 của bạn tên Nguyễn Võ Cao Minh.

2) Khi gửi email nộp bài, các bạn ghi vô trong phần nội dung email cho tôi biết tên bạn là gì (vì có một số bạn tôi có thể “đoán” được tên thông qua địa chỉ email, nhưng một số bạn khác thì không).

Tôi sẽ thiết lập chế độ chuyển email tự động upload bài giải (các file zip) của cả lớp vô một thư mục công cộng trên trang http://box.net. Sau này, khi đọc phần nội dung comment của tôi cho bài giải của cả lớp, các bạn thấy bài của ai có chi tiết thú vị thì có thể truy cập vô thư mục chia sẻ trên box.net tải về phần lời giải đầy đủ của người đó (theo họ và tên) để tiện tham khảo.

hong tien nguyen <nguyentien8x

Bài 4.1 như anh đã comment ở bài làm mẫu, em có thể thử với nhiều trường hợp hơn trước khi đưa ra kết luận để kết luận của mình có nhiều “sức nặng” hơn. Nội dung bài làm của em làm rất tốt, cách trình bày cũng pro nữa J

Bài 4.2 làm rất tốt, sử dụng các giá trị đặc biệt của chuỗi để rút ra kết luận.

Bài 4.3, Bài 4.4 làm tốt, tối ưu.

Bài 4.5 sử dụng những kiến thức “cao siêu” chưa học tới nên anh không comment vì các bạn khác đọc vô không hiểu.

Bài 4.6 em đọc lại comment trong bài giải mẫu. Anh không chủ ý yêu cầu các bạn phải tìm ra những con số thực tế mà chỉ muốn hướng dẫn mọi người cách tìm tòi thông tin và phán đoán kết quả thôi. Với những dự án web thông thường, việc nắm thông tin về độ lớn chuẩn của các dữ liệu cũng không quan trọng.

Với kiến thức chung mà cả lớp đang học, phần trình bày và phân tích của em có thể khiến nhiều bạn không hiểu, nhưng anh đánh giá cao bài giải của em.

Bài 4.7 em nên tránh sử dụng dấu “ bất cứ khi nào có thể.

Bài 4.8 có kết quả chính xác rồi.

Kết luận: Bài làm rất tốt, hãy tiếp tục phát huy. Các bạn khác có thể tham khảo bài giải của bạn Tiến tại đây http://www.box.net/shared/pac9h9lfvo

Việt <vietdh

Bài 4.1-1 Việt gán giá trị cho $a, sau đó echo “$a” ra màn hình. Theo tôi thì nếu chỉ định cho hiển thị giá trị của biến, Việt chỉ cần ghi echo $a là đủ. Cặp dấu nháy kép “ là không cần thiết và làm chương trình chạy chậm hơn.

Bài 4.1-8 hỏi về việc có được đặt tên biến là $php hay không; bạn Việt trả lời: Có (Lúc đầu thì em nghĩ là ko, nhưng qua thực nghiệm thì là có. Và em thực sự bất ngờ về điều này). Và tôi cũng mừng là qua thực nghiệm bạn đã tự rút ra được kết luận, mà kết luận đó khác với điều mà trước đây bạn “nghĩ là”.

Hết bài 4.1, bạn Việt rút ra kết luận:

Qua đây ta thấy:

-Có thể dùng ký tự, chữ số và dấu gạch dưới để đặt tên nhưng ký tự đầu tiên phải là ký tự hoặc dấu gạch dưới

-Không thể dùng các ký tự đặc biệt để đặt tên biến

Tôi rất hoan nghênh Việt. Vì, như mọi người cũng biết, không phải tự nhiên tôi đặt ra bài tập. Thông qua mỗi bài, tôi đều muốn gửi gắm đến các bạn một vấn đề nào đó. Vì vậy, việc rút ra kết luận thay vì chỉ giải bài một cách bình thường sẽ có lợi cho các bạn nhiều hơn :)

Tôi lấy ví dụ, thay vì trong phần lý thuyết tôi nói rằng “Biến trong PHP là blah blah… Quy tắc đặt tên biến là Blah Blah…” (như cách mà các bạn được học ở trong trường) tôi sẽ đặt ra thành các bài tập nhỏ, và tôi hy vọng thông qua việc làm bài, các bạn sẽ tự rút ra được kết luận và sẽ ghi nhớ kiến thức mà không cần học thuộc làu làu. Giả sử một lúc nào đó bạn quên, thì bạn cũng biết cách làm sao để “nhớ lại” kiến thức đó (thông qua thực nghiệm).

Bài 4.2 khi nói về việc $int + $string tạo ra dữ liệu kiểu gì, bạn Việt đã phân tích rất kỹ và kết luận đúng:

-khi lấy int+ string thì string sẽ được tự động ép kiểu về kiểu int hoặc float tùy theo ký tự trong string ( vd nếu string bắt đầu là ‘1’ thì được ép kiểu về int, nếu string bắt đầu là ‘1.5’ thì được ép kiểu về float. Đặc biệt nếu string bắt đầu bằng ký tư thì được ép kiểu về int và có giá trị 0). Sau khi tự động ép kiểu xong thì phép + được thực hiện bình thường. Và kết quả có thể là int hoặc float.

Các phần sau bạn đều có phân tích kỹ và chính xác.

Các bài còn lại làm tốt. Riêng bài 4.7, bạn chú ý dùng dấu nháy đơn.

Kết luận: Bài làm rất tốt, hãy tiếp tục phát huy. Các bạn khác có thể tham khảo bài giải của bạn Việt tại đây http://www.box.net/shared/ul5f5l4422

Hung Trinh <hungmt

Bạn dùng notepad++ để code nên nhìn các ảnh chụp màn hình đẹp quá J

Bài 1.8 bạn kết luận có thể dùng $php và $echo để đặt tên biến nhưng search Google thấy bảo không nên dùng. Tại sao thế? Nhờ bạn share thêm thông tin cho cả lớp cùng biết?

Bài 4.5 yêu cầu chuyển từ kiểu nguyên về kiểu thực bạn viết $a + 00.00 làm tôi thấy thú vị quá, vì không hiểu sao bạn lại ghi 00.00 mà không phải là 0.00 J Mà thực sự tôi cũng thấy bất ngờ là PHP không báo lỗi. Bạn giải thích tại sao lại viết 00.00 nhé?

Kết luận: Bài làm rất tốt, đẹp đẽ chỉn chu :) Bạn hãy tiếp tục phát huy và làm sớm hơn được thì càng tốt, hihi. Các bạn khác có thể tham khảo bài giải của bạn Trịnh Mạnh Hùng tại đây http://www.box.net/shared/pobnep6u4a

Nguyễn Trung Hiếu trunghieu.nth@

Đọc bài giải đầu tiên của bạn làm tôi giật mình và thấy thật là… có lỗi 😀 Bạn ghi thế này:

Chỉ dùng các chữ cái (a,b,c,…) thì không thể đặt tên cho biến được vì trong php quy định trước biến phải có 1 kí tự $;

Tôi giật mình vì bạn trả lời đúng quá J Tôi xin lỗi vì cách đặt đề bài đã không thật chính xác làm cho bạn hiểu sai ý. Tuy nhiên, các kết luận của bạn trong bài thì đã đúng rồi. Trong bài giải, tôi không thấy bạn có code chứng minh nhưng tôi đoán bạn có chạy code ở bên ngoài.

le dinh <namzero2000

Bạn Lê Đình Nam có một cách phân tích và suy nghĩ khá đơn giản nhưng hiệu quả. Bài tập yêu cầu tìm độ lớn cực đại của kiểu giá trị bạn làm rất tốt. Các bài còn lại cũng làm đúng. Tôi nghĩ bài của bạn Nam là một bài mà các bạn khác rất rất nên tham khảo: http://www.box.net/shared/8bdhtnlyf4

Hanh Nguyen <hanhnth612

Tôi không thấy bài 4.6 của bạn Hạnh đâu cả, và cũng không thấy ý kiến ý cò gì là làm được hay không làm được hay thế nào, làm tôi bối rối quá 😀 Ngoại trừ 4.6, các bài còn lại bạn làm rất tốt và chi tiết. Khá hơn hẳn các bài tập trước. Bạn Hạnh cố lên ạ.

Nguyễn Quang Phước <babymilu.net

Bạn Phước thân mến, bài 4.8 bạn dùng quá nhiều lệnh echo, rồi lại dùng dấu nháy kép “ thay vì dấu nháy đơn ‘ , như thế chương trình sẽ tốn nhiều thời gian hơn một cách không cần thiết. Các bài khác bạn làm tốt ạ.

TDC2007 <tommy42033

Bạn Trịnh Duy Cường làm khó tôi khi viết trong email một cách rất tha thiết rằng muốn được comment. Tôi đã cam kết sẽ comment cho tất cả các bạn thì tôi sẽ làm như thế, nhưng xin nhắc lại rằng việc cứ comment đi comment lại cho một ý sai/đúng giống nhau trong bài làm của các bạn là không cần thiết. Nên càng những bài đầu tôi càng comment chi tiết, càng những bài sau tôi càng comment ít đi, do các nội dung cần nói thì đã nói rồi, các bạn đọc và tự rút ra kết luận thôi ạ.

Tuy nhiên, bài của bạn Duy Cường thì rất cần thiết phải comment vì có nhiều điều thú vị.

Thứ nhất, là bạn sử dụng echo một cách hơi đặc biệt:

<?php echo $abc=5,$Abc=10 ;?> hiển thị ra màn hình : 510

Thay vì gán giá trị cho biết $abc=5; rồi sau đó ghi giá trị của biến ra màn hình echo $abc; thì bạn đã gộp lại với nhau.

Thứ hai, bạn rút ra kết luận như sau:

Qua câu này em cũng thí nghiệm ra 2 điều sau:

Code : <?…..$abc=1,$abc=2..?> hiển thị màn hình: 12 ( chứng tỏ php đọc đến hết đoạn code này và PHP xem như biến được “đọc đến đâu ghi ra đến đó” chỉ cần không sai về mặt cú pháp và câu lệnh )

Code : <?…$abc=50,$abc=10,$abc+$abc…?> hiển thị màn hình là : 501020 ( ở đây php đọc đến hàm $abc+$abc = 20 tức php luôn lấy giá trị biến $abc sau cùng của 1 dòng lệnh echo để thực hiện biểu thức trên.

Tôi có cảm giác bạn hiểu đúng nhưng diễn đạt hơi khó hiểu. Tôi đề nghị tất cả các bạn cùng nhìn vào ví dụ thực nghiệm của bạn Cường, sau đó đóng vai trò làm trình thông dịch và chạy bộ để giải thích thật cặn kẽ và chi tiết (tất nhiên phải giải thích đúng), tại sao với ví dụ thế này lại có kết quả như bạn Cường đã nêu ra ?

Sau khi kết luận rằng có được đặt tên biến là chữ cái chữ số, ký tự đặc biệt… v.v… hay không, thì bạn luôn hỏi « tại sao như thế ? ». Mặc dù bạn tự trả lời rằng « em không biết » nhưng tôi rất hoan nghênh bạn. Vì nếu cứ tiếp tục đặt ra được nhiều câu hỏi tại sao như thế, và tìm tòi để trả lời, bạn sẽ tiến rất nhanh, hiểu rất sâu và rõ bản chất của vấn đề (khi có cơ hội).

Còn hiện tại, tôi cũng không biết (hoặc là không chắc chắn) là tại sao PHP lại quy định rằng sau dấu $ phải là chữ cái hoặc dấu _ mà không thể là chữ số??? Có ai biết thì chia sẻ thêm cho mọi người và tôi được rõ ?

Bạn hỏi tiếp, không hiểu tại sao khi code :

<?php $a=43,$a=$a.”,var_dump($a);?> thì lại báo lỗi ( em không hiểu ở chỗ dấu , khi có lệnh echo thì đúng nhưng ko sử dụng echo thì báo lỗi và phải đổi lại thành ; ở mỗi khai báo biến. và “;” trong 1 tag được quy ước + thực thi như thế nào ?

Có ai giải thích được tại sao lại báo lỗi ở câu lệnh trên không ạ ? Chú ý, các bạn phải đóng vai trò trình duyệt, chạy qua từng ký tự từ trái qua phải thì mới giải thích được « chính xác » vấn đề, ký tự phát sinh ra lỗi, và lỗi ở đây là lỗi gì nhé.

Các nội dung khác trong bài làm của bạn Trịnh Duy Cường cũng có nhiều điều thú vị, mọi người có thể tham khảo tại đây http://www.box.net/shared/z6sj0y587d

chu lac phuong <phuthuy_langquenthoigian

(Bạn có email hay quá :D) Bạn Phương đặt vấn đề thế này :

14. string * float tạo ra dữ liệu kiểu FLOAT

Vd: <?php $a=thanks ; $b=5.245;var_dump($a*$b);?>

Kết quả hiển thị: float(0)

Đã check nhiều lần và nhiều trường hợp,có thay đổi giá trị của string và float thế nào đi nữa thì kết quả vẫn là float (0)

Em đã check luôn trường hợp string*int, có thay đổi giá trị của string và int thế nào đi nữa kết quả hiển thị vẫn là int(0)

Tiếc là bạn không giải thích tại sao? Bạn có biết tại sao không? Và có ai giải thích được vấn đề mà bạn Lac Phuong nêu ra không ạ?

Bài 4.6 bạn viết

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.

Em dự đoán chắc là vô số ký tự. Vì em nghĩa php là trình thông dịch, mình viết chuỗi thế nào thì nó xuất ra thế đó. Mình viết 1 chuỗi bao nhiêu ký tự thì nó phải xuất ra bấy nhiêu, nên em nghĩ chắc nó ko giới hạn. Và trong khi check thủ công,em có thử kiểu chuỗi có các ký tự đặc biết như /, #,~ hoặc khoảng trống thì php ko chấp nhận.

Tôi thực sự không hiểu ý bạn nói, bạn có thể giải thích rõ hơn không? Các ký tự như / # ~ hoặc khoảng trống đều có thể đưa vô khai báo chuỗi một cách bình thường như ví dụ dưới đây:

clip_image001

phuong luu <thotrangmp

Bạn dùng tools để làm bài nên tôi “giận” không comment cho bạn đâu. Mà thực ra tôi đọc cái source code bạn gửi tôi cũng hoa hết cả mắt, chóng hết cả mặt nên cũng nản để mà comment.

nguoibanthanthuong toilaban <wearebestfriends283@

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

$c= 43; $c=$c+(float)0;

Nếu thực sự làm vậy thì giống như em ép kiểu cho nó rồi, không biết anh chấp nhận hay không?

Không chấp nhận ạ, nhưng trong thực tế thì bạn cứ làm thoải mái, chẳng sao. Có điều, nếu nghĩ đơn giản hơn thì 0.0 cũng là số thực bạn ạ. Không cần phải viết (float)0 để ép kiểu làm gì cho phức tạp, hì hì :)

Bạn hỏi thêm về \n và \t. Tôi giải thích (lại) nhé: \n để đưa con nháy xuống dòng, \t để yêu cầu con nháy nhảy tab. Đơn giản vậy thôi bạn ạ.

Ví dụ, thay vì viết:

<?php

echo ‘Day la dong 1

Day la dong 2’;

?>

Bạn có thể viết

<?php

echo “Day la dong 1\nDay la dong 2”;

?>

Chú ý là \n và \t chỉ có tác dụng khi đặt giữa “” bạn nhé.

thai daoquoc <dqthai2007@

trang nguyen <bemyta_161@

Các bạn chú ý đọc lại các bài trước và hạn chế tối đa dùng dấu «  khi có thể nhé !

Phần comment đến đây là hết, vì những bài khác sai/đúng hoàn toàn rơi vào các trường hợp đã comment. Các bạn chú ý thảo luận những chỗ mà tôi bôi đỏ nhé. Chúc mọi người cuối tuần vui vẻ :)

14 Comments + Add Comment

  • xin lỗi thầy và lớp, vừa rồi em có hơi bận công việc 1 chút nên ko thể hoàn thành bài tập, em sẽ cố gắng làm tốt nhữngb ài tiếp theo, theo em nghĩ vấn đề của string*float= float(0) là tại vì khi string*float thì hệ thống sẽ đưa kiểu string về số thực để *, mà khi đưa kiểu string về số thì luôn = 0, nên kết quả vẫn luôn là o, em nghĩ vậy ko biết đúng hay sai, mong thầy và các bạn trong lớp cho ý kiến và đưa ra lý do vì sao để em cùng mọi người hiểu rõ hơn về vần đề này


    • string*float= float(0) là tại vì khi string*float thì hệ thống sẽ đưa kiểu string về số thực để *, mà khi đưa kiểu string về số thì luôn = 0, nên kết quả vẫn luôn là o

      Khi convert String to number type thì nó sẽ duyệt chuỗi đó từ kí tự đầu tiên cho đến khi ko phải là kí tự số thì stop .
      ví dụ : $string=”123abc” , $b=(int)$string =123 .

      • Nếu $string=’123.45abc’; thì sao ạ?

  • Em có 1 chỗ không hiểu là int+float.string thì ra string. Đáng lẽ đầu tiên float.string thì ra string sau đó int +string phải ra int chứ. Em chưa hiểu cách nào mà lại ra string mặc dù thực nghiệm là string.

    • @Khánh
      Bác post ví dụ lên xem nào .
      float.string ~> string
      int + float.string ~> float
      vì khi thực hiện phép tính php sẽ cố gắng chuyển đổi float.string về kiểu số.
      trong trưởng hợp này sẽ thành float. vì thế int + float ~> float chứ không thể thành string như bác nói được.

      • bất kỳ kiểu nào mà . với string đều ra string
        int.string=string
        float.string=string
        string.string=string
        Vậy tại sao float.string+int=float
        Theo nguyên tắc phép tính trong php
        nếu 1 string + với 1 số thì php sẽ quét số trong cái string đó có số không. Và nó sẽ lấy số đầu tiên thỏa điều kiện là số và php lấy số đó ra cộng
        Trong string của bạn có tồn tại 1 số float kết hợp với string lúc đầu mà float + int thì chắc chắn nó sẽ ra kiểu lớn nhất là float
        vd: “3.14acc” + 3 = 3.14 +3 =6.14(FLoat)
        Nhớ 1 điều dùng dấu “.” php sẽ hiểu là lệnh nối chuỗi (+-*/) là phép tính

      • @nhtera
        Mình nghĩ bạn nói ko đúng.
        int + float.string ~> float
        Mình nghĩ complier sẽ dựa vào độ ưu tiên của phép toán , phép cộng sẽ có độ ưu tiên cao hơn phép concatenation operator

        • @Thanh Tinh
          Thế hỏi bác nhé em dùng như thế này:
          $a = 10;
          $b = “1.2tien”;
          $c = $a + $b;
          Vậy có một phép tính thôi thì độ ưu tiên ở đâu ạ?

          • @Thinh
            Đang hỏi câu đó bác lại chỉ sang bài lý thuyết là sao 😀
            Có một phép tính thôi thì ưu tiên gì chứ .

          • int + float.string : co 2 toan tu + and .
            $c = $a + $b; : co 1 toan tu +

  • Nói thêm về cách khai báo biến trong PHP, theo như tôi biết thông qua trang
    http://us2.php.net/manual/en/language.variables.basics.php
    thì PHP sẽ kiểm tra tên biến chúng ta đặt, có nghĩa là khi gặp ký tự $, PHP sẽ kiểm tra các ký tự theo sau có phù hợp với regular expression sau hay không, nếu vi phạm sẽ báo lỗi còn không thì chấp nhận tên biến là hợp lệ
    ‘[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*’
    regular expression trên giải thích tại sao khi bạn đặt tên biến là $1 hay $2 thì không được phép.
    [a-zA-Z_\x7f-\xff] : php yêu cầu kí tự đầu tiên sau $ là một ký tự chữ cái nằm trong khoảng (a-zA-Z) hoặc ký tự ( _ ) hoặc là ký tự Unicode UTF-8 trong khoảng (\x7f -> \xff)
    [a-zA-Z0-9_\x7f-\xff]*: các ký tự theo sau ký tự đầu tiên có bao gồm tất cả các ký tự được cho phép ở trên công thêm ký số (0-9).

    Nếu mình phát biểu có gì sai mong các bạn góp ý thêm hì hì

  • 14. string * float tạo ra dữ liệu kiểu FLOAT

    Vd:

    Kết quả hiển thị: float(0)

    Đã check nhiều lần và nhiều trường hợp,có thay đổi giá trị của string và float thế nào đi nữa thì kết quả vẫn là float (0)

    Em đã check luôn trường hợp string*int, có thay đổi giá trị của string và int thế nào đi nữa kết quả hiển thị vẫn là int(0)

    Hình như kiểu String bạn khai báo sai, phải viết là $a=’thanks’; và có những ví dụ này nhé:
    hiển thị kết quả float(0)
    hiển thị kết quả float(524.5)
    hiển thị kết quả float(524.5)
    hiển thị kết quả float(52.45)
    hiển thị kết quả float(0)
    hiển thị kết quả float(65.5625)

    Theo ý mình nhận xét,hàm var_dump() của PHP, gặp chuỗi string chữ cái hoặc kí tự ko phải số, nó gán luôn giá trị float hoặc int là 0 (từ đó về sau chuỗi, dù thế nào cũng ko thay đổi).
    Nếu string là số, nó gán giá trị float hoặc int là giá trị của số đó.
    Nếu gồm cả string và số, theo 2 quy tắc trên. Chú ý, dấu phẩy vẫn là dấu phẩy

Leave a comment