• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:四則演算のプログラム)

四則演算のプログラムを解説します

このQ&Aのポイント
  • 四則演算のプログラムを解説します。
  • プログラムの実行方法や参照についても詳しく説明します。
  • 問題がある場合は修正箇所も指摘します。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★まず引数 argv、argc とは? ・『argv』はコマンドラインの引数を、空白文字で区切ってその文字列をポインタへの配列に  セットします。『char *argv[]』とはその定義です。 ・『argc』はコマンドラインの引数を、空白文字で区切った文字列の個数です。 ・よって『sample.exe abc def 123 /s /o』というコマンドラインならば、  argc=6  argv[0]="sample.exe" ←プログラム名など(処理系によっては空文字列かも)  argv[1]="abc"  argv[2]="def"  argv[3]="123"  argv[4]="/s"  argv[5]="/o"  argv[6]=NULL ←NULLポインタがセット ・となります。 ●本題 ・第一引数の記号は『atof』を使わずに『kigou=argv[1][0];』とすれば良い。 ・argv[1]="abc"のとき、  argv[1][0]='a'  argv[1][1]='b'  argv[1][2]='c'  argv[1][3]='\0' ・として取り出せます。 ●サンプル int main( int argc, char *argv[] ) {  char kigou = argv[1][0]; ←ここがポイント  double num1 = atof(argv[2]);  double num2 = atof(argv[3]);    switch ( kigou ){ ←switch 文のほうが分かりやすいよ   case '+': printf( "%f+%f=%f\n", num1, num2, (num1 + num2) ); break;   case '-': printf( "%f-%f=%f\n", num1, num2, (num1 - num2) ); break;   case 'x': printf( "%f*%f=%f\n", num1, num2, (num1 * num2) ); break;   case '/': printf( "%f/%f=%f\n", num1, num2, (num1 / num2) ); break;   case '%': printf( "%f%%%f=%f\n", num1, num2, fmod(num1,num2) ); break; ←ここも重要   default: printf( "Please input +,-,x,/,%%.\n" ); ←『/』を追加  }  return( 0 ); } 最後に: ・浮動小数点の『%』は関数『fmod』を使います。→直接『%』演算子を使えません。 ・整数値の『char』、『short』、『int』、『long』型などは直接『%』演算子で剰余を  計算できますが、浮動小数点の『float』、『double』型では関数の『fmodf』、『fmod』  の関数を使います。→テキスト(教科書)などの算術演算を参照して下さい。 ・注意。割り算と剰余の場合に『num2』が『0』だと『ゼロ除算エラー』が発生します。 ・『num2』が『0』のときは計算不能というエラーを表示した方が良いです。 ・以上。おわり。

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/fmod.html
torya9
質問者

お礼

大変参考になりました。ありがとうございました。 私の間違いもさりげなく丁寧に解説してくださり ありがとうございます!!

その他の回答 (3)

  • glphon
  • ベストアンサー率26% (41/152)
回答No.3

>kigou=atof(argv[1]);  atofはASCII文字配列を浮動小数点型に変えます。  たとえば"50.000"を50.000fに。  演算を振り分けるifが正しく行われないのはここに問題があるからです。  正解を言ってしまえば kigou = *argv[1];という事です。  argvを配列操作(語弊があるが気にしない(・3・))し、argvの先頭から二番目から得られるアドレス番地の参照する値を得ようとしています。  もう少し低級にしたほうが分かりやすいと思います。  argv[1]はint *のデータを持っているので、更に一つ先の値を参照する事ができます。  そして*argv[1]とすることでargv[1]が指し示す先の値をkigouへ代入せよ、との意です。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

C/C++において剰余演算子(%)を適用できるのは整数に対してのみです。 浮動小数点数に関しての剰余を求めたいのであれば、関数を使います。 Manpage of FMOD http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fmod.3.html ところで四則演算の割には掛け算が見当たりませんが?

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

「%」は、剰余です。(割り算をした結果の「余り」を返します。) なので、実数型で実行したときの結果については判りません。m(_ _)m で、このプログラムを実行すると何かエラーが出ますか?(私は未実行です。)

関連するQ&A