Моля за малко помощ. Four-Digit-Number


1

Здравейте, искам да попитам къде бъркам.

Искам да направя така че , ако първото число което се чете от конзолата е 0 , да каже на потребителя , че числото не може да бъде 0 и пак да го върне да въведе нова стойност на променливата, докато не въведе число различно от 0. Проблема е , че ако един път бъде въведена стойност 0, после независимо какво число бъде въведено в конзолата, то пак изкарва, че числото не може да бъде 0. Благодаря предварително !

https://github.com/enerage/-Four-Digit-Number/blob/master/.gitignore  




Отговори



0
digitA = int.Parse(Console.ReadLine());
bool firstDigitZero = digitA == 0;
while (!firstDigitZero)
{
Console.WriteLine("Your digit can't be 0, please enter your first digit value again:");
digitA = int.Parse(Console.ReadLine());
firstDigitZero = digitA == 0;
}

от TodorDimitrov (757 точки)


0
do-while е по-добър за такива ситуации. :)

от ivaylo.kenov (30760 точки)


0

Аз бих го направил така:

...

        int digitA;
        bool firstDigitZero = true;
        while (firstDigitZero)
        {
            Console.WriteLine("First digit:");
            digitA = int.Parse(Console.ReadLine());
            if (digitA == 0)
            {
                Console.WriteLine("Your digit can't be 0, please enter your first digit value again:");
            }
            else
            {
                firstDigitZero = false;
            }

        }

...


от E.Mitev (178 точки)


0

Тези проверки са дали числото не е 0, но не работят за вход като "0123", защото подобен би се парснал към число 123. Трябва още преди да се парсне към число, да се провери дали първият символ на входа е различен от 0:

string inputNumber = Console.ReadLine();

while(inputNumber[0] == '0')

{

Console.WriteLine("Enter valid number: ")

inputNumber = Console.ReadLine();

}


и вече, след като потребителят е въвел число с различна от 0 първа цифра:

int input = int.Parse(inputNumber);

Друг е въпросът дали изобщо трябва да се обръща целият вход в число, може да видите моето решение ТУК

Успех!


от topalkata (6442 точки)


0

Ако искаш да въвеждаш digits един по един, може да направиш проверката в do while, както съветва Ивайло Кенов, например така:

        int digitA;
        string input;

        do
        {
        Console.Write("Enter first digit (different from 0): ");
        input = Console.ReadLine();
        } while (!int.TryParse(input, out digitA) || digitA == 0);

При тестване отпечатва това:

Enter first digit (different from 0): f
Enter first digit (different from 0): 0
Enter first digit (different from 0): 6
Next code
Press any key to continue . . .




1

Аз лично бих ти препоръчала да се запознаеш с масивите. За мен най-елегантното решение на тази задача е при използването на масив. В него межеш да провериш поотделно стойността на всеки един елемент. Размяната на отделните цифри също става много по-лесно и приятно.

Ето моята проверка за това дали числото започва с 0 и дали е с 4 цифри:

Console.Write("Please enter a four digit number:");
        int[] myFourDigitNumber = Console.ReadLine().Trim().ToCharArray().Select(x => Int32.Parse(x.ToString())).ToArray();
        if ((myFourDigitNumber[0] != 0) && (myFourDigitNumber.Length == 4))

.. и т.н.

Ако имаш други въпроси по задачата можеш да ми пишеш лично съобщение. Иначе до 1, 2 часа ще кача решенията на всичките задачи в GitHub и ще пусна и тук линк към пълното решение на тази задача :)

Update:

Това е моето решение. Надявам се, че ще ти е от полза :)


от melnelen (363 точки)


0

using System;

class FourDigitNumber
{
    static void Main()
    {
        Console.Write("Write a 4-digits number only and press Enter:");

        int userValue = int.Parse(Console.ReadLine());
        if ((userValue / 1000 == 0) || (userValue) < 1000 || (userValue) > 9999 || (userValue != 4))

        {
            Console.WriteLine("Digit starts with 0 or this is not 4-digit number");
            Console.ReadKey();
        }
        int a = userValue / 1000;
        int beforeb = userValue / 100;
        int b = beforeb % 10;
        int beforec = userValue % 100;
        int c = beforec / 10;
        int d = userValue % 10;
        int sumDigits = a + b + c + d;
        Console.WriteLine(sumDigits);
        Console.WriteLine("{0}{1}{2}{3} - reversed", d, c, b, a);
        Console.WriteLine("{0}{1}{2}{3} - last digit in first place", d, a, b, c);
        Console.WriteLine("{0}{1}{2}{3} - second and third digit exchange", a, c, b, d);

    }
}

Това е моето решение , но ме притеснява факта че след съобщението за грешка Digit starts with 0 or this is not 4-digit number програмата не ми се връща на входа .... т.е да се въведе наново числото . Някой идеи ?Също и ако разбия   if ((userValue / 1000 == 0) || (userValue) < 1000 || (userValue) > 9999 || (userValue != 4)) този израз в повече if ?


от Anton_Etimov (65 точки)

1

@Anton_Etimov: Пробвай следното:

int input;

Console.WriteLine("Please enter a four-digit number: ");

bool valid = int.TryParse(Console.ReadLine(), out input) && input.ToString().Length == 4;

while (!valid)

{

Console.WriteLine("Please enter a valid four-digit number: ");

valid = int.TryParse(Console.ReadLine(), out input) && input.ToString().Length == 4;


от lnikod4s (6538 точки)


2
 Не е ли най-лесно - четем числото като стринг, преди да го парснем проверяваме if (string.Length > 1 && string[0] == '0') throw new Exception('....')

от ivan.mihov1 (4988 точки)


0
Май си прав, като се замислиш за какво ти е да правиш 100000 операции, като parse, .ToString() да търсиш дължина и така на татък ако още в началото не проверим дали просто не отговаря условието - да не започва инпута с 0 без значение дали е текст, число, символ.

от mitakis (218 точки)