外出自粛中でも楽しく過ごす!QAまとめ>>

以下のようにして変数の配列を使って、
月の日数を格納しています。
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

これを使って、
元旦から入力された月日の日数を計算したいのですが
どの様にすればいいですか?

例えば、

4月5日の場合は、
1月 31日
2月 28日
3月 31日
4月 5日

なので「95日」

----------------
途中までのプログラム
#include<stdio.h>

main(void)
{int yy, mm, dd;
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

printf( "西暦を入力しなさい" );
scanf( "%d", &yy );
printf( "月を入力しなさい" );
scanf( "%d", &mm );
printf( "日を入力しなさい" );
scanf( "%d", &dd );

/* うるう年判定 */
if (((yy%4==0)&&(yy%100!=0))||(yy%400==0)) mon[1]=29; else mon[1]=28;

A 回答 (2件)

要するに「配列にあるデータの合計を求める」のと同じなんだから, ふつうに考えれば for 文で足し込んでいくんでしょ~ね.

    • good
    • 2

当月の前まで足して+日


でいいんじゃないかと思います
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q日付の差分の求め方(日、分)

NT4WS+VC++6.0 Win32コンソールアプリで作ってます。
現在int型で
year1,month1,day1 year2,month2,day2
の様に、1と2それぞれ年月日を持っています。
(year2/month2/day2) - (year1/month1/day1)
と言った感じで1と2の差が何日かを求めたいのです。
VBで言うDateDiffみたいなことがやりたいのです。
よろしくお願いします。

Aベストアンサー

ANSI の範囲で考えると、difftime() という関数が利用できます。difftime() が
扱えるのは time_t 型で表した時刻なのですが、整数で表された年月日などを、この
time_t 型に変換する mktime() という関数と組合わせて使います。

こういうふうに使います。

#include <time.h>
#include <stdio.h>

int main()
{
  int year1, month1, day1;
  int year2, month2, day2;
  year1 = 2001; month1 = 12; day1 = 30;
  year2 = 2002; month2 = 1; day2 = 16;

  {
    struct tm d;
    time_t t1, t2;
    double diff;

    // 開始・終了日を time_t 型の変数にする
    memset(&d, 0, sizeof(d));
    d.tm_year = year1 - 1900;
    d.tm_mon = month1 - 1;
    d.tm_mday = day1;
    t1 = mktime(&d);
    d.tm_year = year2 - 1900;
    d.tm_mon = month2 - 1;
    d.tm_mday = day2;
    t2 = mktime(&d);

    diff = difftime(t2, t1);

    // difftime() の返り値は「秒」で double 型
    // ÷60÷60÷24 で日数にして、+0.5 は四捨五入のため
    printf("%d 日差.\n", (int)(diff / 60 / 60 / 24 + 0.5));
  }

  return 0;
}

ANSI の範囲で考えると、difftime() という関数が利用できます。difftime() が
扱えるのは time_t 型で表した時刻なのですが、整数で表された年月日などを、この
time_t 型に変換する mktime() という関数と組合わせて使います。

こういうふうに使います。

#include <time.h>
#include <stdio.h>

int main()
{
  int year1, month1, day1;
  int year2, month2, day2;
  year1 = 2001; month1 = 12; day1 = 30;
  year2 = 2002; month2 = 1; day2 = 16;

  {
    struct tm d;
...続きを読む

Q経過日数を調べたい

自分の誕生日から現在までの経過日数を算出するには、どういう関数を使ったらよいのでしょうか。
閏年の計算とかもあって、結構難しいプログラムですか?

Aベストアンサー

それほど難しくありません。

こんな方法はどうでしょうか。

まず、cftime(),mktime() 等で誕生日の日付情報をtime_t型に変換します。
その後、time()で、time_t型の現在時刻を取得します。
time_t型は、日本時間で1970年1月1日午前9時から何秒経ったかを表すもので、実体は通常long型です。

取得したそれぞれの値に32400(9時間の秒数)を足してから86400(1日の秒数)で割れば、日本時間で1970年1月1日から何日経過したかという値になりますから、あとは引き算するだけです。
(日本以外の場合は32400のところを変えてくださいね)

上記の関数は、#include <time.h> してから使ってくださいね。

QC言語でのカレンダー作成

今、C言語でカレンダーを表示させるプログラムを作成しています

西暦と月を入力すると、その年、その月の1ヶ月分のカレンダーが表示されるプログラムを作りました

そこで、次は入力した月から3ヶ月分のカレンダーを表示させるプログラムを作成したいのですが、どなたか教えてくださいませんか?

配列を使う方法や文字列など色々な方法があると伺って、どの方法が作りやすいのかわからないんです・・・

borland c を使用しています

Aベストアンサー

こんにちは。

前提として、作成するプログラムがコンソールアプリで、コンソール画面
にカレンダーを表示する場合ですが。。。
※以下は、あくまで一例です。

■縦方向に並べて表示する場合
※こちらは、#1さんの言われるように、単純に作成済みの1ヶ月カレンダー
 表示プログラムを、3回呼ぶだけで良いと思います。

1)既に作成済みのカレンダー表示を行うプログラムを関数化します。
  例)
  void DispMonth( int nYear, int nMonth );
   int nYear  : カレンダーの年
   int nMonth : カレンダーの月

2)入力された[年]、[月]を基準にして、forループなどで、[月]及び[年]を
  変えながら、1)の関数を呼出す。

 入力された[月]を中央にして、前後3ヶ月分のカレンダーを表示する場合、
 ================================================
 int nYear, nMonth;
 int m, nYY, nMM;
 nYear = 2010;  /* ←入力[年]とします */
 nMonth = 11;   /* ←入力[月]とします */
 /* 月単位のループ処理 */
 for ( m=nMonth-1; m<=nMonth+1; ++m ) {
   nYY = nYear;
   nMM = m;
   if ( nMM < 1 ) {
     nMM += 12;
     nYY--;
   }
   else if ( nMM > 12 ) {
     nMM -= 12;
     nYY++;
   }
   DispMonth( nYY, nMM );
   /* 必要であれば、ここで空白行などを出力し間隔を調整する */
 }
 ================================================
 のような処理になると思います。

