【问题标题】:why my input always take default value?为什么我的输入总是采用默认值?
【发布时间】:2014-12-31 04:10:05
【问题描述】:

这是用于我学习目的的代码...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Calculator
{
    abstract class calculator 
    {
        internal abstract int add();
        internal abstract int sub();
        internal abstract int mul();
        internal abstract int div();
        internal abstract double square();
        internal abstract double underroot();

    }
    class mycalculator : calculator
    {
        public mycalculator() :base()
        {
        }
        private int num1, num2;
        public int opr1
        {
            get { return num1; }
            set{num1 = value;}
        }

        public int opr2
        {
            get { return num2; }
            set { num2 = value; }
        }


        internal override int add() {
            return num1 + num2;
        }
        internal override int sub()
        {
            return num2 - num1;
        }
        internal override int mul()
        {
            return num1 * num2;
        }
        internal override int div()
        {
            if(num1 > num2){
            return num1 / num2;
            }else
            {
                //Console.WriteLine(num1 + " Must be greater than " + num2 + " and " + num2 + "can not be zero" );
                return 0;
            }
        }
        internal override double square()
        {
            return num1 * num1;
        }
        internal override double underroot()
        {
            return Math.Sqrt(num1);
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            char choice = 'y';

            while (choice == 'Y' || choice == 'y')
            {

                Console.WriteLine("\n\nPlease Select your Operation....!\n\n\n\n\n");
                Console.WriteLine("Press 1 for Addtion\n");
                Console.WriteLine("Press 2 for Subtraction\n");
                Console.WriteLine("Press 3 for Multiplication\n");
                Console.WriteLine("Press 4 for Division\n");
                Console.WriteLine("Press 5 for square\n");
                Console.WriteLine("Press 6 for UnderRoot\n");
                int opt;
                opt = Convert.ToInt32(Console.Read());
                mycalculator c = new mycalculator();

                switch (opt)
                {
                    case '1':
                        int a;
                        Console.WriteLine("Please Enter Your First Operand");
                        a = Convert.ToInt32(Console.Read());
                       // a = int.Parse(Console.ReadLine());
                        c.opr1 = a;
                        Console.WriteLine("Please Enter Your Second Operand");
                        c.opr2 = Convert.ToInt32(Console.Read());
                        Console.WriteLine(c.opr1 + " +  " + c.opr2 + "  = " + c.add());
                        break;




                    default:
                        Console.WriteLine("Invalid Choice");
                        break;

                }

                Console.WriteLine("\n\n\nDo you want to Perform more calculations??\n");
                Console.WriteLine("Press 'Y' or 'y' to continue, any other key to exit");
                choice = Console.ReadKey().KeyChar;
               // Console.WriteLine(choice);



            }
            Console.Read();

        }
    }
}

只是省略了减法、乘法等的大小写,以减少代码大小...

问题是: 当我按 1 将两个数字相加时,它应该取第一个操作数和第二个操作数,然后,它应该显示结果......但是相反,它显示了

13 + 10 = 23 

如果我为任何其他函数做,说它显示乘法

13*10 = 130

等等

13-10 = 3 

程序不要求我输入值,只是显示结果,假定操作数 1 为 13,操作数 2 为 10....

我从来没有指定过类似的东西..

谁能指出这两个数字是从地狱的哪个地方自动传来的???

现在诅咒 c# 和 Visual Studio 2012 :(

【问题讨论】:

  • 学习调试。首先设置断点,反复按 F10 和 F11 并检查变量。
  • 在任何地方都使用ReadLine() 而不是Read()
  • 感谢大家帮助我,让我正确地学习这个概念......我是 c# 新手,现在开始学习它......我真的很感谢你们......但问题是,我只能接受一个答案,我觉得每个人都在为让我学习......所以......请告诉我接受哪一个??

标签: c# .net visual-studio visual-studio-2012 default-value


【解决方案1】:

我猜您正在输入“1”,然后按 Enter 键。 Enter 键向您的程序发送回车和换行符。这两个字符的 ASCII 码分别是 13 和 10。所以你实际上是在输入 13 和 10,即使你没有意识到它。

【讨论】:

  • 是的,我正在按 Enter 键……如果您对 ASCII 值的看法也是正确的……如果我没有按 Enter 键,我该如何执行任务??
  • 听起来不错,您无需在按 1 后按 Enter,因为 Console.Read 会阻塞,直到按下某个键。只要您按一个键,代码就会恢复,所以不要按 ENTER 或改用Console.ReadLine
  • 您可以使用 Console.ReadLine 代替 Console.Read。这将读取所有字符直到下一个 CRLF 对。然后你可以使用 String.ToInt32 将你得到的字符串转换成一个数字。
【解决方案2】:

您将 opt 定义为整数。

int opt;
opt = Convert.ToInt32(Console.ReadLine());

switch (opt)
{
    case '1':

 //...

然后您应该在开关内检查整数值:

case 1:
// ....

希望对你有帮助。

【讨论】:

  • 如果我这样做,(案例 1:) 我打了默认值 :( 但如果我使用(案例 '1'),那么正确的部分 switch 被调用....
  • 使用 ReadLine(),因为您通过 Read() 获得 ASCII 码。我更新答案
【解决方案3】:

除了@Hans Kilian 所说的纠正您的示例之外,您还必须执行以下操作
改变这个

opt = Convert.ToInt32(Console.Read());

opt = Convert.ToInt32(Console.ReadLine());

还有这个

case '1': 

到这里

case 1: 

【讨论】:

    【解决方案4】:

    你必须做的改变:

    1. opt = Convert.ToInt32(Console.Read());改成opt = Convert.ToInt32(Console.ReadLine());

    2. case '1': 更改为 case 1: opt 是整数而不是字符

    3. a = Convert.ToInt32(Console.Read());更改为a = Convert.ToInt32(Console.ReadLine());

    4. c.opr2 = Convert.ToInt32(Console.Read());更改为c.opr2 = Convert.ToInt32(Console.ReadLine());

    问题是当你按 1 并回车时,Console.Read() 从输入读取 \r (10) 和 \n (13)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      相关资源
      最近更新 更多