2015-01-18 3 views
0
struct student { 

    char   *s_name; 

    struct student_id s_id; 

    /** Number of references to this student. */ 
    unsigned int   s_ref; 

    /** Transcript (singly-linked list, NULL terminator). */ 
    struct transcript_entry *s_transcript; 

    /** Whether or not this student has completed his/her program. */ 
    student_complete  s_complete; 
}; 

struct student* student_grad_create(const char *name, size_t namelen, 
    struct student_id, int phd); 

struct student* student_undergrad_create(const char *name, size_t namelen, 
    struct student_id); 

Есть три вида студента, магистранта и аспирант и старшекурсник студента .I необходимо реализовать функцию, которая называется:же функция, но другой мимолетный аргумент функции

int student_add_entry(struct student *, struct transcript_entry *); 

Я не знаете, как я могу определить тип студента?

Должен ли я сделать следующее?

int student_add_entry(struct student *undergrad_create, struct transcript_entry *){} 
int student_add_entry(struct student *grad_create, struct transcript_entry *){} 

спасибо.

+0

Это очень смешная идея ... Что бы вы достигли с этим? –

+4

Вы уверены, что хотите 'C'? В любом случае, как насчет «перечисления», указывающего тип студента? –

+0

C не имеет функции перегрузки. –

ответ

2

Вы можете добавить student_type поле в структуры

struct student { 
    char     *s_name; 
    struct student_id  s_id; 
    /** Number of references to this student. */ 
    unsigned int    s_ref; 
    /** Transcript (singly-linked list, NULL terminator). */ 
    struct transcript_entry *s_transcript; 
    /** Whether or not this student has completed his/her program. */ 
    student_complete   s_complete; 
    enum student_type  s_type; 
}; 

и вы бы иметь enum как

enum student_type 
{ 
    UndergraduateStudent, 
    MasterStudent, 
    PHDStudent 
}; 

при создании экземпляра struct student вы бы установить s_type поле, а затем использовать s_type всюду, чтобы определить тип учащегося.

Я бы также написал общую функцию, чтобы создать экземпляр struct student, чтобы передать все возможные параметры, и если вы хотите для удобства, вы также можете создать функцию для каждого конкретного типа, где вы можете передавать параметры по умолчанию для общего типа функция.

+0

Спасибо iharob. Я добавил объект enum student_type для студента структуры. Я только начинаю изучать C. Я работаю над некоторыми проблемами в системе регистрации учащихся. – Peter

+0

У меня есть еще несколько вопросов ниже, не могли бы вы помочь мне взглянуть? – Peter

+0

@Peter Вы не можете оставлять вопросы в качестве ответа на другой пост, вам нужно опубликовать новый вопрос. Пожалуйста, удалите ответ и опубликуйте его как вопрос. –

0

Я работаю над проблемой системы регистрации учащихся. 1. Существуют три различных вида типов студенческих 2. старшекурсник студент сдать экзамен с 50, а мастер и доктор философии проходят с 65 3. Студенты должны заполнить 40 курсов, Meng студентов 5 и аспирантов 2.

Это три функции, которые мне нужно реализовать. ' Ниже этого является структура для transcript_entry:

struct transcript_entry { 
    enum faculty   te_faculty; 
    unsigned int   te_number; 
    unsigned int   te_grade; 
    /** Number of references to this entry. */ 
    unsigned int   te_ref; 
    /** Next entry in the singly-linked list (or NULL terminator). */ 
    struct transcript_entry *te_next; 
}; 

Я реализовать следующие функции:

struct transcript_entry* transcript_entry(enum faculty faculty, unsigned int course_number, unsigned int grade){ 
    struct transcript_entry *trans_entry; 
    trans_entry = malloc(sizeof(struct transcript_entry)); 
    trans_entry->te_faculty = faculty; 
    trans_entry->te_number = course_number; 
    trans_entry->te_grade = grade; 
    trans_entry->te_ref = 1; 
    trans_entry->te_next = NULL; 
    return trans_entry; 
} 

/** Deallocate a @ref transcript_entry. */ 
void transcript_entry_free(struct transcript_entry *trans_entry){ 
    free(trans_entry); 
} 

/** Increment a @ref transcript_entry's refcount. */ 
void tehold(struct transcript_entry *trans_entry){ 
    trans_entry-> te_ref++; 
} 

Я смотрел некоторые учебники о подсчете ссылок. Я не знаю, что мой код имеет смысл или нет. Таким образом, это среднее приращение счетчика ссылок ++ или декремент te_ref--;

Смежные вопросы