Один из способов сделать это - использовать так называемую статическую переменную-член . Обычно каждый объект получает свою собственную копию переменных-членов. В вашем коде у каждого учащегося будет своя собственная копия name[25]
, student_id
и т. Д. Но то, что вы хотите, - это то, что будет совместно использоваться каждым экземпляром класса (каждый из элементов в classroom students[3]
является экземпляром classroom
класса.)
Вот некоторые заметки о статических переменных-членах . Обратите внимание, что они представляют решение очень похожей проблемы - они присваивают уникальные идентификаторы каждому экземпляру класса. Единственная разница между тем, что они представляют здесь, и тем, что вы просите, заключается в том, что вы просите, чтобы это было случайным, а не последовательным.
Таким образом, вместо статической переменной-члена, отслеживающей один номер (последний назначенный), вы захотите, чтобы ваша статическая переменная-член отслеживала всех ранее назначенных идентификаторов . Должен работать std.vector или простой массив int.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
using namespace std;
class classroom{
char name[25];
int student_id;
float grades[10];
float average;
int num_tests;
float letter_grade;
static vector<int> used;
public:
void enter_name_id(void);
void enter_grade(void);
void average_grades(void);
void letter_grades(void);
void output_name_id_grade(void);
classroom();
};
vector<int> classroom::used = vector<int>();
classroom::classroom(){
int i;
int random_integer=0;
bool rand_ok;
do
{
// Generate Random Integer
random_integer = (rand()%5) + (rand()%5);
//cout << "Generated: " << random_integer << endl;
rand_ok = true;
for(i=0; i<used.size(); i++)
{
if(used[i] == random_integer){ rand_ok = false; break; }
}
} while (rand_ok == false);
// If we get here, random_integer is not in the used vector
// therefore accept and store as student_id
student_id = random_integer;
// ... and update used vector
used.push_back(student_id);
num_tests=0;
average=0.0;
for(i=0;i<10;i++){
grades[i]=0.0;
}
for(i=0;i<27;i++){
name[i]='-';
}
cout<<"*****************Finished*****************\n";
}
int main()
{
// You should only seed the RNG once
srand((unsigned)time(0));
classroom students[3];
}
Приведенный выше код является одним из способов сделать это, сохранив использованные идентификаторы учащихся в векторе, а затем каждый раз, когда вы создаете нового студента, убедитесь, что случайно сгенерированный идентификатор не соответствует уже назначенному идентификатору. *
Еще одно замечание: вы должны заполнять генератор случайных чисел только один раз (особенно, если ваше время - время). Поскольку вы засевали его 3 раза за такое короткое время, производимые случайные числа были одинаковыми.