C言語基本構文の実践:入出力制御と数学演算

ループ制御による複数行・列のパターン描画

繰り返し処理を活用することで、同じ図形を縦方向に積層したり、横方向に並列配置したりすることができます。以下の例では、for文のイテレーション制御を利用して文字列アートを出力しています。

#include <stdio.h>
int main(void) {
    int counter;
    /* 縦方向への連続出力 */
    for (counter = 1; counter <= 2; counter++) {
        printf(" O\n<H>\nI I\n");
    }
    printf("\n--- 横方向の配置 ---\n");
    /* 横方向への並列出力 */
    for (counter = 0; counter < 2; counter++) printf(" O\t");
    printf("\n");
    for (counter = 0; counter < 2; counter++) printf("<H>\t");
    printf("\n");
    for (counter = 0; counter < 2; counter++) printf("I I\t");
    printf("\n");
    return 0;
}

不等式条件を用いた三角形構成判定

三つの辺の長さが三角形を形成できるかどうかは、三角不等式(任意の二辺の和が残りの一辺より大きい)で検証できます。標準入力からデータを連続で読み取り、条件分岐で判定を行います。

#include <stdio.h>
int main(void) {
    double side_a, side_b, side_c;
    while (scanf("%lf %lf %lf", &side_a, &side_b, &side_c) == 3) {
        if (side_a + side_b > side_c &&
            side_a + side_c > side_b &&
            side_b + side_c > side_a) {
            printf("与えられた長さは三角形を構成できます。\n");
        } else {
            printf("与えられた長さでは三角形を構成できません。\n");
        }
    }
    return 0;
}

単文字入出力と大文字小文字無視の比較

ユーザーからの文字入力を受け取り、論理条件で分岐させる際、入力の大文字・小文字の違いを吸収する必要があります。<ctype.h>tolower()マクロを用いることで、比較ロジックを簡潔かつ堅牢に構築できます。

#include <stdio.h>
#include <ctype.h>
int main(void) {
    char study_flag, practice_flag;
    printf("事前に予習を行っていますか?(y/n): ");
    scanf(" %c", &study_flag);
    printf("実際にコードを入力して演習しましたか?(y/n): ");
    scanf(" %c", &practice_flag);

    if (tolower(study_flag) == tolower(practice_flag)) {
        printf("継続的な学習は確実に成果に繋がります。継続してください。\n");
    } else {
        printf("着実な進歩が必要です。今日から取り組みましょう。\n");
    }
    return 0;
}

複合データ型のフォーマット指定入出力

scanf関数では整数、文字、浮動小数点数を混合して読み込む際、入力バッファの処理に注意が必要です。フォーマット指定子の前に半角スペースを配置することで、改行文字や空白をスキップし、安定した入力処理を実現します。

#include <stdio.h>
int main(void) {
    int num_1, num_2, num_3;
    char chr_1, chr_2, chr_3;
    double val_1, val_2;

    printf("3つの整数を入力: ");
    scanf("%d %d %d", &num_1, &num_2, &num_3);
    printf("確認: %d, %d, %d\n", num_1, num_2, num_3);

    printf("3つの文字を入力: ");
    scanf(" %c %c %c", &chr_1, &chr_2, &chr_3);
    printf("確認: %c, %c, %c\n", chr_1, chr_2, chr_3);

    printf("2つの小数を入力: ");
    scanf("%lf %lf", &val_1, &val_2);
    printf("確認: %lf, %lf\n", val_1, val_2);

    return 0;
}

単位換算と整数型への切り捨て・四捨五入処理

秒数から年数への変換では、浮動小数点数の除算結果に 0.5 を加算してから整数型へキャストすることで、数学的な四捨五入を簡易的に実現できます。

#include <stdio.h>
int main(void) {
    const double TOTAL_SECONDS = 1e9;
    const int SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
    int approx_years = (int)(TOTAL_SECONDS / SECONDS_PER_YEAR + 0.5);
    printf("10億秒は約 %d 年に相当します。\n", approx_years);
    return 0;
}

累乗計算と浮動小数点の繰り返し処理

<math.h>ヘッダのpow関数を利用することで、任意の基底に対する指数計算を容易に行えます。連続入力を処理する際、戻り値のチェックを行い、正しくない入力でのループ脱出や予期せぬ動作を防ぐのが望ましいです。

#include <stdio.h>
#include <math.h>
int main(void) {
    double base_val, result_val;
    while (scanf("%lf", &base_val) == 1) {
        result_val = pow(base_val, 365);
        printf("%.2lf の 365 乗: %.2lf\n\n", base_val, result_val);
    }
    return 0;
}

線形変換による温度単位換算

摂氏と華氏の関係は線形方程式 f = 1.8c + 32 で表されます。浮動小数点数での計算時は、係数を浮動小数点リテラル(例: 9.0 / 5.0)として明示することで、整数除算による精度損失を回避します。

#include <stdio.h>
int main(void) {
    double temp_c, temp_f;
    while (scanf("%lf", &temp_c) == 1) {
        temp_f = temp_c * 9.0 / 5.0 + 32.0;
        printf("摂氏 %.2lf℃ は 華氏 %.2lf℉ です。\n\n", temp_c, temp_f);
    }
    return 0;
}

半周長と海伦の公式を用いた面積計算

三辺の長さが既知の場合、半周長 s を用いた海伦の公式で三角形の面積を算出できます。平方根の計算にはsqrt関数を使用し、出力フォーマットで桁数を制御することで可読性を高めます。

#include <stdio.h>
#include <math.h>
int main(void) {
    double len_a, len_b, len_c;
    while (scanf("%lf %lf %lf", &len_a, &len_b, &len_c) == 3) {
        double semi_perimeter = (len_a + len_b + len_c) / 2.0;
        double area = sqrt(semi_perimeter * (semi_perimeter - len_a) * 
                          (semi_perimeter - len_b) * (semi_perimeter - len_c));
        printf("辺 a=%.0lf, b=%.0lf, c=%.0lf の面積: %.3lf\n", len_a, len_b, len_c, area);
    }
    return 0;
}

タグ: C言語 制御構文 標準入出力 浮動小数点演算 海伦の公式

5月17日 18:15 投稿