dポイントプレゼントキャンペーン実施中!

以下はcalendarを出力するものです。

commandlineで入力します。

出力するとき(例)
./a.exe → 現在のカレンダー出力させる
./a.exe 2015 → 2015年のすべて表示
./a.exe 2015 10 → 2015年10月の表示

上の二つを追加したいです。一番下のは何となくできました。
全て表示は月(12回)をループするのはわかりますが、どこに入れればよいかわかりません。
現在出力はlocaltimeを使うと思うのですが、どのように入れたらよいか、また変換をしなければいけませんので、このプログラムをどう変えれば良いでしょうか?

やるなら、全表示から行うのが楽ですかね?

ご指摘お願いします。







#include <stdio.h>

int mdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

void calender(int year2, int month2)
{
int days, i;
int wday, year,month,d,a;

year = year2;
month = month2;

wday = year + year / 4 - year / 100 + year / 400 + (26 * month + 16) / 10 + 1;
wday = wday % 7; //チェラーの法則

if (year <= 2) //曜日の計算をする
{
month += 12;
year--;
}

printf(" ---- %d年%d月 ----\n", year2, month2);
printf(" 日 月 火 水 木 金 土\n");

days = mdays[month2 - 1]; //日数を計算する

if (year2 % 4 == 0 && !(year2 % 100 == 0 && year2 % 400 != 0))
{
if (month == 2) // うるう年の処理
{
days++;
}
}
for(i = 0; i < wday; i++) //空白を生成
{
printf(" ");
}
for(d = 1; d <= days; d++) //最終日まで表示
{
printf(" %2d", d);
wday++;

if (wday == 7) //日曜日で改行
{
wday = 0;
printf("\n");
}
}
if (wday != 0)
{
printf("\n");
}
}
int main(int argc, char *argv[])
{
int year2, month2;

if (argc==2)
{
year2=atoi(argv[1]);
//printf("%d年\n", year2);
}
else if (argc==3)
{
year2=atoi(argv[1]);
month2=atoi(argv[2]);
//printf("%d年%d月\n", year2, month2);
}
else
{
printf("エラー\n");
return 0;
}
calender(year2, month2);

return 0;
}

質問者からの補足コメント

  • #プログラム
    #c言語

      補足日時:2015/12/08 19:53
  • エラーでます。

    「大至急お願いします。出力で悩み。」の補足画像2
      補足日時:2015/12/08 22:55

A 回答 (15件中11~15件)

遅くなりました・・・。



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

int mdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

void calender(int year2, int month2)
{
int days, i;
int wday, d;

wday = year2 + year2 / 4 - year2 / 100 + year2 / 400 + (26 * month2 + 16) / 10 + 1;
wday = wday % 7; //チェラーの法則

printf(" ---- %d年%d月 ----\n", year2, month2);
printf(" 日 月 火 水 木 金 土\n");

days = mdays[month2 - 1]; //日数を計算する

// うるう年の処理
if (month2 == 2)
{
if (year2 % 4 == 0 && !(year2 % 100 == 0 && year2 % 400 != 0)) days++;
}

//空白を生成
for(i = 0; i < wday; i++) printf(" ");
//最終日まで表示
for(d = 1; d <= days; d++)
{
printf(" %2d", d);

wday++;
if (wday == 7) //日曜日で改行
{
wday = 0;
printf("\n");
}
}
if (wday != 0) printf("\n");
}

