簡體   English   中英

C-嘗試將輸入的未指定數字轉換為它們各自的單詞

[英]C - Trying to convert an unspecified amount of digits entered into their respective individual words

我知道這有點類似於使用“千”,“百”等將數字轉換為單詞的程序。但是,我正在尋找任何大小的整數(例如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;

}

因此,您可以嘗試使用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

最簡單的方法是使用整數除法“ /”和“%”從右側使用數字。

這是一些部分代碼:

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
}

一種可能的方法:

#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 / 10分配給number ,重復),但是這里應該以另一種方式完成-從左到右。 這就是我們要做的:

  • 計算tenth -大於給定數字的10的第一個乘方(例如,如果我們使用546,則為1000)
  • 在每個后續迭代中:

- tenth除以10

-處理number的整數除以tenth

-分配回number的余number除以tenth

在第一次迭代中, tenth變為100(1000/10),546/100給您5(整數除以整數就是整數,十進制被截斷),546%100給您46-作為數字存儲在第二次迭代中。

在第二次迭代中, tenth變為10(100/10),46/10給您4,46%10給您6。下一個周期:10/10 => 1,6/1 => 6,6%1 => 0 。所以tenth等於1,並且循環停止-因為處理了所有數字。

IMO(如果不是最有效的話)使用十次冪的最容易理解的方式。 如果我們以數字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> 。)

一個不受限制的解決方案,靈感來自@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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM