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

C++で学ぶ例外処理:短すぎるユーザー名を検出する独自例外の定義とユーザー名検証プログラム


文字列形式のユーザー名リストが与えられ、いくつかの条件に基づいて各ユーザー名が有効かどうかを判定するプログラムを考えてみましょう。ユーザー名の長さが5文字未満の場合にスローされる独自の例外を定義する必要があります。有効なユーザー名には「Valid」を、無効なユーザー名には「Invalid」を返し、短すぎるユーザー名に対しては例外をスローします。有効なユーザー名の条件は以下の通りです。

  • ユーザー名は必ず5文字以上の長さであること

  • ユーザー名の中に「w」が2つ連続して含まれていないこと

例えば、入力が unames = ["amit", "to", "paul_tim", "greg_harry", "towwer"] の場合、出力は [Too short: 4, Too short: 2, Valid, Valid, Invalid] となります。最初の2つは文字数が足りず、最後の1つは「w」が2回連続しているためです。それ以外はすべて条件を満たしています。

解決のためのアプローチ

この問題は、以下の手順で解決できます。

  • BadLengthException という名前の例外クラスを定義する

  • what() メソッドが実際の文字数を返すようにする

  • u_name を引数に取る validation() 関数を定義する

  • isValid を true で初期化し、n に u_name のサイズを代入する

  • n < 5 の場合は BadLengthException(n) をスローする

  • i = 0 から i < n-1 の範囲でループ処理を行う:

    • u_name[i] が 'w' であり、かつ u_name[i + 1] も 'w' である場合は isValid を false に設定する

  • 最後に isValid を返す

  • main メソッドからは、unames 内のすべてのユーザー名に対して検証を行い:

    • 有効な場合は「Valid」を出力する

    • 無効な場合は「Invalid」を出力する

    • 文字数が少なすぎる場合は「Too short」と出力する

実装例

以下の実装を見ると、より理解が深まるでしょう。

#include <iostream>
#include <vector>
#include <exception>
using namespace std;
class BadLengthException{
    public:
    int x;
    BadLengthException(int n) {
        x=n;
    }
    int what() const throw(){return x;}
};
bool validation(string u_name) {
    bool isValid = true;
    int n = u_name.length();
    if(n < 5) {
        throw BadLengthException(n);
    }
    for(int i = 0; i < n-1; i++) {
        if(u_name[i] == 'w' && u_name[i+1] == 'w') {
            isValid = false;
        }
    }
    return isValid;
}
int main() {
    vector<string> unames = {"amit", "to", "paul_tim", "greg_harry", "towwer"};
    for(int i = 0; i < unames.size(); i++){
        string u_name = unames[i];
        try {
            bool isValid = validation(u_name);
            if(isValid) {
                cout << "Valid" << '\n';
            } else {
                cout << "Invalid" << '\n';
            }
        } catch (BadLengthException e) {
            cout << "Too short: " << e.what() << '\n';
        }
    }
}

入力

{"amit", "to", "paul_tim", "greg_harry", "towwer"}

出力

Too short: 4
Too short: 2
Valid
Valid
Invalid

コードのポイント

BadLengthException クラスは、コンストラクタで実際の文字数を受け取り、what() メソッドを通じてその値を返します。validation() 関数ではまず文字数のチェックを行い、5文字未満であれば例外をスローします。main 関数側では try-catch ブロックによって例外を捕捉し、「Too short: 」というメッセージとともに実際の文字数を表示しています。このように独自の例外クラスを定義することで、エラーの種類に応じた柔軟なエラーハンドリングが可能になり、コードの可読性と保守性も向上します。

  1. C++で直方体の体積と表面積を計算するプログラムの作成方法

    直方体とは? 直方体とは、6つの長方形の面から構成される三次元の立体図形です。各面の縦と横の長さが異なるため、全体として異なる長さの辺を持っています。立方体と直方体の違いは、立方体では長さ・高さ・幅がすべて等しいのに対し、直方体ではこれら3つが必ずしも同じではないという点です。 直方体の主な性質は以下のとおりです。 6つの面 12本の辺 8つの頂点 以下は直方体のイメージ図です。 問題の概要 直方体の長さ(L)、幅(W)、高さ(H)が与えられたとき、その総表面積と体積を求めるのが課題です。表面積とは各面が占める空間の広さのことであり、体積とはその形状が内包できる空間の大きさのことです。

  2. C++で学ぶクイックソート(QuickSort)の仕組みと実装方法

    クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率