iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 10
2
Modern Web

C#與ASP.Net入門-我要成為工程師!!系列 第 10

Day10-用C#算數學!(基本運算、平方、平方根、log、sin)

好!已經學了基本型別、基本運算子,那來補充一些基礎計算題!

預計練習題目:
1.輸入x,y,計算(x+y)/2
2.輸入x,y,計算x²-y²
3.輸入x,計算y=√?
4.輸入x,計算log(x)、log(a,10)、log10(a)
5.輸入x,計算y=sin(x)

會介紹的方法有:Math.Pow()、Math.Sqrt()、Math.Log()、Math.Log10()、Math.Log2()、Math.Sin()

以及輸出方法Console.WriteLine帶參數的寫法Console.WriteLine("x = {0}, y={1},z={2}", x,y,z)

1.輸入x,y,計算(x+y)/2

 int x, y;//宣告兩個變數
Console.Write("請輸入 x:");//在螢幕上show出請輸入 x:
x = int.Parse(Console.ReadLine());
//Console.ReadLine()是讀鍵盤輸入的值,且回傳string
//但是x是int,無法儲存string的值,所以這裡我們將string轉型為int
//轉型也可以寫x = Convert.ToInt32(Console.ReadLine());
Console.Write("請輸入 y:");
y = int.Parse(Console.ReadLine()); 
Console.WriteLine("x = {0}, y={1},答案={2}", x,y,(x+y)/2);
//這裡也可以宣告一個新變數接x+y的值,例如z=(x+y)/2,Console.WriteLine("x = {0}, y={1},答案={2}", x,y,z);
Console.ReadKey();

輸出結果:
https://ithelp.ithome.com.tw/upload/images/20190909/20120055IqCVLCUqBz.png
什麼?你說如果輸入3跟6的話答案怪怪的?
https://ithelp.ithome.com.tw/upload/images/20190909/20120055SFDpe0xUj9.png

這是一開始很容易忽略的地方,如同這一篇的算術運算子除法說明,因為我的程式碼宣告變數時宣告為int,所以是不會顯示小數的喔~把x,y宣告改成double即可

欸欸還有輸出的時候{0},{1},{2}是什麼意思?
https://ithelp.ithome.com.tw/upload/images/20190909/20120055Om3jjc2N4k.png
這樣寫比較簡潔。當然你也可以一個一個字串慢慢串,像下方這樣

Console.WriteLine("x ="+x+", y="+y+",答案="+(x+y)/2);

可是當字串一長,要在整串裡面找到變數修改很麻煩,要一直用+也很麻煩,要改個順序也很麻煩ಠ_ಠ
身為一個即將成為後端工程師的人兒,還是學學這個用法吧=ˇ=

================================================
感謝下方留言處YoChen大大補充以下兩點,
1.之所以可以用{}這樣表示,是因為使用了String.Format這個方法,Console.WriteLine已經將它整合在overload裡面,所以才能像這樣直接使用。之後會有一篇文章介紹String.Format。
2.另外目前如果想要字串中插入變數,在C#6.0之後,提供了string interpolation(字串插補)方法,可以在字串宣告前方加入 $ 符號,搭配{ },就可以直接用插值的方式傳入變數。
也就是說上面的程式碼可以這麼改寫

Console.WriteLine("x = {0}, y={1},答案={2}", x,y,(x+y)/2);
//等同於
Console.WriteLine($"x = {x}, y={y},答案={(x+y)/2}");

=================================================

2.輸入x,y,計算x²-y²

double a, b;
Console.WriteLine("以下計算a平方-b平方");//輸出此段文字並換行
Console.Write("請輸入 a = ");//輸出此段格式
a = Convert.ToDouble(Console.ReadLine());
Console.Write("請輸入 b = ");
b = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("a平方-b平方={0}", Math.Pow(a, 2)-Math.Pow(b,2));
Console.Read();

輸出結果:
https://ithelp.ithome.com.tw/upload/images/20190909/20120055RnaW7bbBtm.png

求次方的方式:Math.Pow(double 底數,double 幾次方)

