我正在写一个基本的国际象棋程序来计算你可以用给定的国际象棋数量制作多少套。数据文件:
4
22 3 5 6 2 0
1 1 1 1 1 1
8 4 4 4 1 2
5 3 3 3 0 2
代码:
#include <iostream>
#include <fstream>
#include <vector>
int main
(int argc, char *argv[])
{
std::fstream data_file;
size_t i, k;
std::vector<long> chess;
long t, n;
data_file.open("U1.txt", std::ios::in);
data_file >> n;
for (i = 0; i < n; i++)
chess.push_back(0);
for (i = 0; i < n; i++) {
for (k = 0; k < 6; k++) {
data_file >> t;
std::cout << t << " ";
chess[k] += t;
}
std::cout << std::endl;
}
data_file.close();
for (int i = 0; i < 6; i++)
std::cout << chess[i] << " ";
std::cout << std::endl;
data_file.open("U1rez.txt", std::ios::out);
data_file << n;
std::cout << n << std::endl;
data_file.close();
return EXIT_SUCCESS;
}
输出:
22 3 5 6 2 0
1 1 1 1 1 1
8 4 4 4 1 2
5 3 3 3 0 2
36 11 13 14 3 4
4
为什么我在第5行36,11,13和14之后的最终结果中得到 3 和 4 ?当我打印测试值时,我似乎得到了正确的数字,但是在向量容器中添加它们时出现了严重错误。
答案 0 :(得分:5)
for (i = 0; i < n; i++)
chess.push_back(0);
。 。
for (i = 0; i < n; i++) {
for (k = 0; k < 6; k++) {
data_file >> t;
std::cout << t << " ";
chess[k] += t;
}
std::cout << std::endl;
}
这里,你在向量中初始化了n(= 4)个位置,但是在这里你正在访问导致加法问题的向量象棋的索引4和5。
答案 1 :(得分:1)
在一个不相关的说明中,如果你放弃C强加的一些规则,你将更容易使用C ++。
std::cout << "\n"
到std::cout << std::endl
,除非您确实打算插入换行符并刷新缓冲区。许多C ++程序员仍然使用printf
,我个人认为它比C ++丑陋的IO标准解决方案更优雅 - 随意使用printf
。for (size_type i = 0; ... ; ...)
)而不是在方法的开头声明变量时,您是否发现代码更易于管理和阅读?这也允许编译器可以更好地选择寄存器使用,因为它有更多关于临时变量范围的信息。以下是C ++ 11的一些功能,可以为您节省一些时间:
auto
(例如auto x = parse_data();
)。begin()
和end()
的容器(例如任何标准容器)上操作,那么请改为:
typedef typename container_type::const_iterator iter;
for (iter i = begin(container), iter l = end(container); i != l; ++i) { ... }
你可以这样做:
for (const auto& x : container) { ... }
我只是想给你几个快速指针,可以节省你一些时间。