<久しぶりに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でした。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
項目別に本音?それとも建て前?的な記事をまとめました。
気になったジャンル↓を選択してください。 |
Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]