これからは新しいのはたてずにこのスレですべて行っていきますので・・・
では本題に・・・;
成績データを読み込んでソートを行うプログラムを作成する。
1件の成績データは、累積GPA(Grade Point Average)、修得単位数、名前(氏のみ、英数字で199文字以内)、から構成されるものとする。入力ファイルには、まず、成績データの件数が記録されており、以降、成績データごとに、累積GPA、修得単位数、名前、の順で記録されているものとする。
成績データのどのフィールドでソートを行うかは、コマンドライン引数の第1引数で指定する。gpa なら累積GPA、credit なら修得単位数、name なら名前(辞書順)でソートする。第2引数には入力ファイル名、第3引数には出力ファイル名、をそれぞれ指定する。
なお、以下の条件を満たすこと。
a.成績データを記憶するための構造体を定義し、それを適当な名前で typedef せ よ(プログラム中では、以降、この typedef した名前を用いること)。ただし、累積GPAは float型、修得単位数は int型、名前は文字配列で記憶するものとする。
b.複数件の成績データを格納するために、malloc で構造体配列の領域を確保せよ。
c.ソートの処理を自作でコーディングするアプローチも考えられるが、配列の場合 には、ソートを行うための汎用の関数 qsort () がライブラリに用意されている。 そこで、今回はこの qsort() を用いてプログラムを作成せよ。
d.qsortの第4引数に引数として渡す情報としては
比較用関数へのポインタ
比較のための関数(大小の定義関数)を作成して、その関数へのポインタを渡す。
qsort() 内から、この比較用関数を呼び出す。
比較用関数の戻り値で、qsort() は大きいか小さいかを知る。
という条件です。自分が途中まで書いたコードをいかに・・・(qsortなどが調べても実用できず、関数へのポインタもよくわからないのでまだそこは適当にかいてるだけです・・・ int (*func)(int, int)こういうのをどこにどうかけばいいのかわからないです。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct school_record
{
float gpa;
int credit;
char name[200];
} SRec;
int compare_int(const void * a, const void * b) {
/* 引数はvoid*型と規定されているのでint型にcastする */
if (*(int *) a < *(int *) b)
return -1;
}
int compare_float(const void * a, const void * b)
/* 引数はvoid*型と規定されているのでint型にcastする */
{
if (*(int *) a < *(int *) b)
return -1;
}
int compare_char(const void * a, const void * b)
/* 引数はvoid*型と規定されているのでint型にcastする */
{
if (*(int *) a < *(int *) b)
return -1;
}
int main(int argc, char *argv[]) {
FILE *fpi, *fpo;
SRec *array;//構造体をようい
int i = 0, n = 0;
if (argc != 4)//コマンドライン数がたりてるか?
{
fprintf(stderr, "Illegal number of argument.\n");
return (-1);
}
if ((fpi = fopen(argv[2], "r")) == NULL) {
fprintf(stderr, "Can't open input file <%s>.\n", argv[2]);
return (-1);
}
fscanf(fpi, "%d", &n);
array = (SRec *) malloc(sizeof(int) * n);//並べ替えで使う SRec型
if ((array = (SRec *) malloc(sizeof(int) * n)) == NULL) {
printf("error");
return (-1);
}
while (!feof(fpi)) {
fscanf(fpi, "%f%d%s", &array[i].gpa, &array[i].credit, array[i].name);
i++;
}
/*void * data:ソート対象データ(配列の先頭)
size_t data_cnt:ソート対象データ件数
size_t data_size:ソート対象データ1件当りのサイズ
int func:int型の比較関数(プログラマが作成する関数)*/
if (strcmp(argv[1],"gpa")==0)
qsort(array, n, sizeof(array), compare_float);
if (strcmp(argv[1],"credit")==0)
qsort(array, n, sizeof(array), compare_int);
if (strcmp(argv[1],"name")==0)
qsort(array, n, sizeof(array), compare_char);
fclose(fpi);
if ((fpo = fopen(argv[3], "w")) == NULL) {
fprintf(stderr, "Can't open output file <%s>.\n", argv[3]);
return (-1);
}
fclose(fpo);
free(array);
return 0;
}
色いろ調べてるんですが、ここから全然すすみません。。。どなたか教えてください。
qsortで構造体のデータをわたしてますが、これだと構造体のgpa,credit,nameのどれを渡してるのかわかりませんよね?どうやってソートするんでしょう・・・