- ベストアンサー
簡素で美しく記述するには・・・・
今与えられた開始日から与えられた終了日までの期間を求めるプログラムを作りました。勿論その中で閏年の計算も行います。 自分の作ったプログラムでは1つだけ気に入らないところがありました。それは閏年の計算部分です。 ■うるう年の判定 ・年が4で割り切れる時はうるう年 従って、2004年はうるう年である ・ただし、100で割り切れる時はうるう年でない 従って、1900年はうるう年ではない ・ただし、400で割り切れる時はうるう年である。 従って、2000年はうるう年である この条件を行うため自分は次のように記述しました for(year = First_Year; year <= End_Year; year++){ if(((year % 4) == 0) && ((((year % 100) != 0) && ((year % 400) != 0)) || (((year % 100) == 0) && ((year % 400) == 0)))){ 閏年の個数を数える } } for文変数の初期でFirst_Yearを与えていますが、First_Yearが開始年でEnd_Yearが終了年です。 if文がむかつくほど長くなってしまいました。やっていることはyearが4で割り切れかつ100と400で割ったときに両方共に余りが出る、またはyearが4で割り切れかつ100と400で割ったときに両方共に余りが出ない場合に 閏年の個数を数える ようにしています。 かなり強引な質問ではありますが、みなさんならどのように組むでしょうか? 別に自分の考える”美しい”プログラムでなくてもかまいません。色々な考えを聞かせてもらえないでしょうか?
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (9)
- jacta
- ベストアンサー率26% (845/3158)
- jacta
- ベストアンサー率26% (845/3158)
- jacta
- ベストアンサー率26% (845/3158)
- thamansa
- ベストアンサー率40% (95/232)
- graphaffine
- ベストアンサー率23% (55/232)
- MrBan
- ベストアンサー率53% (331/615)
- tatsu99
- ベストアンサー率52% (391/751)
- Oh-Orange
- ベストアンサー率63% (854/1345)
- koko_u_
- ベストアンサー率18% (459/2509)
関連するQ&A
- C言語 関数問題
西暦年yearを引数として受け取り,閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し,そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく,メイン関数main()も含む下記プログラムを完成させる形で作成する #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */
- ベストアンサー
- C・C++・C#
- C言語習いはじめです
大学の講義でC言語を習い始めたのですが、if文でコンパイルするとどうしても解決できないエラーが起こってしまいます。 文の意味は 「4で割り切れる年は”閏年”また、400でも割り切れる年も”閏年”と表示する。100で割り切れる年は”平年”と表示する」 というものです。値は2100で指定しています。 #include <stdio.h> main() { int y; printf(" y=2100; "); { if(y%400:0) { printf("a leap year \n"); {/* 閏年 */} } else if(y%100:0) { printf("a common year \n"); {/* 平年 */} } else if(y%40:0) { printf("a leap year \n"); {/* 閏年 */} } else { printf("a common year \n"); {/* 平年 */} } } return 0; } これをコンパイルすると、どうしても 「エラー E2377 ”ファイル名” 5: If文に ) がない(関数 main)」 と出てきてしまいます。 残るこのエラーだけが解決できません。どなたか、間違っている点がわかる方はいませんでしょうか。お願いします。
- 締切済み
- C・C++・C#
- 西暦・月からカレンダーを表示
問題文 西暦・月を入力してカレンダーを表示するプログラムを作成せよ。 プログラム全体のことを考える。プログラムの流れとしては、つぎのようになるであろう。 (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 どなたかご教授お願いできないでしょうか・・・。
- ベストアンサー
- C・C++・C#
- C言語について
こんばんわ。協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。
- 締切済み
- C・C++・C#
- C言語 関数について
協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。
- 締切済み
- C・C++・C#
- 関数について
協力お願いします。 2問あります 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。
- 締切済み
- C・C++・C#
- 基本的なプログラム
基本的なプログラム 学校の教科書に載っている問題がわかりません。 是非教えて下さい。 Cによる基本的な条件分岐(if,else if文)のプログラムです。 西暦年(4けたの整数)を入力し、その年がうるう年かどうかを判断するプログラムを作りなさい。 4で割り切れるときはうるう年であるが、100で割り切れるときはうるう年ではない。 しかし、400で割り切れればうるう年である。 ・・・とゆう問題文です。 #include<stdio.h> int main(void) { int x; printf("西暦を入力して下さい¥n"); scanf("%d",&x); if(x%4==0) printf("うるう年である¥n"); else if(x%400==0) printf("うるう年である¥n"); else if(x%100!==0) printf("うるう年でない¥n"); else printf("うるう年でない¥n"); return 0; } ・・・とりあえず自分で考えてみたのですがどうでしょうか; 間違ってると思いますが頑張って考えました・・・;; 4けたの整数ってゆうのはどう書けばいいんでしょうか? 実際にこのプログラムは動くのでしょうか? もっと省略して書くことができるのでしょうか? 等、色々わからないことばかりです。 プログラミングの授業自体に苦手意識を持っているので得意ではありません。 間違いなど指摘していただけたらと思います!! よろしくお願いします!
- ベストアンサー
- その他(インターネット・Webサービス)
- VBAマクロの記述を教えてください m(__)m 娘から聞かれたのですが主婦の私にはわかりません
VBAマクロの宿題です。どうもエクセルのことのようですが、それ以上は私にはわからず困っています。 A B C D E 1 ○ × ○ × ○ 2 5 5 3 12 12 4 8 8 5 15 15 6 31 31 7 4 4 8 3 3 9 87 87 10 18 18 11 183 87 以上がエクセルのシートだと見てください。 準備:A1セルからE1セルに○あるいは×を入力する。 A2セルからE10のセルに適当な2桁の数値を入力する。 問題:1行目が○なら11行目に2行目から10行目までの 合計を計算・表示する。 1行目が×なら11行目に2行目から10行目までの 最大値を表示する。 ヒント:文字のIF文 プログラム上で文字を扱う場合、ダブル・クォーテー ションで文字をはさむ。 IF Cells( 、 )="○" Then プログラムの流れ | For | IF | For | Next | Else | For | Next | END IF | Next 以上です。もう何が何やらちんぷんかんぷんです。どなたか助けてください。
- ベストアンサー
- その他(学問・教育)
- 閏年のプログラム
C言語(閏年)の質問です。 任意の範囲の年から閏年の表示とその数をカウントして次の実行結果のように表示するプログラムの作成で途中まではわかって修正・追加する箇所があったら一緒に教えてください。(ここでは2つの年をmain関数内で入力し、その範囲の西暦を引数とする関数checkYearを使用するものとする。int型の関数checkYearは、引数に西暦をとり、その西暦が閏年であれば、1を返し、閏年でない場合は0を返す。) なお、閏年の判定方法は以下のとおりである。 条件1 西暦年が4で割り切れる年は閏年である 条件2 条件1を満たしていても、西暦年が100で割り切れるときは閏年でない 条件3 条件2を満たしていても、西暦年が400で割り切れるならば閏年である 実行例1 西暦を入力:2000 西暦を入力:2009 2000年 2004年 2008年 閏年は3回あります。 実行例2 西暦を入力:2100 西暦を入力:2000 2000年 2004年 2008年 2012年 2016年 2020年 (省略) 2096年 閏年は25回あります。 実行例3 西暦を入力:2090 西暦を入力:2110 2092年 2096年 2104年 2108年 閏年は4回あります。 #include <iostream> bool checkYear(int year); int main() { int year; int year2; printf("西暦を入力:"); scanf("%d",year); printf("西暦を入力:"); scanf("%d",year2); int count = 0; for (int i = year; i < year2; i++) { if (checkYear(i)) { printf("%d年\n"); count++; } } printf("閏年は%d回です。\n"); return 0; } bool checkYear(int year) { return (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); }
- ベストアンサー
- C・C++・C#
- fortran77のend ifの個数について質問です。
他人が作ったfortran 77のプログラムを使うことになったのですが、if文の数とend if文の数が合わずに混乱しています。コンパイルも実行も出来るのですが自分の中では納得いきません。具体的に言うと、 =============== if (aa.gt.bb) then 計算 if (cc.gt.dd) then 計算 else 計算 end if 計算 if (ee.gt.ff) then 計算 end if =============== と言った具合です。この場合1つめのif文に対応するend ifがないと思うのですが…なぜコンパイルがうまくいくのか教えてください。
- ベストアンサー
- その他(プログラミング・開発)
お礼
返答ありがとうございました。 ・・・・提示してくださったコード、すばらしいと思います。 自分の中では”短いコード”を追求したものが美しいと感じていましたが、そうではないんですよね・・・・・ 提示してくださったコードはプログラムが上から順に実行されていくことをうまく使った方法だと思います。 のちのちのことを考え、他の人が分かりやすく、保守がしやすいコードもまた美しく書く条件の1つになるでしょう。 ありがとうございました。