Guest User

Untitled

a guest
Mar 23rd, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. /***********************************
  2. 日本の現在時刻から指定したタイムゾーンの
  3. 現地時間を求めるプログラム
  4. 入力:時 分 タイムゾーン
  5. 出力:現地時間
  6. ***********************************/
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9.  
  10. #define MOJI 13 /* 最大入力文字数 */
  11.  
  12. int main(){
  13.  
  14. char* str; /* 入力データ */
  15. char* a; /* 時 */
  16. char* b; /* 分 */
  17. char* utc; /* UTCの絶対値 */
  18. char sym; /* UTCの符号(+,-) */
  19. int i = 10; /* 入力文字列のUTCの数値からのカウンタ */
  20. int j = 0; /* UTCの絶対値を抽出する為のカウンタ */
  21. int hour,minutes; /* 入力時刻 時と分 */
  22. double data; /* UTC(整数、小数両方を考慮) */ /* 日本と現地の時刻の差*/
  23. int integer; /* 日本と現地の時刻の差の整数部分 */
  24. double decimal; /* 日本と現地の時刻の差の小数部分 */
  25. int local_hour; /* 現地時間の時 */
  26. int local_minutes; /* 現地時間の分 */
  27. int counter = 0; /* 時の増減カウンタ(0分を超えた場合と0分を遡った場合) */
  28.  
  29. str = (char*)calloc(MOJI+1+1,sizeof(char)); /* 最大文字数(MOJI)+改行コード+終端文字分だけポインタの領域確保*/
  30. fgets(str,MOJI+1+1,stdin); /* 標準入力 */
  31.  
  32. utc = (char*)calloc(5,sizeof(char)); /* UTCの絶対値用のポインタの領域確保 */
  33. a = (char*)calloc(3,sizeof(char)); /* 入力データの時(a)用のポインタの領域確保 */
  34. b = (char*)calloc(3,sizeof(char)); /* 入力データの分(b)用のポインタの領域確保 */
  35.  
  36. /* 入力データから時(a)の文字列を読み込み、整数に変換 */
  37. a[0] = str[0];
  38. a[1] = str[1];
  39. a[2] = '\0';
  40. hour = atoi(a);
  41.  
  42. /* 入力データから分(b)の文字列を読み込み、整数に変換 */
  43. b[0] = str[3];
  44. b[1] = str[4];
  45. b[2] = '\0';
  46. minutes = atoi(b);
  47.  
  48. sym = str[9]; /* UTCの符号を読み込む */
  49.  
  50. /* 入力データのUTCの絶対値部分から入力データの末端まで文字列に格納 */
  51. while( str[i] != '\n' && str[i] != '\0' ){
  52. utc[j] = str[i];
  53. i++;
  54. j++;
  55. }
  56. utc[j] = '\0';
  57.  
  58. data = atof(utc); /* UTCの絶対値を小数として保存 */
  59.  
  60. if( sym == '-' ) data = 24.0 - data; /* UTCの符号がマイナスの場合は24時間から引いて調整 */
  61. data -= 9.0; /* UTCを基準の日本のタイムゾーンの9で引いて差を求める */
  62.  
  63. integer = (int)data; /* 日本と現地の時の差(整数部分)を求める */
  64. decimal = data - (double)((int)data); /* 日本と現地の分の差(小数部分)を求める */
  65.  
  66. /* 小数の誤差調整 */
  67. if( decimal > 0.0 ) decimal += 0.0001;
  68. if( decimal < 0.0 ) decimal -= 0.0001;
  69.  
  70. /* 現在の分に調整を加えて現地時間の分に直す*/
  71. /* ただし、1周分の周回はまだ考慮していない */
  72. local_minutes = minutes + (int)(60.0 * decimal);
  73.  
  74. if( local_minutes >= 60 ) counter++; /* 60分を上回ってた場合は時を+1 */
  75. if( local_minutes < 0 ) counter--; /* 0分を下回ってた場合は時を-1 */
  76.  
  77. /* 現地時間の分がマイナスになってしまった場合 */
  78. if( local_minutes < 0 ) local_minutes += 60; /* 60分を足して調整 */
  79.  
  80. /* 現地時間の時の計算 */
  81. /* 日本の時から現地時間の時を求める(hour+integer) */
  82. /* 分の差による周回を超えた場合、遡った場合を考慮して必要に応じて時を+-1する */
  83.  
  84. local_hour = hour + integer + counter;
  85.  
  86. /* 現地時間の時がマイナスになってしまった場合 */
  87. if( local_hour < 0 ) local_hour += 24; /* 24時間を足して調整 */
  88.  
  89. local_hour %= 24; /* 時は23時までなので超えた場合の調整 */
  90. local_minutes %= 60; /* 分は59分までなので超えた場合の調整 */
  91.  
  92. printf("%02d:%02d\n",local_hour,local_minutes); /* 現地時間の出力 */
  93.  
  94. return 0;
  95.  
  96. }
Add Comment
Please, Sign In to add comment