大化通信

大化物流開発合同会社の社員から技術発信をしていきます

成績ランク算出プログラムを設計・製造してみた(プログラム実装編)

はじめに

どうも、迷走星人です。 2回目はプログラム実装の話を出来たらと思います。 尚、この段階では以下の工程が完了しているものとします。

  • プログラムの設計&レビュー

開発環境

今回のプログラム開発の環境を以下にまとめます。

ツール一覧 用途
Visual Studio 2019 Commnuity ソースコードの編集
・プログラムのデバッグ
・プログラムテスト
WinMerge 差分確認
TortoiseSVN バージョン管理

いずれのツールもプログラム開発をする時に開発者が重用しているソフトになりますので、各ツールの詳細はこの記事では省略します。
一応、それぞれの公式HPを以下に掲載しておきます。

開発準備

  1. レポジトリの作成 開発するプロジェクトのソースコードのバージョン管理のためのレポジトリを作成します。 任意の空のフォルダを作成し、その下でTortoiseSVNの「ここにレポジトリを作成」を選択します。 レポジトリを作成すると、下図のようなフォルダ・ファイルが生成されます。

  2. チェックアウト レポジトリが作成出来たら、次は開発するプログラム用にレポジトリをチェックアウトします。 開発用のフォルダを用意し、その下に1.で作成したレポジトリをチェックアウトします。

  3. プロジェクトの作成 チェックアウトが出来たら、開発用のプロジェクトを作成します。 今回の開発では空のプロジェクトを作成し、その中にソースコード等を追加していきます。

コーディング

開発準備が整ったら、いよいよコーディング作業に入ります。 ここからは実際にプログラムの機能を実現するためにソースコードを追加・編集していきます。 尚、ソースコードを追加・編集した時はその都度SVNにコミットし、変更履歴として残していくようにします。 後になって手戻り作業が発生した時、残していた履歴を辿ってリカバリ出来るようにするためです。 コミットする目途としては、

  • 新しいファイル・関数の追加
  • ロジックの大きな変更

を行った時等です。勿論、自分の好みのタイミングでコミットしても問題ありません。 今回のプログラムでは以下のソースコードを追加・編集していきます。

ソースコード ファイル名称 内容
main.cpp プログラム本体ファイル プログラム本体を実装する。
GetGradeRankCom.h 共通ヘッダーファイル プログラム共通で使用する定義、構造体を記載する。
ClassFileReadWrite.h ファイル読み書き機能クラスファイル(*.h) ファイル読み書き機能の関数を宣言する。
ClassFileReadWrite.cpp ファイル読み書き機能クラスファイル(*.cpp) ファイル読み書き機能の関数の実態部分を記載する。
ClassCalcGradeRank.h 成績ランク算出機能クラスファイル(*.h) 成績ランク算出機能の関数を宣言する。
ClassCalcGradeRank.cpp 成績ランク算出機能クラスファイル(*.cpp) 成績ランク算出機能の関数の実態部分を記載する。

変数定義

プログラムの中で使う定義値を以下の様に設定します。

定義名 定義値 用途
COM_SUCCESS 0 戻り値(成功)
COM_FAILED -1 戻り値(失敗)
COM_MODER 0 読込
COM_MODEW 1 書込

構造体宣言

プログラムの中で使う構造体を以下の様に設定しています。

structGradeRank
メンバー変数 データ型 用途
name char配列 名前
grade char配列 点数
rank char配列 成績

構造体のメンバ変数は全部char配列の形で持たせ、各機能の内部処理で必要に応じてキャストして使用していきます。

関数実装

定義値、構造体が設定できたら、次は関数の実装に入ります。 プログラム設計に書いた仕様に基づき、ソースコード上に実装していきます。

