【问题标题】:C# program does not evaluate operations and return wrong answersC# 程序不评估操作并返回错误答案
【发布时间】:2023-03-22 22:52:02
【问题描述】:

社区。

我正在学习如何用 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

心不在焉,对吧?

//

【问题讨论】:

  • 为什么要在文本编辑器中编写并手动编译? C# Express 是免费的,可以帮助您更快地学习很多倍
  • 旁注,你确定这个Console.WriteLine("Nice meeting you, " + name, "Have a good day!"); 做了你认为的事情吗?
  • “Mindblast”评论是对我自己编译程序没有任何问题的一点奖励。至少语法问题...
  • @NikBougalis 刚刚注意到那段额外的文字。感谢您指出!

标签: c# windows oop cmd notepad++


【解决方案1】:

不要使用Console.Read,因为它不符合预期:

从标准输入流中读取下一个字符(并返回代表它的整数值1)。

这里有一个来自 devshort 的很好的解释,为什么第二次调用 Console.Read“跳过”:

如果您在第一件事中输入值“1”,它会将其转换为 ascii 表示。然后回车仍然在屏幕 [input] 缓冲区中,因此当您点击下一次读取 (Console.Read) 时,它会读取换行符并将其转换为数字。

相反,一种方法是将Console.ReadLineint.Parse 或类似的.. 结合使用(返回一个字符串)。


1 提示:carriage return 字符的值为 13。

【讨论】:

  • 这个。如果您在第一件事中输入值“1”,它会将其转换为 ascii 表示。然后回车仍在屏幕缓冲区中,因此当您点击下一个Read 时,它会读取换行符并将其转换为数字。如果您在第一次输入时输入超过 1 个字符,它将读取第一个字符,然后第二次读取将读取第二个字符。心不乱。这样做而不是阅读:Convert.ToInt32(Console.ReadLine());
  • @devshorts 确实如此。感谢您对跳过行为的解释。
  • 我想将我的评论更改为不使用 Convert.ToInt32 ,因为如果输入字符串无效,这将引发异常。照@pst 所说的去做并使用 int.Parse:if (!int.TryParse(Console.ReadLine(), out num1)) { Console.WriteLine("Invalid number! "); }
  • 谢谢大家的回答。我让程序运行没有任何问题:)
【解决方案2】:

视觉上为0 的ascii 的字节值为48。或0x30。这解释了 48。

基本上,你使用了错误的函数。

【讨论】:

    【解决方案3】:

    好的,我稍微编辑了你的代码并添加了一些解释,因为我改变了一些东西..

            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
    

    【讨论】:

    • @JamesSlat 如果您有任何问题,请随时提出。
    • @C# 学生 感谢您的更正!它看起来比我以前的源代码更干净、更有条理。我不知道“\n”或“{0}”,但它们似乎是打印空行并写入变量值的更好方法。
    • @C# Student ¿ Convert.ToInt16、Convert.ToInt32 和 int.Parse 有什么区别?根据情况,它们似乎很有用。
    • @Jameslat 这是一个关于 convert 和 parse 和 tryparse 之间区别的好例子:codeproject.com/Articles/32885/… Convert.ToInt16 和 Int32 之间的区别是允许值的范围,你可以在这里看到:msdn.microsoft.com/en-us/library/vstudio/exx3b86w.aspx我主要使用 int.TryParse,所以当用户输入不正确时,它会返回 0 或正确的值。并且程序仍然运行,而不是卡在那个 1 错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2014-12-04
    相关资源
    最近更新 更多