第一次做业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数组发生了越界的问题。
因为在课堂上尚未学习这一块的内容,以上的分析都是由我结合网上搜索到的内容以及向一些去年学习过的同窗请教得出的,可能存在不少的问题,有不对的地方但愿老师和同窗可以告诉我,谢谢!