การเขียนโปรแกรมเชิงฟังก์ชัน - คู่มือฉบับย่อ

ภาษาโปรแกรมการทำงานได้รับการออกแบบมาเป็นพิเศษเพื่อจัดการกับการคำนวณเชิงสัญลักษณ์และแอปพลิเคชันการประมวลผลรายการ การเขียนโปรแกรมเชิงฟังก์ชันขึ้นอยู่กับฟังก์ชันทางคณิตศาสตร์ ภาษาการเขียนโปรแกรมที่ใช้งานได้ยอดนิยม ได้แก่ Lisp, Python, Erlang, Haskell, Clojure เป็นต้น

ภาษาโปรแกรมที่ใช้งานได้แบ่งออกเป็นสองกลุ่มคือ -

  • Pure Functional Languages- ภาษาที่ใช้งานประเภทนี้รองรับเฉพาะกระบวนทัศน์เชิงหน้าที่เท่านั้น ตัวอย่างเช่น - Haskell

  • Impure Functional Languages- ภาษาที่ใช้งานได้ประเภทนี้สนับสนุนกระบวนทัศน์เชิงฟังก์ชันและการเขียนโปรแกรมรูปแบบที่จำเป็น ตัวอย่างเช่น - LISP

การเขียนโปรแกรมเชิงฟังก์ชัน - ลักษณะเฉพาะ

ลักษณะเด่นที่สุดของการเขียนโปรแกรมเชิงฟังก์ชันมีดังนี้ -

  • ภาษาโปรแกรมการทำงานได้รับการออกแบบโดยใช้แนวคิดของฟังก์ชันทางคณิตศาสตร์ที่ใช้นิพจน์เงื่อนไขและการเรียกซ้ำเพื่อดำเนินการคำนวณ

  • รองรับการเขียนโปรแกรมเชิงฟังก์ชัน higher-order functions และ lazy evaluation คุณสมบัติ

  • ภาษาโปรแกรมที่ใช้งานได้ไม่รองรับการควบคุมโฟลว์เช่นคำสั่งวนซ้ำและคำสั่งเงื่อนไขเช่น If-Else และ Switch Statements พวกเขาใช้ฟังก์ชันและการโทรที่ใช้งานได้โดยตรง

  • เช่นเดียวกับ OOP ภาษาโปรแกรมเชิงฟังก์ชันสนับสนุนแนวคิดที่เป็นที่นิยมเช่น Abstraction, Encapsulation, Inheritance และ Polymorphism

การเขียนโปรแกรมเชิงฟังก์ชัน - ข้อดี

การเขียนโปรแกรมเชิงฟังก์ชันมีข้อดีดังต่อไปนี้ -

  • Bugs-Free Code - ไม่รองรับการเขียนโปรแกรมเชิงฟังก์ชัน stateดังนั้นจึงไม่มีผลข้างเคียงและเราสามารถเขียนรหัสที่ปราศจากข้อผิดพลาดได้

  • Efficient Parallel Programming- ภาษาโปรแกรมที่ใช้งานได้ไม่มีสถานะเปลี่ยนแปลงดังนั้นจึงไม่มีปัญหาการเปลี่ยนแปลงสถานะ เราสามารถตั้งโปรแกรม "ฟังก์ชัน" ให้ทำงานคู่ขนานเป็น "คำสั่ง" ได้ รหัสดังกล่าวสนับสนุนการใช้ซ้ำและทดสอบได้ง่าย

  • Efficiency- โปรแกรมการทำงานประกอบด้วยหน่วยอิสระที่สามารถทำงานพร้อมกันได้ เป็นผลให้โปรแกรมดังกล่าวมีประสิทธิภาพมากขึ้น

  • Supports Nested Functions - โปรแกรมการทำงานรองรับฟังก์ชันซ้อน

  • Lazy Evaluation - โปรแกรมฟังก์ชั่นรองรับ Lazy Functional Constructs เช่น Lazy Lists, Lazy Maps เป็นต้น

ข้อเสียคือการเขียนโปรแกรมเชิงฟังก์ชันต้องใช้พื้นที่หน่วยความจำขนาดใหญ่ เนื่องจากไม่มีสถานะคุณจึงต้องสร้างวัตถุใหม่ทุกครั้งเพื่อดำเนินการ

Functional Programming ใช้ในสถานการณ์ที่เราต้องดำเนินการต่างๆมากมายกับข้อมูลชุดเดียวกัน

  • Lisp ใช้สำหรับแอปพลิเคชันปัญญาประดิษฐ์เช่นการเรียนรู้ของเครื่องการประมวลผลภาษาการสร้างแบบจำลองของคำพูดและการมองเห็นเป็นต้น

  • Embedded Lisp Interpre เพิ่มความสามารถในการเขียนโปรแกรมให้กับระบบบางระบบเช่น Emacs

การเขียนโปรแกรมเชิงฟังก์ชันเทียบกับการเขียนโปรแกรมเชิงวัตถุ

ตารางต่อไปนี้เน้นความแตกต่างที่สำคัญระหว่างการเขียนโปรแกรมเชิงฟังก์ชันและการเขียนโปรแกรมเชิงวัตถุ -

การเขียนโปรแกรมฟังก์ชั่น OOP
ใช้ข้อมูลที่ไม่เปลี่ยนรูป ใช้ข้อมูลที่ไม่แน่นอน
เป็นไปตามรูปแบบการเขียนโปรแกรมที่เปิดเผย เป็นไปตามรูปแบบการเขียนโปรแกรมที่จำเป็น
โฟกัสอยู่ที่:“ สิ่งที่คุณกำลังทำ” โฟกัสอยู่ที่“ คุณกำลังทำอะไรอยู่”
รองรับการเขียนโปรแกรมแบบขนาน ไม่เหมาะสำหรับการเขียนโปรแกรมแบบขนาน
การทำงานของมันไม่มีผลข้างเคียง วิธีการของมันสามารถก่อให้เกิดผลข้างเคียงที่รุนแรง
Flow Control ทำได้โดยใช้การเรียกใช้ฟังก์ชันและการเรียกฟังก์ชันด้วยการเรียกซ้ำ การควบคุมโฟลว์ทำได้โดยใช้คำสั่งลูปและเงื่อนไข
ใช้แนวคิด "การเรียกซ้ำ" เพื่อทำซ้ำการรวบรวมข้อมูล ใช้แนวคิด "Loop" เพื่อทำซ้ำข้อมูลการรวบรวม ตัวอย่างเช่น: สำหรับแต่ละลูปใน Java
ลำดับการดำเนินการของงบไม่สำคัญนัก ลำดับการดำเนินการของงบมีความสำคัญมาก
รองรับทั้ง "Abstraction over Data" และ "Abstraction over Behavior" รองรับเฉพาะ "Abstraction over Data"

ประสิทธิภาพของรหัสโปรแกรม

ประสิทธิภาพของรหัสโปรแกรมเป็นสัดส่วนโดยตรงกับประสิทธิภาพของอัลกอริทึมและความเร็วในการดำเนินการ ประสิทธิภาพที่ดีช่วยให้มั่นใจได้ถึงประสิทธิภาพที่สูงขึ้น

ปัจจัยที่ส่งผลต่อประสิทธิภาพของโปรแกรมประกอบด้วย -

  • ความเร็วของเครื่อง
  • ความเร็วของคอมไพเลอร์
  • ระบบปฏิบัติการ
  • การเลือกภาษาโปรแกรมที่เหมาะสม
  • วิธีการจัดระเบียบข้อมูลในโปรแกรม
  • อัลกอริทึมที่ใช้ในการแก้ปัญหา

ประสิทธิภาพของภาษาโปรแกรมสามารถปรับปรุงได้โดยดำเนินการดังต่อไปนี้ -

  • โดยการลบรหัสที่ไม่จำเป็นหรือรหัสที่ไปประมวลผลซ้ำซ้อน

  • ด้วยการใช้หน่วยความจำที่เหมาะสมและการจัดเก็บแบบไม่ลบเลือน

  • โดยการใช้ส่วนประกอบที่ใช้ซ้ำได้ทุกที่ที่เกี่ยวข้อง

  • โดยใช้การจัดการข้อผิดพลาดและข้อยกเว้นในทุกชั้นของโปรแกรม

  • ด้วยการสร้างโค้ดการเขียนโปรแกรมที่ทำให้ข้อมูลมีความสมบูรณ์และสอดคล้องกัน

  • ด้วยการพัฒนาโค้ดโปรแกรมที่สอดคล้องกับตรรกะและขั้นตอนการออกแบบ

โค้ดการเขียนโปรแกรมที่มีประสิทธิภาพสามารถลดการใช้ทรัพยากรและเวลาในการดำเนินการให้เสร็จสิ้นได้มากที่สุดโดยมีความเสี่ยงต่อสภาพแวดล้อมการทำงาน

ในแง่การเขียนโปรแกรมก functionเป็นกลุ่มของคำสั่งที่ทำงานเฉพาะ ฟังก์ชันยอมรับข้อมูลประมวลผลและส่งคืนผลลัพธ์ ฟังก์ชันถูกเขียนขึ้นเพื่อสนับสนุนแนวคิดเรื่องการนำกลับมาใช้ใหม่เป็นหลัก เมื่อเขียนฟังก์ชันแล้วสามารถเรียกใช้ได้ง่ายโดยไม่ต้องเขียนโค้ดซ้ำแล้วซ้ำอีก

ภาษาที่ใช้งานต่างกันใช้ไวยากรณ์ที่แตกต่างกันเพื่อเขียนฟังก์ชัน

ข้อกำหนดเบื้องต้นในการเขียนฟังก์ชัน

ก่อนที่จะเขียนฟังก์ชันโปรแกรมเมอร์ต้องทราบประเด็นต่อไปนี้ -

  • ผู้เขียนโปรแกรมควรทราบวัตถุประสงค์ของฟังก์ชัน

  • อัลกอริทึมของฟังก์ชันควรเป็นที่รู้จักสำหรับโปรแกรมเมอร์

  • ผู้เขียนโปรแกรมควรทราบตัวแปรข้อมูลของฟังก์ชันและเป้าหมาย

  • ข้อมูลของฟังก์ชันควรเป็นที่รู้จักสำหรับโปรแกรมเมอร์ที่เรียกโดยผู้ใช้

