Loading...
b0krustev avatar b0krustev 10 Точки

[C#] Simple Conditions: Изписване на число до 100 с думи

Здравейте code нинджи от форума! 
След няколко часа четене, главоблъскане и подобни действия, постигнах някакъв средно-задоволителен резултат по въпросната задача, но с известни проблеми в judge системата. (Runtime Error, и един мистериозен space в изхода при изкарването на десетиците (50,60 etc.)).

Линк към кода(за да няма спам):

http://pastebin.com/8yA5iTDz

Моля за критики, съвети, идеи, каквото имате! 

1
Programming Basics 29/02/2016 16:16:45
krokicha avatar krokicha 76 Точки

Здравей. В ето този ред в кода ти:

else if (n > 10 && n > 20 && n < 100)

трябва да се махне "n > 10 &&", защото този случай е разгледан в следващия if. Ще стане:

else if (n > 20 && n < 100).

Може ли да ми дадеш URL на задачата в judge системата и условито и.

Според мен случаите които трябва да разгледаш са:

1. От 0 до 9 (ако в условието е казано всички цели числа до 100, а не числата от 1 до 100)

2. От 11 до 19

2. (n  / 10) % 10 != 0 (10, 20 ... 90)

3. n > 20 && n % 10 != 0 ( 21-29, 31-39, ... , 91-99)

4.n=100

5.n>100

1
29/02/2016 16:59:06
b0krustev avatar b0krustev 10 Точки

Здравей, благодаря ти за отговора! 
Линк към задачата в Judge:
https://judge.softuni.bg/Contests/Practice/Index/152#15

Условие на задачата: 

"* Да се напише програма, която превръща число [0…100] в текст: 25 -> “twenty five”

Ще разгледам и тествам предложението ти и ще коментирам с резултати, благодаря ти отново! 

0
29/02/2016 17:21:32
H.Stoyanov avatar H.Stoyanov 115 Точки

Не забравяйте, че системата тества  и -1 и очаква отговора да е invalid number

1
b0krustev avatar b0krustev 10 Точки

По условие са ни зададени от 0 до 100, не знаех че прави тест и с -1.
Благодаря все пак, една проверка повече няма да е излишна! 

 

0
29/02/2016 19:19:13
petar.dimitrov.86 avatar petar.dimitrov.86 450 Точки

Коригирах кода за да покрива всички варианти. Ако искаш го погледни директно, или ще се пробвам с няколко думи да обясня какво промених за да знаеш какво ти е липсвало. Нулата я вкарах в първия ти масив и промених условията в първия if освен да е по-малко от 10, да бъде и по-голямо или равно от 0, и съответно промених индекса, от който почва. На ред 29 направих /= директно на / и вкарах един if, който да проверява дали при деление на 10 остава остатък нула (тоест 20, 30, 40 и тн.). Това май прави редовете ти от 42 до 47 излишни, на последния ти else if го направих директно да проверява дали числото е 100. И накрая казвам, че всички останали случаи, които не са покрити с if else (тоест под 0 и над 100) са invalid number. Не знам дали успях да го обясня разбираемо. Напиши коментар, ако искаш някоя стъпка да се опитам по-подробно да я обясня :) ето финалната версия на кода, погледни го само когато се предадеш напълно и не искаш да се мъчиш повече над задачата :Д

http://pastebin.com/Xjx4WqTj

П.П. Допълнително като съвети и препоръки. Пробвай винаги разни случаи. Примерно за тази задача 0, 100. И също така да знаеш че когато се пише if-else if-else if-else if конструкция, задачата проверява в последователност отгоре-надолу в кой else if да влезе, и прескача останалите. Примерно, да речем че попада дадено условие в трети else if, обаче ти очакваш да отиде на петия else if. Затова е важно да внимаваш с границите, които покриваш с различните else if-oве.

1
29/02/2016 19:01:43
H.Stoyanov avatar H.Stoyanov 115 Точки

Колгега виж моето решение -> http://pastebin.com/4VAR8MmB Понеже в условието е писано да се направи само с if - else съм го направил така, кода е дългъг, но не допуска грешки и обърквания в логиката, играх си около час докато стане както трябва. Един съвет използвай дебъгера - създаваш breakpoint на някоя от линиите на кода (най-добре още от началото) и пускаш програмата само с F5 и после натискаш F10 за да преминеш на следващата стъпка (като F10 го натискаш при селектиран Visual Studio).

