-
自作関数を使って4つの整数の最大値を求めるC言語プログラム
4つの数 a、b、c、d が与えられたとき、自分で定義した関数を使ってそれらの中から最大値を求めることを考えます。そこで今回は、2つの数を受け取って大きい方を返す max() 関数を作成し、この関数を組み合わせることで4つの数すべての最大値を求めます。例えば、入力が a = 5、b = 8、c = 2、d = 3 の場合、出力は 8 になります。解き方の手順2つの引数 x と y を受け取る関数 max() を定義するx と y のうち大きい方の値を返す4つの数 a、b、c、d を用意するleft_max = max(a, b) として前半2つの最大値を求めるright_max = max(c
-
C言語:ポインタを使って関数内で合計と差を求めるプログラム
2つの整数 a と b があるとします。ここで、(a + b) と (a − b) の両方を計算できる関数を定義することを考えます。しかし、C言語では1つの関数が返せる戻り値は最大で1つだけです。複数の結果を呼び出し元に返したい場合は、ポインタを使って出力パラメータ(引数)経由で値を書き戻すのが定番のテクニックです。この問題では、a を a + b の値に、b を a − b の値にそれぞれ更新します。そのため、関数を呼び出すときには、これら2つの変数のアドレスを渡す必要があります。たとえば、入力が a = 5、b = 8 の場合、出力は次のようになります。a + b = 13a − b =
-
数字を単語に変換するCプログラム
1桁の数字 d が与えられたとき、それを対応する英語の単語に変換するプログラムを考えてみましょう。たとえば d = 5 であれば出力は「Five」になり、d = 6 であれば「Six」と表示されます。さらに、0〜9 の範囲外の値が渡された場合には、範囲外であることを示す適切なメッセージを返します。解決のアプローチこの問題は、条件分岐を使って数字ごとに対応する単語を判定するだけで解決できます。手順は次のとおりです。solve() という関数を定義し、引数として数字 d を受け取ります。d が 0 未満、または 9 より大きい場合は「Beyond range of 0 - 9」(範囲外)というメッ
-
forループで数字をすべて英単語に変換して出力するC言語プログラム
この記事では、2つの整数 a と b が与えられたとき、その範囲内の各数字を対応する英単語に変換し、1つずつ出力するC言語のプログラムを紹介します。例えば、数字「5」は「Five」と表示されるイメージです。入力が a = 3、b = 8 の場合、出力は次のようになります。ThreeFourFiveSixSevenEight解決の手順この問題を解くために、以下の手順に従います。引数として数字 d を受け取る関数 solve() を定義します。d が 0〜9 の範囲外の場合は「Beyond range of 0 - 9」というメッセージを返します。d の値(0〜9)に応じて、それぞれ対応する英単語
-
5桁の数値の各桁の合計を求めるC言語プログラム
5桁の整数 num があるとき、その各桁の合計を求める方法を解説します。基本的な考え方は、数値を右から左へ一桁ずつ取り出しながら足し合わせていくというものです。アルゴリズムの考え方各桁を取り出すには、次の手順を繰り返します。数値を10で割った余りが、現在の一番右の桁(下一桁)になります。数値を10で割った商(整数部分のみ)で数値を更新します。数値が0になるまでこの処理を繰り返します。取り出した桁をすべて合計すれば、それが求める「桁の合計」になります。処理手順num := 58612(対象の数値を設定)sum := 0(合計を格納する変数を初期化)num が0でない間、以下を繰り返す:sum :
-
C言語で漸化式のn番目の項を求めるプログラム
問題の概要3つの整数 a、b、c と整数 n が与えられたとします。このとき、以下の漸化式で定義される数列 S(n) の第n項を求めます。S(1) = aS(2) = bS(3) = cn > 3 のとき、S(n) = S(n-1) + S(n-2) + S(n-3)計算例例として、a = 5、b = 2、c = 3、n = 6 が入力された場合を考えてみましょう。このときの出力は 28 になります。その理由は以下の通りです。S(4) = S(3) + S(2) + S(1) = 3 + 2 + 5 = 10S(5) = S(4) + S(3) + S(2) = 10 + 3 + 2 =
-
男子・女子学生の点数の合計を求めるCプログラム
問題の概要marksという配列にいくつかの点数が格納されているとします。偶数インデックス(marks[0]、marks[2]など)には男子学生の点数が、奇数インデックスには女子学生の点数が入っています。さらに、genderという入力があり、その値は「b」または「g」のいずれかです。「b」が渡された場合は男子学生の点数の合計を、「g」が渡された場合は女子学生の点数の合計を返す必要があります(配列のサイズはNとします)。たとえば、入力が N = 9、marks = [8,5,2,6,7,5,9,9,7]、gender = g の場合、出力は25になります。これは、女子の点数である 5 + 6 +
-
トンネルを通過できる箱の体積を求めるCプログラム
高さが41、幅が非常に大きいトンネルがあるとします。また、長さ・幅・高さを持つ箱のリストが与えられます。箱の高さがトンネルの高さより厳密に小さい場合のみ、その箱はトンネルを通過できます。このとき、トンネルを通過できる箱の体積をすべて求める必要があります。体積は「長さ × 幅 × 高さ」で計算されます。入力として、箱の個数Nと、N行3列の2次元配列が与えられます。 例えば、入力が N = 4、boxes = [[9,5,20],[3,7,15],[8,15,41],[6,3,42]] の場合、出力は 900 と 315 になります。最初の2つの箱は通過条件を満たしており、体積はそれぞれ 9 ×
-
C言語でmalloc()を使い配列を動的に確保し、全要素の合計を計算・表示するプログラム
問題概要整数 n が標準入力から与えられるとします。このとき、サイズ n の配列を動的に確保し、続いて n 個の数値を1つずつ読み込んで、その合計を求めて出力します。配列を動的に確保するには、stdlib.h ヘッダーに含まれる malloc() 関数または calloc() 関数を使用します。これにより、コンパイル時にサイズが不明な場合でも、実行時に必要な大きさの配列を用意できます。例えば、入力が n = 6 で配列の要素が「9, 8, 7, 2, 4, 3」の場合、9 + 8 + 7 + 2 + 4 + 3 = 33 となるため、出力は 33 になります。解法のアプローチ合計値を格納する変
-
【C言語】配列の要素をその場で反転するプログラム
配列の反転とは n個の要素を持つ配列があるとします。この課題では、配列内の要素をその場で(in place)反転し、結果を表示する必要があります。ポイントは、単に逆順に表示するのではなく、配列自体の要素の並びを直接入れ替えるという点です。 例えば、入力が n = 6、arr = [9, 8, 7, 2, 4, 3] の場合、出力は [3, 4, 2, 7, 8, 9] となります。 解決のための手順 この問題は、以下の手順で解くことができます。 i を 0 で初期化し、i < n / 2 の間、i を 1 ずつ増やしながら次の処理を繰り返します。 temp := arr[i] a
-
C言語でstrtok()を使って文字列を単語ごとに分割して出力する方法
文字列 s に、いくつかの単語から構成される文が格納されているとします。ここで、各単語を新しい行に出力することを考えます。このような処理には、string.h ヘッダーファイルで定義されている strtok() 関数を利用できます。 strtok() 関数は、対象となる文字列と区切り文字(デリミタ)の2つの引数を受け取ります。今回は区切り文字として空白 " " を指定します。 例えば、入力が s = "Let us see some string tokenizing fun" の場合、出力は次のようになります。 Let us see some stri
-
C言語で文字列内の各数字の出現頻度を求める方法
問題の概要ある文字列 s が与えられます。この文字列には英字と数字の両方が含まれており、それぞれの数字(0〜9)が出現する回数を求めて表示することが目的です。この問題は、サイズ10の整数配列を用意し、全要素を0で初期化しておくことで簡単に解決できます。文字列を先頭から順に走査し、数字を見つけるたびに対応するインデックスのカウントを1増やしていき、最後に集計結果を出力します。例として、入力が s = we85abc586wow236h69 の場合、出力は次のようになります。(Number 2, Freq 1) (Number 3, Freq 1) (Number 5, Freq 2) (Numb
-
C言語で文字列配列の全順列を生成!next_permutationアルゴリズムの実装方法
問題概要 複数の文字列が配列に格納されている状況を考えてみましょう。ここでの課題は、それらの文字列のすべての順列(並べ替え)を1行ずつ出力することです。 たとえば、入力が ["abc", "def", "ghi"] の場合、期待される出力は次のようになります。 abc def ghi abc ghi def def abc ghi def ghi abc ghi abc def ghi def abc 解き方のアプローチ この問題は、辞書順で「次の順列」を生成する next_permutation アルゴリズムを使うと、シンプルかつ効
-
C言語の可変個引数関数(va_arg)で合計・最大値・最小値を求めるプログラム
固定された引数の個数を持たず、複数の引数を受け取れる関数を作りたい場面はよくあります。ここでは、与えられた数値の合計を計算する sum()、最大値を求める max()、最小値を求める min() の3つの関数を作成します。いずれの関数も、第1引数として「引数の個数」を受け取る仕様とします。このような関数を定義するには、関数の引数リストに省略記号(...)を使用します。また、これらを利用するためには stdarg.h ヘッダーファイルをインクルードする必要があります。この種の関数は可変個引数関数(variadic function)と呼ばれます。可変個引数を扱うための4つの要素可変個引数にアクセ
-
【C言語】ヘロンの公式を使って三角形を面積順にソートする方法
異なる三角形の配列があり、triangles[i] = [ai, bi, ci] が i 番目の三角形の3辺を表していると仮定します。これらの三角形を、それぞれの面積に基づいて昇順にソートする必要があります。3辺の長さから面積を求めるには、有名な「ヘロンの公式」を利用します。 ヘロンの公式による面積の計算方法 3辺 a、b、c を持つ三角形の面積は、次の式で求められます。 面積 = √( p × (p-a) × (p-b) × (p-c) ) ※ p = (a+b+c)/2 ここで p は半周長(3辺の合計の半分)を表します。 入出力の例 たとえば、入力が (7, 24, 25)、(5,
-
指定した値未満となるAND・OR・XOR演算の最大値を求めるCプログラム
2つの整数 k と n が与えられたとします。この課題では、1から n までの数値のすべてのペアに対して、ビット単位のAND(論理積)、OR(論理和)、XOR(排他的論理和)の3種類の演算を実行し、その結果が与えられた値 k よりも小さくなるようなペアの中から、各演算の最大値を求めます。 例えば、入力が n = 5、k = 5 の場合、出力は 4 3 4 となります。 これは、5以下の数値ペア間で行われるAND、OR、XOR演算のうち、k 未満となる結果の最大値がそれぞれ 4、3、4 であることを意味します。実際に確認してみると、AND の最大値は 4 & 5 = 4、OR の最大値は
-
【C言語】mallocとreallocで作る可変長配列 ― 図書館システムの実装例で解説
問題概要 図書館でのさまざまな操作を記録・照会する図書館管理システムを構築することになったとしましょう。ここで、次の3つのコマンドを実装するよう求められています。 コマンド1:棚xにyページの本を挿入したことを記録する。 コマンド2:棚xにあるy番目の本のページ数を出力する。 コマンド3:棚xにある本の総冊数を出力する。 コマンドは「{コマンド種別, x, y}」という形式の2次元配列として与えられ、yの値がない場合は0がデフォルト値として使われます。そして、与えられたコマンドの実行結果を出力します。 入出力の例 たとえば、棚の数が4、クエリの数が4、入力配列が{{1, 3, 23}, {
-
【C言語】再帰的バブルソートのプログラムと実装方法を解説
バブルソートとはバブルソートは、隣り合う要素同士を比較しながらデータを整列させる、最も基本的なソートアルゴリズムの一つです。すべての要素を複数回のパス(周回)に分けて比較し、1回目のパスで最大値を末尾に配置し、2回目のパスで2番目に大きい値を後ろから2番目の位置へ、という具合に、リスト全体が完全に整列するまで処理を繰り返します。本記事では、このバブルソートを再帰呼び出しを使って実装するC言語のプログラムを、動作の流れや具体例とあわせてわかりやすく解説します。バブルソートのアルゴリズムint arr[5] = { 5, 4, 2, 1, 3 };int i, j;i = 0 から i<配列
-
グローバル変数の再宣言はOK?CとC++の挙動の違いをサンプルコードで徹底解説
C言語とC++では、同じコードを書いても変数の再宣言に対する扱いが異なります。この記事では、以下の4つのパターンに分けて、実際のサンプルコードと実行結果をもとに両言語の挙動を詳しく解説します。 グローバル変数を初期化なしで再宣言する ローカル変数を初期化なしで再宣言する グローバル変数を初期化ありで再宣言する ローカル変数を初期化ありで再宣言する 1. グローバル変数を初期化なしで再宣言する場合 A) C言語の場合 #include <stdio.h> int var; int var; int main(void) { printf("Var = %
-
C言語のfopen()関数:書き込みモードで既存ファイルを開いたときの挙動と対処法
C言語の fopen() 関数は、指定したファイルを開くために使用される標準ライブラリ関数です。本記事では、書き込みモードで既存のファイルを開いた場合にどのような挙動になるのか、サンプルコードと実行結果を交えながらわかりやすく解説します。 fopen() の基本構文 FILE *fopen(filename, mode) fopen() で使用できる主なオープンモードは次の6種類です。 r … 読み取り専用モード w … 書き込みモード(既存内容は消去) a … 追記(アペンド)モード r+ … 読み書き両用モード w+ … 読み書き両用モード(既存内容は消去) a+ … 読み取り+追記