■横方向に並べて表示する場合
※こちらの場合は、少し工夫が必要になります。

1)まず、作成済みのカレンダー表示を行うプログラムを組み直して、週単位
  (第1週~第6週)で表示を行う関数にします。
  例)
  void DispWeek( int nYear, int nMonth, int nWeek );
   int nYear  : カレンダーの年
   int nMonth : カレンダーの月
   int nWeek : 週単位のインデックス(1~6)
 ※出力の際、行末には改行を付加しないようにしておきます。
 ※週インデックスが、その月の週の数を越えた場合は、空白(スペース等)
  を出力するようにしておきます。

2)入力された[年]、[月]を基準にして、forループなどで、[月]、[年]、及び、
  [週のインデックス]を変えながら、1)の関数を呼出す。

 入力された[月]を中央にして、前後3ヶ月分のカレンダーを表示する場合、
 ================================================
 int nYear, nMonth;
 int m, nYY, nMM, nWeek;
 nYear = 2010;  /* ←入力[年]とします */
 nMonth = 11;   /* ←入力[月]とします */
 /* 必要であれば、ここで年、月、及び、曜日名などの表示を行う */
 ~~~
 /* 週単位のループ処理 */
 for ( nWeek=1; nWeek<=6; ++nWeek ) {
   /* 月単位のループ処理 */
   for ( m=nMonth-1; m<=nMonth+1; ++m ) {
     nYY = nYear;
     nMM = m;
     if ( nMM < 1 ) {
       nMM += 12;
       nYY--;
     }
     else if ( nMM > 12 ) {
       nMM -= 12;
       nYY++;
     }
     DispWeek( nYY, nMM, nWeek );
     /* 必要であれば、ここでスペースなどを出力し間隔を調整する */
   }
   /* ここで改行を出力する */
 }
 ================================================
 のような処理になると思います。

※GUIアプリの場合でも、基本的に月毎に表示位置をずらすようにすれば良い
 と思います。

