• ベストアンサー

簡単な電卓プログラムについて

今C言語をやっているのですがまだ始めたばかりで全然わかっていない者です。 なるべく簡単な構文で電卓のプログラムを作りたいのですがそのソースを教えてくださいませんか? 東方C++2008を使っております よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

すっごく省略してるので、変な式を入れないでください。 #include <stdio.h> #include <stdlib.h> char buffer[1024]; // とりあえず、間に合うでしょう。 char *ptr; int isdlim(char c){ if((c=='*')||(c=='/')||(c=='+')||(c=='-')) return 1; if(c=='\0') return 1; return 0; } char *skip(){ if( *ptr == '\0' ) return NULL; while( !isdlim(*ptr) ) ptr++; if(*ptr == '\0') return NULL; return ptr; } double kou(){ double ans; char *tmp; ans = atof(ptr) ; while( tmp = ptr, skip() != NULL ){ switch (*ptr ++){ case '*': ans *= atof(ptr); break; case '/': ans /= atof(ptr); break; default: ptr = tmp; return ans; } } return ans; } double shiki(){ long double ans; ans = kou(); while( skip() != NULL ){ switch (*ptr++){ case '+': ans += kou(); break; case '-': ans -= kou(); break; default: return ans; } } return ans; } int main(){ int i,bracket; fprintf(stdout,"Input > "); scanf("%s",&buffer); ptr = buffer; printf(" Ans = %f\n",shiki()); return 0; }

その他の回答 (4)

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.4

まずGUIでしょうか?CUIでしょうか? GUIであれば、電卓以前にGUIの基礎をお勉強することをオススメするとして、 CUIを前提に考えてみます。 他の方も指摘していますが、構文解析が必要なプログラムをお求めでしょうか。 例えば >calc.exe "1+2+3" 6 と動作するようなもの。 それでしたら、文字列を要素ごとに分解するパース処理と、分解されたものを 実際に計算していく処理が必要になります。 逆ポーランド記法のツリーを作ると計算が非常に楽なんですが、Cを始めたばかりで そんなプログラム書くのは難しいと思います。 一応lexとyaccというライブラリを使えば大分楽に書けます。 ご参考: http://kmaebashi.com/programmer/c_yota/calc.html 読むの大変ですが、オープンソースで同様のプログラムがあります。 exprというプログラムで、以下の圧縮ファイル内のsrc/expr.cがソースコードです、たぶん。 http://ftp.gnu.org/gnu/coreutils/coreutils-8.9.tar.gz もうひとつは、対話的に処理を行うケース。 例えば num>100 op>+ num>20 [120.000000] op>/ num>2 [60.000000] op> といった風に動作するもの。 上記であれば、一応下記にサンプルコードを貼っておきます。 gcc向けに書いたんで、VC++で動かすには手直しがいるかもしれませんが、 参考にはなるかと思います。 #include <stdio.h> #include <stdbool.h> int main(int argc, const char *argv[]) { float num,result=0; char op[2],buf[64]; printf("num>"); fgets(buf, 64, stdin); sscanf(buf, "%f", &result); while(true){ printf("op>"); fgets(op, 2, stdin); printf("num>"); scanf("%f", &num); fgets(buf, 64, stdin); sscanf(buf, "%f", &num); switch(op[0]){ case '+': result+=num; break; case '-': result-=num; break; case '/': result/=num; break; case '*': result*=num; break; } printf("[%f]\n", result); } return 0; }

kameron220
質問者

お礼

完成しました。 とても参考になりました。 また何かありましたらよろしくお願いします。

kameron220
質問者

補足

単に+-*/の計算さえできれば良い電卓プログラムになります。 GUI CUIとありますが、コマンドプロントにて動かしたいとおもいます。 よろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

#include <stdio.h> int main() { printf("%f\n", (double)( #include "con" ); return 0; } ってファイルを「コンパイル・実行する」ようなプログラムを作ったらいいんじゃね?

kameron220
質問者

お礼

試してみます。 こんなに短い文章でできるとは思いませんでした。 ありがとうございました。

noname#208392
noname#208392
回答No.2
kameron220
質問者

お礼

気長に読んで覚えていきたいと思います。 ありがとうございました。

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

一口に電卓といいましても、いろんな種類があるわけですね。 四則演算だけできればいいのか、数学関数も必要なのか、 カッコによる演算の優先順位にも対応する必要があるのか、 入力方式は数式どおりなのか逆ポーランド記法なのか、等々、 まあとにかく仕様を示さないことには、ここの板にいらっしゃる どんな親切な方でもご希望に添うことはできないんじゃないでしょうか。 ところで、ソースを教えてもらってどうなさるおつもりなんでしょうね。 まさか、課題の答えとしてそのまま提出する、なんてことはないものと信じたいです。

kameron220
質問者

お礼

まだまだ力不足ですががんばってC言語を覚えていきたいともいます。 どうもありがとうございました。

関連するQ&A