题目:
第一次作业题
答案:
#include <iostream>
#include <vector>
using namespace std;
// 定义自己的log
template<class T>
void _print(T arg) {
cout << arg << " ";
}
template<class... Args>
void log(Args... args) {
int arr[] = { (_print(args), 0)... };
cout << endl;
}
// 求和例子
float sum(vector<float> &array) {
// 先设置一个变量 s 用来存数组的和
float s = 0;
// .size() 函数的返回值是 size_t
// 所以这里的变量 i 也是 size_t(你可以当作 int)
size_t i = 0;
// array.size() 求得 vector 的大小
while (i < array.size()) {
float n = array[i];
s = s + n;
i = i + 1;
}
return s;
}
// 测试用
void ensure(bool condition, const string &message) {
if (condition) {
log("测试成功");
} else {
log(message);
}
}
bool floatEqual(float a, float b) {
// 这里的 delta 变量的类型我们用了 auto
// 这是一个 C++ 11 的新特性
// 它的作用是根据变量的值自动推导变量的类型
// delta 的值是 0.00001 所以它会是 float 类型
// 仅作介绍
auto delta = 0.00001;
// 如《〖快编程〗的免费编程入门课》 所述
// 计算机对浮点数的比较要用这样的方式
return a - b < delta && b - a < delta;
}
/*
* 答案从此处开始,每一个函数都有测试
*/
// 作业1
float product(vector<float> &array) {
// 先设置一个变量 s 用来存数组的和
float s = 1;
// .size() 函数的返回值是 size_t
// 所以这里的变量 i 也是 size_t(你可以当作 int)
size_t i = 0;
// array.size() 求得 vector 的大小
while (i < array.size()) {
float n = array[i];
s = s * n;
i = i + 1;
}
return s;
}
void testProduct(void) {
vector<float> v1 = {1, 2, 3, 4};
float s1 = product(v1);
// 判断浮点数相等,建议使用 floatEqual 函数
ensure(floatEqual(s1, 24), "product test error 1");
//
vector<float> v2 = {-1, 2, 3, 4, 5, 6};
float s2 = product(v2);
ensure(floatEqual(s2, -720), "product test error 2");
}
// 作业2
float abs1(float n) {
if (n < 0) {
return -n;
}
else{
return n;
}
}
void testAbs1(void) {
float a = 3;
ensure(floatEqual(abs1(a), 3), "abs1 test error 1");
float b = -3;
ensure(floatEqual(abs1(b), 3), "abs1 test error 2");
float c = 0;
ensure(floatEqual(abs(c), 0), "abs1 test error 3");
}
// 作业3
float average(vector<float> &array) {
float sumOfArray = sum(array);
size_t sizeOfArray = array.size();
return sumOfArray / sizeOfArray;
}
void testAverage(void) {
vector<float> a = {1, 2, 3, 4};
ensure(floatEqual(average(a), 2.5), "average test error 1");
vector<float> b = {-1, -2, -3, -4, 1, 2, 3, 4};
ensure(floatEqual(average(b), 0), "average test error 2");
}
// 作业4
float min1(vector<float> &array) {
float s = array[0];
size_t i = 1;
while (i < array.size()) {
if (array[i] < s) {
s = array[i];
}
i++;
}
return s;
}
void testMin1(void) {
vector<float> a = {1};
ensure(floatEqual(min1(a), 1), "min1 test error 1");
vector<float> b = {-1, -2, -3, -4, 1, 2, 3, 4};
ensure(floatEqual(min1(b), -4), "min1 test error 2");
}
// 作业5
int sum1(int n) {
int s = 0;
int i = 1;
while(i <= n) {
if (i % 2 == 1) {
s += i;
}
else{
s -= i;
}
i++;
}
return s;
}
void testSum1(void) {
ensure(sum1(1) == 1, "sum1 test error 1");
ensure(sum1(4) == -2, "sum1 test error 2");
ensure(sum1(6) == -3, "sum1 test error 3");
}
// 作业6
int sum2(int n) {
int s = -1 * sum1(n) + 2;
return s;
}
void testSum2(void) {
ensure(sum2(1) == 1, "sum2 test error 1");
ensure(sum2(2) == 3, "sum2 test error 2");
ensure(sum2(6) == 5, "sum2 test error 3");
}
// 作业7
int fac1(int n) {
if( n == 0 || n == 1) {
return 1;
}
return fac1(n-1) * n;
}
void testFac1(void) {
ensure(fac1(0) == 1, "fac1 test error 1");
ensure(fac1(1) == 1, "fac1 test error 2");
ensure(fac1(6) == 720, "fac1 test error 3");
}
// 测试汇总
void test(void) {
testProduct();
testAbs1();
testAverage();
testMin1();
testSum1();
testSum2();
testFac1();
}
int main(int argc, const char *argv[])
{
test();
return 0;
}
运行结果

运行结果.jpg
网友评论