1
b0krustev avatar b0krustev 10 Точки

Така, изкарахме ги 100/100, мисля че даже кода се поизчисти доста, сложих проверка за отрицателен вход, и >100. Използвал съм същия метод, като коригирах по вашите коментари и препоръки за които ви благодаря, всички влязаха в употреба и бяха от голяма полза.

това е наново написания код:
http://pastebin.com/c9r88sdA

ПП. Знам че има доста теми по въпросната задача, с варианти, и съвети, корекций, въпроси. Надявам се и тази да остане отворена за предложения ( вариант с цикли, някой?), мисля че ще бъде интересно четиво за вариантите по които може да се реши 1 задача.

Поздрави!

0
29/02/2016 21:11:52
gogo4ds avatar gogo4ds 1 Точки

Здравейте,

аз не можах да го измисля с цикли как да стане, но за това пък успях да го направя по модела на b0krustev.. и стана в още по-съкратен вариант.

http://pastebin.com/QMAuW0T9

Благодаря за помощта :)

0
hmanov avatar hmanov 7 Точки

Колеги, ето го моето решение с 2 array http://pastebin.com/yhbmPzmR и максимално къса логика.

 

0
pilieva avatar pilieva 4 Точки

На мен много ми допадна твоето решение, благодаря! Направих го респективно за Java. https://pastebin.com/N39sLsSN

0
29/08/2017 11:33:42
AnaDNedyalkova avatar AnaDNedyalkova 1 Точки

Ето и моето решение с два масива. Струва ми се много разбираемо и е доста кратко.  :) 

https://pastebin.com/3umdj8mN

 

 

0
Ljubo6 avatar Ljubo6 21 Точки

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

 https://pastebin.com/Rt0bV1KT

0
ValenNEW avatar ValenNEW 51 Точки

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

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

 

class DrawNumbersAlphabetically
{
    static void Main(string[] args)
    {
        var n = int.Parse(Console.ReadLine());
        string[] a = new string[] { "zero","one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
        string[] b = new string[] { "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
        string[] c = new string[] { "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "one hundred" };
        string result = "";
        if (n >= 0)
        {
            if (n == 100)
            {
                Console.WriteLine(c[8]);
                return;
            }
            else if (n > 100)
            {
                Console.WriteLine("invalid number");
                return;
            }

            if (n > 19)
            {
                result = c[n / 10 - 2];
                if (n % 10 != 0)
                {
                    result += " " + a[n % 10];
                }
            }
            else
            {
                if (n > 10)
                {
                    result = b[n % 10 - 1];
                }
                else
                {
                    result = a[n];
                }
            }
            Console.WriteLine(result);
        }
        else
        {
            Console.WriteLine("invalid number");
        }
    }

}

Поздрави!

 

0
29/05/2018 03:04:44
EmanuilNikolov avatar EmanuilNikolov 33 Точки

Zdr! Хвърлих един поглед и го тествах, кода който си споделил => https://pastebin.com/8yA5iTDz , какво връща като грешки =>

1. за 50 оставяш допълнително празно място;

2. не хващаш 0 като стойност;

3. за 30 пак има допълнителен space;

4. 41 грешно изписване;

5. не хващаш случаят когато ти подват отрицателни стойности.

Прилагам едно мое решение на зада4ата =>

using System;
using System.Collections.Generic;

public class Program
{
	public static void Main()
	{
		
		var n = int.Parse((Console.ReadLine()));
		//
		string[] toTen = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};
		string[] teen = {"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
		string[] toTy = {"","twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
		//
		
		var temp = "";
		if(n>=0 && n<=10)
		{
			temp = (toTen[n]);
		}
		else if(n>10 && n<=19)
		{
			temp = (teen[n%10-1]);
		}
		else if(n>19 && n <100)
		{
			if(n%10==0)
			{
				temp = toTy[n/10-1];
			}
			else
			{
				temp =toTy[n/10-1]+" "+toTen[n%10];
			}
			
		}
		else if(n==100)
		{
			temp = "one hundred";
		}
		else
			temp = "invalid number";
		Console.WriteLine(temp);
		
		
	}
}

 

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