您好,登錄后才能下訂單哦!
1、第一部分第五課:簡易計算器
2、第一部分第六課預告:控制流程,隨心所至
上一課《【C++探索之旅】第一部分第四課:內存,變量和引用》中,我們已經學習了挺重要的內存的概念,變量的知識,對引用這個C++中常用的技術也有了初步的了解。
我們在上一課開頭處用一個小小計算器的存儲技術引出內存的概念。其實我們的電腦兄也是一個計算器,只不過高端大氣上檔次了很多,不然怎么會被稱為 computer呢?英語中compute這個詞,正是《計算》的意思,而加上r就構成了名詞。computer就是“計算機”。(復論學好英語對編程的 幫助)。
所以,電腦不僅能儲存數據,還能進行很復雜的計算。
這一課我們就來聊聊計算。
請求用戶輸入信息
上一課中,我們學習了如何在控制臺(console)中顯示變量的值。現在我們來做相反的事情:請求用戶為我們的程序提供輸入,以存儲到內存中。
從控制臺讀數據
也許你也注意到了(如果現在才注意到,是不是有點后知后覺?哈哈),C++用了很多英語的單詞。應該說基本所有的編程語言都使用了很多英語單詞,所以英語很重要。
有些編程你不需要用到太多高深的數學知識,但是英語卻是天天見啊,大寶還不一定天天見呢~
比如我們的輸出流cout,就是由c和out組成,是console out的意思,console表示“控制臺”,out表示“向外,出去”。表示輸出到控制臺。是標準輸出流。因此我們用cout從程序向控制臺輸出數據。
而與它相對應的就是cin啦,是console in的意思,in表示“向內,進來”。表示從控制臺讀入。因此我們用cin從控制臺讀入數據。
與cout配合,我們需要一個運算符 <<
與cin配合,我們需要一個運算符 >>
至于cin和cout,<<和>>究竟原理如何,等以后學了類和對象我們再說。目前只需要知道怎么使用即可。
我們來看一個例子:
#include <iostream> using namespace std; int main() { cout << "您幾歲了 ?" << endl; int userAge(0); // 我們在內存中申請一個整型變量(初始值為0),以存放我們的年齡數值 cin >> userAge; // 我們請求用戶輸入數據,賦值給userAge變量 cout << "您已經" << userAge<< "歲了" << endl; // 顯示變量值 return 0; }
運行,輸出如下:
您幾歲了 ?
28
您已經28歲了
原理解析
那么上面的程序中究竟發生了什么呢?
首先,程序顯示"您幾歲了 ?"這一段信息,至此并沒有什么特別。然后,在第8行,程序向操作系統請求在內存中為其分配一塊區域(好比上一課說的一個抽屜),用于存放一個int類型的變量,名稱是userAge(抽屜的標簽),并在抽屜里存放入一個初始值0。
接著,就有新知識點了。我們可以看到控制臺里輸出"您幾歲了 ?"之后,換了一行(主要是endl的作用,endl是end line的縮寫,表示"結束行",所以自然要換行啦),然后出現了一個閃爍的光標,等待用戶輸入。
用戶輸入數值以后(例如28),程序就把這個數值賦給userAge,代替原先的0。最后再把變量的值輸出。
巧記 >>和<<
初學C++,我們容易搞混<<和>>的用法,到底哪一個是和cout(標準輸出)配合,哪一個和cin(標準輸入)配合呢?
不用擔心,你不是一個人,很多人也經常記不清楚。
那么如何記住這兩個運算符呢?
其實很簡單:
我們還是用userAge這個變量來舉例。
cout << userAge cin >> userAge
你看不管怎樣,userAge,也就是內存中的變量,總是位于運算符右邊,而cout和cin總是位于運算符左邊。
那么 << 就是從內存中取出變量的值,給cout使用,使其能夠將變量的值顯示到控制臺,因此 << 的流向是從內存到cout。
而 >> 就是將cin獲取的用戶輸入控制臺的數值賦給變量,因此 >> 的流向是從cin到內存。
當然,我們可以配合圖示來記憶,你就永遠不會搞錯啦:
如果以后你還會搞錯,不要跟別人說你是看謝什么恩銘的文章學的。開個玩笑~
其他變量
當然了,上面提到的知識點,也可用于其他變量類型,例如:
#include <iostream> #include <string> using namespace std; int main() { cout << "您叫什么?" << endl; string userName("無名氏"); // 在內存中申請一個string類型的抽屜 cin >> userName; // 將用戶輸入的數據賦值給userName cout << "PI的值是多少?" << endl; double piValue(-1.); // 在內存中申請一個double類型的抽屜 cin >> piValue; // 將用戶輸入的數據賦值給piValue cout << "您叫" << userName<< " ,您認為PI的值是" << piValue << endl; return 0; }
這次我想不需要給出什么解釋了吧,自己運行此程序試試吧。
空格的問題
測試下上面的程序,是不是發現有點小問題?
假如我們如下運行:
您叫什么?
Isaac Newton
PI的值是多少?
您叫Isaac,您認為PI的值是0
很奇怪是嗎?程序并沒有請求我們輸入PI的值,而是將PI的值改為了0。而且Newton不見了。哦,no,牛頓不見了,咋辦?小蘋果都不知道該往誰頭上掉了(小編你可以了...)
要說原因,這是空格的問題。當用戶按下回車時,程序會把用戶輸入在控制臺的數據拷貝到內存的"抽屜"中,但是它會在第一個空格或回車符處停住。當用戶輸入的是數值時,并沒有問題,因為數值里沒有空格。
但是當輸入的是字符串(string)時,可能會有空格。這樣,電腦就會在第一個單詞結尾處截斷,畢竟電腦也是挺呆萌的。這樣,在上例中,程序就會以為Newton是PI的值。
所以,我們須要截取所有一整行,而不是第一個單詞。那就要用到getline函數了。
我們將 cin >> userName 用getline函數替換,如下:
#include <iostream> #include <string> using namespace std; int main() { cout << "您叫什么?" << endl; string userName("無名氏"); // 在內存中申請一個string類型的抽屜 getline(cin, userName); // 將用戶輸入的整一行放入userName這個抽屜 cout << "PI的值是多少?" << endl; double piValue(-1.); // 在內存中申請一個double類型的抽屜 cin >> piValue; // 將用戶輸入的數據賦值給piValue cout << "您叫 " << userName<< " ,您認為PI的值是 " << piValue << endl; return 0; }
我們看到cin和userName還是在那里,只不過這次它們是作為getline的參數被使用了。
這次,運行程序后,就沒有問題了:
您叫什么?
Isaac Newton
PI的值是多少?
3.14
您叫Isaac Newton, 您認為PI的值是3.14
假如我么首先使用cin >> 然后才使用getline呢?比如我們先請求用戶輸入PI的值,然后再請求用戶輸入名字。
你會發現程序又出問題了。程序并沒有向用戶請求輸入名字,而且輸出了隨便什么東西。
為了解決這個問題,我們須要在cin >>之后使用cin.ignore()
如下所示:
#include <iostream> #include <string> using namespace std; int main() { cout << "PI的值是多少?" << endl; double piValue(-1.); // 在內存中申請一個double類型的抽屜 cin >> piValue; // 將用戶輸入的數據賦值給piValue cin.ignore(); cout << "您叫什么?" << endl; string userName("無名氏"); // 在內存中申請一個string類型的抽屜 getline(cin, userName); // 將用戶輸入的整一行放入userName這個抽屜 cout << "您叫 " << userName<< " ,您認為PI的值是 " << piValue << endl; return 0; }
如果我們混合使用>>和getline,記得須要在cin >> 語句之后用cin.ignore()。這是一個規則,要記住。
改變變量的值
要進行運算,我們離不開變量。
首先,我們來看看如何改變變量的值吧。我們用=(等號)來進行數值的改變。假設我有一個int型的變量,我想要改變它的值,我首先寫這個int型變量的名稱,后面跟一個=號,再接新的數值。這就是變量的賦值。例如:
int number(0); // 在內存中申請一個抽屜,存放一個int類型變量,叫number,初始值為0 number = 5; // 將number的值改為5
我們也可以直接把一個變量的值賦給另一個變量:
int a(4), b(5); // 定義兩個變量 a = b; // 將變量b的值賦給a
上面兩句程序做了什么呢?
首先,我們定義了兩個int變量,分別取名為a和b,也就是在內存中申請了兩個抽屜,初始值分別是4和5。
接著 a = b; 這句話將b的值賦給a,也就是用5代替了a原先的值4,如下圖所示:
#include <iostream> using namespace std; int main() { int a(4), b(5); // 定義兩個變量 cout << "a的值是 : " << a << ", b的值是 : " << b << endl; cout << "賦值!" << endl; a = b; // 將b的值賦給a cout << "a的值是 : " << a << ", b的值是 : " << b << endl; return 0; }
運行,輸出:
a的值是 : 4, b的值是 : 5
賦值!
a的值是 : 5, b的值是 : 5
b的值并沒有改變,在賦值時,只有等號左邊的值(稱為左值)會改變,等號右邊的值(右值)不會改變。這也不是說賦值運算中的這兩個變量是一樣的,只是它們的值相等而已。
這是個好的開始,但是要稱得上一個最基本的計算器,我們還缺點什么。是的,缺運算符。
最基礎的計算器
我們從最基本的運算符開始介紹,首先是加法運算符:+
例如:
#include <iostream> using namespace std; int main() { int result(0), a(5), b(8); result = a + b; cout << "5 + 8 = " << result<< endl; return 0; }
運行,輸出:
5 + 8 = 13
給出基礎的運算符的表:
運算 | 符號 | 用例 |
---|---|---|
加法 | + |
|
減法 | - |
|
乘法 | * |
|
除法 | / |
|
取模 | % |
|
上表中前面四個運算符都好理解,但是最后一個"取模"是什么意思呢?小學數學老師好像沒有教我啊。
取模就是除法運算的延伸。因為例如整數除法,我們有除不盡的時候,就會多出點"邊角料",這個邊角料就是模了,其實就是余數。
因此,假如 13 / 4 等于 3 余 1 (因為 3 乘以4,再加1等于13)
那么1就是13 / 4 的模。
13 % 4 就等于1
有了這么多運算符,我們就可以組合出復雜一些的運算啦,例如:
result = ((a+b) * c ) - d;
常變量
這標題有點奇怪,不是嗎?
什么叫常變量?要么常量,要么變量。
好吧,常變量就是不能改變的變量。
要聲明常變量,我們使用const關鍵字。const是constant的縮寫,表示"恒定的"。用const聲明的變量不可在之后的程序中被更改,不然程序運行會報錯。
只 要適合用const的地方,都盡量用const。因為我們不但可以避免一些程序的錯誤(比如防止修改我們不想要其值改變的變量),而且const變量使得 編譯器更加有效率(因為const變量,編譯器之后就不會再去檢查它的值有沒有被改變了,不會再去重復取它的值,因為知道其值不能被改變)。
const用法如下:
string const password("wAsTZsaswQ"); // 密碼 double const pi(3.14); // PI的值 unsigned int const maxLifePoint(100); // 生命值的最大取值
下一課中,我們還會再聊const這個關鍵字。
縮略形式
程序員是很勤勞的,但是他們又是很會偷懶的。
會偷懶和偷懶不一樣,偷懶是貶義,會偷懶是褒義。會偷懶是指我們如果可以用更簡便的方法來完成某事,盡量不用原先復雜冗余的形式。因為這樣可以節省開銷,降低程序復雜度。
我們就來看看幾個運算符的縮略形式吧。
在編程中,很多時候,我們需要將變量進行減1的運算,或者加1的運算。一般我們會這樣寫:
int a(4); a = a + 1; // 使a增加1
但是不覺得 a = a + 1; 寫起來有點重復嗎?寫了兩次a誒,不能忍啊。
因此我們可以用自增運算符來完成同樣的操作。
自增運算
自增運算符是++
也就是在變量名后跟++
例如:
int a(4); a++; cout << "a的值是 : " << a << endl;
運行,輸出:
a的值是 : 5
自減運算
自減運算就是將變量的值減1啦。
int a(4); a--;
之后a的值變為3。
自增運算符和自減運算符,有不同的擺放位置,不一定放在變量名后面,也可以放在變量名前面。作用有所不同。
a++; // 先使用a的值,再對a進行加1操作 ++a; // 先對a進行加1操作,再使用a的值
例如:
int b(0), a(2); b = a++; cout << "a的值是 : " << a << " , b的值是 : " << b << endl; b = ++a; cout << "a的值是 : " << a << " , b的值是 : " << b << endl;
運行,輸出:
a的值是 : 3 , b的值是 : 2
a的值是 : 4 , b的值是 : 4
為什么呢?
因為第一次的時候,我們使用 b = a++; 是先將a的值賦給b,然后再對a進行加1操作。這句結束后,a的值變為3,b的值是2
接著,我們使用b = ++a; 是先將a的值加1,再將a的值賦給b。所以a的值首先變為4,再賦值給b,因此b的值為4。
要記憶也很容易,假如是a++的形式,由于變量名在左邊,所以先使用變量,再進行之后的++操作;假如是++a的形式,由于++符號在先,因此先進行自增操作,再使用變量。
其他運算符
其他運算符就是基礎運算符(加,減,乘,除,取模)與等號的結合使用了:
+=, -=, *=, /= et %=
例如:
#include <iostream> using namespace std; int main() { double number(5.3); number += 4.2; // number現在等于 9.5 number *= 2.; // number現在等于 19 number -= 1.; // number現在等于 18 number /= 3.; // number現在等于 6 return 0; }
更多數學運算
也許你覺得不夠過癮,畢竟我們只是做了一些很基礎的運算。
那么如果你要進行比如開平方根這樣的運算,該如何做呢?
我們需要引入一個C++的標準庫:數學庫,是cmath
#include <cmath>
在這個頭文件里,包含了很多數學計算相關的函數。如下表(沒有列全):
函數名稱 | 符號 | 函數 | 用例 |
---|---|---|---|
平方根 | sqrtx |
|
|
正弦值 | sin(x) |
|
|
余弦值 | cos(x) |
|
|
正切值 | tan(x) |
|
|
指數 | ex |
|
|
次方 | ab |
|
|
自然對數 | lnx |
|
|
以10為底的對數 | log10x |
|
|
絕對值 | |x| |
|
|
向下取整 | × |
|
|
向上取整 | × |
|
|
總結
為了請求用戶輸入數據,我們使用如下格式:cin >> variable,之后用戶輸入的數據就儲存在variable變量中。
不要搞混了標準輸入和標準輸出運算符的方向:cin >> 是標準輸入,cout <<是標準輸出。
在C++中,我們可以做很多基本的運算:加,減,乘,除,等等。例如:result = a +b
const變量是一旦定義就不能修改其值的變量(記得,不是常量)。我們用關鍵字const來聲明。
為了一個變量能夠進行加一運算,我們可以用自增運算符++,variable++。還有一個自減運算符--,variable--,進行減一運算。
如果你要進行更復雜的數學運算,例如計算平方根,那么需要引入C++的標準數學庫,就是cmath。使用方法: #include <cmath> 之后你就可以用標準數學庫中的各種函數了,例如計算平方根:result = sqrt(100);
今天的課就到這里,一起加油吧!
下一課我們學習:控制流程,隨心所至
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。