[前へ]   [目次へ]   [次へ]

加算だけ計算機(C/C++)


今回は、加算だけ計算機を作成します。
以下の解説を読む前に一度自分で作ってみると、経験値が多く獲得できるかもしれません(笑)


では、実際に作ってみます。

まず、仕様を確認します。
今回は「加算だけ計算機」なので値を2つ入力したら、その加算結果を返すとします。
入力値、加算結果ともに int 型変数で扱える範囲に限定し、超えた場合の結果は気にしないことにします。
こうしとかないとイロイロややこしくなるので(笑)

次に、それを実現するおおまかな方法を考えます。
今回の場合、まず、2つの値の入力を受け取る必要があります。
そして、入力が終わったらその2つを加算、出力して終了します。

それでは、実際にコードに起こしてみます。
まず、雛形。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
#include <stdio.h>

int main(void)
{
   
return 0;
1つめの入力を置きます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
#include <stdio.h>

int main(void)
{
   
//変数宣言/定義
   
char buf[64];//文字入力用バッファ
   
int in1=0;//入力1格納変数
   //入力1
   
fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in1);
   
//終了
   
return 0;
2つめの入力を置きます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
#include <stdio.h>

int main(void)
{
   
//変数宣言/定義
   
char buf[64];//文字入力用バッファ
   
int in1=0;
   
int in2=0;//入力2格納変数
   //入力1
   
fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in1);
   
//入力2
   
fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in2);
   
//終了
   
return 0;
加算処理を置きます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
< 18>
< 19>
< 20>
#include <stdio.h>

int main(void)
{
   
//変数宣言/定義
   
char buf[64];
   
int in1=0;//入力1格納変数
   
int in2=0;//入力2格納変数
   
int ans;//結果格納変数
   //入力1
   
fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in1);
   
//入力2
   
fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in2);
   
//加算処理
   
ans=in1+in2;
   
//終了
   
return 0;
結果出力を置きます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
< 18>
< 19>
< 20>
< 21>
< 22>
#include <stdio.h>

int main(void)
{
   
//変数宣言/定義
   
char buf[64];
   
int in1=0;
   
int in2=0;
   
int ans;//結果格納変数
   //入力1
   
fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in1);
   
//入力2
   
fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in2);
   
//加算処理
   
ans=in1+in2;
   
//出力処理
   
printf("結果:%d\n",ans);
   
//終了
   
return 0;

変数宣言にくっついてる注釈はその時追加したものにとってのものを書きました。
その処理で関係ないときは注釈を省略しています。

どの処理でどの変数が関係するかはだんだん複雑になってくるので
簡単な内から把握するようにして慣れておくといいと思います。

さて、これで一応「加算だけ計算機」になりました。
実行してみましょう。

実行例
123
246

結果:369
・・・いきなり入力待ちになってしまい分かりにくいですね。
ということで、各入力に表示を追加します。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
< 18>
< 19>
< 20>
< 21>
< 22>
< 23>
< 24>
#include <stdio.h>

int main(void)
{
   
//変数宣言/定義
   
char buf[64];
   
int in1=0;
   
int in2=0;
   
int ans;
   
//入力1
   
printf("1つめの値を入力:");
   fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in1);
   
//入力2
   
printf("2つめの値を入力:");
   fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in2);
   
//加算処理
   
ans=in1+in2;
   
//出力処理
   
printf("結果:%d\n",ans);
   
//終了
   
return 0;
実行例:
1つめの値を入力:123
2つめの値を入力:246
結果:369
ここでもう一つ、WindowsXPなどを使っていると気になることがあるかと思います。
Win98だと終了してもウィンドウはすぐに消えないため、気にならないのですが・・・

