プログラミングの課題について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yunon

プログラミングの課題について

#1

投稿記事 by yunon » 8年前

C言語でのファイル処理に関して分からない課題があります。
ご教授頂けると幸いです。

<課題>
キーボードから何かキーが押されるごとに、現在の時刻を取得し1行ごとにファイルに記録していく。
5回記録したら一旦ファイルを閉じ、再び開いて1回ごとの時刻の差をファイルから読み取った値で平均を計算するプログラムを作成せよ。

・ファイルには年・月・日・自・分・秒をすべて一行で書き込むこと
・平均の時間は浮動小数点で算出すること。

以下のように作成したのですが、時刻がすべて同じになってしまいます。
プログラムをどのように修正したらよいでしょうか・・。
よろしくお願いいたします。

コード:

 
#define _CRT_SECURE_NO_WARNINGS
#include<time.h>
#include<stdio.h>
#include<conio.h>


char data_file[] = "datetime.dat";


void make_file(void)
{
	FILE *fp;

	if ((fp = fopen(data_file, "w")) == NULL)
		printf("\aファイルをオープンできません。\n");
	else {
		
		fclose(fp);


	}
}

void get_data(void)
{
	FILE *fp;

	if ((fp = fopen(data_file, "r")) == NULL)
		printf("本プログラムを実行するのは初めてですね。\n");
	else {
		int year, month, day, h, m, s;

		fscanf(fp, "%d%d%d%d%d%d", &year, &month, &day, &h, &m, &s);
		printf("前回は%d年%d月%d日%d時%d分%d秒でした。\n", year, month, day, h, m, s);

		fclose(fp);
	}

}

void put_data(void)
{
	FILE *fp;
	time_t current = time(NULL);
	struct tm *timer = localtime(&current);


	if ((fp = fopen(data_file, "w")) == NULL)
		printf("\aファイルをオープンできません。\n");
	else {
		fprintf(fp, "%d %d %d %d %d %d\n", timer->tm_year + 1900, timer->tm_mon + 1, timer->tm_mday, timer->tm_hour, timer->tm_min, timer->tm_sec);

		fclose(fp);

	}
}


int main(void) {

	make_file();

		if (_getch())
			get_data();
		if (_getch())
			get_data();
		if (_getch())
			get_data();
		if (_getch())
			get_data();
		if (_getch())
			get_data();

	put_data();
}
 

yunon

Re: プログラミングの課題について

#2

投稿記事 by yunon » 8年前

すみませんトピック二つ作成できてしまいました・・・。

だんごさん
記事: 273
登録日時: 13年前

Re: プログラミングの課題について

#3

投稿記事 by だんごさん » 8年前

「5回記録する」と書いてありますが、コードは「5回読み込む」になっています。同じデータが5回表示されて当たり前です。
また最初にファイルを作る必要はありません。get_dataで「初めてですね」が表示されないですし、put_dataで書き込みする際にファイルが作られますから意味のないものです。
コードのmain関数を以下のように変えてください。

コード:

int main(void) {
 
//    make_file();
    get_data();
 
        if (_getch())
            put_data();
        if (_getch())
            put_data();
        if (_getch())
            put_data();
        if (_getch())
            put_data();
        if (_getch())
            put_data();

    return 0;
}
またファイルは書き込みモードなので上書きされます。5回=5行分記録する課題だと思いますので、モードを"a"にするか
課題が「5回記録したら一旦ファイルを閉じる」ですから、もしかするとファイルは一回だけ開いて、都度5回分記録するのかもしれません。

書き込みが終わりましたら次は読み込みです。5回分=5行分書き込んでいるので1回だけファイルを開き5行読み込むことになります。
一行ごと読み込み、差分から平均を求めるようにしましょう。
yunon さんが書きました:        if (_getch())
            get_data();
        if (_getch())
            get_data();
        if (_getch())
            get_data();
        if (_getch())
            get_data();
        if (_getch())
            get_data();
このコード(修正前ですが)は同じことを何度も書いていますね。ループ処理にできませんか?
 Dango San

yunon

Re: プログラミングの課題について

#4

投稿記事 by yunon » 8年前

put_file関数、main関数を変更したところ、きちんと書き込みと表示をすることが出来、無事完成させることが出来ました!
自分の勉強不足を実感いたしました。

提出の近い課題でしたので本当に助かりました!!
ありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る