寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語による時計算

C言語による時計算のプログラムです。
Xcode上で、動作を確認しました。
時計算は、ウィキペディアから引用すれば、算数の文章題、またその解き方の一種です。
https://ja.wikipedia.org/wiki/時計算
ある時刻を基準にして、時計の長針と短針(および秒針)のなす角が特定の角度になるのはいつか、もしくは時刻が与えられたときの長針と短針のなす角を求める問題です。
あるいはまた、左右線対称の時刻、上下線対称の時刻を求める問題。
出題内容を大きく分けると、長針と短針のなす角度、あるいは長針と短針が重なる時刻を求めることになります。
そして公式としては、以下の2パターンがあります。
・短針の動く速度:360度/12時間=360度/720分=0.5度/分
・長針の動く速度:360度/60分=6度/分
そのため本プログラムにおいては、時刻を入力することで、長針と短針のなす角度を計算して、その結果を表示します。
ただし入力値については、あらかじめ短針が0から11かつ長針が0から59の整数値としています。
結果表示後に、もう一度計算し直す場合は継続し、そうでなければ終了します。

/*
 C言語による時計算
 https://neguse-atama.hatenablog.com
*/
#include <stdio.h>
int main(void){
    int nanzi,nanfun,tuzuki;
    double tyoukaku,tankaku,sanokaku,motomerukaku;
    do{
        printf("時計の長針と短針のなす角度を求めます。任意の時刻を入力してください。\n(ただし、入力できる時間は0から11、分は0から59までの整数値に限ります)\n");
        printf("何時:");  scanf("%d",&nanzi);
        printf("何分:");  scanf("%d",&nanfun);
        if((nanzi>=0 && nanzi<=11) && nanfun>=60){
            printf("「何分:」に60以上の整数(整数以外の値)を入力しないでください。\n");
            goto yarinaosikeisan;
        }else if(nanzi>=12 && nanfun>=60){
            printf("「何時:」に12以上の整数(整数以外の値)を、「何分:」に60以上の整数(整数以外の値)を入力しないでください。\n");
            goto yarinaosikeisan;
        }else if(nanzi>=12 && (nanfun>=0 && nanfun<=59)){
            printf("「何時:」に12以上の整数(整数以外の値)を入力しないでください。\n");
            goto yarinaosikeisan;
        }
        tyoukaku=6*nanfun;
        tankaku=0.5*(60*nanzi+nanfun);
        if(nanzi<0 && nanfun>0){
            printf("「何時:」に負の数を入力しないでください。\n");
        }else if(nanzi>0 && nanfun<0){
            printf("「何分:」に負の数を入力しないでください。\n");
        }else if(nanzi<0 && nanfun<0){
            printf("「何時:」,「何分:」に負の数を入力しないでください。\n");
        }else if(tankaku<tyoukaku){
            sanokaku=tyoukaku-tankaku;
            if(sanokaku>180 && sanokaku!=360){
                motomerukaku=360-sanokaku;
                printf("求める小さい方の角度は%lf度です。\n",motomerukaku);
                printf("求める大きい方の角度は%lf度です。\n",sanokaku);
            }else if(sanokaku<=180){
                motomerukaku=360-sanokaku;
                printf("求める小さい方の角度は%lf度です。\n",sanokaku);
                printf("求める大きい方の角度は%lf度です。\n",motomerukaku);
            }
        }else if(tankaku>tyoukaku){
            sanokaku=tankaku-tyoukaku;
            if(sanokaku>180 && sanokaku!=360){
                motomerukaku=360-sanokaku;
                printf("求める小さい方の角度は%lf度です。\n",motomerukaku);
                printf("求める大きい方の角度は%lf度です。\n",sanokaku);
            }else if(sanokaku<=180){
                motomerukaku=360-sanokaku;
                printf("求める小さい方の角度は%lf度です。\n",sanokaku);
                printf("求める大きい方の角度は%lf度です。\n",motomerukaku);
            }
        }else if((tyoukaku==tankaku)||(tyoukaku==0&&tankaku==360)){
            printf("求める角度は0度です。\n");
        }
    yarinaosikeisan:
        printf("計算をやり直しますか。・・・(0)はい (1)いいえ:");
        scanf("%d",&tuzuki);
        printf("これで計算を終了します。\n");
    }while(tuzuki==0);
    return (0);
}

中学の入試問題や進学塾などで出題される特殊算の中から、時計算について考えてみました。
文章題としての出題になりますが、時計盤上を進む距離を角度に置き換えることで、旅人算の応用とも考えられます。
または、そこが旅人算との違いでもあります。
したがって時計算の応用としては、周回数を問うような問題も作成できます。
さらに特定もしくは対称の時刻(角度)を求める、追いつき・出会い旅人算と言うような類型もあります。