//为了方便,要包含的文件会不同,但我没有删 #include <iostream> #include <string> #include <vector> #include <bitset> #include <cstring> //和C语言的string.h其实是一个版本 #include <stdexcept> //或用 #include <exception> 都行 using std::bitset; using std::vector; using std::cin; using std::endl; using std::cout; using std::string; using std::overflow_error; //#define NDEBUG //--------------------------------------------------------------------------- //getTotal为第一种求和方法:用指针 int getTotal(const int* beg,const int* end) { int t=0; while(beg!=end) { t+=*beg; ++beg; } return t; } //getTotal2第二种求和方法:用指针和大小 int getTotal2(const int arr[],size_t size) { int k=0; for(size_t s=0;s!=size;++s) { k+=arr[s]; } return k; } /* //getTotal3第三种求和方法:错误 int getTotal3(const int arr[]) //由于数组不能复制,所以不能编写使用数组形参的函数 { int k=0; size_t size=sizeof(arr)/sizeof(*arr); //由于在这种方法里,第一个arr只是一个指针,而非数组,所以sizeof求出的是指针的大小,结果是无法求出和的 for(size_t s=0;s!=size;++s) { k+=arr[s]; } return k; } */ //getTotal3的第三种求和法:正确:用指针和数字 //但这种方法有个缺点,前面如果有重复的数就完了,但实际上程序仍正常在运作,不知为什么 int getTotal3(const int arr[],int i) { int k=0; for(size_t s=0;i!=arr[s];++s) { cout<<arr[s]<<"/t"<<s<<"/t"<<i<<endl; k+=arr[s]; } return k; } int main() { //建立vector cout<<"请输入多个小数用于建立vector:"<<endl; vector<double> dvec; double d; while(cin>>d) dvec.push_back (d); // //求数组之和 int k=getTotal(dvec.begin (),dvec.end ()); cout<<"它们的和是:"<<k<<endl; return 0; } /* 210页习题7.13编写三种求和函数,以不同方法处理数组边界,求数组元数之和 此题的第三种求和法因由其注意 int getTotal3(const int arr[],int i) { int k=0; for(size_t s=0;i!=arr[s];++s) { cout<<arr[s]<<"/t"<<s<<"/t"<<i<<endl; k+=arr[s]; } return k; } 使用时 int k3=getTotal3(arr,arr[n]);这样求和就行了 本以为以上方法运行不好,但实际上非常好,因为这里面arr[n]相当于是arr这个数组的最后一个数的下一个,这时是一个负数如-858993460,那么在函数运行中, 运行到最后时arr[s]也会刚好指向这个位置,这时两个值一样,循环退出,相当于就是在数组最后设了空字符。 */