ページ 1 / 1
電卓作成中
Posted: 2007年3月26日(月) 01:44
by たのもー
皆さんお久しぶりです。
C言語の勉強のほうは基本は一通り終えました。
ので、電卓を作ろうと思って一応作っては見ましたが
まったく使い物になりません。
キタナイソースコードだとは思いますが一応
見てみてください。
汚点や改良点などたくさんあると思います。
もし見つけられたら、アドバイスお願いしますm(_ _)m
↓↓ソースコードです↓↓
#include<stdio.h>
int h;
char j;
int i;
main (){
int l;
scanf("%d",&l);
h=l;
while(1){
scanf("%d",&i);
printf("足し算の場合はaを、引き算の場合はbを、掛け算の場合はcを、割り算の場合はdを、+,ー,×,÷の代わりに押してください。\n");
scanf("%c",&j);
if(j == 'c' ){
h=i*h;
continue;
}
else if(j == 'a'){
h=i+h;
continue;
}
else if(j == 'b'){
h=h-i;
continue;
}
else if(j == 'd'){
h=h/i;
continue;
}
else{
printf("プログラムを終了します。\n");
break;
}
}
printf("合計は%dです。",h);
return 0;
}
Re:電卓作成中
Posted: 2007年3月26日(月) 01:58
by むつ
・「ゼロ割」というのはご存知ですか。
0 で割る事は御法度なんですよ。
・int ではなく double の方がいいのでは。
・自分は、if() continue; より switch() break;の方が好み。
Re:電卓作成中
Posted: 2007年3月26日(月) 02:27
by たのもー
超速解答ありがとうございます。
よく勉強していなかったせいか
「ゼロ割」というのがわかりません。
良ければ教えてください。
Re:電卓作成中
Posted: 2007年3月26日(月) 03:01
by 管理人
数字を0で割ってはいけないと言う事ご存知ですか?
小学校で習うのですが、小学校の担任は自分自身なんで0で割ってはいけないのか解っていない場合が多いので、教えられている方は意味もわからず教えられたんじゃないかと思います。
うちんとこはホントひどい教え方でした・・。
三角関数の表にもtanが90°のとこだけ「値なし」となっているはずです。
何故0で割ってはいけないかと言うと・・。
Re:電卓作成中
Posted: 2007年3月26日(月) 03:02
by むつ
y = 1 ÷ 0 を展開して、
1 = y × 0 とすると、y がいくつであっても 0 を掛けるので 0 となり、
1 = 0 と矛盾がおきてしまう。
多くの場合、「ゼロ割」によって、プログラムが強制終了すると思われます。
Re:電卓作成中
Posted: 2007年3月26日(月) 03:09
by 管理人
a * b = c
という式があったとします。これはプログラムの代入式ではなく数式だと思ってください。
特に難しい式な訳ではなく、
1 * 2 = 2
1かけ2は2だという当たり前の式です。これは両辺をbで割る・・つまり2で和っても同じ等式になりますね。
1 * 2 / 2 = 2 / 2
これは
1 = 1
になりますから正しいです。両辺を等しい数で割ると等式がなりたっていたのなら計算後もきちんとなりたちます。
これだけ解っていたら大丈夫。
今
a * b = c
について
2 * b = c
であると仮定します。
ここでbが0である時、cは0でなければ等式は成り立ちません。
しかし両辺をbで割って
2 = c/b
とした時、bが0である時、この等式を成り立たせるにはcに何をいれたらいいですか・・?
そう、bが0になってしまうと等式が成り立たない。。。つまりcの解は「正解の値が無い」ということになってしまいます。
ですからtanの表に「値なし」と書いてある部分があるわけですね。
ですから値は0で割ってはいけません。
Re:電卓作成中
Posted: 2007年3月26日(月) 03:09
by 管理人
う、かぶりました、すみませんm(_ _|||)m
Re:電卓作成中
Posted: 2007年3月26日(月) 03:39
by 管理人
これは学校の課題ですか?
ご自分で興味で作成されているのでしょうか?
規定された仕様に沿わなくていいのでしたら色々簡単に実装出来ます。
ただし複雑な計算、優先順位やカッコ優先条件などを付けようとすると少し複雑になってきます。
例えば
2.3 + 4 * 7.2 / (4.3 + 8)
こういう計算です。
とりあえず2つの値の計算だけやればいいのなら
例えば
2.3 * 8.1
みたいな計算だけでいいのなら簡単です。
int型を使用されてらっしゃいましたが、2/3のような計算がint型では出来ないのでdouble型を使用してみましょう。
double val1,val2,ans;
val1,val2が2つの値を格納する変数で、ansに答えを代入します。
演算記号を格納する為に
char c;
で一つ文字型の変数を用意しておきます。
scanf("%lf%c%lf",&val1,&c,&val2);
このように書くことで、double型のval1,val2に値が格納でき、なおかつ真ん中の記号をchar型で代入する事が出来ます。
今cには「+-*/」のどれかの記号がはいっていますから、この記号にわけて計算してやればいいですね。
後は単に出力してやりましょう。
上記の事をプログラムで書くとこうなります。
#include <stdio.h>
int main(){
double val1,val2,ans;
char c;
printf("計算式を入力してください。(例 2.12*3.99)\n");
scanf("%lf%c%lf",&val1,&c,&val2);
switch(c){
case '+':
ans = val1 + val2;
break;
case '-':
ans = val1 - val2;
break;
case '*':
ans = val1 * val2;
break;
case '/':
ans = val1 / val2;
break;
default:
printf("異常な演算子の入力\n");
return 0;
}
printf("%f %c %f = %f\n",val1,c,val2,ans);
return 0;
}
こうかくとスマートに書けますよね。
switch文を使いましたけど、使い方わかりました?
ここで先ほど問題になった、「
分母が0なら割り算をしない」という条件を付け加えたら
2つの値の計算プログラムとしては完璧です。
カッコや優先順位を気にせずにだらだらかけたり足したり延々としていくプログラムなら
こんな要領のプログラムをループさせればいいでしょう。
Re:電卓作成中
Posted: 2007年3月26日(月) 15:37
by ダッシュ
ゼロ割についての補足をば。
等式 y=a÷0があったとします。
(ⅰ)aが0でないとき(1とか3とかなんでもいいです。)
これについては先に解答されてるので省略
(ⅱ)a=0のとき
y=0÷0
y×0=0
ここでyに何を入れてもこの等式は成立してしまいます。
何を入れても解になるなんて解とは言えません。
よってゼロ割は禁止なわけです。
ちなみに前者を『不能』後者を『不定』というようです。
Re:電卓作成中
Posted: 2007年3月26日(月) 15:59
by 管理人
あぁ数学IIIをやっていた頃が遠い昔のように思えます・・。
大学受験の頃は必死になってやったものですが、今では線形代数位しか出来ません・・。
忘れるってもったいないことですね(T_T
Re:電卓作成中
Posted: 2007年3月26日(月) 16:12
by たのもー
丁寧な解答ありがとうございました。
とてもわかりやすく解説していただいたので、
また一歩上達したと思います。
本当にありがとうございました。
ちなみにこのプログラムは興味があったので作ってみました。
私はまだ高1なので学校の課題ではありません。
Re:電卓作成中
Posted: 2007年3月26日(月) 16:23
by 管理人
高1ですかぁ、皆さん早くから勉強されてらっしゃるのですね~(´_`;
そのお年でC言語を一通り勉強されたとは・・管理人も頑張らなくては^^;
Re:電卓作成中
Posted: 2007年3月26日(月) 16:30
by 管理人
条件の書き方の練習で言えばジャンケンプログラムとかいいのではないでしょうか^^
私がはじめて作ったゲームもジャンケンでした。
コンソール画面から単に入力を受け取って乱数で勝ち負け判定する
つまり実行結果は
最初はグー!ジャンケン・・・
press 1:グー 2:チョキ 3:パー
1
あなたは「グー」
コンピュータは「チョキ」
あなたの勝ちです!
こんな感じになります。
後になって思ったのですが、このプログラムの書き方はものすごく沢山あります。
全部条件をif文で書くという「賢くない書き方」しか最初出来ませんが
徐々に理解していくうちに「賢い書き方」が解るようになってきます。
アルゴリズムを考える問題として少し難しいですが、こういう「遊びながら覚える」って勉強の仕方が私は好きでした^^
Re:電卓作成中
Posted: 2007年3月26日(月) 17:44
by 管理人
「ジャンケンプログラムを作ろう!」のトピで
そのプログラムについて紹介したのでよければ見てください^^
Re:電卓作成中
Posted: 2007年3月26日(月) 20:02
by たのもー
ありがとうございます。
今から読みに行きます。