121 うそとまこと
2020/08/06(木) 15:52:10 ID: bmxKTOyqIr
>>20
ゼロ除算の原因となったプログラムが分からないので、

https://saeki-ce.xsrv.jp/C_src/warizan02.htmlexit

減算で除算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)を参照(※正の整数だけに対応してます)

#include <stdio.h>
int main()
{
int a,b,c;
printf("a÷bを計算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

if(b==0)
{printf("0で割らないでください");}
else
{
for(c=0;a>=b;c=c+1)
{a=a-b;}
printf("答:%d 余り:%d",c,a);
}
return 0;
}
👍
高評価
0
👎
低評価
0
122 うそとまこと
2020/08/06(木) 15:58:55 ID: bmxKTOyqIr
>>121
このプログラムから、if(b==0)に関連する部分を削除し、a÷0(ゼロ除算)するとエラー(オーバーフロー)します。
for文の内容は、aがb以上なら、aからbを減算し続け、aがbより小さくなったら終了。その回数cが商になり、減算されたaが余りになります。

if(b==0)を使用せずにエラーしないプログラムを作成できれば、ゼロ除算拠になるのではと考えましたが、失敗に終わりました。
そこで考え方を見直し、a÷bを計算して、a:17,b:3,答え:5,余り:2となりますが、a:17,b:3,答え:6,不足:-1となる数式定義されていないことに疑問を持ちました。(除法、剰余演算参照)

不足をめる数式を不足算(仮)とし、減算だけで除算する不足算(仮)プログラムを作成。
👍
高評価
0
👎
低評価
0
123 うそとまこと
2020/08/06(木) 16:00:25 ID: bmxKTOyqIr
#include <stdio.h>
int main()
{
int a,b,c;
printf("a÷bを計算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

for(c=0;a>0;c=c+1)
{a=a-b;}
printf("答:%d 不足:%d",c,a);
return 0;
}

for文の内容は、aが0より大きいなら、aからbを減算し続けて、aが0以下になったら終了。その回数cが商になり、減算されたaが不足になります。

if(b==0)関連を取り除いたので、a÷0(ゼロ除算)でエラーしますが、

『0÷0(ゼロ除算)では、答え:0,不足:0とめられます』

つまり、不足算(仮)定義付けされれば、0÷0は『不定』でなくなるのではないでしょうか。
👍
高評価
0
👎
低評価
0
124 うそとまこと
2020/08/08(土) 19:33:44 ID: bmxKTOyqIr
ゼロ除算コンピュータにおけるゼロ除算 - Wikipedia
https://ja.m.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E9%99%A4%E7%AE%97exit

【減算で除算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)】
https://saeki-ce.xsrv.jp/C_src/warizan02.htmlexit

ゼロ除算の原因となったプログラムが分からなかったので、上記の減算で除算のプログラムを参考に新しくプログラムを作成。(※正の整数)

#include <stdio.h>
int main()
{
int a,b,c,d;
printf("a÷b引き算割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);
if(b==0)
{printf("0で割らないでください");}
else{
d=a;
for(c=0;d>=b;c=c+1)
{d=d-b;}
printf("答:%d...%d(余り)",c,d);}
return 0;
}

上記のプログラムから、if(b==0)に関連する(例外処理)部分を削除し、a÷0(ゼロ除算)するとエラー(オーバーフロー)します。
a÷b=c…d(余り)になるようにプログラムを作成。
for文の内容は、aを代入したdがb以上なら、dからbを減算し続け、dがbより小さくなったら終了。その回数cが答(商)になり、減算されたdが余りになります。
👍
高評価
0
👎
低評価
0
125 うそとまこと
2020/08/08(土) 19:35:20 ID: bmxKTOyqIr
『論より拠』
if(b==0)を使用せずにゼロ除算をしてもエラーしないプログラムを作成することができれば、ゼロ除算問題を解決に導く一助になるのではと考えました。
しかし、現状の方法では解決に至らず失敗。そこで、今までのやり方考え方などを一新してみました。
まず初めに上記のプログラム余りめる割り算a÷b=c…d、これにa:17とb:3を入すると17÷3=5…2となりますが、17÷3=6…-1となる負の余りめる(引き算で)割り算プログラムを作成。

#include <stdio.h>
int main()
{
int a,b,c,d;
printf("a÷b負の余りめる割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);
d=a;
for(c=0;d>0;c=c+1)
{d=(d-b);}
printf("答:%d...%d(不足) ",c,d);
return 0;
}

for文の内容は、aを代入したdが0より大きいなら、dからbを減算し続けて、dが0以下になったら終了。その回数cが答になり、減算されたaが余りになります。
プログラム内に余りではなく(不足)とありますが、これは例えば所持-100円が借に該当するのと同じような意味合いとお考えください。
👍
高評価
0
👎
低評価
0
126 うそとまこと
2020/08/08(土) 19:37:51 ID: bmxKTOyqIr
if(b==0)関連を取り除いたので、a÷0(ゼロ除算)でエラーしますが、下記のプログラムより、
『0÷0(ゼロ除算)では、答:0…0(不足)と答:0…0(余り)になります』
両方の余りめる割り算プログラムにより、今までは不定と定義されていた0÷0の明の一助になれば幸いです。

#include <stdio.h>
int main()
{
int a,b,c,d,e;
printf("a÷b両方の余りめる割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);
d=a;
e=a;
for(c=0;d>0;c=c+1)
{d=d-b;}
printf("答:%d...%d(不足)\n",c,d);
if(d<0){
for(c=0;e>b;c=c+1)
{e=e-b;}
}
else{
for(c=0;e>0;c=c+1)
{e=e-b;}
}
printf("答:%d...%d(余り)",c,e);
return 0;
}
👍
高評価
0
👎
低評価
0
127 うそとまこと
2020/08/10(月) 10:39:25 ID: bmxKTOyqIr
ゼロ除算コンピュータにおけるゼロ除算-Wikipediaから抜

a/0 で a が正の数であれば、除算の結果は正の無限大となり、a が負の数であれば負の無限大となる。そして、a も 0 であった場合、除算結果は NaN(not a number、数でない)となる。0 の代わりに −0 で除算をした場合は、上述の符号が反転する。

整数ゼロ除算は通常、浮動小数点とは別に処理される。というのは整数ではゼロ除算の結果を表す方法がないためである。 多くのプロセッサは整数ゼロ除算を実行しようとすると例外を発生させる。この例外に対する対処がなされていない場合、ゼロ除算を実行しようとしたプログラムは強制終了(アボート)される。これは、ゼロ除算エラーと解釈されるためで、エラーメッセージが表示されることも多い。

【浮動小数点数-Wikipedia参照】
今までのプログラムは、整数(int%d)を使用してましたが、浮動小数点数(double%lf)に変更しても0÷0の結果で、NaNやエラー(例外発生)はしません。
👍
高評価
0
👎
低評価
0
128 うそとまこと
2020/08/10(月) 10:40:49 ID: bmxKTOyqIr
#include <stdio.h>
int main()
{
double a,b,c,d,e;
printf("a÷b浮動小数点数割り算\n");
printf("a:");
scanf("%lf",&a);
printf("b:");
scanf("%lf",&b);

d=a;
e=a;
for(c=0;d>0;c=c+1)
{d=d-b;}
printf("答:%lf...%lf(不足)\n",c,d);

if(d<0){
for(c=0;e>b;c=c+1)
{e=e-b;}
}
else{
for(c=0;e>0;c=c+1)
{e=e-b;}
}
printf("答:%lf...%lf(余り)",c,e);
return 0;
}
👍
高評価
0
👎
低評価
0
129 うそとまこと
2020/08/11(火) 00:39:07 ID: bmxKTOyqIr
ゼロ除算(0÷0)に対応した余りめる割り算(負数対応)のプログラムを作成。長いので3分割してます。

#include <stdio.h>
int main()
{
double a,b,c,d,e;
printf("a÷bゼロ除算(0÷0)対応割り算\n");
printf("a:");
scanf("%lf",&a);
printf("b:");
scanf("%lf",&b);

d=a;
e=a;
if((a<0)&&(b<0)){
for(c=0;d<0;c=c+1)
{d=(d-b);}
printf("答:%lf...%lf(不足)\n",c,d);
if(d>0){
for(c=0;e<b;c=c+1)
{e=e-b;}
}
else{
for(c=0;e<0;c=c+1)
{e=e-b;}
}
printf("答:%lf...%lf(余り)",c,e);
return 0;
}
👍
高評価
0
👎
低評価
0
130 うそとまこと
2020/08/11(火) 00:40:44 ID: bmxKTOyqIr
else if(a<0){
for(c=0;d<0;c=c-1)
{d=(d+b);}
printf("答:%lf...%lf(不足)\n",c,d);
if(d>0){
for(c=0;e<b*(-1);c=c-1)
{e=e+b;}
}
else{
for(c=0;e<0;c=c-1)
{e=e+b;}
}
printf("答:%lf...%lf(余り)",c,e);
return 0;
}
else if(b<0){
for(c=0;d>0;c=c-1)
{d=(d+b);}
printf("答:%lf...%lf(不足)\n",c,d);
if(d<0){
for(c=0;e>b*(-1);c=c-1)
{e=e+b;}
}
else{
for(c=0;e>0;c=c-1)
{e=e+b;}
}
printf("答:%lf...%lf(余り)",c,e);
return 0;
}
👍
高評価
0
👎
低評価
0
131 うそとまこと
2020/08/11(火) 00:56:45 ID: bmxKTOyqIr
else{
for(c=0;d>0;c=c+1)
{d=d-b;}
printf("答:%lf...%lf(不足)\n",c,d);
if(d<0){
for(c=0;e>b;c=c+1)
{e=e-b;}
}
else{
for(c=0;e>0;c=c+1)
{e=e-b;}
}
printf("答:%lf...%lf(余り)",c,e);
}
return 0;
}

if文、if else文(条件分岐)-Wikipedia
https://ja.m.wikipedia.org/wiki/If%E6%96%87exit

『もしXならば、Yせよ、さもなくばZせよ』
(a<0)&&(b<0)…aが0より小さいかつbが0より小さい
(a<0)…aが0より小さい
(b<0)…bが0より小さい
else…さもなくば
👍
高評価
0
👎
低評価
0
132 うそとまこと
2020/08/12(水) 06:15:17 ID: bmxKTOyqIr
0÷0=0前提のゼロ除算(a÷0)対策プログラムを作成。整数(int%d)、負数非対応

#include <stdio.h>
int main()
{
int a,b,c,d,e,x,y;
printf("a÷bゼロ除算(a÷0)対策割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

x=(a*b);
y=(b*b);
d=x;
e=x;
for(c=0;d>0;c=c+1)
{d=d-y;}
printf("答:%d...%d(不足)\n",c,d/b);
if(d<0){
for(c=0;e>y;c=c+1)
{e=e-y;}
}
else{
for(c=0;e>0;c=c+1)
{e=e-y;}
}
printf("答:%d...%d(余り)",c,e/b);
return 0;
}
👍
高評価
0
👎
低評価
0
133 うそとまこと
2020/08/12(水) 06:17:13 ID: bmxKTOyqIr
プログラム内のx=(a*b)とy=(b*b)について、
まずは、a÷bにb/bを掛け(a×b)÷(b×b)とする。
b/b=1、b=0の時は解なしですが、ここでは解をめないで分子と分に分けます。
そうすることで、a÷0が(a×0)÷(0×0)となり、0÷0と同じ数式となります。

余り(不足)がd/b、e/bについては、a÷b=c…d(e)の数式にa:17,b:3を入すると、
17÷3=5…2
17÷3=6…-1
という計算結果になりますが、
(a×b)/(b×b)=c…d(e)の数式にa:17,b:3を入すると、
(17×3)/(3×3)=51/9
51÷9=5…6
51÷9=6…-3
と分が変化したことで余り(不足)も変化します。
なので、余り(不足)d、eを
51÷9=5…(6/3)→2
51÷9=6…(-3/3)→-1
となるよう分bで割ります。
👍
高評価
0
👎
低評価
0
134 ななしのよっしん
2020/08/12(水) 06:44:59 ID: HaMFJqdJET
はじめの方のプログラムはbが0の時にforをスキップしてなにもせずprintfして終わる
あとの方のプログラムはbが0の時にforをスキップしてなにもせずprintfの中身でゼロ除算によりエラーを出して終わる
多分
ゼロ除算の時は例外処理により0を吐くと言う意味ではゼロ除算を上手く定義しているとは言えないだろうね
👍
高評価
0
👎
低評価
0
135 うそとまこと
2020/08/12(水) 13:58:27 ID: bmxKTOyqIr
if(b==0)のプログラムは、bが0ならprintf(0で割らないでください)で終わり、forをスキップするのではなく、forを含むelse以下全てのプログラムの実行も読み込みもしません。

if(b==0)を取り払った後の方のプログラムには、bが0の時の条件分岐は一切使われてないです。負数の計算の時にelse if(b<0)とbが負数の時の条件分岐を使用しているだけです。

なので、aを代入したdとの見間違いだと思います。これは修正版では対応する予定です。
if(d>0)は、もしdが0より大きいなら{計算式}を実行し続けて、dが0以下になったら繰り返し処理を終了し、{計算式}をスキップしてprintf(答:c…d余り(不足))となります。
0÷bの時に、dが0以下なので繰り返し処理をせずに終了し、{計算式}をスキップしてprintf(答:c=0…(分子0を代入した)d=0(余り(不足)))となります。
if(b==0)の例外処理をしないプログラムを作成しているので再度確認お願いします。
👍
高評価
0
👎
低評価
0
136 うそとまこと
2020/08/12(水) 15:30:09 ID: bmxKTOyqIr
if(d>0)は、訂正→for(;d>0;)は、
👍
高評価
0
👎
低評価
0
137 うそとまこと
2020/08/13(木) 11:30:33 ID: bmxKTOyqIr
【捕捉】
>>125
0÷0(ゼロ除算)対策割り算

負数の余り(不足)をめる割り算では、if(b==0)の例外処理も他のif文も使用せずに(不足)をめられます。

a÷0(ゼロ除算)対策割り算

#include <stdio.h>
int main()
{
int a,b,c,d,x,y;
printf("a÷bゼロ除算(a÷0)対策割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

x=(a*b);
y=(b*b);
d=x;
for(c=0;d>0;c=c+1)
{d=(d-y);}
printf("答:%d...%d(不足)",c,d/b);
return 0;
}
👍
高評価
0
👎
低評価
0
138 うそとまこと
2020/08/13(木) 11:32:30 ID: bmxKTOyqIr
#include <stdio.h>
int main()
{
int a,b,c,d,e,x,y;
printf("a÷b両方の余りめる割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

x=(a*b);
y=(b*b);
d=x;
e=x;
for(c=0;d>0;c=c+1)
{d=d-y;}
printf("答:%d...%d(不足)\n",c,d/b);

if(d<0){
for(c=0;e>y;c=c+1)
{e=e-y;}
printf("答:%d...%d(余り)",c,e/b);
}
return 0;
}

両方の余りめる割り算では、その性質上必ずif文を使用します。
これは、【例外処理-Wikipedia】と【if文-Wikipedia】を確認してもらえれば、if(b==0)のような例外処理ではないと分かるはずです。
他にも気になる点があるかと思いますが、暫く続きますので気長にお付き合いください。
👍
高評価
0
👎
低評価
0
139 うそとまこと
2020/08/13(木) 12:03:17 ID: bmxKTOyqIr
>>126
>>137
else{
for(c=0;e>0;c=c+1)
{e=e-b;}
}

>>132
>>138
else{
for(c=0;e>0;c=c+1)
{e=e-y;}
}

これらのelseは、余りが0になる割り算、つまり割り切れる割り算が対になってます。
12÷2=6…0(不足) 13÷0=0…0(不足)
12÷2=6…0(余り) 13÷0=0…0(余り)
結果が同じように思えるかもしれませんが、数学的には別物だと勝手に判断しました。一応、プログラムでは、>>126>>132のように一めにできます。
👍
高評価
0
👎
低評価
0
140 うそとまこと
2020/08/13(木) 23:54:19 ID: bmxKTOyqIr
>>134
とりあえずif文を取り除いてプログラムを作成してみました。
続きは下記の修正版に切り替える予定です。浮動小数時に余り(不足)がnanになる説明と対策プログラムは最後になります。

両方の余りめる割り算ゼロ除算(a÷0)対策プログラムを作成。整数(int%d)、負数非対応

#include <stdio.h>
int main()
{
int a,b,c,d,e,x,y;
printf("a÷b両方の余りめる割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

x=(a*b);
y=(b*b);
d=x;
e=x;
for(c=0;(d>=y)&&(d!=0);c=c+1)
{d=d-y;}
printf("答:%d...%d(余り)\n",c,d/b);

for(c=0;e>0;c=c+1)
{e=(e-y);}
printf("答:%d...%d(不足)",c,e/b);
return 0;
}
👍
高評価
0
👎
低評価
0
141 うそとまこと
2020/08/13(木) 23:58:25 ID: bmxKTOyqIr
プログラム内のx=(a*b)とy=(b*b)について、
まずは、a÷bにb/bを掛け(a×b)÷(b×b)とする。
b/b=1、b=0の時は解なしですが、ここでは解をめないで分子と分に分けます。
そうすることで、a÷0が(a×0)÷(0×0)となり、0÷0と同じ数式となります。

余り(不足)がd/b、e/bなのは、例えばa÷b=c…d(e)の数式にa:17,b:3を入すると、
17÷3=5…2
17÷3=6…-1
という計算結果になります。しかし、(a×b)/(b×b)=c…d(e)の数式にa:17,b:3を入すると、
(17×3)/(3×3)=51/9
51÷9=5…6
51÷9=6…-3
と分が変化したことで余り(不足)も変化します。
なので、
51÷9=5…(6/3)→2
51÷9=6…(-3/3)→-1
となるよう余り(不足)d、eを分bで割ります。

for(c=0;(d>=y)&&(d!=0);c=c+1)の内容は、xを代入したdがy以上かつdが0以外なら、dからyを減算し続けて、dがyより小さいまたはdが0になったら終了。その回数cが答になり、減算されたdが余りになります。

for(c=0;e>0;c=c+1)の内容は、xを代入したeが0より大きいなら、eからyを減算し続けて、eが0以下になったら終了。その回数cが答になり、減算されたeが(不足)になります。

プログラム内と文章に余りではなく(不足)が使われてますが、これは例えば所持-100円が借に該当するのと同じような意味合いとお考えください。
👍
高評価
0
👎
低評価
0
142 ななしのよっしん
2020/08/15(土) 08:49:53 ID: HaMFJqdJET
b=0の時、
C言語intゼロ除算a/0はa>0の時におそらく無限ループエラー、a=0で未定義になり勝手な大きめの数になる
ポインタ仕様なのかscanf("%d",&b);をreturn 0;の前に記述すると0/0が0に固定されるっぽい
printf("答:%d...%d(余り)\n",c,d/b);
ゼロ除算d/bが含まれるがscanf、printfと0/0の仕様のせいでうまく動いているように見えるだけだね
ゼロ除算を禁止している言じゃそのアルゴリズムは動かないよ
👍
高評価
0
👎
低評価
0
143 ななしのよっしん
2020/08/15(土) 08:52:31 ID: HaMFJqdJET
正確には標準出に出す段階でエラーになる
計算の段階ではb≠0の時に普通に計算するがb=0のときは何もせず終了することには変わりない
👍
高評価
0
👎
低評価
0
144 うそとまこと
2020/08/15(土) 09:20:19 ID: bmxKTOyqIr
負の整数対応割り算整数(int%d)
#include <stdio.h>
int main()
{
int a,b,c,d,e,x,y;
printf("a÷b負の整数対応割り算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);
x=(a*b);
y=(b*b);
d=x;
e=x;
if(x<0){
for(c=0;(d<=(y*(-1)))&&(d!=0);c=c-1)
{d=d+y;}
printf("答:%d...%d(余り)\n",c,d/b);
for(c=0;e<0;c=c-1)
{e=(e+y);}
printf("答:%d...%d(不足)",c,e/b);
return 0;}
else{
for(c=0;(d>=y)&&(d!=0);c=c+1)
{d=d-y;}
printf("答:%d...%d(余り)\n",c,d/b);
for(c=0;e>0;c=c+1)
{e=(e-y);}
printf("答:%d...%d(不足)",c,e/b);}
return 0;}
👍
高評価
0
👎
低評価
0
145 ななしのよっしん
2020/08/15(土) 09:51:52 ID: HaMFJqdJET
b=0の時に
・何も計算せずreturn 0に進む
・標準出関数の中身にゼロ除算が含まれる
ここが全く変わっていない
結果的に「ゼロで割った結果を必ず0にする」と例外的に決めているのと何ら変わりない
しかも例外的に決まる理由が言仕様の不備でありそれに気付いていないようなコードになっているのが非常にまずい
👍
高評価
0
👎
低評価
0
146 うそとまこと
2020/08/15(土) 10:07:24 ID: bmxKTOyqIr
>>142>>143>>145

【加算で積算/C言語サンプル ソースプログラム佐伯英子技術士事務所情報工学)参照】
https://saeki-ce.xsrv.jp/C_src/kakezan01.htmlexit

加算で積算するプログラム作成。整数(int%d)、小数、負数非対応

#include <stdio.h>
int main()
{
int a,b,c;
printf("a×bを計算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

for(c=0;b>0;b=b-1)
{c=c+a;}
printf("答: %d",c);
return 0;
}

プログラム内のfor(c=0;b>0;b=b-1){c=c+a;}の内容は、b回aが加算。もう少し詳しく説明すると、bが-1され続け0になるまでaも同じ回数加算され続けます。
a×0の場合、>>143
『計算の段階ではb≠0の時に普通に計算するがb=0のときは何もせず終了することには変わりない』ことをします。
何処かの記述にa÷0だけでなく、a×0の定義も否定されたそうですが、乗算と除算の逆数関係だけでなく、『何もせずに終了』するプログラムも原因だったのかもしれませんね。
👍
高評価
0
👎
低評価
0
147 ななしのよっしん
2020/08/15(土) 10:36:02 ID: HaMFJqdJET
forの条件文でc=0と定義しているので「何もしない」は不正確だったか
・c=0を初期値とする
 ・b≠0の時cを変更する
 ・b=0の時cを変更しない
cを商として出するため初めにc=0と決めている以上b=0の時はc=0と決めていることになるわけ
そんでアルゴリズム関係の所でb=0のときにd/bが0/0になり、言仕様上0/0が0となってしまうバグ仕様?)が起きている
scanf("%d",&b);の行の代わりにb=0;を入れればわかると思う
他の言で同じような計算をすると普通は0...0じゃなく0...NaNになる
掛け算の時に問題がないように見えるのは「0を掛ければ必ず0になる」ことと「c=0と初めに定義してから同じように計算してcを積として出すること」がたまたま整合するだけ
👍
高評価
0
👎
低評価
0
148 うそとまこと
2020/08/15(土) 11:17:13 ID: bmxKTOyqIr
>>125プログラムでa÷0するとエラーしますが、0÷0はエラーせずに0÷0=0…0となります。
>>126と文章が別れてしまい少し分かり難く申し訳ないです。

>>140>>125の0÷0=0…0が前提となってます。こちらは記述が抜けてました。

>>125プログラムがもっとも重要で以降のプログラムもこれが前提となるので、まずはこちらのプログラムの0÷0=0…0になることについて考慮してもらえると助かります。
👍
高評価
0
👎
低評価
0
149 ななしのよっしん
2020/08/15(土) 11:39:38 ID: HaMFJqdJET
>>125プログラムでa÷0でエラーになるのは無限ループになるから、0÷0でエラーにならず0÷0=0…0となるのはd=0であるためforの条件d>0を満たさずループを一度も経ないため初期値C=0、d=0を変更しないまま終了するから
本質的にマズさは何も変わっていない
以降のプログラムと違い出関数に0/0が含まれないため他の言でも出時に特に問題が起こらないことが予想できる
でも「分が0の時に例外的に0あまり0を出する」プログラムを「ゼロ除算を回避する」といっていいのか
同じアルゴリズムで計算してはいないから回避していると言ってもいいが0にまで拡したアルゴリズムでないから何の役にも立っていないな
駄にd=aなどと変数を増やしているせいで可読性も低い
👍
高評価
0
👎
低評価
0
150 うそとまこと
2020/08/15(土) 17:05:37 ID: bmxKTOyqIr
>>124
if(b==0)の例外処理をfor文内に移植して、for(c=0;(d>=b)&&(b!=0);c=c+1)とプログラムを作成。整数(int%d)、負数非対応

#include <stdio.h>
int main()
{
int a,b,c,d,e;
printf("a÷b減算で除算\n");
printf("a:");
scanf("%d",&a);
printf("b:");
scanf("%d",&b);

d=a;
for(c=0;(d>=b)&&(b!=0);c=c+1)
{d=d-b;}
printf("答:%d...%d(余り)",c,d);
return 0;
}

>>149
お互いfor文を勘違いしていたようです。
上記のプログラムにa:2とb:0を入すると、答:0…2(余り)になりました。
つまり、bが0ならループを一度も経ないでprintf()ではなく、bが0なら{d=d-b}→{d=2-0}をしてprintf(答:c…d)→(答:0…2(余り))になります。
ちなみに、数年前にこのプログラムも作成してましたが、余りが0にならなく放置し再現するまですっかり忘れてました。

>>125
a:0とb:0を入すると、
aを代入したdが0以下なら、{d=d-b}→{d=0-0}をしてprintf(答:c…d)→(答:0…0(不足))になるようです。
d=a;に関しては、aのまま使用していたらプログラム作成に不具合が生じたからです。ついでに、a÷b=c…d(余り)とa÷b=c…e(不足)としたほうが見易く勘違いが少なく済むかと。
👍
高評価
0
👎
低評価
0