質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1425閲覧

ベストテンを表示する問題が

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/12/24 00:42

c言語プログラミング ラックナンバーサーチボールドテキスト
実行時間の短い順に表示するプログラムを作成したいのですが、いろいろネットで検索して試みているのですが、なかなかできません。3ヶ月ほどかかっています。以下のコードを参考にしてどうすればいいか、ご教授してください。頭がこんがらがってなにがなんだかわかりません。
これは新明解C言語9章自由課題9-1の中の問題で、最近の10回を表示するプログラムの作成には
成功しましたが、ベストテンを表示する問題がなかなかうまくいきません。
本来最近の10回を表示するプログラムを添付すると、内容がはっきりするのですが、文字数の関係で載せられません。

/* ラックナンバーサーチ・トレーニング(最近の10回の日時・最高得点を表示)*/
#include <stdio.h>
#include <time.h>
#include <float.h>
#include <ctype.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include "getputch.h"

#define MAX_STAGE 3
#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
#define MAX_NUM 10

char dtfile[] = "LACKNUM.DAT"; /* ファイル名 /
char dtfile2[] = "LACKNUM2.DAT";/
最高記録用のファイル */
double score2;

// 実行時間の短い順に並べて表示する。
int bestten(double best,double p_score)
{
FILE *fp; // これまでの履歴を指すポインタ
double past_score;
int i,N;
struct tm local;

if ((fp = fopen(dtfile, "rb")) == NULL) { printf("ファイルを作成します。\n\n"); best = DBL_MAX; /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */ } else { while((i = fread(&local, sizeof(struct tm), 1, fp)) > 0 ){ fread(&best, sizeof(double), 1, fp); past_score=best; printf("過去の実行時間 %d\n\n",past_score); // 比較関数を使って短い順に挿入する。あるいはdtfile[]を並べ替える /* float型のソート */ qsort(best,N,sizeof(float),float_cmp); for(i = 0; i < N; i++) printf("%0.1f ",best[i]); /* float型の比較 */ int float_cmp(const void *arg0, const void *arg1){ float past_score = *(float*)arg0; float best = *(float*)arg1; if(past_score == best) return 0; else if(past_score > best) return 1; else return -1; } } } if((fp = fopen(dtfile, "rb")) == NULL){ printf("\aファイルをオープンできません。\n"); }else{ while((i = fread(dtfile, sizeof(struct tm), 1, fp)) > 0 ){ printf("%d年 %d月 %d日 %d時 %d分 %d秒\n", local.tm_year + 1900, local.tm_mon + 1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec); fread(&best, sizeof(double), 1, fp); printf("得点(所要時間)は%.1f秒\n\n", best); } } fclose(fp);

}

int main(void)
{
int retry; /* もう一度? /
double score; /
今回の所要時間 /
double best; /
最短所要時間 */

best = get_data(); // get_data()で前回までの最短所要時間を // ファイルから読み込んでbestに代入する。 init_getputch(); srand(time(NULL)); /* 乱数の種を初期化 */ do { score = go(); // トレーニング(go)で実行、返却された所要時間(jika)をscoreに代入する。 if (score < best) { printf("最短所要時間を更新しました!!\n"); best = score; /* 最高得点更新 */ } printf("もう一度しますか … (0)いいえ (1)はい:"); scanf("%d", &retry); } while (retry == 1); put_data(score,best); /* 今回の日付・時刻・得点を書き込む */ term_getputch(); return 0;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2015/12/24 02:07

たぶんコンパイルエラーが出てると思うのですが、エラー内容を見せてください。
退会済みユーザー

退会済みユーザー

2015/12/24 03:41

ご返事ありがとうございます。正月休みに今までネットで調べたプログラムを 勉強し直して、コンパイルできる状態にして質問しなおします。 そのときまたよろしくお願いいたします。
guest

回答2

0

ベストアンサー

上の方がおっしゃられているとおり、関数bestten()の中で関数float_cmp()を定義しているインライン関数なんてC言語(伝統的な)に無い手法はどこで知られたのでしょうか?

それは百歩譲るとして、その直前のqsort()の引数でfloat_cmp()を呼んでいるので、せめて冒頭でプロトタイプ宣言(こういう関数があるぞ!という宣言)してないと「float_cmp()なんてないぞ」というコンパイルエラーが起きると思います。
※後出しが許されるコンパイラの場合はこの限りではありませんが、その後のリンクで怒られます。←インラインの件は無視して一般論

とりあえず、float_cmp()はbestten()の外に出し、これより前で個別に定義してください。
上から順に処理する中で突然知らない関数が現れるとコンパイラはびっくりしてしまいます。
しかも関数の中で関数が定義されていたらきっとわけわからんエラーを大量に吐き出すでしょうw

その他の細かい部分は見ていません、あしからず。

投稿2016/01/12 15:44

mike

総合スコア118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

以下のコードを参考にしてどうすればいいか、ご教授してください。

コードを見たところ、下記をお薦め致します。

プロフィールによると中級編と実践編を使用されているようですね。プログラミングは専門性の高いスキルです。その中でもC言語は難易度の高い言語です。入門をすっ飛ばして中級から入るのは全ての人にとって無茶な行為と思います。
sanchu52さんはお年にも関わらずネットもでき優秀な方と思いますが、やはり人間なのですから、基礎から始めることをお薦めします。

ところで、参考にされるものが書籍ですと同じ書籍を持っている人しか分かりませんので回答できる人が限られてしまいます。このようにネットでご質問されるスキルをお持ちなのでしたら、参考書もネット上のものを使うと質問した時に回答者と演習問題を共有でき、回答できる可能性が高まります。

ネットでも優れた方が分かりやすい解説をされています。
例えば、下記は内部表現も解説してあり、体系的に学ぶには中々良さそうです。
https://www.sist.ac.jp/~suganuma/learn/learn.html
他にも色々あるようです。

分からないところは、でてきたキーワードで検索したり、teratailで質問されたりすると、理解が進みやすいのではないかと思います。

投稿2015/12/24 02:06

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/24 02:38

回答ありがとうございます。中級編で3回ほど読み直しているのですが、前2回は解けなくて パスしました。今回は最近の10回分を表示することに成功したので。ベストテンを表示する ことに挑戦したのですが、すでに10回分表示で体力を使い果たして。再度パスして次回にと思っているのですが、正月休みが来るのでなんとかしたいとおもっています。 参考にしたプログラムやネットは30は越えると思うのですが、よく理解していなようですね。 ありがとうございます。
Chironian

2015/12/24 04:13

> 参考にしたプログラムやネットは30は越えると思うのですが、よく理解していなようですね。 残念ながら、その通りです。 比較的初期段階の初心者がするような間違いが複数あります。中級者ならばあり得ない間違いです。つまり、sanchu52さんはまだ中級編を解く準備ができていないということなのです。 ですので、参考にされたプログラムやネットがsanchu52さんにとってあまり適切なものではなかったのではないかと感じます。 急がば回れです。頑張って下さい。
cateye

2015/12/24 09:26

基本的なことですが・・・define → #define  include → #include あと、Cでは関数の中に関数はかけませんd^^; “ここは分かっているから”と言って、基礎の部分を読み飛ばして挫折した人が何人もいました。・・・なので、 Chironianさんの言うように基礎をしっかり身に付けてください。 参考:苦しんで覚えるC言語 http://9cguide.appspot.com/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問