Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++で中括弧を使わずに2次元行列を整形して出力するテクニック

本記事では、C/C++プログラミングにおいて中括弧(波括弧)を使用せずに、2次元行列を整形して出力する方法を解説します。

中括弧 { } は、プログラミング言語における区切り文字であり、コードブロックやスコープを定義するために使われます。C/C++では、中括弧がないとスコープの範囲を明確にすることが難しくなります。しかし、条件演算子や配列の添字を工夫することで、ループ本体を中括弧なしで記述し、すっきりとしたコードを実現できます。

まずは、基本的な2次元行列の出力コードとその実行結果を見てみましょう。

基本例:中括弧を使った通常の書き方

#include <iostream>
using namespace std;
int main() {
    int arr[2][2] = {{12, 67},
    {99, 5}};
    int n = 2, m = 2;
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            cout<<arr[i][j]<<" ";
        }
        cout << endl;
    }
    return 0;
}

出力結果

12 67
99 5

このコードでは、内側のループで各要素の後に空白を出力し、行の終わりで改行しています。ここから中括弧を取り除くにはどうすればよいのでしょうか。

ポイント:「 \n」[j == n-1] のショートハンド

各行の最後の要素の後ろだけ改行し、それ以外は空白を出力したい場合、次のような簡略記法(ショートハンド)が役立ちます。

" \n"[j == n-1]

これは一見不思議な書き方ですが、仕組みはシンプルです。" \n" は「空白文字」と「改行文字」の2文字からなる文字列であり、j == n-1 という比較式は真なら 1、偽なら 0 に評価されます。つまり、

  • 行の途中(j < n-1)→ 添字 0 → 空白文字が出力される
  • 行の末尾(j == n-1)→ 添字 1 → 改行文字が出力される

この仕組みにより、if文や中括弧を一切使わずに、条件分岐と同じ動作を1行で実現できます。

例えば2×2の行列を出力する場合、最初の要素の後には空白が付き、2番目の要素の後には改行が付くことになります。

実装例:3×3行列の中括弧なし出力

以下は、この手法を実際に実装したプログラムです。

#include<iostream>
using namespace std;
int main() {
    int mat[][3] = {
        {31, 7, 57},
        {42, 1, 99},
        {12, 9, 56}
    };
    int n=3, m=3;
    cout<<"The matrix is : \n";
    for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
        cout<<mat[i][j]<<" \n"[j==n-1];
    return 0;
}

出力結果

The matrix is :
31 7 57
42 1 99
12 9 56

ご覧のとおり、外側・内側どちらのforループにも中括弧がなく、制御文が1文しかないため正しく動作します。行列がきれいな形式で出力されていることも確認できます。

まとめ

" \n"[条件式] という記法は、条件に応じて空白か改行を選択的に出力できる便利なテクニックです。ただし、可読性の観点からは三項演算子 (j == n-1) ? '\n' : ' ' を使う方が意図が伝わりやすいという意見もあります。競技プログラミングなど短いコードが求められる場面では、今回紹介したショートハンドが非常に有用なので、ぜひ覚えておきましょう。

  1. 【C/C++入門】void mainとint mainの違いとは?正しいmain関数の書き方を解説

    C/C++のプログラムでは、エントリーポイントとして int main() を使うこともあれば、void main() を使うこともあります。では、この2つにはどのような違いがあるのでしょうか。本記事では、それぞれの特徴と使い分けのポイントをわかりやすく解説します。 main関数の基本的な役割 main() 関数は、他の関数と同様に引数を受け取り、値を返すことができます。しかし、main() には特別な役割があります。それは、プログラムの実行が必ずこの関数から開始されるという点です。 つまり、main() はオペレーティングシステム(OS)から呼び出される関数であり、main() 内で返された

  2. ループと再帰を使わずにC++で1から100までの数字を出力する方法

    C++で数字を出力する際、通常はfor文やwhile文などのループ構文を使用しますが、ループや再帰を使わずに実現する方法もいくつか存在します。代表的な手法としては、goto文を利用する方法、再帰関数を利用する方法、そしてmain()関数の外に関数を定義して呼び出す方法などが挙げられます。本記事では、その中でもgoto文を使って1から指定した最大値までの数字を出力するC++プログラムの例を紹介します。サンプルコード:goto文を使った出力プログラム#include <bits/stdc++.h> using namespace std; int main() { int co