要求自定数据(10人参加10个题目的考试),C语言实现按照S-P表的原理进行排序,分别计算出此次测试的差异系数、每个人的注意系数和每个问题的注意系数。
时间: 2023-12-10 21:37:55 浏览: 113
以下是一个简单的C语言程序,用于按照S-P表的原理对考试得分进行排序,并计算差异系数、注意系数等指标。
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NUM_PEOPLE 10
#define NUM_QUESTIONS 10
int scores[NUM_PEOPLE][NUM_QUESTIONS] = {
{7, 8, 4, 6, 9, 7, 5, 8, 6, 5},
{5, 6, 7, 6, 7, 4, 6, 8, 4, 5},
{6, 7, 8, 5, 5, 6, 7, 6, 7, 7},
{8, 9, 6, 7, 8, 7, 5, 8, 5, 6},
{7, 6, 5, 4, 6, 7, 8, 6, 7, 8},
{6, 5, 6, 7, 8, 6, 4, 7, 6, 7},
{4, 5, 7, 6, 7, 8, 6, 7, 8, 5},
{8, 9, 7, 6, 7, 5, 6, 7, 8, 6},
{5, 6, 7, 8, 7, 6, 5, 4, 7, 6},
{6, 7, 5, 6, 5, 7, 8, 6, 7, 8},
};
int ranks[NUM_PEOPLE][NUM_QUESTIONS];
double sp_table[NUM_QUESTIONS][NUM_QUESTIONS];
double sp_sum[NUM_PEOPLE];
double sp_avg[NUM_PEOPLE];
double sp_stddev[NUM_PEOPLE];
double attention_people[NUM_PEOPLE];
double attention_questions[NUM_QUESTIONS];
void calc_sp_table() {
for (int i = 0; i < NUM_QUESTIONS; i++) {
for (int j = 0; j < NUM_QUESTIONS; j++) {
double sum = 0.0;
for (int k = 0; k < NUM_PEOPLE; k++) {
int rank1 = ranks[k][i];
int rank2 = ranks[k][j];
double diff = fabs(rank1 - rank2);
sum += diff;
}
sp_table[i][j] = sum / NUM_PEOPLE;
}
}
}
void calc_ranks() {
for (int i = 0; i < NUM_PEOPLE; i++) {
for (int j = 0; j < NUM_QUESTIONS; j++) {
int rank = 1;
for (int k = 0; k < NUM_QUESTIONS; k++) {
if (scores[i][k] > scores[i][j]) rank++;
}
ranks[i][j] = rank;
}
}
}
void calc_sp_sum() {
for (int i = 0; i < NUM_PEOPLE; i++) {
double sum = 0.0;
for (int j = 0; j < NUM_QUESTIONS; j++) {
sum += sp_table[j][j] - sp_table[j][ranks[i][j]-1];
}
sp_sum[i] = sum;
}
}
void calc_sp_avg() {
double sum = 0.0;
for (int i = 0; i < NUM_PEOPLE; i++) {
sum += sp_sum[i];
}
double avg = sum / NUM_PEOPLE;
for (int i = 0; i < NUM_PEOPLE; i++) {
sp_avg[i] = sp_sum[i] - avg;
}
}
void calc_sp_stddev() {
double sum = 0.0;
for (int i = 0; i < NUM_PEOPLE; i++) {
sum += pow(sp_avg[i], 2);
}
double stddev = sqrt(sum / NUM_PEOPLE);
for (int i = 0; i < NUM_PEOPLE; i++) {
sp_stddev[i] = sp_avg[i] / stddev;
}
}
void calc_attention_people() {
for (int i = 0; i < NUM_PEOPLE; i++) {
double sum = 0.0;
for (int j = 0; j < NUM_QUESTIONS; j++) {
sum += sp_table[j][j] - sp_table[j][ranks[i][j]-1];
}
attention_people[i] = sum / NUM_QUESTIONS;
}
}
void calc_attention_questions() {
for (int i = 0; i < NUM_QUESTIONS; i++) {
double sum = 0.0;
for (int j = 0; j < NUM_PEOPLE; j++) {
sum += sp_table[i][i] - sp_table[i][ranks[j][i]-1];
}
attention_questions[i] = sum / NUM_PEOPLE;
}
}
void print_results() {
printf("Rankings:\n");
for (int i = 0; i < NUM_PEOPLE; i++) {
printf("Person %d: [", i+1);
for (int j = 0; j < NUM_QUESTIONS; j++) {
printf("%d", ranks[i][j]);
if (j < NUM_QUESTIONS-1) printf(", ");
}
printf("]\n");
}
printf("\n");
printf("S-P table:\n");
for (int i = 0; i < NUM_QUESTIONS; i++) {
for (int j = 0; j < NUM_QUESTIONS; j++) {
printf("%.2f ", sp_table[i][j]);
}
printf("\n");
}
printf("\n");
printf("SP sum:\n");
for (int i = 0; i < NUM_PEOPLE; i++) {
printf("%.2f\n", sp_sum[i]);
}
printf("\n");
printf("SP average:\n");
for (int i = 0; i < NUM_PEOPLE; i++) {
printf("%.2f\n", sp_avg[i]);
}
printf("\n");
printf("SP standard deviation:\n");
for (int i = 0; i < NUM_PEOPLE; i++) {
printf("%.2f\n", sp_stddev[i]);
}
printf("\n");
printf("Attention coefficients for people:\n");
for (int i = 0; i < NUM_PEOPLE; i++) {
printf("%.2f\n", attention_people[i]);
}
printf("\n");
printf("Attention coefficients for questions:\n");
for (int i = 0; i < NUM_QUESTIONS; i++) {
printf("%.2f\n", attention_questions[i]);
}
printf("\n");
}
int main() {
calc_ranks();
calc_sp_table();
calc_sp_sum();
calc_sp_avg();
calc_sp_stddev();
calc_attention_people();
calc_attention_questions();
print_results();
return 0;
}
```
程序中,我们先定义了一个10人参加10个题目的考试的得分矩阵,然后根据每个人对每个问题的得分计算排名矩阵。根据排名矩阵,我们可以计算出S-P表,并根据S-P表计算出每个人的SP总和、SP平均值和SP标准差。然后,我们根据SP表计算出每个人的注意系数和每个问题的注意系数,并将结果输出到控制台。
运行程序后,将输出排名矩阵、S-P表、SP总和、SP平均值、SP标准差、每个人的注意系数和每个问题的注意系数。