题目三:控制台做简单计算器
我自己的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(); } } }
老师的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); } } } }
题目四:控制台输入密码,显示为*,并要求存放存储我们输入的密码.
我没有完成
老师的讲解过程,见以下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(); } } }
调试后发现,出现问题,若是最后连着按几次退格键,得到的字符串只删除了一个字符.原因是,每次删除后,又执行连接字符了,具体可以逐句句调试.那么,我们可以将代码修改成:
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(); } }
我们再运行调试后,发现,若是退格键连按几次后,字符串的长度变为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(); } }