これを実行形式にしてエクスプローラから起動すると、「結果が見れない」んです(笑)
・・・厳密に言えば結果は表示されているのですが、
プログラムが終了すると同時にウィンドウが消えてしまうため、見る暇がないんです。
最近のGHz級CPUだと画面に表示される前にプログラムが終了してウィンドウを消してしまうため、
なおさら見れない状況になります。(何回かやってれば瞬間映る時があります(笑))

これを回避するのに一番手っ取り早い方法はなんでしょうか?
ようはプログラムを一時停止して終了しなければいいのです。
ということは、入力待ちにしてしまうのが手っ取り早いですし、
そうすれば任意のタイミングで終了できるようになります。

1章の途中に置いてあった「CUIsample」も同じようになっています。
まぁ、 fgets 関数ではなく getchar 関数を使っていますけど。
ちなみに、 getchar 関数は引数がなく、標準入力から1バイト読み込んで返すという単純仕様です。
それでも標準入力が空の時に読み込もうとすれば入力待ちになるので、用は足ります。


ということで、メッセージとともに getchar 関数を配置してみます。
別に fgets 関数でも同様のことは出来ます。単に、getchar 関数の方がタイプする文字数が少ないというただそれだけです(笑)
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>
< 15>
< 16>
< 17>
< 18>
< 19>
< 20>
< 21>
< 22>
< 23>
< 24>
< 25>
< 26>
< 27>
#include <stdio.h>

int main(void)
{
   
//変数宣言/定義
   
char buf[64];
   
int in1=0;
   
int in2=0;
   
int ans;
   
//入力1
   
printf("1つめの値を入力:");
   fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in1);
   
//入力2
   
printf("2つめの値を入力:");
   fgets(buf,63,stdin);
   sscanf(buf,
"%d",&in2);
   
//加算処理
   
ans=in1+in2;
   
//出力処理
   
printf("結果:%d\n",ans);
   
//終了待ち
   
puts("Enterキーを押すと終了します。");
   getchar();
   
//終了
   
return 0;
実行例:
1つめの値を入力:123
2つめの値を入力:246
結果:369
Enterキーを押すと終了します。

最後に入力待ちになるのが加わり、Enterキーを押すまで消えなくなりました。

と、こんなところで「加算だけ計算機」完成といったところです。

自力で組み立ててから読んだ人は、自分で組んだものと比較してみてどうだったでしょうか?
基本的にプログラムはより短く、つまり少ない工数でかかれたほうが、高速に動作します。

今回のプログラムは雛形、注釈分を除いて14行です。
これぐらいの行数で今回のプログラムを組めれば、とりあえずOKかと思います。
ちなみに今回のソースは説明用で読みやすいように書いてあるので、もう少し短く書いたりできます。


今回は実際に簡単なものとはいえプログラムを組んでみました。
上の解説を見て、パズルのように思ったりしませんでしたか?

実際のところ、プログラムは上のような小さな処理を組み合わせて作られています。
そして、この小さな処理を組み合わせたものはまた、より大きな処理の要素となります。

これまでの「 printf 」などの関数は、処理を組み合わせたもので、
それを呼び出すことで内部の処理を実行するというものです。

関数は、その中の処理が如何に複雑でも、たった1行で呼び出すことが出来ます。
C/C++言語では、処理のまとまりを関数としてまとめることが推奨されています。

そうすることによって、様々な部分から同じコードを使う時にデバッグを簡略化し、
バグが見つかった時に修正箇所を減らし、コード総量も減ってきます。

ただし、あまり極端に関数に処理を分割すると効率が低下するため、
どれだけうまく関数を作れるかはプログラマのレベルのひとつとなると思います。

関数の作成については、そう遠くないうちに解説します。
また、関数には使い方を簡潔に記した文書が大抵ありますが、それの読み方についても解説します。


さて、次は今回のプログラムをパワーアップして、四則演算(+-*/)できるようにしてみましょう。
入力に演算種別が加わり、3つになります。
そして、演算種別で演算を切り替えるので、「条件分岐」が登場します。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2008/10/17