if文について、問題点を教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Riko

if文について、問題点を教えてください

#1

投稿記事 by Riko » 4年前

初心者で、次の課題に悩んでいます。

問題:3つの整数x、m、nを入力したときxがmとnの公倍数かどうかを判定した結果を表示するプログラムを作成しなさい。

この問いに対する自分のプログラムが以下ですが、公倍数であるものでも公倍数でないとなっています。(何を入れても公倍数でないという結果が表示される)
ヒントをいただけたら幸いです。

コード:

#include <stdio.h>
int main(void)
{
	int x; 
	printf("Input a number x: ");
	scanf("%d" , &x);
	
	int m;
	printf("Input a number m: ");
	scanf("%d" , &m);
	
	int n;
	printf("Input a number n: ");
	scanf("%d" , &n);
	
	int kekka;
	kekka = x%(m*n);
	
	if( kekka=0 )
	{
		printf("x ha m to n no koubaisuu desu \n");
	}
	else( kekka!=0 )
	{
		printf("x ha m to n no koubaisuu deha arimasenn \n");
	}
	return 0;
}

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

Re: if文について、問題点を教えてください

#2

投稿記事 by box » 4年前

コード:

	if( kekka=0 )
ここ、kekkaにゼロを代入していますが、それでよいですか?
kekkaとゼロとを比べるときは == ではないですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: if文について、問題点を教えてください

#3

投稿記事 by かずま » 4年前

Riko さんが書きました:
4年前
この問いに対する自分のプログラムが以下ですが、公倍数であるものでも公倍数でないとなっています。(何を入れても公倍数でないという結果が表示される)
本当ですか?

そのプログラムをコンパイルすると 24行目がエラーになりますよ。
実行できないので、結果が表示されることはありません。
コンパイラは何を使っていますか?
本当に悪いのは 23行目の else( kekka!=0 ) なんですが。

それから 12 は、4 の倍数であり、かつ 6 の倍数だから、
4 と 6 の公倍数ですよね。


Math

Re: if文について、問題点を教えてください

#5

投稿記事 by Math » 4年前