3.輸入x,計算y=√?

這題有兩個解法

  1. 使用上方求次方的方式,根號=1/2次方=0.5次方
double a;
Console.WriteLine("求a開根號");
Console.Write("請輸入 a = ");
a = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("a開根號={0}", Math.Pow(a,0.5));
Console.Read();
  1. 使用Math.Sqrt()方法
double a;
Console.WriteLine("求a開根號");
Console.Write("請輸入 a = ");
a = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("a開根號={0}", Math.Sqrt(a));
Console.Read();

Math.Sqrt(double 指定數字)
若輸入負值,則回傳NaN(非數值)

4.輸入x,計算log(x)、log(a,10)、log10(a)

Console.WriteLine("求log(a) 及 log(a,10) 及log10(a)");
Console.Write("請輸入 a = ");
double number = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("log(a)={0} 及 log(a,10)={1} 及 log10(a)={2}", Math.Log(number), Math.Log(number, 10), Math.Log10(number));
Console.Read();

log這裡用的是Math.Log的方法,跟log相關有四種使用方法
Math.Log(double x)以e = 2.718為底
Math.Log(double 數字,double 底數)以後方數字為底
Math.Log10(double x),以10為底
Math.Log2(double x),以2為底

5.輸入x,計算y=sin(x)

double a;
Console.WriteLine("求sin(a)");
Console.Write("請輸入 a = ");
a = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("sin(a)={0}", Math.Sin(a));
Console.Read();

Math.Sin(double x)
1.x必須是弧度,但我們熟悉的計算是角度,角度跟弧度換算公式為
https://ithelp.ithome.com.tw/upload/images/20190909/20120055oZVnbB3fMP.png
pi可以使用Math.PI,C#的 π 精確到小數點後16位
2.a值範圍從大約-9223372036854775295 到大約9223372036854775295,超出此範圍會原封不動傳回,不會報錯
https://ithelp.ithome.com.tw/upload/images/20190909/201200559b1MSwhuQj.png
cos傳送門
tan傳送門
注意以上Math方法無論是參數或是傳回值,型態都是double

參考資料

MSDN-Math Class


上一篇
Day09-C#運算式與運算子(+、-、*、/、>、<....等)-來用C#算數學吧!(下)
下一篇
Day11-C#的條件判斷- if else(例子:比大小、賣場折扣、判斷腰圍肥胖)
系列文
C#與ASP.Net入門-我要成為工程師!!31

1 則留言

1
YoChen
iT邦新手 1 級 ‧ 2019-09-11 11:59:45

欸欸還有輸出的時候{0},{1},{2}是什麼意思?
...((太多了,中間略過~XDDD
身為一個即將成為後端工程師的人兒,還是學學這個用法吧=ˇ=

這個地方可能要稍微提到一下String.Format這個方法,由於Console.WriteLine已經將它整合在overload裡面,所以才能像這樣直接使用,不然大部分對於一般的字串,如果需要使用一樣的整理方式,就必須使用String.Format, ex.

string a = "Hello";
string b = "World";
string formatAB = String.Format("{0} ~ {1}", a, b);
Console.WriteLine(formatAB); // 輸出: Hello ~ World
// 結果等同於
Console.WriteLine("{0} ~ {1}", a, b); // 輸出: Hello ~ World

這樣就不會被局限在特定方法中了~XDDD

另外補充一點,在C#6.0之後,提供了最新的string interpolation方法,只需要在字串宣告前方加入 $ 符號,就可以直接用插值的方式傳入變數~ ex.

string a = "Hello";
string b = "World";
string before = String.Format("{0} ~ {1}", a, b);
string now = $"{a} ~ {b}";

Console.WriteLine("{0} ~ {1}", a, b); // 輸出: Hello ~ World
Console.WriteLine(before); // 輸出: Hello ~ World
Console.WriteLine(now); // 輸出: Hello ~ World

感謝YoChen大大補充!!!讓我瞬間接上了某條線XD
$超方便XDD!!居然忘記介紹它了XD立馬補充!

我要留言

立即登入留言