您的位置:首页 > 职场人生

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

2013-12-11 13:05 465 查看
---------------------
ASP.Net+Android+IOS开发.Net培训期待与您交流! ----------------------

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

我自己的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+",
10683
");
}

} 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
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