Had some fun with iterators. I think the sub-sum part came out very neat. Disregarding the ugly conditional inclusions...
Code:
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
#if __cplusplus < 199711L
#error "It looks like you're using an antiquated compiler. Would you like help?"
#endif
bool cmp(const std::pair<int, int> &p1, const std::pair<int, int> &p2)
{
return (p1.second < p2.second);
}
int main()
{
std::ifstream file;
file.open("numbers.txt");
if (!file) {
std::cerr << "!> could not open input file" << std::endl;
return 1;
}
std::vector<int> numbers;
int a;
while (file >> a)
numbers.push_back(a);
int block_size;
std::cout << "Enter block size: ";
std::cin >> block_size;
if (block_size <= 0 || block_size > numbers.size())
block_size = numbers.size();
#if __cplusplus >= 201103L
std::vector<std::pair<int, int>> block_sums;
auto iter = numbers.begin();
#elif __cplusplus >= 199711L
std::vector<std::pair<int, int> > block_sums;
std::vector<int>::iterator iter = numbers.begin();
#endif
int block_sum;
while (numbers.end() - iter >= block_size) {
block_sum = 0;
for (int i = 0; i < block_size; ++i) {
block_sum += *(iter + i);
}
#if __cplusplus >= 201103L
auto pair = std::make_pair(iter - numbers.begin(), block_sum);
#elif __cplusplus >= 199711L
std::pair<int, int> pair;
pair = std::make_pair(iter - numbers.begin(), block_sum);
#endif
block_sums.push_back(pair);
iter++;
}
#if __cplusplus >= 201103L
for (const auto &pair : block_sums)
std::cout << "(" << pair.first << "; "
<< pair.second << ")"
<< std::endl;
#elif __cplusplus >= 199711L
std::vector<std::pair<int, int> >::iterator sums_iter;
for (sums_iter = block_sums.begin();
sums_iter != block_sums.end(); sums_iter++) {
std::cout << "(" << sums_iter->first << "; "
<< sums_iter->second << ")"
<< std::endl;
}
#endif
#if __cplusplus >= 201103L
auto max_at = std::max_element(block_sums.begin(), block_sums.end(), cmp);
#elif __cplusplus >= 199711L
std::vector<std::pair<int, int> >::iterator max_at;
max_at = std::max_element(block_sums.begin(), block_sums.end(), cmp);
#endif
std::cout << "Greatest sum: "
<< max_at->second
<< " @ "
<< max_at->first
<< std::endl;
}