<久しぶりに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)]