Софтуерно Инженерство
Loading...
+ Нов въпрос
b0krustev avatar b0krustev 10 Точки

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

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

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

http://pastebin.com/8yA5iTDz

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

1
Основи на програмирането 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 20 Точки

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

 https://pastebin.com/Rt0bV1KT

0
ValenNEW avatar ValenNEW 49 Точки

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

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 30 Точки

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