【问题标题】:How to convert numbers to words using basic commands in C如何使用 C 中的基本命令将数字转换为单词
【发布时间】:2018-08-15 09:12:13
【问题描述】:

嗨,我真的是 C 的新手。
我正在做一个练习,我必须编写一个程序,该程序接受两个输入整数(包括 -10 和 10 之间的整数)并输出总和。
但是,显示的从 -10 到 10 的所有数字都将显示为它们各自的单词,任何其他数字都将是数字数字。
我使用的唯一命令是 if's、else if's、else、printf、scanf、int。

一个例子是:

Enter your two integers: 9 2
nine + two = eleven

Enter your two integers: -9 4
negative nine + four = negative five

Enter your two integers: -10 -2
negative ten + negative two = -12

感谢任何帮助。这是我到目前为止所做的,但我不确定,因为它看起来很乏味,但我的朋友说她做的相当快。

#include <stdio.h>

int main(void){
    int number1;
    int number2;
    int sum;
    printf("Please enter two integers: ");
    scanf("%d",&number1,&number2);
    sum = number1 + number2
    if (number1 > 0 && number2 > 0) {
        if (number1 == 1 && number2 == 1) {
            printf("one + one = two");
        }
    }
}

【问题讨论】:

  • 不要使用scanf() 来读取用户输入。 *scanf() 函数系列用于从文件中读取格式良好的数据,而不是潜在的格式错误的用户输入。 (为此,使用fgets() 读取整行并使用例如strtol 解析内存)。 -- 如果你确实使用scanf(),总是检查它的返回值。如果用户输入的不是整数,您的变量不会被初始化。 -- 您只读取一个整数(格式字符串中只有一个%d)。您的 number2 始终未定义。 -- 考虑定义一个单词数组,并使用来自用户的整数作为这些数组的索引。
  • scanf() 返回成功读取的项目数。你想读取两个值,所以如果scanf() 没有返回2,那么你应该中止程序。 ——你学过switch吗?那也行。
  • 如果没问题,你可以在大约 20 个 if 语句中完成它?您只需检查数字是否为负,打印 -,检查数字 0 到 20,然后打印它们各自的单词,将其包装在 void printwordnum(int n) 之类的函数中,然后为每个数字调用 3 次。
  • 或者如果你不能使用函数,只需复制粘贴代码 3 次:3
  • 你确定你至少不能使用函数吗?这个任务对我来说似乎毫无意义,除非这个想法是教你如何编写计算机程序。

标签: c


【解决方案1】:

我使用的唯一命令是 if's、else if's、else、printf、scanf、int。

我同意你的观点,这看起来很乏味。

我想说的一点是,您可以单独计算每个数字 - 这将减少乏味。

例如,修改您的代码...(请注意,这不是可编译的 - 只是稍作修改以提供建议

#include <stdio.h>

int main(void){
    int number1;
    int number2;
    int sum;
    int inputs;

    printf("Please enter two integers: ");

     // scanf replaced with new one including while
     // the first statement below will work provided the user provides the 
     // correct input data....
     //
     // scanf("%d %d",&number1,&number2); // added second %d - need two %d  one for each number
    //
    // would be better to this next scanf command below...
    // if scanf doesn't work due to bad input it will tell the user
    // while (scanf("%d %d",&number1,&number2) !=2) printf("incorrect input\nPlease enter two integers: "); 
    // but this uses 'while' which you haven't used yet if I understand correctly
    // 
    inputs = scanf("%d %d",&number1,&number2);
    if (inputs!=2) {
      printf("Incorrect input data\n"); 
      return 1;
    }
    // if scanf works inputs will have the value 2
    //
    // this if statement stops the program if inputs is not equal to 2
    // 
    sum = number1 + number2

    // the next bit suggested by Groo handles negative numbers nicely....
    if (number1 < 0) { 
      number1 = -number; printf("negative "); 
    }
    // if (number1 > 0 && number2 > 0) 
    if (number1 == 0) {
       printf("zero");
    }
    else if (number1 == 1) {
        printf("one");
    } else if (number1 == 2) {
      printf("two");
    } else if(number1 == 3) {
      printf("three");
    } else if(number1 == 4) {
      printf("four");
    } else if(number1 == 5) {
      printf("five");
    } else if(number1 == 6) {
      printf("six");
    } else if (number1 == 7) {
      printf("seven");
    } else if(number1 == 8) {
      printf("eight");
    } else if(number1 == 9) {
      printf("nine");
    } else if (number1 == 10) {
      printf("ten");
    } else  {
      printf("unknown number");
    } 
    printf(" + ");
     // now insert similar if statements to print number2 ....
      ....

  return 0;

}

希望这是一个有用的建议 - 如果我必须这样做,我会使用数组,我想你很快就会了解。

【讨论】:

  • 分配完全是荒谬的,但我相信OP至少可以单独处理“负面”部分? IE。 if (a &lt; 0) { a = -a; printf("negative"); }.
  • 使用scanf()而不检查返回值。
  • @DevSolar 我认为,因为 OP 没有看到他不知道返回值的函数。
  • @JennyT-Type:没有理由不在答案中展示正确使用。此外,this 特别回答 also 复制粘贴了它只读取 one 值的错误,因此无论用户输入什么都是 UB ...
  • @DevSolar Ops 我错过了那个 UB。 scanf("%d",&amp;number1,&amp;number2);dealing 与其他 UB 现在 xD,你认为我应该尝试编辑答案吗?。
【解决方案2】:

这里的实际算法是简单的部分,只需声明一个指向字符串字面量的指针数组并将其用作查找表:

const char* TEXTUAL [11] = 
{
  "zero",
  "one",
  "two",
  "three",
  "four",
  "five",
  "six",
  "seven",
  "eight",
  "nine",
  "ten"
};  

printf("%s", TEXTUAL[value]);

这里最难的部分是所有的错误检查。您必须从用户那里读取两个整数,检查它们是否有效并且在 -10 到 10 的范围内。然后检查结果是否也在范围内。

我做了一个例子,你可以看看提示。如何在 C 中安全地读取整数是它自己的一章,我创建了一个函数read_2_int,它以安全的方式读取用户输入。如果您是初学者,请暂时忽略该功能并使用scanf("%d", &amp;var)

为了处理负数,我使用函数labs 来获取整数的绝对值。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>

static void halt_and_catch_fire (const char* err);
static void read_2_int (int* i1, int* i2);

int main (void)
{
  int n1;
  int n2;

  printf("Enter your two integers: ");
  read_2_int(&n1, &n2);


  if(n1 > 10 || n1 < -10 || n2 > 10 || n2 < -10)
  {
    halt_and_catch_fire("Only numbers from -10 to 10 supported.");
  }
  if(n1+n2 > 10 || n1+n2 < -10)
  {
    halt_and_catch_fire("The sum must be from -10 to 10.");
  }


  const char* TEXTUAL [11] = 
  {
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
    "ten"
  };  


  if(n1 < 0){ printf("minus "); }
  printf("%s + ", TEXTUAL[labs(n1)] ); // labs = absolute value
  if(n2 < 0){ printf("minus "); }
  printf("%s = ", TEXTUAL[labs(n2)] );
  if(n1 + n2 < 0) { printf("minus "); }
  printf("%s\n", TEXTUAL[labs(n1+n2)] );
}


static void halt_and_catch_fire (const char* err)
{
  /* some manner of error handling here */
  fprintf(stderr, err);
  exit(EXIT_FAILURE);
}

static void read_2_int (int* i1, int* i2)
{
  char input[10];

  if(fgets(input, 10, stdin) == NULL)
  {
    halt_and_catch_fire ("You have to type two integers.");
  }

  char* endptr;
  *i1 = strtol(input, &endptr, 10);
  if(endptr == input)
  {
    halt_and_catch_fire ("Bad number format");
  }

  char* next = endptr;
  *i2 = strtol(next, &endptr, 10);
  if(endptr == next)
  {
    halt_and_catch_fire ("You have to type two integers.");
  }
}

【讨论】:

    【解决方案3】:

    我希望以下代码有用:

    #include <stdio.h>
    
    int main(void){
        int number1;
        int number2;
        int sum;
        char *digits[] = { "zero", "one", "two", "three", "four",
                           "five", "six", "seven", "eight", "nine", "ten"};
    
        printf("Please enter two integers: ");
        scanf("%d",&number1);
        scanf("%d",&number2);
        sum = number1 + number2;
    
        if(number1<0){
            printf("negative ");
            number1=-number1;
        }
        printf("%s",digits[number1]);
        printf(" + ");
    
        if(number2<0){
            printf("negative ");
            number2=-number2;
        }
        printf("%s",digits[number2]);
        printf(" = ");
        printf("%d",sum);
    }
    

    【讨论】:

    • 你能解释一下你是如何想出这个解决方案的吗?
    • digits[] 的大小不一定是 20。也许最好不要指定大小。让编译器弄清楚。而且您还没有提供 10 的字符串。
    • 我创建了名为 digits 的数组来存储数字的字符串表示形式。我使用 number1 和 number2 作为数组的索引来打印输出。
    • @DevSolar 我无法理解“使用 scanf() 而不检查返回值”?你能解释一下吗?
    • @J...S 感谢您的反馈。我编辑了我的代码。我提供了一个 10 的字符串。
    【解决方案4】:

    我编写了一个适用于从 0 到 99,999 的所有数字的程序。 代码如下:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int main() {
    int n,i;
    int rem,r2,k=0;
    char *word[100000];
    char *word_temp[100000];
    char *units[]={" zero"," one"," two"," three"," four"," five"," six"," seven"," eight"," nine"};
    char *teens[]={" ten"," eleven"," twelve"," thirteen"," fourteen"," fifteen"," sixteen"," seventeen"," eighteen"," nineteen"};
    char *tenths[]={" twenty"," thirty"," forty"," fifty"," sixty"," seventy"," eighty"," ninety"};
    char *hundredth[]={" hundred"};
    char *thousandth[]={" thousand"};
    printf("\nenter the number(only positive and less than one lakh): ");
    scanf("%d",&n);
    
    if(n==0){
        word[k++]=units[0];
    
        printf("\nthe number in words: ");
        for(i=(k-1);i>=0;i--)
            printf("%s",word[i]);
    }
    
    else if(n>0&&n<=99999){
        while(n>0) {
            word_temp[k]="";
    
            if((n>999)&&(n<=99999)){
                rem=n/1000;
    
                if((rem>19)&&(rem<=99)){
                    if((rem%10)!=0){
                        word_temp[++k]=units[rem%10];
                        word[k]=word_temp[k];
                        k--;
                    }
                    word_temp[k]=tenths[(rem/10)-2];
                    word[k]=word_temp[k];
                    if((rem%10)!=0)
                        k+=2;
                    else
                        k++;
                }
    
                else {
                    if(rem<10)
                        word_temp[k]=units[rem];
    
                    else if(rem>9&&rem<20)
                        word_temp[k]=teens[rem%10];  
                        word[k]=word_temp[k];
                        k++;
                }
                word_temp[k]=thousandth[0];
                word[k]=word_temp[k];
                k++;
                n=n-(rem*1000);
            }
    
            else if((n>99)&&(n<=999)){
                rem=n/100;
                word_temp[k]=units[rem];
                word[k]=word_temp[k];
                k++;
                word_temp[k]=hundredth[0];
                word[k]=word_temp[k];
                k++;
                word[k++]=" and";
                n=n-(rem*100);
            }
    
            else if((n>19)&&(n<=99)){
                rem=n/10;
                word_temp[k]=tenths[rem-2];
                word[k]=word_temp[k];
                k++;
                n=n-(rem*10);
            }
    
            else if((n>9)&&(n<=19)){
                rem=n;
                word_temp[k]=teens[rem%10];
                word[k]=word_temp[k];
                k++;
                n=n-(rem*1);
                break;
            }
    
            else if((n>0)&&(n<=9)){
                rem=n%10;
                word_temp[k]=units[rem];
                word[k]=word_temp[k];
                k++;
                n=0;
                break;
            }
    
        }
    
        printf("\nthe number in words:\n ");
        for(i=0;i<=k-1;i++)
            printf("%s ",word[i]);
        }
        else {
             printf("\nvalue out of range...Exiting...");
             exit(0);
        }
    
        printf("\n\nprocess terminated... ");
        }
    

    【讨论】:

      【解决方案5】:

      我建议做一个辅助功能

      void numberName(int number){
      
        if (number < 0){
            printf("negative ");
            number=number*(-1);
        }
        if(number == 0){
            printf("zero");
        }else if (number == 1){
            printf("one");
        }else if (number == 2){
            printf("two");
        }else if (number == 3){
            printf("three");
        }else if (number == 4){
            printf("four");
        }else if (number == 5){
            printf("five");
        }else if (number == 6){
            printf("six");
        }else if (number == 7){
            printf("seven");
        }else if (number == 8){
            printf("eight");
        }else if (number == 9){
            printf("nine");
        }else if (number == 10){
            printf("ten");
        }
      }
      

      并在您的 main() 代码中像这样调用此函数:

      numberName(number1);
      printf(" + ");
      numberName(number2);
      printf(" = ");
      numberName(sum);
      printf("\n");
      

      顺便看看你的代码,扫描功能应该是:

      scanf("%d%d",&number1,&number2);
      

      【讨论】:

      • 使用scanf()而不检查返回值。
      • 这是废话,用数组吧。
      猜你喜欢
      • 2019-03-27
      • 2017-03-08
      • 2013-03-22
      • 2016-12-10
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多