ただいま、C言語に苦戦中です。教えてください
2001年の月日の入力データから、曜日を求めるプログラム。
(実行結果例)
月を入力してください: 9↓
日を入力して下さい : 15↓

9月15日は土曜日です。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

またまたarthurです。



1月~12月までの各月の日数を12コの配列に入れ、
1月から入力してもらった月の1つ前の月までの日数を合計します。
例)9月と入力された場合
1月の日数(31日)+2月の日数(28日)+・・・+8月の日数(31日)
さらに入力された日にち分を加算します。
例)15日と入力された場合
1月~8月の合計日数+15日
その合計の値をさらに7(1週間=7日)で割ります。
7で割った余りの数字によって曜日を割り当てます。
1月1日(月)が最初なので、余りが1の時月曜日とすると、余りが2の時は・・・

と、まぁ、ヒントはここまでです^^;
後は自分の力でがんばってください。
    • good
    • 0
この回答へのお礼

ヒントありがとうございます。只今製作中です。しかしエラーが多くなかなか進みませんがarturさんのおかげで
ずいぶん進むことができました。

お礼日時:2001/01/24 20:31

月と日だけではわかりませんので、年(西暦)も入力できるようにして


以下のURLを見てください。
EXCELで確認したところ完璧でした。

参考URL:http://www.top.or.jp/~cpop/sitiyo.htm
    • good
    • 0
この回答へのお礼

ホームページ参考にさせていただきました!

お礼日時:2001/01/24 20:37

宿題の回答としては、



1.ある基準日(例えば1900/01/01)の曜日を調べておいて、その日から何日たっているかを閏年も考慮して計算して、7で割って計算する。

2.Zellerの公式を利用する。

の2つがあります。
演習問題としては、1が正しいアプローチのような気がしますが、Zellerの公式も紹介しておきます。

式は下記のようになります。intは、小数点以下切り捨てmodは剰余を求めます。

( [日] + int( ( [月] + 1 ) * 26 / 10 )
+ [年の下2桁] + int([年の下2桁]/4) + int([年の上2桁]/4) - 2*[年の上2桁] ) mod 7

※但し[月]が1月,2月の場合は「前年の13月、14月」として計算します。

むかし、むかし買ったPascalの自習書に乗っていました。

そうそう、Zellerの公式の結果は、土曜日が0になります。
    • good
    • 0
この回答へのお礼

7で割るやり方でやってみます(^o^)。これで完成に近づきそうです。

お礼日時:2001/01/24 20:36

【ヒント】


time.h関連を探してみましょう。

課題は極力自力で調査しましょう!
    • good
    • 0
この回答へのお礼

そのとおりです。皆さんにいただいたヒントを元に、だいぶ進みました、あと1歩というところです。

お礼日時:2001/01/25 13:40

あまり良い方法とは思っていませんが私は次のような方法を使っています。


これはWindowsでしか使えないのでご了承あれ。

SYSTEMTIME構造体の年、月、日その他もろもろを、代入ます。
それでSystemTimeToFileTime関数に渡してFILETIMEに変換します。
そのとき、曜日を指定してあっても無視されます。
得られたFILETIMEをFileTimeToSystemTime関数に渡して、再度SYSTEMTIMEに変換すれば、正しい曜日が入っていると言うわけです。
詳しくはSystemTimeToFileTime関数とFileTimeToSystemTime関数のヘルプを見ましょう。
    • good
    • 0
この回答へのお礼

細かく書いてくださりありがとうございます。なんだかとても高度なものに思われますが、ヘルプを参照してみます。

お礼日時:2001/01/25 14:21

このQ&Aに関連する人気のQ&A

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

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

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

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

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(C言語)西暦年月日を入力して、その日の曜日を表示させるプログラムを試したのですが…

西暦年月日を入力して、その日の曜日を表示させるプログラムを作りたいのですが、とりあえず、やってみましたが…

