関数型プログラミング-クイックガイド

関数型プログラミング言語は、記号計算およびリスト処理アプリケーションを処理するために特別に設計されています。関数型プログラミングは数学関数に基づいています。人気のある関数型プログラミング言語には、Lisp、Python、Erlang、Haskell、Clojureなどがあります。

関数型プログラミング言語は、2つのグループに分類されます。

  • Pure Functional Languages−これらのタイプの関数型言語は、関数型パラダイムのみをサポートします。例-Haskell。

  • Impure Functional Languages−これらのタイプの関数型言語は、関数型パラダイムと命令型プログラミングをサポートします。例-LISP。

関数型プログラミング–特性

関数型プログラミングの最も顕著な特徴は次のとおりです-

  • 関数型プログラミング言語は、条件式と再帰を使用して計算を実行する数学関数の概念に基づいて設計されています。

  • 関数型プログラミングのサポート higher-order functions そして lazy evaluation 特徴。

  • 関数型プログラミング言語は、ループステートメントのようなフローコントロールや、If-ElseやSwitchステートメントのような条件ステートメントをサポートしていません。関数と関数呼び出しを直接使用します。

  • OOPと同様に、関数型プログラミング言語は、抽象化、カプセル化、継承、ポリモーフィズムなどの一般的な概念をサポートしています。

関数型プログラミング–利点

関数型プログラミングには次の利点があります-

  • Bugs-Free Code −関数型プログラミングはサポートしていません state、したがって、副作用の結果はなく、エラーのないコードを記述できます。

  • Efficient Parallel Programming−関数型プログラミング言語には可変状態がないため、状態変更の問題はありません。「関数」をプログラムして、「命令」として並行して動作させることができます。このようなコードは、簡単な再利用性とテスト性をサポートします。

  • Efficiency−関数型プログラムは、同時に実行できる独立したユニットで構成されています。結果として、そのようなプログラムはより効率的です。

  • Supports Nested Functions −関数型プログラミングは入れ子関数をサポートします。

  • Lazy Evaluation −関数型プログラミングは、レイジーリストやレイジーマップなどのレイジー関数型コンストラクトをサポートします。

欠点として、関数型プログラミングには大きなメモリスペースが必要です。状態がないため、アクションを実行するたびに新しいオブジェクトを作成する必要があります。

関数型プログラミングは、同じデータセットに対して多くの異なる操作を実行する必要がある状況で使用されます。

  • Lispは、機械学習、言語処理、音声と視覚のモデリングなどの人工知能アプリケーションに使用されます。

  • 組み込みLispインタプリタはEmacsのようないくつかのシステムにプログラム可能性を追加します。

関数型プログラミングとオブジェクト指向プログラミング

次の表は、関数型プログラミングとオブジェクト指向プログラミングの主な違いを示しています。

関数型プログラミング OOP
不変データを使用します。 可変データを使用します。
宣言型プログラミングモデルに従います。 命令型プログラミングモデルに従います。
焦点は「あなたがしていること」です 焦点は「あなたのやり方」にあります
並列プログラミングをサポート 並列プログラミングには適していません
その機能には副作用がありません その方法は深刻な副作用を引き起こす可能性があります。
フロー制御は、関数呼び出しと再帰を伴う関数呼び出しを使用して行われます フロー制御は、ループと条件ステートメントを使用して行われます。
「再帰」の概念を使用して、コレクションデータを繰り返します。 「ループ」の概念を使用して、コレクションデータを反復処理します。例:JavaのFor-eachループ
ステートメントの実行順序はそれほど重要ではありません。 ステートメントの実行順序は非常に重要です。
「データの抽象化」と「動作の抽象化」の両方をサポートします。 「データの抽象化」のみをサポートします。

プログラムコードの効率

プログラミングコードの効率は、アルゴリズムの効率と実行速度に正比例します。優れた効率により、より高いパフォーマンスが保証されます。

プログラムの効率に影響を与える要因は次のとおりです。

  • 機械の速度
  • コンパイラ速度
  • オペレーティング・システム
  • 適切なプログラミング言語の選択
  • プログラム内のデータの方法が整理されている
  • 問題を解決するために使用されるアルゴリズム

プログラミング言語の効率は、次のタスクを実行することで改善できます。

  • 不要なコードや冗長処理を行うコードを削除します。

  • 最適なメモリと不揮発性ストレージを利用する

  • 該当する場合はいつでも、再利用可能なコンポーネントを使用する。

  • プログラムのすべての層でエラーと例外処理を利用する。

  • データの整合性と一貫性を保証するプログラミングコードを作成する。

  • 設計ロジックとフローに準拠したプログラムコードを開発する。

