2016-05-28 10 views
6

W języku C# Próbuję wprowadzić numer użytkownika. Następnie chcę, aby sprawdzić,Sprawdź, czy dane wejściowe użytkownika są podwójne i czy są większe od zera?

  1. one weszły ciąg znaków, który może być przekształcony w podwójne i
  2. weszły one wartość większą niż zero

Metoda ja początkowo tworzony był

string inValue; 
double outcome; 

Console.WriteLine("Enter amount: "); 
inValue = Console.ReadLine(); 
while (double.TryParse(inValue, out outcome) == false) 
{ 
    Console.WriteLine("Initial value must be of the type double"); 
    Console.WriteLine("\nPlease enter the number again: "); 
    inValue = Console.ReadLine(); 
} 
outcome = double.Parse(inValue); 
while (outcome < 0) 
{ 
    Console.WriteLine("Initial value must be of at least a value of zero"); 
    Console.WriteLine("\nPlease enter the number again: "); 
    inValue = Console.ReadLine(); 
    outcome = double.Parse(inValue); 
} 
return outcome; 

Problem polegał na tym, że jeśli użytkownik wpisze "-10", a następnie "f" wystąpi wyjątek. Wynika to z tego, że program przejdzie poza pierwszą kontrolę (sprawdzającą podwójne) dla wartości -10, ale wtedy, gdy zostanie wprowadzone "f", zgłasza wyjątek, gdy tylko otrzymuje drugi test.

Uważam, że rozwiązaniem jest utworzenie instrukcji while, która wypisze komunikat o błędzie, gdy nie można przekonwertować wartości na wartość double lub wartość zostanie przekonwertowana na wartość double i będzie mniejsza od zera. To, czego nie wiem, jak to zrobić, to przekonwertować wartość na podwójną, a następnie oszacować ją jako większą od zera w instrukcji while.

Odpowiedz

7

Jesteś na dobrej drodze - potrzebujesz pętli z pojedynczą pętlą, która pobiera dane wejściowe, a następnie próbuje obu walidacji. Jednym ze sposobów, aby to zrobić, aby stworzyć wartość logiczną, która śledzi, czy wartość jest poprawna, a następnie użyć tego jako warunku pętli:

double outcome = 0; 
bool valid = false; 

while (!valid) 
{ 
    Console.WriteLine("Enter amount: "); 
    string inValue = Console.ReadLine(); 
    if (double.TryParse(inValue, out outcome) == false) 
    { 
     Console.WriteLine("Initial value must be of the type double"); 
     Console.WriteLine("\nPlease enter the number again: "); 
    } 
    else if (outcome < 0) 
    { 
     Console.WriteLine("Initial value must be of at least a value of zero"); 
     Console.WriteLine("\nPlease enter the number again: "); 
    } 
    else 
    { 
     valid = true; 
    } 
} 
return outcome; 

Możliwe jest również, aby umieścić oba warunki w instrukcji while , ale to podejście pozwala podać inny komunikat w zależności od warunków, które się nie powiodły.

+6

Bardziej idiomatyczne jest użycie '! Condition' zamiast' condition == false'. Rozumiem, że zachowałeś kod jak najbardziej zbliżony do oryginału, ale wskazuję tylko na przyszłe referencje. – Kroltan

6

można albo te dwa warunki w pierwszej pętli while

coś

while (!double.TryParse(inValue, out outcome) || outcome < 0) 
{ 
    ... 
} 

pewnego wyjaśnienia: double.TryParse zmodyfikuje wartość wyniku, jeśli się powiedzie, więc jeśli był w stanie spróbuj wtedy! TryParse zostanie ocenione jako fałszywe, a więc przejdziemy do drugiej części i oceniamy wynik: < 0.

+1

Pytanie jednak brzmi "...". Korzystając z Twojego podejścia, w jaki sposób utworzy komunikat o błędzie? –

+0

@IvanStoev Wartość początkowa musi być podwójna i większa od zera – Steve

+0

Jest to możliwe, ale nie jest równoważne OP. –

0

po krótkim przegrupowaniu działa kod! ale myślę, że czasami trzeba użyć, jeśli zamiast podczas

string inValue = ""; 
    double outcome = -1; 

    Console.WriteLine("Enter amount: "); 
    while (outcome < 0){ 
     inValue = Console.ReadLine(); 

     if (double.TryParse(inValue, out outcome) == false) 
     { 
     Console.WriteLine("Initial value must be of the type double"); 
     Console.WriteLine("\nPlease enter the number again: "); 
     continue; 
     } 
     if (outcome>=0) {continue;} 
     Console.WriteLine("Initial value must be of at least a value of zero"); 
     Console.WriteLine("\nPlease enter the number again: "); 
    } 
    return outcome; 
+0

Potrącony za 1) nieodbieranie zbędnego połączenia do podwójnego.Parse i 2) okropne, * okropne * wcięcie. –

+0

Usunąłem to dziękuję za uwagę – prizm1

2

pójdę z takiego rozwiązania. Wystarczy zauważyć, że nie musisz double.Parse(Value) po wykonaniu double.TryParse(value, out outcome) out parametru wypełni tę zmienną w TryParse jest true.

Możesz skopiować i wkleić poniższy kod do LinqPad i grać z nim. Ale to robi to, czego potrzebujesz.

void Main() 
{ 
    var result = DoWork(); 
    Console.WriteLine(result); 
} 

public double DoWork() 
{ 
    string inValue; 
    double outcome; 

    Console.WriteLine("Enter amount: "); 
    inValue = Console.ReadLine(); 
    while (!double.TryParse(inValue, out outcome) || outcome <= 0) 
    { 
     Console.WriteLine("Initial value must be of the type double and greater than 0"); 
     Console.WriteLine("\nPlease enter the number again: "); 
     inValue = Console.ReadLine(); 
    } 
    return outcome; 
} 
Powiązane problemy