とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

Cパズルプログラミング-再帰編(6)

→続々 Karetta|Cパズルプログラミング-再帰編|四則演算
電卓ー。

Karetta|Cパズルプログラミング-再帰編|数式もどき
演算子の優先順位無視バージョンの電卓。初めの数に符号({+|-})をつけるとだめだったり,何より変な入力をすると簡単に落ちてくれる。(^^)b
まぁ,%演算子(剰余演算子)を追加したから許して。

expr4.c

Karetta|Cパズルプログラミング-再帰編|expr4.c

#include<ctype.h>
char*GetToken(const char**s,char*t){
char*p=t;
for(;isspace(**s);++*s);
if(**s=='\n'||**s==0){*t=0;return 0;}
if(isdigit(**s))do*p++=*(*s)++;while(isdigit(**s));
else*p++=*(*s)++;
*p=0;
return t;
}
#include<stdlib.h>
#include<stdio.h>
int Evaluate(const char*s){
int r=0,v;
char*t=malloc(1024),o;
if(t)for(r=atoi(GetToken(&s,t));GetToken(&s,t)&&(o=*t,v=atoi(GetToken(&s,t)));)
switch(o){
case'+':r+=v;break;
case'-':r-=v;break;
case'*':r*=v;break;
case'/':r/=v;break;
case'%':r%=v;
}
free(t);
return r;
}
int main(void){
char*s=malloc(1024);
if(s)for(;printf("expr:"),fgets(s,1024,stdin);)printf("\t=%d\n",Evaluate(s));
free(s);
}