電卓作成中

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

電卓作成中

#1

投稿記事 by たのもー » 17年前

皆さんお久しぶりです。
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:電卓作成中

#2

投稿記事 by むつ » 17年前

・「ゼロ割」というのはご存知ですか。
0 で割る事は御法度なんですよ。
・int ではなく double の方がいいのでは。
・自分は、if() continue; より switch() break;の方が好み。

たのもー

Re:電卓作成中

#3

投稿記事 by たのもー » 17年前

超速解答ありがとうございます。
よく勉強していなかったせいか
「ゼロ割」というのがわかりません。
良ければ教えてください。

管理人

Re:電卓作成中

#4

投稿記事 by 管理人 » 17年前

数字を0で割ってはいけないと言う事ご存知ですか?
小学校で習うのですが、小学校の担任は自分自身なんで0で割ってはいけないのか解っていない場合が多いので、教えられている方は意味もわからず教えられたんじゃないかと思います。

うちんとこはホントひどい教え方でした・・。

三角関数の表にもtanが90°のとこだけ「値なし」となっているはずです。
何故0で割ってはいけないかと言うと・・。

むつ

Re:電卓作成中

#5

投稿記事 by むつ » 17年前

y = 1 ÷ 0 を展開して、
1 = y × 0 とすると、y がいくつであっても 0 を掛けるので 0 となり、
1 = 0 と矛盾がおきてしまう。

多くの場合、「ゼロ割」によって、プログラムが強制終了すると思われます。

管理人

Re:電卓作成中

#6

投稿記事 by 管理人 » 17年前

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:電卓作成中

#7

投稿記事 by 管理人 » 17年前

う、かぶりました、すみませんm(_ _|||)m

管理人

Re:電卓作成中

#8

投稿記事 by 管理人 » 17年前

これは学校の課題ですか?
ご自分で興味で作成されているのでしょうか?

規定された仕様に沿わなくていいのでしたら色々簡単に実装出来ます。
ただし複雑な計算、優先順位やカッコ優先条件などを付けようとすると少し複雑になってきます。
例えば 
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:電卓作成中

#9

投稿記事 by ダッシュ » 17年前

ゼロ割についての補足をば。

等式 y=a÷0があったとします。

(ⅰ)aが0でないとき(1とか3とかなんでもいいです。)
  これについては先に解答されてるので省略

(ⅱ)a=0のとき

  y=0÷0
  y×0=0

ここでyに何を入れてもこの等式は成立してしまいます。
何を入れても解になるなんて解とは言えません。

よってゼロ割は禁止なわけです。
ちなみに前者を『不能』後者を『不定』というようです。

管理人

Re:電卓作成中

#10

投稿記事 by 管理人 » 17年前

あぁ数学IIIをやっていた頃が遠い昔のように思えます・・。
大学受験の頃は必死になってやったものですが、今では線形代数位しか出来ません・・。
忘れるってもったいないことですね(T_T

たのもー

Re:電卓作成中

#11

投稿記事 by たのもー » 17年前

丁寧な解答ありがとうございました。
とてもわかりやすく解説していただいたので、
また一歩上達したと思います。
本当にありがとうございました。

ちなみにこのプログラムは興味があったので作ってみました。
私はまだ高1なので学校の課題ではありません。

管理人

Re:電卓作成中

#12

投稿記事 by 管理人 » 17年前

高1ですかぁ、皆さん早くから勉強されてらっしゃるのですね~(´_`;
そのお年でC言語を一通り勉強されたとは・・管理人も頑張らなくては^^;

管理人

Re:電卓作成中

#13

投稿記事 by 管理人 » 17年前

条件の書き方の練習で言えばジャンケンプログラムとかいいのではないでしょうか^^
私がはじめて作ったゲームもジャンケンでした。

コンソール画面から単に入力を受け取って乱数で勝ち負け判定する
つまり実行結果は

最初はグー!ジャンケン・・・

press  1:グー 2:チョキ 3:パー
1
あなたは「グー」
コンピュータは「チョキ」
あなたの勝ちです!
 


こんな感じになります。
後になって思ったのですが、このプログラムの書き方はものすごく沢山あります。
全部条件をif文で書くという「賢くない書き方」しか最初出来ませんが
徐々に理解していくうちに「賢い書き方」が解るようになってきます。

アルゴリズムを考える問題として少し難しいですが、こういう「遊びながら覚える」って勉強の仕方が私は好きでした^^

管理人

Re:電卓作成中

#14

投稿記事 by 管理人 » 17年前

「ジャンケンプログラムを作ろう!」のトピで
そのプログラムについて紹介したのでよければ見てください^^

たのもー

Re:電卓作成中

#15

投稿記事 by たのもー » 17年前

ありがとうございます。
今から読みに行きます。

閉鎖

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