ページ 1 / 1
プログラムの確認(ミスなど)をお願いします
Posted: 2013年6月30日(日) 19:58
by yozakaru
整数を2つ入力してそのあいだの数の和を求めるプログラムが課題(デバッグ作業)で出てやってみたものの和が1足りません。
コード:
#include<stdio.h>
void usage();
int enzan();
void main(int argc, char *argv[])
{
int i;
int min,max;
int sum;
if(argc==3){
min=atoi(argv[1]);
max=atoi(argv[2]);
}
else
usage();
sum=enzan(max)-enzan(min);
printf("%dから%dまでの和: %d \n",min,max,sum);
}
int enzan(int n)
{
if(n>0)return enzan(n-1)+n;
else return 1;
}
void usage()
{
printf("error\n");
printf("test 最小 最大\n");
exit(1);
}
実行結果)1から3までの和:5
それと他におかしいところはないでしょうか?
手直ししたところは番地と再帰のところです。
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年6月30日(日) 20:20
by box
yozakaru さんが書きました:整数を2つ入力してそのあいだの数の和を求めるプログラムが課題(デバッグ作業)で出てやってみたものの和が1足りません。
和が1足りない、という結論を得るのは、デバッグ不足です。
試しに、4~9の和(答えは39)を求めようとしてみてください。
yozakaru さんが書きました:
コード:
void usage();
int enzan();
プロトタイプ宣言を書くならば、ちゃんと書きましょう。
関数定義の1行目をコピペして、最後にセミコロンを付けるだけです。
yozakaru さんが書きました:
コード:
void main(int argc, char *argv[])
main関数の戻り値の型は、確かintだったはずです。もちろん、最後に
に類するようなコードが必要です。
yozakaru さんが書きました:
コード:
min=atoi(argv[1]);
max=atoi(argv[2]);
atoi()や、usage()におけるexit()を使うときは、stdlib.hをインクルードしましょう。
yozakaru さんが書きました:
コード:
sum=enzan(max)-enzan(min);
どうせデバッグするなら、enzan(max)やenzan(min)の値を
printf()してみましょう。思った値になっているでしょうか。
そもそも、再帰呼び出しを使う必要がないように思います。
課題における条件か何かでしょうか?
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年6月30日(日) 20:25
by non
コード:
sum=enzan(max)-enzan(min);
仮にenzanの関数が1からその数までの合計を求めるものだとするなら、1から3までの合計で入力すると
enzan(3)=6 enzan(1)=1 なので 6-1=5となり、計算通りではないかな?
ダブっちゃったので、追記。
enzanの関数の return 値もおかしいと思うけど。
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年6月30日(日) 20:35
by box
yozakaru さんが書きました:整数を2つ入力して
ここでいう整数が仮に正の整数であるとして、
enzan()が1から引数で指定した数までの和を求めるものだとすると、
ここにバグがあるため、enzan()の引数が2以上の場合に勘定が合わないでしょう。
仮に、ここのバグが修正できたとします。
その上で、4~9の和を求めるとします。
1~9の和:enzan()によって、45と求まる。
1~4の和:enzan()によって、10と求まる。
さて、45 - 10 = 35という結果は本当に正しいでしょうか。
これだと、5~9の和になっていませんか?
4~9の和 = (1~9の和) - (1~『3』の和)
です。
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年7月01日(月) 00:05
by yozakaru
>>boxさん
一応元のプログラムを訂正することが条件なので書き換えはNGだそうです。
何も縛りがなければ簡単なものならできるのですが...
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年7月01日(月) 00:12
by みけCAT
yozakaru さんが書きました:>>boxさん
一応元のプログラムを訂正することが条件なので書き換えはNGだそうです。
何も縛りがなければ簡単なものならできるのですが...
失礼します。どうやって元のプログラムを書き換えずに訂正するのですか?
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年7月01日(月) 00:35
by yozakaru
元のプログラムはmain(int argc, char *argv[])と再帰があったのでそれを使わずにやるのがNGって意味です
説明下手ですいません
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年7月01日(月) 01:59
by yozakaru
一応書き直してみたのですがどうでしょう?
コード:
#include<stdio.h>
#include<stdlib.h>
void usage();
int enzan(int n);
int main(int argc, char *argv[])
{
int i;
int min,max;
int sum;
if(argc==3){
min=atoi(argv[1]);
max=atoi(argv[2]);
}
else
usage();
if(max<0|min<0){
printf("ERROR\n");
return 0;
}
if(max>=min){
sum=enzan(max)-enzan(min)+min;
printf("%dから%dまでの和: %d \n",min,max,sum);
}
if(max<min){
sum=enzan(min)-enzan(max)+max;
printf("%dから%dまでの和: %d \n",max,min,sum);
}
return 0;
}
int enzan(int n)
{
if(n>0)return enzan(n-1)+n;
else return 0;
}
void usage()
{
printf("ERROR\n");
printf("test 最小 最大\n");
exit(1);
}
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年7月01日(月) 07:49
by box
yozakaru さんが書きました:一応書き直してみたのですがどうでしょう?
テストしてみて思ったとおりに動いているのであれば、大丈夫でしょう。
気になるのは、
maxかminが負だったら、ということを表現したい場合、本当に | でいいのでしょうか。
yozakaru さんが書きました:
コード:
printf("test 最小 最大\n");
使い方を表示するところでは上記のようになっていますが、
現状のコードでは「最大 最小」の順でもOKになっていますね。
そのちょっとした食い違いはどうしましょうか。
Re: プログラムの確認(ミスなど)をお願いします
Posted: 2013年7月01日(月) 12:47
by box
yozakaru さんが書きました:
コード:
sum=enzan(max)-enzan(min)+min;
sum=enzan(min)-enzan(max)+max;
まあ、これでもいっこうに差し支えはないのですが、
1~bの和 = (1~a-1の和) + (a~bの和)
から
a~bの和 = (1~bの和) - (1~a-1の和)
となりますので、私だったら
コード:
enzan(b) - enzan(a-1)
と書きます。
1~bの和 = (1~aの和) - a + (a~bの和)
から
a~bの和 = (1~bの和) - (1~aの和) + a
とするよりも考え方がシンプルであるような気がします。