c#基础加强版之方法控制流复习-3控制台打印密码

 

 题目三:控制台做简单计算器

我自己的code:

namespace 习题三计算器
{
    class Program
    {
        static int ReadInt(string str)
        {
            Console.WriteLine(str);
            int inputNum;
            while (true)
            {
                try
                {
                    inputNum = Convert.ToInt32(Console.ReadLine());
                    break;
                }
                catch (System.Exception ex)
                {
                    Console.WriteLine(ex.Message + "请重新输入");
                }
            }
            return inputNum;
        }

        static string SetOperator()
        {
            Console.WriteLine("请输入一个操作符+-*/");
            string operatorStr;
            while (true)
            {
                operatorStr = Console.ReadLine();
                if (operatorStr == "+" || operatorStr == "-" || operatorStr == "*" || operatorStr == "/")
                {
                    break;
                }
                Console.WriteLine("请输入正确的操作符+-*/");
            }
            return operatorStr;
        }

        static int Calculate(string operatorStr, int numA, ref int numB)
        {//根据操作符,进行+-*/计算,在做除法运算时,numB若为0,则需要充值,采用应用参数.使得实参跟形参保持一致
            {
                int result = 0;
                switch (operatorStr)
                {
                    case "+": result = numA + numB; break;
                    case "-": result = numA - numB; break;
                    case "*": result = numA * numB; break;
                    case "/":
                        while (true)
                        {
                            if (numB == 0)//判断除数为0 的问题
                            {
                                numB = ReadInt("除数不能为0,请重新输入除数值");//除数为0的时候,重新设置numB的值
                            }
                            else
                            {
                                result = numA / numB;
                                break;
                            }
                        }
                        break;
                    default: break;
                }
                return result;
            }
        }

        static void Main(string[] args)
        {
            int numA = ReadInt("请输入第一个数字");
            int numB = ReadInt("请输入第二个数字");
            string operatorStr = SetOperator();
            int result =Calculate(operatorStr,numA,ref numB);
            Console.Clear();
            Console.WriteLine(numA + operatorStr + numB + "=" + result);
            Console.Read();
        }
    }
}
View Code

 老师的code:

namespace 老师的代码_简单计算器
{
    class Program
    {
        static int InputNum(string str)
        {
            int inputNum;
            do 
            {
                Console.WriteLine(str);
                try
                { 
                    inputNum = Convert.ToInt32(Console.ReadLine());
                    break;
                }
                catch (System.Exception ex)
                {
                    Console.Write(ex.Message+",");
                }
              
            } while (true);
            return inputNum;
        }

        static int GetResult(int numA,string oper,int numB,out bool isRight)
        {
            isRight = true;
            int result=0;
            switch (oper)
            {
                case "+": result = numA + numB;break;
                case "-": result = numA - numB; break; ;
                case "*": result = numA * numB; break;
                case "/": result = numA / numB;break;
                default: Console.WriteLine("非法操作符"); isRight = false; break;
            }

            return result;
        }
        static void Main(string[] args)
        {
            int numA = InputNum("请输入一个数字");
            int numB = InputNum("请输入第二个数字");
            Console.WriteLine("请输入操作符+-*/");
            string oper = Console.ReadLine();
            bool isRight;
            int result = GetResult(numA, oper, numB, out isRight);
            if (isRight==true)
            {
                Console.WriteLine("{0}{1}{2}={3}",numA,oper,numB,result);
            }
        }
    }
}
View Code

题目四:控制台输入密码,显示为*,并要求存放存储我们输入的密码.

我没有完成

老师的讲解过程,见以下code:

namespace 老师的代码_习题4控制台输入密码
{
    class Program
    {//实现控制台数目密码,显示为*,并让计算机存取我们输入的密码
        static void Main(string[] args)
        {
            //思路:
            //在csdn上查找发现Console.ReadKey()有方法重载Console.ReadKey(bool),该方法可以允许选择性显示输入的键
           // Console.ReadKey(true);当参数为true的时候,不显示输入的键,将鼠标放在该方法上,智能提示告知: 该方法的返回类型为ConsoleKeyInfo
           // ConsoleKeyInfo cki = Console.ReadKey(true);//设置断点,运行到该句的时候,将鼠标放在 cki变量处,查看cki的类型,发现cki有key属性集keyChar属性
           //那么,输入enter键的时候,为密码输完,实验输入一个ernter键,查看cki的值,发现此时cki.KeyChar='/r'
            ConsoleKeyInfo cki;
            string psw="";
            while (true)
            {
                cki = Console.ReadKey(true);
                if (cki.KeyChar=='\r')
                {
                    break;
                }
                Console.Write("*");
                psw += cki.KeyChar;
               }   
          Console.WriteLine("\n您输入的密码是" + psw);
          Console.ReadKey();
        }
    }
}

 以上代码,调试的时候,发现,若输错密码,进行删除后,计算机存储的密码并没有将我们已经删除的字符删掉.

所以,我们下面将实现:点击退格键的时候,不打印*并且将前面的*删掉

code如下:

namespace 老师的代码_习题4控制台输入密码
{
    class Program
    {//实现控制台数目密码,显示为*,并让计算机存储我们输入的密码
        static void Main(string[] args)
        {
            //思路:
            //在csdn上查找发现Console.ReadKey()有方法重载Console.ReadKey(bool),该方法可以允许选择性显示输入的键
           // Console.ReadKey(true);当参数为true的时候,不显示输入的键,将鼠标放在该方法上,智能提示告知: 该方法的返回类型为ConsoleKeyInfo
           // ConsoleKeyInfo cki = Console.ReadKey(true);//设置断点,运行到该句的时候,将鼠标放在 cki变量处,查看cki的类型,发现cki有key属性集keyChar属性
           //输入enter键的时候,为密码输完,实验输入一个ernter键,查看cki的值,发现此时cki.KeyChar='/r'
          //考虑输入退格键的时候,不打印*,并且将输错的字符删除
         //Console.Write("12345\b \b");实现删除.\b将光标往前挪一位,即是字符串的最后一位的位置,然后用空格将其取缔,此时光标又往后挪了,所以需要再加一个\b,使得继续输入的字符紧跟前面的
            ConsoleKeyInfo cki;
            string psw="";
            while (true)
            {
                cki = Console.ReadKey(true);
                if (cki.KeyChar=='\r')
                {
                    break;
                }
                else if (cki.KeyChar != '\b')
                {
                    Console.Write("*");
                }
                else
                {
                    Console.Write("\b \b");
                }
                    psw += cki.KeyChar;       
               }   
          Console.WriteLine("\n您输入的密码是" + psw);
          Console.ReadKey();
        }
    }

 然后,我们来实现,计算器存储的密码是去掉了我们已经删除的字符.

那么我们要学习一个string类的substring方法.string.substring(起始的位置,字符串的长度),改方法是用来截取字符串的长度以第一个参数作为起始位置,以第二个参数作为截取的长度.如string str="1234567" ,我们截取一个str1="123456"的方法是str1=str.substring(0,str.length-1).

code为:

namespace 老师的代码_习题4控制台输入密码
{
    class Program
    {//实现控制台数目密码,显示为*,并让计算机存储我们输入的密码
        static void Main(string[] args)
        {
            //思路:
            //在csdn上查找发现Console.ReadKey()有方法重载Console.ReadKey(bool),该方法可以允许选择性显示输入的键
           // Console.ReadKey(true);当参数为true的时候,不显示输入的键,将鼠标放在该方法上,智能提示告知: 该方法的返回类型为ConsoleKeyInfo
           // ConsoleKeyInfo cki = Console.ReadKey(true);//设置断点,运行到该句的时候,将鼠标放在 cki变量处,查看cki的类型,发现cki有key属性集keyChar属性
           //输入enter键的时候,为密码输完,实验输入一个ernter键,查看cki的值,发现此时cki.KeyChar='/r'
          //考虑输入退格键的时候,不打印*,并且将输错的字符删除
         //Console.Write("12345\b \b");实现删除.\b将光标往前挪一位,即是字符串的最后一位的位置,然后用空格将其取缔,此时光标又往后挪了,所以需要再加一个\b,使得继续输入的字符紧跟前面的
            ConsoleKeyInfo cki;
            string psw="";
            while (true)
            {
                cki = Console.ReadKey(true);
                if (cki.KeyChar=='\r')
                {
                    break;
                }
                else if (cki.KeyChar != '\b')
                {
                    Console.Write("*");
                }
                else
                {
                    Console.Write("\b \b");
                    psw = psw.Substring(0, psw.Length - 1);
                }
                    psw += cki.KeyChar;       
               }   
          Console.WriteLine("\n您输入的密码是" + psw);
          Console.ReadKey();
        }
    }
}
View Code

调试后发现,出现问题,若是最后连着按几次退格键,得到的字符串只删除了一个字符.原因是,每次删除后,又执行连接字符了,具体可以逐句句调试.那么,我们可以将代码修改成:

namespace 老师的代码_习题4控制台输入密码
{
    class Program
    {//实现控制台数目密码,显示为*,并让计算机存储我们输入的密码
        static void Main(string[] args)
        {
            //思路:
            //在csdn上查找发现Console.ReadKey()有方法重载Console.ReadKey(bool),该方法可以允许选择性显示输入的键
           // Console.ReadKey(true);当参数为true的时候,不显示输入的键,将鼠标放在该方法上,智能提示告知: 该方法的返回类型为ConsoleKeyInfo
           // ConsoleKeyInfo cki = Console.ReadKey(true);//设置断点,运行到该句的时候,将鼠标放在 cki变量处,查看cki的类型,发现cki有key属性集keyChar属性
           //输入enter键的时候,为密码输完,实验输入一个ernter键,查看cki的值,发现此时cki.KeyChar='/r'
          //考虑输入退格键的时候,不打印*,并且将输错的字符删除
         //Console.Write("12345\b \b");实现删除.\b将光标往前挪一位,即是字符串的最后一位的位置,然后用空格将其取缔,此时光标又往后挪了,所以需要再加一个\b,使得继续输入的字符紧跟前面的
            ConsoleKeyInfo cki;
            string psw="";
            while (true)
            {
                cki = Console.ReadKey(true);
                if (cki.KeyChar=='\r')
                {
                    break;
                }
                else if (cki.KeyChar != '\b')
                {
                    Console.Write("*");
                }
                else
                {
                    Console.Write("\b \b");
                    psw = psw.Substring(0, psw.Length - 1);
                    continue;//表示不往下执行psw += cki.KeyChar,执行语句跳到该方法的开始位置.
                }
                    psw += cki.KeyChar;       
               }   
          Console.WriteLine("\n您输入的密码是" + psw);
          Console.ReadKey();
        }
    }
View Code

