有没有一种方法可以让这个循环,这样我就不用写10遍了?
基本上,我正在为DVD类创建实例,每个实例都有不同的成员值。如果我能使我的文件更具可读性就太好了。我已经走到这里了。
for (int i=n; i<= 10; i++) {
for (int j=0; j<=9; j++) {
if (n == i) {
dvd[j].print();
}
}
}
但这显然是错误的,我知道为什么。我只是不知道这是否可能。
DVD dvd[10];
dvd[0].id = d[2];
dvd[0].name = d[3];
dvd[0].genre = d[4];
dvd[0].cast = d[5];
dvd[0].desc = d[6];
dvd[0].dateRent = d[7];
dvd[0].dateRet = d[8];
dvd[0].cost = d[9];
dvd[1].id = d[12];
dvd[1].name = d[13];
dvd[1].genre = d[14];
dvd[1].cast = d[15];
dvd[1].desc = d[16];
dvd[1].dateRent = d[17];
dvd[1].dateRet = d[18];
dvd[1].cost = d[19];
dvd[2].id = d[22];
dvd[2].name = d[23];
dvd[2].genre = d[24];
dvd[2].cast = d[25];
dvd[2].desc = d[26];
dvd[2].dateRent = d[27];
dvd[2].dateRet = d[28];
dvd[2].cost = d[29];
dvd[3].id = d[32];
dvd[3].name = d[33];
dvd[3].genre = d[34];
dvd[3].cast = d[35];
dvd[3].desc = d[36];
dvd[3].dateRent = d[37];
dvd[3].dateRet = d[38];
dvd[3].cost = d[39];
dvd[4].id = d[42];
dvd[4].name = d[43];
dvd[4].genre = d[44];
dvd[4].cast = d[45];
dvd[4].desc = d[46];
dvd[4].dateRent = d[47];
dvd[4].dateRet = d[48];
dvd[4].cost = d[49];
dvd[5].name = d[53];
dvd[5].id = d[52];
dvd[5].genre = d[54];
dvd[5].cast = d[55];
dvd[5].desc = d[56];
dvd[5].dateRent = d[57];
dvd[5].dateRet = d[58];
dvd[5].cost = d[59];
dvd[8].id = d[62];
dvd[8].name = d[63];
dvd[8].genre = d[64];
dvd[8].cast = d[65];
dvd[8].desc = d[66];
dvd[8].dateRent = d[67];
dvd[8].dateRet = d[68];
dvd[8].cost = d[69];
dvd[7].id = d[72];
dvd[7].name = d[73];
dvd[7].genre = d[74];
dvd[7].cast = d[75];
dvd[7].desc = d[76];
dvd[7].dateRent = d[77];
dvd[7].dateRet = d[78];
dvd[7].cost = d[79];
dvd[8].id = d[82];
dvd[8].name = d[83];
dvd[8].genre = d[84];
dvd[8].cast = d[85];
dvd[8].desc = d[86];
dvd[8].dateRent = d[87];
dvd[8].dateRet = d[88];
dvd[8].cost = d[89];
dvd[9].id = d[92];
dvd[9].name = d[93];
dvd[9].genre = d[94];
dvd[9].cast = d[95];
dvd[9].desc = d[96];
dvd[9].dateRent = d[97];
dvd[9].dateRet = d[98];
dvd[9].cost = d[99];
和
if (n == 1) {
dvd[0].print();
}
if (n == 2) {
dvd[1].print();
}
if (n == 3) {
dvd[2].print();
}
if (n == 4) {
dvd[3].print();
}
if (n == 5) {
dvd[4].print();
}
if (n == 6) {
dvd[5].print();
}
if (n == 7) {
dvd[6].print();
}
if (n == 8) {
dvd[7].print();
}
if (n == 9) {
dvd[8].print();
}
if (n == 10) {
dvd[9].print();
}
eglease的评论是正确的:您将注意到您想要打印的索引比您的n
(无论它来自哪里)小1,因此您可以简单地使用n-1
作为打印的索引。我认为,这就是您试图通过嵌套循环和if-chain实现的目标,但是您想得太复杂了:不需要循环!当您编写if-chain时,您可以发现n
和数组索引之间的连接:索引总是比n
小一个。你可以简单地写;-)。
void print dvd_number_n(int n) { dvd[n-1].print(); }
如果你想遍历你所有的dvd,你可以从0循环到n-1,这在C或c++中很常见,因为它有从零开始的数组,也就是说,第一个元素在索引0处。
这是一个从0开始的for
循环的习惯编码方式,并测试循环变量是否真的小于元素数。
对于包含3张dvd的数组,数组元素为dvd[0], dvd[1]和dvd[2]。Dvd[3]是越界的,因为数组中只有3个元素,而不是4个。这种边界违反是C或c++中最常见的错误之一,因为它们不检查数组索引(通常根本无法检查,因为在使用时数组大小是未知的)。包含3张dvd的数组的打印循环为
for( int i=0; i<3; i++) { dvd[i].print(); }
索引i
- 以0开头,执行循环(1)
- 递增到1,小于3,执行循环(2)
- 增加到2,小于3,执行循环(3)
- 递增到3,等于3,循环条件为假,左循环。
这给了我们3个循环执行,索引分别为0、1、2。
还有很多改进的空间:给你的类一个构造函数,并使用向量,而不是数组。下面的例子可能会给你一些启发。
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
/// A simple data holder for DVD information with a constructor.
class DVD_T
{
std::string mTitle;
unsigned int mCost; // in cent
public:
DVD_T(std::string title, unsigned int cost): mTitle(title), mCost(cost) {}
void print(std::ostream &os)
{
os << "Title: "" << mTitle
<< "", cost: $" << mCost/100 << "." << std::setw(2) << std::setfill('0') << mCost%100;
}
};
std::vector<DVD_T> &initDVDs()
{
// This initialization of a static local variable will be run only once.
static std::vector<DVD_T> DVDs
{
// You'll probably want to obtain data from your data array d.
{"Title 1", 109},
{"Title 2", 99}
};
return DVDs;
}
int main()
{
// Get reference to initialized vector of DVDs
std::vector<DVD_T> &DVDs = initDVDs();
// Print them all. "Look mama, no index!"
for(auto dvd: DVDs)
{
dvd.print(std::cout);
std::cout << 'n';
}
}
输出:
Title: "Title 1", cost: $1.09
Title: "Title 2", cost: $0.99