以上です。

こんにちは。

前提として、作成するプログラムがコンソールアプリで、コンソール画面
にカレンダーを表示する場合ですが。。。
※以下は、あくまで一例です。

■縦方向に並べて表示する場合
※こちらは、#1さんの言われるように、単純に作成済みの1ヶ月カレンダー
 表示プログラムを、3回呼ぶだけで良いと思います。

1)既に作成済みのカレンダー表示を行うプログラムを関数化します。
  例)
  void DispMonth( int nYear, int nMonth );
   int nYear  : カレンダーの年
   int nMonth : カレン...続きを読む

QC言語の問題

自分の生まれた日から、今日までの生存日数を求めよ。(但し、うるう年なども計算するプログラム)という問題を提示されたのですが、ぜんぜんわかりません。どなたか上記プログラムがわかる方、ご教授お願いいたします。
#include<stdio.h>
int main(void)
{
int table1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
inttable2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int mm,dd,i,day=0;
/*(1)指定月日までの日数計算*/
do
{
printf("月>");
scanf("%d",&mm);
if(mm>=1 && mm<=12)break;
printf("月(%d)は誤りです。\n",mm);
}while(1);
do
{
printf("日>");
scanf("%d",&dd);
if(dd>=1 && dd<=table1[mm])break;
printf("日(%d)は誤りです。\n",dd);
}while(1);
for(i=1;i<mm;i++)
day += table1[i];
day += dd;
printf("1/1から%d/%d迄の日数は%d日です。\n",mm,dd,day);
return 0;
}
↑参考までにこんなプログラムでやっています。

