-
C言語で左矢印パターンと右矢印パターンを出力するプログラム
プログラムの概要 このプログラムは、C言語を使って星(*)で構成された左矢印パターンと右矢印パターンをコンソールに出力します。ユーザーが行数を入力すると、その行数に応じた矢印の形が表示されます。for文の入れ子(二重ループ)の動きを学ぶのに最適な題材です。 アルゴリズム まず、矢印パターンを出力するための行数をユーザーから受け取ります。その後、次の手順でパターンを描画していきます。 星(*)で矢印の上半分を出力する 星(*)で逆右三角形を出力する 星(*)で矢印の下半分を出力する 星(*)で右三角形を出力する 左矢印パターンのロジック 左矢印パターンは2つのループで構成されます。前半のループ
-
C言語で中実・中空の菱形(ひし形)パターンを出力するプログラム
プログラムの概要 本記事では、C言語を使用して、下図のような中実(塗りつぶし)の菱形と中空(外枠のみ)の菱形の星形パターンをコンソールに出力する方法を解説します。 アルゴリズム 中空の菱形(Hollow Rhombus)の場合 1. ユーザーから中空菱形の行数を入力してもらう 2. 入力された行数と同じ行数を持つ中空の菱形を作成する 3. 1行目は、行数と同じ個数のアスタリスク(*)をすべて出力する 4. 2行目以降は、各行の先頭と末尾のみ「*」を出力し、その間は空白のままにする 5. 最終行に達するまで手順4を繰り返す 6. 最終行は、行数と同じ個数の「*」をすべて出力する 中実の菱形
-
C言語で中実(塗りつぶし)・中空の正方形パターンを出力するプログラム
プログラムの概要幾何学において、正方形とは正多角形の一種で、4つの等しい辺と4つの等しい角を持つ図形です。本記事では、C言語を使って「中実(塗りつぶし)の正方形」と「中空の正方形」の2種類のパターンをアスタリスク(*)で出力する方法を解説します。完成した出力イメージは以下のようになります。アルゴリズム中実の正方形の場合1. ユーザーから正方形を描くための行数を入力してもらう 2. 各行ごとに、すべての列に対して「*」を出力する中空の正方形の場合1. ユーザーから正方形を描くための行数を入力してもらう 2. 最初の行と最後の行は、すべての列に「*」を出力する 3. 残りの行では、最初の列と最後の
-
C言語で正方形の中に正方形を表示するプログラムの作り方
プログラムの概要本プログラムは、C言語を使って「正方形の中に正方形」というパターンをコンソールに出力するものです。実行すると、以下のように二重の正方形が表示されます。アルゴリズム描画する外側の正方形の行数をユーザーから入力として受け取る。指定された行数をもとに、外側の正方形を表示する。外側の正方形の内側に、もう一つ小さな正方形を表示する。サンプルコード以下が、正方形の中に正方形を表示するC言語プログラムの完全なソースコードです。/* Program to print Square inside Square */#include <stdio.h>int main(){
-
C言語で2の累乗かどうかを判定する方法(ビット演算の活用)
ある整数 n が与えられたとき、その数が2の累乗(べき乗)であるかどうかを判定する問題を考えてみましょう。例えば、n = 16 の場合は true を返し、n = 12 の場合は false を返します。ビット演算を使った判定方法この問題は、論理演算(ビット演算)を使うことで効率的に解くことができます。2の累乗となる数を2進数で表すと、最上位ビット(MSB)だけが1で、それ以外のビットはすべて0になります。ここで注目すべきは、「n AND (n − 1)」という計算です。n が2の累乗であれば、この演算結果は必ず0になります。具体例として n = 16 を見てみましょう。16 は2進数で「10
-
C言語における構造体(struct)と共用体(union)の違いを徹底解説
C言語における構造体(struct)と共用体(union)の違い C言語には、複数のデータをまとめて扱うための「コンテナ」がいくつか用意されています。同じ型のデータを格納する場合には配列(Array)を使用しますが、intやcharなど異なる型のデータを1つのまとまりとして扱いたい場合には、構造体(struct)と共用体(union)が活躍します。どちらもユーザー定義型の変数を格納することも可能です。 構造体と共用体は「異なる型のデータを保持できる」という点でよく似ていますが、その内部実装には大きな違いがあります。ここでは、両者の重要な相違点を6つの観点から比較して解説します。 構造体と共用体
-
C言語における文字列操作:strlen()とsizeof()の違いを徹底解説
C言語における文字列の長さ取得:strlen() と sizeof() の違いプログラミングにおいて、文字列とは複数の文字(character)が集まって構成されるデータのことです。C言語では、「この文字列には何文字使われているのか」という長さを調べる場面が頻繁にありますが、そのために用意されているのが strlen() と sizeof() の2つのアプローチです。どちらも対象の「長さ」を知るために使用されますが、内部実装やNULL終端文字の扱いなどには重要な違いがあります。まずは、両者の基本的な相違点を表にまとめます。strlen() と sizeof() の比較表No.項目strlen(
-
C言語の構造体と配列の違いとは?7つの観点で徹底比較
C言語における構造体と配列の基本的な違い C言語では、構造体(struct)と配列(array)はどちらもデータを格納するためのコンテナとして利用されます。複数のデータをまとめて管理し、さまざまな操作を行える点は共通していますが、内部実装や使い方には大きな違いがあります。 本記事では、定義・メモリ割り当て・アクセス方法・ポインタなど7つの観点から、両者の違いをわかりやすく解説します。 構造体と配列の比較表 項目構造体(Structure)配列(Array) 1. 定義異なるデータ型の変数をまとめて格納できるデータ構造。同じデータ型の変数のみを格納できるデータ構造。複数のデータ型は扱え
-
【C/C++】float型とdouble型の違いとは?精度・メモリ・範囲を徹底比較
C/C++では、小数点以下を含む数値(浮動小数点数)を扱うために、float型とdouble型という2つのデータ型が用意されています。どちらも浮動小数点数を表現できる点は共通していますが、「精度」の面で大きな違いがあります。端的に言えば、double型はfloat型の約2倍の精度を持っています。これはIEEE 754浮動小数点数規格に基づくもので、double型は「倍精度」、float型は「単精度」と呼ばれます。ビット構成と精度の違い両者の精度をビット構成で比較すると、以下のようになります。double型(倍精度):64ビット構成(符号1ビット+指数部11ビット+仮数部52ビット)。10進数で
-
JavaとC言語の違いとは?主要な相違点を比較表でわかりやすく解説
JavaとC言語の違いJavaとC言語は、プログラミングの世界で最も人気のある言語の2つです。それぞれが持つ重要な特性や機能により、世界中で幅広く活用されています。ここでは、両言語の特徴をもとに、JavaとC言語の主な違いを比較表形式でわかりやすく解説します。JavaとC言語の比較表番号項目JavaC言語1登場時期C言語よりも後に開発された言語です。1995年にジェームズ・ゴスリング(James Gosling)によって開発されました。Javaより先に登場した言語で、1969年から1973年にかけてデニス・M・リッチー(Dennis M. Ritchie)によって開発されました。2言語タイプJ
-
C/C++のstrstr()関数とは?使い方・戻り値・文字列置換への応用例を徹底解説
strstr()関数は、「string.h」ヘッダーファイルに定義されている標準ライブラリ関数の一つで、C言語における文字列操作のために用意されています。主な用途は、主文字列(ここではstr1と呼びます)の中から、指定した部分文字列(str2)が最初に出現する位置を検索することです。構文strstr()関数の基本的な構文は以下の通りです。char *strstr(char *str1, char *str2);パラメータstr1:検索対象となる主文字列str2:str1の中から検索したい部分文字列戻り値部分文字列が主文字列内に見つかった場合、その最初の出現位置を指すポインタ(アドレス)を返しま
-
C/C++のsystem()関数とは?使い方と実行例を徹底解説
この記事では、C/C++におけるsystem()関数の基本的な使い方と動作について、具体例を交えながら詳しく解説します。 system()関数は、C/C++標準ライブラリに含まれる関数の一つです。オペレーティングシステムのコマンドプロセッサ(コマンドプロンプト)やターミナルで実行可能なコマンドをプログラムから渡して実行でき、コマンドの処理が完了すると制御をプログラムに戻します。 この関数を使用するには、ヘッダーファイル<stdlib.h>(C++の場合は<cstdlib>)をインクルードする必要があります。 構文 system()関数の構文は以下の通りです。 int
-
C/C++で分枝限定法(Branch and Bound)を用いて0/1ナップサック問題を解く方法
0/1ナップサック問題と分枝限定法0/1ナップサック問題では、各アイテムを「ナップサックに入れる」か「入れない」かの二者択一で選ばなければなりません。この組み合わせ最適化問題を効率的に解く手法の一つが分枝限定法(Branch and Bound)です。このアルゴリズムの鍵となるのは、「分数(Fractional)ナップサック問題、つまりアイテムを分割して入れられる問題に対しては、貪欲法が最適解を与える」という性質を活用する点です。探索の過程で生じる各ノードについて、この貪欲法を応用して上限値(バウンド)を求めることで、無駄な探索を切り捨てることができます。ある特定のノードからより良い解が得られ
-
C/C++で実装するナンバーリンクパズル ― ランダム盤面生成アルゴリズムの徹底解説
ナンバーリンクとは?ナンバーリンクは、n×n のマス目からなる盤面を使って遊ぶパズルです。盤面上のマスは「空きマス」と「塗りつぶし(障害物)マス」に分かれており、さらに一部の空きマスには「1、2、3…」という整数が割り当てられています。各整数は必ず盤上の異なる2つのマスに置かれており、プレイヤーの課題は、同じ数字同士を縦横移動のみで進む単純経路(一本道)で結ぶことです。その際、次のルールを守る必要があります。異なる経路同士は交差してはならないどの経路も塗りつぶしマスを通ってはならない最終的に、すべての空きマスがいずれかの経路で埋め尽くされていることランダムな問題を生成するアルゴリズムここでは、
-
Aバッファ法とは?C/C++で使われる隠面除去アルゴリズムの基礎知識
コンピュータグラフィックスにおけるAバッファ(A-Buffer)法は、中規模の仮想メモリコンピュータ向けに設計された、シンプルな隠面検出(hidden face detection)の手法です。この技法は「アンチエイリアスバッファ」「領域平均バッファ」あるいは「アキュムレーションバッファ」とも呼ばれています。Aバッファ法とZバッファ法の関係Aバッファ法は、深度バッファ(Zバッファ)法のアルゴリズムを拡張したものです。Zバッファ法は不透明なオブジェクトにしか適用できず、透明なオブジェクトには対応できないという制約があります。その点で、Aバッファ法は透明オブジェクトの処理において大きな利点を持って
-
C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説
AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ
-
C/C++で比較するBASHフォーク爆弾とC実装の違い
BASHフォーク爆弾はなぜC版より強力なのかすでに広く知られているように、BASHで書かれたフォーク爆弾(fork bomb)は、C言語で実装されたものよりもはるかに強力です。その主な原因は、BASHでは生成されたプロセスが親プロセスから切り離される(デタッチされる)点にあります。つまり、最初に起動した親プロセスが破壊されたりkillされたりしても、残りの子プロセスは生き続けます。一方、C言語による実装の場合、親プロセスが破壊または終了されると、それに紐づく子プロセスも自動的に終了してしまいます。これは、スクリプトがシステムと直接やり取りを行う構造になっているためです。C版フォーク爆弾を改良す
-
C/C++三項演算子(?:)に関する興味深い所見と注意点
三項演算子とはC/C++における三項演算子は、if...else文の代わりに使用できる条件演算子で、「?:」という記号で表されます。「?」がif部分に相当し、「:」がelse部分に相当します。この記事では、実際のコード例を通して、三項演算子の型変換に関する興味深い挙動を3つのケースに分けて解説します。例1:正常にコンパイルできるケース以下のプログラムはエラーなくコンパイルできます。これは、三項式の戻り値の型がfloat型(第2オペランド exp2 の型)とみなされ、第3オペランド exp3(int型のリテラル0)がfloat型へ暗黙的に変換可能だからです。#include <iostre
-
C/C++で電話番号のダイヤルに使える文字列の全組み合わせを出力する方法
問題の概要 ある番号が与えられたとき、以下の仕様に基づいて、その番号を電話でダイヤルするために使用できる文字列のすべての組み合わせを表示するプログラムを考えます。 2 →「A」「B」「C」のいずれか 3 →「D」「E」「F」のいずれか ……(以下同様) 7 →「P」「Q」「R」「S」のいずれか 8 →「T」「U」「V」のいずれか 9 →「W」「X」「Y」「Z」のいずれか 1 →「1」のみ 0 →「0」のみ 例として、電話番号として「89」が与えられた場合、プログラムは次の12通りの文字列を出力します。 TW TX TY TZ UW UX UY UZ VW VX VY VZ アルゴリズムの
-
C/C++で学ぶベルトランの投票定理:開票順序から導くリード維持確率
はじめに ベルトランの原論文では、漸化式(再帰関係)を用いて「有利な投票順列の総数」を求める一般公式に基づく証明が示されています。この定理(Bertrands Ballot Theorem)は、開票の過程において一方の候補者が他方の候補者に対して常に厳密にリードし続ける確率を与えるものであり、組合せ論やアルゴリズム設計の分野でも重要な概念です。 具体例 有権者が5人おり、そのうち3人が候補者Aに、残りの2人が候補者Bに投票するとします(すなわち p = 3、q = 2)。このとき、投票が投じられる順序としては、以下の10通りが考えられます。 AAABB AABAB ABAAB BAAAB