ファイル読み書き機能(関数名:FileReadWrite)
項目 名称 データ型 用途 IN・OUT
引数 1 file char * ファイルパス IN
2 mode int モード
・COM_MODER:読込
・COM_MODEW:書込
IN
3 list vector<structGradeRank> 配列データ
(名前、点数、ランク)
IN/OUT
戻り値 COM_SUCCESS int 成功 OUT
COM_FAILED 失敗
成績ランク算出機能(関数名:CalcGradeRank)
項目 名称 データ型 用途 IN・OUT
引数 1 list vector<structGradeRank> 配列データ
(名前、点数、ランク)
IN/OUT
戻り値 COM_SUCCESS int 成功 OUT
COM_FAILED 失敗
実際の実装(main.cpp)
/// <summary>
/// 成績ランク算出プログラムメイン関数
/// </summary>
/// <param name="argc">コマンドライン引数の数</param>
/// <param name="argv">コマンドライン引数(結果ファイル)</param>
/// <returns>戻り値(COM_SUCCESS:成功、COM_FAILED:失敗)</returns>
int main(int argc, char **argv)
{
    // ファイル名
    char FPath[BUFSIZE1024];   memset(FPath, 0x00, BUFSIZE1024);
    // 配列データ
    vector<structGradeRank> ArrGradeRank;    ArrGradeRank.clear();
    // 戻り値
    int Ret = COM_SUCCESS;

    cout << "大化技術通信用プログラム開始" << endl;

    // インスタンスを生成
    ClassFileReadWrite clsFileReadWrite;
    ClassCalcGradeRank clsCalcGradeRank;

    // カレントディレクトリパスを取得
    TCHAR DName[MAX_PATH];
    GetCurrentDirectory(MAX_PATH, DName);
    WideCharToMultiByte(CP_ACP, 0, DName, -1, FPath, BUFSIZE1024, NULL, NULL);
    cout << "カレントディレクトリ:"  << FPath << endl;

    // ファイルの存在チェック
    string FAbsPath = FPath;
    FAbsPath += "\\";
    FAbsPath += argv[1];   // 結果ファイル名
    struct stat statFile;
    cout << "FAbsPath:" << FAbsPath << endl;
    // 結果ファイルのステータス情報取得結果で判定
    if (stat(FAbsPath.c_str(), &statFile) != 0)
    {
        cout << "ファイルがプログラムと同じ場所にありません。" << endl;
        return COM_FAILED;
    }
    memset(FPath, 0x00, BUFSIZE1024);
    strcpy_s(FPath, FAbsPath.c_str());

    // ファイル読込
    Ret = clsFileReadWrite.FileReadWrite(FPath, COM_MODER, ArrGradeRank);
    if (COM_SUCCESS != Ret)
    {
        cout << "ファイル読込に失敗しました。" << endl;
        return Ret;
    }

    // 成績ランク算出
    Ret = clsCalcGradeRank.CalcGradeRank(ArrGradeRank);
    if (Ret != COM_SUCCESS)
    {
        cout << "成績ランク算出に失敗しました。" << endl;
        return Ret;
    }

    // ファイル書込
    Ret = clsFileReadWrite.FileReadWrite(FPath, COM_MODEW, ArrGradeRank);
    if (COM_SUCCESS != Ret)
    {
        cout << "ファイル書込みに失敗しました。" << endl;
        return Ret;
    }

    cout << "大化技術通信用プログラム終了" << endl;

    return Ret;
}
ソースコードの解説
  • 引数で結果ファイル名を指定し、GetCurrentDirectory関数でカレントディレクトリのパスを取得しています。
    ディレクトリのパスはTCHAR型で取得しているので、char型配列のFPathに設定するためにWideCharToMultiByte関数を呼出して設定しています。
  • カレントディレクトリのパスとコマンドライン引数で指定した結果ファイルを結合させ、stat関数を呼出して結果ファイルのステータス情報取得結果の判定でプログラムと同じディレクトリに格納されているか確認しています。
  • ファイル読み書き機能、成績ランク算出機能はクラスファイルで実装しているので、インスタンスを生成後に関数を呼び出しています。
実際の実装(ClassFileReadWrite.cpp)
/// <summary>
/// ファイル読み書き機能
/// </summary>
/// <param name="fname">結果ファイルのファイル名</param>
/// <param name="mode">モード(0:読込、1:書込)</param>
/// <param name="list">配列データ(点数, 成績ランク)</param>
/// <returns>戻り値(0:成功、-1:失敗)</returns>
int ClassFileReadWrite::FileReadWrite(char* file, int mode, std::vector<structGradeRank>& list)
{
    int i;
    char fname[BUFSIZE1024];
    std::string tmpBuf;

    // NULLチェック
    if (NULL == file)
    {
        return COM_FAILED;
    }
    strcpy_s(fname, BUFSIZE1024, file);

    if (COM_MODER == mode)
    {
        // 読込
        std::ifstream ifs;
        std::string r_ss;
        std::vector < std::string > vec;    // 切り出し文字列格納関数
        size_t current;                     // 文字列切り出し開始位置
        size_t found;                       // 文字列切り出し終了位置

        // ファイルオープン
        ifs.open(fname, std::ios::in);
        if (!ifs)
        {
            // ファイルオープン失敗
            return COM_FAILED;
        }

        // データ読み取り
        while (std::getline(ifs, tmpBuf))
        {
            if (tmpBuf.empty()) continue;
            structGradeRank data;
            memset(&data, 0x00, sizeof(structGradeRank));

            // 行データ分割
            // 文字列から半角カンマ「,」を検索し、見つかった箇所までの文字列を抜き出す
            vec.clear();
            current = 0;
            found = tmpBuf.find_first_of(',');
            while (current < found)
            {
                // 文字列切り出し
                std::string subStr(tmpBuf, current, found - current);
                vec.push_back(subStr);

                current = found + 1;
                found = tmpBuf.find_first_of(',', current);

                if (std::string::npos == found)
                {
                    found = tmpBuf.size();
                }
            }

            // 分割成功(リストの要素数が2以上)
            if (2 <= vec.size())
            {
                // リストに格納
                strcpy_s(data.name, vec.at(0).c_str());
                strcpy_s(data.grade, vec.at(1).c_str());
                list.push_back(data);
            }
        }

        // ファイルクローズ
        ifs.close();
    }
    else if (COM_MODEW == mode)
    {
        // 書込
        std::ofstream ofs;

        // ファイルオープン
        ofs.open(fname, std::ios::out);
        if (!ofs)
        {
            // ファイルオープン失敗
            return COM_FAILED;
        }

        // データ書込み
        for (i = 0; i < list.size(); i++)
        {
            ofs << list.at(i).name << "," << list.at(i).grade << "," << list.at(i).rank << std::endl;
        }

        // ファイルクローズ
        ofs.close();
    }
    else
    {
        return COM_FAILED;
    }

    return COM_SUCCESS;
}
ソースコードの解説
  • ファイルのオープンクローズは「open/close」関数を用いています。
  • 実装した関数の第2引数(変数名:mode)で読込/書込を制御するようにしています。
  • 読込時、ファイル中のデータは「getline」関数を使い、行単位でデータを取得しています。データが取れなくなれば、読込処理を終了します。
  • 読込時のファイル中の行方向の分割は半角カンマ「,」を区切り文字として以下の処理フローで行っています。区切り文字の見つけ方には「find_first_of」関数を使用しています。

