ページ 11

C言語についての質問

Posted: 2009年10月30日(金) 16:51
by ぺす
課題が出されたのですが参考書をみても理解しきれず困っているのでよろしくお願いします。
問題は「入力した数字で割り切れる数を出力する。」というものです。

例)
入力・10
出力・10は1で割り切れます。
   10は2で割り切れます。
   10は5で割り切れます。
   10は10で割り切れます。

といった感じです。



{
int a;
int b;
scanf("%d",&a);
a=b;
while(b<1)
{
printf("%dは%dで割り切れます。",a,b);
b=b/2;
}
}

といった形で作ってみたのですが、走らせて見たところ入力した数字に関係なく「0は0で割り切れます。」というのが(ほぼ)無限ループで出力されてしまいます。

改善点が見当たらないので質問させていただきました。
よろしければご指導お願いします。

Re:C言語についての質問

Posted: 2009年10月30日(金) 17:04
by Mist
いくつか間違いがあります。

a=b;

これだとscanfで取得した値はbで上書きされています。
0になるのは、たまたまbが0だからでしょう。
b=aの間違いですよね。


while(b<1)

条件がおかしいです。
b<1だと「bが1未満の場合継続する」です。
whileには終了条件ではなく、継続条件を書かなければなりません。
b>0でしょう。

Re:C言語についての質問

Posted: 2009年10月30日(金) 17:09
by non
割り切れたかどうかの判断は、余りを求めて0か調べる方法がよく使われます。
>b=b/2;
これは何をしてるのでしょう?
どういうアルゴリズムで解こうとしてますか?

Re:C言語についての質問

Posted: 2009年10月30日(金) 17:34
by ぺす
>>Mistさん
ありがとうござます。
指摘されたところを訂正してみました。

>>nonさん
ありがとうございます。
よく考えたらおかしいですね。


お二人に指摘されたところを自分なりに直してみました。


{
int a;
int b;
scanf("%d",&a);
b=a;
while(b<0)
{
if(a%b==0)
{
printf("%dは%dで割り切れます。",a,b);
}
b=b-1;
}
}

今度は数字を入力しても何も変化が起こらなく(何も出力されなく)なりました。
何度も申し訳ありませんがご指導お願いします。

Re:C言語についての質問

Posted: 2009年10月30日(金) 17:38
by non
>while(b<0)
whileはループ条件です。この条件が成り立っている間繰り返します。

Re:C言語についての質問

Posted: 2009年10月30日(金) 17:44
by Tatu
while文は条件が満たされているときその処理を繰り返すというものです。

次のプログラムの出力結果はわかりますか?

#include <stdio.h>

int main(void)
{
	int a=0;
	while(a<5)
	{
		printf("%d\n",a);
		a++;
	}
	return 0;
}


aとbが両方とも0になっている訳は
aとbが宣言されたときにたまたま0があてはめられており、
scanfでaの値を代入した後に
a=bでaにb(=0)が代入されているからです。

以下のプログラムの結果を見て
なぜその結果になるのか説明できますか?

#include <stdio.h>

int main(void)
{
	int a,b;

	a=0;
	b=1;

	b=a;
	printf("a=%d\nb=%d\n",a,b);

	a=0;
	b=1;
 
	a=b;
	printf("a=%d\nb=%d\n",a,b);
	return 0;
}

もう一つプログラムを書いてみましたがこれの出力結果はどうなるでしょうか。

#include <stdio.h>

int main(void)
{
	int a=10;
	int b=1;

	while(a>=b)
	{
		printf("%d %% %d = %d\n",a,b,a%b);
		b++;
	}
	return 0;
}

Re:C言語についての質問

Posted: 2009年10月30日(金) 18:06
by ぺす
>>nonさん
ありがとうございます。
逆だとおもってたようで恥ずかしい限りです。

>>Tatuさん
最初のプログラムは0~4の数字。
2番目はせっかく定義してもすぐあとに=で上書きしてしまうからでしょうか。
3番目は10を1~10の数字で割った余りを出力させる。

合ってるでしょうか。


出されていた課題については無事解決しました。
ご指導、お早いお返事をいただきありがとうございました。
これからも質問させていただくかもしれませんがよろしくお願いします。

Re:C言語についての質問

Posted: 2009年10月30日(金) 18:12
by Tatu
あっています。

しかし、2番目は
「最初はbにaを代入していて、次のはaにbを代入しているから。」
というような答え方をしてほしかったです。