効率的なプログラミングコードは、動作環境へのリスクを最小限に抑えながら、リソースの消費と完了時間を可能な限り削減できます。

プログラミング用語では、 function特定のタスクを実行するステートメントのブロックです。関数はデータを受け取り、処理して、結果を返します。関数は、主に再利用性の概念をサポートするために作成されています。関数を作成すると、同じコードを何度も作成しなくても、簡単に呼び出すことができます。

関数型言語が異なれば、構文も異なり、関数を記述します。

関数を書くための前提条件

関数を書く前に、プログラマーは次の点を知っている必要があります-

  • 関数の目的はプログラマーに知られている必要があります。

  • 関数のアルゴリズムはプログラマーに知られている必要があります。

  • 関数のデータ変数とその目標は、プログラマーが知っている必要があります。

  • 関数のデータは、ユーザーが呼び出すプログラマーに知られている必要があります。

関数のフロー制御

関数が「呼び出される」と、プログラムは関数を実行するために制御を「転送」し、その「制御の流れ」は次のようになります。

  • プログラムは、「関数呼び出し」を含むステートメントに到達します。

  • 関数内の最初の行が実行されます。

  • 関数内のすべてのステートメントは上から下に実行されます。

  • 関数が正常に実行されると、コントロールは元のステートメントに戻ります。

  • 関数によって計算されて返されるデータはすべて、元のコード行の関数の代わりに使用されます。

関数の構文

関数の一般的な構文は次のようになります-

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

C ++での関数の定義

オブジェクト指向プログラミング言語であるC ++で関数を定義する方法を理解するために例を見てみましょう。次のコードには、2つの数値を加算し、その結果を出力として提供する関数があります。

#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で同じ関数を定義する方法を見てみましょう。

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

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

次の出力が生成されます-

11

関数プロトタイプ

関数プロトタイプは、戻り値の型、関数名、および引数リストを含む関数の宣言です。これは、function-bodyを使用しない関数定義に似ています。

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 −以降の章で説明する関数のオーバーロードと関数のオーバーライドは、関数シグネチャの概念に基づいています。

  • クラスに同じ名前で署名が異なる複数の関数がある場合、関数のオーバーロードが発生する可能性があります。

  • 関数のオーバーライドは、派生クラスの関数がその基本クラスと同じ名前とシグネチャを持っている場合に可能です。

関数には2つのタイプがあります-

  • 事前定義された関数
  • ユーザー定義関数

この章では、関数について詳しく説明します。

事前定義された関数

これらは、操作を実行するために言語に組み込まれ、標準関数ライブラリに格納されている関数です。

For Example − C ++の「Strcat」とHaskellの「concat」は2つの文字列を追加するために使用され、C ++の「strlen」とPythonの「len」は文字列の長さを計算するために使用されます。

文字列の長さを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)

ユーザー定義関数

ユーザー定義関数は、特定のタスクを実行するためにユーザーによって定義されます。関数を定義するための4つの異なるパターンがあります-

  • 引数も戻り値もない関数
  • 引数なしで戻り値のある関数
  • 引数はあるが戻り値がない関数
  • 引数と戻り値を持つ関数

引数も戻り値もない関数

次のプログラムは、引数と戻り値のない関数を定義する方法を示しています。 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 関数に引数を渡すためのメソッド。

この章では、「値による呼び出し」がC ++のようなオブジェクト指向プログラミング言語とPythonのような関数型プログラミング言語で機能することを学びます。

Call by Valueメソッドでは、 original value cannot be changed。関数に引数を渡すと、関数パラメータによってスタックメモリにローカルに格納されます。したがって、値は関数内でのみ変更され、関数外では効果がありません。

C ++での値による呼び出し

次のプログラムは、Call byValueが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での値による呼び出し

次のプログラムは、PythonでCall byValueがどのように機能するかを示しています-

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 byValueが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での参照による呼び出し

次のプログラムは、PythonでCall byValueがどのように機能するかを示しています-

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

同じ名前でパラメーターが異なる複数の関数がある場合、それらはオーバーロードされていると言われます。この手法は、プログラムの読みやすさを向上させるために使用されます。

関数をオーバーロードする方法は2つあります。

  • 引数の数が異なる
  • 異なる引数タイプを持つ

関数のオーバーロードは通常、異なる数またはタイプの引数を使用して1つの操作を実行する必要がある場合に実行されます。

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で関数のオーバーロードを実行する方法を示しています。

