第一次做業ios
第一題:數組
1.驗證X的平方是否大於等於零
首先在VS上建立好C++工程,編寫代碼以下:
學習
#include "stdafx.h" #include "iostream" #include "float.h" using namespace std; const short SMAX = 32767, SMIN = -32768, SNOR = 100, SMAX_RES = SMAX*SMAX,SMIN_RES = SMIN*SMIN,SNOR_RES=SNOR*SNOR; const float FMAX = FLT_MAX, FMIN = FLT_MIN, FNOR = 100,FMAX_RES=FMAX*FMAX,FMIN_RES=FMIN*FMIN,FNOR_RES=FNOR*FNOR; int _tmain(int argc, _TCHAR* argv[]) { cout << "SHORT型:" << endl; if (SMAX_RES < 0){ cout << SMAX << " 的平方小於零!" << endl; } else if (SMAX_RES == 0){ cout << SMAX << " 的平方等於零!" << endl; } else{ cout << SMAX << " 的平方大於零!" << endl; } if (SMIN_RES < 0){ cout << SMIN << " 的平方小於零!" << endl; } else if (SMIN_RES == 0){ cout << SMIN << " 的平方等於零!" << endl; } else{ cout << SMIN << " 的平方大於零!" << endl; } if (SNOR_RES < 0){ cout << SNOR << " 的平方小於零!" << endl; } else if (SNOR_RES == 0){ cout << SNOR << " 的平方等於零!" << endl; } else{ cout << SNOR << " 的平方大於零!" << endl; } cout << "FLOAT型:" << endl; if (FMAX_RES < 0){ cout << FMAX << " 的平方小於零!" << endl; } else if (FMAX_RES == 0){ cout << FMIN << " 的平方等於零!" << endl; } else{ cout << FMAX << " 的平方大於零!" << endl; } if (FMIN_RES < 0){ cout << FMIN << " 的平方小於零!" << endl; } else if (FMIN_RES == 0){ cout << FMIN << " 的平方等於零!" << endl; } else{ cout << FMIN << " 的平方大於零!" << endl; } if (FNOR_RES < 0){ cout << FNOR << " 的平方小於零!" << endl; } else if (FNOR_RES == 0){ cout << FNOR << " 的平方等於零!" << endl; } else{ cout << FNOR << " 的平方大於零!" << endl; } return 0; }
輸出結果以下:測試
同時爲了更清楚地觀察數據,我在VS中設置了監控,結果以下:
spa
結果分析:
從程序結果和監控結果中,咱們不難看出,short型變量和float型變量的最小值的平方結果都變爲了0,我認爲這是由於在計算的過程當中,數據發生了溢出,而在存儲時,仍會截取知足數據類型要求的後幾位來存儲,因此顯示出來的結果就會是0,與咱們正常計算的結果存在差別。3d
2.驗證(X+Y)+Z 是否等於X+(Y+Z)
首先編寫代碼以下:code
#include "stdafx.h" #include "iostream" #include "float.h" using namespace std; const short S1 = 32767, S2 = -32768, S3 = 100; const float F1 = 0.319, F2 = 1.000000001, F3 = 3.14; int _tmain(int argc, _TCHAR* argv[]) { if (((S1 + S2) + S3) == (S1 + (S2 + S3))){ cout << "SHORT:equal!" << endl; } else{ cout << "SHORT:not equal!" << endl; } if (((F1 + F2) + F3) == (F1 + (F2 + F3))){ cout << "FLOAT:equal!" << endl; } else{ cout << "FLOAT:not equal!" << endl; } return 0; }
獲得運行結果:blog
分析:
從結果中咱們能夠看出SHORT型的結果是相同的,而FLOAT型的結果則不一樣。我認爲這是因爲計算機在進行計算時在處理完第一步後,有可能將獲得的結果先進行一下處理,如根據兩個加數保留必定的有效數字,所以因爲運算順序的不一樣,每次的加數可能不一樣,進而致使了最終浮點數的有效數字保留的不一樣,而產生了上面的結果。
內存
實驗二:io
首先我在VS中編寫了一次代碼:
#include "stdafx.h" #include "iostream" using namespace std; double fun(int i); int _tmain(int argc, _TCHAR* argv[]) { double result; result = fun(0); cout << "Input:0, 結果:" << result << endl; result = fun(1); cout << "Input:1, 結果:" << result << endl; result = fun(2); cout << "Input:2, 結果:" << result << endl; result = fun(3); cout << "Input:3, 結果:" << result << endl; result = fun(4); cout << "Input:4, 結果:" << result << endl; return 0; } double fun(int i){ volatile double d[1] = { 3.14 }; volatile int a[2]; a[i] = 1073741824; return d[0]; }
運行後發生錯誤:
點擊繼續後結果以下:
看到結果相同,我想到了VS帶有越界警告的功能,因而我又在CodeBlocks上再一次實驗了一次:
#include <iostream> #include<cstdio> using namespace std; double fun(int i); int main() { double result; result = fun(0); cout << "Input:0, 結果:" << result << endl; result = fun(1); cout << "Input:1, 結果:" << result << endl; result = fun(2); cout << "Input:2, 結果:" << result << endl; result = fun(3); cout << "Input:3, 結果:" << result << endl; result = fun(4); cout << "Input:4, 結果:" << result << endl; return 0; } double fun(int i){ volatile double d[1] = { 3.14 }; volatile int a[2]; a[i] = 1073741824; return d[0]; }
這一次運行後依舊獲得了警告:
以後的運行結果爲:
分析:
對於這一部分的內容,我也並非很瞭解,因此請教宿舍中去年學習過計組課程的同窗,通過同窗們的講解我有了以下的認識:
首先是d和a在內存中的存儲方式,他們應當是存儲在堆中,而堆是由上向下進行內容的寫入,大體能夠畫出以下的示意圖:
這樣根據codeblocks中的運行結果,咱們能夠看出,前三次的結果都是正確的,實際上,咱們能夠很簡單的知道,前兩次的結果必定是正確的,由於他修改的是a[0]與a[1]的值。而第三次實際上也是有一些問題的,它實際上已經進入了d[0]的內存範圍,只不過由於double類型的數據後面有大量的小數位,此次修改只是修改了小數位的一些數值,而在輸出時由於未顯示那麼多位小數,因此咱們看到的是好像結果沒有被影響。而第四次則是已經修改到了double類型的整數位,因此咱們看到告終果的變化。至於最後一次測試,修改已經到了系統的內存中,由於會影響系統內存,因此codeblocks並無讓這一步執行,因此咱們能夠看到結果中並無fun(4)的結果,而在VS中,由於存在越界控制的功能,因此並無受影響,可是咱們也看到了它所提示的「Stack around the variable ‘a’ was corrupted.」即提示a數組發生了越界的問題。
因爲在課堂上尚未學習這一塊的內容,以上的分析都是由我結合網上搜索到的內容以及向一些去年學習過的同窗請教得出的,可能存在不少的問題,有不對的地方但願老師和同窗可以告訴我,謝謝!