การควบคุมการไหลของฟังก์ชัน

เมื่อฟังก์ชันถูก "เรียก" โปรแกรมจะ "โอน" ตัวควบคุมเพื่อดำเนินการฟังก์ชันและ "ขั้นตอนการควบคุม" จะเป็นดังนี้ -

  • โปรแกรมไปถึงคำสั่งที่มี "function call"

  • บรรทัดแรกภายในฟังก์ชันจะถูกเรียกใช้งาน

  • คำสั่งทั้งหมดในฟังก์ชันจะดำเนินการจากบนลงล่าง

  • เมื่อเรียกใช้ฟังก์ชันสำเร็จคอนโทรลจะกลับไปที่คำสั่งที่เริ่มต้น

  • ข้อมูลใด ๆ ที่คำนวณและส่งคืนโดยฟังก์ชันจะถูกใช้แทนฟังก์ชันในบรรทัดเดิมของโค้ด

ไวยากรณ์ของฟังก์ชัน

ไวยากรณ์ทั่วไปของฟังก์ชันมีลักษณะดังนี้ -

returnType functionName(type1 argument1, type2 argument2, . . . ) {     
   // function body 
}

การกำหนดฟังก์ชันใน C ++

มาดูตัวอย่างเพื่อทำความเข้าใจว่าฟังก์ชันสามารถกำหนดใน C ++ ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุได้อย่างไร รหัสต่อไปนี้มีฟังก์ชันที่เพิ่มตัวเลขสองตัวและให้ผลลัพธ์เป็นผลลัพธ์

#include <stdio.h> 

int addNum(int a, int b);     // function prototype  

