Автор Тема: Изписване на числата от 0-999 с думи.  (Прочетена 9632 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

leron

  • Full Member
  • ***
  • Благодарности
  • -Казани: 2
  • -Получени: 9
  • Публикации: 185
Изписване на числата от 0-999 с думи.
« -: 12 Януари 2012, 23:07:16 »
Публикувам го, защото искам да прочета мнения и критики относно логиката на програмата.Тук Джавата не е толкова от значение, интересува ме как би могъл да се оптимизира кода, защото макар че този сякаш работи ми се струва доста некачествен и предполагам, че има далеч по-елегантни решения.
Код: Java
  1. public class HelloJava {
  2.  
  3.         public static void main(String[] args) {
  4.                 Scanner input = new Scanner(System.in);
  5.                 System.out.println("Insert number 1: ");
  6.                 int a = input.nextInt();
  7.                 int Stotici = (int)(a/100);
  8.                 int Desetici = (int)((a%100)/10);
  9.                 int Edinici = (int)(a%10);
  10.                 int Spec = (int)(a%100);
  11.                 String Pismen;
  12.                 switch(Edinici){
  13.                 case 1: Pismen = "i edno";break;
  14.                 case 2: Pismen = "i dve";break;
  15.                 case 3: Pismen = "i tri";break;
  16.                 case 4: Pismen = "i chetiri";break;
  17.                 case 5: Pismen = "i pet";break;
  18.                 case 6: Pismen = "i shest";break;
  19.                 case 7: Pismen = "i sedem";break;
  20.                 case 8: Pismen = "i osem";break;
  21.                 case 9: Pismen = "i devet";break;
  22.                 default: Pismen ="";break;
  23.                                                 }
  24.                 switch(Desetici){
  25.                 case 2: Pismen = "dvaiset "+Pismen;break;
  26.                 case 3: Pismen = "triiset "+Pismen;break;
  27.                 case 4: Pismen = "chetirset "+Pismen;break;
  28.                 case 5: Pismen = "petdest "+Pismen;break;
  29.                 case 6: Pismen = "shestdeset "+Pismen;break;
  30.                 case 7: Pismen = "sedemdeset "+Pismen;break;
  31.                 case 8: Pismen = "osemdeset "+Pismen;break;
  32.                 case 9: Pismen = "devetdest "+Pismen;break;
  33.                 default: Pismen =Pismen+"";break;
  34.                                                 }
  35.                 switch(Spec){
  36.                 case 10: if(a>100){Pismen = "i deset";}else{Pismen="Deset";};break;
  37.                 case 11: if(a>100){Pismen = "i edinaiset";}else{Pismen="Edinaiset";};break;
  38.                 case 12: Pismen = "i dvanaiset";break;
  39.                 case 13: Pismen = "i trinaiset";break;
  40.                 case 14: Pismen = "i chetirinaiset";break;
  41.                 case 15: Pismen = "i petnaiset";break;
  42.                 case 16: Pismen = "i shestnaiset";break;
  43.                 case 17: Pismen = "i sedemnaiset";break;
  44.                 case 18: Pismen = "i osemnaiset";break;
  45.                 case 19: Pismen = "i devetnaiset";break;
  46.                 case 20: if(a>100){Pismen = "i dvaiset";}else{Pismen="Dvaiset";};break;
  47.                 default: Pismen = Pismen+"";break;
  48.                                         }
  49.                
  50.                 switch(Stotici){
  51.                 case 1: Pismen = "Sto "+Pismen;break;
  52.                 case 2: Pismen = "Dvesta "+Pismen;break;
  53.                 case 3: Pismen = "Trista "+Pismen;break;
  54.                 case 4: Pismen = "Chetiristotin "+Pismen;break;
  55.                 case 5: Pismen = "Petstotin "+Pismen;break;
  56.                 case 6: Pismen = "Sheststotin "+Pismen;break;
  57.                 case 7: Pismen = "Sedemstotin "+Pismen;break;
  58.                 case 8: Pismen = "Osemstotin "+Pismen;break;
  59.                 case 9: Pismen = "Devetstotin "+Pismen;break;
  60.                 default: Pismen = Pismen+"";break;
  61.                                            }
  62.           if(a==0)Pismen="Nula";
  63.           System.out.println(Pismen);
  64.         }
  65.                
  66. }
  67.  
« Последна редакция: 12 Януари 2012, 23:17:05 от leron »

Zealar

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 17
  • Публикации: 152
Re: Изписване на числата от 0-999 с думи.
« Отговор #1 -: 12 Януари 2012, 23:30:12 »
Преди да я оптимизираш поне да работи правилно.

Insert number 1:
5
i pet

Иначе на въпроса ти като се замисля текста си е текст трябва да го декларираш но по-добре го подреди в string масиви мисля че ще е по-добре.

leron

  • Full Member
  • ***
  • Благодарности
  • -Казани: 2
  • -Получени: 9
  • Публикации: 185
Re: Изписване на числата от 0-999 с думи.
« Отговор #2 -: 13 Януари 2012, 00:35:49 »
Ето преработената версия, доколкото я тествах връща верни резултати, мерси и за коментара относно използването на стринг масиви.
Код: Java
  1. public class HelloJava {
  2.  
  3.         public static void main(String[] args) {
  4.                 Scanner input = new Scanner(System.in);
  5.                 System.out.println("Insert number 1: ");
  6.                 int a = input.nextInt();
  7.                 int Stotici = (int)(a/100);
  8.                 int Desetici = (int)((a%100)/10);
  9.                 int Edinici = (int)(a%10);
  10.                 int Spec = (int)(a%100);
  11.                 String Pismen;
  12.                 switch(Edinici){
  13.                 case 1: Pismen = "edno";break;
  14.                 case 2: Pismen = "dve";break;
  15.                 case 3: Pismen = "tri";break;
  16.                 case 4: Pismen = "chetiri";break;
  17.                 case 5: Pismen = "pet";break;
  18.                 case 6: Pismen = "shest";break;
  19.                 case 7: Pismen = "sedem";break;
  20.                 case 8: Pismen = "osem";break;
  21.                 case 9: Pismen = "devet";break;
  22.                 default: Pismen ="";break;
  23.                                                 }
  24.                 if(a>9 && Edinici != 0){Pismen = " i "+Pismen;};
  25.                 switch(Desetici){
  26.                 case 2: Pismen = "dvaiset "+Pismen;break;
  27.                 case 3: Pismen = "triiset "+Pismen;break;
  28.                 case 4: Pismen = "chetirset "+Pismen;break;
  29.                 case 5: Pismen = "petdest "+Pismen;break;
  30.                 case 6: Pismen = "shestdeset "+Pismen;break;
  31.                 case 7: Pismen = "sedemdeset "+Pismen;break;
  32.                 case 8: Pismen = "osemdeset "+Pismen;break;
  33.                 case 9: Pismen = "devetdest "+Pismen;break;
  34.                 default: Pismen =Pismen+"";break;
  35.                                                 }
  36.                 if(a>100 && Edinici == 0 && Desetici !=0){Pismen = " i "+Pismen;};
  37.                 if(a<99){
  38.                 switch(Spec){
  39.                 case 10: Pismen="deset";break;
  40.                 case 11: Pismen="edinaiset";break;
  41.                 case 12: Pismen = "dvanaiset";break;
  42.                 case 13: Pismen = "trinaiset";break;
  43.                 case 14: Pismen = "chetirinaiset";break;
  44.                 case 15: Pismen = "petnaiset";break;
  45.                 case 16: Pismen = "shestnaiset";break;
  46.                 case 17: Pismen = "sedemnaiset";break;
  47.                 case 18: Pismen = "osemnaiset";break;
  48.                 case 19: Pismen = "devetnaiset";break;
  49.                 case 20: Pismen = "dvaiset";break;
  50.                 default: Pismen = Pismen+"";break;
  51.                                         }
  52.                                   }
  53.                 else{
  54.                         switch(Spec){
  55.                         case 10: Pismen=" i deset";break;
  56.                         case 11: Pismen=" i edinaiset";break;
  57.                         case 12: Pismen = " i dvanaiset";break;
  58.                         case 13: Pismen = " i trinaiset";break;
  59.                         case 14: Pismen = " i chetirinaiset";break;
  60.                         case 15: Pismen = " i petnaiset";break;
  61.                         case 16: Pismen = " i shestnaiset";break;
  62.                         case 17: Pismen = " i sedemnaiset";break;
  63.                         case 18: Pismen = " i osemnaiset";break;
  64.                         case 19: Pismen = " i devetnaiset";break;
  65.                         case 20: Pismen = " i dvaiset";break;
  66.                         default: Pismen = Pismen+"";break;
  67.                 }
  68.         }
  69.                
  70.                
  71.                 switch(Stotici){
  72.                 case 1: Pismen = "Sto "+Pismen;break;
  73.                 case 2: Pismen = "Dvesta "+Pismen;break;
  74.                 case 3: Pismen = "Trista "+Pismen;break;
  75.                 case 4: Pismen = "Chetiristotin "+Pismen;break;
  76.                 case 5: Pismen = "Petstotin "+Pismen;break;
  77.                 case 6: Pismen = "Sheststotin "+Pismen;break;
  78.                 case 7: Pismen = "Sedemstotin "+Pismen;break;
  79.                 case 8: Pismen = "Osemstotin "+Pismen;break;
  80.                 case 9: Pismen = "Devetstotin "+Pismen;break;
  81.                 default: Pismen = Pismen+"";break;
  82.                                            }
  83.                 if(a==0)Pismen="Nula";
  84.           System.out.println(Pismen);
  85.         }
  86.        
  87. }
  88.  

Zealar

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 17
  • Публикации: 152
Re: Изписване на числата от 0-999 с думи.
« Отговор #3 -: 13 Януари 2012, 00:47:25 »
По скоро нещо такова според мен.

Код: Java
  1. import java.util.Scanner;
  2.  
  3. public class HelloJava {
  4.  
  5.         private static final String[] edinici = {
  6.                 "нула",
  7.                 "едно",
  8.                 "две",
  9.                 "три",
  10.                 "четери",
  11.                 "пет",
  12.                 "шест",
  13.                 "седем",
  14.                 "осем",
  15.                 "девет",
  16.                 "десет",
  17.                 "единадесет",
  18.                 "дванадесет",
  19.                 "тринадесет",
  20.                 "четиринадесет",
  21.                 "петнадесет",
  22.                 "шестнадесет",
  23.                 "седемнадесет",
  24.                 "осемнадесет",
  25.                 "деветнадесет"
  26.         };
  27.         private static final String[] desetici = {
  28.                 "",
  29.                 "двадесет",
  30.                 "тридесет",
  31.                 "четиридесет",
  32.                 "петдесет",
  33.                 "шестдесет",
  34.                 "седемдесет",
  35.                 "осемдесет",
  36.                 "деветдесет",
  37.         };
  38.         private static final String[] stotici = {
  39.                 "",
  40.                 "сто",
  41.                 "двеста",
  42.                 "триста",
  43.                 "четиристотин",
  44.                 "петстотин",
  45.                 "шестстотин",
  46.                 "седемстотин",
  47.                 "осемстотин",
  48.                 "деветстотин"
  49.         };
  50.         public static void main(String[] args) {
  51.                 Scanner input = new Scanner(System.in);
  52.                 System.out.print("Insert number in range 0 - 999 : ");
  53.                 int number = input.nextInt();
  54.                 int size = new String(number + "" ).length();
  55.                 String Pismen = "";
  56.                 if (number < 20) {
  57.                         System.out.println(edinici[number]);
  58.                 }
  59.                 else {
  60.                         //Pismen = edinici[number%10];
  61.                         //Pismen = desetici[(number%100)/10] + Pismen;
  62.                         //Pismen = stotici[number/100] + Pismen;
  63.                         switch(size) {
  64.                         case 1:
  65.                                 break;
  66.                         case 2:
  67.                                 break;
  68.                         case 3:
  69.                                 break;
  70.                         }
  71.  
  72.                 }
  73.           System.out.println(Pismen);
  74.         }
  75. }
  76.  

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: Изписване на числата от 0-999 с думи.
« Отговор #4 -: 17 Януари 2012, 00:55:57 »
Грешно определяте стотиците. И няма нужда от кастване, тъй като няма никакво преобразуване.

Код: Java
  1.       final int e = n / 1 % 10;    // единици
  2.       final int d = n / 10 % 10;   // десетици
  3.       final int s = n / 100 % 10;  // стотици
  4.       final int h = n / 1000 % 10;  // хилядни
  5. //   и т.н.т
  6.  

Направо и една реализация на задачата

Код: Java
  1. import java.util.Scanner;
  2.  
  3. public class SDumi {
  4.  
  5.         static public String sDumi_1_9(int n) {
  6.  
  7.                 switch (n) {
  8.                 case 1:
  9.                         return "edno";
  10.                 case 2:
  11.                         return "dve";
  12.                 case 3:
  13.                         return "tri";
  14.                 case 4:
  15.                         return "chetiri";
  16.                 case 5:
  17.                         return "pet";
  18.                 case 6:
  19.                         return "shest";
  20.                 case 7:
  21.                         return "sedem";
  22.                 case 8:
  23.                         return "osem";
  24.                 case 9:
  25.                         return "devet";
  26.                 default:
  27.                         return "";
  28.                 }
  29.         }
  30.  
  31.         static public String sDumi_10_19(int n) {
  32.  
  33.                 switch (n) {
  34.                 case 10:
  35.                         return "deset";
  36.                 case 11:
  37.                         return "edinadeset";
  38.                 case 12:
  39.                         return "dvanadeset";
  40.                 case 13:
  41.                         return "trinadeset";
  42.                 case 14:
  43.                         return "chetirinadeset";
  44.                 case 15:
  45.                         return "petnadeset";
  46.                 case 16:
  47.                         return "shestnadeset";
  48.                 case 17:
  49.                         return "sedemnadeset";
  50.                 case 18:
  51.                         return "osemnadeset";
  52.                 case 19:
  53.                         return "devetnadeset";
  54.                 default:
  55.                         return "";
  56.                 }
  57.         }
  58.  
  59.         static public String sDumi_20_90(int n) {
  60.  
  61.                 switch (n) {
  62.                 case 2:
  63.                         return "dvadeset";
  64.                 case 3:
  65.                         return "trideset";
  66.                 case 4:
  67.                         return "chetirideset";
  68.                 case 5:
  69.                         return "petdeset";
  70.                 case 6:
  71.                         return "shestdeset";
  72.                 case 7:
  73.                         return "sedemdeset";
  74.                 case 8:
  75.                         return "osemdeset";
  76.                 case 9:
  77.                         return "devetdeset";
  78.                 default:
  79.                         return "";
  80.                 }
  81.         }
  82.  
  83.         static public String sDumi_0_999(int n) {
  84.  
  85.                 // 1. Ако не лежи между 1 и 999 грешка
  86.                 if ((n < 0) || (n > 999))
  87.                         return "Error " + n
  88.                                         + " not between 0 and 999!";
  89.  
  90.                 // 2. ако числото е нула
  91.                 if (n == 0)
  92.                         return "null";
  93.  
  94.                 // 3. променливи за десетици и тнт
  95.                 final int e = n / 1 % 10; // единици
  96.                 final int z = n / 10 % 10; // десетици
  97.                 final int h = n / 100 % 10; // стотици
  98.                 final int ze = n % 100; // десетици и единици заедно
  99.                 String result = ""; // резултат
  100.  
  101.                 // 4. обработка на стотици
  102.                 // с "stotin" и евентуално " i " отзад:
  103.                 if (h > 0) {
  104.                         if (h < 4) {
  105.                                 switch (h) {
  106.                                 case 1:
  107.                                         result += "sto";
  108.                                         break;
  109.                                 case 2:
  110.                                         result += "dvesta";
  111.                                         break;
  112.                                 case 3:
  113.                                         result += "trista";
  114.                                         break;
  115.                                 }
  116.                         } else {
  117.                                 result += sDumi_1_9(h) + "stotin";
  118.                         }
  119.                         if (ze > 0) {
  120.                                 result += " i ";
  121.                         }
  122.                 }
  123.  
  124.                 // 6. обработка на десетици и евентуално добавяне на " i ":
  125.                 if ((e > 0) && (z > 1)) {
  126.                         result += sDumi_20_90(z) + " i ";
  127.                 } else if (z > 1) {
  128.                         result += sDumi_20_90(z);
  129.                 }
  130.  
  131.                 // 7. обработка на единици:
  132.                 if (e > 0) {
  133.                         result += sDumi_1_9(e);
  134.                 }
  135.  
  136.                 return result;
  137.         }
  138.  
  139.         static public void main(String[] _) {
  140.                 Scanner input = new Scanner(System.in);
  141.                 System.out.println("Insert number: ");
  142.                 int n = input.nextInt();
  143.                 System.out.println(sDumi_0_999(n));
  144.         }
  145. }
  146.  
« Последна редакция: 17 Януари 2012, 17:26:06 от kjufte »

Zealar

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 17
  • Публикации: 152
Re: Изписване на числата от 0-999 с думи.
« Отговор #5 -: 17 Януари 2012, 12:06:22 »
Не работи коректно обаче :)

