0

これは、「千」、「百」などを使用して数字を単語に変換するプログラムに多少似ていることはわかっています。ただし、任意のサイズの整数 (543210 など) を取得して、 「ファイブ フォー スリー ツー ワン ゼロ」。私は完全に理解し、機能していると思うswitchステートメントを使用しています。ある種のループを使用して整数の各桁を選択し、その単語を出力してから、次の桁と次の桁を繰り返すことに固執しています。私はこれでかなり新しいので、どんな助けでも大歓迎です!ありがとう。

これが私がこれまでに持っているものです(それほど多くはありませんが、ループでどこに行くべきか行き詰まっています):

#include <stdio.h>

int main(void)
{
        int num;

        printf("Please enter an integer: \n");
        scanf("%d", & num);

        while (num==0)
        {
        switch (num)
        {
                case (0):
                        printf("Zero ");
                        break;
                case (1):
                        printf("One ");
                        break;
                case (2):
                        printf("Two ");
                        break;
                case (3):
                        printf("Three ");
                        break;
                case (4):
                        printf("Four ");
                        break;
                case (5):
                        printf("Five ");
                        break;
                case (6):
                        printf("Six ");
                        break;
                case (7):
                        printf("Seven ");
                        break;
                case (8):
                        printf("Eight ");
                case (8):
                        printf("Eight ");
                        break;
                case (9):
                        printf("Nine ");
                        break;
                case (10):
                        printf("Ten ");
                        break;

        }
        }
        return 0;

}
4

5 に答える 5

1

そのため、fgets を使用して文字列を読み取って、文字列の終わりまで (または、私のコード例のように、数字の終わりまで) ループして、数字の名前を出力することができます。

#include <stdio.h>

char *names[10] = {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", };
int main()
{
    char buffer[500] = {0};
    int i = 0;
    fgets(buffer, sizeof(buffer), stdin);
    while (isdigit(buffer[i]))
        printf("%s ", names[buffer[i++] - '0']);

    return 0;
}

http://ideone.com/Ba7Rs3

于 2013-11-06T22:29:52.547 に答える
0

1 つの可能なアプローチ:

#include <stdio.h>

char *digits[10] = {
  "Zero", "One", "Two", "Three", "Four",
  "Five", "Six", "Seven", "Eight", "Nine"
};

int main() {
  int num, digit; 
  long long tenth = 1;
  printf("Please enter an integer: \n");
  scanf("%d", &num);

  while (tenth < num) {
    tenth *= 10;
  }

  while (tenth > 1) {
    tenth /= 10;
    digit = num / tenth;
    num %= tenth;
    printf("%s ", digits[digit]);
  }
  return 0;
}

デモ。説明のために:

何よりもまず、switchここで使用するのはほとんど意味がありません: 数字はその性質上かなり直線的であるため、代わりに (char *digits[10]このコードでは) 文字列の配列に名前を格納できます (そして格納する必要があります)。次に、この数字をインデックスとして使用してこの配列にアクセスするだけで、特定の数字のラベルを取得できます。

次に、このプログラムの主な問題は、入力から各数字を個別に抽出することです。右から左に行く方が簡単です ( の結果を取得しnumber % 10、 に代入number / 10number、繰り返します)、ここでは別の方法、つまり左から右に行う必要があります。これが私たちがすることです:

  • 計算tenth- 指定された数値よりも大きい 10 の最初の累乗 (たとえば、546 を使用する場合、1000 になります)
  • 後続の各反復で:

tenth-- 10 で割る

-- の整数除算の結果を処理しnumberますtenth

-- で割っnumberた余りを代入します。numbertenth

最初の反復tenthで 100 (1000/10) になり、546/100 で 5 (整数を整数で割った整数、小数は切り捨て)、546 % 100 で 46 になり、2 回目の反復の数値として格納されます。

2 回目の反復tenthで 10 (100/10) になり、46/10 で 4、46 % 10 で 6 になります。次のサイクル: 10/10 => 1、6/1 => 6、6%1 => 0。 Sotenthは 1 になり、ループは停止します - すべての数字が処理されるためです。

于 2013-11-06T22:19:52.760 に答える
0

これを行う最も簡単な方法は、整数除算 "/" & "%" を使用して右側から数字を消費することです。

部分的なコードを次に示します。

int digit;
//start a loop
//if num > 10
digit = num % 10;
num = num / 10;
//else
digit = num;
//break the loop

これにより、数字が右から左に出力されます。左から右にしたい場合は、num > 10 の場合、num / 10 のパラメーターを使用して自分自身を呼び出し、数字の値を出力する再帰関数を作成できます。

編集:再帰関数の例を次に示します。

void convertToWords (int num){
    if (num > 10){
        convertToWords(num / 10);
    int digit = num % 10;
    //your switch statement to print the words goes here
}
于 2013-11-06T22:16:02.790 に答える