Кандидаты проходят испытание, включающее в себя два теста, которые оцениваются целым числом в диапазоне от 0 до 100 включительно. Считается, что испытание пройдено, если суммарный результат не менее заранее заданного числа.
//basic trials only
typedef struct TrialStruct {
char name[80];
int mark1;
int mark2;
} Trial;
#define PASS_MARK 120
Trial *addTrial(char *name, int mark1, int mark2) {
Trial *trial;
if((trial = (Trial*)malloc(sizeof(Trial))) == NULL) {
return NULL;
}
strcpy(trial->name, name);
trial->mark1 = mark1;
trial->mark2 = mark2;
return trial;
}
int result(Trial *trial) {
return trial->mark1 + trial->mark2;
}
int isPassed(Trial *trial) {
return result(trial) >= PASS_MARK;
}
char *toString(Trial *trial, char *str) {
if(trial == NULL) {
strcpy(str, "null");
} else {
sprintf(str, "%s;%d;%d;%d;",
trial->name, trial->mark1, trial->mark2);
strcat(str, isPassed(trial)? "true": "false");
}
return str;
}
//Runner0
void main(void) {
Trial *trial = addTrial("Sakovich", 45, 93);
char str[256];
if(trial != NULL) {
printf("Name:\t\t%s\n", trial->name);
printf("Mark 1:\t\t%d\n", trial->mark1);
printf("Mark 2:\t\t%d\n", trial->mark2);
printf("Result:\t\t%d\n", result(trial)); //no error! to regret...
printf("Is passed:\t%s\n", isPassed(trial)? "true": "false");
printf("To string:\t%s\n", toString(trial, str));
}
}
//Runner1
void main(void) {
Trial *trials[] = {
addTrial("Sakovich", 45, 93),
addTrial("Zhylinsky", 51, 35),
addTrial("", 0, 0)
};
char str[256];
for (int i=0; i < sizeof(trials)/sizeof(Trial*); i++) {
printf("%s\n", toString(trials[i], str));
}
}
//project evolution
//добавляется новый вид испытания – упрощенное
//необходимо найти такое решение, при котором Runner1 останется рабочим
//with lite trial 1 (new struct)
typedef enum {
BASIC, LITE
} TrialKind;
typedef struct TrialStruct {
char name[80];
int mark1;
int mark2;
TrialKind kind;
} Trial;
#define PASS_MARK 120
#define PASS_MARK1 35
#define PASS_MARK2 60
Trial *addTrial(char *name, int mark1, int mark2) {
Trial *trial;
if((trial = (Trial*)malloc(sizeof(Trial))) == NULL) {
return NULL;
}
strcpy(trial->name, name);
trial->mark1 = mark1;
trial->mark2 = mark2;
trial->kind = BASIC;
return trial;
}
Trial *addLiteTrial(char *name, int mark1, int mark2) {
Trial *trial;
if((trial = addTrial(name, mark1, mark2)) == NULL) {
return NULL;
}
trial->kind = LITE;
return trial;
}
int result(Trial *trial) {
return trial->mark1 + trial->mark2;
}
int isPassed(Trial *trial) {
int res;
switch(trial->kind) {
case BASIC: res = result(trial) >= PASS_MARK;
break;
case LITE: res = trial->mark1 >= PASS_MARK1 &&
trial->mark2 >= PASS_MARK2;
break;
}
return res;
}
char *toString(Trial *trial, char *str) {
if(trial == NULL) {
strcpy(str, "null");
} else {
sprintf(str, "%s;%d;%d;%d;",
trial->name, trial->mark1, trial->mark2);
strcat(str, isPassed(trial)? "true": "false");
}
return str;
}
//Runner2
void main(void) {
Trial *trials[] = {
addTrial("Sakovich", 45, 93),
addTrial("Zhylinsky", 51, 35),
addLiteTrial("Barkou", 29, 95),
addLiteTrial("Lis", 35, 68),
addTrial("Astapenka", 90, 57)
};
char str[256];
for (int i=0; i < sizeof(trials)/sizeof(Trial*); i++) {
printf("%s\n", toString(trials[i], str));
}
}
//Runner1 работает!
//недостаток – код существенно переписывается
//следствие - требует повторного тестирования
//with lite trial 2 (the same struct)
typedef struct {
char name[80];
int mark1;
int mark2;
} Trial;
#define PASS_MARK 120
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.