2010-03-22 33 views
5

Đoạn mã sau là một ví dụ về những gì tôi nghĩ sẽ đủ điều kiện làm mã giả, vì nó không thực thi bằng bất kỳ ngôn ngữ nào nhưng logic là chính xác.Mã giả: định nghĩa rõ ràng?

string checkRubric(gpa, major) 
    bool brake = false 
    num lastRange 
    num rangeCounter 
    string assignment = "unassigned" 
    array bus['business']= array('person a'=>array(0, 2.9), 'person b'=>array(3, 4)) 
    array cis['computer science']= array('person c'=>array(0, 2.9), 'person d'=>array(3, 4)) 
    array lib['english']= array('person e'=>array(0, 4)) 
    array rubric = array(bus, cis, lib) 

foreach (rubric as fieldAr) 
    foreach (fieldAr as field => advisorAr) 
     if (major == field) 
      foreach (advisorAr as advisor => gpaRangeAr) 
        rangeCounter = 0 
       foreach (gpaRangeAr as gpaValue) 
        if (rangeCounter < 1) 
         lastRange = gpaValue 
        else if (gpa >= lastRange && gpa <= gpaValue) 
         assignment = advisor 
         brake = true 
         break 
        endif 
        rangeCounter++ 
       endforeach 
       if (brake == true) 
        break 
       endif 
      endforeach 
      if (brake == true) 
       break 
      endif 
     endif 
    endforeach 
    if (brake == true) 
     break 
    endif 
endforeach 
return assignment 

Trong vài tuần qua, tôi đã cố gắng tạo ra định nghĩa rõ ràng về mã giả thực sự là gì. Nó có liên quan đến lập trình viên hay có một cú pháp rõ ràng thực tế không? Tôi nói giả mã là bất kỳ mã nào không thực thi, còn bạn thì sao? Cảm ơn (các liên kết đến hoan nghênh chủ đề này)

Trả lời

6

Không có định nghĩa cố định về mã giả. Đó là bất kỳ ký hiệu nào mà bạn mong đợi khán giả hiểu được để hiểu rõ điểm của bạn. Ý tưởng quan trọng là nó được thiết kế cho con người để đọc, không phải máy tính, vì vậy nó không phải là chính xác. Bạn có thể bao gồm các chi tiết quan trọng đối với việc trình bày của bạn và bỏ qua những chi tiết không có.

+0

Tôi đồng ý với bạn 100%. Giả mã, theo ý kiến ​​của tôi, phụ thuộc vào ngữ cảnh/đối tượng được cung cấp và không nhất thiết phải hoàn toàn độc lập với ngôn ngữ. Đây là lý do tại sao tôi không thể lay chuyển niềm tin rằng mã giả có thể đạt tới giới hạn của việc thiếu compilable. Tôi nghĩ nhiều hơn có thể được thảo luận về câu hỏi này. –

3

shamelessly tách từ Wikipedia:

Mã giả là một mô tả cấp cao nhỏ gọn và không chính thức của một thuật toán lập trình máy tính có sử dụng các quy ước về cấu trúc của một ngôn ngữ lập trình, nhưng được thiết kế để đọc con người hơn là đọc máy. Mã giả thường bỏ qua các chi tiết không cần thiết cho sự hiểu biết của con người về thuật toán, chẳng hạn như khai báo biến, mã hệ thống và chương trình con cụ thể.

Có nhiều mã không thực thi. Điều đó không có nghĩa là nó là giả mã. "Psuedocode" của bạn có rất nhiều nội dung bổ sung mà những người không lập trình sẽ không hiểu. Thay vì là mã giả, ngôn ngữ "psuedocode" của bạn rất, rất gần với một ngôn ngữ thực tế.

+0

Điều này có vẻ là định nghĩa rõ ràng nhất. –

0

tôi hai xu về điều này:

tôi nói giả là bất kỳ mã mà không thực hiện, làm thế nào về bạn? Cảm ơn (liên kết đến chủ đề này chào mừng)

Đó không phải là suy nghĩ của tôi khi nghĩ về định nghĩa của nó. Mã giả là các bước mà chương trình của bạn sẽ thực hiện để hoàn thành một nhiệm vụ chi tiết hơn là mô tả thuật toán.

Một điều đặc biệt mà tôi thấy cực kỳ quan trọng về cách viết mã giả là, mọi người phải hiểu mọi thứ để mỗi "cá nhân" chuyển nó thành ngôn ngữ mong muốn của một người. Nói cách khác, nó không phải là ngôn ngữ bất khả tri.

Cũng giống như một lời chỉ trích mang tính xây dựng, tôi sẽ không coi ví dụ của bạn là mã giả vì nhiều lý do khác nhau, đặc biệt vì bạn đang sử dụng cú pháp và quy ước tương tự như ngôn ngữ lập trình cụ thể. Tôi nói giả tạo nên là sự bất khả tri ngôn ngữ lập trình để được chuyển sang một số ngôn ngữ lập trình thực tế bởi những người khác nhau.

EDIT: Có lẽ một quy tắc nữa tôi sẽ thêm vào định nghĩa của mình là, nó phải giống ngôn ngữ của con người hơn là ngôn ngữ lập trình. Như trong, bằng thay vì ==, chỉ định thay vì =. Lý do đằng sau điều này là, ví dụ, các toán tử gán và bình đẳng là khác nhau trong các ngôn ngữ khác nhau.

+0

@Anzurio, tôi cho rằng "==" được sử dụng rộng rãi đủ để có thể chấp nhận được trong mã giả. Tuy nhiên, việc ông sử dụng "như" cũng như việc ông sử dụng các biểu hiện thực tế cho các điều kiện của mình thay vì giải thích bằng tiếng Anh về những gì đang được thử nghiệm là những gì làm cho nó không phải là mã giả. –

