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

switch文を使わずにelseif文で数値を英語の単語として出力するC言語プログラムの作り方


課題

C言語において、switch文を使わずに入力された数値を英語の単語として出力するには、どのようにプログラムを書けばよいのでしょうか。

本記事では、if〜else if文による条件分岐と文字列配列を組み合わせて、0〜99までの整数を英単語に変換して表示するプログラムの実装方法を解説します。

解決策:複数の条件分岐で場合分けする

このプログラムでは、2桁の整数を単語として出力するために、以下の条件を順番にチェックしています。

  • if (no < 0 || no > 99)
    入力された数値が0〜99の範囲外の場合は、エラーメッセージを表示します。
  • else if (no == 0)
    数値が0の場合は「zero」と表示します。
  • else if (no >= 10 && no <= 19)
    10〜19の数値(ten〜nineteen)は特殊な呼び方をするため、専用の配列から直接取り出して表示します。
  • else if (no >= 20 && no <= 90)
    20以上の数値の場合、10で割り切れれば十の位の単語のみ(twenty〜ninety)を、割り切れない場合は十の位と一の位の単語を組み合わせて表示します。

使用する3つの文字列配列

プログラムでは、役割ごとに分けた3つの文字列ポインタ配列を用意しています。

  • firstno[] … 「zero」「ten」から「nineteen」まで(0および10〜19の数値用)
  • secondno[] … 「twenty」から「ninety」まで(10の倍数=十の位の単語用)
  • thirdno[] … 「one」から「nine」まで(一の位の数値用)

プログラム全文

#include<stdio.h>
#include<string.h>
int main(){
    int no;
    char *firstno[]={"zero","ten","eleven","twelve","thirteen",
        "fourteen","fifteen","sixteen","seventeen",
        "eighteen","nineteen"};
    char *secondno[]={"twenty","thirty","forty","fifty","sixty",
        "seventy","eighty","ninety"};
    char *thirdno[]={"one","two","three","four","five","six",
        "seven","eight","nine"};
    printf("enter a number:");
    scanf("%d",&no);
    if(no<0 || no>99)
        printf("entered number is not a two digit number\n");
    else if(no==0)
        printf("the entered no is:%s\n",firstno[no]);
    else if(no>=10 && no<=19)
        printf("the entered no is:%s\n",firstno[no-9]);
    else if(no>=20 && no<=90)
        if(no%10 == 0)
            printf("the entered no is:%s\n",secondno[no/10 - 2]);
    else
        printf("the entered no is:%s %s\n",secondno[no/10-2],thirdno[no%10-1]);
    return 0;
}

インデックス計算のポイント

配列の添字は次のように算出しています。

  • 10〜19の場合:firstno[no - 9]
    例:no = 15 のとき firstno[6] = 「fifteen」
  • 10の倍数の場合:secondno[no / 10 - 2]
    例:no = 40 のとき secondno[2] = 「forty」
  • その他の2桁の場合:secondno[no / 10 - 2] と thirdno[no % 10 - 1] を組み合わせる
    例:no = 79 のとき secondno[5] = 「seventy」+ thirdno[8] = 「nine」

整数の除算演算子(/)で十の位を、剰余演算子(%)で一の位を求められる点が、このプログラムの肝となっています。

実行結果

enter a number:79
the enter no is: seventy nine

enter a number:234
entered number is not a two digit number

このように、switch文を使わなくても、elseif文による多段階の条件分岐を活用すれば数値を柔軟に英単語へ変換できます。さらに3桁以上の数値や負の数に対応させたい場合は、範囲チェックの条件を拡張し、百の位用などの配列を追加することで応用が可能です。


  1. 数値を英語の単語に変換するCプログラムの書き方

    数値で構成された文字列が与えられたとき、その数値を英語の単語(スペル表記)へ変換するのが本記事の課題です。例えば、入力が「361」であれば、出力は「Three hundred sixty one」となるようにします。この問題を解くためには、一の位・十の位・百の位・千の位など、それぞれの数字がどの桁に位置しているのかを意識することが重要です。なお、今回紹介するコードは最大4桁、つまり0から9999までの数値に対応しています。したがって、入力は0〜9999の範囲である必要があります。例として「1,111」を考えてみましょう。各桁は以下のように対応します。千の位:1(one thousand)百の位

  2. Cプログラムで行列を対角パターンに沿って数値出力する方法

    この課題は、n×nの行列を対角パターンで出力することです。 例えば n が 3 の場合、対角パターンに従って行列を出力すると、次のような配置になります。 そして、実際の出力結果は以下の通りです。 実行例 Input: 3 Output: 1 2 4 3 5 7 6 8 9 Input: 4 Output: 1 2 4 7 3 5 8 11 6 9 12 14 10 13 15 16 考え方 一見すると、「数値 n を受け取り n×n の行列を生成し、それを対角方向に走査しながら別の行列へ値を格納する」というアプローチが思い浮かびます