#c #arrays #object #arraylist #data-structures
#c #массивы #объект #arraylist #структуры данных
Вопрос:
Например, у меня есть объект с именем Patient . У меня будет неизвестное количество пациентов в день, и мне придется хранить записи этих пациентов в течение недели.
- У меня будет массив объектов для хранения «пациента» через день
- Еженедельный массив размером 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.