<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
用控制台实现的计算器思路完成过程
首先:为了满足界面要求,我做了一个方法来绘制界面,一、方便需要时刷新。方法和变量命名不是很规则主要是英语水平有限,
大家不要见怪啊。
public
static void jsj()
{
Console.WriteLine(Console.Title = "
计算器"
);
Console.WindowWidth = 43;
Console.WindowHeight =30;
Console.WriteLine("
▁
▁
▁
▁
▁
▁
▁
▁
▁
▁
▁
▁
▁
"
);
Console.WriteLine("
▕
▁
▁
▁
▁
▁
▁
▁
▁
▁
▁
▁
▕
"
);
Console.WriteLine("
▕▕
▕
▕
"
);
Console.WriteLine("
▕▕
"
+message +"
▕
▕
"
);
Console.WriteLine("
▕▕
▕
▕
"
);
Console.WriteLine("
▕
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
①
②
③
.
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
④
⑤
⑥
+
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
⑦
⑧
⑨
-
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
0 % / *
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▕
▕
"
);
Console.WriteLine("
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
"
);
}
为了满足不越界的要求:定义一个全局变量message来显示输入的数和显示计算结果,我这里能输入32个字符。当时就命名了两个char类型的数组
static char[] result = new char[32]; //接收输入的的一个数
static char[] result2 = new char[32]; //
接收输入的的二个数。
可能当时为了满足不越界来存储每一个输入的字符,和方便提取出来才定义32唯 ,后来种种原因必须先赋给他‘ ’带有空格的字符(方便判定存储数所占的为数);
现在想来这样不是很好。
public
static void clearzero()//
{
for (int i = 0; i < 32; i++)
{
result2[i] = ' ';
result[i] = ' ';
}
tag = 0; //
标记
‘
.
’
的个数
No = -1; //
输入字符在数组result中的索引
message = " 0."; //
显示结果
}
for
循环为数组赋‘ ’其他变量是干什么的?为什么还写成方法?
置于写此方法是在基本功能完成后,看到还少一个清零功能 。不就是重新运行吗 。即对所用到得变量重新赋值吗!看到这就写了此方法。这都是后话
char
Char= Console.ReadKey(true).KeyChar;
此行代码就是监控用户输入,它应该在Main()内,且还得在一直为真的循环内部。While(true)
接下来就把监控到得数字显示出来:(这里用case接收我们需要的字符,如:123456789)
所以写了一个存储字符的方法
SoreChar
()
public static void SoreChar(char keychar)
{
result[No] = keychar;
message ="";
for (int i = 31; i > No; i--)
{
message += " ";
result[i] = ' ';
}
for (int i = 0; i <=No; i++)
{
message += result[i];
}
}
No
我们定义的全局变量记录数组result【】中(我们需要数字)字符的个数 在这里也实现了时时显示输入的数 (现在来看,为什么没用字符串来接收输入的数)当时没想到,现在看来可以整体的改进。现在只讲讲当时的想法
接下来就是对
零和小数点的存储,这需要有很多验证:1、先输入的是否是0;2、小数点的个数等。及他们的位置是否正确;如下调用验证字符方法(No:字符的个数 tag:小数点的个数。
switch
(Char){
case
'1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':
{No++;SoreChar(Char);break;}
case
'0':{No++;CheckChar(Char);break;}
case
'.':{No++;tag++;CheckChar(Char);break;}
No 和tag先做加加,验证失败在做减减处理。这样错误的输入不计在内。下面方法是对 零和小数点的验证
public
static void CheckChar(char keychar)
{
if (keychar == '.' && No==0|| tag>1) //
排除点的位置,和数量
{ No--;tag--; }
else if(keychar =='0'&&No ==1 &&result [0]=='0') //
排除前两位都是零
{ No--;}
else {SoreChar(keychar);}
}
在下一步处理核心+-*%
case '+':case '-':case '*':case '%':case '/':
{No = -1;ShowJspType(Char);JsType(Char);break;}
为了在Main()内少写代码;能用方法的我几乎都写到外面了;
ShowJspType(Char)
就是为了显示计算类型,没打算也存储以下,只在屏幕中显示以下
public static void ShowJspType(char keychar)
{message = "";
for
(int i = 31; i > 0; i--){message += " ";}
message += keychar;}
这些代码很容易理解,于前面很多地方差不多,就是刷新使其显示。
由于字符太多多本篇显示不完放在下一篇中
转载于:https://blog.51cto.com/baixl/352061