#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. Либо добавьте новое вычисляемое поле в структуру, чтобы взвешенная оценка была доступна без дальнейших вычислений, либо попросите функцию сравнения вызывать функцию вычисления оценки дважды при каждом ее вызове. Один метод занимает немного больше памяти; другой занимает намного больше циклов процессора.