行データ分割処理フロー図初期化現在位置(current=0)検出位置(found)を取得(find_first_of関数)文字列切り出し(subStr関数)現在位置更新検出位置(found)を取得(find_first_of関数)検出位置(found)を文字列のサイズに更新yes行の末尾に到達?検出ループリストに格納名前成績yes分割成功?

  • 書込時は、リストに格納したデータを「名前」「成績」「ランク」の順に半角カンマ「,」を間に挟みながら書込を行います。
実際の実装(ClassCalcGradeRank.cpp)
/// <summary>
/// 成績ランク算出機能
/// </summary>
/// <param name="list">配列データ(点数, 成績ランク)</param>
/// <returns>戻り値(0:成功、-1:失敗)</returns>
int ClassCalcGradeRank::CalcGradeRank(std::vector<structGradeRank>& list)
{
    int i;

    // 配列チェック
    if (0 == list.size())
    {
        return COM_FAILED;
    }

    // 成績ランク算出
    for (i = 0; i < list.size(); i++)
    {
        std::string strVal = list.at(i).grade;
        try
        {
            // string->doubleに変換
            double dVal = stod(strVal);

            if ((90 <= dVal) && (dVal <= 100))
            {
                list.at(i).rank = 'A';
            }
            else if ((75 <= dVal) && (dVal < 90))
            {
                list.at(i).rank = 'B';
            }
            else if ((60 <= dVal) && (dVal < 75))
            {
                list.at(i).rank = 'C';
            }
            else if ((0 <= dVal) && (dVal < 60))
            {
                list.at(i).rank = 'D';
            }
            else
            {
                list.at(i).rank = 'E';
            }
        }
        catch (...)
        {
            list.at(i).rank = 'E';
        }
    }
    
    return COM_SUCCESS;
}
ソースコードの解説
  • 配列リストがNULL(サイズが0)の時、成績ランク機能は処理を中断し、戻り値「COM_FAILED」を返すようにします。
  • 成績ランク算出機能のループ処理の中で、string型からdouble型に変換する時、0~100点の範囲内にある実数の場合は値に応じて成績ランクを算出します。それ以外は全て例外処理で成績ランク「E」を付けるように実装しています。

コードレビュー

ソースコードの実装が一通り完了したら、ソースコードのレビューをしてもらいます。 レビュー時はソースコード実装時にコミットしていた変更分、あるいは、変更前後のソースコードを比較してその差分を説明しながらレビューアーに説明していきます。 そこでレビューアーから指摘を受けた場合は、その指摘事項を記録し、レビュー後ソースコードに反映します。 大抵は専用のレビューシートが用意され、指摘事項はそこに記述されていきます。 指摘事項を全て反映した後、再レビューの依頼を発行し、指摘事項の反映を確認してもらえたらシートにレビューアーからのフォロー(承認)を記載してもらいます。

次回予告

ここまでプログラム実装について発表しました。 次回は以下のタイトルで続きを発表して行こうと思います。

  • 成績ランク算出プログラムを設計・製造してみた(プログラム試験設計編)

成績ランク算出プログラムを設計・製造してみた(プログラム設計編)

はじめに

どうも、迷走星人と申します。 私は過去に社内のセミナーで発表した、成績ランク算出プログラムをテーマにプログラムの設計~試験の流れを何回かに分けて発表していこうと思います。 1回目はプログラム設計について発表していこうと思います。

要求内容

以下の要求に対応したプログラムの開発を進めていきます。

  • 学力試験(100点満点)の結果ファイルを読み込み、点数を元に成績ランクを求め、同じファイルに書き込む。
  • Windows10 or 11で動作、プログラムと入出力ファイルは同じフォルダ内に存在するものとする。

プログラム仕様書設計

要求内容の確認