-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)は、次の条件の少なくとも1つに従う関数です-

  • 引数として複数の関数を引き受けます
  • 結果として関数を返します

PHPのHOF

次の例は、オブジェクト指向プログラミング言語であるPHPで高階関数を作成する方法を示しています。

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

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

次の出力が生成されます-

13

PythonのHOF

次の例は、オブジェクト指向プログラミング言語であるPythonで高階関数を作成する方法を示しています。

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

次の出力が生成されます-

13

データ型は、オブジェクトが持つことができる値のタイプと、オブジェクトに対して実行できる操作を定義します。データ型は、使用する前に最初に宣言する必要があります。異なるプログラミング言語は、異なるデータ型をサポートします。例えば、

  • Cは、char、int、float、longなどをサポートします。
  • Pythonは、文字列、リスト、タプルなどをサポートしています。

広い意味で、データ型には3つのタイプがあります-

  • Fundamental data types−これらは、要件ごとに1つの値のみを格納するためにプログラマーが直接使用する事前定義されたデータ型です。つまり、整数型、文字型、または浮動型です。たとえば、-int、char、floatなどです。

  • Derived data types−これらのデータ型は、要件に応じて同じ型の複数の値を格納するようにプログラマーによって設計された組み込みデータ型を使用して導出されます。例-配列、ポインタ、関数、リストなど。

  • User-defined data types−これらのデータ型は、要件に応じて同じ型または異なる型、あるいはその両方の複数の値を格納するために単一のデータ型にラップされる組み込みデータ型を使用して導出されます。例-クラス、構造など。

C ++でサポートされるデータ型

次の表に、C ++でサポートされているデータ型を示します。

データ・タイプ サイズ 範囲
char 1バイト -128〜127または0〜255
unsigned char 1バイト 0から255
符号付き文字 1バイト -128〜127
int 4バイト -2147483648から2147483647
unsigned int 4バイト 0から4294967295
符号付き整数 4バイト -2147483648から2147483647
短い整数 2バイト -32768〜32767
unsigned short int 2バイト 0〜65,535
署名されたshortint 2バイト -32768〜32767
long int 4バイト -2,147,483,648から2,147,483,647
署名されたlongint 4バイト -2,147,483,648から2,147,483,647
unsigned long 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
char 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は2種類の数値リテラルをサポートしています。 integer そして float。2つの整数値を追加する方法を示す次の例を見てください-

-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。次の例を見てください。2つの整数を比較する方法を示しています。

-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。要素の数はタプルのサイズです。次の例は、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 −'string 'データ型はErlangで定義されていません。

プログラミングの観点から見たポリモーフィズムとは、1つのコードを複数回再利用することを意味します。より具体的には、データ型またはクラスに応じてオブジェクトを異なる方法で処理するプログラムの機能です。

ポリモーフィズムには2つのタイプがあります-

  • Compile-time Polymorphism −このタイプのポリモーフィズムは、メソッドのオーバーロードを使用して実現できます。

  • Run-time Polymorphism −このタイプのポリモーフィズムは、メソッドのオーバーライドと仮想関数を使用して実現できます。

ポリモーフィズムの利点

ポリモーフィズムには次の利点があります-

  • これは、プログラマーがコードを再利用するのに役立ちます。つまり、一度作成、テスト、実装されたクラスは、必要に応じて再利用できます。多くの時間を節約します。

  • 単一の変数を使用して、複数のデータ型を格納できます。

  • コードのデバッグが簡単です。

ポリモーフィックデータ型

ポリモーフィックデータ型は、そのメモリアドレスに格納されているデータの型を使用せずに、バイトアドレスのみを格納する汎用ポインタを使用して実装できます。例えば、

function1(void *p, void *q)

どこ p そして q 保持できるジェネリックポインタです int, float (またはその他の)引数としての値。

C ++のポリモーフィック関数

次のプログラムは、オブジェクト指向プログラミング言語である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

Pythonのポリモーフィック関数

次のプログラムは、関数型プログラミング言語である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

A stringスペースを含む文字のグループです。これは、NULL文字( '\ 0')で終了する文字の1次元配列であると言えます。文字列は、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 ++でサポートされているいくつかの事前定義された文字列メソッドを示しています。

S.No. 方法と説明
1

Strcpy(s1,s2)

文字列s2を文字列s1にコピーします

2

Strcat(s1,s2)

s1の最後に文字列s2を追加します

3

Strlen(s1)

文字列s1の長さを提供します

4

Strcmp(s1,s2)

文字列s1とs2が同じ場合は0を返します

5

Strchr(s1,ch)

文字列s1で最初に出現する文字chへのポインタを返します。

