ج - محاولة تحويل كمية غير محددة من الأرقام التي تم إدخالها في كلماتها الفردية

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

سؤال

أعلم أن هذا يشبه إلى حد ما البرنامج الذي يحول الأرقام إلى كلمات باستخدام أشياء مثل "الآلاف" ، "مائة" ، إلخ "خمسة أربعة ثلاثة اثنين واحد الصفر". أنا أستخدم بيان التبديل الذي أعتقد أنني أفهمه بالكامل وأعمل. أنا عالق في استخدام نوع من الحلقة لفرد كل رقم من عدد صحيح وطباعة كلمته ، ثم كرر الرقم التالي ، والآخر. أنا جديد إلى حد ما في كل هذا ، لذلك سيكون موضع تقدير أي مساعدة! شكرًا.

إليك ما لدي حتى الآن (ليس كثيرًا ، لكنني عالق في مكان الذهاب مع حلقة):

#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://eadeone.com/ba7rs3

الطريقة الأكثر فهمًا لـ 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>.)

نهج واحد ممكن:

#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. SO tenth أصبح مساوياً لـ 1 ، ويتم إيقاف الحلقة - حيث تتم معالجة جميع الأرقام.

حل لا حدود مستوحى من hayri uğur koltuk

#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