ポインタと構造体の利用について
samplefile.txtの中身
c03888 工大八郎 90
a03111 工大一郎 100
a03222 工大二郎 30
b03666 工大六郎 70
b03555 工大五郎 60
a03333 工大三郎 80
c03777 工大七郎 40
c03999 工大九郎 20
b03444 工大四郎 50
このデータをfscanfで取り込んで構造体に代入
typedef struct {
char code[7];
char name[21];
int score;
}REC;
そしてこのデータを昇順にソートして結果を出力したいのですが
問題はここから
work52.cというファイルとbubble.cというファイルとmy_sort.hというファイルがあり、work52.cからmy_sortという関数(バブルソート)を使いたい。
work52.cの中身
#include <stdio.h>
#include "my_sort.h"
#define MAX_NUM 500
int main(int argc, char *argv[]){
FILE *fp;
REC rec[MAX_NUM];
int i, sum , min, max , n;
if (argc != 2) {
printf("ファイル名を指定してください\n");
return(-1);
}
if ((fp = fopen(argv[1], "r")) == NULL) {
printf("ファイルを開けませんでした\n");
return(-1);
}
i = 0;
while (fscanf(fp, "%s %s %d", rec[i].code, rec[i].name,
&rec[i].score) != EOF){
i++;
}
fclose(fp);
n = i;
/* 初期値の設定 */
min = rec[0].score;
max = rec[0].score;
sum = rec[0].score;
for (i = 1; i < n; i++){
sum += rec[i].score;
if (rec[i].score < min) { min = rec[i].score; }
if (rec[i].score > max) { max = rec[i].score; }
}
my_sort(rec, n);
printf("最高点:%3d\n", max);
printf("最低点:%3d\n", min);
printf("平均点:%5.1f\n", (double) sum / n);
for (i = 0; i < n; i++){
printf("%3d\t%s\t%s\n", rec[i].score, rec[i].code, rec[i].name);
}
return(0);
}
my_sort.hの中身
typedef struct {
char code[7];
char name[21];
int score;
}REC;
void my_sort(REC *rec,int n);
バブルソートで整列
#include <stdio.h>
#include "my_sort.h"
#define MAX 50
void my_sort(REC *rec, int n){
for(i = 0;i < n - 1; i++){
for(j = n - 1;j > i;j--){
/*この中身が問題----1*/
}
}
}
1の部分でchar codeとchar nameとint scoreの値を交換するときにどうすればいけるでしょうか?ご教授ください。
お礼
Tacosanさん、いつも的確な答えをありがとうございます。前回と同様、きっと答えていただける、とすごく期待しておりました(~~; さて、今回の件、前回より何度考えてもわからなくて、でも漠然とはそうかな、とつかめかけてたのですが、確証がほしくて投稿しました。しかしながら、頭で理解しても感覚としてはまだつかみきれていない状態で、まだまだ壁は厚いです。 なぜ○○しないのかなぁ、という点ですが、私にもいまいちつかめないですが、この後もデータが追加されるのは間違いありません。 push(@{$KU_REC->{BU}}, {}); $BU_REC = $KU_REC->{BU}->[$#{$KU_REC->{BU}}]; を行い、 $BU_REC->{BU_CODE} = $REC{BU_CODE}; $BU_REC->{BU_NAME} = $REC{BU_NAME}; とし、 foreach $BU_RECt (@{$KU_REC->{BU}}) { if ($BU_RECt->{BU_CODE} eq $REC{BU_CODE}) { $BU_REC = $BU_RECt; $flg_find_bu = 0; last; } } として、部コードに関しても同じように行っています。 ここまでくるともはや@BCOLにはどんなデータがどのように並んでいるのかわかりません(*_*)でもそれを解析しなくてはならないのです。 ここでまたまた質問です。@BCOLは配列ですよね? いま$BCOL[0]に{KU_CODE => $REC{KU_CODE}が入っているかと思うのですが、配列内に入っているハッシュのキーと値をログで出力する方法はあるのでしょうか? お礼なのに、質問しちゃってすみません・・・。こういう場合また新しくとぴをたてるほうがいいのかなぁ・・・。 よろしくお願いします。