まずはプログラムを開発する前に、要求内容の確認をしておきます。 ここで疑問に思ったことは要求者に確認を行い、自分と要求者の間で認識のずれが起きないようにします。 確認事項が複数ある時は、質問表(QAリスト)に記載し、まとめて回答してもらうようにします。 今回の場合、自分は以下の事項をQAリストに記載し、要求者から回答を頂いた、という体で話を進めていきます。

No. 確認内容 回答内容
1 試験成績は整数のみ、という認識で合っているか? 小数点第1位までの単位で実数も取ることとする。
(小数点第2位で四捨五入)
2 結果ファイル中の試験の成績と成績ランクの区切りは半角のカンマ「,」という認識で合っているか? 半角カンマ「,」で区切る。
3 試験成績が0~100点の範囲外の場合はどうするか? 成績ランク「E」と算出させる。
4 試験成績が書かれていない(空白のままの)結果ファイルを読み込んだ場合は? ファイルに成績ランクを追記しないようにする。

開発するプログラムの全体イメージ

要求者と要求内容の認識合わせが出来たら設計書作成の作業に入ります。 設計書作成時、自分が開発するプログラムの全体像が分かるように図に興しておきます。 ここでの図は簡素なもので構いません。 外部の人間が見える範囲で作成していきます。 今回はPlantUMLを使い、ユースケース図で下図の様に描きました。

プログラム概要任意のフォルダ結果ファイルプログラム④:算出ユーザー①:格納⑥:確認②:実行③:読取⑤:追記

プログラムの全体イメージが掴めたら、今回の自分の改造前後で何が変わるかを書き出してみます。 ここでまとめた内容を確認することが後の試験工程での試験方針になります。

変更前後 対応前後の振る舞いの内容
変更前 結果ファイルを読込み、点数を元に成績ランクを算出して
同じファイルに書き込まない
変更後 結果ファイルを読込み、点数を元に成績ランクを算出して
同じファイルに書き込める

開発するプログラムの運用の流れ

開発したプログラムでの運用の流れもこの段階でまとめておきます。
ユースケース図に書いた①~⑥に着目し、運用フローに興していきます。 この運用の流れは試験仕様書の設計時に参考にしていきます。

プログラム運用フロー①:結果ファイルをプログラムがあるフォルダに格納する②:プログラムを実行する第1引数:結果ファイル名③:結果ファイルから成績を読み取る④:成績ランクを算出する⑤:プログラムが算出した成績ランクを結果ファイルに追記する⑥:結果ファイルを確認するyes成績ランク追記成功?noyes成績ランク算出成功?noyesファイル読み取り成功?noyesプログラムと結果ファイルは同じ場所に設置?no

プログラムの仕様

運用の流れが見えてきたら、外から見た時のプログラムの仕様をまとめます。 ここでは「入力」、「出力」、「実装する機能」について、以下の仕様で設計していきます。

入力
  • 結果ファイル名
出力
  • 結果ファイル(成績ランク有)
実装する機能
ファイルの読み書き機能
  • 結果ファイルに書かれた点数を読込み、試験データ配列に格納する。
  • 点数及び成績ランクを格納した試験データ配列のデータを結果ファイルに書き込む。
成績ランク算出機能
  • 結果ファイルから取得した点数に応じた成績ランクを振り分ける。
  • 成績ランクの振り分け方は以下の通りに行う。

成績ランク算出フロー読み取った点数成績ランク:「A」成績ランク:「B」成績ランク:「C」成績ランク:「D」成績ランク:「E」90点以上100点以下 その他75点以上90点未満60点以上75点未満0点以上60点未満

機能詳細

各機能の入出力、処理内容が整理できたら、より詳細な箇所を詰めていきます。
アクティビティ図を使い、各機能の内部のロジック(論理)を整理していきます。

ファイルの読み書き機能
入力
  • 試験成績ファイル名
  • 動作モード[読込/書込]
出力
  • 試験データ配列[点数]
  • 戻り値
処理フロー

ファイル読み書き機能処理フロー図ファイル名がNULL?yes動作モードで分岐読込書込結果ファイルを開く行データ取得行データ分割配列にデータ格納(点数)yes分割成功?行データループnoファイルオープン失敗?yes結果ファイルを閉じる結果ファイルを開く配列データ取得結果ファイルにデータ(点数、ランク)書込配列データループnoファイルオープン失敗?yes結果ファイルを閉じる戻り値を返す

成績ランク算出機能
入力
  • 試験データ配列[点数]
出力
  • 試験データ配列[点数,成績ランク]
  • 戻り値
処理フロー

成績ランク算出機能処理フロー図配列がNULL?yes配列データ(点数)取得データの「型」で分岐整数 or 実数それ以外読み取った点数成績ランク:「A」成績ランク:「B」成績ランク:「C」成績ランク:「D」成績ランク:「E」配列データ格納配列データ格納(ランク:「E」)配列ループ戻り値を返す90点以上100点以下 その他75点以上90点未満60点以上75点未満0点以上60点未満

次回予告

ここまでプログラム設計について発表しました。 次回は以下のタイトルで続きを発表して行こうと思います。

  • 成績ランク算出プログラムを設計・製造してみた(プログラム実装編)