int main() {    
   int sum; 
   sum = addNum(5,6);         // function call 
   printf("sum = %d",sum); 
   return 0; 
}  
int addNum (int a,int b) {    // function definition      
   int result; 
   result = a + b; 
   return result;             // return statement 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Sum = 11

การกำหนดฟังก์ชันใน Erlang

มาดูกันว่าฟังก์ชันเดียวกันนี้สามารถกำหนดได้อย่างไรใน Erlang ซึ่งเป็นภาษาการเขียนโปรแกรมเชิงฟังก์ชัน

-module(helloworld).  
-export([add/2,start/0]).   

add(A,B) ->
   C = A + B,  
   io:fwrite("~w~n",[C]).  
start() ->  
   add(5,6).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

11

ฟังก์ชัน Prototype

ต้นแบบฟังก์ชันคือการประกาศฟังก์ชันที่มีประเภทการส่งคืนชื่อฟังก์ชันและรายการอาร์กิวเมนต์ คล้ายกับนิยามฟังก์ชันโดยไม่มีฟังก์ชัน - ร่างกาย

For Example - ภาษาโปรแกรมบางภาษารองรับการสร้างต้นแบบฟังก์ชันและบางภาษาไม่รองรับ

ใน C ++ เราสามารถสร้างฟังก์ชันต้นแบบของฟังก์ชัน 'sum' ได้เช่นนี้ -

int sum(int a, int b)

Note - ภาษาโปรแกรมเช่น Python, Erlang และอื่น ๆ ไม่รองรับการสร้างต้นแบบฟังก์ชันเราจำเป็นต้องประกาศฟังก์ชันทั้งหมด

การใช้ฟังก์ชันต้นแบบคืออะไร?

คอมไพเลอร์ใช้ฟังก์ชันต้นแบบเมื่อฟังก์ชันถูกเรียกใช้ คอมไพลเลอร์ใช้เพื่อให้แน่ใจว่าประเภทการส่งคืนที่ถูกต้องรายการอาร์กิวเมนต์ที่เหมาะสมจะถูกส่งผ่านและประเภทการส่งคืนของพวกเขาถูกต้อง

ลายเซ็นของฟังก์ชัน

ลายเซ็นของฟังก์ชันจะคล้ายกับต้นแบบของฟังก์ชันซึ่งจำนวนพารามิเตอร์ประเภทข้อมูลของพารามิเตอร์และลำดับของลักษณะที่ปรากฏควรอยู่ในลำดับที่ใกล้เคียงกัน ตัวอย่างเช่น -

void Sum(int a, int b, int c);         // function 1  
void Sum(float a, float b, float c);   // function 2  
void Sum(float a, float b, float c);   // function 3

Function1 และ Function2 มีลายเซ็นที่แตกต่างกัน Function2 และ Function3 มีลายเซ็นเดียวกัน

Note - การโอเวอร์โหลดฟังก์ชันและการแทนที่ฟังก์ชันซึ่งเราจะกล่าวถึงในบทต่อ ๆ ไปนั้นขึ้นอยู่กับแนวคิดของลายเซ็นฟังก์ชัน

  • ฟังก์ชันโอเวอร์โหลดเป็นไปได้เมื่อคลาสมีหลายฟังก์ชันที่มีชื่อเดียวกัน แต่มีลายเซ็นต่างกัน

  • การลบล้างฟังก์ชันเป็นไปได้เมื่อฟังก์ชันคลาสที่ได้รับมีชื่อและลายเซ็นเดียวกันกับคลาสฐาน

ฟังก์ชั่นมีสองประเภท -

  • ฟังก์ชันที่กำหนดไว้ล่วงหน้า
  • ฟังก์ชันที่ผู้ใช้กำหนดเอง

ในบทนี้เราจะพูดถึงรายละเอียดเกี่ยวกับฟังก์ชัน

ฟังก์ชันที่กำหนดไว้ล่วงหน้า

นี่คือฟังก์ชั่นที่สร้างขึ้นในภาษาเพื่อดำเนินการและถูกเก็บไว้ในไลบรารีฟังก์ชันมาตรฐาน

For Example - 'Strcat' ใน C ++ & 'concat' ใน Haskell ใช้เพื่อต่อท้ายสองสตริง 'strlen' ใน C ++ และ 'len' ใน Python ใช้เพื่อคำนวณความยาวสตริง

โปรแกรมพิมพ์ความยาวสตริงใน C ++

โปรแกรมต่อไปนี้แสดงวิธีการพิมพ์ความยาวของสตริงโดยใช้ C ++ -

#include <iostream> 
#include <string.h> 
#include <stdio.h> 
using namespace std;  

int main() {     
   char str[20] = "Hello World"; 
   int len; 
   len = strlen(str); 
   cout<<"String length is: "<<len; 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

String length is: 11

โปรแกรมพิมพ์ความยาวสตริงใน Python

โปรแกรมต่อไปนี้แสดงวิธีการพิมพ์ความยาวของสตริงโดยใช้ Python ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้ -

str = "Hello World"; 
print("String length is: ", len(str))

มันจะสร้างผลลัพธ์ต่อไปนี้ -

('String length is: ', 11)

ฟังก์ชันที่ผู้ใช้กำหนดเอง

ฟังก์ชันที่ผู้ใช้กำหนดเองถูกกำหนดโดยผู้ใช้เพื่อดำเนินการเฉพาะ มีสี่รูปแบบที่แตกต่างกันในการกำหนดฟังก์ชัน -

  • ฟังก์ชันที่ไม่มีอาร์กิวเมนต์และไม่มีค่าส่งคืน
  • ฟังก์ชันที่ไม่มีอาร์กิวเมนต์ แต่เป็นค่าที่ส่งคืน
  • ฟังก์ชันที่มีอาร์กิวเมนต์ แต่ไม่มีค่าส่งคืน
  • ฟังก์ชันที่มีอาร์กิวเมนต์และค่าส่งคืน

ฟังก์ชันที่ไม่มีอาร์กิวเมนต์และไม่มีค่าส่งคืน

โปรแกรมต่อไปนี้แสดงวิธีกำหนดฟังก์ชันโดยไม่มีอาร์กิวเมนต์และไม่มีค่าส่งคืนใน C++ -

#include <iostream> 
using namespace std; 

void function1() { 
   cout <<"Hello World"; 
}  
int main() { 
   function1(); 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Hello World

โปรแกรมต่อไปนี้แสดงให้เห็นว่าคุณสามารถกำหนดฟังก์ชันที่คล้ายกันได้อย่างไร (ไม่มีอาร์กิวเมนต์และไม่มีค่าส่งคืน) ใน Python -

def function1():    
   print ("Hello World") 
    
function1()

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Hello World

ฟังก์ชันที่ไม่มีอาร์กิวเมนต์ แต่เป็นค่าที่ส่งคืน

โปรแกรมต่อไปนี้แสดงวิธีกำหนดฟังก์ชันโดยไม่มีอาร์กิวเมนต์ แต่ส่งคืนค่าเป็น C++ -

#include <iostream> 
using namespace std; 
string function1() { 
   return("Hello World"); 
}  

int main() { 
   cout<<function1(); 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Hello World

โปรแกรมต่อไปนี้แสดงให้เห็นว่าคุณสามารถกำหนดฟังก์ชันที่คล้ายกันได้อย่างไร (โดยไม่มีอาร์กิวเมนต์ แต่เป็นค่าส่งคืน) ใน Python -

def function1(): 
   return "Hello World" 
res = function1() 
print(res)

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Hello World

ฟังก์ชันที่มีอาร์กิวเมนต์ แต่ไม่มีค่าส่งคืน

โปรแกรมต่อไปนี้แสดงวิธีกำหนดฟังก์ชันที่มีอาร์กิวเมนต์ แต่ไม่มีค่าส่งคืนใน C++ -

#include <iostream> 
using namespace std; 
void function1(int x, int y) {    
   int c; 
   c = x+y;  
   cout<<"Sum is: "<<c; 
}  

int main() { 
   function1(4,5); 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Sum is: 9

โปรแกรมต่อไปนี้แสดงวิธีกำหนดฟังก์ชันที่คล้ายกันใน Python -

def function1(x,y): 
   c = x + y 
   print("Sum is:",c) 
function1(4,5)

มันจะสร้างผลลัพธ์ต่อไปนี้ -

('Sum is:', 9)

ฟังก์ชันที่มีอาร์กิวเมนต์และค่าส่งคืน

โปรแกรมต่อไปนี้แสดงวิธีการกำหนดฟังก์ชันใน C ++ โดยไม่มีอาร์กิวเมนต์ แต่เป็นค่าส่งคืน -

#include <iostream> 
using namespace std; 
int function1(int x, int y) {    
   int c; 
   c = x + y;  
   return c;    
} 

int main() {  
   int res; 
   res = function1(4,5); 
   cout<<"Sum is: "<<res; 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Sum is: 9

โปรแกรมต่อไปนี้แสดงวิธีกำหนดฟังก์ชันที่คล้ายกัน (พร้อมอาร์กิวเมนต์และค่าส่งคืน) ใน Python -

def function1(x,y): 
   c = x + y 
   return c  

res = function1(4,5) 
print("Sum is ",res)

มันจะสร้างผลลัพธ์ต่อไปนี้ -

('Sum is ', 9)

หลังจากกำหนดฟังก์ชันแล้วเราต้องส่งอาร์กิวเมนต์เข้าไปเพื่อให้ได้ผลลัพธ์ที่ต้องการ ภาษาโปรแกรมส่วนใหญ่รองรับcall by value และ call by reference วิธีการส่งอาร์กิวเมนต์ไปยังฟังก์ชัน

ในบทนี้เราจะเรียนรู้การทำงานของ "call by value" ในภาษาโปรแกรมเชิงวัตถุเช่น C ++ และภาษาโปรแกรมที่ใช้งานได้เช่น Python

ในวิธีการโทรตามค่าไฟล์ original value cannot be changed. เมื่อเราส่งอาร์กิวเมนต์ไปยังฟังก์ชันฟังก์ชันนั้นจะถูกเก็บไว้ภายในโดยพารามิเตอร์ฟังก์ชันในหน่วยความจำสแตก ดังนั้นค่าจะเปลี่ยนแปลงภายในฟังก์ชันเท่านั้นและจะไม่มีผลกระทบภายนอกฟังก์ชัน

โทรตามค่าใน C ++

โปรแกรมต่อไปนี้แสดงวิธีการทำงานของ Call by Value ใน C ++ -

#include <iostream> 
using namespace std; 

void swap(int a, int b) {    
   int temp; 
   temp = a; 
   a = b; 
   b = temp; 
   cout<<"\n"<<"value of a inside the function: "<<a; 
   cout<<"\n"<<"value of b inside the function: "<<b; 
}  
int main() {     
   int a = 50, b = 70;   
   cout<<"value of a before sending to function: "<<a; 
   cout<<"\n"<<"value of b before sending to function: "<<b; 
   swap(a, b);  // passing value to function 
   cout<<"\n"<<"value of a after sending to function: "<<a; 
   cout<<"\n"<<"value of b after sending to function: "<<b; 
   return 0;   
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

value of a before sending to function:  50 
value of b before sending to function:  70 
value of a inside the function:  70 
value of b inside the function:  50 
value of a after sending to function:  50 
value of b after sending to function:  70

โทรตามค่าใน Python

โปรแกรมต่อไปนี้แสดงวิธีการทำงานของ Call by Value ใน Python -

def swap(a,b): 
   t = a; 
   a = b; 
   b = t; 
   print "value of a inside the function: :",a 
   print "value of b inside the function: ",b 

# Now we can call the swap function 
a = 50 
b = 75 
print "value of a before sending to function: ",a 
print "value of b before sending to function: ",b 
swap(a,b) 
print "value of a after sending to function: ", a 
print "value of b after sending to function: ",b

มันจะสร้างผลลัพธ์ต่อไปนี้ -

value of a before sending to function:  50 
value of b before sending to function:  75 
value of a inside the function: : 75 
value of b inside the function:  50 
value of a after sending to function:  50 
value of b after sending to function:  75

ในการโทรตามการอ้างอิงไฟล์ original value is changedเนื่องจากเราส่งที่อยู่อ้างอิงของอาร์กิวเมนต์ อาร์กิวเมนต์ที่เป็นจริงและเป็นทางการใช้พื้นที่แอดเดรสเดียวกันดังนั้นการเปลี่ยนแปลงค่าใด ๆ ภายในฟังก์ชันจะแสดงภายในและภายนอกฟังก์ชัน

โทรตามการอ้างอิงใน C ++

โปรแกรมต่อไปนี้แสดงวิธีการทำงานของ Call by Value ใน C ++ -

#include <iostream> 
using namespace std; 

void swap(int *a, int *b) {    
   int temp; 
   temp = *a; 
   *a = *b; 
   *b = temp; 
   cout<<"\n"<<"value of a inside the function: "<<*a; 
   cout<<"\n"<<"value of b inside the function: "<<*b; 
}  
int main() {     
   int a = 50, b = 75;   
   cout<<"\n"<<"value of a before sending to function: "<<a; 
   cout<<"\n"<<"value of b before sending to function: "<<b; 
   swap(&a, &b);  // passing value to function 
   cout<<"\n"<<"value of a after sending to function: "<<a; 
   cout<<"\n"<<"value of b after sending to function: "<<b; 
   return 0;   
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

value of a before sending to function:  50 
value of b before sending to function:  75 
value of a inside the function:  75 
value of b inside the function: 50 
value of a after sending to function:  75 
value of b after sending to function:  50

โทรตามการอ้างอิงใน Python

โปรแกรมต่อไปนี้แสดงวิธีการทำงานของ Call by Value ใน Python -

def swap(a,b): 
   t = a; 
   a = b; 
   b = t; 
   print "value of a inside the function: :",a 
   print "value of b inside the function: ",b 
   return(a,b) 
    
# Now we can call swap function 
a = 50 
b =75 
print "value of a before sending to function: ",a 
print "value of b before sending to function: ",b 
x = swap(a,b) 
print "value of a after sending to function: ", x[0] 
print "value of b after sending to function: ",x[1]

มันจะสร้างผลลัพธ์ต่อไปนี้ -

value of a before sending to function:  50 
value of b before sending to function:  75 
value of a inside the function:  75 
value of b inside the function:  50 
value of a after sending to function:  75 
value of b after sending to function:  50

เมื่อเรามีหลายฟังก์ชันที่มีชื่อเดียวกัน แต่มีพารามิเตอร์ต่างกันก็จะมีการกล่าวว่ามีการใช้งานมากเกินไป เทคนิคนี้ใช้เพื่อเพิ่มความสามารถในการอ่านโปรแกรม

มีสองวิธีในการโอเวอร์โหลดฟังก์ชัน ได้แก่ -

  • มีจำนวนอาร์กิวเมนต์ต่างกัน
  • มีประเภทอาร์กิวเมนต์ที่แตกต่างกัน

โดยปกติการโอเวอร์โหลดฟังก์ชันจะเกิดขึ้นเมื่อเราต้องดำเนินการเพียงครั้งเดียวโดยมีจำนวนหรือประเภทของอาร์กิวเมนต์ที่แตกต่างกัน

ฟังก์ชันโอเวอร์โหลดใน C ++

ตัวอย่างต่อไปนี้แสดงให้เห็นว่าฟังก์ชันโอเวอร์โหลดใน C ++ ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุ -

#include <iostream> 
using namespace std;  
void addnum(int,int); 
void addnum(int,int,int); 

int main() {     
   addnum (5,5); 
   addnum (5,2,8); 
   return 0; 
} 

void addnum (int x, int y) {     
   cout<<"Integer number: "<<x+y<<endl; 
} 

void addnum (int x, int y, int z) {     
   cout<<"Float number: "<<x+y+z<<endl; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Integer number: 10 
Float number: 15

ฟังก์ชันโอเวอร์โหลดใน Erlang

ตัวอย่างต่อไปนี้แสดงวิธีดำเนินการฟังก์ชันโอเวอร์โหลดใน Erlang ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้ -

-module(helloworld).  
-export([addnum/2,addnum/3,start/0]).   

addnum(X,Y) ->  
   Z = X+Y,  
   io:fwrite("~w~n",[Z]).  
    
addnum(X,Y,Z) ->  
   A = X+Y+Z,  
   io:fwrite("~w~n",[A]).  
  
start() ->
   addnum(5,5),     addnum(5,2,8).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

10 
15

เมื่อคลาสฐานและคลาสที่ได้รับมีฟังก์ชันสมาชิกที่มีชื่อเดียวกันชนิดส่งคืนเดียวกันและรายการอาร์กิวเมนต์เดียวกันจะกล่าวว่าเป็นการแทนที่ฟังก์ชัน

การแทนที่ฟังก์ชันโดยใช้ C ++

ตัวอย่างต่อไปนี้แสดงวิธีการลบล้างฟังก์ชันใน C ++ ซึ่งเป็นภาษาการเขียนโปรแกรมเชิงวัตถุ -

#include <iostream> 
using namespace std;  

class A {  
   public: 
   void display() {   
      cout<<"Base class"; 
   } 
}; 

class B:public A {  
   public: 
   void display() {   
      cout<<"Derived Class"; 
   } 
}; 

int main() {  
   B obj; 
   obj.display(); 
   return 0;  
}

มันจะสร้างผลลัพธ์ต่อไปนี้

Derived Class

ฟังก์ชันการแทนที่โดยใช้ Python

ตัวอย่างต่อไปนี้แสดงวิธีดำเนินการแทนที่ฟังก์ชันใน Python ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้ -

class A(object): 
   def disp(self): 
      print "Base Class"  
class B(A): 
   def disp(self): 
      print "Derived Class"  
x = A() 
y = B()  
x.disp() 
y.disp()

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Base Class 
Derived Class

ฟังก์ชันที่เรียกตัวเองเรียกว่าฟังก์ชันเรียกซ้ำและเทคนิคนี้เรียกว่าการเรียกซ้ำ คำสั่งการเรียกซ้ำจะดำเนินต่อไปจนกว่าจะมีคำสั่งอื่นป้องกัน

การเรียกซ้ำใน C ++

ตัวอย่างต่อไปนี้แสดงให้เห็นว่าการเรียกซ้ำทำงานอย่างไรใน C ++ ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุ -

#include <stdio.h> 
long int fact(int n);  

int main() { 
   int n; 
   printf("Enter a positive integer: "); 
   scanf("%d", &n); 
   printf("Factorial of %d = %ld", n, fact(n)); 
   return 0; 
} 
long int fact(int n) { 
   if (n >= 1) 
      return n*fact(n-1); 
   else 
      return 1; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้

Enter a positive integer: 5 
Factorial of 5 = 120

การเรียกซ้ำใน Python

ตัวอย่างต่อไปนี้แสดงให้เห็นว่าการเรียกซ้ำทำงานอย่างไรใน Python ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้ -

def fact(n): 
   if n == 1: 
      return n 
   else: 
      return n* fact (n-1)  

# accepts input from user 
num = int(input("Enter a number: "))  
# check whether number is positive or not 

if num < 0: 
   print("Sorry, factorial does not exist for negative numbers") 
else: 
   print("The factorial of " + str(num) +  " is " + str(fact(num)))

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Enter a number: 6
The factorial of 6 is 720

ฟังก์ชันลำดับที่สูงขึ้น (HOF) เป็นฟังก์ชันที่เป็นไปตามเงื่อนไขต่อไปนี้อย่างน้อยหนึ่งข้อ -

  • ใช้ฟังก์ชันหรือมากกว่าเป็นอาร์กิวเมนต์
  • ส่งคืนฟังก์ชันเป็นผลลัพธ์

HOF ใน PHP

ตัวอย่างต่อไปนี้แสดงวิธีการเขียนฟังก์ชันลำดับที่สูงขึ้นใน PHP ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุ -

<?php  
$twice = function($f, $v) { return $f($f($v)); 
};  

$f = function($v) { 
   return $v + 3; }; echo($twice($f, 7));

มันจะสร้างผลลัพธ์ต่อไปนี้ -

13

HOF ใน Python

ตัวอย่างต่อไปนี้แสดงวิธีการเขียนฟังก์ชันลำดับที่สูงขึ้นใน Python ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุ -

def twice(function): 
   return lambda x: function(function(x))  
def f(x): 
   return x + 3 
g = twice(f)
print g(7)

มันจะสร้างผลลัพธ์ต่อไปนี้ -

13

ชนิดข้อมูลกำหนดประเภทของค่าที่วัตถุสามารถมีได้และการดำเนินการใดที่สามารถทำได้ ควรประกาศชนิดข้อมูลก่อนนำไปใช้ ภาษาโปรแกรมที่แตกต่างกันสนับสนุนประเภทข้อมูลที่แตกต่างกัน ตัวอย่างเช่น,

  • C รองรับถ่าน int ลอยยาว ฯลฯ
  • Python รองรับ String, List, Tuple ฯลฯ

ในแง่กว้างประเภทข้อมูลมีสามประเภท -

  • Fundamental data types- เหล่านี้เป็นชนิดข้อมูลที่กำหนดไว้ล่วงหน้าซึ่งโปรแกรมเมอร์ใช้โดยตรงเพื่อจัดเก็บค่าเดียวตามข้อกำหนดเช่นประเภทจำนวนเต็มประเภทอักขระหรือประเภทลอยตัว ตัวอย่างเช่น - int, char, float เป็นต้น

  • Derived data types- ประเภทข้อมูลเหล่านี้ได้มาโดยใช้ประเภทข้อมูลในตัวซึ่งออกแบบโดยโปรแกรมเมอร์เพื่อจัดเก็บค่าประเภทเดียวกันหลายค่าตามความต้องการ ตัวอย่างเช่น - Array, Pointer, function, list เป็นต้น

  • User-defined data types- ประเภทข้อมูลเหล่านี้ได้มาโดยใช้ชนิดข้อมูลในตัวซึ่งรวมอยู่ในประเภทข้อมูลเดียวเพื่อเก็บค่าหลายค่าประเภทเดียวกันหรือต่างประเภทหรือทั้งสองอย่างตามความต้องการ ตัวอย่างเช่น - Class, Structure ฯลฯ

ประเภทข้อมูลที่รองรับโดย C ++

ตารางต่อไปนี้แสดงประเภทข้อมูลที่ C ++ รองรับ -

ประเภทข้อมูล ขนาด พิสัย
ถ่าน 1 ไบต์ -128 ถึง 127 หรือ 0 ถึง 255
ถ่านที่ไม่ได้ลงนาม 1 ไบต์ 0 ถึง 255
ลงนามถ่าน 1 ไบต์ -128 ถึง 127
int 4 ไบต์ -2147483648 ถึง 2147483647
int ที่ไม่ได้ลงนาม 4 ไบต์ 0 ถึง 4294967295
ลงนาม int 4 ไบต์ -2147483648 ถึง 2147483647
int สั้น ๆ 2 ไบต์ -32768 ถึง 32767
int สั้นที่ไม่ได้ลงนาม 2 ไบต์ 0 ถึง 65,535
ลงนามสั้น int 2 ไบต์ -32768 ถึง 32767
int ยาว 4 ไบต์ -2,147,483,648 ถึง 2,147,483,647
ลงนามยาว int 4 ไบต์ -2,147,483,648 ถึง 2,147,483,647
int ยาวที่ไม่ได้ลงนาม 4 ไบต์ 0 ถึง 4,294,967,295
ลอย 4 ไบต์ +/- 3.4e +/- 38 (~ 7 หลัก)
สองเท่า 8 ไบต์ +/- 1.7e +/- 308 (~ 15 หลัก)
คู่ยาว 8 ไบต์ +/- 1.7e +/- 308 (~ 15 หลัก)

ประเภทข้อมูลที่รองรับโดย Java

ชนิดข้อมูลต่อไปนี้รองรับโดย Java -

ประเภทข้อมูล ขนาด พิสัย
ไบต์ 1 ไบต์ -128 ถึง 127
ถ่าน 2 ไบต์ 0 ถึง 65,536
สั้น 2 ไบต์ -32,7688 ถึง 32,767
int 4 ไบต์ -2,147,483,648 ถึง 2,147,483,647
ยาว 8 ไบต์ -9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807
ลอย 4 ไบต์ -2147483648 ถึง 2147483647
สองเท่า 8 ไบต์ + 9.223 * 1018
บูลีน 1 บิต จริงหรือเท็จ

ประเภทข้อมูลที่ Erlang สนับสนุน

ในส่วนนี้เราจะพูดถึงประเภทข้อมูลที่ Erlang รองรับซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้

จำนวน

Erlang รองรับตัวอักษรตัวเลขสองประเภทคือ integer และ float. ดูตัวอย่างต่อไปนี้ที่แสดงวิธีการเพิ่มค่าจำนวนเต็มสองค่า -

-module(helloworld).
-export([start/0]). 
start() -> 
   io:fwrite("~w",[5+4]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

9

อะตอม

อัน atomเป็นสตริงที่ไม่สามารถเปลี่ยนแปลงค่าได้ ต้องขึ้นต้นด้วยตัวอักษรพิมพ์เล็กและมีอักขระที่เป็นตัวเลขและตัวอักษรและอักขระพิเศษได้ เมื่ออะตอมมีอักขระพิเศษจึงควรอยู่ในเครื่องหมายคำพูดเดี่ยว (') ลองดูตัวอย่างต่อไปนี้เพื่อทำความเข้าใจให้ดีขึ้น

-module(helloworld). 
-export([start/0]). 

start()-> 
   io:fwrite(monday).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

monday

Note- ลองเปลี่ยนอะตอมเป็น "วันจันทร์" ด้วยตัวพิมพ์ใหญ่ "M" โปรแกรมจะเกิดข้อผิดพลาด

บูลีน

ชนิดข้อมูลนี้ใช้เพื่อแสดงผลลัพธ์เป็นอย่างใดอย่างหนึ่ง true หรือ false. ลองดูตัวอย่างต่อไปนี้ แสดงวิธีเปรียบเทียบจำนวนเต็มสองจำนวน

-module(helloworld). 
-export([start/0]). 

start() -> 
   io:fwrite(5 =< 9).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

true

บิตสตริง

สตริงบิตใช้เพื่อจัดเก็บพื้นที่ของหน่วยความจำที่ไม่ได้พิมพ์ ลองดูตัวอย่างต่อไปนี้ แสดงวิธีการแปลงสตริงบิต 2 บิตเป็นรายการ

-module(helloworld). 
-export([start/0]). 

start() -> 
   Bin2 = <<15,25>>, 
   P = binary_to_list(Bin2), 
   io:fwrite("~w",[P]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

[15,25]

ทูเพิล

ทูเพิลเป็นชนิดข้อมูลผสมที่มีจำนวนคำศัพท์คงที่ แต่ละเทอมของทูเปิลเรียกว่าelement. จำนวนองค์ประกอบคือขนาดของทูเปิล ตัวอย่างต่อไปนี้แสดงวิธีกำหนด tuple 5 คำและพิมพ์ขนาด

-module(helloworld).  
-export([start/0]).  

start() ->  
   K = {abc,50,pqr,60,{xyz,75}} ,  
   io:fwrite("~w",[tuple_size(K)]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

5

แผนที่

แผนที่เป็นชนิดข้อมูลผสมที่มีการเชื่อมโยงคีย์ - ค่าจำนวนตัวแปร การเชื่อมโยงคีย์ - ค่าแต่ละรายการในแผนที่เรียกว่าไฟล์association-pair. key และ value ส่วนต่างๆของทั้งคู่เรียกว่า elements. จำนวนคู่ - สมาคมบอกเป็นขนาดของแผนที่ ตัวอย่างต่อไปนี้แสดงวิธีกำหนดแผนที่ 3 การแมปและพิมพ์ขนาด

-module(helloworld).  
-export([start/0]).  
 
start() ->  
   Map1 = #{name => 'abc',age => 40, gender => 'M'},  
   io:fwrite("~w",[map_size(Map1)]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

3

รายการ

รายการคือชนิดข้อมูลผสมที่มีจำนวนคำที่แปรผัน แต่ละคำในรายการเรียกว่าองค์ประกอบ จำนวนองค์ประกอบเป็นความยาวของรายการ ตัวอย่างต่อไปนี้แสดงวิธีกำหนดรายการ 5 รายการและพิมพ์ขนาด

-module(helloworld).  
-export([start/0]).  

start() ->  
   List1 = [10,15,20,25,30] ,  
   io:fwrite("~w",[length(List1)]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

5

Note - ไม่ได้กำหนดประเภทข้อมูล 'สตริง' ใน Erlang

Polymorphism ในแง่ของการเขียนโปรแกรมหมายถึงการนำรหัสเดียวกลับมาใช้ซ้ำหลาย ๆ ครั้ง โดยเฉพาะอย่างยิ่งความสามารถของโปรแกรมในการประมวลผลวัตถุที่แตกต่างกันขึ้นอยู่กับประเภทข้อมูลหรือคลาส

ความหลากหลายเป็นสองประเภท -

  • Compile-time Polymorphism - ความหลากหลายประเภทนี้สามารถทำได้โดยใช้วิธีการโอเวอร์โหลด

  • Run-time Polymorphism - ความหลากหลายประเภทนี้สามารถทำได้โดยใช้วิธีการแทนที่และฟังก์ชันเสมือน

ข้อดีของ Polymorphism

Polymorphism มีข้อดีดังต่อไปนี้ -

  • ช่วยให้โปรแกรมเมอร์สามารถนำโค้ดกลับมาใช้ใหม่ได้กล่าวคือคลาสที่เขียนทดสอบและใช้งานแล้วสามารถนำกลับมาใช้ใหม่ได้ตามต้องการ ประหยัดเวลาได้มาก

  • ตัวแปรเดียวสามารถใช้เพื่อจัดเก็บข้อมูลหลายประเภท

  • ง่ายต่อการดีบักรหัส

ประเภทข้อมูลแบบ Polymorphic

ชนิดข้อมูลแบบ Polymorphic สามารถใช้งานได้โดยใช้พอยน์เตอร์ทั่วไปที่จัดเก็บไบต์แอดเดรสเท่านั้นโดยไม่ต้องจัดประเภทข้อมูลที่อยู่หน่วยความจำนั้น ตัวอย่างเช่น,

function1(void *p, void *q)

ที่ไหน p และ q เป็นตัวชี้ทั่วไปที่สามารถถือได้ int, float (หรืออื่น ๆ ) เป็นค่าอาร์กิวเมนต์

ฟังก์ชัน Polymorphic ใน C ++

โปรแกรมต่อไปนี้แสดงวิธีใช้ฟังก์ชัน polymorphic ใน C ++ ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุ

#include <iostream> 
Using namespace std: 

class A {  
   public: 
   void show() {    
      cout << "A class method is called/n"; 
   } 
}; 

class B:public A { 
   public: 
   void show() {   
      cout << "B class method is called/n"; 
   } 
};  

int main() {   
   A x;        // Base class object 
   B y;        // Derived class object 
   x.show();   // A class method is called 
   y.show();   // B class method is called 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

A class method is called 
B class method is called

ฟังก์ชัน Polymorphic ใน Python

โปรแกรมต่อไปนี้แสดงวิธีใช้ฟังก์ชัน polymorphic ใน Python ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้

class A(object): 
   def show(self): 
      print "A class method is called" 
  
class B(A): 
   def show(self): 
      print "B class method is called" 
  
def checkmethod(clasmethod): 
   clasmethod.show()  

AObj = A() 
BObj = B() 
  
checkmethod(AObj) 
checkmethod(BObj)

มันจะสร้างผลลัพธ์ต่อไปนี้ -

A class method is called 
B class method is called

stringคือกลุ่มอักขระที่มีช่องว่าง เราสามารถพูดได้ว่ามันเป็นอาร์เรย์หนึ่งมิติของอักขระซึ่งถูกยุติโดยอักขระ NULL ('\ 0') สตริงสามารถถือได้ว่าเป็นคลาสที่กำหนดไว้ล่วงหน้าซึ่งได้รับการสนับสนุนโดยภาษาโปรแกรมส่วนใหญ่เช่น C, C ++, Java, PHP, Erlang, Haskell, Lisp และอื่น ๆ

ภาพต่อไปนี้แสดงให้เห็นว่าสตริง "Tutorial" จะมีลักษณะอย่างไรในหน่วยความจำ

สร้างสตริงใน C ++

โปรแกรมต่อไปนี้เป็นตัวอย่างที่แสดงวิธีการสร้างสตริงใน C ++ ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุ

#include <iostream> 
using namespace std; 

int main () {    
   char greeting[20] = {'H', 'o', 'l', 'i', 'd', 'a', 'y', '\0'}; 
   cout << "Today is: "; 
   cout << greeting << endl; 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Today is: Holiday

สตริงใน Erlang

โปรแกรมต่อไปนี้เป็นตัวอย่างที่แสดงวิธีการสร้างสตริงใน Erlang ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้

-module(helloworld).  
-export([start/0]).   
start() -> 
   Str = "Today is: Holiday",  
   io:fwrite("~p~n",[Str]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

"Today is: Holiday"

การดำเนินการสตริงใน C ++

ภาษาโปรแกรมที่แตกต่างกันสนับสนุนวิธีการที่แตกต่างกันบนสตริง ตารางต่อไปนี้แสดงวิธีการสตริงที่กำหนดไว้ล่วงหน้าซึ่ง C ++ รองรับ

ส. วิธีการและคำอธิบาย
1

Strcpy(s1,s2)

คัดลอกสตริง s2 ลงในสตริง s1

2

Strcat(s1,s2)

เพิ่มสตริง s2 ที่ท้าย s1

3

Strlen(s1)

ให้ความยาวของสตริง s1

4

Strcmp(s1,s2)

จะคืนค่า 0 เมื่อสตริง s1 & s2 เหมือนกัน

5

Strchr(s1,ch)

ส่งกลับตัวชี้ไปยังอักขระ ch ที่เกิดขึ้นครั้งแรกในสตริง s1

6

Strstr(s1,s2)

ส่งกลับตัวชี้ไปยังสตริง s2 ที่เกิดขึ้นครั้งแรกในสตริง s1

โปรแกรมต่อไปนี้แสดงวิธีการข้างต้นสามารถใช้ใน C ++ -

#include <iostream> 
#include <cstring> 
using namespace std; 

int main () {   
   char str1[20] = "Today is "; 
   char str2[20] = "Monday"; 
   char str3[20]; 
   int  len ;  
   strcpy( str3, str1); // copy str1 into str3 
   cout << "strcpy( str3, str1) : " << str3 << endl;  

   strcat( str1, str2); // concatenates str1 and str2 
   cout << "strcat( str1, str2): " << str1 << endl;  

   len = strlen(str1);  // String length after concatenation 
   cout << "strlen(str1) : " << len << endl; 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

strcpy(str3, str1)   :  Today is 
strcat(str1, str2)   :  Today is Monday 
strlen(str1)         :  15

การทำงานของสตริงใน Erlang

ตารางต่อไปนี้แสดงรายการวิธีการสตริงที่กำหนดไว้ล่วงหน้าที่ Erlang สนับสนุน

ส. วิธีการและคำอธิบาย
1

len(s1)

ส่งคืนจำนวนอักขระในสตริงที่กำหนด

2

equal(s1,s2)

จะคืนค่าจริงเมื่อสตริง s1 & s2 เท่ากับมิฉะนั้นจะส่งคืนเท็จ

3

concat(s1,s2)

เพิ่มสตริง s2 ที่ท้ายสตริง s1

4

str(s1,ch)

ส่งคืนตำแหน่งดัชนีของอักขระ ch ในสตริง s1

5

str (s1,s2)

ส่งคืนตำแหน่งดัชนีของ s2 ในสตริง s1

6

substr(s1,s2,num)

วิธีนี้ส่งคืนสตริง s2 จากสตริง s1 ตามตำแหน่งเริ่มต้นและจำนวนอักขระจากตำแหน่งเริ่มต้น

7

to_lower(s1)

วิธีนี้ส่งคืนสตริงเป็นตัวพิมพ์เล็ก

โปรแกรมต่อไปนี้แสดงวิธีใช้วิธีการข้างต้นใน Erlang

-module(helloworld).  
-import(string,[concat/2]).  
-export([start/0]).  
   start() ->  
   S1 = "Today is ",  
   S2 = "Monday",  
   S3 = concat(S1,S2),  
   io:fwrite("~p~n",[S3]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

"Today is Monday"

Listเป็นประเภทข้อมูลที่หลากหลายที่สุดที่มีอยู่ในภาษาโปรแกรมที่ใช้งานได้ซึ่งใช้ในการจัดเก็บชุดข้อมูลที่คล้ายคลึงกัน แนวคิดนี้คล้ายกับอาร์เรย์ในการเขียนโปรแกรมเชิงวัตถุ สามารถเขียนรายการในวงเล็บเหลี่ยมคั่นด้วยลูกน้ำ วิธีการเขียนข้อมูลลงในรายการจะแตกต่างกันไปในแต่ละภาษา

โปรแกรมสร้างรายการตัวเลขใน Java

รายการไม่ใช่ชนิดข้อมูลใน Java / C / C ++ แต่เรามีวิธีอื่นในการสร้างรายการใน Java กล่าวคือโดยใช้ ArrayList และ LinkedList.

ตัวอย่างต่อไปนี้แสดงวิธีสร้างรายการใน Java ที่นี่เรากำลังใช้วิธีการเชื่อมโยงรายการเพื่อสร้างรายการตัวเลข

import java.util.*; 
import java.lang.*; 
import java.io.*;  

/* Name of the class has to be "Main" only if the class is public. */ 

public class HelloWorld { 
   public static void main (String[] args) throws java.lang.Exception { 
      List<String> listStrings = new LinkedList<String>(); 
      listStrings.add("1"); 
      listStrings.add("2"); 
      listStrings.add("3"); 
      listStrings.add("4"); 
      listStrings.add("5"); 
  
      System.out.println(listStrings); 
   } 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

[1, 2, 3, 4, 5]

โปรแกรมสร้างรายการตัวเลขใน Erlang

-module(helloworld).  
-export([start/0]).   

start() ->  
   Lst = [1,2,3,4,5],  
   io:fwrite("~w~n",[Lst]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

[1 2 3 4 5]

แสดงรายการการดำเนินการใน Java

ในส่วนนี้เราจะพูดถึงการดำเนินการบางอย่างที่สามารถทำได้ในรายการใน Java

การเพิ่มองค์ประกอบลงในรายการ

วิธีการเพิ่ม (Object), เพิ่ม (ดัชนี, วัตถุ), addAll () ใช้เพื่อเพิ่มองค์ประกอบลงในรายการ ตัวอย่างเช่น,

ListStrings.add(3, “three”)

การลบองค์ประกอบออกจากรายการ

วิธีการลบ (ดัชนี) หรือลบวัตถุ () ใช้เพื่อลบองค์ประกอบออกจากรายการ ตัวอย่างเช่น,

ListStrings.remove(3,”three”)

Note - ในการลบองค์ประกอบทั้งหมดออกจากรายการจะใช้วิธี clear ()

การดึงองค์ประกอบจากรายการ

เมธอด get () ใช้เพื่อดึงข้อมูลองค์ประกอบจากรายการในตำแหน่งที่ระบุ เมธอด getfirst () & getlast () สามารถใช้ได้ในคลาส LinkedList ตัวอย่างเช่น,

String str = ListStrings.get(2)

การอัปเดตองค์ประกอบในรายการ

วิธี set (ดัชนีองค์ประกอบ) ใช้เพื่ออัพเดตองค์ประกอบที่ดัชนีที่ระบุด้วยองค์ประกอบที่ระบุ ตัวอย่างเช่น,

listStrings.set(2,”to”)

การจัดเรียงองค์ประกอบในรายการ

วิธีการ collection.sort () และ collection.reverse () ใช้เพื่อเรียงลำดับรายการจากน้อยไปมากหรือมากไปหาน้อย ตัวอย่างเช่น,

Collection.sort(listStrings)

การค้นหาองค์ประกอบในรายการ

สามวิธีต่อไปนี้ใช้ตามข้อกำหนด -

Boolean contains(Object) วิธีการส่งคืน true หากรายการมีองค์ประกอบที่ระบุมิฉะนั้นจะส่งคืน false.

int indexOf(Object) วิธีการส่งคืนดัชนีของการเกิดขึ้นครั้งแรกขององค์ประกอบที่ระบุในรายการมิฉะนั้นจะส่งกลับ -1 เมื่อไม่พบองค์ประกอบ

int lastIndexOf(Object) ส่งคืนดัชนีของการเกิดครั้งสุดท้ายขององค์ประกอบที่ระบุในรายการมิฉะนั้นจะคืนค่า -1 เมื่อไม่พบองค์ประกอบ

รายการปฏิบัติการใน Erlang

ในส่วนนี้เราจะพูดถึงการดำเนินการบางอย่างที่สามารถทำได้ในรายการใน Erlang

การเพิ่มสองรายการ

วิธีการผนวก (listfirst, listecond) ใช้เพื่อสร้างรายการใหม่โดยเพิ่มสองรายการ ตัวอย่างเช่น,

append(list1,list2)

การลบองค์ประกอบ

วิธีการลบ (องค์ประกอบชื่อรายการ) ใช้เพื่อลบองค์ประกอบที่ระบุออกจากรายการและส่งคืนรายการใหม่ ตัวอย่างเช่น,

delete(5,list1)

การลบองค์ประกอบสุดท้ายออกจากรายการ

วิธี droplast (listname) ใช้เพื่อลบองค์ประกอบสุดท้ายออกจากรายการและส่งคืนรายการใหม่ ตัวอย่างเช่น,

droplast(list1)

กำลังค้นหาองค์ประกอบ

เมธอด member (element, listname) ถูกใช้เพื่อค้นหาอิลิเมนต์ในรายการหากพบว่าจะส่งคืนค่า true มิฉะนั้นจะส่งกลับเท็จ ตัวอย่างเช่น,

member(5,list1)

รับค่าสูงสุดและต่ำสุด

วิธีการ max (listname) และ min (listname) ใช้เพื่อค้นหาค่าสูงสุดและต่ำสุดในรายการ ตัวอย่างเช่น,

max(list1)

การจัดเรียงองค์ประกอบรายการ

วิธีการเรียงลำดับ (listname) และ reverse (listname) ใช้เพื่อเรียงลำดับรายการจากน้อยไปมากหรือมากไปหาน้อย ตัวอย่างเช่น,

sort(list1)

การเพิ่มองค์ประกอบรายการ

วิธี sum (listname) ใช้เพื่อเพิ่มองค์ประกอบทั้งหมดของรายการและส่งคืนผลรวม ตัวอย่างเช่น,

sum(list1)

เรียงลำดับรายการจากน้อยไปมากและจากมากไปหาน้อยโดยใช้ Java

โปรแกรมต่อไปนี้แสดงวิธีการเรียงลำดับรายการจากน้อยไปหามากโดยใช้ Java -

import java.util.*; 
import java.lang.*; 
import java.io.*;  

public class SortList { 
   public static void main (String[] args) throws java.lang.Exception { 
      List<String> list1 = new ArrayList<String>(); 
      list1.add("5"); 
      list1.add("3"); 
      list1.add("1"); 
      list1.add("4"); 
      list1.add("2"); 
  
      System.out.println("list before sorting: " + list1); 
  
      Collections.sort(list1); 
  
      System.out.println("list in ascending order: " + list1); 
      Collections.reverse(list1); 
  
      System.out.println("list in dsending order: " + list1); 
   } 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

list before sorting     : [5, 3, 1, 4, 2] 
list in ascending order : [1, 2, 3, 4, 5] 
list in dsending order  : [5, 4, 3, 2, 1]

จัดเรียงรายการจากน้อยไปมากโดยใช้ Erlang

โปรแกรมต่อไปนี้แสดงวิธีการเรียงลำดับรายการจากน้อยไปมากและจากมากไปหาน้อยโดยใช้ Erlang ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้ -

-module(helloworld).  
-import(lists,[sort/1]).  
-export([start/0]).   

start() ->  
   List1 = [5,3,4,2,1],  
   io:fwrite("~p~n",[sort(List1)]),

มันจะสร้างผลลัพธ์ต่อไปนี้ -

[1,2,3,4,5]

ทูเพิลเป็นชนิดข้อมูลผสมที่มีจำนวนคำศัพท์คงที่ แต่ละเทอมในทูเปิลเรียกว่าelement. จำนวนองค์ประกอบคือขนาดของทูเปิล

โปรแกรมกำหนดทูเพิลใน C #

โปรแกรมต่อไปนี้แสดงวิธีการกำหนดทูเพิลสี่คำและพิมพ์โดยใช้ C # ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุ

using System; 
public class Test { 
   public static void Main() { 
      var t1 = Tuple.Create(1, 2, 3, new Tuple<int, int>(4, 5));   
      Console.WriteLine("Tuple:" + t1);    
   } 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Tuple :(1, 2, 3, (4, 5))

โปรแกรมกำหนดทูเพิลใน Erlang

โปรแกรมต่อไปนี้แสดงวิธีกำหนดทูเพิลสี่คำและพิมพ์โดยใช้ Erlang ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้

-module(helloworld).  
-export([start/0]).   

start() -> 
   P = {1,2,3,{4,5}} ,  
   io:fwrite("~w",[P]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

{1, 2, 3, {4, 5}}

ข้อดีของ Tuple

Tuples มีข้อดีดังต่อไปนี้ -

  • สิ่งทอมีขนาดที่ถูกปรับตามธรรมชาติเช่นเราไม่สามารถเพิ่ม / ลบองค์ประกอบไปยัง / จากทูเปิลได้

  • เราสามารถค้นหาองค์ประกอบใดก็ได้ในทูเพิล

  • Tuples เร็วกว่ารายการเนื่องจากมีชุดค่าคงที่

  • Tuples สามารถใช้เป็นคีย์พจนานุกรมได้เนื่องจากมีค่าที่ไม่เปลี่ยนรูปเช่นสตริงตัวเลข ฯลฯ

Tuples vs Lists

ทูเพิล รายการ
ทูเปิลคือ immutableกล่าวคือเราไม่สามารถอัปเดตข้อมูลได้ รายการคือ mutableกล่าวคือเราสามารถอัปเดตข้อมูลได้
องค์ประกอบในทูเปิลอาจเป็นประเภทต่างๆ องค์ประกอบทั้งหมดในรายการเป็นประเภทเดียวกัน
Tuples แสดงด้วยวงเล็บกลมรอบ ๆ องค์ประกอบ รายการแสดงด้วยวงเล็บเหลี่ยมรอบ ๆ องค์ประกอบ

การดำเนินการกับทูเปิล

ในส่วนนี้เราจะพูดถึงการดำเนินการบางอย่างที่สามารถทำได้กับทูเพิล

ตรวจสอบว่าค่าที่แทรกเป็น Tuple หรือไม่

วิธีการ is_tuple(tuplevalues)ใช้เพื่อพิจารณาว่าค่าที่แทรกเป็นทูเปิลหรือไม่ มันกลับมาtrue เมื่อค่าที่แทรกเป็นทูเปิลมิฉะนั้นจะส่งกลับ false. ตัวอย่างเช่น,

-module(helloworld).  
-export([start/0]).  

start() ->  
   K = {abc,50,pqr,60,{xyz,75}} , io:fwrite("~w",[is_tuple(K)]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

True

การแปลงรายชื่อเป็นทูเพิล

วิธีการ list_to_tuple(listvalues)แปลงรายการเป็นทูเพิล ตัวอย่างเช่น,

-module(helloworld).  
-export([start/0]).  

start() ->  
   io:fwrite("~w",[list_to_tuple([1,2,3,4,5])]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

{1, 2, 3, 4, 5}

การแปลงทูเพิลเป็นรายการ

วิธีการ tuple_to_list(tuplevalues)แปลงทูเพิลที่ระบุเป็นรูปแบบรายการ ตัวอย่างเช่น,

-module(helloworld).  
-export([start/0]).  

start() ->  
   io:fwrite("~w",[tuple_to_list({1,2,3,4,5})]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

[1, 2, 3, 4, 5]

ตรวจสอบขนาดทูเพิล

วิธีการ tuple_size(tuplename)ส่งคืนขนาดของทูเปิล ตัวอย่างเช่น,

-module(helloworld).  
-export([start/0]).  

start() ->  
   K = {abc,50,pqr,60,{xyz,75}} ,  
   io:fwrite("~w",[tuple_size(K)]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

5

เร็กคอร์ดคือโครงสร้างข้อมูลสำหรับการจัดเก็บองค์ประกอบจำนวนคงที่ มันคล้ายกับโครงสร้างในภาษาซี ในช่วงเวลาของการคอมไพล์นิพจน์จะถูกแปลเป็นนิพจน์ทูเพิล

จะสร้างบันทึกได้อย่างไร?

คำสำคัญ 'record' ใช้เพื่อสร้างเรกคอร์ดที่ระบุด้วยชื่อเรกคอร์ดและฟิลด์ ไวยากรณ์มีดังนี้ -

record(recodname, {field1, field2, . . fieldn})

ไวยากรณ์ที่จะแทรกค่าลงในเรกคอร์ดคือ -

#recordname {fieldName1 = value1, fieldName2 = value2 .. fieldNamen = valuen}

โปรแกรมสร้างบันทึกโดยใช้ Erlang

ในตัวอย่างต่อไปนี้เราได้สร้างบันทึกชื่อ student มีสองฟิลด์กล่าวคือ sname และ sid.

-module(helloworld).  
-export([start/0]).  
-record(student, {sname = "", sid}).   

start() ->  
   S = #student{sname = "Sachin",sid = 5}.

โปรแกรมสร้างบันทึกโดยใช้ C ++

ตัวอย่างต่อไปนี้แสดงวิธีสร้างเร็กคอร์ดโดยใช้ C ++ ซึ่งเป็นภาษาโปรแกรมเชิงวัตถุ -

#include<iostream> 
#include<string>
using namespace std; 

class student {
   public: 
   string sname; 
   int sid; 
   15 
}; 

int main() {    
   student S;  
   S.sname = "Sachin"; 
   S.sid = 5; 
   return 0;  
}

โปรแกรมเข้าถึงบันทึกค่าโดยใช้ Erlang

โปรแกรมต่อไปนี้แสดงให้เห็นว่าค่าบันทึกการเข้าถึงโดยใช้ Erlang ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้ -

-module(helloworld).  
-export([start/0]).  
-record(student, {sname = "", sid}).   

start() ->  
   S = #student{sname = "Sachin",sid = 5},  
   io:fwrite("~p~n",[S#student.sid]),  
   io:fwrite("~p~n",[S#student.sname]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

5 
"Sachin"

โปรแกรมเข้าถึงบันทึกค่าโดยใช้ C ++

โปรแกรมต่อไปนี้แสดงวิธีการเข้าถึงบันทึกค่าโดยใช้ C ++ -

#include<iostream> 
#include<string> 
using namespace std; 

class student {     
   public: 
   string sname; 
   int sid; 
}; 

int main() {     
   student S;  
   S.sname = "Sachin"; 
   S.sid = 5; 
   cout<<S.sid<<"\n"<<S.sname;  
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

5 
Sachin

สามารถอัปเดตค่าของเรกคอร์ดได้โดยการเปลี่ยนค่าเป็นฟิลด์เฉพาะจากนั้นกำหนดเร็กคอร์ดนั้นเป็นชื่อตัวแปรใหม่ ดูสองตัวอย่างต่อไปนี้เพื่อทำความเข้าใจวิธีการทำงานโดยใช้ภาษาโปรแกรมเชิงวัตถุและใช้งานได้

โปรแกรมปรับปรุงบันทึกค่าโดยใช้ Erlang

โปรแกรมต่อไปนี้แสดงวิธีการอัพเดตค่าเรกคอร์ดโดยใช้ Erlang -

-module(helloworld).  
-export([start/0]).  
-record(student, {sname = "", sid}).   

start() ->  
   S = #student{sname = "Sachin",sid = 5},  
   S1 = S#student{sname = "Jonny"},  
   io:fwrite("~p~n",[S1#student.sid]),  
   io:fwrite("~p~n",[S1#student.sname]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

5
"Jonny"

โปรแกรมปรับปรุงบันทึกค่าโดยใช้ C ++

โปรแกรมต่อไปนี้แสดงวิธีการอัพเดตค่าเรกคอร์ดโดยใช้ C ++ -

#include<iostream> 
#include<string> 
using namespace std;  

class student {    
   public: 
   string sname; 
   int sid; 
};  

int main() {     
   student S;  
   S.sname = "Jonny"; 
   S.sid = 5; 
   cout<<S.sname<<"\n"<<S.sid; 
   cout<<"\n"<< "value after updating"<<"\n"; 
   S.sid = 10; 
   cout<<S.sname<<"\n"<<S.sid; 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Jonny 
5 
value after updating 
Jonny 
10

แคลคูลัสแลมบ์ดาเป็นโครงร่างที่พัฒนาโดย Alonzo Church ในปี 1930 เพื่อศึกษาการคำนวณด้วยฟังก์ชัน

  • Function creation - คริสตจักรแนะนำสัญกรณ์ λx.Eเพื่อแสดงถึงฟังก์ชันซึ่ง 'x' เป็นอาร์กิวเมนต์ที่เป็นทางการและ 'E' คือเนื้อความที่ใช้งานได้ ฟังก์ชันเหล่านี้สามารถไม่มีชื่อและอาร์กิวเมนต์เดียว

  • Function application - คริสตจักรใช้สัญกรณ์ E1.E2 เพื่อแสดงถึงการประยุกต์ใช้ฟังก์ชัน E1 เพื่อโต้แย้งจริง E2. และฟังก์ชันทั้งหมดอยู่ในอาร์กิวเมนต์เดียว

ไวยากรณ์ของแลมบ์ดาแคลคูลัส

แคลคูลัส Lamdba ประกอบด้วยนิพจน์สามประเภท ได้แก่

E :: = x (ตัวแปร)

| E 1 E 2 (แอปพลิเคชันฟังก์ชัน)

| λx.E (การสร้างฟังก์ชัน)

ที่ไหน λx.E เรียกว่าแลมบ์ดานามธรรมและ E เรียกว่าλ - นิพจน์

การประเมิน Lambda Calculus

แคลคูลัสแลมบ์ดาบริสุทธิ์ไม่มีฟังก์ชันในตัว ให้เราประเมินนิพจน์ต่อไปนี้ -

(+ (* 5 6) (* 8 3))

ที่นี่เราไม่สามารถเริ่มต้นด้วย "+" ได้เพราะมันทำงานกับตัวเลขเท่านั้น มีสองนิพจน์ที่ลดลงได้: (* 5 6) และ (* 8 3)

เราลดอย่างใดอย่างหนึ่งก่อนก็ได้ ตัวอย่างเช่น -

(+ (* 5 6) (* 8 3)) 
(+ 30 (* 8 3)) 
(+ 30 24) 
= 54

β-กฎการลด

เราต้องการกฎการลดเพื่อจัดการกับ

(λx . * 2 x) 4 
(* 2 4) 
= 8

สิ่งนี้เรียกว่าβ-reduction

อาจใช้พารามิเตอร์ที่เป็นทางการหลายครั้ง -

(λx . + x x) 4 
(+ 4 4) 
= 8

เมื่อมีคำศัพท์หลายคำเราสามารถจัดการได้ดังนี้ -

(λx . (λx . + (− x 1)) x 3) 9

ด้านใน x เป็นของภายใน λ และ x ด้านนอกเป็นของด้านนอก

(λx . + (− x 1)) 9 3 
+ (− 9 1) 3 
+ 8 3 
= 11

ตัวแปรฟรีและถูกผูกไว้

ในนิพจน์ลักษณะที่ปรากฏของตัวแปรแต่ละตัวจะเป็น "อิสระ" (ถึงλ) หรือ "ผูก" (ถึง a λ)

β-ลดของ (λx . E) y แทนที่ทุก x ที่เกิดขึ้นฟรีใน E ด้วย y. ตัวอย่างเช่น -

การลดอัลฟา

การลดอัลฟาทำได้ง่ายมากและสามารถทำได้โดยไม่ต้องเปลี่ยนความหมายของนิพจน์แลมบ์ดา

λx . (λx . x) (+ 1 x) ↔ α λx . (λy . y) (+ 1 x)

ตัวอย่างเช่น -

(λx . (λx . + (− x 1)) x 3) 9 
(λx . (λy . + (− y 1)) x 3) 9 
(λy . + (− y 1)) 9 3 
+ (− 9 1) 3 
+ 8 3 
11

ทฤษฎีบทของ Church-Rosser

ทฤษฎีบทของ Church-Rosser ระบุดังต่อไปนี้ -

  • ถ้า E1 ↔ E2 จะมี E อยู่เช่นนั้น E1 → E และ E2 → E“ การลดลงด้วยวิธีใด ๆ ก็สามารถให้ผลลัพธ์เดียวกันได้ในที่สุด”

  • ถ้า E1 → E2 และ E2 เป็นรูปแบบปกติจะมีการลดลำดับปกติของ E1 เป็น E2 “ การลดคำสั่งปกติจะทำให้เกิดรูปแบบปกติเสมอหากมีอยู่”

การประเมินผลแบบขี้เกียจเป็นกลยุทธ์การประเมินผลซึ่งถือการประเมินผลของนิพจน์จนกว่าจะต้องการค่า หลีกเลี่ยงการประเมินซ้ำ ๆHaskell เป็นตัวอย่างที่ดีของภาษาโปรแกรมที่ใช้งานได้ซึ่งมีพื้นฐานมาจาก Lazy Evaluation

Lazy evaluation ใช้ในฟังก์ชัน Unix map เพื่อปรับปรุงประสิทธิภาพโดยการโหลดเฉพาะหน้าที่ต้องการจากดิสก์ จะไม่มีการจัดสรรหน่วยความจำสำหรับหน้าที่เหลือ

การประเมินความเกียจคร้าน - ข้อดี

  • อนุญาตให้รันไทม์ภาษาทิ้งนิพจน์ย่อยที่ไม่ได้เชื่อมโยงโดยตรงกับผลลัพธ์สุดท้ายของนิพจน์

  • ช่วยลดความซับซ้อนของเวลาของอัลกอริทึมโดยการละทิ้งการคำนวณและเงื่อนไขชั่วคราว

  • ช่วยให้โปรแกรมเมอร์สามารถเข้าถึงส่วนประกอบของโครงสร้างข้อมูลที่ไม่อยู่ในลำดับหลังจากกำหนดค่าเริ่มต้นได้ตราบเท่าที่พวกเขาไม่ต้องพึ่งพาการอ้างอิงแบบวงกลมใด ๆ

  • เหมาะที่สุดสำหรับการโหลดข้อมูลซึ่งจะเข้าถึงได้ไม่บ่อยนัก

การประเมินความเกียจคร้าน - ข้อเสีย

  • มันบังคับให้รันไทม์ของภาษาเก็บการประเมินนิพจน์ย่อยไว้จนกว่าจะต้องการในผลลัพธ์สุดท้ายโดยการสร้าง thunks (วัตถุล่าช้า)

  • บางครั้งก็เพิ่มความซับซ้อนของพื้นที่ของอัลกอริทึม

  • เป็นเรื่องยากมากที่จะพบประสิทธิภาพของมันเนื่องจากมีการแสดงออกมากมายก่อนที่จะดำเนินการ

Lazy Evaluation โดยใช้ Python

rangeวิธีการใน Python เป็นไปตามแนวคิดของ Lazy Evaluation ช่วยประหยัดเวลาในการดำเนินการสำหรับช่วงที่ใหญ่ขึ้นและเราไม่ต้องการค่าทั้งหมดในคราวเดียวดังนั้นจึงช่วยประหยัดการใช้หน่วยความจำด้วย ลองดูตัวอย่างต่อไปนี้

r = range(10) 
print(r) 
range(0, 10) 
print(r[3])

มันจะสร้างผลลัพธ์ต่อไปนี้ -

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
3

เราต้องการไฟล์เพื่อเก็บผลลัพธ์ของโปรแกรมเมื่อโปรแกรมยุติการทำงาน การใช้ไฟล์เราสามารถเข้าถึงข้อมูลที่เกี่ยวข้องโดยใช้คำสั่งต่างๆในภาษาต่างๆ

นี่คือรายการของการดำเนินการบางอย่างที่สามารถทำได้ในไฟล์ -

  • การสร้างไฟล์ใหม่
  • เปิดไฟล์ที่มีอยู่
  • การอ่านเนื้อหาไฟล์
  • การค้นหาข้อมูลในไฟล์
  • เขียนลงในไฟล์ใหม่
  • การอัปเดตเนื้อหาเป็นไฟล์ที่มีอยู่
  • การลบไฟล์
  • การปิดไฟล์

การเขียนลงในไฟล์

ในการเขียนเนื้อหาลงในไฟล์เราจะต้องเปิดไฟล์ที่ต้องการก่อน หากไม่มีไฟล์ที่ระบุไฟล์ใหม่จะถูกสร้างขึ้น

มาดูวิธีการเขียนเนื้อหาลงในไฟล์โดยใช้ C ++

ตัวอย่าง

#include <iostream> 
#include <fstream> 
using namespace std;  

int main () {   
   ofstream myfile; 
   myfile.open ("Tempfile.txt", ios::out); 
   myfile << "Writing Contents to file.\n"; 
   cout << "Data inserted into file"; 
   myfile.close(); 
   return 0; 
}

Note -

  • fstream เป็นคลาสสตรีมที่ใช้ควบคุมการอ่าน / เขียนไฟล์

  • ofstream เป็นคลาสสตรีมที่ใช้ในการเขียนเนื้อหาลงในไฟล์

มาดูวิธีการเขียนเนื้อหาลงในไฟล์โดยใช้ Erlang ซึ่งเป็นภาษาโปรแกรมที่ใช้งานได้

-module(helloworld).  
-export([start/0]).   

start() ->
   {ok, File1} = file:open("Tempfile.txt", [write]),  
   file:write(File1,"Writting contents to file"), 
   io:fwrite("Data inserted into file\n").

Note -

  • ในการเปิดไฟล์เราต้องใช้ open(filename,mode).

  • ไวยากรณ์ในการเขียนเนื้อหาลงไฟล์: write(filemode,file_content).

Output - เมื่อเรารันโค้ดนี้“ การเขียนเนื้อหาลงไฟล์” จะถูกเขียนลงในไฟล์ Tempfile.txt. หากไฟล์มีเนื้อหาที่มีอยู่ไฟล์นั้นจะถูกเขียนทับ

อ่านจากไฟล์

ในการอ่านจากไฟล์ก่อนอื่นเราต้องเปิดไฟล์ที่ระบุใน reading mode. ถ้าไฟล์ไม่มีอยู่เมธอดตามลำดับจะคืนค่า NULL

โปรแกรมต่อไปนี้แสดงวิธีการอ่านเนื้อหาของไฟล์ในรูปแบบ C++ -

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std;  

int main () {
   string readfile; 
   ifstream myfile ("Tempfile.txt",ios::in); 
   
   if (myfile.is_open()) {     
      while ( getline (myfile,readfile) ) {       
         cout << readfile << '\n'; 
      } 
      myfile.close(); 
   } else  
      cout << "file doesn't exist";  
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

Writing contents to file

Note- ในโปรแกรมนี้เราเปิดไฟล์ข้อความในโหมดอ่านโดยใช้“ ios :: in” จากนั้นพิมพ์เนื้อหาบนหน้าจอ เราได้ใช้while วนซ้ำเพื่ออ่านเนื้อหาไฟล์ทีละบรรทัดโดยใช้เมธอด "getline"

โปรแกรมต่อไปนี้แสดงวิธีดำเนินการเดียวกันโดยใช้ Erlang. ที่นี่เราจะใช้ไฟล์read_file(filename) วิธีการอ่านเนื้อหาทั้งหมดจากไฟล์ที่ระบุ

-module(helloworld).  
-export([start/0]).   

start() ->  
   rdfile = file:read_file("Tempfile.txt"),  
   io:fwrite("~p~n",[rdfile]).

มันจะสร้างผลลัพธ์ต่อไปนี้ -

ok, Writing contents to file

ลบไฟล์ที่มีอยู่

เราสามารถลบไฟล์ที่มีอยู่โดยใช้การทำงานของไฟล์ โปรแกรมต่อไปนี้แสดงวิธีการลบไฟล์ที่มีอยู่using C++ -

#include <stdio.h> 

int main () {   
   if(remove( "Tempfile.txt" ) != 0 ) 
      perror( "File doesn’t exist, can’t delete" ); 
   else 
      puts( "file deleted successfully " ); 
   return 0; 
}

มันจะสร้างผลลัพธ์ต่อไปนี้ -

file deleted successfully

โปรแกรมต่อไปนี้แสดงวิธีการดำเนินการเดียวกันใน Erlang. ที่นี่เราจะใช้วิธีdelete(filename) เพื่อลบไฟล์ที่มีอยู่

-module(helloworld).  
-export([start/0]).   

start() ->  
   file:delete("Tempfile.txt").

Output - หากไฟล์“ Tempfile.txt” มีอยู่ไฟล์นั้นจะถูกลบ

การกำหนดขนาดของไฟล์

โปรแกรมต่อไปนี้แสดงวิธีกำหนดขนาดของไฟล์โดยใช้ C ++ ที่นี่ฟังก์ชั่นfseek ตั้งค่าตัวบ่งชี้ตำแหน่งที่เกี่ยวข้องกับสตรีมเป็นตำแหน่งใหม่ในขณะที่ ftell ส่งคืนตำแหน่งปัจจุบันในสตรีม

#include <stdio.h> 

int main () {  
   FILE * checkfile; 
   long size; 
   checkfile = fopen ("Tempfile.txt","rb"); 
   
   if (checkfile == NULL)  
      perror ("file can’t open"); 
   else {   
      fseek (checkfile, 0, SEEK_END);    // non-portable 
      size = ftell (checkfile); 
      fclose (checkfile); 
      printf ("Size of Tempfile.txt: %ld bytes.\n",size); 
   } 
   return 0; 
}

Output - หากไฟล์“ Tempfile.txt” มีอยู่ไฟล์นั้นจะแสดงขนาดเป็นไบต์

โปรแกรมต่อไปนี้แสดงวิธีการดำเนินการเดียวกันใน Erlang ที่นี่เราจะใช้วิธีfile_size(filename) เพื่อกำหนดขนาดของไฟล์

-module(helloworld).  
-export([start/0]).   

start() ->  
   io:fwrite("~w~n",[filelib:file_size("Tempfile.txt")]).

Output- หากไฟล์“ Tempfile.txt” มีอยู่ไฟล์นั้นจะแสดงขนาดเป็นไบต์ มิฉะนั้นจะแสดง“ 0”