プログラミングの基本


テーマUTOPに戻る

 コンピュータに実行させる仕事を,その順番に詳しく書いたものがプログラムである. まず,人間が読める形のプログラム(これをソースコードという)を, エディター(編集機能を特化させたワープロのようなもの)で作成する. これを,コンピュータが理解できる機械語に翻訳(コンパイル)し,実行ファイルを作る. その実行ファイルを動かすことによって,コンピュータが仕事を実行する. ここではC++言語によるプログラムを示すことにする.


1)簡単なプログラム(ソースコード)の作成

 hidemaruエディタを起動して,新しくex1.cppというファイルを編集する.
 次の6行を入力する.ソースファイルの入力は半角英数字で行うこと,漢字などの全角文字を用いるとエラーとなるので注意.行の最後ではリターンキーを押す.ファイルはDドライブのTempディレクトリに,新しくディレクトリを作り(ウィンドウズで作成できる,例えば「cpp」),その中に保存すること.

#include <iostream>
using namespace std;
main ( )
{
   cout << 2+3 << endl;
}

 最初の2行は,決まり文句のようなもの. coutという画面に結果を表示する命令を使うためには,この2行が必要.
 main(){  }の{ }の中に,実行したい命令文を書く.ここでは2+3を画面に表示するという命令文を使っている. cout << 「表示させたいもの」とすれば,画面に表示してくれる. 2+3の実行結果と,endlという特殊文字を画面に表示するよう指定している. endlというのは改行することを指定するための特殊文字(end of line?)である. (最後の文字は数字の1ではなく,アルファベット小文字のエルなので注意.) これがないと,2+3の結果を表示させたあと,カーソルが次の行に移動しない.
 命令文の最後は必ずセミコロン(;)をつける.

 計算にあたって,この例のように足し算は+を使うが,引き算は−,かけ算は*,わり算は/, べき乗(2の3乗など)は^を使う.具体的には,2-3,2*3,2/3,2^3となる. いくつかの演算が組み合わされる場合,その優先順序は通常の四則演算と同じである.必要ならば()を使う.

参考:その他,ルート2はsqrt(2), 三角関数のサインx(ラジアン)はsin(x)など.
ただし,これらの関数を使う場合には, #include <cmath> という文が最初に必要となる.


2)プログラムのコンパイル(翻訳)

 エディタで作成したソースコードは,人間は理解できても, このままではコンピュータは理解できない. コンピュータが理解できるのは,機械語で書かれた命令だけである. 人間にわかるプログラムコ−ドから,コンピュ−タにわかる機械語に翻訳する。 コマンドプロンプトを開き, DドライブのTempディレクトリ,さらには新しく作成したディレクトリに移動する(すなわち,「D:」と入力し[Enter],「cd temp\cpp」と入力し[Enter]).コンパイルするためのコマンドで翻訳する. ここで次のような命令をキーボードから打ち込んでエンターキーを押す.(プロンプトは入力しなくても良い・・・)

D:\Temp>bcc32 ex1.cpp

 bcc32は,C++言語のプログラムコ−ド(ソースコード)を機械語に翻訳するための命令である。 エラーがなければ,ex1.exeという機械語のファイル(実行形式のファイル:「実行ファイル」とよぶ)ができる. プログラムに文法的なエラ−があれば、エラ−メッセ−ジが表示され,実行ファイルは作成されない. 実行ファイルが作成されたか「dir」コマンドを使ってチェックしてみよう.次のような感じで表示されると思う.


実行ファイル以外にも何かファイルが作成されているが気にしなくて良い.

3)プログラムの実行

 コマンドプロンプトで実行ファイル名を入力すれば、プログラムが実行される. 2+3の答として5が表示されるはず.

D:\Temp\cpp>ex1

3-1)答だけではなく,2+3=という式も表示させてみよう.

   cout << "2+3=" << 2+3 << endl ;

プログラムを変更したら,必ずファイルを保存しておくこと.
 いくつかの文字を表示させるには,ダブルクォーテーション(”)で囲む. 文字を一つだけ表示させるには,シングルクォーテーション(’)で囲む. これらで囲まれた範囲でのみ全角文字が使用できる.

3-2)2と3を使った他の四則演算も実行させるプログラムを作成し,実行してみよう.

プログラムを変更したら,必ずファイルを保存しておくこと.

   cout << "2*3=" << 2*3 << endl ;

   cout << "2-3=" << 2-3 << endl ;

   cout << "2/3=" << 2/3 << endl ;

 最後の2÷3の答が0になることに注意. 整数どうしの割り算では,答も整数になり,小数点以下は切り捨てられる. 小数以下の数字も表示したければ,2または3を2.0や3.0とすればよい. 2.とか3.のように,小数点をつけるだけでも大丈夫.
   cout << "2/3=" << 2./3 << endl ;