int main(void)
{

int i,y,m,d,dy,dw;

int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

printf("Year?");

scanf("%d",&y);

printf("Month?");

scanf("%d",&m);

printf("Day?");

scanf("%d",&d);

for(i=0;i<=m-1;i++){
dy = d + D[i] ;
}

if(m>=3){
if(y % 4 == 0){
if(y % 400 == 0){
dy = dy + 1 ;
}
else if(y % 100 ==0){
dy = dy ;
}
else{
dy = dy + 1 ;
}
}

else if(y % 4 == 1 || y % 4 == 2 || y % 4 == 3 ){
dy = dy ;
}
}
dw = (dy -1 + ( y + ( y - 1 )/4 - ( y - 1 )/100 + ( y - 1 )/400))%7 ;

if (dw == 0) printf("Sunday\n");
else if (dw == 1) printf("Monday\n");
else if (dw == 2) printf("Tuesday\n");
else if (dw == 3) printf("Wednesday\n");
else if (dw == 4) printf("Thursday\n");
else if (dw == 5) printf("Friday\n");
else if (dw == 6) printf("Saturday\n");

return 0 ;

}
このプログラムを各年の1月1日~2月28日で試してみると、うまくいくのですが、3月1日に入るとなぜかうまく働いてくれません。(ちなみに2005年の11月では偶然うまくいっています。)その理由が分からないのでどなたか教えてください。ちなみに、この一連のプログラムを行うにはもっと簡単に行える関数というかコマンド?みたいなものがあるようですが、基本的に各年の1月1日を、
(y+(y-1)/4-(y-1)/100+(y-1)/400)%7で(0:Sunday~)、同年の○月○日は1月1日から△日経過しているという考え方で、曜日を割り出すプログラムにしなければならないといけないので、注文が多いですがよろしくお願いします。

西暦年月日を入力して、その日の曜日を表示させるプログラムを作りたいのですが、とりあえず、やってみましたが…

