-
入力した二分木が別の二分木の部分木(サブツリー)かどうかを判定するC++プログラム
二分木とは二分木(バイナリツリー)とは、各ノードが最大2つの子ノードを持つことのできる木構造のデータ構造です。子ノードはそれぞれ「左の子」と「右の子」として定義されます。本記事では、ある二分木 S が、別の二分木 T の部分木(サブツリー)として含まれているかどうかを判定する C++ プログラムを紹介します。アルゴリズム判定処理は、次の2つの再帰関数によって実現します。identical(): 引数として渡された2つのノード r1・r2 を根とする木同士が、完全に一致しているかどうかを再帰的に調べます。Subtree(): 大きな木 T の各ノードを順にたどりながら、その位置から始まる部分木が
-
C++でのマルチスレッドプログラミング入門|POSIXスレッドの作成から終了まで
マルチスレッドとは マルチスレッドはマルチタスクの特殊な形態であり、マルチタスクとは、コンピュータが2つ以上のプログラムを同時に実行できる機能のことです。マルチタスクには、一般的に「プロセスベース」と「スレッドベース」の2種類があります。 プロセスベースのマルチタスクは、複数のプログラムの同時実行を扱います。一方、スレッドベースのマルチタスクは、同一プログラム内の複数の処理単位の同時実行を扱います。 マルチスレッドプログラムは、同時に実行可能な2つ以上の部分から構成されます。この各部分を「スレッド」と呼び、それぞれのスレッドが独立した実行パスを定義します。 なお、C++言語自体にはマルチスレ
-
後置記法(逆ポーランド記法)の式から式木を構築するC++プログラム
式木(Expression Tree)とは、数式を木構造として表現するために用いられる二分木の一種です。式木では、演算子(+、-、*、/ など)が内部ノードに対応し、オペランド(被演算子)が葉ノードに対応します。本記事では、後置記法(ポストフィックス記法、いわゆる逆ポーランド記法)で与えられた式から式木を構築し、その結果を行きがけ順(前順)、通りがけ順(中間順)、帰りがけ順(後順)の3つの方法で巡回して出力するC++プログラムを紹介します。 たとえば、後置記法の式「762*+6+」は、中間記法では「7+6*2+6」に相当します。式を木構造に変換することで、式の構造を視覚的に把握できるようにな
-
C++のexp()関数とは?使い方とサンプルコードをわかりやすく解説
C++で指数計算を行う際に便利なのが、<cmath>ヘッダーで提供されているexp()関数です。この記事では、exp()関数の基本的な使い方から実際のサンプルコード、実行結果までをわかりやすく解説します。 exp()関数とは C/C++の標準ライブラリ関数であるdouble exp(double x)は、自然対数の底 e(ネイピア数:約2.71828) の x 乗の値を返します。数学でいう「ex」の計算に相当し、指数関数的な増加や減少を扱う処理、科学技術計算、統計処理など幅広い分野で利用されています。 関数の宣言 double exp(double x) 引数と戻り値 引数
-
二分木で最も深い左葉(左の葉ノード)を見つけるC++プログラム
二分木とは、各ノードが最大2つの子ノード(左の子と右の子)を持つ木構造のことです。本記事では、二分木の中から最も深い位置にある左葉(親ノードから見て左側の子である葉ノード)を見つけるC++プログラムを紹介します。アルゴリズム開始。 関数 deepestLLeafutil() は、与えられた二分木の中から 最も深い左葉を探索します。 lvel :現在のノードのレベル(深さ) maxlvel:これまでに見つかった最も深い左葉のレベルへのポインタ isLeft :このノードが親の左の子であることを示すフラグ resP
-
C++のlog()関数とは?自然対数を求める方法をわかりやすく解説
C++の標準ライブラリには、数学的な計算を行うための便利な関数が多数用意されています。その中でもlog()関数は、数値の自然対数(ネイピア数 e を底とする対数)を求めるために使用される重要な関数です。log()関数の基本情報C/C++のライブラリ関数 double log(double x) は、引数 x の自然対数(底が e の対数)を返します。この関数を使用するには、ヘッダーファイル <cmath> をインクルードする必要があります。関数の宣言double log(double x)パラメータと戻り値パラメータ: x は浮動小数点型(double)の値です。自然対数を求めたい
-
C++のmemset関数とは?使い方と注意点をわかりやすく解説
memset()関数の概要この記事では、C++におけるmemset()関数の役割と使い方について詳しく解説します。memset()関数は、指定した文字の値をunsigned char型に変換し、str[]が指すオブジェクトの先頭n文字分にその値をコピーする関数です。なお、nが文字列のサイズより大きい場合、動作は未定義(undefined behavior)となるため注意が必要です。memset()関数の構文void* memset( void* str, int c, size_t n);引数の意味は以下の通りです。str:値を設定する対象のメモリ領域へのポインタc:設定する値(unsigne
-
【C++】二分探索木で最小共通祖先(LCA)を求めるプログラムの解説
二分木とは、各ノードが最大で2つの子ノード(左の子と右の子)を持つことのできる木構造のデータ構造です。本記事では、二分探索木(BST)において、指定した2つのノードの最小共通祖先(Lowest Common Ancestor:LCA)を求めるC++プログラムを解説します。 最小共通祖先とは、2つのノードn1とn2の両方の子孫となるノードのうち、最も深い位置にあるノードのことです。二分探索木では「左の子 < 親 < 右の子」という性質が成り立つため、この性質を利用することでLCAを効率的に求めることができます。 アルゴリズム LCAを求める手順は以下の通りです。 1. データd、左の子ポインタl
-
C++でユーザー定義サイズの2次元ベクトル(2D vector)を扱う方法
C++において、vectorの中にvectorを格納したものは「2次元ベクトル(2D vector)」と呼ばれます。これはいわゆる二次元配列のような使い方ができるデータ構造で、各行の要素数が異なる「ジャグ配列(ギザギザ配列)」としても扱えるのが特徴です。アルゴリズムBegin 2D vector型の変数 v を宣言する。 ベクター v に値を初期化する。 「the 2D vector is:」と出力する。 for (int i = 0; i < v.size(); i++) for (int j = 0; j < v[i].size(); j++
-
C++のdiv()関数とは?使い方とサンプルコードを解説
C++のdiv()関数の概要C/C++の標準ライブラリ関数 div_t div(int numer, int denom) は、第1引数 numer(分子)を第2引数 denom(分母)で割り算し、商と余りを同時に求めることができる便利な関数です。通常の除算演算子では商と余りを別々に計算する必要がありますが、div()関数を使えば1回の呼び出しで両方の結果を取得できます。関数の宣言div_t div(int numer, int denom)パラメータnumer: 割り算の分子(被除数)denom: 割り算の分母(除数)戻り値この関数は、ヘッダーファイル <cstdlib> で定義
-
C++プログラム:二分木における最大独立集合(LIS)のサイズを求める方法
この記事では、与えられた二分木(バイナリツリー)における最大独立集合(LIS:Largest Independent Set)のサイズを求めるC++プログラムを紹介します。 独立集合とは、木の中で互いに隣接していない(親子関係にない)ノードだけで構成される集合のことです。つまり、「選んだノード同士が直接つながっていない」という条件のもとで、できるだけ多くのノードを選ぶ問題を解きます。 アルゴリズム この問題は、動的計画法(メモ化再帰)を用いることで効率的に解けます。各ノードについて「そのノードを含まない場合」と「そのノードを含む場合」の2通りのサイズを計算し、大きい方を採用します。 開始。
-
C++でmain関数が空のまま「Hello World」を出力する2つの方法
この記事では、C++でmain関数の中に何も書かずにコンソールへ「Hello World」を出力する方法を解説します。一見不可能に思えますが、C++の言語仕様を活かしたテクニックを使えば簡単に実現できます。 主なアプローチは2つあります。1つ目はグローバル変数を利用する方法、2つ目はクラスのコンストラクタを利用する方法です。それぞれ順番に見ていきましょう。 方法1:グローバル変数とprintf()を使う printf()関数は、グローバル変数の初期化式として呼び出すことができます。プログラム起動時には、main関数が実行される前にグローバル変数の初期化が行われるため、そのタイミングでprint
-
C++で1つのテキストファイルの内容を別のファイルに追記する方法
C++では、<fstream>ヘッダーが提供するファイルストリームクラスを使うことで、手軽にファイル操作を実現できます。この記事では、1つのテキストファイル(a.txt)の内容を、別のテキストファイル(a1.txt)の末尾に追記するプログラムを紹介します。 入力 a.txt の内容:「Tutorials」 a1.txt の内容:「point」 出力 Tutorialspoint アルゴリズム fstreamクラスのオブジェクト f、および ifstream型の fin を定義します。 fin を使って入力ファイル「a.txt」を開きます。 ofstream型の fout を定義し
-
C++でテキストファイルにテキストを追加(追記)する方法
この記事では、C++を使って既存のテキストファイルにテキストを追加(追記)する方法を解説します。ファイル操作には標準ライブラリの <fstream> を使用し、追記モードでファイルを開くことで、元の内容を消さずに新しいテキストを末尾へ書き込めます。 アルゴリズム Begin ファイル「a1.txt」を出力ファイルストリームクラスのオブジェクトとして 追記モード(append mode)で開き、fout を使って出力操作を行う。 ファイルが存在する場合: ファイルにテキストを追記する。 fout を閉じる。 ファイル「a1.tx
-
C++でテキストファイルを読み込む方法を徹底解説【fstreamの使い方】
本記事では、C++を使ってテキストファイルを読み込む方法を、サンプルコードとアルゴリズム付きでわかりやすく解説します。ファイル入出力の基本である fstream クラスの使い方をマスターしましょう。 前提条件(入力) あらかじめ「tpoint.txt」というテキストファイルを作成し、初期内容として以下の文字列を書き込んでおきます。 Tutorials point. 実行結果(出力) プログラムを実行すると、ファイルから読み込んだ内容が画面に表示されます。 Tutorials point. アルゴリズム 処理の流れは以下の通りです。 fstream クラスのオブジェクト newfile を作成
-
C言語で2つのファイルの内容を3つ目のファイルに結合する方法
この記事では、C言語を使って2つのテキストファイルの内容を読み込み、それらを1つの3つ目のファイルに結合(マージ)するプログラムを紹介します。ファイル操作の基本である fopen、fgetc、fputc、fclose などの標準ライブラリ関数の使い方を学ぶのに最適な例題です。処理の概要まず、2つの元ファイル(java.txt と kotlin.txt)にそれぞれ初期内容を書き込みます。その後、両方のファイルを読み込みモードで開き、内容を順番に3つ目のファイル(ttpoint.txt)へ書き出すことで、ファイルを結合します。入力例java.txt の初期内容:「Java is a program
-
C++でテキストファイルからデータを読み込む方法
C++では、fstreamクラスを利用することで、テキストファイルへのデータの書き込みや読み込みを簡単に実装できます。本記事では、テキストファイルからデータを読み込むC++プログラムの基本的な流れを、アルゴリズムとサンプルコードを交えて解説します。 入力 tpoint.txt の初期内容は 「Tutorials point.」です。 出力 Tutorials point. アルゴリズム 開始 fstreamクラスのオブジェクトnewfileを作成する。 open()メソッドを呼び出し、オブジェクトnewfileを使ってファイル「tpoint.txt」を書き込みモードで開く。
-
C++でファイルを1行ずつ読み込む方法
本記事では、C++を使ってテキストファイルを1行ずつ読み込むプログラムの実装方法を解説します。標準ライブラリの fstream クラスと getline() 関数を組み合わせることで、シンプルかつ効率的にファイルの内容を行単位で処理できます。入力ファイル「tpoint.txt」には、あらかじめ次の内容が書き込まれているものとします。Tutorials point.出力Tutorials point.アルゴリズムプログラム全体の流れは以下のとおりです。開始 fstreamクラスのオブジェクト newfile を作成する。 open() メソッドを呼び出し、newfile を使って書き込み
-
C++のファイル処理におけるtellp()関数の使い方を解説
C++のファイル処理において、tellp()関数は出力ストリームと組み合わせて使用される関数で、ストリーム内のポインタ(書き込み位置)の現在位置を返します。戻り値は整数データ型であり、ストリームポインタが現在指している位置を表します。 tellp()メソッドは引数を一切取らず、以下のように記述します。 pos_type tellp(); アルゴリズム tellp()を使用したファイル処理の基本的な流れは以下の通りです。 fstreamクラスのオブジェクト(ここでは newfile)を作成します。 open()メソッドを呼び出し、オブジェクト newfile を使って「tpoint.txt」
-
C言語のtmpfile()関数とは?一時ファイルの作成方法をわかりやすく解説
C言語のtmpfile()関数は、バイナリ更新モードで一時ファイルを作成するための標準ライブラリ関数です。この関数はstdio.hヘッダーファイル内で宣言されています。一時ファイルを作成できない場合には、必ずNULLポインタを返します。また、作成された一時ファイルはプログラムの終了直後に自動的に削除されるため、開発者が明示的に削除処理を記述する必要がありません。 構文 FILE *tmpfile(void) 戻り値 ファイルの作成に成功した場合、この関数は作成された一時ファイルへのストリームポインタ(FILE*型)を返します。逆に、ディスク容量不足などの理由でファイルを作成できなかった場合