[三流君] −−> [プログラマー業務の愚痴] −−> [バックナンバー一覧]
−−> No.150 久しぶりにC言語にふれる、、、下流の砂になった私

久しぶりにC言語にふれる、、、下流の砂になった私


本文(発行内容)


<久しぶりにC言語にふれる、、、下流の砂になった私>

こんにちは、Ken3です。

今回は、
久しぶりにC言語さわったので、
軽く書いてみます。

*いつものように、話しを変な方向に持っていくけど、お付き合いください。

/*
 * 1.VBAの掲示板にC言語の質問をもらう
*/

掲示板で、C言語の質問をもらった。

投稿時間:2003/02/09(Sun) 20:59
投稿者名:Y,Y
タイトル:プログラム修正

問題は1月1日から入力した月日までの総日数を求めるものなのですが、 
このプログラムでは不正な月日(例えば、13月54日など)を入力しても 
計算が行われてしまします。修正して不正な月日が入力されたときに入 
力した月日が不正であることをメッセージとして出力して計算を行わな 
いように修正したいのですが。。 

1:#include <atdio.h> 
2:void main(void) 
3:{ 
4: int m,d; 
5: int i, daytotal; 
6: int month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
7: 
8: printf("月日を入力してください。"); 
9: scanf("%d%d",&m,&d); 
10: daytotal=0; 
11: for(i=0 ;i<-1;i++){ 
12: daytotal +=month[i]; 
13:} 
14: daytotal +=d; 
15: printf("1月1日より%2d 月 %2d 日までの日数の合計は %3d です。\n",m,d,daytotal); 
16:} 
なんですが、私は15行目から 
if(d<=31){ 
printf("1月1日より%2d 月 %2d 日までの日数の合計は %3d です。\n",m,d,daytotal); 
} 
else{ 
printf"データが間違っています。"); 
} 
} 
else{ 
printf"データが間違っています。"); 
} 
} 
にしたのですが、どうも違っているようです。教えてください。お願いします。
早めの解答待っています。
----

なんて、質問をもらってしまった。

/*
 * 2.軽く答えたつもりが、間違えたみたい
*/

投稿時間:2003/02/09(Sun) 22:08
投稿者名:Ken3(管理者)
タイトル:久しぶりのC言語だった(あるいみ新鮮)

いきなり、C言語か、少しびっくり。
コンパイラー通してないけど、
パターンだと、入力後にチェックしたほうが楽だと思う。
#include <stdio.h> 
void main(void) 
{ 
 int m,d; 
 int i, daytotal; 
 int month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
 
 printf("月日を入力してください。"); 
 scanf("%d%d", &m, &d); 
 if ( m <= 0 && 12 < m ) {  // 月のチェック
     printf("%2d月は不正です\n", m);
     return;
 }
 if ( d <= 0 && month[m-1] < d ) {  // 日のチェック
     printf("%2d月%2d日は不正です\n", m, d);
     return;
 }

 daytotal=0; 
 for(i = 0; i < m - 1; i++) { 
     daytotal +=month[i]; 
 } 
 daytotal +=d; 
 printf("1月1日より%2d 月 %2d 日までの日数の合計は %3d です。\n",m,d,daytotal); 
}

コンパイルしてないから、エラー発生するかもしれないけど、
こんな感じ?でどうでしょうか?
入力後にすぐチェックするほうが楽だと思うけど。

できなかったらゴメンね
(C言語の掲示板に書くと、親切な回答貰えると思うよ)

がんばってね。

---

と、回答するが、
たまたま掲示板を見ていた読者から注意を受ける。
そのヶ所は、
&&でアンドじゃなくって、
>if ( m <= 0 && 12 < m ) { // 月のチェック
if ( m <= 0 || 12 < m ) { // 月のチェック
のorじゃないとね。

直メールくれた、たーちゃんさん、ありがとうね。
*ミス見つけたら掲示板に直接書いてもいいのに

なんかほかにもありそうだなぁ。。。

scanf("%d%d", &m, &d);
だと、2 10とかの入力はOKだけど、
2月10日と入力した時に数値が取れなかった(VC5 コンソールアプリだと)
まぁ、いっか。







/*
 * 3.昔話をもう一つ
*/

10年以上も前の話かな、はじめて入った会社で、
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 
と月の日数管理している場所を、
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 
と、0を頭に入れて、書いてました。

本人は(私は)、1月は[1]、2月は[2]とわかり易くやったつもりだけど、
この書き方、気に入らない先輩が居て、イジメられたなぁ。。。

頭の0はメモリ上無駄だとか、ソースが汚くなるとか、
難癖つけられて(早い話、今よりナマイキだったので)、
~~~~~~~~~~~~~~
ガンガンやられたっけ。

その頃から、私も変わり者だったので、
month[m-1]と-1しなくていいから、メモリが無駄になっても、
コードの部分で計算が入らないからチャラじゃないの?
と抵抗してたなぁ。
for(i = 0; i < m - 1; i++) { 
も
for(i = 1; i < m; i++) { 
と書いてたし、
まぁ確かに配列は必ず0からで1番目は−1するんだの人だと違和感あるのかなぁ。
*日付関係だけだけどね、配列の頭にダミー入れてたの。

今だったら、
世渡り上手を覚えてるから、
~~~~~~~~~~
どっちでもイイヤそんなの、勝手にやれば。。。
と気にしなく、うまくやってたと思うけど。

初めは上流のゴツゴツした石だったんだけど、
~~~~~~~~~~~~~~~~~~~~~~~~~~
今は下流のどこにでも居る丸い石ころか、、、なんてフト思ったりして。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
えっ、もう小粒になりすぎて、
石じゃなくてすぐ流される砂ダロって?(笑)
~~~~~~~~~~~~~~~~~~~~~~~~~~
ゆずれない部分があった、若い頃がなつかしかったなぁ
なんて言ってるとホントのおっさんになっちゃうから、注意だね。

C言語でもやって、初心に帰るかなぁ。。。

/*
 * 4.終わりの挨拶(次回はアルのか?(爆))
*/

今回は、
・掲示板に紛れ込んで来た、C言語の質問
・軽く回答したつもりが、お約束の間違い
・昔話の上流の石と下流の丸い石(もう流されまくりの砂か?)
のお話でした。

何か読者の心に残れば、うれしいです。
*私の独り言をうまく消化してくださいね。

お金儲けがヘタな吠えてるだけの三流プログラマーKen3でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

リンクや広告など

項目別に本音?それとも建て前?的な記事をまとめました。

気になったジャンル↓を選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]