第84話 電卓と、加減算と、未完成品

 魔王タイトの魔法手引書には役に立つ魔法が沢山ある。

 俺はその中から、電卓魔法を見つけた。


 まずは簡単な足し算のみの奴。


#include <stdio.h>

#include <stdlib.h>


extern int tax_collection(int money);

int main(int argc,char *argv[])


{

 int i,sum=0; /*合計*/


 if(argc<=1) return(0); /*足し算なし*/


 if(tax_collection(1)==1){ /*税金徴収、銅貨1枚 金が無ければ、何も起こらない*/

  for(i=1;i<argc;i++){ /*入力された数だけループする*/

   sum=sum+atoi(argv[i]); /*入力された数値を足す*/

  }

 }

 return(sum); /*答えを返す*/

}


 足し算のみのアプリだ。

 銅貨一枚は高すぎるので少し改良が必要か。

 20回で銅貨1枚が妥当かな。


 20回のループを増やすのと、入力関係をなんとかすれば良い。

 簡単な事だ。


#include <stdio.h>

#include <stdlib.h>


extern int tax_collection(int money);

void main(void)


{

 int i,j,sum; /*カウンタ2つと、合計*/


 if(tax_collection(1)==1){ /*税金徴収、銅貨1枚 金が無ければ、何も起こらない*/

  for(i=1;i<20;i++){ /*20回ループ*/

   sum=0;

   while(1){

    scanf("%d",&j); /*数入力*/

    if(j==9999) break; /*9999がイコールの代わり*/

    sum=sum+j; /*数を足す*/

   }

   printf("%d\n",sum); /*答え表示*/

  }

 }

}


 こんな感じに改良した。


 足し算のみの計算をする部署は多い。

 それなりに使えるだろう。

 使用料は20回で銅貨1枚。

 アプリの売値は金貨1枚とした。

 高いが買う奴はいる。


 足し算だけのアプリは流行った。

 日常の買い物だとそれで済むものな。


「ええと引き算の混在も欲しいです」


 ラメルに懇願された。


「まあ作ってみるけど」


#include <stdio.h>

#include <stdlib.h>


extern int tax_collection(int money);

void main(void)


{

 int i,sum; /*カウンタ2つと、合計*/

 char val[256];


 if(tax_collection(1)==1){ /*税金徴収、銅貨1枚 金が無ければ、何も起こらない*/

  for(i=1;i<20;i++){ /*20回ループ*/

   sum=0;

   while(1){

    scanf("%s",val); /*数入力*/

    if(val[0]=='=') break; /*イコールで終り*/

    sum=sum+atoi(val); /*数を足す*/

   }

   printf("%d\n",sum); /*答え表示*/

  }

 }

}


 手抜きだが、数字の頭にマイナスを付けると引き算になる。

 『123 256 -589 =』と入力すると『123+256-589』の計算をしてくれる。


「これでどう?」

「ここまで言ったら掛け算と割り算も」


 そこまで来ると正直ギブアップ気味だ。

 作れるか作れないかと言ったら作れるけども。



 手引き書に何ページにも渡る魔法がある。

 まだ未完成らしいが、魔法電卓という事だ。

 入力された数字の表示と、演算順位の処理が出来てないらしい。


 十分に思える。

 小数点以下が出来たらもっと良いと感じるぐらいしか思えない。

 あとでバージョンアップしてアプリにしてみよう。


 加減算のアプリは爆発的に流行った。

 置いてない店の方が少ないぐらいだ。

 ヘーゼルはさぞ悔しがった事だろう。

 同じ魔道具がはたして作れるかな。


 魔道具職人の頭を抱える姿が目に浮かぶ。


――――――――――――――――――――――――

 未完成の電卓です。

 プログラムの最中で嫌になったとも言う。


 長くなり過ぎたので文末に載せておきます。

 表示とか色々な改良点がありますが、へっぼこなので完成版を作る気力がわきません。

 別に読まなくても支障はないです。


#include <stdio.h>

#include <stdlib.h>



extern MAGIC *obj_make(long obj_size_mm,int image,int attri);

extern int touch(MAGIC *mp);

extern int mclose(MAGIC *mp);


MAGIC *mp[10],*mpadd,*mpsub,*mpmul,*mpdiv,*mpequ; /*魔法の定義*/

int sum,value,step; /*合計、対象の数、ステップ*/


void value_inpit(void)

{

 int i; /*カウンタ*/

 for(i=0;i<10;i++){

  if(touch(mp[i])==1){ /*数字に触った*/

   value=value*10+i; /*桁が進む*/

  }

 }

}

void close_button(void) /*ボタンを閉じる*/

{

 for(i=0;i<10;i++){

  mclose(mp[i]);

 }

 mclose(mpadd);

 mclose(mpsub);

 mclose(mpmul);

 mclose(mpdiv);

 mclose(mpequ);

}


int main(void)