自分の生まれた日から、今日までの生存日数を求めよ。(但し、うるう年なども計算するプログラム)という問題を提示されたのですが、ぜんぜんわかりません。どなたか上記プログラムがわかる方、ご教授お願いいたします。
#include<stdio.h>
int main(void)
{
int table1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
inttable2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int mm,dd,i,day=0;
/*(1)指定月日までの日数計算*/
do
{
printf("月>");
scanf("%d",&mm);
if(mm>=1 && mm<=12)break;
p...続きを読む

Aベストアンサー

No.3 の人に近い?ですが、1970年1月1日以降に生まれた人なら
次のようなものでもOKですよ。

#include <stdio.h>
#include <time.h>
void main( void )
{
int year = 0;
int mon = 0;
int day = 0;
time_t timer;
struct tm t;

/* 現在時刻の取得 */
time(&timer);

/* 自分の生年月日(年月日:19871231)を入力 */
scanf( "%4d%02d%02d" ,&year, &mon, &day );

memset( &t, 0, sizeof( struct tm ) );
t.tm_year = year - 1900;
t.tm_mon = mon - 1;
t.tm_mday = day;

/* 構造体を秒に変換 */
if( ( timer = mktime( &t ) ) == -1 )
{
printf( "生年月日が変です\n " );
exit( 0 );
}

/* 現在時刻との差分をとる */
timer = time( 0 ) - timer;

printf( "生存日数は %d 日です\n", timer / ( 24 * 60 * 60 ) );
}

No.3 の人に近い?ですが、1970年1月1日以降に生まれた人なら
次のようなものでもOKですよ。

#include <stdio.h>
#include <time.h>
void main( void )
{
int year = 0;
int mon = 0;
int day = 0;
time_t timer;
struct tm t;

/* 現在時刻の取得 */
time(&timer);

/* 自分の生年月日(年月日:19871231)を入力 */
scanf( "%4d%02d%02d" ,&year, &mon, &day );

memset( &t, 0, sizeof( struct tm ) );
t.tm_year = year - 1900;
t.tm_mon = mon...続きを読む

QC言語でシステム日付との差を求める

いつもお世話になっております。
C言語で以下のような処理を実現したいと思っているのですが
可能でしょうか。

「20091020」のような8桁の日付が文字列として格納されている
変数に対して、システム日付からどれくらい差があるか。

【例】
(1)システム日付が2009/10/19
(2)チェックしたい8桁の文字列="20091025"
(3)上記(1)、(2)を利用して、差が10~20の間の場合はNG!

といったことを実現したいです。

Aベストアンサー

お疲れ様です。
C言語で標準で規定されている関数のみで作成すると以下の通りになると思います。
(2038年問題等がありますが。。。)

#include<stdio.h>
#include<time.h>

int main()
{
time_t now,dat;
char *timedat = "20091030";
struct tm ts = {0};
double diff,nissuu;

/* 現在時刻の取得 */
now = time(NULL);

/* 日付をtime_tに変換 */
sscanf(timedat ,"%4d%2d%2d",&(ts.tm_year),&(ts.tm_mon),&(ts.tm_mday));
ts.tm_year -= 1900;
ts.tm_mon -= 1;
dat = mktime(&ts);

/* 差分算出 */
diff = difftime(dat, now);
nissuu = diff / (60*60*24);

}

お疲れ様です。
C言語で標準で規定されている関数のみで作成すると以下の通りになると思います。
(2038年問題等がありますが。。。)

#include<stdio.h>
#include<time.h>

int main()
{
time_t now,dat;
char *timedat = "20091030";
struct tm ts = {0};
double diff,nissuu;

/* 現在時刻の取得 */
now = time(NULL);

/* 日付をtime_tに変換 */
sscanf(timedat ,"%4d%2d%2d",&(ts.tm_year),&(ts.tm_mon),&(ts.tm_mday));
ts.tm_year -= 19...続きを読む

Qカレンダー作成

C言語初心者です。

西暦と月を入力してその月のカレンダーを作成するプログラムの問題なのですが

#include<stdio.h>

#define MMAX 12
#define COMP (year - 1)

int main(void)
{
 int i, j, year, month, day, youbi, ycnt, mcnt = 0;
 int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

 printf("西暦と月を入力して下さい-->");
 scanf("%4d%2d, &year, &month");

 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  mday[1] = 29;

 for (i = 0; i < [A]; i++) {
  mcnt += mday[i];
 }

 mcnt++;
 [B] = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;

 printf("\n%4d 年%2d 月\n", year, month);
 printf("----------------------------\n");
 printf(" 日 月 火 水 木 金 土\n");

 for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {
  printf("");
 }

 for (day =1; day <= mday[month - 1]; day++) {
  if ([C])
   printf("[%2d]", day);
  else
   printf(" %2d ", day);
  ycnt++;
  if ([D]) {
   printf("\n");
   ycnt = 0;
  }
 }
 return (0);
}

[A]、[B]、[C]、[D]に答えを入れなきゃいけないのですが私が考えた答えだと

カレンダーの表示すらされません。どこがいけないのでしょうか?

#include<stdio.h>

#define MMAX 12
#define COMP (year - 1)

int main(void)
{
 int i, j, year, month, day, youbi, ycnt, mcnt = 0;
 int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

 printf("西暦と月を入力して下さい-->");
 scanf("%4d%2d, &year, &month");

 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  mday[1] = 29;

 for (i = 0; i < month; i++) {
  mcnt += mday[i];
 }

 mcnt++;
 youbi = ((COMP + COMP / 4 - COMP / 100 + COMP / 400) + mcnt) % 7;

 printf("\n%4d 年%2d 月\n", year, month);
 printf("----------------------------\n");
 printf(" 日 月 火 水 木 金 土\n");

 for (j = 0, ycnt = 0; j < youbi; j++, ycnt++) {
  printf("");
 }

 for (day =1; day <= mday[month - 1]; day++) {
  if (youbi = 0)
   printf("[%2d]", day);
  else
   printf(" %2d ", day);
  ycnt++;
  if (youbi > 7) {
   printf("\n");
   ycnt = 0;
  }
 }
 return (0);
}

よろしくお願いします。

C言語初心者です。

西暦と月を入力してその月のカレンダーを作成するプログラムの問題なのですが

#include<stdio.h>

#define MMAX 12
#define COMP (year - 1)

int main(void)
{
 int i, j, year, month, day, youbi, ycnt, mcnt = 0;
 int mday[MMAX] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

 printf("西暦と月を入力して下さい-->");
 scanf("%4d%2d, &year, &month");

 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  mday[1] = 29;

 for (i = 0; i < [A]; i...続きを読む

Aベストアンサー

>カレンダーを作成するプログラムの問題なのですが

>  if ([C])
>   printf("[%2d]", day);
>  else
>   printf(" %2d ", day);

 うぅ~、難しい。
 質問者様のように、その月の朔日が日曜なら、全ての日に [] を付ける、というのもありそうだし・・。
 あと考えられるのは、特定曜日に [] を付ける、くらいかなぁ。

>カレンダーの表示すらされません。どこがいけないのでしょうか?

 年月の取得で、

  scanf("%4d%2d, &year, &month"); はマズイです。
  scanf("%4d%2d", &year, &month); です。

 あと、1週間が8日になっています。#1 さんが指摘した

  if (youbi > 7) { は、 if( ycnt > 6 ){ です。

 些末
   for( j = 0, ycnt = 0; j < youbi; j++, ycnt++) {
     printf("");
   }
   ↓ j は不要です
   for( ycnt = 0; ycnt < youbi; ycnt++ ){
     printf( " .. " );
   }
  (投稿すると、連続する空白は1つになるので、.. 使用)

脱線
それにつけても、年寄りは日曜から始まるカレンダーはどうも苦手です。
週末が週の頭にあるなんて・・。
  http://www.nhk.or.jp/bunken/research/kotoba/kotoba_qq_04040101.html

>カレンダーを作成するプログラムの問題なのですが

>  if ([C])
>   printf("[%2d]", day);
>  else
>   printf(" %2d ", day);

 うぅ~、難しい。
 質問者様のように、その月の朔日が日曜なら、全ての日に [] を付ける、というのもありそうだし・・。
 あと考えられるのは、特定曜日に [] を付ける、くらいかなぁ。

>カレンダーの表示すらされません。どこがいけないのでしょうか?

 年月の取得で、

  scanf("%4d%2d, &year, &month"); はマズイです。
  scanf("%4d%2d", &year...続きを読む

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

Q2038年問題 日付算出

2038年問題で困っています。
指定した日付から指定した日数後および前(マイナス日数)の日付を取得するCのプログラムがあります。
これまでmktime関数をして算出していましたが、2038年以降の日付を指定するとエラーになるようです。
上記関数をmktime関数を使用せず自前で作成しないといけないのですが、どう作っていいか思いつきません。どなたか参考になるようなサイト、およびサンプルプログラムがあれば教えていただきたいと思っています。
よろしくお願いします。

Aベストアンサー

★アドバイス
・一般的に次の方法を取ります。
 (1)年月日を西暦1年1月1日からの経過日数に変換
 (2)経過日数に(期間の)日数を加算/減算
 (3)西暦1年1月1日からの経過日数を年月日に変換
 このうち(3)が最も面倒な作業になります。多分。
 下に(3)だけですがサンプルを載せておきます。

サンプル:
// 閏年の判定
int isLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;
 if ( !(year % 400) ) return 1;
 if ( !(year % 100) ) return 0;
 return !(year & 0x3);
}

// 経過日数から年月日を求める
int sample3( int days, int *year, int *month, int *day )
{
 static int table[ 13 ] = {
  0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
 }; int Y, M, D, ddd;
 
 // [日]コピー
 D = days;
 // [年]算出
 for ( Y = 1 ; D > (ddd = (isLeapYear(Y) ? 366 : 365)) ; Y++ ){
  D -= ddd;
 }
 // [月]算出
 table[ 2 ] = ((ddd == 365) ? 28 : 29);
 for ( M = 1 ; D > table[M] ; M++ ){
  D -= table[ M ];
 }
 // セット
 *year = Y;
 *month = M;
 *day = D;
 return days % 7; // 曜日を返す(0-6)
}

その他:
・上記のソースは『経過日数を年月日に変換』する考え方のサンプルです。
 そのため計算スピードが低速で実用にはなりません。
 その代わりに正しく変換してくれます。
 答え合わせようの関数です。
・実際に利用するためには『年の算出』を除算と剰余を使って計算させます。
 考え方は
 (1)経過日数から3200年間の日数(1168776日)を幾つ引けるかを除算で求める。
 (2)(1)のあまりの経過日数から400年間の日数(146097日)を幾つ引けるかを除算で求める。
 (3)(2)のあまりの経過日数から100年間の日数(36524日)を幾つ引けるかを除算で求める。
 (4)(3)のあまりの経過日数から4年間の日数(1461日)を幾つ引けるかを除算で求める。
 (5)(4)のあまりの経過日数から1年間の日数(365日)を幾つ引けるかを除算で求める。
 (6)(1)-(5)までで求めた除算の商と年数を掛けて加算すると『年』が求まる。
 (7)(5)のあまりが年内の1月1日からの通算日数となります。これを『月』『日』に分ける。
・詳しい解説などは下の『参考URL』をどうぞ。
 そこで紹介している『経過日数から年月日と曜日を求める』なら実用的なスピードで
 計算してくれます。ただし有効範囲は3199年までです。3200年以降は1日ずつずれます。
 これは3200年以降の閏年を考慮していないためです。でも誤差1日ですが。
・以上。

参考URL:http://cl.is.kyushu-u.ac.jp/Literacy/PP/H14/adp/program/date.html

★アドバイス
・一般的に次の方法を取ります。
 (1)年月日を西暦1年1月1日からの経過日数に変換
 (2)経過日数に(期間の)日数を加算/減算
 (3)西暦1年1月1日からの経過日数を年月日に変換
 このうち(3)が最も面倒な作業になります。多分。
 下に(3)だけですがサンプルを載せておきます。

サンプル:
// 閏年の判定
int isLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;
 if ( !(year % 400) ) return 1;
 if ( !(year % 100) ) return 0;
 return !(year & 0x3);
}

// 経...続きを読む

Qカレンダープログラム、曜日の出力について。

西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。
過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。
プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。
forやifの条件の記述がおかしいのでしょうか?
なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。
始めのgetsの所はあえてです。
#include<stdio.h>
#include<stdlib.h>

int main(void)

{
char ss[9],cop1[5],cop2[3],cop3[3];

int year,manth,day,aa,cc,i,f;

gets(ss);

ss[8] = 0;
cop1[4] = 0;
cop2[2] = 0;
cop3[2] = 0;

for(i = 0;i <= 3;i++){
cop1[i] = ss[i];
}
for(i = 0;i <= 1;i++){
cop2[i] = ss[i+4];
}
for(i = 0;i <= 1;i++){
cop3[i] = ss[i+6];
}
year = atoi(cop1);
manth = atoi(cop2);
day = atoi(cop3);

printf("%d年%d月%d日",year,manth,day);

for(f = 1900; f <= year; f++){  //閏年か平年で日数を変える
if((year%4) == 0 && year != 1900){
aa += 366;
}
else{
aa += 365;
}
}
if((year%4) == 0 && manth >= 3 ){//閏年かつ3月以降日数+1
aa += 1;
}

switch(manth){
case 1:
cc = (aa + day)%7;
break;
case 2:
cc = (aa + 31 +day)%7;
break;
case 3:
cc = (aa + 59 +day)%7;
break;
case 4:
cc = (aa + 90 +day)%7;
break;
case 5:
cc = (aa + 120 +day)%7;
break;
case 6:
cc = (aa + 151 +day)%7;
break;
case 7:
cc = (aa + 181 +day)%7;
break;
case 8:
cc = (aa + 212 +day)%7;
break;
case 9:
cc = (aa + 243 +day)%7;
break;
case 10:
cc = (aa + 273 +day)%7;
break;
case 11:
cc = (aa + 304 +day)%7;
break;
case 12:
cc = (aa + 334 +day)%7;
break;
}
switch(cc){
case 1:
printf(" (月)");
break;
case 2:
printf(" (火)");
break;
case 3:
printf(" (水)");
break;
case 4:
printf(" (木)");
break;
case 5:
printf(" (金)");
break;
case 6:
printf(" (土)");
break;
case 0:
printf(" (日)");
break;
}

return 0;

}

西暦、月、日(1900年1月1日以降対象)を入力して、曜日を求めるプログラムを考えています。
過去の質問なども参考にしたんですが、プログラムがうまく動かず困っています。
プログラム中コメントの日数を変える辺りに不備があるかと思い色々試しましたが、曜日がずれてしまいますし開始1900年1月1日も月曜なのに水曜と出力されます。
forやifの条件の記述がおかしいのでしょうか?
なにか根本的な所が欠如しているのでしょうか、回答をよろしくお願いします。
始めのgetsの所はあえてです。
#include<stdio...続きを読む

Aベストアンサー

★追記。
・質問者さんのソースを元に書き直してみました。
 参考にして下さい。

#include <stdio.h>

// break 付きのキーワード
#define CASE  break;case
#define DEFAULT  break;default

// 西暦から閏年の判定
int FuncIsLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;  // 平年(3200で割れる年)
 if ( !(year % 400) ) return 1;  // 閏年(400で割れる年)
 if ( !(year % 100) ) return 0;  // 平年(100で割れる年)
 if ( !(year % 4) ) return 1;  // 閏年(4で割れる年)
 return 0;       // 平年(それ以外の年)
}

// メイン関数
int main( void )
{
 static const char *table[] = { "日", "月", "火", "水", "木", "金", "土" };
 // 宣言
 int year = 0;
 int month = 0;
 int day = 0;
 int week = 0;
 // カウンタ
 int days;
 int i;
 
 // 年月日の入力
 scanf( "%04d/%02d/%02d", &year, &month, &day );
 // 1900年以降の日数を数える
 for ( days = 0, i = 1900 ; i < year ; i++ ){
  days += (FuncIsLeapYear(i) ? 366 : 365);
 }
 // 1月1日から日数を加える
 switch ( month ){
  CASE 1: days += 0;
  CASE 2: days += 31;
  CASE 3: days += 31 + 28;
  CASE 4: days += 31 + 28 + 31;
  CASE 5: days += 31 + 28 + 31 + 30;
  CASE 6: days += 31 + 28 + 31 + 30 + 31;
  CASE 7: days += 31 + 28 + 31 + 30 + 31 + 30;
  CASE 8: days += 31 + 28 + 31 + 30 + 31 + 30 + 31;
  CASE 9: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
  CASE 10: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
  CASE 11: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
  CASE 12: days += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
 }
 // 3月以降で閏年なら+1日
 if ( (month >= 3) && FuncIsLeapYear(year) ){
  days++;
 }
 // 入力した日付を加える
 days += day;
 // 曜日の計算
 week = (days % 7);
 // 表示
 printf( "year = %d\n", year );
 printf( "month = %d\n", month );
 printf( "day = %d\n", day );
 printf( "week = %s\n", table[week] );
 return 0;
}
以上。

★追記。
・質問者さんのソースを元に書き直してみました。
 参考にして下さい。

#include <stdio.h>

// break 付きのキーワード
#define CASE  break;case
#define DEFAULT  break;default

// 西暦から閏年の判定
int FuncIsLeapYear( int year )
{
 if ( !(year % 3200) ) return 0;  // 平年(3200で割れる年)
 if ( !(year % 400) ) return 1;  // 閏年(400で割れる年)
 if ( !(year % 100) ) return 0;  // 平年(100で割れる年)
 if ( !(year % 4) ) return 1;  // ...続きを読む

Q西暦・月からカレンダーを表示

問題文
西暦・月を入力してカレンダーを表示するプログラムを作成せよ。

プログラム全体のことを考える。プログラムの流れとしては、つぎのようになるであろう。
 (1)変数の宣言: プログラムの中で使う変数や配列等をすべてここに集めておく。        
 (2)入力: キーボードから、西暦年の値を読み取る ← scanf( ) 関数
 1月から12月まで、以下を繰り返す。
 (3)カレンダーの年・月の表示: (例えば、2008年1月 と表示)
 (4)各曜日名の表示: 「日 月 火 水 木 金 土」と表示
 (5)月の日数の算出: 月の最後の日を計算しておく。(*1~12月以外では誤りとすること)
 (6)曜日の算出: 月の初めの日(ついたち)の曜日をツェラー公式で計算しておく。
 (7)空列の表示: ついたちの前の空白部分を表示する ← for文 を利用。
 (8)各日の表示: 月の各日を順に表示していく ← for文を利用
         (土曜の後に改行を入れる)

#include <stdio.h>

int leapYear(int year)
{
if (year%400==0||(year%4==0 && year%100!=0))
{
return 1;
}
else
{
return 0;
}
}
int main(void)
{

int d,year,m,i;
int day[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; /*1~12月までの各月の日数*/

printf("西暦を入力してください:");
scanf("%d",&year);
printf("月を入力してください:");
scanf("%d",&m);
if(m!=1 & m!=2 & m!=3 & m!=4 & m!=5 & m!=6 & m!=7 & m!=8 & m!=9 & m!=10 & m!=11 & m!=12)/*1~12月以外で日数を出そうとした場合*/
{
printf("入力が誤っています。やりなおしてください。\n");
}
else{
if (leapYear(year)==1)/*閏年の場合*/
{
printf("%d年は閏年です。\n",year);
day[1] +=1;
}

else/*閏年でない場合*/
{
printf("%d年は閏年ではありません。\n",year);
}
i = (year+year/4 -year/100 +year/400 + ( 13*m+8 )/5 + 1) % 7; /*西暦~年・1~12月の1日の曜日について考える*/

printf("日 月 火 水 木 金 土\n");

(7)・・・
(8)・・・

}
return 0;
}

手順に沿ってやっていく課題なのですが(7)、(8)の部分の表現の仕方が良く分かりません。(求めた月の日数をカレンダー形式に表示する方法・1日の前に空白を入れる等)
過去の質問も見たのですが、いまいち理解できず・・・orz
どなたかご教授お願いできないでしょうか・・・。

問題文
西暦・月を入力してカレンダーを表示するプログラムを作成せよ。

プログラム全体のことを考える。プログラムの流れとしては、つぎのようになるであろう。
 (1)変数の宣言: プログラムの中で使う変数や配列等をすべてここに集めておく。        
 (2)入力: キーボードから、西暦年の値を読み取る ← scanf( ) 関数
 1月から12月まで、以下を繰り返す。
 (3)カレンダーの年・月の表示: (例えば、2008年1月 と表示)
 (4)各曜日名の表示: 「日 月 火 水 木 金 土」と表示
 (...続きを読む

Aベストアンサー

>(7)、(8)の部分の表現の仕方が良く分かりません。

 難しく考えていませんか。

 ・朔日の前に空白
 ・土曜( 6 )出力後改行

 だけですよね。
-------------------------------------
  i01Youbi = Zeller( year, m ); // 0-6

  for( i = 0; i < i01Youbi; i++ ) printf( "___" ); // 朔日の前に空白3つ▼×必要分(投稿上 _ としています)

  for( i = 1; i <= day[ m - 1 ]; i++ ){

    printf( "%3d", i ); // 3桁▲上と同じに

    if( 6 == ( ( i - 1 + i01Youbi ) % 7 ) ) printf( "\n" ); // 土曜出力後改行
  }
  printf( "\n" );
 (インデントに全角空白使用)
-------------------------------------
>day[ 1 ] += 1; 確かに 29 になるのですが、

 day[ 1 ] = 29; とした方が・・(今回はOKですが・・やがて?)。

>(7)、(8)の部分の表現の仕方が良く分かりません。

 難しく考えていませんか。

 ・朔日の前に空白
 ・土曜( 6 )出力後改行

 だけですよね。
-------------------------------------
  i01Youbi = Zeller( year, m ); // 0-6

  for( i = 0; i < i01Youbi; i++ ) printf( "___" ); // 朔日の前に空白3つ▼×必要分(投稿上 _ としています)

  for( i = 1; i <= day[ m - 1 ]; i++ ){

    printf( "%3d", i ); // 3桁▲上と同じに

    if( 6 == ( ( i - 1 + i01Youbi...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング