c-それぞれの個々の単語に入力された不特定の量の数字を変換しようとする

StackOverflow https://stackoverflow.com/questions/19823702

質問

これは、「数千」、「百」などを使用して数字を単語に変換するプログラムに多少似ていることを知っています。しかし、任意のサイズ(543210など)の整数を取り、の出力を作成したいと考えています。 「ファイブフォートゥワンワンゼロ」。私は完全に理解し、仕事をしていると思うスイッチステートメントを使用しています。ある種のループを使用して、整数の各桁を単語に印刷し、次の数字と次の桁を繰り返すことに固執しています。私はこのすべてでかなり新しいので、どんな助けも感謝します!ありがとう。

これが私がこれまでに持っているものです(それほど多くはありませんが、ループを使ってどこに行くかについて立ち往生しています):

#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;

}
役に立ちましたか?

解決 2

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

これがいくつかの部分的なコードです:

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
}

他のヒント

したがって、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

最も理解できる方法IMO(最も効率的ではないにしても)は、10のパワーを使用します。番号から始めたら 543210, 、次に、数字の数が与えられます log10(543210) + 1 = 6。次に

// start with a number
int num = 543210;
// how many digits?
int digits = log10(num) + 1; // 6
// now loop through each digit
for (int i = digits - 1; i > 0; --i) {
  int p = (int)pow(10, i);
  int digit = (num / p) % 10; // we want integer division
  switch (digit) { ... }
}

(覚えておいてください #include <math.h>.)

考えられるアプローチの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までに

- の整数分割の結果を処理します numbertenth

- に割り当てます number 残り number で割った tenth

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

2番目の反復で tenth 10(100/10)になり、46/10は4、46%10を与えます。 tenth すべての数字が処理されるため、1に等しくなり、ループが停止します。

@hayriUğurKoltukに触発された制限ソリューション

#include <ctype.h>
#include <stdio.h>
int main() {
  int ch;
  while (((ch = getc(stdin)) != EOF) && (isdigit(ch))) {
    static const char *Digit[10] = { "Zero", "One", "Two", "Three", "Four",
        "Five", "Six", "Seven", "Eight", "Nine" };
    printf("%s ", Digit[ch - '0']);
  }
  puts("\n");
  return 0;
}

単純な再帰ソリューション

static void PrintDigit(unsigned n) {
  static const char *Digits[10] = {
    "Zero", "One", "Two", "Three", "Four",
    "Five", "Six", "Seven", "Eight", "Nine" };
  if (n > 9) {
    PrintDigit(n/10);
  }
  printf("%s ", Digits[n%10]);
}

void PrintDigits(unsigned n) {
  PrintDigit(n);
  printf("\n");
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top