Insert number:
100
ednostotin

Insert number:
356
tristotin i petdeset i shest

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: Изписване на числата от 0-999 с думи.
« Отговор #6 -: 17 Януари 2012, 17:57:54 »
Коригирах го.
С моето решение с още три реда код може да се разширят възможностите за изписване на числа  до 9999, а за числата по-нагоре до 999.999 може да се извика същия код с рекрусия.
Относно стринг масивите. Те определено не са по-елегантен метод. Да направиш от 4 int и един array 3 низа с над 30 стринга не е по-елегантно.

DrunkMaster

  • Full Member
  • ***
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 204
Re: Изписване на числата от 0-999 с думи.
« Отговор #7 -: 18 Януари 2012, 14:08:45 »
Едно решение на C#, с англйските думи:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConvertNumbersToText
{
    class ConvertNumbersToText
    {
        static void Main(string[] args)
        {
            Console.Write("Enter number of range <0-999>: ");
            int number = Int32.Parse(Console.ReadLine());

            if (number == 0)
            {
                Console.WriteLine("Zero");
            }
            else if (number < 10)
            {
                Console.WriteLine(ConvertUnitsToText(number));
            }
            else if (number >= 10 && number <= 19)
            {
                Console.WriteLine(ConvertTeensToText(number));
            }
            else if (number >= 20 && number <= 99)
            {
                Console.WriteLine(ConvertDecimalsToText(number));
            }
            else if (number >= 100 && number <= 999)
            {
                Console.WriteLine(ConvertHundretsToText(number));
            }
            else
            {
                Console.WriteLine("Incorrect number!");
            }
        }

        static string ConvertUnitsToText(int unit)
        {
            string[] ones = new string[]
            {
                "", "one", "two", "three",
                "four", "five", "six",
                "seven", "eight", "nine"
            };

            return ones[unit];
        }

        static string ConvertTeensToText(int teenNumber)
        {
            string[] teens = new string[]
            {
                "Ten", "Eleven", "Twelve",
                "Thirteen", "Fourteen", "Fifteen",
                "Sixteen", "Seventeen", "Eighteen", "Nineteen"
            };

            return teens[teenNumber - 10];
        }

        static string ConvertDecimalsToText(int decimals)
        {
            string[] tens = new string[]
            {
                "", "", "twenty ", "thirty ", "fourty ",
                "fifty ", "sixty ", "seventy ",
                "eighty ", "nintey "
            };

            int units = decimals % 10;
            int decimalNumber = (decimals / 10);

            return tens[decimalNumber] + ConvertUnitsToText(units);
        }

        static string ConvertHundretsToText(int number)
        {
            string[] hundreds = new string[]
            {
                "", "one hundred ", "two hundred ", "three hundred ",
                "four hundred ", "five hundred ", "six hundred ",
                "seven hundred ", "eight hundred ", "nine hundred "
            };

            int units = number % 10;
            int decimals = (number / 10) % 10;
            int hundredsNumber = (number / 100) % 10;

            string decimalNumber = "" + decimals + "" + units;
            int castDecimalNumber = Int32.Parse(decimalNumber);

            string result = "";

            if(castDecimalNumber <= 9)
            {
                result = hundreds[hundredsNumber] + "and " +
                    ConvertUnitsToText(units);
            }
            else if (castDecimalNumber >= 10 && castDecimalNumber <= 19)
            {
                result = hundreds[hundredsNumber] + "and " +
                    ConvertTeensToText(castDecimalNumber);
            }
            else
            {
                result = hundreds[hundredsNumber] +
                    ConvertDecimalsToText(castDecimalNumber);
            }
           
            return result;
        }
    }
}