Trang 1 / 16 12346 ... LastLast
Hiển thị kết quả từ 1 đến 10 / 153
  1. #1
    Tham gia
    14-03-2007
    Bài viết
    57
    Like
    0
    Thanked 8 Times in 4 Posts

    Một số kĩ thuật cơ bản của Pascal

    Mình lập ra topic này để chia sẻ một số kinh nghiệm của cá nhân mình về một số kĩ thuật cơ bản sẽ được sử dụng khá nhiều,bạn nào biết hơn hãy post vào đây để chia sẻ với những ai chưa biết.Mình sẽ cố gắng cập nhật thêm.
    Chúng ta hãy bắt đầu với một số kĩ thuật đơn giản

    +Muốn dừng màn hinh lại để có thể xem kết quả sau khi chương trình đã chạy xong,hãy thêm vào trước cái END cuối cùng của chương trình một câu lệnh Readln;
    +Cách in ra ma trận a với m dòng,n cột dưới dạng bảng
    Code:
      
      for i:=1 to m do begin
        for j:=1 to n do 
          write(a[i],' ');
        writeln;
      end;
    +Hoán đổi vị trí của hai số a,b,sử dụng một biến tg làm trung gian
    Code:
    Procedure Swap(Var a,b:integer);
    Var tg:integer;
    Begin
      tg:=a;
      a:=b;
      b:=tg;
    End;
    Thôi,tạm dừng ở đây.Sẽ cập nhật tiếp vào lúc khác
    Được sửa bởi chungkid1 lúc 20:39 ngày 25-12-2007
    Quote Quote

  2. 3 thành viên Like bài viết này:


  3. #2
    Tham gia
    03-01-2004
    Bài viết
    903
    Like
    0
    Thanked 11 Times in 7 Posts
    Tui nghĩ sau này bạn chungkid có thể sẽ thay đổi ý kiến về:

    +Hãy thay câu lệnh inc(i) của bạn trong chương trình bằng câu lệnh i:=i+1.Vì sao à?Bởi vì câu lệnh sau tuy dài nhưng nó chạy nhanh hơn câu lệnh trước,ko tin hãy chạy mỗi cái khoảng 1 tỷ lần,bạn sẽ thấy nó khác như thế nào
    (1 trình biên dịch tốt có đủ thông minh để dịch "inc(i)" giống y như "i:=i+1"
    Cho dù "i:=i+1" có thiệt sự chạy nhanh hơn "inc(i)" đi nữa: xài đúng cấu trúc dữ liệu và thuật toán sẽ làm chương trình chạy nhanh hơn rất nhiều so với việc đổi "inc(i)" thành "i:=i+1")

    +Thay vì viết (a) and (b),bạn hãy viết thế này
    if a then
    if b then
    như thế nhiều khi có thể loại được một số bước xét ko cần thiết,làm chương trình có thể chạy nhanh hơn một chút.Hơn nữa có thể tránh một số lỗi vớ vẩn vì TP7 nhiều khi bị điên,viết (a) and (b) nó xét a đã sai rồi,nó xét b đúng nó vẫn chạy tiếp
    (nếu bạn chắc chắn TP7 bị lỗi như vậy thì không nên xài nó làm gì !!!
    Nhưng tui không biết bạn có lộn chỗ này hay không ? Tui nghĩ có thể là nó xét a sai rồi nó vẫn xét b tiếp; nhưng cuối cùng thì nó vẫn nhảy qua phần "else")

    Nhưng cũng cám ơn bạn đã có ý tốt muốn chia sẻ kinh nghiệm

    (hiểu biết nông cạn; có gì sai sót mong được góp ý; xin cám ơn)

    -thân
    Được sửa bởi bete lúc 13:51 ngày 25-12-2007

  4. 5 thành viên Like bài viết này:


  5. #3
    Tham gia
    08-11-2004
    Bài viết
    1,023
    Like
    0
    Thanked 21 Times in 5 Posts
    Tôi có thắc mắc 1 tí.

    +Hãy thay câu lệnh inc(i) của bạn trong chương trình bằng câu lệnh i:=i+1.Vì sao à?Bởi vì câu lệnh sau tuy dài nhưng nó chạy nhanh hơn câu lệnh trước,ko tin hãy chạy mỗi cái khoảng 1 tỷ lần,bạn sẽ thấy nó khác như thế nào
    Hàm inc() là hàm viết sẵn (structured function) cho pascal để thao tác trực tiếp với mã máy, vì vậy tôi không nghĩ rằng inc(i) lại chậm hơn i := i + 1; Trong trường hợp i := i + 1; compiler cũng phải dịch rồi xác định cái thằng "+" đó là dấu cộng rồi mới thực hiện phép tính.

    +Cách in ra ma trận a với m dòng,n cột dưới dạng bảng
    for i:=1 to m do begin
    for j:=1 to n do
    write(a[i],' ');
    writeln;
    end;
    Code standard cũng là kỹ thuật lập trình thì phải. Theo tôi với mấy ngôn ngữ dùng chữ thì chúng ta không nên để begin cùng hàng với câu lệnh trước nó để tránh tình trạng rối mắt, bỏ sót cặp begin-end .v.v

    Một chút ý kiến, không biết đúng hay sai. Cám ơn vì chia sẻ kinh nghiệm.

  6. 3 thành viên Like bài viết này:


  7. #4
    Tham gia
    17-10-2007
    Location
    Hà Nội
    Bài viết
    758
    Like
    0
    Thanked 8 Times in 7 Posts
    Quote Được gửi bởi chungkid1 View Post
    +Thay vì viết (a) and (b),bạn hãy viết thế này
    if a then
    if b then
    như thế nhiều khi có thể loại được một số bước xét ko cần thiết,làm chương trình có thể chạy nhanh hơn một chút.Hơn nữa có thể tránh một số lỗi vớ vẩn vì TP7 nhiều khi bị điên,viết (a) and (b) nó xét a đã sai rồi,nó xét b đúng nó vẫn chạy tiếp
    Tôi không nghĩ điều bạn nói ở trên là đúng. Tôi đã sử dụng TP7 2 năm nay và chưa bao giờ thấy có cái lỗi mà bạn nêu trên. Hơn nữa, trong TP7, việc bạn viết tách 2 câu lệnh đó ra chẳng ảnh hưởng gì cả, không biết bạn đã thử chưa. Đối với phép and, nếu viết (a) and (b) thì khi a sai, TP7 sẽ không xét tiếp b nữa, nếu không tin bạn có thể thử cho a và b là các function rồi dùng F7 (trace into) bạn sẽ thấy chương trình không hề quan tâm tiếp đến b
    Được sửa bởi mr_invincible lúc 20:07 ngày 18-01-2008

  8. 2 thành viên Like bài viết này:


  9. #5
    Tham gia
    17-10-2007
    Location
    Hà Nội
    Bài viết
    758
    Like
    0
    Thanked 8 Times in 7 Posts
    Quote Được gửi bởi chungkid1 View Post
    +Hãy thay câu lệnh inc(i) của bạn trong chương trình bằng câu lệnh i:=i+1.Vì sao à?Bởi vì câu lệnh sau tuy dài nhưng nó chạy nhanh hơn câu lệnh trước,ko tin hãy chạy mỗi cái khoảng 1 tỷ lần,bạn sẽ thấy nó khác như thế nào
    Chính tay tôi đã thử sự khác nhau của 2 lệnh trên:
    - Nếu đặt chỉ thị dịch là $R+ (kiểm tra lỗi tràn số) thì với lệnh i:=i+1 thì TP7 phải kiểm tra xem lệnh trên có gây ra tràn số không, do đó lệnh i:=i+1 chậm hơn rất nhiều so với inc(i) (khoảng gần 2 lần)
    - Nếu đặt chỉ thị dịch là $R- (không kiểm tra lỗi tràn số) thì do không phải kiểm tra xem có tràn số không nên lệnh i:=i+1 có nhanh hơn một chút, nhưng vẫn chậm hơn nhiều so với inc(i)

    Lý do duy nhất mà tôi nghĩ nên dùng i:=i+1 hay i:=i+n mà không thay bằng inc(i,n) là do TP7 không kiểm tra tính tràn số của lệnh này, nên trong các chương trình lớn, khó kiểm tra được tính đúng đắn của lệnh này (không thể biết lệnh này có gây tràn số không)
    Được sửa bởi mr_invincible lúc 20:07 ngày 18-01-2008

  10. Thành viên Like bài viết này:


  11. #6
    Tham gia
    14-03-2007
    Bài viết
    57
    Like
    0
    Thanked 8 Times in 4 Posts
    Code standard cũng là kỹ thuật lập trình thì phải. Theo tôi với mấy ngôn ngữ dùng chữ thì chúng ta không nên để begin cùng hàng với câu lệnh trước nó để tránh tình trạng rối mắt, bỏ sót cặp begin-end .v.v
    sorry,tôi dã để mấy dấu space rồi đấy chứ,ko hiểu vì sao nó lại bị mất,sẽ sửa ngay.Cảm ơn vì đẫ nhắc nhở.

    Đa tạ vì ý kiến đóng góp của mọi người.Có lẽ mình đã sai ở hai ý cuối.Mình
    sẽ del hai ý đó đi.Xin lỗi về sự nhầm lẫn này.

  12. Thành viên Like bài viết này:


  13. #7
    Tham gia
    14-03-2007
    Bài viết
    57
    Like
    0
    Thanked 8 Times in 4 Posts
    Tiếp nhé
    +Hàm kiểm tra số nguyên tố,trả về true nếu số n là số nguyên tố
    Code:
    Function nt(n:integer):boolean;
    Var
      i:integer;
    Begin
      if n<=1 then begin
        nt:=false;
        Exit;
      end;
      for i:=2 to (n div 2) do
        if (n mod i)=0 then begin
          nt:=false;
          Exit;
        end;
      nt:=true;
    End;
    +Hàm tính giai thừa(loại cơ bản,áp dụng cho số nguyên dương n<=15)
    Code:
    Function gt(n:byte):Longint;  
    Var
      s:Longint;
      i:byte;
    Begin
      s:=1
      For i:=2 to n do 
        s:=s*i;
      gt:=s;
    End;
    +Sắp xếp mảng a với n phần tử theo thứ tự tăng dần,sử dụng thuật toán Bubble Sort
    Code:
    Procedure BubbleSort(Var a:mang,n:integer);{Mang là kiểu array khai báo      
                                                bằng từ khóa Type}
    Var i,j:integer;
    Begin
    for j:=1 to n-1 do
      for i:=n downto j+1 do
        if a[i]<a[i-1] then 
          Swap(a[i],a[i-1];{Thủ tục Swap ở trên})
    End;
    Phương pháp này chạy chậm với những bộ dữ liệu lớn,vì vậy khi cần phương pháp sắp xếp tốt hơn,bạn nên dùng phương pháp Quick sort.Chương trình của nó có sẵn trong thư mục Example của Pascal,là file QSort.pas.Tuy nhiên bạn nên nhớ lấy để dùng,ko nên quá ỷ lại vào chương trình có sẵn,rủi bị ai xóa mất thì chỉ có khóc thôi

  14. 3 thành viên Like bài viết này:


  15. #8
    Tham gia
    17-10-2007
    Location
    Hà Nội
    Bài viết
    758
    Like
    0
    Thanked 8 Times in 7 Posts
    Hàm kiểm tra nguyên tố có lẽ nên để i chạy từ 2 đến round(sqrt(n)) thì chương trình sẽ chạy nhanh hơn (nhất là đối với các số lớn khoảng một hai triệu)

  16. Thành viên Like bài viết này:


  17. #9
    Tham gia
    03-01-2004
    Bài viết
    903
    Like
    0
    Thanked 11 Times in 7 Posts
    Hàm kiểm tra nguyên tố có lẽ nên để i chạy từ 2 đến round(sqrt(n)) thì chương trình sẽ chạy nhanh hơn (nhất là đối với các số lớn khoảng một hai triệu)
    => nếu muốn cho nhanh hơn 1 chút nữa:
    - nếu n là số chẵn thì ....
    - cho i là số lẻ chạy từ 3 đến round(sqrt(n))

    (nhưng có vẻ mấy cái về sau không còn là "kỹ thuật cơ bản của Pascal nữa" (không là kỹ thuật; mà cũng không là chỉ đúng cho riêng Pascal))

    (hiểu biết nông cạn; có gì sai sót mong được góp ý; xin cám ơn)

    -thân

  18. Thành viên Like bài viết này:


  19. #10
    Tham gia
    18-09-2002
    Location
    Ha Noi
    Bài viết
    1,311
    Like
    0
    Thanked 13 Times in 10 Posts
    Có lẽ nên đổi tên là thư viện, những đoạn chương trình mẫu viết bằng ngôn ngữ Pascal thì đúng hơn. Tui stick nó nhé.

  20. 2 thành viên Like bài viết này:


Trang 1 / 16 12346 ... LastLast

Tags for this Thread

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •