• 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=='
    ')
                    {
                        break;
                    }
                    Console.Write("*");
                    psw += cki.KeyChar;
                   }   
              Console.WriteLine("
    您输入的密码是" + 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 ");实现删除.将光标往前挪一位,即是字符串的最后一位的位置,然后用空格将其取缔,此时光标又往后挪了,所以需要再加一个,使得继续输入的字符紧跟前面的
                ConsoleKeyInfo cki;
                string psw="";
                while (true)
                {
                    cki = Console.ReadKey(true);
                    if (cki.KeyChar=='
    ')
                    {
                        break;
                    }
                    else if (cki.KeyChar != '')
                    {
                        Console.Write("*");
                    }
                    else
                    {
                        Console.Write(" ");
                    }
                        psw += cki.KeyChar;       
                   }   
              Console.WriteLine("
    您输入的密码是" + 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 ");实现删除.将光标往前挪一位,即是字符串的最后一位的位置,然后用空格将其取缔,此时光标又往后挪了,所以需要再加一个,使得继续输入的字符紧跟前面的
                ConsoleKeyInfo cki;
                string psw="";
                while (true)
                {
                    cki = Console.ReadKey(true);
                    if (cki.KeyChar=='
    ')
                    {
                        break;
                    }
                    else if (cki.KeyChar != '')
                    {
                        Console.Write("*");
                    }
                    else
                    {
                        Console.Write(" ");
                        psw = psw.Substring(0, psw.Length - 1);
                    }
                        psw += cki.KeyChar;       
                   }   
              Console.WriteLine("
    您输入的密码是" + 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 ");实现删除.将光标往前挪一位,即是字符串的最后一位的位置,然后用空格将其取缔,此时光标又往后挪了,所以需要再加一个,使得继续输入的字符紧跟前面的
                ConsoleKeyInfo cki;
                string psw="";
                while (true)
                {
                    cki = Console.ReadKey(true);
                    if (cki.KeyChar=='
    ')
                    {
                        break;
                    }
                    else if (cki.KeyChar != '')
                    {
                        Console.Write("*");
                    }
                    else
                    {
                        Console.Write(" ");
                        psw = psw.Substring(0, psw.Length - 1);
                        continue;//表示不往下执行psw += cki.KeyChar,执行语句跳到该方法的开始位置.
                    }
                        psw += cki.KeyChar;       
                   }   
              Console.WriteLine("
    您输入的密码是" + 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 ");实现删除.将光标往前挪一位,即是字符串的最后一位的位置,然后用空格将其取缔,此时光标又往后挪了,所以需要再加一个,使得继续输入的字符紧跟前面的
                ConsoleKeyInfo cki;
                string psw="";
                while (true)
                {
                    cki = Console.ReadKey(true);
                    if (cki.KeyChar=='
    ')
                    {
                        break;
                    }
                    else if (cki.KeyChar != '')
                    {
                        Console.Write("*");
                    }
                    else
                    { 
                        Console.Write(" ");
                        if (psw.Length==0)
                        {
                            continue;
                        } 
                        else
                        { 
                            psw = psw.Substring(0, psw.Length - 1);
                            continue;//表示不往下执行psw += cki.KeyChar,执行语句跳到该方法的开始位置.
                        }       
                    }
                        psw += cki.KeyChar;       
                   }   
              Console.WriteLine("
    您输入的密码是" + psw);
              Console.ReadKey();
            }
        }
    View Code
    我叫小小菜,想要成为一棵大大包心菜.
  • 相关阅读:
    数据库系统原理
    Java并发编程详解读书笔记(一)
    Java基础之String
    Java基础之数据类型
    winform BackgroundWorker控件的用法
    汉子转拼音
    model验证(验证登录、注册...)
    Ajax.BeginForm 异步搜索
    Ajax.ActionLink 辅助方法实现局部刷新
    js 随笔
  • 原文地址:https://www.cnblogs.com/tobecabbage/p/3434296.html
Copyright © 2020-2023  润新知