सामग्री पर जाएँ
Topos Uranos

सारांश

अब तक पाठ्यक्रम का हर प्रोग्राम एक ही ब्लॉक, main, रहा है, जिसमें सब कुछ वहीं लिखा जाता है जहाँ उसका उपयोग होता है। यह पाठ सिखाता है कि प्रोग्राम के किसी भाग को नाम कैसे दिया जाए और उसके भीतर देखे बिना उसका उपयोग कैसे किया जाए: यही फ़ंक्शन है। इसमें घोषणा का अध्ययन होता है, जो कंपाइलर को नाम, रिटर्न प्रकार और पैरामीटर बताती है; परिभाषा का, जो बॉडी जोड़ती है; और कॉल का, जो नियंत्रण उस बॉडी को सौंपती है और लौटाया गया मान प्राप्त करती है। इसमें यह भेद किया जाता है कि कंपाइलर कंपाइल करते समय क्या जाँचता है (कि हर कॉल किसी घोषणा से मेल खाती है) और निष्पादन के समय क्या होता है (परिभाषा पर छलाँग और वापसी)। यह समझाया जाता है कि मान लौटाने वाले फ़ंक्शन के अंत तक return के बिना पहुँचना अपरिभाषित व्यवहार क्यों है। निष्पादन को कॉल स्टैक के सहारे देखा जाता है, जो हर चालू कॉल के लिए एक फ़्रेम रखता है। और हर फ़ंक्शन को एक अनुबंध से निर्दिष्ट किया जाता है, अर्थात उसकी पूर्व-शर्त और पश्च-शर्त से, जो बताता है कि फ़ंक्शन अपने कॉल करने वाले से क्या माँगता है और बदले में क्या गारंटी देता है।

अधिगम उद्देश्य

  1. पैरामीटर और रिटर्न मान वाले फ़ंक्शन घोषित करना, परिभाषित करना और कॉल करना, और किसी प्रोग्राम में बताना कि कौन-सा भाग घोषणा है और कौन-सा परिभाषा।
  2. एक-दूसरे को कॉल करने वाले फ़ंक्शनों वाले प्रोग्राम के निष्पादन को कॉल स्टैक के आरेख से समझना।
  3. किसी फ़ंक्शन को उसकी पूर्व-शर्त और पश्च-शर्त से निर्दिष्ट करना, और पूर्व-शर्त का उल्लंघन करने वाली कॉल लिखना।
  4. समझाना कि किसी पथ पर मान न लौटाने वाला फ़ंक्शन अपरिभाषित व्यवहार क्यों है, और कंपाइलर की संबंधित चेतावनी पहचानना।

फ़ंक्शन क्यों

इससे पहले की इकाई के प्रोग्राम हर समस्या को main के भीतर हल करते थे, और जब तक समस्याएँ छोटी थीं, इतना काफ़ी था। लेकिन जैसे ही कोई प्रोग्राम बढ़ता है, तीन कठिनाइयाँ सामने आती हैं। पहली है दोहराव: यदि एक ही गणना तीन जगह चाहिए, तो वह तीन बार लिखी जाती है, और उसकी कोई त्रुटि तीन बार सुधारी जाती है (या किसी एक जगह सुधारना भूल जाते हैं)। दूसरी है पढ़ना: पचास पंक्तियों का ब्लॉक यह नहीं बताता कि वह क्या करता है, बल्कि यह कि कैसे करता है, और पाठक को तंत्र से इरादा फिर से गढ़ना पड़ता है। तीसरी है परीक्षण: यदि सब कुछ मिला-जुला हो, तो बाकी को चलाए बिना किसी एक भाग को जाँचने का कोई तरीका नहीं होता।

फ़ंक्शन प्रोग्राम का एक नामयुक्त अंश है, जो डेटा प्राप्त करता है, जिन्हें पैरामीटर कहते हैं, और एक परिणाम सौंपता है, जिसे रिटर्न मान कहते हैं। गणित इस विचार को सदियों से जानता है: समतल के दो बिंदुओं के बीच की दूरी उनके चार निर्देशांकों का फलन है, d(x1,y1,x2,y2)=(x2−x1)2+(y2−y1)2d(x_1, y_1, x_2, y_2) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}, और जो त्रिभुज का परिमाप निकालता है वह सूत्र को तीन बार नहीं दोहराता, बल्कि उसे नाम देकर तीन बार लागू करता है। C++ में भी यही लिखा जाता है।

उदाहरणत्रिभुज का परिमाप

प्रोग्राम त्रिभुज के तीनों शीर्षों के निर्देशांक पढ़ता है और उसका परिमाप लिखता है, जो उसकी तीनों भुजाओं की लंबाइयों का योग है।

C++ प्रोग्राम
#include <cmath>#include <iostream>#include <print>​// बिंदुओं (x1, y1) और (x2, y2) के बीच की दूरी।double distance(double x1, double y1, double x2, double y2){    const double dx{x2 - x1};    const double dy{y2 - y1};    return std::sqrt(dx * dx + dy * dy);}​int main(){    double ax{};    double ay{};    double bx{};    double by{};    double cx{};    double cy{};    std::cin >> ax >> ay >> bx >> by >> cx >> cy;    const double perimeter{distance(ax, ay, bx, by) + distance(bx, by, cx, cy)                           + distance(cx, cy, ax, ay)};    std::println("परिमाप: {}", perimeter);}
प्रोग्राम का इनपुट
0 0 3 0 0 4
आउटपुट
परिमाप: 12

शीर्षों (0,0)(0, 0), (3,0)(3, 0) और (0,4)(0, 4) वाले त्रिभुज की भुजाएँ 3, 5 और 4 हैं, और उनका योग 12 है।

फ़ंक्शन distance एक बार लिखा जाता है और तीन बार उपयोग होता है; main परिमाप की परिभाषा की तरह पढ़ा जाता है, “तीन दूरियों का योग”; और distance का अकेले परीक्षण किया जा सकता है, बिंदुओं के ऐसे जोड़े से जिनकी दूरी ज्ञात है। इस तरह वे तीनों चीज़ें मिल जाती हैं जो कम थीं। सामान्य सीख, जो किसी भी भाषा में लागू होती है, यह है कि फ़ंक्शन एक विचार को नाम देता है: उसका उपयोग करने वाला सोचता है कि वह क्या करता है, यह नहीं कि कैसे करता है। उपयोग और कार्यान्वयन के इस अलगाव को प्रक्रियात्मक अमूर्तन कहते हैं, और यही पूरी इकाई का विषय है।