+0

@ Michael, bạn nói đúng nhưng đó là "gương mẫu" đầu tiên xuất hiện trong tâm trí tôi khi cố gắng vạch trần rằng tôi muốn sử dụng từ ngữ hoặc ngôn ngữ tượng trưng bất khả tri hơn. 'Bên, làm việc với cả hai, VB.NET và C#, mà bật lên trong tâm trí của tôi khá dễ dàng. – Anzurio

1

Giả mã giả, nên về mặt lý thuyết, được thực hiện độc lập. Nó trình bày các bước hợp lý bằng ngôn ngữ đơn giản về những gì cần làm. Nó được thiết kế để giải thích của con người, không phải là thực thi máy.

Ví dụ của OP gần hơn một chút so với mã thực tế hơn mã giả. Ví dụ: ++ không được tìm thấy ở tất cả các ngôn ngữ. Nó cũng có ý nghĩa rất khác trong những người khác.

1

Vâng, nếu tôi không biên dịch/liên kết mã C++, nó sẽ không thực thi, vì vậy tôi không nghĩ "Mã không thực thi" là định nghĩa có thể chấp nhận được.

Ngôn ngữ kịch bản lệnh tương tự không được thực thi, chúng thường được diễn giải lần.

định nghĩa của tôi về mã giả sẽ là:

"[ngắn gọn] Mã đó là cú pháp thuyết bất khả tri, bằng văn bản để chuyển tải một chức năng, hành vi, hoặc thuật toán""

+0

Thú vị. Có vẻ như đó chỉ là một bài luận cho tôi - không có gì sai khi viết một bằng chứng tôi đoán. –

+0

Đã thêm "ngắn gọn" cho bạn :) – Alan

1

Pseudo-code là bất kỳ nhỏ gọn, . con người giải thích có thể đọc được của một thuật toán hay chương trình Kể từ khi chương trình của bạn không thể đọc được với tôi, tôi sẽ nói rằng nó không phải là pseudo-code khá Dưới đây là một ví dụ về pseudo-code:.

 
def sum(x): 
    result = 0 
    for each entry in x: 
     add current entry to result 
    report result 

hoặc, trong một phong cách hơi khác:

 
sum(x): 
    Let x be an array 
    Let result be an integer representing the result, initially 0 

    for item in x: 
     result += item 

    return result 

Bạn có thể sử dụng các phần tử của một cú pháp cụ thể (và, trên thực tế, mã giả của tôi có xu hướng trông rất giống Python), nhưng nó phải dễ hiểu bởi nhiều đối tượng và không bị cản trở bởi cú pháp . Ví dụ, tôi sử dụng "+ =", nhưng điều này là bởi vì nó là rất nhỏ gọn và thuận tiện, không phải vì nó là bắt buộc. Nếu bạn tìm thấy "endforeach" hữu ích và thuận tiện trong trình bày của bạn, nó sẽ là ok; tuy nhiên, tôi cho rằng một thứ như vậy không thuộc về mã giả vì nó trông có vẻ stinted hơn là hữu ích hoặc giải thích.

+0

Đó là điều, tôi không thấy thuận tiện chút nào để viết "endforeach", nhưng biết một số làm điều đó. Tôi đưa vào một ví dụ hỗn hợp, "foreach" không có trong mọi ngôn ngữ nhưng "++" hầu như luôn như vậy. Tôi đã sử dụng "kết thúc" thay vì dấu ngoặc nhọn. Tôi hầu như không bao giờ viết mã giả mà những người khác sẽ sử dụng ngoại trừ bản thân tôi (thường có thời hạn sử dụng là 24 giờ trước khi nó được chuyển thành mã), đó là lý do tại sao tôi không nhấn mạnh về nó là ngôn ngữ độc lập. Tài liệu nội bộ của tôi luôn bằng ngôn ngữ tự nhiên. –

0

Mã giả là những gì bạn muốn viết trên bảng trắng nếu bạn muốn nhận ý tưởng của mình nhanh chóng và rõ ràng. Trong thực tế, đối với tôi, nó giống như một ngôn ngữ kịch bản không định kiểu, nhưng với các yêu cầu cú pháp lỏng lẻo hơn nhiều. Đối với tôi, có vẻ như C, bởi vì, thẳng thắn, hầu hết các lập trình viên có một ngôn ngữ là một biến thể về cú pháp C và trực giác dễ dàng hơn cho nhiều người hơn (nó giống như Pascal, nhưng đó là bởi vì đó là một trong những ngôn ngữ đầu tiên tôi đã học ở trường).

+0

Đúng. Tất cả mã giả của tôi không bao giờ rời khỏi bảng trắng. Đây là lý do tại sao tôi nghĩ mã giả, mặc dù thường được cho là gần gũi hơn với ngôn ngữ tự nhiên, có thể được kéo dài sang ngôn ngữ cụ thể mà bạn và cộng tác viên của bạn sẽ sử dụng. Thông thường những người làm việc trên cùng một dự án sẽ sử dụng cùng một ngôn ngữ, nhưng sau đó một lần nữa tôi chỉ làm việc trong các nhóm nhỏ hoặc một mình. –

1

Đường viền của chương trình, được viết bằng biểu mẫu có thể dễ dàng được chuyển đổi thành câu lệnh lập trình thực.

Mã giả không thể được biên dịch cũng như không được thực hiện và không có quy tắc cú pháp hoặc định dạng thực. Nó chỉ đơn giản là một bước - một bước quan trọng - trong việc tạo ra mã cuối cùng. Lợi ích của mã giả là nó cho phép lập trình viên tập trung vào các thuật toán mà không phải lo lắng về tất cả các chi tiết cú pháp của một ngôn ngữ lập trình cụ thể.