1 Востаннє редагувалося annovate (27.09.2015 00:28:52)

Тема: текстове значення для 3-х значних чисел

Вивчаю Java близько місяця, зараз сиджу над умовами, циклами. Вирішив закріпити знання по switch і поставив собі завдання підставити до будь-якого трьохзначного числа текстове визначення. Тобто 123 це: сто двадцять три. Все б нічого, але спіткнувся на банальному 11...19. Якщо наприклад завести число 119 - отримаємо сто десять дев'ять. Цю проблему вирішив через "n%100" але сіль якраз  в тому, що після "n%100" продовжую отримувати ті ж самі "десять дев'ять". Тобто: 119 - сто дев'ятнадцять, сто десять дев'ять. Розробляв таким чином: сотні: a = n/100%10; десятки: b = n/10%10; одиниці: c = n%10. Між a i b знаходиться b = n%100(для визначення 11...19).
Допоможіть будь-ласка реалізувати код, враховуючи мої мін. знання для правильної роботи аплікації. Весь код в додатку Vids2.java. Дуже прошу вкажіть вирішення не переписуючи повністю вкладений файл невідомими ще мені рішеннями типу get, set і т.п., я ще цього просто не знаю. Є такі підозри що все можна вирішити за допомогою if-else(можливо).

Post's attachments

Vids2.java 4.99 kb, 300 downloads since 2015-09-26 

2 Востаннє редагувалося koala (27.09.2015 13:01:24)

Re: текстове значення для 3-х значних чисел

1. Користуйтеся тегами code та spoiler.
2. Масиви і функції ще не вивчали?
3. Число тризначне, а не тьохзначне, і сума цифр, а не чисел.
4. Конкретно на ваше питання в коді "необхідно після цього програму зупитини. Як?" - або замінити в тому блоці всі break на return, або ж після того switch додати

if(b<100 || 20<b){ 
//решта коду
}

Але це неправильне рішення. Бачите, неправильне питання може заплутати.
5. Одразу впадає в очі (добре, не дуже впадає через ці величезні switch-і, але все ж таки), що ви виводите сотні, потім - "надцятки", а потому - десятки і одиниці. Якась логіка схиблена - надцядки ж менші за десятки, так? Отже:
- виводимо сотні
- виводимо десятки (крім числа "десять", "десять один" - так ніхто не каже).
- виводимо одиниці, "десять" і надцятки. Тепер вже видно, що їх треба виводити в одному блоці, вибір від 1 до 19. Все, що було треба - розставити блоки в природному порядку і побачити, що сусідні блоки фактично треба об'єднати.
6.

і взагалі

http://ideone.com/yjrOW2

    public static void main (String[] args) throws java.lang.Exception
    {
        Scanner scanner = new Scanner( System.in );
        int num = scanner.nextInt();
        String numAsSum = "";
        int sum = 0;
        int temp = num;
        while( true )
        {
            int digit = temp % 10;
            sum += digit;
            numAsSum = digit + numAsSum;
            temp /= 10;
            if( temp == 0 )
            {
                break;
            }
            numAsSum = "+" + numAsSum;
        }
        System.out.println( "Сума цифр " + numAsSum + " = " + sum );
        String[] hundreds = {"","сто","двісті","триста","чотириста","п'ятсот",
                           "шістсот","сімсот","вісімсот","дев'ятсот"};
        String[] tens = {"","","двадцять","тридцять","сорок","п'ятдесят",
                         "шістдесят","сімдесят","вісімдесят","дев'яносто"};
        String[] ones = {"","один","два","три","чотири","п'ять","шість","сім",
                         "вісім","дев'ять","десять","одинадцять","дванадцять",
                         "тринадцять","чотирнадцять","п'ятнадцять","шістнадцять",
                         "сімнадцять","вісімнадцять","дев'ятнадцять"};
        String str = hundreds[ num/100 ] + " " + tens[ (num/10)%10 ] + " " + ones[ num%100<20?num%20:num%10 ];
        System.out.println( str );
    }

3 Востаннє редагувалося annovate (27.09.2015 12:59:19)

Re: текстове значення для 3-х значних чисел