4)変数

 計算の途中で値を覚えさせておく場所を変数という。 電卓のメモリと同じようなものだが,電卓と違って,いくつでも変数を作ることができる。 変数の名前は,アルファベットで始まるアルファベットと数字の組み合わせが使える。 32文字まで使える.
a,a1,a8b2,hensu,等.
なるべく内容がわかるような変数を使うことが望ましい. たとえば,面積を覚えさせておく変数なら,area等とすれば,あとから見てわかりやすい.
また,大文字と小文字は別の文字だと見なされる. 慣例として,ふつうの変数は小文字を使うことが多い.
変数を使う場合には,プログラムの最初で必ず変数の型(どのようなものを記憶させるか)と 名前を宣言しておく必要がある. 整数を記憶させるのであればint,実数ならdouble(またはfloat),文字ならcharなど.
 

5)変数への入力

 別の計算をする時,いちいちプログラムを書き換えるのは面倒だし,いつも同じ数の計算しかできないのでは困る。 必要に応じて,人間がコンピュータに,数字を知らせることができるようにしたい. 人間が変数に値を入れることを入力という。
 先ほどのプログラムを,変数を使って書き換えてみる. エディタをアクティブにして,次のようにex1.cppを変更する.前に入力した行は全部削除すること.

#include <iostream>
using namespace std;
main ( )
{
   double a, b;
   cout << "Enter 2 numbers. " ;
   cin >> a ;
   cin >> b ;
   cout << "a+b=" << a+b << endl;
   cout << "a*b=" << a*b << endl ;
   cout << "a-b=" << a-b << endl ;
   cout << "a/b=" << a/b << endl ;
}


 まず,このファイルを保存しておく.命令文の1行目では,使う人へ入力を促すプロンプトを画面に出力している.これがないと,何も表示されずにコンピュータがいきなり入力待ちになり,使う人がとまどってしまう.2行目で,変数aとbに,値がキーボードから入力される.coutが出力で,cinが入力を意味する.
端末エミュレータからコンパイルして実行してみる.エラーがなければ,プログラムの1行目のメッセージが表示されるはずなので,適当な数字を2つ,スペースで間を区切ってタイプして,リターンキーを押す.たとえば,

2    3    [ret]

とすると,四則演算の結果が表示される.  もし2つめの数字としてゼロを入力した場合,1つめの数字をゼロで割ることになり,エラーが表示される.これを実行時エラー(run-time error)という.これに対して,プログラムを打ち間違えたりして,c++でコンパイルした時に出るエラーを,文法エラー(syntax error)という.文法エラーはコンピュータが見つけてくれる.実行時エラーは,実際に実行してみて,入力された数や計算結果が原因となって出てくるエラーで,コンピュータが前もって指摘することはない.
 

6)繰り返し

 通常は,プログラムの上から下まで,順番に1回だけ実行する. 何回か同じ作業を繰り返したいときには,forループを使う. エディターで,新しいファイルを編集する. ファイルメニューから新規ファイルを選べば,新しい画面が表示される.

#include <iostream>
using namespace std;
main ( )
{
   int number, mult, i;
   cout << "Enter a number. " ;
   cin >> number ;
   for ( i=1; i<=9; i++ ) {
      mult = i * number ;
      cout << number << "*" << i << "=" << mult << endl ;
   }
}


 最初の行は,変数の宣言である.numberとmultとiという3つの変数を,それぞれ整数を覚える入れ物として宣言している.その次の行は,前と同じくプロンプトの行である.2行めで,numberという変数に数字を入力している.
 次の行からが繰り返しの指定となっている.for ( i=1; i<=9; i++ )というのは,次の{から}まで,変数iの値を1から9まで順に変化させながら繰り返せという指定である.最初はiに1を入れて実行し,ここへ戻ってきてiに2を入れて実行し,というふうに,合計9回繰り返すことになる.
 次の行のmult = i * numberで,人間が入力した数numberと,コンピュータが自動的に代入するiとをかけて,その結果をmultという変数に覚えさせている.ここから,見やすいように右に行を寄せている.これをインデントという.その次の行で,かけ算の結果を画面に表示させる.'*'や'='で記号を1文字ずつ表示し,number, i, mult等は,それぞれの変数が覚えている数字を表示させている.次の}までが繰り返しの指定である.最後の}はプログラム全体の終わりを表している.
 このプログラムは,入力した数字の段の九九を計算することになる.このプログラムを保存しておく.このプログラムをコンパイルして実行してみる.

