あっているかは分かりませんが途中までのプログラムを組んでみました。その他をどのように処理すればいいのかが分かりません。
※配列は使わず、関数だけを使ってお願いします。
考え方としては,例えば,1967/8/7 から 2009/6/12 までを計算する場合(うるう年を考慮)、
A. 開始月の日数(1967/8/7から8/31までの日数) B. 開始年の残りの月の日数(1967/9,10,11,12の日数) C. 開始年の翌年から終了年前年までの年の日数(1968 ~ 2008年までの日数) D. 終了年の終了月前月までの日数(2009/1,2,3,4,5の日数) E.終了月の日数(2009/6/1から2009/6/12までの日数)
C
1コード 2/* daycount.c */ 3 4#include <stdio.h> 5 6//関数のプロトタイプ宣言 7int uruu(int y); 8int monthday(int y, int m); 9int remainmonth(int y, int m); 10int previousmonth(int y, int m); 11int lastyearmonth(int y, int m); 12int endmonth(int y, int m); 13 14//--------------------------------------------------------------- 15int main(){ 16 int year_a,month_a,day_a; //開始年月日 17 int year_b,month_b,day_b; //終了年月日 18 int days; //日数積算用変数 19 int i; 20 21 days = 0; //変数の初期化 22 23 printf("日数計算プログラム\n"); 24 printf("数え始める西暦年月日を入力してください(例 : 1967,8,7)\n"); 25 scanf("%d,%d,%d\n" ,&year_a, &month_a, &day_a); 26 printf(" 数え終わる西暦年月日を入力してください(例 : 2009,6,12)\n "); 27 scanf("%d,%d,%d" ,&year_b, &month_b, &day_b); 28 29 「処理」←ここの処理 30 31 32 printf("%d年%d月%d日 から %d年%d月%d日 までの日数は %d日です. \n", 33 year_a, month_a,day_a, year_b, month_b, day_b, days); 34 35 return 0; //システムに値0を返す 36} 37 38//うるう年かどうか判定し結果を返す 39//うるう年ならtrue(1),そうでないならfalse(0)を返す関数 40int uruu(int y){ 41 int ret; 42 if(y % 400 == 0 || (y % 100 != 0 && y % 4 == 0) ){ 43 ret = 1; 44 }else{ 45 ret = 0; 46 } 47 return(ret); //結果を返す 48} 49 50//A: 年,月を受け取り、その月の日数を返す関数(うるう年も考慮) 51int monthday(int y,int m){ 52 int d,ret; 53 for(y = 1; y < y+1; y++){ //その指定した年の間の時だけループ 54 for(m = 1; m < m+1; m++){ //その指定した月の間だけループ 55 if(m == 2){ 56 ret = uruu(y); 57 if(ret == 1){ 58 d -= 29; 59 }else{ 60 d -= 28; 61 } 62 } 63 if(m == 4 || m == 6 || m == 9 || m == 11){ 64 d -= 30; 65 }else{ 66 d -= 31; 67 } 68 } 69 } 70 71 return(d); //結果を返す 72} 73 74//B: 開始年の残りの月の日数 75int remainmonth(int y,int m){ 76 int d,ret; 77 for(y = 1; y < y+1; y++){ //指定された年の間だけループ 78 for(m = 1; 1 <= m && m <= 12; m++){ //指定された月から12月までの間だけループ 79 if(m == 2){ 80 ret = uruu(y); 81 if(ret == 1){ 82 d += 29; 83 }else{ 84 d += 28; 85 } 86 }else{ 87 if(m == 4 || m == 6 || m == 9 || m == 11){ 88 d += 30; 89 }else{ 90 d += 31; 91 } 92 } 93 } 94 } 95 return(d); //結果を返す 96} 97 98//C: 開始年の翌年から終了年前年までの年の日数 99int previousmonth(int y,int m){ 100 int d,end,ret; 101 for(y = y+1; y < end; y++){ //開始年の翌年から終了年の前の年までのループ 102 for(m = 1; 1 <= m && m<= 12; m++){ //指定された月から12月までのループ 103 if(m == 2){ 104 ret = uruu(y); 105 if(ret == 1){ 106 d -= 29; 107 }else{ 108 d -= 28; 109 } 110 }else{ 111 if(m == 4 || m == 6 || m == 9 || m == 11){ 112 d -= 30; 113 }else{ 114 d -= 31; 115 } 116 } 117 } 118 } 119 return(d); //結果を返す 120} 121 122//D: 終了年の終了月前月までの日数 123int lastyearmonth(int y, int m){ 124 int d,end,ret; 125 for(y = end; y <= end; y++){ 126 for(m = 1; m <= end-1; m++){ 127 if(m == 2){ 128 ret = uruu(y); 129 if(ret == 1){ 130 d -= 29; 131 }else{ 132 d -= 28; 133 } 134 }else{ 135 if(m == 4 || m == 6 || m == 9 || m == 11){ 136 d -= 30; 137 }else{ 138 d -= 31; 139 } 140 } 141 } 142 } 143 return(d); 144} 145 146//E: 終了月の日数 147 148「処理」 149 150 151
<実行結果>
日数計算プログラム
数え始める西暦年月日を入力してください(例 : 1967,8,7)
1967,8,7
数え終わる西暦年月日を入力してください(例 : 2009,6,12)
2009,6,12
1967年8月7日 から 2009年6月12日 までの日数は 15285日です.
回答4件
あなたの回答
tips
プレビュー