質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

794閲覧

ある日から ある日まで(同日でよい)の求め方Cプログラム

ZhenZeZhang

総合スコア33

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/12/22 06:51

編集2018/12/22 07:50

現在計算の精度にて不具合が出ていてどこで計算をミスしているのかがわからない状態(僕はまだまだの初心者でC言語以外はまだ理解できない状態です。)

計算の結果が

$ ./a
1日目
26日目
550日目 <=Wrong.
184日目
6703日目
433709日目 <=Wrong.

となっています。

うるう年の4の倍数を考慮することと100年に一回にうるうがないことを考慮したできるだけ簡潔なプログラムを作成しました。

以下がある日からある日までは何日があるのかの正解答案となります

2002年 1月 1日 から数えて 2002年 1月 1日 は 1 日目
2002年11月 4日 から数えて 2002年11月29日 は 26 日目
2001年 5月 4日 から数えて 2002年11月5日 は 551 日目
2000年 1月 20日 から数えて 2000年 7月 21日 は 184 日目
1984年 6月23日 から数えて 2002年10月29日 は 6,703 日目
794年 1月 6日 から数えて 1981年 6月24日 は 433,713 日目 ※

これからより分かりやすい質問する文章が作れるように質問内容が不明や質問する文章について不明があればそれを明記したコメントしてくれたら大変ありがたく思います。
(もし不快を招く文章であれば大変申し訳ありません。)

#include <stdio.h> #define M 12 int m[M]= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; typedef struct test { int ye, mo, da; } t1; int ttl( int Mo, int d, int y) { int i; int re=0; if(Mo >=2)re += (y/4); else re += ((y-1)/4); re -= y/100; re += (y-1)*365; for(i=0; i<Mo; i++ )re += m[i]; return re+= d; } int main (void) { t1 in[6] = { {2002, 1, 1}, {2002, 11, 4}, {2001, 5, 4}, {2000, 1, 20}, {1984, 6, 23}, {794, 1, 6}, }, ou[6] = { {2002, 1, 1 }, {2002, 11, 29}, {2002, 11, 5 }, {2000, 7, 21}, {2002, 10, 29}, {1981, 6, 24}, }; int y=0, n=0, d=0; int i=0, b=0, c=0; int t=0; int ri[6] = {1, 26, 551, 184, 6703, 433713}; int qws ; for(qws=0; qws<6; qws++) { // do { // t=0; // printf("From YY MM DD ?=>"); // scanf("%d%d%d", &y, &n, &d); // if( n-1 < M && d <= m[n-1] && d > 0 && n > 0 && y >= 0) // { // t++; // } else { // printf(" エラー発生!確認に迎え\n" ); // continue; // } // // printf("Until YY MM DD ?=>"); // scanf("%d%d%d", &c, &i, &b); // if( i-1 < M && b <= m[n-1] && b > 0 && i > 0 && c >= 0) // { // t++; // } else { // printf(" エラー発生!確認に迎え。。。。\n" ); // } // } while(t != 2); y = in[qws].ye, n = in[qws].mo, d = in[qws].da; c = ou[qws].ye, i = ou[qws].mo, b = ou[qws].da; t= 1 + ttl(i, b, c) - ttl(n, d, y); if(t>0) { printf(" %d日目", t); if(t != ri[qws]) { printf("\t<=Wrong.\n"); continue; } } else { printf("=> %d マイナスになっちゃったけどいける?\n", t); } // printf("\nTo Finish This Little Game, Ctrl + (Key)C is The Only Way... Ha! Ha! Ha! \n "); printf("\n"); } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/22 07:34

> これは大学のオプション課題についての質問なので、自分で考えてほしいと思っている方は > 「コメントなし」 > でお願いします。 なんか勘違いしているようなので↓を読んで出直してきてください https://teratail.com/help/question-tips#questionTips1
ZhenZeZhang

2018/12/22 07:46

大変失礼なコメントで申し訳ございません。 自分は正直投稿するときに言葉として適しているかどうかが疑っていました。 これを参考にして正しい文章に編集します。
guest

回答2

0

僕も同じ課題をやってみました。

C

1#include <stdio.h> 2 3// 日付型 4typedef struct { 5 int year, month, day; 6} date_t; 7 8// うるう年なら真を返す 9int isLeapYear(int year) { 10 return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; 11} 12 13// 西暦1年1月1日からの経過日数を返す 14int getDays(date_t dt) { 15 static const int mdays_common[] = { 16 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 17 }; 18 static const int mdays_leap[] = { 19 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 20 }; 21 const int* mdays = isLeapYear(dt.year) ? mdays_leap : mdays_common; 22 int yprev = dt.year - 1, 23 ydays = yprev * 365 + yprev / 4 - yprev / 100 + yprev / 400; 24 return ydays + mdays[dt.month - 1] + dt.day; 25} 26 27// エントリーポイント 28int main(void) { 29 const date_t dtFrom[] = { 30 {2002, 1, 1}, 31 {2002,11, 4}, 32 {2001, 5, 4}, 33 {2000, 1,20}, 34 {1984, 6,23}, 35 { 794, 1, 6}, 36 }; 37 const date_t dtTo[] = { 38 {2002, 1, 1}, 39 {2002,11,29}, 40 {2002,11, 5}, 41 {2000, 7,21}, 42 {2002,10,29}, 43 {1981, 6,24}, 44 }; 45 46 // 経過日数の算出 47 int len = sizeof(dtFrom) / sizeof(date_t); 48 for (int i = 0; i < len; i++) { 49 printf("%4d/%2d/%2d - %4d/%2d/%2d %6d days\n", 50 dtFrom[i].year, dtFrom[i].month, dtFrom[i].day, 51 dtTo[i].year, dtTo[i].month, dtTo[i].day, 52 getDays(dtTo[i]) - getDays(dtFrom[i]) + 1 ); 53 } 54 55 return 0; 56}

実行結果:

text

12002/ 1/ 1 - 2002/ 1/ 1 1 days 22002/11/ 4 - 2002/11/29 26 days 32001/ 5/ 4 - 2002/11/ 5 551 days 42000/ 1/20 - 2000/ 7/21 184 days 51984/ 6/23 - 2002/10/29 6703 days 6 794/ 1/ 6 - 1981/ 6/24 433713 days

投稿2018/12/22 15:52

編集2018/12/24 00:36
shozi3

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ZhenZeZhang

2018/12/23 08:27

構造体と条件分岐をより活用することでも問題を解決する方法があるのですね。:)以降この考え方を活用していきたいと思います!大切なアイデアに感謝します!
guest

0

ベストアンサー

ttlを直しました。
うるう年は400年に1回、100の倍数でもうるう年になります。(400年,800年はうるう年)
当年の月の加算は前月までです。

C

1int ttl( int Mo, int d, int y) 2{ 3 int i; 4 int re=0; 5 int zennen = y -1; 6 int year; 7 8 if(Mo >=3)re += (y/4); 9 else re += ((y-1)/4); 10 11 re -= y/100; 12 13 re += y/400; 14 15 re += (y-1)*365; 16 17 for(i=1; i<Mo; i++ )re += m[i-1]; 18 19 return re+= d; 20}

投稿2018/12/22 08:02

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ZhenZeZhang

2018/12/23 08:24

400年ごとにもうるう年になるのですね!(自分の調査不十分でした。感謝します。:))非常に大切な情報ありがとうございます!これで私もまたプログラマーに近づくことができました。
ZhenZeZhang

2018/12/23 08:29

自分が必要とする解決案の必要最小条件に満たしたのでベストアンサーとさせていただきます。(ほかの方のサポートも大変感謝いたします!)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問