Loading...
aslv1 avatar aslv1 304 Точки

[Homework] C# Basics - Lecture 5 - Problem 11. * Number as Words

Task: Write a program that converts a number in the range [0…999] to words, corresponding to the English pronunciation.

Някой има ли идея как може да се реши задачата освен със много много if-ове и switch-ове? Все пак не е толкова засукана, колкото задачата за римските числа, но има ли някакъв хитър начин?

Поздрави и благодаря!

1
Programming Basics
dimitarstoyanov90 avatar dimitarstoyanov90 164 Точки

Аз лично я прегледах задачата и мисля, че с няколко булеви променливи(даже май няма да е нужно да има такива) и няколко if-else конструкции или една switch - case ще може да се рещи, според мен числата от 1 до 10 се правят на switch или if - else, след което от 10 - 100 с конкатенация на стрингове. Другото, което е ще трябва да има масив, и for цикъл, който да върти през масива и такам. Но това ти го казвам супер грубо и нахвърляно на първо четене. Днес по някое време ще я начаткам и ще дам повечко насоки. Смисъл главната за мен идея е да се зададат стойностите на числата от 1 до 10, оттам нататък има хитри варианти за цялостно решение :) Помисли за идеи. Имам няколко бегли за момента. Успех за сега :) По - късно ще отговоря малко по - конкретно :)(Хубав вариант е да се включи и 0 в масива на първо място)

1
dimitarstoyanov90 avatar dimitarstoyanov90 164 Точки

Ще добавя подсказака, числото:

930 = nine hundred thirty

Опитай се да разгледаш по - големите числа като съвкупност от по - малки :) И как може да се направи връзката с тях като дефинираме единствено числата от 1 - 10 :)

Може би ще добавя още мъничко:

Дефинираме числата от 1 до 10 както казах, 

Ще е необходимо може би да дефинираме и (20, 30, 40,50,60,70,80,90)

Оттук, ако числото ни е трицифрено какво следва, пример:

134

Проверяваме дали е трицифрено (може би ще сложим една булева променлива(ако е трцифрено към текстовия израз ще добавим hundred))

 Сравняваме първото число с предварително дефинираните ни числа от 1 до 10 в предварително създадения ни масив. Ако съответства на някое от тях ( а то ще съответства), взимаме текстовия еквивалент на даденото число :)

Става One Hundred

След което тъй като сме дефинирали и числата 20,30,40....и така нататък взимаме второто число от 134 ( а именно 3), казваме му 3*10 , за да може да го сравним с горе споменатите предварително дефнирани числа ( и отново ако сответства, както е ясно ще вземем текстовия еквивалент на ( в случая 30), който вече е дефиниран) и получаваме:

One Hundred Thirty

И накрая последното число от нашия пример а именно 4 отново със същата процедура сравняваме, извличаме текста от предварително зададения масив и получаваме на финала

One Hundred Thirty Four :)

Надявам се да обясних добре идеята си, ако имаш въпроси питай ще добавям ако трябва нещо, Успех :)

Послепис,

За момента не се сещам за друг начин, чрез който да можем да избегнем употребата на няколко  if statement'a, все пак и заглавието на нашата тема в случая е такова :)

2
aslv1 avatar aslv1 304 Точки

Това е доста добра насока, има едно мъничко уточнение, което прави реализирането малко по-сложно, а именно - първата дума трябва да е с главна буква, а останалите - с малка. А именно:

  •   8 -> Eight
  •  98 -> Ninety eight
  • 198 -> A hundred and ninety eight

Та поради това трябва да се добавят разни булеви променливи насам-натам (примерно) laughing

0
RoYaL avatar RoYaL Trainer 6849 Точки

@aslv1,

 

Ко каза? :)

http://www.dotnetperls.com/uppercase-first-letter

 

Ако върнеш цял стринг "eighty nine" ще го превърне в Eighty nine, дори не виждам защо ти е булева променлива ? :)

7
dimitarstoyanov90 avatar dimitarstoyanov90 164 Точки

Та мога да добавя едно последно нещо малко или много свързано с тази задача като заключение. Тук е интересно начинът по - който е нужно да се реши дадения проблем. Самата идея за градивно (стъпково) изпълняване на отделните проблеми и логическо мислене за цялостна интерпретация. Дори и подходът за предварително "скициране" на проблема е много правилен в случая(както в много литератури за програмиране се препоръчва).Може да изглежда маловажно но не е така. Та както от собствен опит занм математиците са "мързеливи" хора ( не обичат да им е трудно, не в лошия смисъл мързеливи !), което може би трябва да се отнася и за програмистите. А иначе казано защо да "хамалуваме" с изписването на 1000 и отгоре редове последователно за всяко едно число:). Надявам се, че се изразих правилно.Малко се отплеснах, но Успех на всички ! :)

