teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コードを入れ替えしました

2016/01/09 00:59

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,92 +1,27 @@
1
- ###ラックナンバーリサーチ
2
- ラックナンバーリサーチで実行時間の短い順に並べかえるシステムで、すでにラックナンバーリサーチの日時、実行時間を格納、表示する 機能は完成しています。それらのデータは"LACKNUM.DAT"に格納されています。実行時間の短い順に並べ替えるため構造体
3
- struct time_bestenは定義すみです。
4
- 並び替えができていないみたいですが、
5
- どこが悪いのかよくわかりません。
6
- よろしくお願いします
7
-
8
-
9
- ###実行状況
10
- ....@naka ~/besten
11
- $ gcc -o best-fchart3 best-fchart3.c -lpdcursesw
12
-
13
- ....@naka ~/besten
14
- $ best-fchart3
15
- 初期状態
16
- 2015年 10月 27日 19時 9分 59秒
17
- 得点(所要時間)は11.0秒
18
-
19
- 2016年 1月 4日 19時 15分 11秒
20
- 得点(所要時間)は8.0秒
21
-
22
- 2016年 1月 4日 19時 16分 8秒
23
- 得点(所要時間)は9.0秒
24
-
25
- 2016年 1月 4日 19時 16分 39秒
26
- 得点(所要時間)は10.0秒
27
-
28
- 2016年 1月 4日 19時 19分 7秒
29
- 得点(所要時間)は10.0秒
30
-
31
- 2016年 1月 4日 19時 21分 11秒
32
- 得点(所要時間)は10.0秒
33
-
34
- 2016年 1月 4日 19時 21分 44秒
35
- 得点(所要時間)は8.0秒
36
-
37
-
38
- ベストテン時間)は8.0秒
39
-
40
-
41
- 2015年 10月 27日 19時 9分 59秒
42
- 得点(所要時間)は11.0秒
43
-
44
- 2016年 1月 4日 19時 15分 11秒
45
- 得点(所要時間)は8.0秒
46
-
47
- 2016年 1月 4日 19時 16分 8秒
48
- 得点(所要時間)は9.0秒
49
-
50
- 2016年 1月 4日 19時 16分 39秒
51
- 得点(所要時間)は10.0秒
52
-
53
- 2016年 1月 4日 19時 19分 7秒
54
- 得点(所要時間)は10.0秒
55
-
56
- 2016年 1月 4日 19時 21分 11秒
57
- 得点(所要時間)は10.0秒
58
-
59
- 2016年 1月 4日 19時 21分 44秒
60
- 得点(所要時間)は8.0秒
61
-
62
- ...@naka ~/besten
63
- $
64
-
65
-
66
- //並べ替えはquicksortを使う
67
- //並べ替え後の"LACKNUM.DAT"を表示する。
68
-
69
- */
70
-
71
-
72
- ###ソースコード
73
- ```
1
+ ```c
74
2
  //ラックナンバーサーチ・トレーニングでベストテンを選び出すフローチャート
3
+ 以下のように変更しましたが、うまくいきません。おしえてください。お願いします。
75
4
 
76
5
  // 1, ラックナンバーサーチ・トレーニングで実行した日付と実行時間が
77
- // char dtfile[] = "LACKNUM.DAT" (44バイト)に入っている
6
+ // char dtfile[] = "LACKNUM.DAT" に入っている
78
7
 
79
8
  // 2, 並べ替え前の"LACKNUM.DAT"を表示する。
80
9
 
81
10
  // 3, truct tm localとdouble bestの要素を持つ構造体を定義する。
82
11
 
12
+ // 4, LACKNUM.DATに保存されているデータを記録するのに
13
+ // 十分な数の配列dtfile2を確保。
14
+
15
+
16
+ // 5, その配列へget_data()関数にて読み込んで下さい。
17
+
18
+
83
- // 4, LACKNUM.DATに保存されているデータを並べ替えて表示する
19
+ // 6, LACKNUM.DATに保存されているデータを並べ替えて表示する
84
20
  // を確保して下さい。
85
21
 
86
- // 5, ソートはその次の段階となります。
87
- // "LACKNUM.DAT"を"best"の小さい順に並べ替える(そのまま表示する。)
22
+ // 7, "LACKNUM.DAT"を"best"の小さい順に並べ替え
88
23
 
89
- // 6, "LACKNUM.DAT"を表示する。
24
+ // 8, "LACKNUM2.DAT"を表示する。
90
25
 
91
26
 
92
27
  // ラックナンバーサーチ・トレーニング(1部です。必要ないところもあります)
@@ -103,29 +38,35 @@
103
38
  #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
104
39
  #define MAX_NUM 10
105
40
 
106
- char dtfile[] = "LACKNUM.DAT"; // ファイル名
41
+ char dtfile[100] = "LACKNUM.DAT"; // 元のファイル名
42
+ char dtfile2[100] = "LACKNUM2.DAT"; // 実行時間順に並べたファイル名
107
43
 
108
- typedef struct {
44
+ typedef struct {
109
45
  struct tm local;
110
46
  double best;
111
47
  }time_besten;
112
48
 
49
+ //ソートしたい配列の要素番号列を保存し,実際にソートされる配列
50
+ //動的に確保される
51
+
52
+ //"LACKNUM.DAT"を "LACKNUM2.DAT"にコピーする。bcopyでコピーする
113
- void printData(time_besten data[], int num, char *title)
53
+ // その配列へget_data()関数にて読み込んで下さい。
54
+
55
+
114
- {
56
+ double get_data1(void){
115
- int i;
57
+ int i;
116
58
  FILE *fp;
117
59
  double best;
60
+ char title[256];
118
61
  puts(title);
119
62
  //int puts(char * s);
120
63
  //puts 関数は標準出力に s が指す文字列を書き込みます.
121
64
  //(出力の最後に自動的に改行文字を追加します.)
122
- //文字列の終端ナル文字 ('\0') の書き込みは行いません.
65
+ //文字列の終端ナル
123
-
124
-
125
- if ((fp = fopen(dtfile, "rb")) == NULL) {
66
+ if ((fp = fopen(dtfile, "rb")) == NULL) {
126
67
  printf("ファイルを作成します。\n\n");
127
68
  best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
128
- } else {
69
+ }else {
129
70
  int i;
130
71
  struct tm local;
131
72
 
@@ -141,6 +82,38 @@
141
82
  printf("\n");
142
83
  }
143
84
 
85
+ double get_data2(void)
86
+ {
87
+ int i;
88
+ FILE *fp2;
89
+ double best2;
90
+ char title[256];
91
+ puts(title);
92
+ //int puts(char * s);
93
+ //puts 関数は標準出力に s が指す文字列を書き込みます.
94
+ //(出力の最後に自動的に改行文字を追加します.)
95
+ //文字列の終端ナル
96
+
97
+ if ((fp2 = fopen(dtfile2, "rb")) == NULL) {
98
+ printf("ファイルを作成します。\n\n");
99
+ best2 = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
100
+ } else {
101
+ int i;
102
+ struct tm local;
103
+
104
+ while((i = fread(&local, sizeof(struct tm), 1, fp2)) > 0 ){
105
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
106
+ local.tm_year + 1900, local.tm_mon + 1,
107
+ local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
108
+ fread(&best2, sizeof(double), 1, fp2);
109
+ printf("得点(所要時間)は%.1f秒\n\n", best2);
110
+ }
111
+ fclose(fp2);
112
+ }
113
+ printf("\n");
114
+
115
+ }
116
+
144
117
  int compfuncBest(const void *a, const void *b)
145
118
  {
146
119
  double comp;
@@ -157,17 +130,90 @@
157
130
  int i,num;
158
131
  FILE *fp; // *fpと *fp3はファイルポインタ
159
132
  double best;
133
+ time_besten besten;//time_besten besten;を配列として定義する。
160
- time_besten besten;
134
+ time_t t = time(NULL);
135
+ struct tm *local = localtime(&t);
136
+ int *index;
161
137
 
162
- int DataSize=sizeof(time_besten);
138
+ int DataSize=sizeof(int);
139
+ int NumberOfDatas=sizeof(dtfile2)/sizeof(time_besten);
140
+ printf("size of (int)= %d\n",sizeof(int));
141
+ printf("size of (double)= %d\n",sizeof(double));
142
+ printf("size of (time_besten)= %d\n",sizeof(time_besten));
143
+ printf("size of (struct tm)= %d\n",sizeof(struct tm));
144
+ printf("\n");
145
+
146
+ index=(int *)malloc(NumberOfDatas*sizeof(int));
147
+ for (i=0; i<NumberOfDatas; i++) index[i]=i;
163
148
 
149
+ get_data1();
150
+
164
- int NumberOfDatas=sizeof(besten)/DataSize;
151
+ qsort(index, NumberOfDatas, DataSize, compfuncBest);
152
+ get_data2();
165
153
 
166
- printData(&besten , NumberOfDatas, "初期状態");
154
+ free(index);
167
155
 
168
-
169
- qsort(&besten, NumberOfDatas, DataSize, compfuncBest);
170
- printData(&besten, NumberOfDatas, "ベストテン");
156
+ return 0;
157
+ }
171
158
 
159
+ /*
160
+ ....@naka ~/besten
161
+ $ gcc -o best-fchart7 best-fchart7.c -lpdcursesw
162
+
163
+ ....@naka ~/besten
164
+ $ best-fchart5
165
+ 初期状態
166
+ 2015年 10月 27日 19時 9分 59秒
167
+ 得点(所要時間)は11.0秒
168
+
169
+ 2016年 1月 4日 19時 15分 11秒
170
+ 得点(所要時間)は8.0秒
171
+
172
+ 2016年 1月 4日 19時 16分 8秒
173
+ 得点(所要時間)は9.0秒
174
+
175
+ 2016年 1月 4日 19時 16分 39秒
176
+ 得点(所要時間)は10.0秒
177
+
178
+ 2016年 1月 4日 19時 19分 7秒
179
+ 得点(所要時間)は10.0秒
180
+
181
+ 2016年 1月 4日 19時 21分 11秒
182
+ 得点(所要時間)は10.0秒
183
+
184
+ 2016年 1月 4日 19時 21分 44秒
185
+ 得点(所要時間)は8.0秒
186
+
187
+
188
+ ベストテン時間)は8.0秒
189
+
190
+
191
+ 2015年 10月 27日 19時 9分 59秒
192
+ 得点(所要時間)は11.0秒
193
+
194
+ 2016年 1月 4日 19時 15分 11秒
195
+ 得点(所要時間)は8.0秒
196
+
197
+ 2016年 1月 4日 19時 16分 8秒
198
+ 得点(所要時間)は9.0秒
199
+
200
+ 2016年 1月 4日 19時 16分 39秒
201
+ 得点(所要時間)は10.0秒
202
+
203
+ 2016年 1月 4日 19時 19分 7秒
204
+ 得点(所要時間)は10.0秒
205
+
206
+ 2016年 1月 4日 19時 21分 11秒
207
+ 得点(所要時間)は10.0秒
208
+
209
+ 2016年 1月 4日 19時 21分 44秒
210
+ 得点(所要時間)は8.0秒
211
+
212
+ ...@naka ~/besten
213
+ $
214
+
215
+
216
+ //並べ替えはquicksortを使う
217
+ //並べ替え後の"LACKNUM2.DAT"を表示する。
218
+
172
- return 0;
219
+ */
173
- }

2

プログラム全体をなおしました

2016/01/09 00:59

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- ラックナンバーリサーチでエラーが出ています
1
+ ラックナンバーリサーチで
body CHANGED
@@ -1,25 +1,94 @@
1
1
  ###ラックナンバーリサーチ
2
2
  ラックナンバーリサーチで実行時間の短い順に並べかえるシステムで、すでにラックナンバーリサーチの日時、実行時間を格納、表示する 機能は完成しています。それらのデータは"LACKNUM.DAT"に格納されています。実行時間の短い順に並べ替えるため構造体
3
3
  struct time_bestenは定義すみです。
4
- そのデータは"LACKNUM3.DAT"に格納したいです。
5
- 今回はとりあえず、"LACKNUM.DAT"から"LACKNUM3.DAT"にデータをコピーするプログラムを作り、コンパイル、
6
- 実行しましたエラーが出てい
4
+ 並び替えできていないみたいでが、
7
- コードの中のどこか間違いあると思ますが教えてださい
5
+ どこがのかよわかりません
6
+ よろしくお願いします
8
7
 
9
- ###エラーの状況
10
- ..@naka ~/besten
11
- $ gcc -o bcopy1 bcopy1.c -lpdcursesw
12
- ...@naka ~/besten
13
8
 
9
+ ###実行状況
14
- ...@naka~/besten
10
+ ....@naka ~/besten
11
+ $ gcc -o best-fchart3 best-fchart3.c -lpdcursesw
12
+
13
+ ....@naka ~/besten
15
- $ bcopy1 dtfile dtfile3
14
+ $ best-fchart3
15
+ 初期状態
16
+ 2015年 10月 27日 19時 9分 59秒
17
+ 得点(所要時間)は11.0秒
18
+
19
+ 2016年 1月 4日 19時 15分 11秒
20
+ 得点(所要時間)は8.0秒
21
+
16
- ファイルdtfileがオープンできません。
22
+ 2016年 1月 4日 19時 16分 8秒
23
+ 得点(所要時間)は9.0秒
24
+
25
+ 2016年 1月 4日 19時 16分 39秒
26
+ 得点(所要時間)は10.0秒
27
+
28
+ 2016年 1月 4日 19時 19分 7秒
29
+ 得点(所要時間)は10.0秒
30
+
31
+ 2016年 1月 4日 19時 21分 11秒
32
+ 得点(所要時間)は10.0秒
33
+
34
+ 2016年 1月 4日 19時 21分 44秒
35
+ 得点(所要時間)は8.0秒
36
+
37
+
38
+ ベストテン時間)は8.0秒
39
+
40
+
41
+ 2015年 10月 27日 19時 9分 59秒
42
+ 得点(所要時間)は11.0秒
43
+
44
+ 2016年 1月 4日 19時 15分 11秒
45
+ 得点(所要時間)は8.0秒
46
+
47
+ 2016年 1月 4日 19時 16分 8秒
48
+ 得点(所要時間)は9.0秒
49
+
50
+ 2016年 1月 4日 19時 16分 39秒
51
+ 得点(所要時間)は10.0秒
52
+
53
+ 2016年 1月 4日 19時 19分 7秒
54
+ 得点(所要時間)は10.0秒
55
+
56
+ 2016年 1月 4日 19時 21分 11秒
57
+ 得点(所要時間)は10.0秒
58
+
59
+ 2016年 1月 4日 19時 21分 44秒
60
+ 得点(所要時間)は8.0秒
61
+
17
62
  ...@naka ~/besten
18
63
  $
19
64
 
65
+
66
+ //並べ替えはquicksortを使う
67
+ //並べ替え後の"LACKNUM.DAT"を表示する。
68
+
69
+ */
70
+
71
+
20
72
  ###ソースコード
21
73
  ```
74
+ //ラックナンバーサーチ・トレーニングでベストテンを選び出すフローチャート
75
+
76
+ // 1, ラックナンバーサーチ・トレーニングで実行した日付と実行時間が
77
+ // char dtfile[] = "LACKNUM.DAT" (44バイト)に入っている
78
+
79
+ // 2, 並べ替え前の"LACKNUM.DAT"を表示する。
80
+
81
+ // 3, truct tm localとdouble bestの要素を持つ構造体を定義する。
82
+
83
+ // 4, LACKNUM.DATに保存されているデータを並べ替えて表示する
84
+ // を確保して下さい。
85
+
22
- /* bcopy … ファイルのコピ*/
86
+ // 5, ソトはその次の段階となります。
87
+ // "LACKNUM.DAT"を"best"の小さい順に並べ替える(そのまま表示する。)
88
+
89
+ // 6, "LACKNUM.DAT"を表示する。
90
+
91
+
23
92
  // ラックナンバーサーチ・トレーニング(1部です。必要ないところもあります)
24
93
  #include <stdio.h>
25
94
  #include <time.h>
@@ -33,60 +102,72 @@
33
102
  #define MAX_STAGE 3
34
103
  #define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
35
104
  #define MAX_NUM 10
36
- #define BSIZE 44 // この大きさ(44byte)に分割してコピー
37
105
 
38
106
  char dtfile[] = "LACKNUM.DAT"; // ファイル名
39
- char dtfile3[] = "LACKNUM3.DAT"; // 4, LACKNUM.DATに保存されているデータを記録するのに
107
+
40
- // 十分な数の配列"LACKNUM3.DAT" を確保して下さい。
41
108
  typedef struct {
42
109
  struct tm local;
43
- double best3;
110
+ double best;
44
111
  }time_besten;
45
112
 
113
+ void printData(time_besten data[], int num, char *title)
114
+ {
115
+ int i;
116
+ FILE *fp;
117
+ double best;
118
+ puts(title);
46
- //void disp(char* , int );
119
+ //int puts(char * s);
120
+ //puts 関数は標準出力に s が指す文字列を書き込みます.
121
+ //(出力の最後に自動的に改行文字を追加します.)
122
+ //文字列の終端ナル文字 ('\0') の書き込みは行いません.
123
+
124
+
125
+ if ((fp = fopen(dtfile, "rb")) == NULL) {
126
+ printf("ファイルを作成します。\n\n");
127
+ best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
128
+ } else {
129
+ int i;
130
+ struct tm local;
47
131
 
132
+ while((i = fread(&local, sizeof(struct tm), 1, fp)) > 0 ){
133
+ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
134
+ local.tm_year + 1900, local.tm_mon + 1,
135
+ local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
136
+ fread(&best, sizeof(double), 1, fp);
137
+ printf("得点(所要時間)は%.1f秒\n\n", best);
138
+ }
139
+ fclose(fp);
140
+ }
141
+ printf("\n");
142
+ }
143
+
48
- int main(int argc,char* argv[])
144
+ int compfuncBest(const void *a, const void *b)
49
145
  {
146
+ double comp;
147
+ comp = ((time_besten*)a)->best - ((time_besten*)b)->best;
148
+ // time_besten型のポインタにキャストしてからメンバbestで比較
149
+
150
+ if (comp<0.) return -1;
151
+ else if (0.<comp) return 1;
152
+ else return 0;
153
+ }
154
+
155
+ int main(void)
156
+ {
50
- int i,n,num;
157
+ int i,num;
51
- FILE *fp, *fp3; // *fpと *fp3はファイルポインタ
158
+ FILE *fp; // *fpと *fp3はファイルポインタ
52
- double best3;
159
+ double best;
53
160
  time_besten besten;
161
+
54
- unsigned char buf[BSIZE];
162
+ int DataSize=sizeof(time_besten);
163
+
164
+ int NumberOfDatas=sizeof(besten)/DataSize;
165
+
166
+ printData(&besten , NumberOfDatas, "初期状態");
55
167
 
56
- if (argc != 3) {
168
+
57
- fprintf(stderr, "パラメータが不正です。\n");
58
- fprintf(stderr, "bcopy コピー元ファイル名 コピー先ファイル名\n");
169
+ qsort(&besten, NumberOfDatas, DataSize, compfuncBest);
59
- } else {
60
- if ((fp = fopen(*++argv, "rb")) == NULL) {
61
- /* *++argv=const char *filenameも ,"rb"=const char *modeもポインタ */
62
- fprintf(stderr, "ファイル%sがオープンできません。\n", *argv);
63
- return (1);
64
- } else if ((fp3 =fopen( *++argv, "wb")) == NULL) {
65
- fprintf(stderr, "ファイル%sがオープンできません。\n", *argv);
66
- fclose(fp);
67
- return (1);
68
- } else {
69
- while ( (n = fread(buf, BSIZE, 1, fp)) > 0){
70
- /* ファイルポインタfpからsizeof(struct tm) バイトのデータを
71
- 1 個読み込み、読み込みデータ格納先のポインタbufに格納する */
72
- fwrite(buf,n, 1, fp3);
73
-
74
- while((i = fread(&besten,sizeof(struct tm),1, fp3)) > 0 ){
170
+ printData(&besten, NumberOfDatas, "ベストテン");
75
-
76
- printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
171
+
77
- besten.local.tm_year + 1900, besten.local.tm_mon + 1,
78
- besten.local.tm_mday, besten.local.tm_hour, besten.local.tm_min, besten.local.tm_sec);
79
- fread(&best3,sizeof(double),1, fp3);
80
- printf("得点(所要時間)は%.1f秒\n\n",besten.best3);
81
- }
82
- fflush(stdin);
83
- getchar();
84
-
85
- fclose(fp);
86
- fclose(fp3);
87
- }
88
-
89
- }
90
- }
91
- return (0);
172
+ return 0;
92
173
  }

1

エラー内容の変更

2016/01/06 10:05

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -10,9 +10,6 @@
10
10
  ..@naka ~/besten
11
11
  $ gcc -o bcopy1 bcopy1.c -lpdcursesw
12
12
  ...@naka ~/besten
13
- $ bcopy1
14
- パラメータが不正です。
15
- bcopy コピー元ファイル名 コピー先ファイル名
16
13
 
17
14
  ...@naka~/besten
18
15
  $ bcopy1 dtfile dtfile3