koala, величезне дякую за відповідь. Буду мудрувати над "виводимо одиниці, "десять" і надцятки. Тепер вже видно, що їх треба виводити в одному блоці, вибір від 1 до 19. Все, що було треба - розставити блоки в природному порядку і побачити, що сусідні блоки фактично треба об'єднати."
Зараз осмислюю код який Ви надали в пункті 6, хоча зрозумілою для мене є лише перша його половина. Стосовно п.2 - вивчав лише функції, до масивів ще не дійшов. п.3 - приймаю ці зауваження, так - я не вірно висловився, мої вибачення, в подальшому буду намагатись виражовуватись правильно. На рахунок схибленої логіки - та напевно що так, тому й попросив допомоги щоб все правильно зробити. Щодо заміни break на return - наскільки я можу зрозуміти з мінімальними знаннями, це не правильне рішення. А от чому спочатку йдуть "надцятки" а за ними десятки, так це тому, що спочатку це й потрібно перевірити(за моєю логікою), інакше спочатку виведе "десять один" а вже потім "одинадцять". Тому з усієї поваги до геніальних рішень задам питання знову, що змінити в моєму коді не використовуючи хитромудрі коди? Для мене це важливо, оскільки лише зрозумівши суть "букв" можна складати з них слова і речення та  відповідно в майбутньому писати довжелезні романи.

4 Востаннє редагувалося koala (27.09.2015 13:04:43)

Re: текстове значення для 3-х значних чисел

Гм... трохи таки затупив, але по-дрібному. Вчіть масиви, це точно треба :), а тут робіть приблизно

switch(num/100%10){...}
switch(num/10%10){.../*без числа "десять!"*/}
if(num%100<20)last = num%100;
else last = num%10;
switch(last){case 1:...case 10:...case 19:...}

5 Востаннє редагувалося annovate (27.09.2015 16:23:10)

Re: текстове значення для 3-х значних чисел

koala, дякую за представлений код http://ideone.com/yjrOW2. Визнав для себе що "String[]" це файна річ. Але крім того я покулупав той код і переробив його під себе. Це стосується "numAsSum", я його прибрав оскільки мав на виході "Сума цифр 5+3+2 532 = 10". Код тепер такий

Прихований текст
package vids3;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Vids3 {

    public static void main (String[] args) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.println("Введіть тризначне число");
        int num = Integer.parseInt(reader.readLine());
        int h = num/100%10;
        int t = num/10%10;
        int o = num%10;
        
        System.out.println("Сума цифр " + h + " + " + t + " + " + o + " = " + (h+t+o));
        String[] hundreds = {"","сто","двісті","триста","чотириста","п'ятсот",
                           "шістсот","сімсот","вісімсот","дев'ятсот"};
        String[] tens = {"","","двадцять","тридцять","сорок","п'ятдесят",
                         "шістдесят","сімдесят","вісімдесят","дев'яносто"};
        String[] ones = {"","один","два","три","чотири","п'ять","шість","сім",
                         "вісім","дев'ять","десять","одинадцять","дванадцять",
                         "тринадцять","чотирнадцять","п'ятнадцять","шістнадцять",
                         "сімнадцять","вісімнадцять","дев'ятнадцять"};
        String def = hundreds[num/100] + " " + tens[(num/10)%10] + " " + ones[num%100<20?num%20:num%10];
        System.out.println(def);
    }
}

. Хоча можливо це я зробив зайві рухи під час редагування. Та менше з тим, "Сума цифр" великого значення не має, це лише закріплення знань по "%". Але все ж є проблема в Вашому оригінальному коді. Якщо завести тризначне число без десяток, наприклад 901, то отримаємо в текстовому визначенні подвійний пробіл між "дев'ятсот" і "один". Тут http://postimg.org/image/r3jnuhead/ це видно. От як зайвий пробіл прибрати не знаю.

6

Re: текстове значення для 3-х значних чисел

Завдання вирішено. koala з мене пиво. Безмежно вдячний за цей шмат коду

Прихований текст
if(n%100 < 20) {
            last = n%100;
        }
        else last = n%10;
        switch(last)

. Саме цього розуміння мені і не вистачало. Правильне рішення в файлі "Vids2.java". Хоча залишилась ще одна дрібничка яка стосується "ln" в методі print. Після "1...19" курсор йде на новий рядок. Це видно тут https://pic.co.ua/image/uT3. Після десятків курсор залишається на місці, видно тут https://pic.co.ua/image/uTN Вирішення цього конфлікту не бачу.

Post's attachments

Vids2.java 4.73 kb, 324 downloads since 2015-09-27 

7

Re: текстове значення для 3-х значних чисел

Виконуйте всюди print, а в кінці додайте один println. Або ще краще - зробіть окрему функцію, яка повертатиме рядок, і цей рядок виводьте за допомогою println.

Подякували: annovate1

8

Re: текстове значення для 3-х значних чисел

koala написав:

Виконуйте всюди print, а в кінці додайте один println. Або ще краще - зробіть окрему функцію, яка повертатиме рядок, і цей рядок виводьте за допомогою println.

От халепа, це ж елементарно. Я занадто зациклився на самій проблемі, а не на її вирішенні. Ще раз дякую.