6

Strstr(s1,s2)

文字列s1で最初に出現する文字列s2へのポインタを返します。

次のプログラムは、上記のメソッドを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でサポートされている定義済みの文字列メソッドのリストを示しています。

S.No. 方法と説明
1

len(s1)

指定された文字列の文字数を返します。

2

equal(s1,s2)

文字列s1とs2が等しい場合はtrueを返し、それ以外の場合はfalseを返します

3

concat(s1,s2)

文字列s1の最後に文字列s2を追加します

4

str(s1,ch)

文字列s1の文字chのインデックス位置を返します

5

str (s1,s2)

文字列s1のs2のインデックス位置を返します

6

substr(s1,s2,num)

このメソッドは、開始位置と開始位置からの文字数に基づいて、文字列s1から文字列s2を返します。

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]

アーランで番号のリストを作成するプログラム

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

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

次の出力が生成されます-

[1 2 3 4 5]

Javaでのリスト操作

このセクションでは、Javaのリストに対して実行できるいくつかの操作について説明します。

リストへの要素の追加

メソッドadd(Object)、add(index、Object)、addAll()は、要素をリストに追加するために使用されます。例えば、

ListStrings.add(3, “three”)

リストからの要素の削除

メソッドremove(index)またはremoveobject()は、リストから要素を削除するために使用されます。例えば、

ListStrings.remove(3,”three”)

Note −リストからすべての要素を削除するには、clear()メソッドを使用します。

リストからの要素の取得

get()メソッドは、指定された場所にあるリストから要素を取得するために使用されます。getfirst()およびgetlast()メソッドは、LinkedListクラスで使用できます。例えば、

String str = ListStrings.get(2)

リスト内の要素の更新

set(index、element)メソッドは、指定されたインデックスの要素を指定された要素で更新するために使用されます。例えば、

listStrings.set(2,”to”)

リスト内の要素の並べ替え

メソッドcollection.sort()およびcollection.reverse()は、リストを昇順または降順でソートするために使用されます。例えば、

Collection.sort(listStrings)

リスト内の要素の検索

要件に応じて、次の3つの方法が使用されます-

Boolean contains(Object) メソッドは true リストに指定された要素が含まれている場合、それ以外の場合は false

int indexOf(Object) メソッドは、リスト内で指定された要素が最初に出現するインデックスを返します。それ以外の場合、要素が見つからない場合は-1を返します。

int lastIndexOf(Object) リスト内で指定された要素が最後に出現したインデックスを返します。それ以外の場合は、要素が見つからない場合は-1を返します。

アーランでのリスト操作

このセクションでは、Erlangのリストに対して実行できるいくつかの操作について説明します。

2つのリストを追加する

append(listfirst、listsecond)メソッドは、2つのリストを追加して新しいリストを作成するために使用されます。例えば、

append(list1,list2)

要素の削除

delete(element、listname)メソッドは、指定された要素をリストから削除するために使用され、新しいリストを返します。例えば、

delete(5,list1)

リストから最後の要素を削除する

droplast(listname)メソッドは、リストから最後の要素を削除し、新しいリストを返すために使用されます。例えば、

droplast(list1)

要素の検索

member(element、listname)メソッドは、要素をリスト内で検索するために使用されます。見つかった場合はtrueを返し、そうでない場合はfalseを返します。例えば、

member(5,list1)

最大値と最小値を取得する

max(listname)メソッドとmin(listname)メソッドは、リスト内の最大値と最小値を見つけるために使用されます。例えば、

max(list1)

リスト要素の並べ替え

