Отображение трехмерного массива структур - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь создать план расписания школьных занятий, используя массив трехмерных структур.

struct SPS
{
string Class;
string Teacher;
int noStudents;
};

struct SPS array[3][4][5];

Концептуальный вид:

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

Я хочу иметь возможность ввода в массив в определенном месте, например на [1][2][2].

Это текущий код, который у меня есть, но он делает как положено.

cout << "Class:" << endl;
cin >> array[1][2][2].Class;
cout << "Teacher:" << endl;
cin >> array[1][2][2].Teacher;
cout << "Number of students:" << endl;
cin >> array[1][2][2].noStudents;

Я пытаюсь напечатать массив, и он не показывает это в выводе:

for (int a = 0; a<3; a++)
{
    for (int b = 0; b<4; b++)
    {
        for (int c= 0; c<5; c++)
        {
            printf("%d\t", array[a][b][c]);
        }
        cout << "\n";
    }
    cout << "\n";
}

Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Вместо использования printf("%d\t", array[a][b][c]) вы должны просто использовать cout, для этого вам нужно получить Class, Teacher и noStudents для каждой позиции в вашем массиве. Так должно быть что-то вроде

 cout << array[i][j][k].Class << ' '
      << array[i][j][k].Teacher << ' '
      << array[i][j][k].noStudents << '\n';
0 голосов
/ 29 апреля 2018

Я не вижу значения с этой структурой

struct SPS
{
  std::string Class;
  std::string Teacher;
  int         noStudents;
};

struct SPS array[3][4][5];

Он отключен, пассивен и не предоставляет полезного кода, который помог бы вам в остальной части ваших усилий по программированию.

C ++ легко приспосабливается, позволяя каждому экземпляру выполнять уникальные функции. В частности, вы должны рассмотреть возможность реализации шоу (и заполнения) в классе. Эти функции позволяют каждому экземпляру с пользой работать с приложением ... то есть "show ()", "dump ()", "saveToFile ()", "restoreFromFile ()" и т. Д.

#include <iostream>
#include <sstream>
#include <string>


struct SPS
{
private:                  // for encapsulation
   std::string Class;
   std::string Teacher;
   int         noStudents;

public:
   // class instance 'show's itself
   std::string show()
      {
         std::stringstream ss;
         ss << Class << ' ' << Teacher << "     " << noStudents;
         return ss.str();
      }    

   // for this MCVE, a simple replacement for file i/o
   void fill(int a, int b, int c)
      {
         std::string s =
            std::to_string(a)
            + '.' + std::to_string(b)
            + '.' + std::to_string(c);
         Class      = "\n  Class " + s;
         Teacher    = "  Teacher " + s;
         noStudents = c;
      }
    // add saveToFile(), restoreFromFile(), dump()
};

struct SPS array[3][4][5];

Примечание - ни однополевые get'ы, ни set'ers никогда не нужны ... это пустая трата времени программиста.

чтобы закончить этот MCVE, я предоставляю:

class T601_t  // a simple test 
{
public:

   T601_t() = default;
   ~T601_t() = default;

   int exec(int , char**  )
      {
         fill3dArray();

         show3dArray();

         return 0;
      }

private: // methods

   // specific to this MCVE, a quick and dirty fill
   void fill3dArray()
      {
         for (int a = 0; a<3; a++)
         {
            for (int b = 0; b<4; b++)
            {
               for (int c = 0; c < 5; c++)
               {
                  array[a][b][c].fill(a, b, c);
                  // record -----^^^^ self filling
               }
            }
         }
      }
      // your code would enter the a, b, and c from user prompts? 
      // or perhaps a file read?

   // specific to this MCVE, invoke the show method of 
   //                        each element of the array
   void show3dArray()
      {
         for (int a = 0; a<3; a++)
         {
            for (int b = 0; b<4; b++)
            {
               for (int c= 0; c<5; c++)
               {
                  std::cout << array[a][b][c].show() << '\n';
                  // record ------------------^^^^ self showing
                  // it is trivial for this cout to prefix the show
                  // with a triple for readability or diagnostics
               }
               std::cout << "\n";
            }
            std::cout << "\n";
         }
      }

}; // class T601_t


int main(int argc, char* argv[])
{
   T601_t  t601;
   return  t601.exec(argc, argv);
}
0 голосов
/ 29 апреля 2018

Вы не можете просто вывести такую ​​структуру целиком. printf() не волшебство. Как компилятор должен знать, какой формат использовать?

Просто используйте cout и << для вывода каждого из членов структуры:

for (int a = 0; a<3; a++)
{
    for (int b = 0; b<4; b++)
    {
        for (int c= 0; c<5; c++)
        {
            cout << array[a][b][c].Class << ' '
                 << array[a][b][c].Teacher << ' '
                 << array[a][b][c].noStudents << '\n';
        }
        cout << "\n";
    }
    cout << "\n";
}
...