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;
}
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
まず曜日判定ができないと話になりません。
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日あることを使えば、土日を数えるのも
簡単なはず。最後の一週間未満の日々を地道に曜日判定して数えれば
簡単でしょう。
もちろん、最後の一週間未満の日々を
平日同士で土日を挟まない
、平日同士で土日を挟む、等々、
場合分けに挑戦するのも面白いでしょう。
返信ごめんなさい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;
}
No.1
- 回答日時:
#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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- Ruby パイソンプログラミング 2 2022/12/03 18:44
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
strcmp
-
error C2143: 構文エラー : ';'...
-
スレッドとメッセージキューに...
-
C言語 タイマーのソースについて
-
C言語プログラミング
-
Cプログラムについて
-
インクリメント演算子をprintf...
-
コマンドラインに出力した文字...
-
C言語の数値入力
-
コンパイルエラーについて
-
c言語でAからZまでを表示する...
-
hit&bolwのプログラミングがで...
-
プログラミング言語C
-
C言語のヘッダーファイルの作成...
-
C++ 二次関数の重解、虚数解が...
-
unsigned int型について
-
scanfで正しい値を入力できない
-
int型 00 を表示するのに0とな...
-
関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
【C言語教えてください】sin波...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
strcmp
-
4の倍数を論理演算で表す。。
-
C言語での、年複利の計算方法...
-
C言語 プログラミング
-
scanfに文字が入力されたときに...
-
hit&bolwのプログラミングがで...
-
%P と %X の違い
-
unsigned int型について
-
printf( " %2d", p * q );
-
cshの文字列操作(0埋め)
-
改行について 1行に何個かづ...
-
8人分のテストの点数を入力し、...
-
入力したお金の金額からお札の...
-
三角形の判別
-
テキストカーソル位置の取得
おすすめ情報
諦めた
締め切る