int main(int argc, char *argv[])
{
int year2 = 0, month2 = 0;
time_t timep;
struct tm *time_inf;
char buff[100];

if(argc == 3) {
month2=atoi(argv[2]);
year2=atoi(argv[1]);
} else if(argc == 2) {
year2=atoi(argv[1]);
} else {
timep = time(NULL);
time_inf = localtime(&timep);
strftime(buff, sizeof(buff), "%Y", time_inf);
year2=atoi(buff);
strftime(buff, sizeof(buff), "%m", time_inf);
month2=atoi(buff);
}
if( month2 == 0 ) {
for(month2 = 1; month2 <= 12; month2++ ) {
calender(year2, month2);
}
} else {
calender(year2, month2);
}

return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
エラー判定はmain内で行えば大丈夫ですよね?
あと、strftimeをメンバーにアクセスとはなんですかね?

お礼日時:2015/12/09 18:36

gao57830 の提示されたコードには以下の問題があります。


(1) strftime() の呼び出しで、 " でくくって文字列リテラルにすべきところで ' を使っている
(2) 教えて!goo の文章入力の仕様のためインデントを全角空白で行っているので、コピペ後にタブ等に置換する必要がある
上記を修正をすればたぶん画像のエラーは消えると思います。
    • good
    • 0
この回答へのお礼

time_inf = localtime(&timep);
 strftime(buff, sizeof(buff), '%Y', time_inf);
でエラーがでます。
ポインタ型と整数の比較
strftimeが互換性がない沈黙的なもの

お礼日時:2015/12/08 23:56

頭の中だけでコーディングしています。


どこで、どんなエラーが出てますか?
    • good
    • 1
この回答へのお礼

補足の中に入れてあります。
よろしくお願い致します!

お礼日時:2015/12/08 22:56

if(argc == 3) {


 month2=atoi(argv[2]);
 year2=atoi(argv[1]);
} else if(argc == 2) {
 year2=atoi(argv[1]);
} else {
 timep = time(NULL);
 time_inf = localtime(&timep);
 strftime(buff, sizeof(buff), '%Y', time_inf);
 year2=atoi(buff);
 strftime(buff, sizeof(buff), '%m', time_inf);
 month2=atoi(buff);
}
    • good
    • 1
この回答へのお礼

エラーがでます。
よろしくお願い致します。

お礼日時:2015/12/08 22:31

#include <stdio.h>


#include <time.h>
#include <locale.h>
#include <stdlib.h>

int mdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

void calender(int year2, int month2)
{
 int days, i;
 int wday, d;

 wday = year2 + year2 / 4 - year2 / 100 + year2 / 400 + (26 * month2 + 16) / 10 + 1;
 wday = wday % 7; //チェラーの法則

 printf(" ---- %d年%d月 ----\n", year2, month2);
 printf(" 日 月 火 水 木 金 土\n");

 days = mdays[month2 - 1]; //日数を計算する

 // うるう年の処理
 if (month2 == 2)
 {
  if (year2 % 4 == 0 && !(year2 % 100 == 0 && year2 % 400 != 0)) days++;
 }

 //空白を生成
 for(i = 0; i < wday; i++) printf(" ");
 //最終日まで表示
 for(d = 1; d <= days; d++)
 {
  printf(" %2d", d);

  wday++;
  if (wday == 7) //日曜日で改行
  {
   wday = 0;
   printf("\n");
  }
 }
 if (wday != 0) printf("\n");
}

int main(int argc, char *argv[])
{
 int year2 = 0, month2 = 0;
 time_t timep;
 struct tm *time_inf;
 char buff[100];

 switch(argc) {
  case 3:
   month2=atoi(argv[2]);
  case 2:
   year2=atoi(argv[1]);
   break;
  default:
   timep = time(NULL);
   time_inf = localtime(&timep);
   strftime(buff, sizeof(buff), '%Y', time_inf);
   year2=atoi(buff);
   strftime(buff, sizeof(buff), '%m', time_inf);
   month2=atoi(buff);
 }
 if( month2 == 0 ) {
  for(month2 = 1; month2 <= 12; month2++ ) {
   calender(year2, month2);
  }
 } else {
  calender(year2, month2);
 }

 return 0;
}
    • good
    • 1
この回答へのお礼

ありがとうございます。
main内の中がいまいち理解出来ないです。
あと、ブレイクを使わないようにするにはどうしたらよいですか?
よろしくお願い致します!

お礼日時:2015/12/08 20:33

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