 我们再运行调试后,发现,若是退格键连按几次后,字符串的长度变为0的时候,这时再截取字符串0-length-1的话,就i会出现错误,所以我们需要些个条件语句以判断字符串长度为0的时候执行什么.

所以,最后的代码是:

amespace 老师的代码_习题4控制台输入密码
{
    class Program
    {//实现控制台数目密码,显示为*,并让计算机存储我们输入的密码
        static void Main(string[] args)
        {
            //思路:
            //在csdn上查找发现Console.ReadKey()有方法重载Console.ReadKey(bool),该方法可以允许选择性显示输入的键
           // Console.ReadKey(true);当参数为true的时候,不显示输入的键,将鼠标放在该方法上,智能提示告知: 该方法的返回类型为ConsoleKeyInfo
           // ConsoleKeyInfo cki = Console.ReadKey(true);//设置断点,运行到该句的时候,将鼠标放在 cki变量处,查看cki的类型,发现cki有key属性集keyChar属性
           //输入enter键的时候,为密码输完,实验输入一个ernter键,查看cki的值,发现此时cki.KeyChar='/r'
          //考虑输入退格键的时候,不打印*,并且将输错的字符删除
         //Console.Write("12345\b \b");实现删除.\b将光标往前挪一位,即是字符串的最后一位的位置,然后用空格将其取缔,此时光标又往后挪了,所以需要再加一个\b,使得继续输入的字符紧跟前面的
            ConsoleKeyInfo cki;
            string psw="";
            while (true)
            {
                cki = Console.ReadKey(true);
                if (cki.KeyChar=='\r')
                {
                    break;
                }
                else if (cki.KeyChar != '\b')
                {
                    Console.Write("*");
                }
                else
                { 
                    Console.Write("\b \b");
                    if (psw.Length==0)
                    {
                        continue;
                    } 
                    else
                    { 
                        psw = psw.Substring(0, psw.Length - 1);
                        continue;//表示不往下执行psw += cki.KeyChar,执行语句跳到该方法的开始位置.
                    }       
                }
                    psw += cki.KeyChar;       
               }   
          Console.WriteLine("\n您输入的密码是" + psw);
          Console.ReadKey();
        }
    }
View Code

 

 

posted @ 2013-11-20 20:52  我叫小菜  阅读(247)  评论(0编辑  收藏  举报