![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
以下は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;
}
No.12ベストアンサー
- 回答日時:
1:マイナスオプション対応
2:「チェラーの法則」があてにならないので止め。(笑
#include <stdio.h>
#include <time.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
int mdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void getwday(int * year, int * month, int * wday)
{
time_t timep;
struct tm *time_inf;
struct tm time_clc;
int oyear, omonth;
oyear = *year;
omonth = *month;
// 年が無効なら、今日の年月を求める
if( *year <= 0 ) {
timep = time(NULL);
time_inf = localtime(&timep);
*year = time_inf->tm_year + 1900;
*month = time_inf->tm_mon + 1;
}
// -オプションの時、月を引く
if( oyear < 0 ) {
*month += oyear + 1;
}
// 月がマイナスのなった場合の処理
if( *month <= 0 ) {
*year -= 1;
*month += 12;
}
// 月が12を超えた場合の処理
if( *month > 12 ) {
*year += 1;
*month -= 12;
}
// 曜日を求める
memset((void *)&time_clc, '\0', sizeof(time_clc));
time_clc.tm_year = *year - 1900;
time_clc.tm_mon = *month - 1;
time_clc.tm_mday = 1;
mktime( &time_clc );
*wday = time_clc.tm_wday;
}
void calender(int year2, int month2, int wday)
{
int days, i, d;
// wday2 = year2 + year2 / 4 - year2 / 100 + year2 / 400 + (26 * month2 + 16) / 10 + 1;
// wday2 = wday2 % 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++)
{
if (wday == 6) //土曜日で改行
{
wday = 0;
printf(" %2d\n", d);
} else {
wday++;
printf(" %2d", d);
}
}
if (wday != 0) printf("\n");
}
int main(int argc, char *argv[])
{
int year2 = 0, month2 = 0, wday;
int wmonth;
if(argc == 3) {
year2 = atoi(argv[1]);
month2 = atoi(argv[2]);
} else if(argc == 2) {
year2 = atoi(argv[1]);
}
if(month2 != 0) {
// 引数:月のエラー判定
}
if(year2 != 0) {
// 引数:年のエラー判定
}
if(year2 < 0) {
for( wmonth = year2; wmonth < 0; wmonth++ ) {
getwday(&year2, &month2, &wday);
calender(year2, month2, wday);
month2++;
}
} else if(year2 != 0 && month2 == 0) {
for(month2 = 1; month2 <= 12; month2++ ) {
getwday(&year2, &month2, &wday);
calender(year2, month2, wday);
}
} else {
getwday(&year2, &month2, &wday);
calender(year2, month2, wday);
}
return 0;
}
ありがとうございます。
1つ前のエラー判定の質問をしたときに実行したら、全てにエラーがでて、./a.exe 2015 ではエラーと曜日のみ出力になってしまいます。
else
現在時間を求めるやつ。
移行は
if(month2 != 0) {
// 引数:月のエラー判定
}
if(year2 != 0) {
// 引数:年のエラー判定
}
if(year2 != 0 && month2 == 0) {
for(month2 = 1; month2 <= 12; month2++ ) {
calender(atoi(argv[1]), month2);
}
} else {
calender(year2, month2);
そのまま書きました。
No.15
- 回答日時:
> ただし、1月と2月は、前年のそれぞれ13月・14月として扱う。
> たとえば、2015年1月1日・2月1日は、2014年13月1日・14月1日とする。
計算は、プログラムの通りの順番に行なわれます。
wdayを 計算したあとで、year,monthを変更しても、プログラムを遡ってwdayを計算しなおしたりはしません。
> if (year <= 2) //曜日の計算をする
○ yearが2以下になることは、ほとんど無いし、上記のツェラーの公式用の計算なら「年」ではありません。
○ コメントの書き方もプログラミング技術の一つです。
ここは、「曜日の計算をする」場所ではなく、その「準備をする」場所。
具体的には 「1月と2月は、前年のそれぞれ13月・14月として扱う」ための場所です。
if (year <= 2) //1月と2月は、前年のそれぞれ13月・14月として扱う
だったら、 year がおかしいし、計算順番もおかしいことがわかったのでは。
No.11
- 回答日時:
>カレンダーのオプションって、どのように作成するものですか?
オプション?って何のことをいってます?
No.9
- 回答日時:
例えば、こんな形でエラー判定出来ます。
int main(int argc, char *argv[])
{
int year2 = 0, month2 = 0;
if(argc == 3) {
year2 = atoi(argv[1]);
month2 = atoi(argv[2]);
} else if(argc == 2) {
year2 = atoi(argv[1]);
}
if(month2 != 0) {
// 引数:月のエラー判定
}
if(year2 != 0) {
// 引数:年のエラー判定
}
if(year2 != 0 && month2 == 0) {
for(month2 = 1; month2 <= 12; month2++ ) {
calender(atoi(argv[1]), month2);
}
} else {
calender(year2, month2);
}
return 0;
}
No.7
- 回答日時:
>エラー判定はmain内で行えば大丈夫ですよね?
そうですね。
判定する必要があるとしたら、引数が年月か?くらいかと思いますが?
>あと、strftimeをメンバーにアクセスとはなんですかね?
time_inf = localtime(&timep);
ここで使用している、
struct tm *time_inf;
この構造体は、
struct tm {
int tm_sec;/* 秒[0-61]閏秒考慮 */
int tm_min;/* 分[0-59] */
int tm_hour;/* 時[0-23] */
int tm_mday;/* 日[1-31] */
int tm_mon;/* 月[0-11] */
int tm_year;/* 年[1900年から起算] */
int tm_wday;/*曜日[0-6] 0:日曜日 */
int tm_yday;/*年内の経過日数[0-365] */
int tm_isdst;/*日本では0 */
};
と定義されています。
なので、
year2 = time_inf->tm_year + 1900;
month2 = time_inf->tm_mon + 1;
で取得出来るのです。
tm_yearやtm_monはtm構造体のメンバーなので、
メンバーにアクセスということです。
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);
year2 = time_inf->tm_year + 1900;
month2 = time_inf->tm_mon + 1;
}
※char buff[100]; が不要になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
12月から1月へのリンク
-
日付の差分の求め方(日、分)
-
C言語のプログラミングについて...
-
体重が3kg増える/減る の英語...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
文字の横にプルダウンを表示さ...
-
実行時エラー 3020の対策
-
<SELECT>タグの折り返し
-
セレクトメニューで2つの項目...
-
テーブル内でドロップダウンメ...
-
FindFirst を複数条件で検索
-
同じものを繰り返し表示させる
-
VBAでPDFのコピーとリネームを...
-
セレクトボックスの内容を中央寄せ
-
malformed header from script....
-
formで特定のinputを送信しない...
-
print <<"_HTML_"の中でサブル...
-
<python>シンタックスエラーが...
-
複数列を持ったリストボックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日付の差分の求め方(日、分)
-
1桁の日付に0を付ける
-
Perlでsprintf("%02d",$month)...
-
2つの日付・時間の差分を求め...
-
日齢計算プログラム
-
a shower.
-
Perlの日付の比較に関して
-
前日の日付取得するには?
-
サマータイムの判定について
-
pythonのプログラミングについ...
-
時間の計算について
-
VBAでオーバーフローが出て困っ...
-
当日の日付をプルダウンメニュ...
-
「型が一致しません」のエラー...
-
perlでcheckboxがうまく整理で...
-
Schemeのプログラミング うる...
-
perl ハノイの塔の解に順番付け...
-
Perlでテキストファイルの読み込み
-
このソースがコンパイルエラー...
-
PerlからMysqlに接続してデータ...
おすすめ情報
#プログラム
#c言語
エラーでます。