時差について、どなたかご教授お願いします。

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

時差について、どなたかご教授お願いします。

#1

投稿記事 by gan » 5年前

開始時刻と終了時刻から時差を返す関数を作成しました。
以下プログラムです。

コード:

#include <stdio.h>

struct str_time{
	int hour;	/* 時 */
	int min;	/* 分 */
	int sec;	/* 秒 */
};

/*
	名称	count_times
	引数	struct str_time *sta_time:開始 時分秒
			struct str_time *end_time:終了 時分秒
			struct str_time *dif_time:時差 時分秒
	戻り値	無し
*/
/*----- ここより下に解答を記述してください -----*/
void count_times(struct str_time *sta_time, struct str_time *end_time, struct str_time *dif_time)
{
	int total;																	
	int total_sta;
	int total_end;

	total_sta = sta_time->hour * 3600 + sta_time->min * 60 + sta_time->sec;		
	total_end = end_time->hour * 3600 + end_time->min * 60 + end_time->sec;

	total = total_end - total_sta;																					

	dif_time->hour =  total / 3600;												
	dif_time->min  = (total % 3600) / 60;
	dif_time->sec  = (total % 3600) % 60;

	return;
}
/*----- ここより上に解答を記述してください -----*/

int main(void)
{
	struct str_time sta_time;	/*開始 時分秒*/
	struct str_time end_time;	/*終了 時分秒*/
	struct str_time dif_time;	/*時差 時分秒*/
	
	printf("二つの時刻(開始時刻と終了時刻)を入力して下さい\n");
	
	printf("開始 時分秒([時] [分] [秒]):");
	scanf("%d %d %d", &sta_time.hour, &sta_time.min, &sta_time.sec);
	
	printf("終了 時分秒([時] [分] [秒]):");
	scanf("%d %d %d",&end_time.hour, &end_time.min, &end_time.sec);
	
	/*----- ここより下に解答を記述してください -----*/
	count_times(&sta_time, &end_time, &dif_time);
	/*----- ここより上に解答を記述してください -----*/
	
	puts("----- 処理後 -----");
	
	printf("時差は %d 時間 %d 分 %d 秒です。\n", dif_time.hour, dif_time.min, dif_time.sec);
	
	return 0;
}
表示例1
開始:1時2分3秒	終了:4時5分6秒	時差:3時間3分3秒
表示例2
開始:10時11分12秒	終了:13時14分15秒	時差:3時間3分3秒
表示例3
開始:23時24分25秒	終了:2時27分28秒	時差:3時間3分3秒

関数内で受け取った値を「秒」に統一させ、差を求めてからそれぞれ時、分、秒に戻すという考えです。
表示例1と2は上手くいったのですが表示例3のほうで時差 マイナス20時間マイナス50分~ と
表示されてしまいます。うまく説明できないのですが、表示例3のような日をまたいだ場合でもきちんと
表示させる方法が分からないので、どなたかご教授お願いします。

gan

Re: 時差について、どなたかご教授お願いします。

#2

投稿記事 by gan » 5年前

codeの中に間違えて説明文を書いてました...こっちが本物です。

開始時刻と終了時刻から時差を返す関数を作成しました。
以下プログラムです。
#include <stdio.h>

コード:

struct str_time{
	int hour;	/* 時 */
	int min;	/* 分 */
	int sec;	/* 秒 */
};

/*
	名称	count_times
	引数	struct str_time *sta_time:開始 時分秒
			struct str_time *end_time:終了 時分秒
			struct str_time *dif_time:時差 時分秒
	戻り値	無し
*/
/*----- ここより下に解答を記述してください -----*/
void count_times(struct str_time *sta_time, struct str_time *end_time, struct str_time *dif_time)
{
	int total;																	
	int total_sta;
	int total_end;

	total_sta = sta_time->hour * 3600 + sta_time->min * 60 + sta_time->sec;		
	total_end = end_time->hour * 3600 + end_time->min * 60 + end_time->sec;

	total = total_end - total_sta;																					

	dif_time->hour =  total / 3600;												
	dif_time->min  = (total % 3600) / 60;
	dif_time->sec  = (total % 3600) % 60;

	return;
}
/*----- ここより上に解答を記述してください -----*/

int main(void)
{
	struct str_time sta_time;	/*開始 時分秒*/
	struct str_time end_time;	/*終了 時分秒*/
	struct str_time dif_time;	/*時差 時分秒*/
	
	printf("二つの時刻(開始時刻と終了時刻)を入力して下さい\n");
	
	printf("開始 時分秒([時] [分] [秒]):");
	scanf("%d %d %d", &sta_time.hour, &sta_time.min, &sta_time.sec);
	
	printf("終了 時分秒([時] [分] [秒]):");
	scanf("%d %d %d",&end_time.hour, &end_time.min, &end_time.sec);
	
	/*----- ここより下に解答を記述してください -----*/
	count_times(&sta_time, &end_time, &dif_time);
	/*----- ここより上に解答を記述してください -----*/
	
	puts("----- 処理後 -----");
	
	printf("時差は %d 時間 %d 分 %d 秒です。\n", dif_time.hour, dif_time.min, dif_time.sec);
	
	return 0;
}
表示例1
開始:1時2分3秒 終了:4時5分6秒 時差:3時間3分3秒
表示例2
開始:10時11分12秒 終了:13時14分15秒 時差:3時間3分3秒
表示例3
開始:23時24分25秒 終了:2時27分28秒 時差:3時間3分3秒

関数内で受け取った値を「秒」に統一させ、差を求めてからそれぞれ時、分、秒に戻すという考えです。
表示例1と2は上手くいったのですが表示例3のほうで時差 マイナス20時間マイナス50分~ と
表示されてしまいます。うまく説明できないのですが、表示例3のような日をまたいだ場合でもきちんと
表示させる方法が分からないので、どなたかご教授お願いします。

yoko
記事: 24
登録日時: 15年前

Re: 時差について、どなたかご教授お願いします。

#3

投稿記事 by yoko » 5年前

単純な話、
開始時刻より終了時刻の方が小さい場合は
終了時刻に+24時間をしてあげればいいのではないでしょうか。
例えば、夜中の2時は26時と表現することもあり、
それを活用するだけです。

コード:

if(開始時刻>終了時刻) 終了時刻=終了時刻+24時間

gan

Re: 時差について、どなたかご教授お願いします。

#4

投稿記事 by gan » 5年前

上手く表示ができました!
本当にありがとうございます!

返信

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