Как найти общие оценки, а затем отсортировать с помощью qsort ()

#c

#c

Вопрос:

В C я создаю систему оценок, и я застрял на том, как получить взвешенную оценку домашней работы и тестов отдельно, а затем добавить их к общей оценке. Существует 10 hw и 5 тестов, каждый из которых составляет 5% от общей оценки, а каждый тест составляет 10% от общей оценки, что составляет 100% всего. В моем коде я случайным образом генерирую каждый тест и оценку hw. теперь я хочу сложить оценки hw и test отдельно, найти взвешенную оценку для обеих категорий, затем добавить их, чтобы показать общую взвешенную оценку. Я застрял на получении сумм для каждого теста и где поместить это в мой код.

вот мой код.

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ID_LEN 10
#define NAME_LEN 21
#define HW_SCORES 10
#define TEST_SCORES 5

typedef struct {
    char id[ID_LEN];
    char fname[NAME_LEN];
    char lname[NAME_LEN];
    char mi;
    unsigned char hw_scores[HW_SCORES];
    unsigned char test_scores[TEST_SCORES];
//modify struct stu_rect_type
} stu_rec_type;

int idcmp(const void *a, const void *b) {

    stu_rec_type *pa = (stu_rec_type *) a;
    stu_rec_type *pb = (stu_rec_type *) b;
    return -(strcmp(pa->id, pb->id));
}
int lnamecmp(const void *a, const void *b) {

    stu_rec_type *pa = (stu_rec_type *) a;
    stu_rec_type *pb = (stu_rec_type *) b;
    return -(strcmp(pa->lname, pb->lname));
}
int scorecmp(const void *a, const void *b) {

    stu_rec_type *pa = (stu_rec_type *) a;
    stu_rec_type *pb = (stu_rec_type *) b;
    int total_a = 0, total_b = 0;
    int i;
    for (i=0; i < HW_SCORES; i  ) {
            total_a  = 0.1*pa->hw_scores[i];
            total_b  = 0*1*pb->hw_scores[i];
    }
    for (i=0; i < TEST_SCORES; i  ) {
            total_a  = 0.05*pa->test_scores[i];
            total_b  = 0.05*pb->test_scores[i];
    }
    if (total_a == total_b)
            return strcmp(pa->lname, pb->lname);
        //Sorting in descending order
        else  if(total_a > total_b)
            return -1;
        else
            return 1;
}

void print_rec(stu_rec_type *rec_ptr) {
        int j;
        printf("ID: %sn", rec_ptr->id);
    printf("NAME: %s %c. %sn", rec_ptr->fname, rec_ptr->mi, rec_ptr->lname );
    printf("HW SCORES:n");
    for (j=0; j <HW_SCORES; j  ){
        printf("M", rec_ptr->hw_scores[j]);
        if ( (j 1)%10 ==0)
                printf("n");
    }
    printf("TEST SCORES:n");
    for (j=0; j <TEST_SCORES; j  ){
        printf("M", rec_ptr->test_scores[j]);
        if ( (j 1)%10 ==0)
                printf("n");
    }
}

int main(){
    //prompt user to input number of students
    int CLASS_SIZE;
    printf("Enter the number of students : ");
    scanf("%d",amp;CLASS_SIZE);
    stu_rec_type *cs3500_class;
    //malloc to allocate momeory of student records
    // Dynamically allocating memory for an array of student records.
    cs3500_class=(stu_rec_type *)malloc(sizeof(stu_rec_type)*CLASS_SIZE);
    int i, j, k;
    char *ptr;
    stu_rec_type *stu_ptr;
    int n = 700000000;
    char id[10];
    srand(time(NULL));
    for(i = 0; i < CLASS_SIZE; i  ) {
    // generate ids
    //ptr = (char *) amp;(cs3500_class[i].id);
    // sprintf(ptr, "%i",   n);
      sprintf((char *)amp;(cs3500_class[i].id), "%i",   n);
    // generate the first names
        cs3500_class[i].fname[0] = 'A'   rand()%26;
    k = rand()%(NAME_LEN-1);
    for (j=0; j < k; j  )
        cs3500_class[i].fname[j 1] = 'a'   rand()%26;
        cs3500_class[i].fname[k 1] = '';
    // generate the last names
        cs3500_class[i].lname[0] = 'A'   rand()%26;
    k = rand()%(NAME_LEN-1);
    for (j=0; j < k; j  )
        cs3500_class[i].lname[j 1] = 'a'   rand()%26;
        cs3500_class[i].lname[k 1] = '';
    // generate mi
        cs3500_class[i].mi = 'A'   rand()%26;
    // generate hw scores between 10-20 max being 20
    for (j=0; j<HW_SCORES; j  )
        cs3500_class[i].hw_scores[j] = (rand() % 10)   11;
    // generate test scores between 50-100 max being 100
    for (j=0; j<TEST_SCORES; j  )
        cs3500_class[i].test_scores[j] = 51   (rand()%50);
    }
    // displaying the first 5 records
    for (i = 0; i < CLASS_SIZE; i  ) {
            print_rec(amp;cs3500_class[i]);
    printf("nn ");
    }
    // sort the records based on the 1st score
    //using qsort() in descending order
    printf("nnAfter qsortn");
    qsort(cs3500_class, CLASS_SIZE, sizeof(stu_rec_type), scorecmp);
    // display the first 5 records
    for (i = 0; i < CLASS_SIZE; i  ) {
        print_rec(amp;cs3500_class[i]);
    printf("nn");
    }
    return 0;
  

Вот результат на данный момент

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

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

1. total_b = 0*1*pb->hw_scores[i]; — никогда не будет иметь большого значения. Просто говорю. И, к вашему сведению, вам также не хватает #include <string.h> , где найти strcmp и друзей.

2. Либо добавьте новое вычисляемое поле в структуру, чтобы взвешенная оценка была доступна без дальнейших вычислений, либо попросите функцию сравнения вызывать функцию вычисления оценки дважды при каждом ее вызове. Один метод занимает немного больше памяти; другой занимает намного больше циклов процессора.