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

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

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

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

Q&A

解決済

4回答

1783閲覧

C言語について プログラミング

pro08

総合スコア1

C

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

0グッド

2クリップ

投稿2020/06/15 05:23

編集2020/06/15 07:58

前提・実現したいこと

C言語でキーボードから入力した日付の、次の日付を表示させたいです
閏年は、考えていません

発生している問題・エラーメッセージ

エラーは表示されなかったのですが、キーボード入力した日付がそのまま明日の日付として表示されてしまいます

### 該当のソースコード #include<stdio.h> void tomorrow(int *y, int *m, int *d) { int day[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //各月の最終日のテーブル if(*d==day[*m]){ *d=1; //月末だった場合、1日に戻して、月を1増やす *m++; if(*m==12){ *m=1; //年末の場合 *y++; }else{ *d++; //それ以外 } } } int main(void) { int year1, year2; int month1, month2; int day1, day2; printf("本日の日付を入力してくだい\n"); printf("年 月 日\n"); scanf("%d %d %d", &year1, &month1, &day1); year2=year1; month2=month1; day2=day1; tomorrow(&year2, &month2, &day2); printf("明日の日付 : %d 年 %d 月 %d 日\n", year2, month2, day2); return 0; } ```C C言語

試したこと

月末処理や関数の中身など、色々と変更して試したのですが、正しく出力できませんでした。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答4

0

[低評価は覚悟の上] こんな回答は求められていない(よね?)

C

1#define _CRT_SECURE_NO_WARNINGS /* desable C4996 (for VC++) */ 2#include <stdio.h> 3#include <time.h> // mktime, gmtime 4#include <stdlib.h> 5#include <string.h> // memset 6 7void tomorrow(int* y, int* m, int* d) { 8 struct tm today; 9 memset(&today, 0, sizeof(struct tm)); 10 today.tm_hour = 9; /* ちょっとズルした^^; */ 11 today.tm_year = *y - 1900; 12 today.tm_mon = *m - 1; 13 today.tm_mday = *d; 14 time_t t = mktime(&today) + 3600*24 ; // 一日後(3600*24秒後) 15 struct tm* tomorrow = gmtime(&t); 16 *y = tomorrow->tm_year + 1900; 17 *m = tomorrow->tm_mon + 1; 18 *d = tomorrow->tm_mday; 19} 20 21 22int main(void) { 23 int year = 2020; 24 int month = 2; 25 int day = 29; 26 27 printf("今日の日付 : %d 年 %d 月 %d 日\n", year, month, day); 28 tomorrow(&year, &month, &day); 29 printf("明日の日付 : %d 年 %d 月 %d 日\n", year, month, day); 30 31 return 0; 32}

投稿2020/06/15 07:18

episteme

総合スコア16614

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

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

0

ベストアンサー

if(*d==day[*m]){

まずこの条件に一致しない限り何も処理が行われないのが問題。

あとday配列は0オリジンなので、月で参照するときはday[*m-1]とする必要がある。
もしくはday[13]として、day[0]はダミーにするか。

投稿2020/06/15 05:32

ttyp03

総合スコア16998

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

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

0

if(*d==day[*m]){

この条件が成立してない場合、なにもしないでリターンしてしまいますね

投稿2020/06/15 05:29

y_waiwai

総合スコア87749

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

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

0

表検索(table lookup) の配列には static を付けましょう。
そうでないと、int day[12]; a[0] = 31; a[1] = 28; ... a[11] = 31; という
コードに展開されてしまいます。

&& を使って書くと、

C

1void tomorrow(int *y, int *m, int *d) 2{ 3 static int day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; 4 ++*d > day[*m - 1] && (*d = 1, ++*m > 12) && (*m = 1, ++*y); 5}

&& の代わりに if文を使えば、

C

1 if (++*d > day[*m - 1]) { 2 *d = 1; 3 if (++*m > 12) { 4 *m = 1; 5 ++*y; 6 } 7 }

投稿2020/06/15 11:21

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問