合計 昨日 今日

順位付け/同率順位について

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: as
[URL]
Date: 2017年1月11日(水) 18:35
No: 1
(OFFLINE)

 順位付け/同率順位について

英語・数学・社会の点数とそれぞれの氏名が入力されたファイルを使い、個人の合計・平均・標準偏差を算出し、合計点が高い順にランンキングをつける という問題なのですが、順位付けのところのプログラムがわかりません。(同率順位を含みます)

結果例
grade name  Eng Mat Sci Total   Mean   Hensa
1     A  90  85 78 253  84.33     66
2     B  80  75 60 215  71.67    55
2     C  90  85 40 215  71.67    55
・・・
あと、結果の点数・値が何を表しているか、の部分もできてないです。。(grade 、name…の所です)

下のコードは順番・計算結果などは正しく出せました。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
 
#define MAX 20
#define LEN 15
 
typedef struct seiseki{
    char name[LEN];
    int eng;
    int math;
    int sci;
    int total;
    double mean;
    double hensa;
}SEISEKI;
 
int main(int, char **);
int input(FILE *, SEISEKI *);
void output(FILE *, SEISEKI *, int number, double mean, double deviation);
int compare(const SEISEKI *, const SEISEKI *);
double mean_of_total(SEISEKI * student,int number);
double hensa(SEISEKI * student, int number, double mean);
 
int main(int argc, char **argv)
{
    FILE *infile, *outfile;
    SEISEKI student[MAX];
    int number;
    double mean_total = 0.0;
    double deviation = 0.0;
 
    if(argc != 3){
        fprintf(stderr, "Example: qtotla motofile.dat insatsu.dat\n");
        exit(1);
    }
    if((infile = fopen(argv[1], "rt")) == NULL){
        fprintf(stderr, "Can not open file: %s\n", argv[1]);
        exit(1);
    }
    if((outfile = fopen(argv[2], "wt")) == NULL){
        fprintf(stderr, "Can not open file: %s\n", argv[2]);
        exit(1);
    }
    number = input(infile, student);
    mean_total = mean_of_total(student, number);
    deviation = hensa(student, number, mean_total);
 
    qsort(student, number, sizeof(SEISEKI), (int (*)(const void *, const void *))compare);
 
    output(outfile, student, number, mean_total, deviation);
 
    fclose(infile); fclose(outfile);
    return 0;
}
 
int input(FILE *infile, SEISEKI * student)
{
    char n[LEN];
    int e,m,s,i = 0;
 
    while(fscanf(infile, "%s %d %d %d", n, &e, &m, &s) != EOF){
        strcpy(student[i].name,n);
        student[i].eng = e; student[i].math = m; student[i].sci = s;
        student[i].total = e + m+ s;
        student[i].mean = student[i].total/3.0;
        i++;
    }
    return i;
}
 
void output(FILE *outfile, SEISEKI *student, int number, double mean, double deviation)
{
    int i;
 
    for(i = 0; i < number; i++){
        SEISEKI *tmp = &student[i];
        fprintf(outfile, "%-14s %3d %3d %3d %3d %6.2f %2.0f\n",
        tmp->name, tmp->eng, tmp->math, tmp->sci, tmp->total, tmp->mean, tmp->hensa);
    }
    fprintf(outfile, "\nMean of Total = %3.2f  Standard Deviation of Total = %2.2f\n",
            mean, deviation);
    return;
}
 
int compare(const SEISEKI *p, const SEISEKI *q)
{
    return -(p->total - q->total);
}
 
double mean_of_total(SEISEKI * student,int number)
{
    int i = 0;
    double total = 0.0;
    double mean_total = 0.0;
    while(i < number)
    {
        total += student[i].total;
        i++;
    }
 
    mean_total = total/number;
    return mean_total;
}
 
double hensa(SEISEKI * student, int number, double mean)
{
    int i = 0;
    double standard_deviation = 0.0;
    double total = 0.0;
 
    while(i < number)
    {
        total += ((student[i].total - mean)*(student[i].total - mean));
        i++;
    }
    total = total / number;
    standard_deviation = sqrt(total);
    i = 0;
 
    while(i < number)
    {
        student[i].hensa = (50 + (10*(student[i].total - mean)/standard_deviation));
        i++;
    }
 
    return standard_deviation;
}

Name: Math
[URL]
Date: 2017年1月13日(金) 22:55
No: 2
(OFFLINE)

 Re: 順位付け/同率順位について

motofile.dat
コード[]: 全て選択

insatsu.dat
コード[]: 全て選択

としてコマンドライン・コンパイルが終わると自動実行させるバッチを作って
c.bat
コード[C++]: 全て選択
1
2
3
4
rem コンパイル後リンク
cl /TC c1.txt
rem 実行結果
c1.exe motofile.dat insatsu.dat

実行結果
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
D:\h\z10\01\13\c\2>c
 
D:\h\z10\01\13\c\2>rem コンパイル後リンク
 
D:\h\z10\01\13\c\2>cl /TC c1.txt
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.
 
c1.txt
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.
 
/out:c1.exe
c1.obj
 
D:\h\z10\01\13\c\2>rem 実行結果
 
D:\h\z10\01\13\c\2>c1.exe motofile.dat insatsu.dat
 
D:\h\z10\01\13\c\2>

なのでmotofile.datと”順番・計算結果などは正しく出せました”というinsatsu.datを提示してくださいませんか。
なので


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[8人]