【初心者向け】SQL文の書き方

みなさん、こんにちは大化社員の まめだぬき です。

 

今回は初心者向けにSQL文の書き方についてまとめてみました!

その中でSQLの基本操作 SELECT文、WHERE句、ORDER BY句、INSERT文、UPDATE文、DELETE文について書き方と使用例を交えて紹介します。

 

 

SQLとは?

SQLとは「データベースを操作する言語」の事です。

 

My SQLSQL Serverなどという言葉があるのでよく混合されがちですがこの2つはデータベースを管理するシステムでSQL自体はデータベース言語なのです。

 

使用するテーブル

今回は使用例にこちらのテーブルを使用していきます。

テーブル名(表):shohin

カラム名(列)  :id , name , yen

 

 

SELECT文

SELECT文とはデータベースからデータの検索・抽出を行います。

 

書き方:

 SELECT  [カラム名(列)]  FROM  [テーブル名(表)]

 

SELECTは、表示させたいカラム(列)を選びます。

表示させたいカラムが複数ある場合はそれぞれを[ , ](カンマ)でつなぎます。

FORMは、取り出したいテーブル(表)を選びます。

※こちらも表示させたいテーブルが複数ある場合にそれぞれを[ , ](カンマ)でつなぎますが、この複数のテーブルを結合させることをテーブル結合と言います。これは別の機会があれば紹介出来たらと思います。

 

使用例:

まずは全てのレコード(行)を抽出しようと思います。

SELECT id,name,yen FROM shohin

 

実行結果:

実行結果のようにテーブルからIDがそれぞれ01,02,03...、nameがりんご,みかん...と全てのレコードを抽出されていることが確認できます。

 

※テーブルから全てのカラムを指定したい場合は[ * ](アスタリスク)を使用すると全てのカラムを抽出することができます。

書き方:

SELECT * FROM [テーブル名(表)]

指定したいカラムが多い場合や、とりあえずデータを確認したい時に便利です。

 

WHERE句

where句とはテーブルからデータを抽出する条件指定を行います。

 

書き方:

SELECT  [カラム名(列)]  FROM  [テーブル名(表)] WHERE [条件]

[条件]には演算子を使ってカラムに条件の値を指定します。

