2013-02-13 50 views
3

社區。C#程序不評估操作並返回錯誤的答案

我正在學習如何在C#中編程。我編寫了這個小程序,可以從用戶那裏獲取姓名,年齡,最喜歡的顏色和兩個數字。我使用Notepad ++編寫代碼並從Windows命令提示符處運行C#編譯器。這裏是程序的源代碼

using System; 

class ShowSomething 
{ 
static void Main(string[] args) 

{ 
    string name, age, favColor; 
    int num1,num2, sum, mult, subs; 
    float div; 


    Console.Write("What is your name? "); 
    name = Console.ReadLine(); 
    Console.WriteLine("Hello, " + name); 

    Console.WriteLine(); 

    Console.Write("How old are you? "); 
    age = Console.ReadLine(); 
    Console.WriteLine("So you are " + age, "I thought that you were older!"); 

    Console.WriteLine(); 

    Console.Write("What is your favorite Color? "); 
    favColor = Console.ReadLine(); 
    Console.WriteLine(favColor + " is a cool color!"); 

    Console.WriteLine(); 

    Console.WriteLine("Nice meeting you, " + name, "Have a good day!"); 

    Console.WriteLine(); 

    Console.WriteLine("Let us do some operations, " + name); 

    Console.WriteLine(); 

    Console.Write("Please enter a number: "); 
    num1 = Console.Read(); 

    Console.Write("Please enter another number: "); 
    num2 = Console.Read(); 

    sum = num1 + num2; 
    mult = num1 * num2; 
    subs = num1 - num2; 
    div = num1/num2; 


    Console.WriteLine(); 

    Console.WriteLine("Alright, " + name, "Let us blow up your mind!"); 

    Console.WriteLine(); 

    Console.WriteLine(num1 + "+" + num2, "=" + sum); 
    Console.WriteLine(num1 + "*" + num2, "=" + mult); 
    Console.WriteLine(num1 + "-" + num2, "=" + subs); 
    Console.WriteLine(num1 + "/" + num2, "=" + div); 

    Console.WriteLine(); 
    Console.WriteLine("Mindblown, Right?"); 
} 

} 

當我執行程序幾乎一切順利。但是,當用戶輸入第一個操作數時,程序跳過第二個提示並打印出與預期結果完全不同的結果。例如,如果我把0作爲第一數量的程序將跳轉到的操作和打印以下:

//

48 + 13

48 * 13

48-13

48/13

Mindblown,對不對?

//

+0

此行爲是由設計。 http://msdn.microsoft.com/en-us/library/system.console.read.aspx – SLaks 2013-02-13 22:52:18

+2

爲什麼要在文本編輯器中編寫並手動編譯?C#Express是免費的,可以幫助你更快地學習 – Brad 2013-02-13 22:52:22

+1

Sidenote,你確定這個'Console.WriteLine(「很高興見到你,」+名字,「祝你有美好的一天! ? – 2013-02-13 23:04:34

回答

5

不要使用Console.Read因爲它沒有做什麼預期:

讀取從標準輸入流的下一個字符(並返回整數值表示它)。

這裏從devshort爲什麼到Console.Read第二個電話「跳過」一個很好的解釋:

如果在值中輸入「1」的第一件事情,它會轉換是到ascii表示。然後在屏幕[input]緩衝區中回車符STILL,所以當你點擊下一個讀取(Console.Read)時,它會讀取換行符並將其轉換爲數字。

相反,一個方法是使用Console.ReadLine代替(返回字符串)與int.Parse或類似結合..


提示:carriage return字符具有13的值。

+3

這個。如果首先輸入值「1」,它會將其轉換爲ascii表示形式。然後回車在屏幕緩衝區中是STILL,所以當你點擊下一個Read時,它會讀取換行符並將其轉換爲數字。如果您爲第一個輸入輸入超過1個字符,它將讀取第一個字符,然後第二個讀取將讀取第二個字符。注意不要吹。這樣做,而不是你的閱讀:'Convert.ToInt32(Console.ReadLine());' – devshorts 2013-02-13 22:55:07

+2

@devshorts確實。感謝關於跳過行爲的解釋。 – 2013-02-13 22:55:53

+0

我想改變我的評論,不使用Convert.ToInt32,因爲如果輸入字符串無效,將會拋出異常。做什麼@pst說和使用int.Parse: 'if(!int.TryParse(Console.ReadLine(),out num1)) { Console.WriteLine(「Invalid number!」); }' – devshorts 2013-02-13 23:01:10

2

可視化的ascii 0的字節值爲48.或0x30。這就解釋了48.

基本上,你使用的是錯誤的功能。

0

好吧,我編輯你的代碼稍微增加了一些解釋WY我改變出頭..

 string name, age, favColor; 
     int num1, num2, sum, mult, subs; 
     float div; 


     Console.WriteLine("What is your name? "); 
     //Start a new line and write .. 
     name = Console.ReadLine(); 
     //Read the whole line 
     Console.WriteLine("\nHello, {0}", name); 
     //{0} stands for the first variable you refer to after the, etc 

     Console.WriteLine("How old are you? "); 
     age = Console.ReadLine(); 
     Console.WriteLine("\nSo you are {0}, I thought that you were older!", age); 
     // something new.. \n refers to a "new line", so instead of writing Console.Writeline(); you can use this 
     Console.WriteLine("What is your favorite Color? "); 
     favColor = Console.ReadLine(); 
     Console.WriteLine("{0} is a cool color!\n", favColor); 

     Console.WriteLine("Nice meeting you, {0}", name); 
     Console.WriteLine("Have a good day!\n"); 


     Console.WriteLine("Let us do some operations, {0}", name); 

     Console.WriteLine("Please enter a number: "); 
     num1 = Convert.ToInt16(Console.ReadLine()); 
     //int.TryParse(Console.ReadLine(), out num1); 
     //Another way is to "try parse", try converting a string to an integer 


     Console.WriteLine("\nPlease enter another number: "); 
     num2 = Convert.ToInt16(Console.ReadLine()); 
     //int.TryParse(Console.ReadLine(), out num2); 
     //Another way is to "try parse", try converting a string to an integer where out is the returning variable 

     sum = num1 + num2; 
     mult = num1 * num2; 
     subs = num1 - num2; 
     div = num1/num2; 



     Console.WriteLine("\nAlright, {0}", name); 
     Console.WriteLine("Let us blow up your mind!\n"); 

     //Again use {0} ... which writes easier than having to use + every time, 
     //its not wrong but its easier this way 
     Console.WriteLine("{0} + {1} = {2}", num1, num2, sum); 
     Console.WriteLine("{0} * {1} = {2}", num1, num2, mult); 
     Console.WriteLine("{0} - {1} = {2}", num1, num2, subs); 
     Console.WriteLine("{0}/{1} = {2}", num1, num2, div); 

     Console.WriteLine("\nMindblown, Right?"); 
     Console.ReadLine(); 
     //Console.ReadLine(); at the end to prevent the program from closing 
+0

@JamesSlat如果您有任何問題隨時問。 – 2013-02-13 23:35:16

+0

@ C#學生 感謝您的更正!它看起來比我以前的源代碼更加清潔和有組織。我不知道「\ n」或「{0}」,但它們似乎是打印空白行並寫入變量值的更好方法。 – Jameslat 2013-02-13 23:36:03

+0

@ C#Student¿Convert.ToInt16,Convert.ToInt32和int.Parse之間的區別是什麼?看來它們可以根據情況有用。 – Jameslat 2013-02-13 23:38:09