D:\Temp\cpp>bcc32 ex2.cpp [ret]
D:\Temp\cpp>ex2 [ret]


 数を入れるよう表示されるので,2とか3とか適当に入れてリターンキーを押す.ちゃんと九九が表示されればOK.
 

7)条件判断

 プログラムを実行中に,何らかの判断をさせたい場合がある.たとえば,入力された数が60以上だったら合格と出力し,60未満だったら不合格と出力する等.判断にはif文を使う.一般的な表現を以下に示す.

if (条件1) {
   条件1が満たされる時に実行する文を並べる
} else if (条件2) {
   条件2が満たされる時に実行する文を並べる
} else {
   条件がすべて満たされないときに実行する文を並べる
}

 else if文は,何回でも必要なだけ使うことができる.また,else if文やelse文は,なくても構わない.
 ex2.cppを修正し,入力された数が,0以下ならば小さすぎると表示し,10以上ならば大きすぎると表示して,何も計算せずに終了させる.

#include <iostream>
using namespace std;
main ( )
{
   int number, mult, i;
   cout << "Enter a number. " ;
   cin >> number ;
   if ( number <= 0 ) {
      cout << "too small" << endl ;
   } else if ( number > 9 ) {
      cout << "too large" << endl ;
   } else {
      for ( i=1; i<=9; i++ ) {
         mult = i * number ;
         cout << number << '*' << i << '=' << mult << endl ;
      }
   }
}


 <=というのは以下.>は「より大きい」.条件としては,ほかに,<は未満、==等しい、!=等しくない、>=以上,等がある.
 条件が合えば,{と}に囲まれた文を実行する.条件が満たされなければ,次のelse if文へ行き,さらに条件が満たされなければifブロック{と}の外に出る.return 1という文は,そこでプログラムを終了させる.
 このプログラムコードを保存しておく.次に,端末エミュレータで,このプログラムをコンパイルして実行してみる.0以下の数や10以上の数を入力して,プログラムがそこで止まることを確認する.また,1から9までの数なら,今まで通りちゃんと九九を計算することも確認しておく.


8)ファイルへの出力

 計算結果を,画面に表示させるのではなく,ファイルに保存することができる.ファイルに保存しておけば,あとでグラフ化したり,レポートを出したりすることもできる.ここでは,プログラムからの出力先を画面からファイルに一時的に変更する方法(リダイレクション)を説明する.
 基本的には,実行する際に,「D:\Temp\cpp>ex2」とするかわりに,「D:\Temp\cpp>ex2 > ファイル名」とすればよいが,その場合,プログラム1行めのプロンプトまでファイルにリダイレクトされてしまい,画面に表示されない.そこで,1行めを次のように変更する.(1-9)は,1から9までの数字を入力してほしいということを,それとなく表現しているもので,なくても構わないが,あった方が親切なユーザーインターフェイスとなる.

cerr << "Enter a number (1-9) ";

 coutは標準出力,cerrはエラー出力であり,人が何も指定しない場合にコンピュータが勝手に出力する場合(これをディフォルトの指定という),どちらも画面に割り当てられている.しかし,リダイレクションで出力先を変更されるのは,標準出力に出力されたものだけである.つまり,cerrに出力した文字は,出力のリダイレクションをしても,ちゃんと画面に表示される.
 また,入力された数が1から9までの数以外の場合に出力されるエラーメッセージも,エラー出力へ出力するように変更しておく.次の2行を変更する.アルファベットのオーではなく,数字のゼロにすること.

   cerr << "too small" << endl ;
   cerr << "too large" << endl ;


 変更したファイルを保存しておく. 端末エミュレータで,このプログラムをコンパイルし直して実行してみる. 保存して,もう一度 c++ ex2.cc をしないと,前の機械語ファイルが実行される.

D:\Temp\cpp>ex2 > kotae.txt [ret]

 1から9までの数を入力すると,今度は何も表示されずに次の行にD:\Temp\cpp>が表示される. hidemaruエディターで結果がkotae.txtというファイルに入っていることを確認すること.

9)変数への代入に関する注意

 プログラミング言語の=(代入)は,数学で使う=(等号)とは意味が異なる.
 
 m = 1 ;
mという変数に1という値を覚えさせる.電卓のメモリーキーと同じ.
   x = x + 1 ;
xが覚えていた数に1を加え,またxに覚えさせ直す.数学なら両辺にxがあるので, 0=1?という変な式だが,プログラムではよく使う.
 たとえば,1から10までの合計を求めるとき,
 x = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
とはしない.これでは汎用性がないし,1から10000までとかになると大変. 常套手段としては,まずxに0を入れておき,
 x = x + i ;
として,forループでiを1から1ずつ増加させながら10回繰り返す.
具体的には for ( i=1; i<=10; i++ ) という命令を使えばよい.



テーマUTOPに戻る