プログラミング概説



情報処理演習インデックスに戻る

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

プログラミングに関する演習は,Linuxを使って行う.Windowsではなく,Linuxを起動させておくこと.


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

 geditというエディタを起動して、新しくex1.ccというファイルを編集する。
下欄の一番左にあるメインメニュー(足跡マーク)からプログラム→アプリケーション →geditをマウスで選ぶ。
 次の6行を入力する。行の最後ではリターンキーを押す。

#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)プログラムのコンパイル(翻訳)

 エディタで作成したソースコードは、人間は理解できても、 このままではコンピュータは理解できない。 コンピュータが理解できるのは、機械語で書かれた命令だけである。 人間にわかるプログラムコ−ドから、コンピュ−タにわかる機械語に翻訳する。 端末エミュレータという人間の命令をコンピュータに直接伝える画面を開き、 そこからc++コマンドで翻訳する。 端末エミュレータを開くには、下欄の左から4つ目のテレビ画面に足跡マークの 付いたようなアイコンをクリックする。 しばらくすると黒い窓が開き、%マークが表示される。 この%マークをプロンプトといい、人間からの命令を受け付ける準備が整ったことを 知らせている。 ここで次のような命令をキーボードから打ち込んでエンターキーを押す。(%は打たない)

% c++ ex1.cc

 c++は、C++言語のプログラムコ−ド(ソースコード)を機械語に翻訳するための命令である。 エラーがなければ、a.outという機械語のファイル(実行形式のファイル)ができる。 プログラムに文法的なエラ−があれば、エラ−メッセ−ジが表示され、a.outは作成されない。

3)プログラムの実行

 端末エミュレータでa.outと入力すれば、プログラムが実行される。 2+3の答として、5が表示されるはず。 実際に入力する場合には、自分が作ったa.outだということを明示するため、 ./a.outとする必要がある。

% ./a.out

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.ccを変更する。前に入力した行は全部削除すること。

#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ループを使う。 エディターで、新しいファイルを編集する。 geditの場合には、ファイルメニューから新規ファイルを選べば、新しい画面が表示される。

#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等は,それぞれの変数が覚えている数字を表示させている.次の}までが繰り返しの指定である。最後の}はプログラム全体の終わりを表している.
 このプログラムは、入力した数字の段の九九を計算することになる。このプログラムを保存しておく。端末エミュレータで、このプログラムをコンパイルして実行してみる。

% c++ ex2.cc [ret]
% ./a.out [ret]


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

7)条件判断

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

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

else if文は、何回でも必要なだけ使うことができる。また、else if文やelse文は、なくても構わない。
 ex2.ccを修正し、入力された数が、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までの数なら、今まで通りちゃんと九九を計算することも確認しておく。


レポート・プログラミング−1

  1つの整数nを入力し、0〜10までの数ならnの 階乗n!を計算し、それ以外は "error"と表示するプログラムreport1.ccを作れ。 なお、n!=1×2×3×...×(n-1)×n であり、0!=1 である。
ヒント:計算値をkaijoという変数に記憶させるとした場合、まず、
   kaijo = 1;
という初期値を入れておく。あとは、
   kaijo = kaijo * i;
という計算を、iが1からnまで繰り返せばよい。
なお,使う変数(すべて整数型でよい)を最初に全部宣言しておくこと.
レポートの宛先とSubjectは授業中に指定する。
 
レポートメールの内容: 学生証番号と氏名。
 ちゃんと動くreport1.ccを添付すること。 動かないものや、計算結果が正しくないものは評価されない。
 


8)ファイルへの出力

 計算結果を、画面に表示させるのではなく、ファイルに保存することができる。ファイルに保存しておけば、あとでグラフ化したり、レポートを出したりすることもできる。ここでは、プログラムからの出力先を画面からファイルに一時的に変更する方法(リダイレクション)を説明する。
 基本的には、実行する際に、% ./a.out [ret]とするかわりに、% ./a.out > ファイル名 [ret]とすればよいが、その場合、プログラム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 をしないと、前の機械語ファイルが実行される。

% ./a.out > kotae [ret]

 1から9までの数を入力すると、今度は何も表示されずに次の行に%が表示される。 結果がkotaeというファイルに入っていることを確認する。

% less kotae [ret]
 
lessというのは、ファイルの内容を表示する命令。 geditでわざわざファイルを開くよりも簡単。
 

9)グラフ

 計算した結果を数字で見ただけではよくわからない場合でも、グラフを描いてみればよくわかることが多い。ここでは、ex2.ccの計算結果をグラフ化することを考える。まず、グラフを描くニュープロット(gnuplot)というソフトウェアを端末エミュレータから起動する。

% gnuplot [ret]

 いろいろなメッセージが表示されたあと、gnuplot>と表示される。ここで描きたいグラフのコマンドを入力すれば、別のウィンドウにグラフをプロットしてくれる。例をいくつか書いておくので、各自試みること。

plot x**2
 → y=x2 (xの2乗)のグラフ
plot sin(x)
 → y=sin(x) のグラフ。
plot cos(x), sin(x)
 → y=sin(x)のグラフとy=cos(x)のグラフを2本一緒に描く。コンマ(,)で区切れば何本でも同時に描ける。
plot cos(x) 3 , sin(x) 5
 → 同じグラフを別の色で。色は1から8までが指定できる。
plot cos(x) title 'line-1' , sin(x) title 'line-2'
 → 同じグラフをタイトルを付けて。
plot x with boxes
 → y=x のグラフを棒グラフで。
plot x with steps
 → y=x のグラフをステップ状で。
plot x with dots
 → y=x のグラフを線ではなく点点で。
splot sin(x)*cos(y)
 → z=sin(x)*cos(y)の3次元グラフ。
set contour base
splot x**2*y**2
 → z=x2*y2の3次元グラフの下に等高線をつける。
set nocontour
replot
 → 同じグラフを等高線なしで。

(ファイルに入っているデータからグラフを作ることもできる。そのときファイルの名前は'または"で囲む。ファイルの各行がxとyの値のペアに相当する。xとyの間は1個以上の空白で区切られていればよい。関数のグラフと違って、何も指定しなければ点点のグラフになる。)


 グラフを確認したら、gnuplotを終了させる。
exit

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

 プログラミング言語の=(代入)は、数学で使う=(等号)とは意味が異なる。
 
 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++ ) という命令を使えばよい。


レポート・プログラミング−2

 1からnまでの合計を計算し,値をgokeiという変数に代入して,その値を画面に表示するプログラムreport2.ccを作れ。nは使う人がキーボードから入力することとし,必ず自然数だとする。つまり,正の整数が入力されることだけを前提としてプログラムを作ればよい。また,n×(n+1)/2という公式は使わないこと。
レポートメールの宛先とSubjectは授業中に指定する。
注意:判断させる順番に気をつけること。
 
レポートメールの内容: 学生証番号と氏名。
 ちゃんと動くreport2.ccを添付すること。 動かないものや、答が正しくないものは評価されない。


情報処理演習インデックスに戻る