C++插值计算水位练习(visual studio 2022)

使用函数完成以下功能,并得到一个完整的可以运行的程序:
1)定义两个数组,用来表示下列关系表:
水位 库容
112 5656
115 5954
113 5703
110 5500
111 5642
114 5841
2)将两个数组分别按从小到大排序
3)输入任意一个水位,计算对应库容
4)输入任意库容,计算水位
(注:使用插值法计算,比如水位输入112.6,首先查询到112和113米水位
对应的库容5656和5703,然后计算比例=112.6-112=0.6,最后结果就是0.6 * (5703-5656) + 5656)

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 7;  // 数组的大小

// 水位数组
int water_level[N] = {112, 115, 113, 110, 111, 114};

// 库容数组
int storage[N] = {5656, 5954, 5703, 5500, 5642, 5841};

// 计算输入的任意水位对应的库容
int calc_storage(int level) {
  // 在水位数组中查找第一个大于等于输入水位的数的位置
  int pos = lower_bound(water_level, water_level + N, level) - water_level;
  if (pos == 0) {
    // 输入的水位小于最小的水位,返回最小水位对应的库容
    return storage[0];
  } else if (pos == N) {
    // 输入的水位大于最大的水位,返回最大水位对应的库容
    return storage[N - 1];
  } else {
    // 输入的水位在水位数组中间,使用插值法计算
int low = water_level[pos - 1]; // 输入水位的前一个水位
int high = water_level[pos]; // 输入水位的后一个水位
int low_storage = storage[pos - 1]; // 前一个水位对应的库容
int high_storage = storage[pos]; // 后一个水位对应的库容
// 计算比例
double ratio = (level - low) * 1.0 / (high - low);
// 计算结果
return low_storage + ratio * (high_storage - low_storage);
}
}

// 计算输入的任意库容对应的水位
int calc_level(int stor) {
// 在库容数组中查找第一个大于等于输入库容的数的位置
int pos = lower_bound(storage, storage + N, stor) - storage;
if (pos == 0) {
// 输入的库容小于最小的库容,返回最小库容对应的水位
return water_level[0];
} else if (pos == N) {
// 输入的库容大于最大的库容,返回最大库容对应的水位
return water_level[N - 1];
} else {
// 输入的库容在库容数组中间,使用插值法计算
int low = storage[pos - 1]; // 输入库容的前一个库容
int high = storage[pos]; // 输入库容的后一个库容
int low_level = water_level[pos - 1]; // 前一个库容对应的水位
int high_level = water_level[pos]; // 后一个库容对应的水位
// 计算比例
double ratio = (stor - low) * 1.0 / (high - low);
// 计算结果
return low_level + ratio * (high_level - low_level);
}
}

int main() {
// 将水位数组和库容数组按照从小到大排序
sort(water_level, water_level + N);
sort(storage, storage + N);

// 输入水位,计算对应库容
int level;
cout << "Enter a water level: ";
cin >> level;
int stor = calc_storage(level);
cout << "The corresponding storage is: " << stor << endl;

// 输入库容,计算对应水位
cout << "Enter a storage: ";
cin >> stor;
level = calc_level(stor);
cout << "The corresponding water level is: " << level << endl;

return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct aaa{
    double sw, kr; //水位、库容
}a[10005];
bool cmp(aaa a1, aaa a2){
    return a1.sw < a2.sw;
}
int main(){
    //输入 
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i){
        cin >> a[i].sw >> a[i].kr;
    }
    //排序 
    sort(a, a + n, cmp);
    
    //输入任意一个水位,计算对应库容
    double m;
    cin >> m;
    int tmp1, tmp2;
    for (int i = n - 1; i >= 0; --i){
        if (m > a[i].sw){
            tmp2 = i + 1;
            break;
        }
    }
    for (int i = 0; i < n; ++i){
        if (m < a[i].sw){
            tmp1 = i - 1;
            break;
        }
    }
    cout << ((m - a[tmp1].sw) * (a[tmp2].kr - a[tmp1].kr) + a[tmp1].kr) << endl;
    
    //输入任意库容,计算水位
    cin >> m;
    for (int i = n - 1; i >= 0; --i){
        if (m > a[i].kr){
            tmp2 = i + 1;
            break;
        }
    }
    for (int i = 0; i < n; ++i){
        if (m < a[i].kr){
            tmp1 = i - 1;
            break;
        }
    }
    cout << ((m - a[tmp1].kr) * (a[tmp2].sw - a[tmp1].sw) + a[tmp1].sw) << endl;
    return 0;
}

回答:这类似画出了折线图,然后在图中去找那个点即可,程序不难实现,就是采用C++,就需要找找资料了,不是很熟悉
通过观察可以发现,这个水位越高,库容越高,就可以简单采取数组存储即可,不用采用集合存储了

/*
回答:这类似画出了折线图,然后在图中去找那个点即可,程序不难实现,就是采用C++,就需要找找资料了,不是很熟悉
通过观察可以发现,这个水位越高,库容越高,就可以简单采取数组存储即可,不用采用集合存储了
*/

# include <iostream>
# include <algorithm>
using namespace std;

int main()
{
    int num = 10;
    cin >> num;

    int* waterLevel = new int[num];
    int* capacity = new int[num];

    for (int i = 0; i < num; i++)
    {
        cin >> waterLevel[i] >> capacity[i];
    }

    sort(waterLevel, waterLevel + num);
    sort(capacity, capacity + num);

    cout << endl << endl;
    for (int i = 0; i < num; i++)
    {
        cout << waterLevel[i] << " " << capacity[i] << endl;
    }

    cout << "输入库容(1)或水位(2):";
    int chioce;
    cin >> chioce;

    if (chioce == 1)
    {
        double level;
        cout << "请输入水位:";
        cin >> level;
        int i;
        for (i = 0; i < num; i++)
        {
            if (level <= waterLevel[i])
            {
                break;
            }
        }
        if (i != 0)
        {
            cout << i << endl;
            double forcastLevel = (level - waterLevel[i - 1]) / (waterLevel[i] - waterLevel[i - 1]) * (capacity[i] - capacity[i - 1]) + capacity[i - 1];
            cout << "预测的水位为:" << forcastLevel << endl;
        }
        else
        {
            cout << "无法预测" << endl;
        }
    }
    else if (chioce == 2)
    {
        double capacityInput;
        cout << "请输入库容:";
        cin >> capacityInput;
        int i;
        for (i = 0; i < num; i++)
        {
            if (capacityInput <= capacity[i])
            {
                break;
            }
        }
        if (i != 0)
        {
            cout << i << endl;
            double forcastCapacity = (capacityInput - capacity[i - 1]) / (capacity[i] - capacity[i - 1]) * (waterLevel[i] - waterLevel[i - 1]) + waterLevel[i - 1];
            cout << "预测的库容为:" << forcastCapacity << endl;
        }
        else
        {
            cout << "无法预测" << endl;
        }
    }
}

/*
6
112 5656
115 5954
113 5703
110 5500
111 5642
114 5841

1
112.6
*/