【问题标题】:complex looping question. Maybe impossible复杂的循环问题。也许不可能
【发布时间】:2021-12-11 12:00:56
【问题描述】:

有没有办法循环这个,所以我不必写出 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();
}

【问题讨论】:

  • 您使用的是哪种语言?
  • 对不起!使用 C++
  • 对于打印,为什么不能直接遍历 n 并打印dvd[n-1]?我错过了什么吗?

标签: c++ loops switch-statement


【解决方案1】:

eglease 的评论是正确的:您会注意到要打印的索引比您的 n 小一个(无论它来自哪里),因此您可以简单地使用 n-1 作为打印索引。也就是说,我认为,你试图用你的嵌套循环和你的 if 链来实现什么,但是你想得太复杂了:不需要循环!当您编写 if 链时,您可能已经发现了 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&lt;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

【讨论】:

    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2011-07-30
    • 2018-12-20
    • 2014-02-05
    • 2012-09-10
    相关资源
    最近更新 更多