プログラムの確認(ミスなど)をお願いします

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yozakaru
記事: 14
登録日時: 12年前

プログラムの確認(ミスなど)をお願いします

#1

投稿記事 by yozakaru » 12年前

整数を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
それと他におかしいところはないでしょうか?
手直ししたところは番地と再帰のところです。

box
記事: 2002
登録日時: 15年前

Re: プログラムの確認(ミスなど)をお願いします

#2

投稿記事 by box » 12年前

yozakaru さんが書きました:整数を2つ入力してそのあいだの数の和を求めるプログラムが課題(デバッグ作業)で出てやってみたものの和が1足りません。
和が1足りない、という結論を得るのは、デバッグ不足です。
試しに、4~9の和(答えは39)を求めようとしてみてください。
yozakaru さんが書きました:

コード:

void usage();
int enzan();
プロトタイプ宣言を書くならば、ちゃんと書きましょう。
関数定義の1行目をコピペして、最後にセミコロンを付けるだけです。
yozakaru さんが書きました:

コード:

void main(int argc, char *argv[])
main関数の戻り値の型は、確かintだったはずです。もちろん、最後に

コード:

    return 0;
に類するようなコードが必要です。
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()してみましょう。思った値になっているでしょうか。


そもそも、再帰呼び出しを使う必要がないように思います。
課題における条件か何かでしょうか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

non
記事: 1097
登録日時: 15年前

Re: プログラムの確認(ミスなど)をお願いします

#3

投稿記事 by non » 12年前

コード:

sum=enzan(max)-enzan(min);
仮にenzanの関数が1からその数までの合計を求めるものだとするなら、1から3までの合計で入力すると
enzan(3)=6 enzan(1)=1 なので 6-1=5となり、計算通りではないかな?

ダブっちゃったので、追記。
enzanの関数の return 値もおかしいと思うけど。
non

box
記事: 2002
登録日時: 15年前

Re: プログラムの確認(ミスなど)をお願いします

#4

投稿記事 by box » 12年前

yozakaru さんが書きました:整数を2つ入力して
ここでいう整数が仮に正の整数であるとして、
enzan()が1から引数で指定した数までの和を求めるものだとすると、
yozakaru さんが書きました:

コード:

	else return 1;
ここにバグがあるため、enzan()の引数が2以上の場合に勘定が合わないでしょう。
仮に、ここのバグが修正できたとします。
その上で、4~9の和を求めるとします。
1~9の和:enzan()によって、45と求まる。
1~4の和:enzan()によって、10と求まる。
さて、45 - 10 = 35という結果は本当に正しいでしょうか。
これだと、5~9の和になっていませんか?

4~9の和 = (1~9の和) - (1~『3』の和)
です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

yozakaru
記事: 14
登録日時: 12年前

Re: プログラムの確認(ミスなど)をお願いします

#5

投稿記事 by yozakaru » 12年前

>>boxさん
一応元のプログラムを訂正することが条件なので書き換えはNGだそうです。
何も縛りがなければ簡単なものならできるのですが...

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: プログラムの確認(ミスなど)をお願いします

#6

投稿記事 by みけCAT » 12年前

yozakaru さんが書きました:>>boxさん
一応元のプログラムを訂正することが条件なので書き換えはNGだそうです。
何も縛りがなければ簡単なものならできるのですが...
失礼します。どうやって元のプログラムを書き換えずに訂正するのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yozakaru
記事: 14
登録日時: 12年前

Re: プログラムの確認(ミスなど)をお願いします

#7

投稿記事 by yozakaru » 12年前

元のプログラムはmain(int argc, char *argv[])と再帰があったのでそれを使わずにやるのがNGって意味です

説明下手ですいません

yozakaru
記事: 14
登録日時: 12年前

Re: プログラムの確認(ミスなど)をお願いします

#8

投稿記事 by yozakaru » 12年前

一応書き直してみたのですがどうでしょう?

コード:

#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);
}

box
記事: 2002
登録日時: 15年前

Re: プログラムの確認(ミスなど)をお願いします

#9

投稿記事 by box » 12年前

yozakaru さんが書きました:一応書き直してみたのですがどうでしょう?
テストしてみて思ったとおりに動いているのであれば、大丈夫でしょう。
気になるのは、
yozakaru さんが書きました:

コード:

	if(max<0|min<0){
maxかminが負だったら、ということを表現したい場合、本当に | でいいのでしょうか。
yozakaru さんが書きました:

コード:

	printf("test 最小 最大\n");
使い方を表示するところでは上記のようになっていますが、
現状のコードでは「最大 最小」の順でもOKになっていますね。
そのちょっとした食い違いはどうしましょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 15年前

Re: プログラムの確認(ミスなど)をお願いします

#10

投稿記事 by box » 12年前

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
とするよりも考え方がシンプルであるような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る