メソッドsort(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#でタプルを定義するプログラム

次のプログラムは、4つの用語のタプルを定義し、オブジェクト指向プログラミング言語である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を使用して、4つの用語のタプルを定義してそれらを印刷する方法を示しています。

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

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

次の出力が生成されます-

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

タプルの利点

タプルには次の利点があります-

  • タプルは本質的に細かいサイズです。つまり、タプルに要素を追加したり、タプルから要素を削除したりすることはできません。

  • タプル内の任意の要素を検索できます。

  • タプルは一定の値のセットを持っているため、リストよりも高速です。

  • タプルには、文字列や数値などの不変の値が含まれているため、辞書キーとして使用できます。

タプルとリスト

タプル リスト
タプルは immutableつまり、データを更新できません。 リストは mutableつまり、データを更新できます。
タプル内の要素は、異なるタイプにすることができます。 リスト内のすべての要素は同じタイプです。
タプルは、要素を囲む丸括弧で示されます。 リストは、要素を囲む角括弧で示されます。

タプルの操作

このセクションでは、タプルで実行できるいくつかの操作について説明します。

挿入された値がタプルであるかどうかを確認します

メソッド 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

レコードは、固定数の要素を格納するためのデータ構造です。これは、C言語の構造体に似ています。コンパイル時に、その式はタプル式に変換されます。

レコードを作成する方法は?

キーワード「record」は、レコード名とそのフィールドで指定されたレコードを作成するために使用されます。その構文は次のとおりです-

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

レコードに値を挿入するための構文は次のとおりです。

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

Erlangを使用してレコードを作成するプログラム

次の例では、名前のレコードを作成しました student 2つのフィールドがあります。 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

レコード値は、値を特定のフィールドに変更してから、そのレコードを新しい変数名に割り当てることで更新できます。次の2つの例を見て、オブジェクト指向および関数型プログラミング言語を使用してどのように行われるかを理解してください。

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

ラムダ計算は、関数を使用した計算を研究するために、1930年代にアロンゾチャーチによって開発されたフレームワークです。

  • Function creation −教会は表記法を導入しました λx.E'x'が正式な引数であり、 'E'が関数本体である関数を示します。これらの関数は、名前や単一の引数なしで使用できます。

  • Function application −教会は表記法を使用しました E1.E2 機能の適用を示すため E1 実際の議論に E2。そして、すべての関数は単一の引数にあります。

ラムダ計算の構文

ラムダ計算には、3つの異なるタイプの式が含まれています。

E :: = x (変数)

| E 1 E 2 (機能適用)

| λx.E (関数作成)

どこ λx.E ラムダ抽象化と呼ばれ、Eはλ式として知られています。

ラムダ計算の評価

純粋なラムダ計算には組み込み関数がありません。次の式を評価してみましょう-

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

ここでは、数字のみを操作するため、「+」で始めることはできません。(* 5 6)と(* 8 3)の2つの還元可能な式があります。

最初にどちらかを減らすことができます。例-

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

β低減ルール

λsを処理するには削減ルールが必要です

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

これはβ還元と呼ばれます。

正式なパラメータは数回使用できます-

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

複数の用語がある場合、次のように扱うことができます-

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

内部 x 内側に属する λ 外側のxは外側のxに属します。

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

自由変数と束縛変数

式では、変数の各出現は「自由」(λへ)または「バインド」(λへ)のいずれかです。

のβ還元 (λx . E) yはすべてを置き換えます x それは無料で発生します Ey。例-

アルファ削減

アルファ削減は非常に簡単で、ラムダ式の意味を変更せずに実行できます。

λ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

チャーチ・ロッサーの定理

チャーチ・ロッサーの定理は次のように述べています-

  • E1↔E2の場合、E1→EおよびE2→EのようなEが存在します。「何らかの方法で削減すると、最終的に同じ結果が得られます。」

  • E1→E2であり、E2が正規形の場合、E1からE2への正規次数の削減があります。「正規次数の削減は、存在する場合、常に正規形を生成します。」

遅延評価は、式の値が必要になるまで式の評価を保持する評価戦略です。繰り返しの評価を回避します。Haskell は、その基本が遅延評価に基づいている関数型プログラミング言語の良い例です。

遅延評価はUnixマップ関数で使用され、ディスクから必要なページのみをロードすることでパフォーマンスを向上させます。残りのページにはメモリは割り当てられません。

遅延評価-利点

  • これにより、言語ランタイムは、式の最終結果に直接リンクされていない部分式を破棄できます。

  • 一時的な計算と条件を破棄することにより、アルゴリズムの時間計算量を削減します。

  • これにより、プログラマーは、循環依存関係がない限り、データ構造の初期化後にデータ構造のコンポーネントに順不同でアクセスできます。

  • アクセス頻度の低いデータの読み込みに最適です。

遅延評価-欠点

  • 言語ランタイムは、作成することにより、最終結果で必要になるまで部分式の評価を保持するように強制されます。 thunks (遅延オブジェクト)。

  • アルゴリズムのスペースが複雑になる場合があります。

  • 実行前に大量の式が含まれているため、パフォーマンスを見つけるのは非常に困難です。

Pythonを使用した遅延評価

ザ・ rangePythonのメソッドは、遅延評価の概念に従います。これにより、より広い範囲の実行時間が節約され、一度にすべての値が必要になることはないため、メモリ消費も節約されます。次の例を見てください。

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」メソッドを使用してファイルの内容を1行ずつ読み取るループ。

次のプログラムは、を使用して同じ操作を実行する方法を示しています 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」が表示されます。