int main(void)
{

int i,y,m,d,dy,dw;

int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

printf("Year?");

scanf("%d",&y);

printf("Month?");

scanf("%d",&m);

printf("Day?");

scanf("%d",&d);

for(i=0;i<=m-1;i++){
dy = d + D[i] ;
}

if(m>=3){
if(y % 4 == 0){
if(y % 400 == 0){
dy = dy + 1 ;
}
else if(y % 100 ==0){
dy = dy ;
}
e...続きを読む

Aベストアンサー

プログラムのおかしいところについては#1の回答のとおりです。
したがって、
>int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
これを
>int D[]={0,31,59,90,120,151,181,212,243,273,304,335};
>//各月の前月までの年初からの日数
として、
>for(i=0;i<=m-1;i++){
> dy = d + D[i] ;
>}

>dy = d[m-1] + d;
とするという解法もあります。あらかじめ足しておいてはいけないということはないでしょう。

ただ、標準関数に日付の関数はあります。
もちろん制限はあって、time_tのサイズが32bit(=signed long int)の場合、1901年12月14日05:45:52~2038年1月19日12:14:07の間だけが正常に動作するようになっていますし、上記のアルゴリズムとは違って1970年1月1日00:00:00を基準とした秒数をもとにして計算しているため、今回は利用できませんね。

ところで、
> ちなみに2005年の11月では偶然うまくいっています。
の理由について回答が出ていませんが、それは、2005年1月と2005年10月がたまたま同じ曜日で始まっていてかつ、1月と10月が同じ日数(31日)だからです。

プログラムのおかしいところについては#1の回答のとおりです。
したがって、
>int D[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
これを
>int D[]={0,31,59,90,120,151,181,212,243,273,304,335};
>//各月の前月までの年初からの日数
として、
>for(i=0;i<=m-1;i++){
> dy = d + D[i] ;
>}

>dy = d[m-1] + d;
とするという解法もあります。あらかじめ足しておいてはいけないということはないでしょう。

ただ、標準関数に日付の関数はあります。
もちろん制限はあって、time_tのサイズが32bit...続きを読む

Q入力した日は何曜日か

入力した日が何曜日か出したいのですがどうしても曜日が一日ずれてしまいます。どこが悪いのかアドバイスお願いします

#include<stdio.h>

int main() {

int iyear,imonths,iday;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};

sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&iyear,&imonths,&iday);

/*閏年の判定*/
for(i=1;i<year;i++){
if((year%4==0)&&((year%100!=0))||(year%400==0)){
sum++;
i++;
}
year--;

/*前月までの日数*/
for (i =0; i < imonths-1; i++) {
sum += m_array[i];
}

year++;

sum=sum+day;
//曜日の出力
printf("%s曜日",cweek[sum%7]);
return 0;
}
}

入力した日が何曜日か出したいのですがどうしても曜日が一日ずれてしまいます。どこが悪いのかアドバイスお願いします

#include<stdio.h>

int main() {

int iyear,imonths,iday;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};

sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&iyear,&imonths,&iday);

/*閏年の判定*/
for(i=1;i<year;i++){
if((year%4==0)&&((ye...続きを読む

Aベストアンサー

私も Zeller の公式をお勧めしますが, このプログラムだと「少なくとも閏年の 2月28日までか 3月1日以降かのいずれかはおかしくなる」はずです. 曜日を出力する直前で sum の値を見てみればわかると思いますが, 例えば 2008/2/29 と 2008/3/1 が同じ値になりますね.

Q日付から曜日を求めたい

Windows APIでプログラミングしています。時間のデータはSYSTEMTIMEを使ってます。

日付(wYear, wMonth, wDay)のみの情報から、曜日(wDayOfWeek)を求めたいのですが、どのような方法があるでしょうか?曜日を求めるAPI関数は存在しますか?

Aベストアンサー

曜日が入っていない状態のSYSTEMTIMEからSystemTimeToFileTimeでFILETIMEに変換し、
FileTimeToSystemTimeでSYSTEMTIMEに戻せば、曜日が入った状態になります。

Q曜日の計算方法

昔、算数で勉強した記憶があるけど、何年後、何年前の何年何月何日の曜日の計算方法は?あと何年後、何年前の何日は今日から何日の計算方法は?もう52歳で忘れましたので教えて下さい

Aベストアンサー

こんばんは。

曜日に数字を当てはめます。
0=日 1=月 2=火 3=水 4=木 5=金 6=土

1年は、うるう年でなければ、365日です。
これを7で割ると、
365 ÷ 7 = 52 あまり 1
この、「あまり1」がポイントです。
つまり、ちょうど1年後の同じ日付の曜日は、1つ進んだものになります。
そして、2年後ならば2つ進み、3年後なら3つ進みます。
ただし、その間に(うるう年の)2月29日がはさまっていると、もう1つ余計に進みます。

ですから、
今年のカレンダーを持っていて、6月29日が月曜日だとわかるならば、
x年後の6月29日の曜日は、
x年後の6月29日の曜日 = (1 + x + 間にはさまる2月29日の回数)を7で割ったあまり

y年前の6月29日の曜日は、
y年前の6月29日の曜日 = (1 - y + 間にはさまる2月29日の回数)を7で割ったあまり
(かっこの中がマイナスになってしまう場合は、かっこの中に適当な7の倍数を足す)

また、今年のカレンダーでは、12月31日は木曜なので、
x年後の6月29日の曜日は、
x年後の6月29日の曜日 = (4 + x + 間にはさまる2月29日の回数)を7で割ったあまり

y年前の12月31日の曜日は、
y年前の12月31日の曜日 = (4 - y + 間にはさまる2月29日の回数)を7で割ったあまり
(かっこの中がマイナスになってしまう場合は、かっこの中に適当な7の倍数を足す)


すべての日付についての公式を作るためには、元旦から大晦日までに1から365までの通し番号をつけることになりますが、
うるう年の場合は3月1日以降の曜日がずれますし、
また、うるう年は4年に1度ではありません。
・西暦年が100で割り切れる年は平年
・西暦年が400で割り切れる年はうるう年 ←9年前がこれでした

ですから、式が複雑すぎて、あまり実用的ではないです。

間違えないで計算したい場合は、表計算(Excelなど)で求めるのがよいと思います。


以上、ご参考になりましたら幸いです。

こんばんは。

曜日に数字を当てはめます。
0=日 1=月 2=火 3=水 4=木 5=金 6=土

1年は、うるう年でなければ、365日です。
これを7で割ると、
365 ÷ 7 = 52 あまり 1
この、「あまり1」がポイントです。
つまり、ちょうど1年後の同じ日付の曜日は、1つ進んだものになります。
そして、2年後ならば2つ進み、3年後なら3つ進みます。
ただし、その間に(うるう年の)2月29日がはさまっていると、もう1つ余計に進みます。

ですから、
今年のカレン...続きを読む

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 : カレン...続きを読む

Q万年カレンダーのC言語プログラムを教えてください

西暦年と月を入力すると、その年月のカレンダーが出てくる万年カレンダーのC言語プログラムを教えてください!お願いします!

Aベストアンサー

>ありがとうございます。さっそくプログラムを動かしてみました。でも第一週と第二週の日付がうまくつながっていないです。これはどうしてでしょうか?

ごめんなさい。
htmlの半角スペースを連続して書くと1個にされてしまう事を忘れていました。
下から7行目の
printf(" ");
の半角スペース1個は半角スペース3個にしてください。

Q何月何日は何曜日?の計算

2002年4月のカレンダーは
1日が月曜日でした。
では、2002年10月1日は何曜日ですか?
また2002年9月の最初の日曜日は何日ですか?

このとき方を教えてください。
小学生向け(中学受験)に教えてください。
よろしくおねがいします。

Aベストアンサー

『前提条件』
1月から12月まではそれぞれの月に何日存在するかは覚えてる必要があります。
『にしむくさむらい』とかご存知ないですか?
(2(に),4(し),6(む),9(く),11(さむらい))
と言う具合に、31日ない月が覚えられます。
2月は28日しかないですけど、それ以外の4,6,9,11月は30日ありますよね。


『問題』について

(1)2002年10月1日は何曜日?

4/1から10/1までは
 30日(4月)+31日(5月)+30日(6月)+31日(7月)+31日(8月)+30日(9月)=183日
存在し、
183/7=26 あまり1 なので、
10/1は、4/1からみると、26週間プラス1日後
4/1の26週間後の9/30(10/1の前日)は4/1と同じ月曜日なので10/1は火曜日。

(2)9月の最初の日曜は何日?

先ほどと同様にして9/1が何曜日かわかれば、
そこから何日かたてば最初の日曜がくるはず。

4/1からみると9/1は
183日-30日(9月分)=153日。
153/7=21あまり6 なので
4/1から21週間後の、9/1の6日前(8/26)は月曜日。
だから、8/26日の6日後の、9月1日は日曜日です。
というわけで、9月最初の日曜日は9月1日。

今回は偶然9月1日が日曜でしたが、
かりに、9月1日が水曜日だとしたらそこから4日進めれば
最初の日曜日はわかりますね。

【1週間が7日から構成されているので1週間後(7日後)は同じ曜日】
というのがポイントです。
ちなみに、1年が365日だから 365/7=52あまり1なので
1年後はうるう年をはさまなければ一つ曜日がずれるだけです。
2003年の4/1は火曜日。

『最後に・・・』
こういう種類の問題は、うるう年をはさんで聞いてきたりするので
注意が必要です。いくつか類題を練習すれば問題なく解けるように
なると思います。

では、頑張ってください。

『前提条件』
1月から12月まではそれぞれの月に何日存在するかは覚えてる必要があります。
『にしむくさむらい』とかご存知ないですか?
(2(に),4(し),6(む),9(く),11(さむらい))
と言う具合に、31日ない月が覚えられます。
2月は28日しかないですけど、それ以外の4,6,9,11月は30日ありますよね。


『問題』について

(1)2002年10月1日は何曜日?

4/1から10/1までは
 30日(4月)+31日(5月)+30日(6月)+31日(7月)+31日(8月)+30日(9月)=183日
存在し、
183/7=26 あまり1 なので、
10/1は、4/1から...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QカレンダーのC言語プログラムを教えてください!

西暦年と月を入力すると、その年月のカレンダーが出てくる万年カレンダーのC言語プログラムを教えてください!

その出力結果が
2***年 *月
月 火 水 木 金 土 日 月 火 水 木 金 土 日
1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28
29 30 31

というように二週間ごとに表示するもので、
うるう年の判別ができるものになるようにしたいのですが。
年=n月=g
で入力するものを作りたいんです。
よろしくお願いします!!!(>_<)

Aベストアンサー

なんとなく作りました。
入力に関してはそちらで考えてください

#include<stdio.h>

int dayofw(int ,int ,int );

void main()
{
int y, m, dw, i, cnt, j;
char week[7][2]={"日", "月", "火", "水", "木", "金", "土"};
int mday[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

printf("年=");//入力
scanf("%d", &y);

printf("月=");
scanf("%d", &m);

if((y%4)==0 && (y%100) != 0 || (y%400) == 0){
mday[1] = 29;
}else{
mday[1] = 28;
}

dw=dayofw(y, m, 1);
cnt=dw;

printf("%d年%d月\n ", y, m);
for(j=0; j<2; j++){
for(i=0; i<7; i++){
printf(" %s ", week[i]);
}
}
printf("\n");

for(i=0; i<dw; i++){
printf(" ");
}
for(i=1; i<=mday[m-1]; i++){
printf(" %3d ", i);
cnt++;
if(cnt==14){
printf("\n");
cnt=0;
}
}
printf("\n");
}

int dayofw(int y, int m, int d)
{
int y1, yobi;

y1=(y+(y/4)-(y/100)+(y/400)+(2.6*m+1.6)+d);
yobi=y1%7;

return(yobi);
}

なんとなく作りました。
入力に関してはそちらで考えてください

#include<stdio.h>

int dayofw(int ,int ,int );

void main()
{
int y, m, dw, i, cnt, j;
char week[7][2]={"日", "月", "火", "水", "木", "金", "土"};
int mday[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

printf("年=");//入力
scanf("%d", &y);

printf("月=");
scanf("%d", &m);

if((y%4)==0 && (y%100) != 0 || (y%400) == 0){
mday[1] = 29;
}else{
mday[1] = 28;
}

dw=dayofw(y, m, 1);
cnt...続きを読む


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

人気Q&Aランキング

おすすめ情報