Как преобразовать числа слов в целые числа в C? - PullRequest
0 голосов
/ 14 июля 2020

Это продолжение моего предыдущего вопроса. Код, который у меня есть, просит пользователя ввести цифры числа в виде массива символов для вывода числа в его словесной форме. Например, входы «2, 13, 20, 54» выходят «два, тринадцать, двадцать, пятьдесят четыре». Код работает только для чисел меньше 100, и, поскольку ввод представляет собой массив символов, при вводе любого числа из 3 или более цифр отображается сообщение об ошибке, уведомляющее пользователя о том, что число больше или равно 100. Is есть ли способ использовать этот код, чтобы сделать обратное? Например, если пользователь вводит «шестьдесят один», на выходе будет «61», а если пользователь вводит «сто двадцать семь», на выходе будет сообщение об ошибке, поскольку это число больше девяноста девяти. Я использовал этот https://www.geeksforgeeks.org/convert-number-to-words/, чтобы начать свою работу, и большинство других решений, с которыми я столкнулся, находятся в python, и у меня нет опыта, но мое задание требует решения в C. Есть ли способ присвоить целочисленные значения соответствующим строкам? например "один: 1, одиннадцать: 11, двадцать: 20, и т. д. c." Должен ли я включать в свой код «сотни, тысячи, миллионы и т. Д. c» или есть способ для моего кода выдать ошибку, если обнаруживаются строки, отличные от тех, которые я уже перечислил, чтобы указать, что число больше чем 99? Например, если я ввожу «одна тысяча шестьсот пятьдесят», так как «тысяча» и «сотня» не появляются в singleledig, doubledig или multiplesoften, это означает, что число слишком велико? Я подозреваю, что al oop потребуется go через строку ввода, чтобы обнаружить это, но как мне go создать массив строк с использованием моего ввода?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void convertnumtostring(char *num){
    int len = strlen(num);
    if(len==0){
        fprintf(stderr, "empty string\n");
        return;
    }
    if(len>2){
        fprintf(stderr, "number is is equal to or greater than 100\n");
        return;
    }

    char *singledig[]={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    char *doubledig[]={"", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
    char *multiplesoften[]={"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

    printf("\n%s: ", num);
    if(len==1){
        printf("%s\n", singledig[*num - '0']);
        return;
    }

        if(*num == '1'){
            int sum = *num - '0' + *(num + 1)- '0';
            printf("%s\n", doubledig[sum]);
            return;
        } else if(*num == '2' && *(num + 1) == '0'){
            printf("twenty\n");
            return;
        } else {
            int i = *num - '0';
            printf("%s ", i? multiplesoften[i]: "");
            ++num;
            if(*num != '0')
                printf("%s ", singledig[*num - '0']);
        }
}

int main(void){
    char input[10];
    printf("Enter a number: ");
    scanf("%s", input);
    convertnumtostring(input);
    return 0;   

}

1 Ответ

0 голосов
/ 14 июля 2020

К сожалению, я не вижу другого способа ответить на этот вопрос. Что касается вашего вопроса о случаях для миллионов и тысяч, да, вам нужно будет включить случаи, для которых, если есть это слово, вы можете назначить переменную с этим номером. Одна вещь, которую вы можете сделать, - это разделить слова на разные строки в зависимости от расстояния между ними. Это сделало бы код намного проще, а затем сравнить с помощью strcmp. Например: один сотня и тридцать один.

str1 = one
str2 = hundred
str3 = and
str4 = thirty
str5 = one

strcmp(str1,result[i])

// result [i] - это двумерный массив, содержащий все возможные значения, как в вашей программе. Вам также нужно будет перебрать кейсы.

Также в двумерном массиве вы можете сохранить наиболее вероятные значения, которые будут появляться первыми. Это тридцать, сорок и т.д. c.

Для однозначных чисел вы можете проверить длину строки и избежать этой проверки и вызвать другую функцию, чтобы временная сложность не увеличивалась. Это одно из решений, которое я могу придумать.

...