-
【C言語】1枚の紙から切り出せる指定サイズの長方形の最大数を求める方法
ここでは、紙の寸法(長さL、幅B)と、そこから切り出したい小さな長方形の寸法(長さl、幅b)が与えられたとき、1枚の紙から切り出すことができる長方形の最大数を求める問題を解説します。この問題は、以下の手順で解くことができます。まず水平方向の配置を考えます。紙の長さLに対して長方形の長さl、紙の幅Bに対して長方形の幅bを対応させて並べ、切り出せる長方形の数を数えます。次に垂直方向の配置(長方形を90度回転させた場合)でも同様に計算し、数を数えます。最後に、2つの配置パターンで得られた数のうち、大きい方の値を答えとして返します。具体例で確認してみましょう。入力紙: L=18, B=6 / 長方形:
-
C言語で1つの点を通過する最大の異なる直線数を求める方法
問題の概要各直線について、2点の座標 (x1, y1) と (x2, y2) が与えられます。この問題の目的は、与えられた直線の中から、1つの点を通過できる直線の最大数を求めることです。ただし、どの2本の直線も互いに重なり合わず、回転も行われないものとします。直線の表現方法直線は (m, c) のペアで表現します。ここで y = mx + c であり、m は傾きを表します。傾きは次の式で計算できます。m = (y2 − y1) / (x2 − x1)同じ傾き m を持つ直線は、切片が c1 ≠ c2 であれば互いに平行になります。このアルゴリズムでは、異なる傾き(m)の数を数えます。垂直な直線
-
C/C++における初期化されていないプリミティブデータ型の挙動
この記事では、C言語やC++で変数を初期化せずに宣言した場合、その変数がどのような値を持つのかを詳しく解説します。多くの方は「int型には0、float型には0.0など、コンパイラが自動的にデフォルト値を割り当ててくれる」と考えがちです。しかし、char型の場合はどうなるのでしょうか?実際にコードを実装し、複数のコンパイラ・環境でコンパイルして確認してみましょう。実装例(C++)理解を深めるために、以下のサンプルコードを見てみましょう。#include <iostream> using namespace std; int main() { char char_var;
-
CおよびC++における可変長配列(VLA)の徹底解説
本記事では、CおよびC++における可変長配列(Variable Length Array:VLA)について詳しく解説します。可変長配列を利用すると、実行時にサイズが決まる自動配列(スタック上の配列)を柔軟に確保できます。C99での可変長配列のサポートC言語では、C99規格以降、可変長配列が正式にサポートされており、次のように引数で渡された値をもとに配列サイズを指定できます。void make_arr(int n){ int array[n]; } int main(){ make_arr(10);
-
C言語でポインタを使って文字列が回文かどうかを判定する方法
はじめに文字列 s が与えられたとき、その文字列が回文(パリンドローム)であるかどうかを判定することを考えます。ここでは、C言語のポインタを使ってこの問題を解いていきます。例えば、入力が s = racecar の場合、出力は True(1) になります。「racecar」は前から読んでも後ろから読んでも同じ文字列だからです。解法のアプローチこの問題は、2つのポインタを文字列の両端に置き、中央に向かって互いに近づけていくことで効率的に判定できます。手順は以下の通りです。文字列の長さを取得するポインタ forward を文字列の先頭文字に向けるポインタ reverse を文字列の末尾文字に向ける
-
C/C++におけるラムダ関数の重要性とは?基本構文とキャプチャの使い方を解説
ラムダ関数(Lambda Function)とは、メインプログラムのスコープ外に関数本体を持たず、その場で定義できるインライン関数です。 ラムダ関数は、変数に格納できる「値」としても扱えます。また、関数のように呼び出せるオブジェクトとして参照することもでき、このようなオブジェクトはファンクタ(functor)と呼ばれます。 コンパイラがラムダ関数の定義を見つけると、通常、そのラムダ専用のカスタムオブジェクトが生成されます。 ラムダ関数は通常の関数よりも多くの機能を備えています。たとえば「キャプチャ」という仕組みにより、周囲のスコープで使われている変数を取り込むことができます。キャプチャされた変
-
C言語の歴史を徹底解説:デニス・リッチーによる誕生から現代までの歩み
C言語の誕生C言語は、ベル研究所のコンピュータ科学者であるデニス・リッチー(Dennis Ritchie)によって開発された高水準プログラミング言語の一つです。C言語は当初、UNIXオペレーティングシステム(OS)の開発を目的として生まれ、B言語やBCPLといった先行言語が抱えていた課題を克服するために設計されました。UNIXとC言語:切っても切れない関係UNIXオペレーティングシステムの開発は1969年に始まりました。その後、1972年にはUNIXのコードがアセンブリ言語からC言語へと書き直されました。この書き換えにより、UNIXは移植性の高いOSとなり、さまざまなハードウェア上で動作できる
-
Cプログラムを機械語に変換する4つのステップを徹底解説
プログラムの作成と実行の流れプログラムとは、プログラミング言語で記述された一連の命令の集まりです。プログラマーの仕事は、プログラムを作成し、その動作を確認することです。Cプログラムを機械語に変換して実行可能な形にするまでには、次の4つのステップが必要です。プログラムの作成と編集プログラムのコンパイルプログラムのリンクプログラムの実行1. プログラムの作成と編集プログラムの作成には「テキストエディタ」を使用します。テキストエディタを使えば、文字データの入力・修正・保存が自由に行えます。多くの場合、コンパイラには専用のテキストエディタが付属しています。プログラムを書き終えたら、ファイルとしてディス
-
C言語の型変換入門:暗黙的変換と明示的変換(キャスト)の違いを徹底解説
あるデータ型を別のデータ型へ変換することを「型変換(type conversion)」と呼びます。C言語における型変換には、主に以下の2種類があります。 暗黙的な型変換(implicit conversion) 明示的な型変換(explicit conversion) 暗黙的な型変換とは 演算対象(オペランド)同士のデータ型が異なる場合、コンパイラが自動的に行う型変換です。 プログラマが特に指示しなくても、小さいデータ型から大きいデータ型への変換が自動的に実行されます。これを「型の昇格」とも呼びます。 int i,x; float f; double d; long int l;
-
C言語の暗黙的な型変換を使って大文字「A」のASCII値を求める方法
暗黙的な型変換とは暗黙的な型変換(implicit conversion)とは、プログラマが明示的に指定しなくても、コンパイラが自動的に小さなデータ型をより大きなデータ型へ変換する仕組みです。C言語では、char型とint型が同じ式の中で混在すると、char型は自動的にint型へ昇格(整数拡張)されます。例えば、大文字「A」のASCII値は65です。本記事では、文字「A」を入力として与え、暗黙的な型変換を利用してそのASCII値である65を取得する方法を解説します。サンプルコード:大文字「A」の場合以下は、暗黙的な型変換を使用して大文字「A」のASCII値を求めるプログラム例です。#inclu
-
C言語のmain()関数に引数を指定することは可能?argcとargvの使い方を解説
はい、C言語ではmain()関数に引数を指定することが可能です。C言語におけるコマンドライン引数とは、システムのコマンドライン上でプログラム名の後ろに指定する引数のことです。これらの引数の値は、プログラムの実行時にプログラムへと渡されます。main関数に渡すことができる引数は、argcとargvの2つです。ただし、main()関数は実際にはターミナルからプログラムを実行した際に、オペレーティングシステム(またはシェルプログラム)によって呼び出されるという点に注意が必要です。つまり、開発者が直接main()関数を呼び出すのではなく、OSがコマンドライン引数を受け取ってmain()関数に引き渡す仕
-
【C言語】ループ文やgoto文を使わずに名前を10回出力する方法
はじめにC言語では、同じ処理を繰り返し実行したい場合、通常はfor文やwhile文などのループ文を使用します。しかし、「ループ文もgoto文も一切使わずに、同じ文字列(名前)を複数回出力せよ」という課題に挑戦してみましょう。この記事では、再帰呼び出し(リカージョン)を使った解決方法を中心に、サンプルコードと実行結果を交えてわかりやすく解説します。問題の概要課題は次のとおりです。ユーザーから名前を入力してもらうその名前を10回画面に出力するただし、ループ文(for / while / do-while)およびgoto文は使用禁止通常、コードブロックを繰り返すにはループ文が使われますが、条件がfa
-
C言語のscanf()関数で発生しやすい一般的なエラーとその原因・対処法
問題点C言語でscanf()関数を使用して文字列や数値データを読み込む際、多くのプログラマーが遭遇する典型的なエラーがあります。特に、整数値を読み込んだ直後に文字列を読み込もうとすると、意図した通りに入力を受け取れず、処理がスキップされてしまうという問題が頻繁に発生します。原因と解決策scanf()関数は、標準入力(stdin)から書式付きのデータを読み込むための関数です。正常に読み込めた場合は読み込んだ項目の数を返し、失敗した場合には負の値(EOF)を返します。このエラーの主な原因は、scanf()で整数を読み込んだ際に、ユーザーが入力した数字の後の改行文字(\n)が入力バッファに残ってしま
-
C言語で整数入力後に文字列が読み取れない原因と解決方法
問題の概要 C言語のプログラミングでは、scanf関数で整数値を入力した直後に文字列(char配列)を読み込もうとすると、文字列入力が正しく行われないという問題が発生することがあります。本記事では、この問題の原因と具体的な解決方法を詳しく解説します。 発生する原因 整数値を入力してEnterキーを押すと、その改行文字(\n)が標準入力バッファ内に残留します。続いて文字列を読み込もうとすると、バッファに残っていたこの改行文字が文字列の最初の文字として格納され、文字列入力がそこで即座に終了してしまいます。 これは、scanf関数が改行(ヌル文字として扱われる)を読み取ると、その時点で入力処理を終
-
C言語の配列初期化入門:コンパイル時初期化と実行時初期化の違いをわかりやすく解説
C言語において、配列の初期化方法は大きく分けて「コンパイル時初期化」と「実行時初期化」の2種類があります。この記事では、配列の基本概念をおさらいしながら、それぞれの初期化方法の特徴や構文、具体的なサンプルコードと実行結果を交えて詳しく解説します。 配列とは 配列とは、連続したメモリ領域に格納された複数のデータ(要素)の集合体です。各要素には「添字(インデックス)」を使ってアクセスできます。同じ型のデータをまとめて効率的に扱えるため、C言語プログラミングの基礎となる重要な概念です。 コンパイル時初期化(静的初期化) コンパイル時初期化では、配列の値をソースコードの中に直接記述します。考え方は
-
【C言語入門】forループでピラミッドや直角三角形などさまざまなパターンを出力する方法
問題 C言語において、ピラミッドや直角三角形のように、数字や記号をさまざまな形式(パターン)で出力するには、どのようなロジックを組めばよいのでしょうか? 解決策 数字や記号をさまざまなパターンで出力するには、forループを活用します。基本となる考え方は次のとおりです。 外側のループ:現在何行目を出力しているかを制御します。 内側のループ:その行に出力する空白・数字・記号の個数を制御します。 この「二重ループ」を組み合わせることで、行ごとの出力内容を柔軟に変化させ、目的の図形パターンを描くことができます。 例1:ピラミッドを出力するCプログラム 以下は、入力された行数分だけ星印(*)でピ
-
C言語のストレージクラス徹底解説|auto・extern・static・registerの違いとサンプルコード
C言語には、変数や関数の「有効範囲(スコープ)」と「寿命」を決めるストレージクラスが用意されています。ストレージクラスを正しく理解することで、メモリの使い方やプログラムの動作をより細かく制御できるようになります。 ストレージクラスとは? ストレージクラスとは、Cプログラム内で宣言された変数や関数のスコープ(有効範囲)と寿命(生存期間)を定義する概念です。これにより、その変数がどこからアクセス可能で、いつまで値を保持するのかが決まります。 C言語の4つのストレージクラス C言語で使用できるストレージクラスは以下の4種類です。 auto(自動変数) extern(外部変数) static(静的変
-
C言語で5×5行列の行合計と列合計を計算するプログラム
問題 実行時(ランタイム)にユーザーから値を入力し、5×5の2次元配列(行列)の行ごとの合計と列ごとの合計を計算するCプログラムを作成しましょう。 解決策 このプログラムでは、実行時にコンソールから5×5の行列の要素を1つずつ入力します。二重のforループを組み合わせることで、行方向・列方向それぞれの合計をシンプルなロジックで求めることができます。 行合計を求めるロジック 外側のループ変数 i が行、内側のループ変数 j が列に対応します。1行分の要素をすべて加算したら、合計を表示して変数を0に戻します。 for(i=0;i<5;i++){ // i は行 &nb
-
【C言語】動的メモリ確保を使って配列の最大値・最小値を求めるプログラム
C言語では、実行時に必要なメモリ量を柔軟に確保できる「動的メモリ確保」という仕組みが用意されています。本記事では、動的メモリ確保を活用して、配列内の最大値と最小値を求めるプログラムを解説します。問題C言語で動的メモリ確保を使用し、配列の中から最大値と最小値を見つけるプログラムを作成します。動的メモリ確保とは動的メモリ確保を利用すると、C言語のプログラマはコンパイル時ではなく実行時(ランタイム)にメモリを割り当てることができます。これにより、ユーザーの入力サイズなどに応じて柔軟にメモリを管理できます。実行時にメモリを動的に確保するために使用される主な関数は以下のとおりです。malloc()関数:
-
C言語のポインタ入門!宣言・初期化から配列アクセスの実例まで徹底解説
ポインタ(pointer)とは、他の変数のメモリアドレスを格納するための変数です。C言語においてポインタは、メモリを直接操作したり、関数間でデータを効率的にやり取りしたりするために欠かせない重要な概念です。 ポインタの宣言・初期化とアクセス まず、次のような通常の整数変数の宣言を見てみましょう。 int qty = 179; 変数qtyには値「179」が格納されると同時に、メモリ上のどこかにその格納場所(アドレス)が割り当てられます。 ポインタの宣言 int *p; 「p」はポインタ変数であり、別の整数型(int)変数のアドレスを保持します。変数名の前にアスタリスク(*)を付けることで、「こ