用控制檯實現的計算器思路完成過程
首先:爲了滿足界面要求,我做了一個方法來繪製界面,一、方便需要時刷新。方法和變量命名不是很規則主要是英語水平有限,
大家不要見怪啊。
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;}
這些代碼很容易理解,於前面很多地方差不多,就是刷新使其顯示。
由於字符太多多本篇顯示不完放在下一篇中