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: 」というメッセージとともに実際の文字数を表示しています。このように独自の例外クラスを定義することで、エラーの種類に応じた柔軟なエラーハンドリングが可能になり、コードの可読性と保守性も向上します。
-
C++で直方体の体積と表面積を計算するプログラムの作成方法
直方体とは? 直方体とは、6つの長方形の面から構成される三次元の立体図形です。各面の縦と横の長さが異なるため、全体として異なる長さの辺を持っています。立方体と直方体の違いは、立方体では長さ・高さ・幅がすべて等しいのに対し、直方体ではこれら3つが必ずしも同じではないという点です。 直方体の主な性質は以下のとおりです。 6つの面 12本の辺 8つの頂点 以下は直方体のイメージ図です。 問題の概要 直方体の長さ(L)、幅(W)、高さ(H)が与えられたとき、その総表面積と体積を求めるのが課題です。表面積とは各面が占める空間の広さのことであり、体積とはその形状が内包できる空間の大きさのことです。
-
C++で学ぶクイックソート(QuickSort)の仕組みと実装方法
クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率