{

 int image_button[10]={IMAGEBUTTON0,IMAGEBUTTON1,IMAGEBUTTON2,IMAGEBUTTON3,IMAGEBUTTON4,IMAGEBUTTON5,IMAGEBUTTON6,IMAGEBUTTON7,IMAGEBUTTON8,IMAGEBUTTON9}; /*ボタンイメージ*/

 int i; /*カウンタ*/


 for(i=0;i<10;i++){

  mp[i]=obj_make(10,IMAGEBUTTON[i],HOLOGRAPHY); /*0から9までの番号が書かれたボタンをホログラフィで生成*/

 }


 mpadd=obj_make(10,IMAGEBUTTONADD,HOLOGRAPHY); /*+と書かれたボタンをホログラフィで生成*/

 mpsub=obj_make(10,IMAGEBUTTONSUB,HOLOGRAPHY); /*-と書かれたボタンをホログラフィで生成*/

 mpmul=obj_make(10,IMAGEBUTTONMUL,HOLOGRAPHY); /*×2と書かれたボタンをホログラフィで生成*/

 mpdiv=obj_make(10,IMAGEBUTTONDIV,HOLOGRAPHY); /*÷と書かれたボタンをホログラフィで生成*/

 mpequ=obj_make(10,IMAGEBUTTONEQU,HOLOGRAPHY); /*=と書かれたボタンをホログラフィで生成*/


 sum=0; /*合計0*/

 value=0; /*数値0*/

 step=0; /*処理ステップ0*/


 while(1){

  switch(step){

   case 0: /*最初*/

    if(touch(mpsub)==1){ step=2; break; } /*マイナスから始まる*/

    value_inpit(); /*1桁入力*/

    if(value!=0){ step=1; break; } /*プラスから始まる*/

   break;


   case 1: /*足す*/

    value_inpit(); /*1桁入力*/

    if(touch(mpadd)==1){ step=1; sum=sum+value; value=0; break; }

    if(touch(mpsub)==1){ step=2; sum=sum+value; value=0; break; }

    if(touch(mpmul)==1){ step=3; sum=sum+value; value=0; break; }

    if(touch(mpdiv)==1){ step=6; sum=sum+value; value=0; break; }

    if(touch(mpequ)==1){ sum=sum+value; close_button(); retuen(sum); } /*イコール処理*/

   break;

   case 2: /*引く*/

    value_inpit(); /*1桁入力*/

    if(touch(mpadd)==1){ step=1; sum=sum-value; value=0; break; }

    if(touch(mpsub)==1){ step=2; sum=sum-value; value=0; break; }

    if(touch(mpmul)==1){ step=3; sum=sum-value; value=0; break; }

    if(touch(mpdiv)==1){ step=6; sum=sum-value; value=0; break; }

    if(touch(mpequ)==1){ sum=sum-value; close_button(); retuen(sum); } /*イコール処理*/

   break;


   case 3: /*掛ける*/

    if(touch(mpsub)==1){ step=4; break; } /*マイナスを掛ける*/

    value_inpit(); /*1桁入力*/

    if(value!=0){ step=5; break; } /*プラスを掛ける*/

   break;

   case 4: /*掛けるマイナス*/

    value_inpit(); /*1桁入力*/

    if(touch(mpadd)==1){ step=1; sum=sum*value*-1; value=0; break; }

    if(touch(mpsub)==1){ step=2; sum=sum*value*-1; value=0; break; }

    if(touch(mpmul)==1){ step=3; sum=sum*value*-1; value=0; break; }

    if(touch(mpdiv)==1){ step=4; sum=sum*value*-1; value=0; break; }

    if(touch(mpequ)==1){ sum=sum*value*-1; close_button(); retuen(sum); } /*イコール処理*/

   break;


   case 5: /*掛けるプラス*/

    value_inpit(); /*1桁入力*/

    if(touch(mpadd)==1){ step=1; sum=sum*value; value=0; break; }

    if(touch(mpsub)==1){ step=2; sum=sum*value; value=0; break; }

    if(touch(mpmul)==1){ step=3; sum=sum*value; value=0; break; }

    if(touch(mpdiv)==1){ step=4; sum=sum*value; value=0; break; }

    if(touch(mpequ)==1){ sum=sum*value; close_button(); retuen(sum); } /*イコール処理*/

   break;


   case 6: /*割る*/

    if(touch(mpsub)==1){ step=7; break; }

    value_inpit(); /*1桁入力*/

    if(value!=0){ step=8; break; }

   break;

   case 7: /*割るマイナス*/

    value_inpit(); /*1桁入力*/

    if(touch(mpadd)==1){ step=1; sum=sum/value*-1; value=0; break; }

    if(touch(mpsub)==1){ step=2; sum=sum/value*-1; value=0; break; }

    if(touch(mpmul)==1){ step=3; sum=sum/value*-1; value=0; break; }

    if(touch(mpdiv)==1){ step=4; sum=sum/value*-1; value=0; break; }

    if(touch(mpequ)==1){ sum=sum/value*-1; close_button(); retuen(sum); } /*イコール処理*/

   break;


   case 8: /*割るプラス*/

    value_inpit(); /*1桁入力*/

    if(touch(mpadd)==1){ step=1; sum=sum/value; value=0; break; }

    if(touch(mpsub)==1){ step=2; sum=sum/value; value=0; break; }

    if(touch(mpmul)==1){ step=3; sum=sum/value; value=0; break; }

    if(touch(mpdiv)==1){ step=4; sum=sum/value; value=0; break; }

    if(touch(mpequ)==1){ sum=sum/value; close_button(); retuen(sum); } /*イコール処理*/

   break;

  }

 }

 close_button(); /*ボタン閉じる*/

 retuen(sum); /*終わり*/

}

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る