電子書籍の厳選無料作品が豊富!

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

東方C++2008を使っております

よろしくおねがいします。

A 回答 (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;
}
    • good
    • 0

まず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.t …


もうひとつは、対話的に処理を行うケース。
例えば
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;
}

この回答への補足

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

補足日時:2011/05/12 23:15
    • good
    • 1
この回答へのお礼

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

お礼日時:2011/05/16 22:59

#include <stdio.h>


int main()
{
printf("%f\n", (double)(
#include "con"
);
return 0;
}

ってファイルを「コンパイル・実行する」ようなプログラムを作ったらいいんじゃね?
    • good
    • 0
この回答へのお礼

試してみます。

こんなに短い文章でできるとは思いませんでした。

ありがとうございました。

お礼日時:2011/05/12 23:11

じゃ、まずは過去問から。


http://oshiete.goo.ne.jp/qa/3066867.html

そのほかに、
http://www.ccad.sist.chukyo-u.ac.jp/~mito/ss/pro …
http://www.indsys.chuo-u.ac.jp/~kato/C07/CGuide/ …

この中に使えそうなのありますか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/12 23:12

一口に電卓といいましても、いろんな種類があるわけですね。


四則演算だけできればいいのか、数学関数も必要なのか、
カッコによる演算の優先順位にも対応する必要があるのか、
入力方式は数式どおりなのか逆ポーランド記法なのか、等々、
まあとにかく仕様を示さないことには、ここの板にいらっしゃる
どんな親切な方でもご希望に添うことはできないんじゃないでしょうか。

ところで、ソースを教えてもらってどうなさるおつもりなんでしょうね。
まさか、課題の答えとしてそのまま提出する、なんてことはないものと信じたいです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/05/12 23:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!