0
aslv1 avatar aslv1 304 Точки

ЕТО моето решение!

Всякакви препоръки и забележки са добре дошли!

smile

1
speednet avatar speednet 12 Точки

В решението само не видях как изкарваш отрицателните числа :)

0
ivailozd avatar ivailozd 75 Точки

И аз я реших с масиви и доста if-ове. Не е никак красиво, но стана. Не знам дали е условие, но спазих изгледа на резултата спрямо примерите, т.е. числото да започва с главна буква. Решението ми.

3
beBoss avatar beBoss 507 Точки

В тази тема има още няколко решения на задачата: [Homework] 5. Conditional Statements cool

Там ще намериш и моето решение, което не е чак толкова дълго tongue-out

3
yuletodim avatar yuletodim 37 Точки

Здравейте! Аз съм малко назад, тъй като почнах курса малко по-късно, а имам и малко дете. Гледах решенията ви на задачата и реших да ви предложа моето. Всъщност задачата е много по-проста и се решева с 4 масива - 2 с малки букви и 2 с главни букви, и 5 прости if-конструкции (без else). И така ето:

Console.WriteLine("Please enter an integer number [0..999] and press Enter.");
uint num = uint.Parse(Console.ReadLine());

uint hundred = num / 100;
uint tenth = (num / 10) % 10;
uint unit = num % 10;
string str = null;

string[] units = {null,"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "sventeen", "eightteen", "nineteen"};
string[] uintsCaps = {"Zero","One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen","Seventeen", "Eightteen", "Nineteen"};
string[] tenths = { null, "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };
string[] tenthsCaps = { null, "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };

if ((num >= 0) && (num <=19))
{
str = uintsCaps[num] ;
}

if ((num >= 20) && (num <= 99))
{
str = tenthsCaps[tenth] + " " + units[unit];
}

if ((num >= 100) && (tenth == 0) && (unit == 0))
{
str = uintsCaps[hundred] + " hundred";
}

if ((num >= 100) && (tenth == 0) && (unit != 0))
{
str = uintsCaps[hundred] + " hundred and " + units[unit];
}

if ((num >= 100) && (tenth != 0))
{
str = uintsCaps[hundred] + " hundred and " + tenths[tenth] + " " + units[unit];
}

Console.WriteLine(str);

5
darimi27 avatar darimi27 8 Точки

АКО ВЪВЕДЕШ 912 НЯМА ДА ПОЛУЧИШ ВЕРЕН РЕЗУЛТАТ . ИДЕЯТА Е ДОБРА , НО ТРЯБВА ДА СЕ ДООБМИСЛИ.

1
yuletodim avatar yuletodim 37 Точки

Права си. Браво на теб и благодаря. Може да се сложи един вложен if, който да проверява дали числата >100 са между 11 и 19, нещо такова:

if((num > 110 && num < 120) || (num > 210 && num < 220) || ....)

{
       str = uintsCaps[hundred] + " hundred and " + units[teenNums];

}
else
{
        str = uintsCaps[hundred] + " hundred and " + tenths[tenth] + " " + units[unit];
}

, където uint teenNums = num % 100;

 

Така вече работи :)

0
EBojilova avatar EBojilova 330 Точки

Най-ми допадна това решение. Браво! Кратко, ясно и четливо.

За направения коментар само бих добавила, 

else if ((num >= 100) && (tenth == 1) && (unit != 0))
{
str = uintsCaps[hundred] + " hundred and " + units[teenNums];
}

за да не се изреждат всички диапазони.

1
georgimanov avatar georgimanov 107 Точки

Здравейте,

Ето и моето решение. Малко дълго, но за сметка на това супер просто.

http://pastebin.com/gmnrSeEe

:)

1
aslv1 avatar aslv1 304 Точки

Поздравления за труда!

Наистина ясно и просто!

Ако искаш обаче да не е толкова дълго, можеш да сложиш повтарящите се парчета код във съответни методи (разбира се, ако си запознат с тях).

БРАВО все пак smile

0
willya avatar willya 4 Точки

Моето решение тук.
Доста го мислих, но след крайния резултат съм се радвал като малко дете :)
Мисля, че кода е лесно четим, въпреки масивите, които съм използвал.

3
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.