簡體   English   中英

似乎除了垃圾價值什么都得不到

[英]cant seem to get anything but garbage value

代碼以 csv("23,25,27) 的形式獲取 sting 中的輸入,然后找到它們的最高值 27(類型 int)。但是 q 似乎每次都返回垃圾值。

static void Main(string[] args)
{
        var p=0;`enter code here`
        int q=0,r,s=0;
        Console.WriteLine("Enter the numbers seperated by comma");
        var input = Console.ReadLine();
        for (var i = 0; i < input.Length; i++)
        {
            if (input[i] == ',')
            {
                p = 0;
                s = (s > q) ? s : q;
            }
            //else if (input[i] == ' ')
            //{
            //    p = 0;
            //    continue;
            //}
            else
            {
                q = (p == 1) ? q * 10 + Convert.ToInt32(input[i]) : Convert.ToInt32(input[i]);
                Console.WriteLine(q);
                p = 1;
            }
        
        }
        
        Console.WriteLine(s);
    }

OUTPUT:輸入以逗號分隔的數字 23,27 50 551 50 555 551

您的問題是在執行循環時。 您需要在執行 for 循環之前拆分輸入。

// Perform split of the input using ',' as delimiter
var splitstring = input.Split(',');
// iniate max value
var maxval = 0;
// perform foreach loop (similar to for loop but easier to read especially when want to read all the content in an array)
foreach (var x in splitstring)
{
   var y = int.Parse(x);
   if (y > maxval) maxval = y;
}
// Print the final maxval
Console.WriteLine(maxval);

可能有語法錯誤,但邏輯應該在那里。

我們不使用pqs ,而是將這些變量分別重命名為hasSeenAtLeastOneDigitparsedcurrentHighest ,這些名稱更具描述性。 另請注意, hasSeenAtLeastOneDigit應該是bool ,並且r沒有在任何地方使用。

var hasSeenAtLeastOneDigit = false;
int parsed=0,currentHighest = 0;
Console.WriteLine("Enter the numbers seperated by comma");
var input = Console.ReadLine();
for (var i = 0; i < input.Length; i++)
{
    if (input[i] == ',')
    {
        hasSeenAtLeastOneDigit = false;
        currentHighest = (currentHighest > parsed) ? currentHighest : parsed;
    }
    else
    {
        parsed = hasSeenAtLeastOneDigit ? parsed * 10 + Convert.ToInt32(input[i]) : Convert.ToInt32(input[i]);
        // Console.WriteLine(parsed);
        hasSeenAtLeastOneDigit = true;
    }

}

Console.WriteLine(currentHighest);

你在這里有2個錯誤。 首先,您不小心使用了采用 char 的ToInt32重載,它將char char為它的 UTF-16 代碼單元值,而不是它表示的數字。 如果你想更安全,你應該使用stringint.TryParse的重載。

Convert.ToInt32(input[i].ToString())
//                      ^^^^^^^^^^^
//         converts to string, so the string overload is used

第二個錯誤是您沒有將最后解析的值與currentHighest進行比較。 考慮輸入為1,2,3,4的情況。 循環結束后, parsed4currentHighest3 ,這是不正確的。 發生這種情況是因為末尾沒有尾隨逗號來再次運行此行:

currentHighest = (currentHighest > parsed) ? currentHighest : parsed;

您只需在循環末尾復制並粘貼該行即可解決此問題。

var hasSeenAtLeastOneDigit=false;
int parsed=0,currentHighest=0;
Console.WriteLine("Enter the numbers seperated by comma");
var input = Console.ReadLine();
for (var i = 0; i < input.Length; i++)
{
    if (input[i] == ',')
    {
        hasSeenAtLeastOneDigit = false;
        currentHighest = (currentHighest > parsed) ? currentHighest : parsed;
    }
    else
    {
        parsed = hasSeenAtLeastOneDigit ? parsed * 10 + Convert.ToInt32(input[i].ToString()) : Convert.ToInt32(input[i].ToString());
        hasSeenAtLeastOneDigit = true;
    }

}
currentHighest = (currentHighest > parsed) ? currentHighest : parsed;
Console.WriteLine(currentHighest);

另請注意,整個算法可以像這樣使用 LINQ 完成:

var input = Console.ReadLine();
var highest = input.Split(',').Select(int.Parse).Max();
Console.WriteLine(highest);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM