-
Cプログラムで使うWindowsスレッドAPI入門:CreateThread()と待機関数の基本
Windows APIでは、スレッドはCreateThread()関数を使って生成します。Pthreadsの場合と同様に、セキュリティ情報、スタックサイズ、スレッド作成フラグといった一連の属性がこの関数へ渡されます。以下のサンプルプログラムでは、これらの属性にデフォルト値を使用しています。デフォルト設定では、スレッドは最初からサスペンド(中断)状態になるのではなく、CPUスケジューラによってすぐに実行可能な状態になります。合計値を計算するスレッドを生成した後、親スレッドはその完了を待ってからSumの値を出力しなければなりません。Sumの値は合計計算スレッド側で設定されるためです。Pthread
-
暗黙的スレッディングと各プログラミング言語のスレッド管理を徹底解説
暗黙的スレッディング(Implicit Threading)とは マルチスレッドアプリケーション開発における難しさに対処し、設計をより容易にするための有力なアプローチの一つが、スレッドの作成と管理をアプリケーション開発者からコンパイラやランタイムライブラリへ移譲することです。この手法は「暗黙的スレッディング(implicit threading)」と呼ばれ、現在広く普及しているトレンドとなっています。 暗黙的スレッディングとは、主にライブラリや言語機能を利用して、スレッド管理の詳細を開発者から隠蔽する仕組みのことです。最も代表的な暗黙的スレッディングのライブラリとして、C言語の文脈ではOpe
-
POSIXスレッドライブラリ(Pthreads)とは?基本APIとマルチスレッドのサンプルコード
Pthreads(POSIXスレッド)とは Pthreadsとは、スレッドの作成と同期のためのAPIを定義したPOSIX標準規格(IEEE 1003.1c)のことです。重要なのは、Pthreadsが定義しているのはスレッドの動作仕様であって、具体的な実装ではないという点です。このため、OS設計者はこの仕様をどのような方法でも自由に実装できます。 実際に多くのOSがPthreads仕様を採用しており、そのほとんどはLinux、macOS(旧Mac OS X)、SolarisといったUNIX系システムです。WindowsはPthreadsをネイティブにはサポートしていませんが、サードパーティ製の実
-
C言語で日数を年・週・日に変換するプログラムの作り方
概要この記事では、与えられた日数を年・週・日の3つの単位に変換するC言語プログラムを紹介します。ここでは簡単のため、うるう年は考慮せず、1年 = 365日として計算を行います。変換の考え方各単位への変換は、割り算の商と剰余(余り)を使って以下のように求められます。年数の計算年数 = 日数 ÷ 365日数を365で割った商が、そのまま年数になります。週数の計算週数 = (日数 ÷ 365 の余り)÷ 7まず日数を365で割った余りを求め、その結果を1週間の日数である7で割ります。得られた商が週数です。残りの日数の計算残り日数 = (日数 ÷ 365 の余り)÷ 7 の余り365で割った余りをさら
-
C言語で華氏を摂氏に変換するプログラムの作成方法
華氏で表された温度「n」が与えられ、その温度を摂氏に変換して表示することが課題となります。本記事では、C言語を使って華氏から摂氏への変換を行うプログラムの考え方と実装方法を解説します。実行例入力1-: 132.00 出力-: 華氏132.00を摂氏に変換すると55.56 入力2-: 456.10 出力-: 華氏456.10を摂氏に変換すると235.61華氏から摂氏への変換式華氏から摂氏へ温度を変換するには、以下の変換式を使用します。T(°C) = (T(°F) − 32) × 5/9ここで、T(°C)は摂氏での温度、T(°F)は華氏での温度を表します。水の凝固点である華氏32度が摂氏0度に対応
-
C言語でBMI(体格指数)を計算するプログラムの作成方法
ある人の身長と体重が与えられたとき、その人のBMI(Body Mass Index:ボディマス指数/体格指数)を計算して表示するのが、このプログラムの目的です。 BMIとは BMIは、体重と身長の関係から肥満度を数値化した国際的な指標です。WHO(世界保健機関)でも採用されており、健康状態を手軽に把握するために広く活用されています。 BMIの計算に必要な情報 体重(kg) 身長(m) BMIの計算式 BMIは、次の式で求められます。 BMI = 体重(kg)÷(身長(m)× 身長(m)) ここで、体重の単位はキログラム(kg)、身長の単位はメートル(m)である点に注意してください。身長を
-
C言語で年齢を計算するプログラムの作成方法
現在の日付とある人物の生年月日が与えられ、その人の現在の年齢(年・月・日)を計算するのが課題となります。本記事では、C言語を使って年齢を求めるプログラムの考え方と実装方法を解説します。 例 入力 -: 現在の日付 -: 21/9/2019 生年月日 -: 25/9/1996 出力 -: 現在の年齢 年: 22 月: 11 日: 26 使用するアプローチは以下の通りです − 現在の日付と生年月日を入力として受け取る 以下の条件をチェックする 現在の月が誕生月より小さい場合、今年はまだ誕生月に達していないため現在の年をそのまま使わず、現在の月に12を加算して月の差を計算します
-
3D空間で2点間の距離を計算するCプログラム
3次元空間はx軸・y軸・z軸の3つの軸で構成され、空間上の各点の位置は (x, y, z) という座標の組み合わせで表されます。本記事では、C言語を使って3次元空間上の2点 P1(x1, y1, z1) と P2(x2, y2, z2) の間の距離(ユークリッド距離)を計算し、その結果を表示するプログラムを解説します。3次元空間における距離の計算式2点間の距離は、ピタゴラスの定理(三平方の定理)を3次元に拡張した次の公式で直接求めることができます。d = √( (x2 − x1)2 + (y2 − y1)2 + (z2 − z1)2 )この式は、x・y・zの各軸方向における座標の差をそれぞれ2
-
C言語で2点間の距離を計算するプログラムの作成方法
2点の座標が与えられたとき、その2点間の距離を求めて結果を表示するのが本記事のテーマです。 2次元平面上にAとBという2点があり、それぞれの座標を (x1, y1)、(x2, y2) とします。2点間の距離を求めるには、三平方の定理(ピタゴラスの定理)から導かれる次の公式をそのまま利用できます。 $$\sqrt{\lgroup x2-x1\rgroup^{2}+\lgroup y2-y1\rgroup^{2}}$$ 以下は、2点とその差を表した図です $$\frac{(x_2-x_1)}{(x_1,y_1)\:\:\:\:\:\:(y_2-y_1)\:\:\:\:\:\:(x_2,y_2)}
-
C言語で2つの分数を加算するプログラムの書き方
この記事では、a/b と c/d という2つの分数が与えられたときに、その合計を求めるC言語プログラムを紹介します。ここで a、b、c、d は 0 以外の任意の整数値を取ることができます。分数とは分数は次のように表されます。a / b の形式で表され、a を「分子」、b を「分母」と呼びます。a と b には任意の数値を指定できますが、b(分母)は 0 以外の値である必要があります。2つの分数の加算は a / b + c / d と表され、加算を行うためのルールとして「両者の分母が等しくなければならない」という点が挙げられます。分母が異なる場合は、まず通分して分母を揃えてから加算を行う必要があ
-
異なるレイヤーのダイヤモンドパターンを出力するCプログラム
整数 n を入力として与え、n 段のレイヤー(階層)を持つダイヤモンド型の数字パターンを生成して表示するのが、本プログラムの目的です。パターンは数字 0 を頂点とし、中央行で最大値 n に達した後、再び 0 へと戻る左右対称の構造になります。 実行例 Input: n = 3 上記の入力に対する出力は次のようになります。 アプローチのポイント まず行数を入力として受け取ります。 このパターンは全体で ((2 * n) + 1) 行で構成されます。 0 行目〜 n 行目までの各行の先頭には、(2 * (n − i)) 個の空白を出力します。 n + 1 行目以降から最終行まで
-
C言語で配列内の指定範囲の積(剰余演算)を求める方法
配列 A、範囲の左端 L、右端 R、そして素数 P を入力として与え、L から R までの範囲内にある要素の総乗(積)を P で割った余りを計算して出力するのが本記事の課題です。下図のように、配列の要素が並んでおり、左端の値 L は 2、右端の値 R は 6 です。プログラムはこの範囲内に含まれる要素の積を順次計算していきます。入出力例Input-: A[] = { 1, 2, 3, 4, 5, 6 } P = 29 L = 2 R = 6 Output-: 24 Input-: A[] = {1, 2, 3, 4, 5, 6}, L = 2 R = 5 P = 113
-
C言語で対数 log₂n を計算するプログラム
入力として整数 n の値が与えられ、その値に対する対数(log2n)を関数を使って計算し、結果を表示します。対数(ログ)とは、べき乗の逆関数にあたるものです。つまり、対数を求めるということは、「ある基数(底)を何乗すれば目的の値になるか」という指数を求めることを意味します。数式で表すと、次のように定義されます。$$\log_b x\;=\:y\quadならば\quad b^{y}=x$$具体例を挙げると、次のようになります。$$\log_2 64\;=\:6\quadならば\quad 2^{6}=64$$実行例入力: Log 20 出力: 4 入力: Log 64 出力: 6アルゴリズム開始
-
【C言語】行列が特異行列かどうかを判定するプログラムの書き方
行列を mat[行][列] の形式で与えたとき、関数を使ってその行列が「特異行列」かどうかを判定し、結果を表示するのが本記事の目的です。特異行列とは、行列式(determinant)が 0 になる行列のことを指します。逆に、行列式が 0 でない行列は「非特異行列(正則行列)」と呼ばれます。したがって、行列が特異かどうかを調べるには、まず行列式を計算する必要があります。3×3 行列の行列式は、次の式で求められます。$$M1[3][3]\:=\:\begin{bmatrix}a & b & c \\d & e & f \\g & h & i \end
-
C言語でストロングナンバー(強数)を判定するプログラムの作り方
ストロングナンバー(強数)とは?ある数値 n が与えられたとき、その数がストロングナンバー(強数)であるかどうかを判定する方法を解説します。ストロングナンバーとは、各桁の数字の階乗の総和が元の数値そのものと等しくなる数のことです。階乗とは、その数から1までのすべての正の整数を掛け合わせた値で、「!」(感嘆符)を使って表します。例えば、4! = 4 × 3 × 2 × 1 = 24 となります。判定の考え方例として 145 を見てみましょう。まず各桁の数字「1」「4」「5」を取り出し、それぞれの階乗を計算します。1! = 14! = 245! = 120これらを合計すると 1 + 24 + 12
-
【C言語】日付が有効かどうかを判定するプログラムの書き方
本記事では、年・月・日を整数として受け取り、その日付が実際に存在しうるものかどうかを判定するC言語のプログラムを解説します。ここで「有効な日付」とは、1800年1月1日〜9999年12月31日の範囲に含まれ、カレンダー上のあらゆる制約(月ごとの日数や閏年のルールなど)を満たす日付のことを指します。この範囲外の日付はすべて無効として扱います。有効な日付の条件日付が有効であるためには、以下の制約をすべて満たす必要があります。日は1以上31以下であること月は1以上12以下であること年は1800以上9999以下であること4月・6月・9月・11月の場合、日は30以下であること2月の場合は、次のように閏年
-
C言語で文字列内の各単語の先頭文字を大文字に変換するプログラム
大文字と小文字が混在する文字列が与えられたとき、各単語の最初の文字を大文字にし、それ以外の文字はすべて小文字に揃えるのがこの記事のテーマです。まずは簡単な例で内容を確認してみましょう。たとえば「hElLo world」という文字列が与えられた場合、先頭の小文字「h」を大文字「H」に変換し、スペースから文字列の末尾までの残りの文字はすべて小文字にします。同様に、スペースの直後に現れる文字についても、必ず大文字へ変換する必要があります。入出力例Input: str[] = {heLlO wORLD} Output: Hello World Input: str[] = {sUNIDHi bAnS
-
C言語でプラス完全数(Armstrong数)を判定するプログラム
n桁の整数xが与えられたとき、その数が「プラス完全数(Plus Perfect Number)」であるかどうかを判定するのが本記事のテーマです。プラス完全数とは、各桁の数字dを桁数nでべき乗した値(dn)をすべて合計し、その合計が元の数と一致する場合を指します。この考え方は、いわゆる「Armstrong数(ナルシシスト数)」の判定とまったく同じものです。 具体例 入力:163 出力:完全数ではない 説明:1³ + 6³ + 3³ = 244 となり、163と一致しないため 入力:371 出力:完全数である 説明:3³ + 7³ + 1³ = 371 となり、元の数と一致するため 上記の例のよ
-
C言語で配列が回文かどうかを判定するプログラム
回文とは任意のサイズ n の配列 arr[] が与えられたとき、その配列が回文(パリンドローム)かどうかを判定するのが本記事の目的です。回文とは、前から読んでも後ろから読んでも同じになる並びのことで、MADAM や NAMAN といった文字列が代表的な例として挙げられます。配列が回文かどうかを確認するには、配列を先頭からと末尾から同時に走査し、対応する要素同士を比較していきます。入力例と出力例Input: arr[] = {1, 0, 0, 1} Output: 配列は回文です Input: arr[] = {1, 2, 3, 4, 5} Output: 配列は回文ではありません考え方(アプ
-
C言語で文字列の逆順パターンを出力するプログラム
文字列 str が与えられたとき、その逆順パターンを出力するのがこの記事の課題です。パターンは逆順で増加的に表示され、文字列が尽きた後は残りの部分を「*」で埋めます。 例えば、文字列「abcd」を入力した場合、1行目には「a」、2行目には「c b」、3行目には「* * d」を出力します。 例 入力: str[] = { abcd } 出力: a c b * * d 説明 − 1行目に1文字を出力します。 2行目に2文字を逆順に出力します。 3行目に3文字を逆順に出力します。文字列が3文字未満の場合は、残りの空白を「*」で埋めます。 入力: str[] = {tut