ヒントです(^^; gcc8.2.0 使用

コード:


#include <stdio.h>
int main(void)
{
	int x; 
	printf("Input a number x: ");
	scanf("%d" , &x);
	
	int m;
	printf("Input a number m: ");
	scanf("%d" , &m);
	
	int n;
	printf("Input a number n: ");
	scanf("%d" , &n);
int z;
z=m * n;	
int t;
if(m < n){ t=m; m=n; n=t;}

int r;
r=m % n;
while(r != 0){ m=n; n=r; r=m % n;}

int lcm=z / n;



	int kekka;
	kekka = x % lcm; // x%(m*n);
	
	if( kekka==0 )
	{
		printf("x ha m to n no koubaisuu desu \n");
	}
	else
	{
		printf("x ha m to n no koubaisuu deha arimasenn \n");
	}
	return 0;
}


実行

コード:


C:\19\19c\gcc820>gcc main.c

C:\19\19c\gcc820>dir a.exe
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 7813-6100 です

 C:\19\19c\gcc820 のディレクトリ

2019/05/25  21:04            42,838 a.exe
               1 個のファイル              42,838 バイト
               0 個のディレクトリ  116,542,201,856 バイトの空き領域

C:\19\19c\gcc820>a.exe
Input a number x: 12
Input a number m: 4
Input a number n: 6
x ha m to n no koubaisuu desu

C:\19\19c\gcc820>pause
続行するには何かキーを押してください . . .

かずま

Re: if文について、問題点を教えてください

#6

投稿記事 by かずま » 4年前

Riko さんが書きました:
4年前
初心者で、次の課題に悩んでいます。

ヒントをいただけたら幸いです。
まだ悩みが解消しませんか?
たくさんのヒントがもらえているので、応答をお願いします。

ところで、次のプログラムをどう思いますか?

コード:

#include <stdio.h>

int main(void)
{
	int x, m, n; 

	printf("Input a number x: "), scanf("%d" , &x);
	printf("Input a number m: "), scanf("%d" , &m);
	printf("Input a number n: "), scanf("%d" , &n);
	
	if (x % m == 0 && x % n == 0)
		puts("x is a common multiple of m and n.");
	else
		puts("x is not a common multiple of m and n.");
}

Math

Re: if文について、問題点を教えてください

#7

投稿記事 by Math » 4年前

ヒント: lcm を求める過程でユークリッドの互除法をつかっていますよ。

Riko

Re: if文について、問題点を教えてください

#8

投稿記事 by Riko » 4年前

かずま さんが書きました:
4年前
Riko さんが書きました:
4年前
この問いに対する自分のプログラムが以下ですが、公倍数であるものでも公倍数でないとなっています。(何を入れても公倍数でないという結果が表示される)
本当ですか?

そのプログラムをコンパイルすると 24行目がエラーになりますよ。
実行できないので、結果が表示されることはありません。
コンパイラは何を使っていますか?
本当に悪いのは 23行目の else( kekka!=0 ) なんですが。

それから 12 は、4 の倍数であり、かつ 6 の倍数だから、
4 と 6 の公倍数ですよね。
返答ありがとうございます、ここに張り付けた通りでは実行できていませんでした。
何かを書き換えた後にここに載せていたのだと思います。

Riko

Re: if文について、問題点を教えてください

#9

投稿記事 by Riko » 4年前

Math さんが書きました:
4年前
ヒントです(^^; gcc8.2.0 使用

コード:


#include <stdio.h>
int main(void)
{
	int x; 
	printf("Input a number x: ");
	scanf("%d" , &x);
	
	int m;
	printf("Input a number m: ");
	scanf("%d" , &m);
	
	int n;
	printf("Input a number n: ");
	scanf("%d" , &n);
int z;
z=m * n;	
int t;
if(m < n){ t=m; m=n; n=t;}

int r;
r=m % n;
while(r != 0){ m=n; n=r; r=m % n;}

int lcm=z / n;



	int kekka;
	kekka = x % lcm; // x%(m*n);
	
	if( kekka==0 )
	{
		printf("x ha m to n no koubaisuu desu \n");
	}
	else
	{
		printf("x ha m to n no koubaisuu deha arimasenn \n");
	}
	return 0;
}


実行

コード:


C:\19\19c\gcc820>gcc main.c

C:\19\19c\gcc820>dir a.exe
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 7813-6100 です

 C:\19\19c\gcc820 のディレクトリ

2019/05/25  21:04            42,838 a.exe
               1 個のファイル              42,838 バイト
               0 個のディレクトリ  116,542,201,856 バイトの空き領域

C:\19\19c\gcc820>a.exe
Input a number x: 12
Input a number m: 4
Input a number n: 6
x ha m to n no koubaisuu desu

C:\19\19c\gcc820>pause
続行するには何かキーを押してください . . .

ヒントありがとうございます!

コード:

int z;
z=m * n;	
int t;
if(m < n){ t=m; m=n; n=t;}

int r;
r=m % n;
while(r != 0){ m=n; n=r; r=m % n;}

int lcm=z / n;
この部分はいったい何をやっているのか教えていただけますでしょうか。

Riko

Re: if文について、問題点を教えてください

#10

投稿記事 by Riko » 4年前

かずま さんが書きました:
4年前
Riko さんが書きました:
4年前
この問いに対する自分のプログラムが以下ですが、公倍数であるものでも公倍数でないとなっています。(何を入れても公倍数でないという結果が表示される)
本当ですか?

そのプログラムをコンパイルすると 24行目がエラーになりますよ。
実行できないので、結果が表示されることはありません。
コンパイラは何を使っていますか?
本当に悪いのは 23行目の else( kekka!=0 ) なんですが。

それから 12 は、4 の倍数であり、かつ 6 の倍数だから、
4 と 6 の公倍数ですよね。
このままだと、12,4,6を入力したときに、正しく表示されないということですね!
そこを改善する必要があるのですね、、、。

Math

Re: if文について、問題点を教えてください

#11

投稿記事 by Math » 4年前

#9 について

 ユークリッドの互除法を用いて最小公倍数 lcm をもとめていますよ。

http://www.geisya.or.jp/~mwm48961/kou3/k1gcm1.htm

https://webkaru.net/clang/find-lcm-of-two-number/

を参照してくださいね。

かずま

Re: if文について、問題点を教えてください

#12

投稿記事 by かずま » 4年前

Riko さんが書きました:
4年前
返答ありがとうございます、ここに張り付けた通りでは実行できていませんでした。
何かを書き換えた後にここに載せていたのだと思います。
それなら、最新のソースを提示し、何種類かの数値による
実行例を示し、疑問点をもう一度書いてください。

最新のソースには次のアドバイスが反映されていることを希望します。
・boxさんの「kekkaとゼロとを比べるときは == ではないですか?」
・私の「本当に悪いのは 23行目の else( kekka!=0 ) なんですが。」

また、#6のプログラムについて「どう思いますか?」という質問に
答えていただけないでしょうか?

Math

Re: if文について、問題点を教えてください

#13

投稿記事 by Math » 4年前

「公倍数は最小公倍数の倍数である。」が 証明してあるとは 思わなかった!(^^;

https://ja.wikipedia.org/wiki/%E6%9C%80 ... D%E6%95%B0

諸概念の

公倍数は最小公倍数の倍数である。
証明

を参照。

返信

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