値を指定する時は値を[ ' ](シングルコーテーション)で囲みます。

※値を[ ' ](シングルコーテーション)で囲むと文字として扱います。

 

使用例:

今回はIDが02のレコードだけ抽出しようと思います。

SELECT id,name,yen FROM shohin WHERE id = '02'

 

実行結果:

実行結果のようにIDが02のレコードだけが抽出されていることが確認できました。

 

複数条件

WHERE句で絞り込みの条件が複数必要な場合は条件をそれぞれANDもしくはORでつなぎます。

AND

複数の条件の両方を満たしているレコードを表示させたい場合に使用します。

書き方:

SELECT  [カラム名(列)]  FROM  [テーブル名(表)] WHERE [条件1] AND  [条件2]

このように条件1と条件2をAND でつなぐことで条件1と条件2の両方を満たしているレコードのみが表示されます。

 

使用例:

今回はIDが01かつ120円のレコードを抽出しようと思います。

SELECT id,name,yen FROM shohin WHERE id = '01' AND yen = '120'

 

実行結果:

実行結果のようにIDが01で120円のレコードだけが抽出されていることが確認できました。

 

OR

複数の条件のどちらかが満たしているレコードを表示させたい場合に使用します。

書き方:

SELECT  [カラム名(列)]  FROM  [テーブル名(表)] WHERE [条件1] OR  [条件2]

このように条件1と条件2をORでつなぐことで条件1か条件2を満たしているレコードが表示されます。

 

使用例:

今回はバナナと120円のレコードを抽出しようと思います。

SELECT id,name,yen FROM shohin WHERE name = 'バナナ' OR yen = '120'

 

実行結果:

実行結果のようにバナナと120円のレコードが抽出されていることが確認できました。

 

ORDER BY句

ORDER BY句とはレコードの並び替えを行います。

 

書き方:

SELECT  [カラム名(列)]  FROM  [テーブル名(表)] ORDER BY  [カラム名(列)] [昇順,降順]

 

ORDER BYの後にカラムを指定することでそのカラムを昇順、降順で並び替えを行います。また、指定したいカラムが複数ある場合はそれぞれを[ , ](カンマ)でつなぎます。

 

昇順の指定

昇順の指定にはASCを使います。

 

降順の指定

降順の指定にはDESCを使います。

 

※昇順降順の指定をしない場合は自動的に昇順になります。

 

使用例:

今回は円を昇順で並び替えようと思います。

SELECT id,name,yen FROM shohin ORDER BY yen ASC

 

実行結果:

実行結果のように円の昇順で並び替えされていることが確認できました。

 

WHERE句とORDER BY句の併用

WHERE句とORDER BY句を併用することでテーブルを絞り込みと並び替えが同時に行えます。

 

書き方:

SELECT  [カラム名(列)]  FROM  [テーブル名(表)] WHERE [条件] ORDER BY  [カラム名(列)] [昇順,降順]

 

WHEREの条件式の後ろにORDER BYを指定します。

 

使用例:

今回はバナナと120円の商品を抽出し、円を降順で並び替えをしようと思います。

SELECT id,name,yen FROM shohin WHERE name = 'バナナ' OR yen = '120' ORDER BY yen DESC

実行結果:

実行結果のようにバナナと120円のレコードのみが抽出され、円の降順に並んでいるのが確認できました。

 

INSERT文

INSERT文とはレコードの追加を行います。

書き方:

INSERT INTO [テーブル名]([カラム名1],[カラム名2],...) VALUES([値1],[値2],...)

INSERT INTOの後にテーブル名を指定し、カッコでカラムを指定しカラムをそれぞれ[ , ](カンマ)でつなぎます。

VALUESの後ろにカッコでそれぞれ値を指定します値もそれぞれ[ , ](カンマ)でつなぎます。

 

使用例:

今回はIDが06でレモンを120円でレコードを登録しようと思います。

INSERT INTO shohin (id,name,yen) VALUES('06','レモン','120')

実行結果:

 

実行結果はこのように1行挿入されたというメッセージが出ます。

ではSELECTしてみましょう。

IDが06のレモンのレコードが追加されたのを確認出来ました。

このように左から順にINSERT INTOで指定したカラムから順にVALUESで指定した値が登録されます。

 

UPDATE文

UPDATE文とはレコードの更新を行います。

 

書き方:

UPDATE [テーブル名(表)] SET [カラム(列)] = [値] WHERE [条件]

UPDATEの後にテーブル名を指定し、SETの後に変更したいカラムに値を=(イコール)で指定します。
そしてWHEREで絞り込み条件を指定すると条件にあったレコード(行)が更新されます。

 

使用例:

先程追加したIDが06のレモンの120円を110円に更新しようと思います。

UPDATE shohin SET yen = 110 WHERE id = '06'

実行結果:

実行結果はこのように1行更新されたというメッセージが出ます。

ではSELECTして更新されているか確認してみましょう。

実行結果:

IDが06のレモンが120円から110円に更新されているのを確認できました。

このようにWHEREで条件指定したレコードがSETで指定した更新処理に更新されます。

 

DELETE文

DELET文とはレコードの削除を行います。

書き方:

DELETE FROM [テーブル名(票)] WHERE [条件]

DELETE FROMの後にテーブル名を指定し、WHEREで対象のレコードを指定します。

 

使い方:

今回は先程追加したIDが06のレモンのレコードを削除しようと思います。

DELETE FROM shohin where id = '06'  

実行結果:

実行結果はこのように1行削除されたというメッセージが出ます。

ではSELECTして削除されているか確認してみましょう。

IDが06のレモンのレコードがテーブルから削除されているのを確認できました。

このようにWHEREで条件指定したレコードが削除できます。

注意:

DELETE 文ではWHEREで条件指定しなくても処理は通りますが、

テーブルのレコードを全てを消してしまいます。



以上になります。今回は初心者向けにSQL文の基本的な書き方を紹介しました。

SQLシステム開発などにおいて必須と言っても過言ではないので

この記事をきっかけにSQLを学んで頂けたら幸いです。

【VSCode】ウォッチ式しか勝たん

みなさん こんにちは大化社員のSRです。

VSCode(VisualStudioCode)でのデバッグ時に非常に役にたった機能の紹介です。

その名はウォッチ式です。
用途としては複数の変数などを確認したいときに有効的です。
「変数」という機能でも複数の変数を確認することが出来ますが、存在する変数しか確認できません。
しかし、ウォッチ式では式の形でも確認することが出来るのです。

4つご紹介させていただきます。
3つ目までは基本で4つ目は番外編です。

※言語はPHPを使用します。
例えば、下記の変数があるとします。
$a=2;
$b=3;

【基本】
1.複数の変数を確認する場合
ウォッチ式に$a、$bを追加します。

sr1
追加後、下記のように表示されます。
$a:2
$b:3
sr2

2.変数に演算子を使用する場合
ウォッチ式に$a+$bを追加します。

sr3

追加後、下記のように表示されます。
$a+$b:5
sr4

3.IF文の判定結果を確認する場合
$a==1、$a==2の追加後、下記のように表示されます。
sr5

【番外編】
4.結果の文字列や数値を追加することでメモする場合
$aは2であるの追加後、結果はエラーになってしまいますが、下記のように表示されます。
sr6

ウォッチ式に追加したものはデバッグ中にしか確認することはできませんが、再度デバッグしたときでも追加したものは消えません。

ファイルに直接コードを書き込まなくて済むので使いこなせればとても便利だと思います!

【初心者向け】そもそもjQueryって何?

皆さん こんにちは、読書大好き大化社員の紙魚(シミ)ちゃんです。
普段はPHPC#を使って開発をしています。
しかしWeb開発では別言語を使う人の画面を修正する場合も多く、そんな時よくjQueryで苦労していました。

今回は そもそもjQueryって何? について書いてみようと思います。


jQueryとは
JavaScriptのコードを簡潔に書くことを目的に開発されたライブラリです。
短いコード量で動かせることや、どのブラウザでも同じコードが使えるため効率的に開発できることなどがメリットとして挙げられます。
最近はTypeScriptが出てきたために使用されなくなってきているそうですが、TypeScriptとはちがってコンパイルしなくても使用できるという利点もあります。


…ライブラリって?
いや、そもそもライブラリって何?!という人のために。
ライブラリとは汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもので、いわゆるプログラムの集合体…といった方が分かりやすいでしょうか。

そもそもライブラリ(library)には「図書館、図書室、文庫 etc…」といった意味があります。

ー例ー
仲良し図書館においてある本には料理のレシピや裁縫のコツなど色んな情報があり、それらの本は日本語で書かれている

jQueryという図書館においてある本にはチェンジイベントやアニメーションなどを入れるための色んな情報があり、それらはJavaScriptという言語で書かれている

ような感じです。 あくまでイメージですがね。

まあざっくりいうとJavaScriptをより便利かつ早く使えるようにしたパーツのようなものがjQueryで、JavaScriptだと数十行近く書かないといけないような処理でもたった1行書くだけで出来ちゃうようになります。


デメリット
ここまでの記載で「まあ便利!」といいたいところですが、良いことばかりというわけではありません。
まず動作が重たくなりやすいこと。
JavaScriptの挙動が各ブラウザによって微妙に違うケースが多々ありますが、jQueryではこれらブラウザの違いをあらかじめ吸収できるように設計されており、様々な処理がバックグラウンドで動いているため動作が遅くなってしまいがちです。

次にほかのライブラリ・フレームワークと競合すること。
別のライブラリやフレームワークを採用するケースも多く、jQueryが使われていると予期せぬ動作をする場合があります。
その際、共存させるための処理を別途行うか、jQueryJavaScriptに置き換えるといった手間が生じてしまいます。


jQueryJavaScriptの使い分け
じゃあjQueryJavaScriptはどう使い分けたらいいの?
選ぶ基準は「パフォーマンス」、つまり実行速度や反応の良さ、伝送速度です。

パフォーマンスを重視したい場合にはjQueryよりも高速で処理できるJavaScriptのほうが良いと言えるでしょう。
しかし、パフォーマンスをそれほど重視しない小~中規模程度のプロジェクトであればjQueryのほうが圧倒的に便利です。



今回は「そもそもjQueryってなんなの?」という過去の自分に送りたい内容でした。
誰かのお役に立てますように。

【Visual Studio2019】おすすめショートカットキー

こんにちは、大化社員のパクチーです。

今回は、Visual Studio2019で使える便利なショートカットキー機能を5つご紹介したいと思います!

新しいプロジェクトを作成

【 Ctrl + Shift + N 】 
プロジェクトを新たに始める際にCtrl + Shift + N を押すと、新しいプロジェクトのテンプレートを選択できます。これにより、新規プロジェクトを素早く立ち上げることができます。

ファイルを開く

【 Ctrl + O 】 
Ctrl + O を押すと、ファイルの名前を入力するダイアログボックスが表示され、迅速に特定のファイルを開けます。プロジェクト内で必要なファイルを素早く見つけて開始できます。

ブレークポイントを設定、解除

F9 】 
デバッグ中にコードの特定の行でプログラムを一時停止させたい場合、その行でカーソルを置き、F9 キーを押すとブレークポイントが設定されます。再度押すとブレークポイントが解除されます。

コードのコメントアウト、解除

コメントアウト 【 Ctrl + K 、Ctrl + C 】 
コードの一部を選択し、Ctrl + K 、Ctrl + C と続けて押すと、選択したコードがコメントアウトされます。
解除 【 Ctrl + K 、Ctrl + U 】
コードの一部を選択し、Ctrl + K 、Ctrl + U と続けて押すと、コメントが解除されます。

エラーに対する修正を提案

【 Ctrl + 】 
コード内でエラーが検出されたとき、Ctrl + . (ドット)キーを押すと、エラーに対する修正提案が表示されます。これにより、エラーを簡単に修正できます。


以上、5つのショートカットキーを紹介しました。
皆さんも是非、お好きなショートカットを使いながら、Visual Studioでの開発作業をスムーズに行ってみてください。

読んでくださり、ありがとうございました!!

【初心者向け】Javaの条件分岐と繰り返し処理

こんにちは。大化社員のeriです。 初心者向けにJavaの条件分岐と繰り返し処理について、どれを使えばいいか迷ったときに選びやすいようにシンプルにまとめました。

条件分岐

if文

  • if文は条件は複数の条件をチェックし、真の条件に該当する場合に対応するコードを実行できます。
  • 複雑な条件式(論理演算子など)を含めることができます。
if (条件) {
 // 条件が真の場合に実行されるコード
} else if (別の条件) {
 // 別の条件が真の場合に実行されるコード
} else {
 // いずれの条件も偽の場合に実行されるコード
}
if文の使用例

成績(scoreの値)に応じて異なるメッセージを表示します。

int score = 85;
if (score >= 90) {
 System.out.println("成績は優秀です。");
} else if (score >= 70) {
 System.out.println("成績は良いです。");
} else if (score >= 50) {
 System.out.println("成績は合格です。");
} else {
 System.out.println("成績は不合格です。");
}

結果

成績は良いです。

switch文

  • switch文は値に基づく一致を必要とし、式の値が特定の条件(case)と一致する場合、その条件に対応するコードを実行します。
  • switch文の条件は整数型や文字型の定数式である必要があります。
  • switch文にbreakが無い場合、該当するcaseが実行された後、次のcaseも実行されます。これは意図しない結果を生むことがあるため、多くの場合は特定のcaseが実行されたあとに他のcaseが実行されないようにbreakを記載します。
switch (式) {
 case 値1:
  // 値1に一致する場合に実行されるコード
  break;
 case 値2:
  // 値2に一致する場合に実行されるコード
  break;
 default:
  // いずれのcaseにも一致しない場合に実行されるコード
 }
switch文の使用例

数字で表された曜日(day)に対応する曜日名(dayName)を表示します。

int day = 3;
String dayName;

switch (day) {
 case 1:
  dayName = "月曜日";
  break;
 case 2:
  dayName = "火曜日";
  break;
 case 3:
  dayName = "水曜日";
  break;
  // 他の曜日に対するcase文を追加
 default:
  dayName = "不明な曜日";
}
System.out.println("今日は" + dayName + "です。");

結果

今日は水曜日です。

繰り返し処理

for文

  • for 文は反復回数が既知である場合や特定の回数だけ繰り返しをする場合に使用されます。
  • カウンタ変数の値が特定の条件を満たさなくなった場合にループが終了します。
for (初期化式; 条件式; 変化式) {
 // 実行したいコードを記述
}
for文の使用例

1から10までの整数を合計します。 i変数が1から10まで順番に増加し、それをsum変数に加算していきます。

int sum = 0;
for (int i = 1; i <= 10; i++) {
  sum += i;
}
System.out.println("合計: " + sum);

結果

合計: 55

拡張for文(for-each文)

  • 拡張 for 文は条件式がありません。対象となる配列やコレクションの要素の数だけ繰り返しを行います。
  • ListやMapなどの配列を処理するのに便利です。
for (データ型 変数名 : コレクションまたは配列) {
 // 要素に対する処理
}
拡張for文の使用例

リスト内の整数を反復処理し、それらの合計を計算します。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int number : numbers) { 
  sum += number;
}
System.out.println("合計: " + sum);

結果

合計: 15

while文

  • while文は特定の条件が満たされている限り繰り返しを続けるため、反復回数が不明な場合に使用されます。
  • for 文とは異なり初期化式や変化式はありません。初期化式は while 文の前で宣言などを行い、条件式が変化するような処理はブロックの中で行います。
int i = 0;
while (条件式) {
 // 実行したいコードを記述
}
while文の使用例

整数を1から順番に2乗し、2乗した数が10を超えるとループを終了します。

int i = 1;
while (true) {
 int square = i * i;
 if (square > 10) {
  break; // 2乗した数が10を超えたらループを終了
 }
 System.out.println(i + " の2乗は " + square);
 i++; 
}

結果

1 の2乗は 1
2 の2乗は 4
3 の2乗は 9

do..while文

  • while 文とほぼ同じですが、条件式の評価が繰り返しの最後で行われるため、少なくとも一回は繰り返し処理が行われます。
  • ループの終了条件がループ内で計算される場合に使用されます。
do{
 // 実行したいコードを記述
 ...
}while (条件式);
do..while文の使用例

1から10までの偶数を表示します。

int number = 1;
do {
 if (number % 2 == 0) {
  System.out.println(number);
 }
 number++;
} while (number <= 10);

結果

2
4
6
8
10

繰り返し処理のbreak

  • breakは繰り返し処理内で特定の条件が満たされた場合、ループを終了するために使用されます。
for文でのbreakの使用例

i が5になると break が実行され、ループが終了します。

for (int i = 1; i <= 10; i++) {
 if (i == 5) {
  break; // ループを終了
 }
 System.out.println(i);
}

繰り返し処理のcontinue

  • continueはループ内での特定の条件に従って、現在の繰り返し処理をスキップし、次の繰り返し処理を開始するために使用されます。
for文でのcontinueの使用例

i が3のとき、continue が実行され、その繰り返し処理のコードがスキップされ、次の繰り返し処理が開始されます。そのため3は出力されません。

for (int i = 1; i <= 5; i++) {
 if (i == 3) {
  continue; // iが3の場合、この繰り返し処理をスキップ
 }
 System.out.println(i);
}

以上になります。Javaの条件分岐と繰り返し処理で迷った時の参考になれば幸いです。

参考サイト

www.javadrive.jp