// Stage 02: functions name a step; references explicitly permit a change.
#include <array>
#include <iostream>
int calibrated(int reading,int offset) {
    return reading+offset; // The caller's reading is not modified.
}
void add_reading(int& total,int reading) {
    total+=reading; // This name refers to the caller's accumulator.
}
int main() {
    const std::array<int,5> readings{3,1,4,1,5};
    int raw=0,adjusted=0;
    for(const int reading:readings) {
        add_reading(raw,reading);
        add_reading(adjusted,calibrated(reading,2));
    }
    int original=3;
    const int copy=calibrated(original,2);
    int zero=0;add_reading(zero,0);
    if(raw!=14 || adjusted!=24 || original!=3 || copy!=5 || zero!=0) return 1;
    std::cout<<"raw="<<raw<<" calibrated="<<adjusted<<'\n';
    std::cout<<"original="<<original<<" returned="<<copy<<'\n';
}
