dポイントプレゼントキャンペーン実施中!

C言語について。
同じ年内で経過日数を計算するプログラムを作ってみました。ここから土日を除いた経過日数を計算したい場合ってどう変えればいいですか?
経過日数を7で割って、×2すればいいのかな、と思ったんですけど、経過日数が1週間ない場合もあるので…

以下は土日を除いていない状態の経過日数計算プログラムです

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{
int ay, am, ad, by, bm, bd;

printf("同じ年の2つの日付を入力して経過日数を計算せよ\n");
printf("1つ目の日付(入力例:2020/3/13)\n");
scanf("%d/%d/%d", &ay, &am, &ad);

if (ay % 400 == 0) leap = 1;
else if (ay % 4 == 0 &&ay % 100 != 0)leap = 1;

int a = -1;
int i;
for (i = 1; i <am; i++) {
if (i == 1)a = a + 31;
else if (i == 2) a = a + 28 + leap;
else if (i == 3)a = a + 31;
else if (i == 5)a = a + 31;
else if (i == 7)a = a + 31;
else if (i == 8)a = a + 31;
else if (i == 10)a = a + 31;
else if (i == 12)a = a + 31;
else a = a + 30;
}
a = a + ad;

printf("2つ目の日付(入力例:2020/3/13)\n");
scanf("%d/%d/%d", &by, &bm, &bd);
int b = -1;
for (int i = 1; i <bm; i++) {
if (i == 1)b = b + 31;
else if (i == 2)b = b + 28 + leap;
else if (i == 3)b = b + 31;
else if (i == 5)b = b + 31;
else if (i == 7)b = b + 31;
else if (i == 8)b = b + 31;
else if (i == 10)b = b + 31;
else if (i == 12)b = b + 31;
else b = b + 30;
}
b = b + bd;


printf("経過日数は%d日\n", b - a);
return 0;


}

質問者からの補足コメント

  • 諦めた
    締め切る

      補足日時:2021/12/09 23:47

A 回答 (3件)

>(13 * month + 8) / 5


なんだこれ?

せっかく経過日数のコードがあるのに・・・
    • good
    • 0

まず曜日判定ができないと話になりません。



Yを与えられて1月1日の曜日を求めるには
① Y を400で割って余り M を求める。
② M を 4 で割って 商 L と あまり LM
③ M を 100 で割って 商LL とあまり LLM を求める。

Mが 0 ならうるう年。
そうではなくて LM = 0 かつ LLM != 0 ならうるう年とする。

②、③で Y ではなく M を割るのは、400年前の同月同日の
曜日は同じという事実を使って暗算しやすくするための
ものなので、Yでやってもよいです(^^;

閏年なら
DW = {(M + L - LL) - 1} mod 7 求める。
閏年でないなら
DW = (M + L - LL) mod 7 を求める

DW は 日 = 0, 月=1, ・・・金=5, 土=6

指定日付の曜日は (DW + 1月1日からの経過日数) mod 7 ですね。

1週間に土日はかならず2日あることを使えば、土日を数えるのも
簡単なはず。最後の一週間未満の日々を地道に曜日判定して数えれば
簡単でしょう。

もちろん、最後の一週間未満の日々を
平日同士で土日を挟まない
、平日同士で土日を挟む、等々、
場合分けに挑戦するのも面白いでしょう。
    • good
    • 0
この回答へのお礼

返信ごめんなさいm(*_ _)m
こんな感じに作ってみたんですけど、上手く作動しないです。どこがおかしいですか??


……
else if (i == 12)b = b + 31;
else b = b + 30;
}
b = b + bd;

//ここから追加分⤵︎⤵︎⤵︎
int year = 0, month = 0, day = 0;
int weekday;

for (weekday = 0; weekday != 5,6; weekday++) {
if (month == 1 || month == 2)
{
year = year - 1;
month = month + 12;
}
weekday = (year + year / 4 - year / 100 + year / 400 +
(13 * month + 8) / 5 + day) % 7;

if (weekday == 0);
else if (weekday == 1);
else if (weekday == 2);
else if (weekday == 3);
else if (weekday == 4);
else if (weekday == 5);
else if (weekday == 6);
}


printf("2つの日付間の経過日数は%d日です\n", b - a);
return 0;


}

お礼日時:2021/12/09 15:43

#include <stdio.h>


#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(void) {
 char s[11];
 char* sep = "/";
 struct tm A = {0};
 struct tm B = {0};
 time_t a, b;
 int pdays, wday;
 int count = 0;

 puts("同じ年の2つの日付を入力して経過日数を計算せよ");
 puts("1つ目の日付 (入力例 : 2020/3/13)");
 scanf("%10s%*[^\n]", s);
 getchar();
 A.tm_year = strtol(strtok(s, sep), NULL, 10) - 1900;
 A.tm_mon = strtol(strtok(NULL, sep), NULL, 10) - 1;
 A.tm_mday = strtol(strtok(NULL, sep), NULL, 10);
 a = mktime(&A);

 puts("2つ目の日付 (入力例 : 2020/3/13)");
 scanf("%10s%*[^\n]", s);
 getchar();
 B.tm_year = strtol(strtok(s, sep), NULL, 10) - 1900;
 B.tm_mon = strtol(strtok(NULL, sep), NULL, 10) - 1;
 B.tm_mday = strtol(strtok(NULL, sep), NULL, 10);
 b = mktime(&B);

 pdays = (int)difftime(b, a)/60/60/24;
 wday = localtime(&a)->tm_wday;

 for (int i = 0; i < pdays; i++) {
  if (wday > 6) {
   wday = 0;
  }
  if ((wday == 0) || (wday == 6)) {
   count++;
  }
  wday++;
 }

 printf("経過日数は%d日\n", pdays - count);

 return EXIT_SUCCESS;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!