Создание и добавление неограниченного количества объектов в массив на C

#c #arrays #object #arraylist #data-structures

#c #массивы #объект #arraylist #структуры данных

Вопрос:

Например, у меня есть объект с именем Patient . У меня будет неизвестное количество пациентов в день, и мне придется хранить записи этих пациентов в течение недели.

  1. У меня будет массив объектов для хранения «пациента» через день
  2. Еженедельный массив размером 7 для хранения записей за каждый день?

Я совершенно не понимаю, как поступить с этим. Как мне создать неограниченный объект (например, Patient patient1, patient2 …), Пока пользователь не захочет перейти на следующий день и сохранить их в массиве неограниченного размера?

 struct Patient {
  string name; 
  int age;
}

void main (){

/*Im not sure the type for this array and how to assign these patients into this array daily*/ 
?? weekArray [7];
bool continueAdd = true;

  for (int i =0; i<7; i  ){
    while (continueAdd){

      //Prompt creation of new object using Patient as object type
      Patient patient1....patientN //I want to only create new object after user wants to add another patient at the end of this loop

      cout<<"Enter name:";
      cin>> ??.name;
      cout<<"Enter age:";
      cin>> ??.age;

      cout<<"Continue adding patient? Y for yes, N to skip to next day";
      char decision;
      cin>>decision;
      if (decision == 'n'){
         continueAdd=false;
      } //assume i hv tolower.

      }
  }
}

  

Я надеюсь, что это не так запутанно в отношении того, что я спрашиваю. Я думаю, мне нужно будет использовать ArrayList вместо динамического массива. Я надеялся, что кто-нибудь сможет подсказать мне структуру того, как поступить с этим.

Или, если есть какой-либо способ решить эту проблему более эффективно, я очень ценю это.

Комментарии:

1. Вы должны использовать std::vector вместо массивов.

2. Назначение как условие decision = 'n' выглядит странно.

3. Уважаемый tear, вся тема контейнеров в C создана для решения подобных проблем! пожалуйста, взгляните на них и сэкономьте себе столько времени!

4. @MikeCAT за добавление неизвестного количества пациентов только за день? или для массива, в котором также хранятся данные за 7 дней.

5. «7 дней» исправлено, поэтому вы можете выбрать любой, который вам нравится.

Ответ №1:

Вы должны использовать std::vector , когда количество элементов для хранения неизвестно.

 #include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::cin;
using std::string;

struct Patient {
  string name; 
  int age;
};

int main (){
  std::vector<Patient> weekArray[7];

  for (int i =0; i<7; i  ){
    bool continueAdd = true;
    while (continueAdd){

      //Prompt creation of new object using Patient as object type
      Patient patient;

      cout<<"Enter name:";
      cin>> patient.name;
      cout<<"Enter age:";
      cin>> patient.age;

      //Add this object to the array
      weekArray[i].push_back(patient);

      cout<<"Continue adding patient? Y for yes, N to skip to next day";
      char decision;
      cin>>decision;
      if (decision == 'n'){
         continueAdd=false;
      } //assume i hv tolower.

      }
  }
}
  

Также обратите внимание, что:

  • Вам нужно ; после объявления структуры.
  • Глобальный main должен возвращаться int в C .
  • Вам нужно будет инициализировать continueAdd перед каждым циклом для каждого дня недели.
  • = является оператором присваивания. Вы должны использовать == для проверки равенства.

Эти примечания также применяются к приведенному выше коду.

Комментарии:

1. ах, спасибо!! Используя этот вектор, мне не нужно «создавать новый объект»? Как и в руководстве, мы обычно делаем это, Patient patient1, patient2 … и т. д;

2. @tear weekArray[i].push_back(patient); создает новый объект в конце массива, и данные в patient нем будут скопированы в новый объект.

3. ах, хорошо!! Я попробую ваше предложение, когда буду свободен. Tqsm !!

4. Извините, что снова беспокою вас, но как мне вызвать / сослаться на конкретного пациента? Например, я хочу отобразить имя третьего пациента на 2-й день

5. @tear Третий пациент на 2-й день weekArray[1][2] , так его зовут weekArray[1][2].name . Обратите внимание, что индекс массива начинается с 0.