テキスト電卓を作ってみよう

今回のC#プログラミング学習は、テキスト電卓を作ってみます。

テキスト電卓というのは、入力欄に数式を入力しイコールボタンを押すと計算結果を表示するという単純なものです。

一般的な電卓のように、各数字専用のボタンを設けて見た目をもっとそれっぽくしてもよかったのですが、プログラムのコード量が増えてわかりにくくなるので、今回は余計なものはできるだけ排除しシンプルにしてみました。

ダウンロード

まずは、ここをクリックしてテキスト電卓のサンプルファイルをダウンロードします。

ダウンロードした「step5.zip」を解凍すると、「Step5.txt」と「Compile.bat」になります。

「Step5.txt」は、今回学習するテキスト電卓のC#ソースファイルです。

「Compile.bat」は、あなたのWindowsパソコンにはじめからインストールされているC#コンパイラ「csc.exe」を使って、「Step5.txt」をコンパイルして実行ファイルを作るためのバッチファイルです。

「Compile.bat」で右クリックまたはアプリケーションキーを押してメニューを開き、編集を選び「Compile.bat」をメモ帳で開きます。

8行目のコンパイルパス(csc.exeまでのパス)をあなたのパソコン環境に合わせて修正します(たぶんこのままでもOKだと思います)。

修正しなかった場合はそのまま閉じて、コンパイルパスを変更した場合には、上書き保存してから閉じます。

実行

「Compile.bat」を実行して「Step5.txt」から「Step5.exe」を作ります。

完成した「Step5.exe」を実行すると以下のようなテキスト電卓が起動します。

テキスト電卓の画像

左側のテキスト入力欄に数式を入力し右側のイコールボタンを押すと、計算結果を表示します。

クリアボタンを押すとリセットします。

ソースコード

テキスト電卓のソースコードです。

using System;
using System.Drawing;
using System.Windows.Forms;


/********************
Constantsクラス
定数専用
********************/
static class Constants
{
public const String ApplicationName = "テキスト電卓"; // アプリケーション名
public const String TextBoxFontName = "MS Gothic"; // テキストボックスに表示される文字の書体
public const int TextBoxFontSize = 31; // テキストボックスに表示される文字の大きさ
public const int TextBoxMaxLength = 10; // 最大文字数
public const int TextBoxWidth = 300; // テキストボックスのよこ幅
public const int TextBoxHeight = 50; // テキストボックスのたて幅
public const String ButtonFontName = "MS UI Gothic"; // ボタンに表示される文字の書体
public const int ButtonFontSize = 30; // ボタンに表示される文字の大きさ
public const int ButtonWidth = 150; // ボタンのよこ幅
public const int ButtonHeight = TextBoxHeight; // ボタンのたて幅
public const String EqualButtonLength = "イコール"; // 計算開始ボタンに表示する文字列
public const String ClearButtonLength = "クリア"; // クリアボタンに表示する文字列
}


/********************
MyApplicationクラス
実行開始位置
********************/
class MyApplication
{
public static void Main()
{
Application.Run(new ApplicationWindow());
}
}


/********************
ApplicationWindowクラス
Formクラスを継承
********************/
class ApplicationWindow : Form
{
private double answer_number; // 計算結果
private TextBox InputTextBox;

/* コンストラクタ */
public ApplicationWindow()
{
FormDesign();
Reset();
}

/* FormDesignメソッド */
/* ウィンドウをデザインする */
public void FormDesign()
{
StartPosition = FormStartPosition.CenterScreen;

MaximizeBox = false; // 最大化コマンドの無効化
FormBorderStyle = FormBorderStyle.Fixed3D; // サイズ変更コマンドの無効化

Text = Constants.ApplicationName;
BackColor = SystemColors.Window;
ClientSize = new Size(Constants.TextBoxWidth + (Constants.ButtonWidth *2), Constants.ButtonHeight);

// テキストボックスを作る
InputTextBox = new TextBox();
InputTextBox.Font = new Font(Constants.TextBoxFontName, Constants.TextBoxFontSize);
InputTextBox.Width = Constants.TextBoxWidth;
InputTextBox.Height = Constants.TextBoxHeight;
InputTextBox.Multiline = false; // 1行テキストボックス
InputTextBox.TextAlign = HorizontalAlignment.Left; // 左寄せ
InputTextBox.MaxLength = Constants.TextBoxMaxLength;
InputTextBox.Parent = this;
InputTextBox.Location = new Point(0, 0);
InputTextBox.TextChanged += new EventHandler(InputTextChanged);
InputTextBox.TabIndex = 0;
InputTextBox.TabStop = true;

// イコールボタンを作る
Button EqualButton = new Button();
EqualButton.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize);
EqualButton.TextAlign = ContentAlignment.MiddleCenter; // 中段中央
EqualButton.Width = Constants.ButtonWidth;
EqualButton.Height = Constants.ButtonHeight;
EqualButton.Text = Constants.EqualButtonLength;
EqualButton.BackColor = SystemColors.Control;
EqualButton.Parent = this;
EqualButton.Location = new Point(Constants.TextBoxWidth, 0);
EqualButton.Click += new EventHandler(ButtonClick);
EqualButton.TabIndex = 1;
EqualButton.TabStop = true;

// クリアボタンを作る
Button ClearButton = new Button();
ClearButton.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize);
ClearButton.TextAlign = ContentAlignment.MiddleCenter; // 中段中央
ClearButton.Width = Constants.ButtonWidth;
ClearButton.Height = Constants.ButtonHeight;
ClearButton.Text = Constants.ClearButtonLength;
ClearButton.BackColor = SystemColors.Control;
ClearButton.Parent = this;
ClearButton.Location = new Point(Constants.TextBoxWidth + Constants.ButtonWidth, 0);
ClearButton.Click += new EventHandler(ButtonClick);
ClearButton.TabIndex = 2;
ClearButton.TabStop = true;
}

/* Resetメソッド */
/* 各種変数をリセットする */
public void Reset()
{
answer_number = 0;
InputTextBox.Text = Convert.ToString(answer_number);
}

/* InputTextChangedメソッド */
/* テキストボックスの内容が変化した */
public void InputTextChanged(object sender, EventArgs e)
{
TextBox textbox = (TextBox)sender;
String check_string = "0123456789.+-*/"; // 入力可能文字
String checked_string = String.Empty;
char get_character = '\0';
char error_character = '\0';
bool check_flag = true;

for (int i=0; i<textbox.Text.Length; i++) // テキストボックス内の文字の数だけ繰り返し
{
get_character = textbox.Text[i];
check_flag = false;
for (int j=0; j<check_string.Length; j++) // 入力可能文字の分だけ繰り返し
{
if (get_character == check_string[j]) // 入力可能文字だったら
{
check_flag = true;
break;
}
}
if (check_flag) checked_string += get_character;
else error_character = get_character;
}

if (textbox.Text.Length == checked_string.Length) return;
InputTextBox.Text = checked_string;
MessageBox.Show("「" + error_character + "」は入力できません。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
}

/* ButtonClickメソッド */
/* ボタンが押された */
public void ButtonClick(object sender, EventArgs e)
{
Button button = (Button)sender; // 押されたボタンの情報を取得する

if (button.Text == Constants.EqualButtonLength)
Calculation();
else if (button.Text == Constants.ClearButtonLength)
Reset();
else
MessageBox.Show("想定外のボタンが押されました。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);

InputTextBox.Focus();
}

/* Calculationメソッド */
/* テキストを読み取って計算する */
public void Calculation()
{
int phase = 0; // 0=スタンバイ、1=左辺値入力段階、2=演算子入力段階、3=右辺値入力段階
char input_operator = '\0'; // 演算子
double left_number = '\0'; // 左辺の値
double right_number = '\0'; // 右辺の値
String buffer_string = String.Empty; // 左辺または右辺の値が読み込みきるまでためておくバッファ

for (int i=0; i<InputTextBox.Text.Length; i++) // 文字の数だけ繰り返し
{
char get_character = InputTextBox.Text[i];
if (Char.IsDigit(get_character) || get_character == '.') // 数値または小数点の場合
{
if (phase == 0 || phase == 2) phase += 1;
if (get_character == '.') // 重複チェック
{
for (int j=0; j<buffer_string.Length; j++) // バッファから1文字ずつ読みだす
{
if (buffer_string[j] == '.') // すでに小数点があったら
{
MessageBox.Show("小数点が重複しています。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
}
buffer_string += get_character; // 左辺または右辺の値が出そろうまで一時的にバッファにためておく
}
else if (get_character == '+' || get_character == '-' || get_character == '*' || get_character == '/')
{
if (phase == 1) // 左辺入力段階だったら
{
phase += 1;
left_number = double.Parse(buffer_string);
buffer_string = String.Empty;
input_operator = get_character;
}
else if (buffer_string.Length == 0)
{
MessageBox.Show("左辺の値がありません。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
MessageBox.Show("演算子は1つにしてください。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
else
{
MessageBox.Show("「" + get_character + "」は入力できません。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}

if (phase != 3) // 右辺入力段階まで達していなければ
{
MessageBox.Show("式が正しくありません。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}

right_number = double.Parse(buffer_string);

switch(input_operator)
{
case '+':
answer_number = left_number + right_number;
break;
case '-':
answer_number = left_number - right_number;
break;
case '*':
answer_number = left_number * right_number;
break;
case '/':
answer_number = left_number / right_number;
break;
default:
answer_number = 0;
break;
}

InputTextBox.Text = Convert.ToString(answer_number);
}
}

プログラム解説

テキスト電卓のソースコードについて解説します。

使用DLLの宣言

まずはこのプログラムで使うDLLファイルを宣言します。

「using System;」で「System.dll」の使用宣言となります。

この辺は前回と同じですね。

Constantsクラス

プログラム内で使用する定数をまとめて管理するConstantsクラスです。

このクラスは定数専用です。

クラス名とメンバ変数名を「.」でつなぐことにより、ほかのクラスから定数の内容を呼び出すことができます。

例えば、「Constants.ApplicationName」とすれば、「テキスト電卓」という文字列を呼び出すことができます。

MyApplicationクラス

テキスト電卓プログラムを実行させるのがMyApplicationクラスです。

このクラスが実行開始位置です。

このクラスのMainメソッドから実行されます。

Application.Run命令で、ApplicationWindowクラスを呼び出し実行させていきます。

ApplicationWindowクラス

テキスト電卓のプログラム本体を管理するのがApplicationWindowクラスです。

Windowsの提供する各種機能を使うためFormクラスを継承しています。

ApplicationWindowメソッド

このメソッドはコンストラクタです。

コンストラクタとは、このクラス(この場合はApplicationWindowクラス)が呼ばれたときに、自動的に実行されるメソッドのことです。

ここでは、FormDesignメソッドと、Resetメソッドを呼び出しています。

FormDesignメソッド

ここではウィンドウの内容をデザインします。

まずは、「StartPosition = FormStartPosition.CenterScreen」でモニタの中央にウィンドウを表示させることを指定します。

次に、ウィンドウ自体の外見を指定していきます。

「MaximizeBox = false」で最大化ボタンを無効化し、「FormBorderStyle = FormBorderStyle.Fixed3D」でサイズ変更を無効化しています。

次に、ウィンドウタイトルと背景色とサイズを指定します。

Text = Constants.ApplicationName;
BackColor = SystemColors.Window;
ClientSize = new Size(Constants.TextBoxWidth + (Constants.ButtonWidth *2), Constants.ButtonHeight);

ウィンドウサイズは、実際にウィンドウ内の描画領域となるクライアントサイズのみを指定し、ウィンドウの境界線やタイトルバーなどの大きさはお任せしています。

クライアントサイズは、数式入力欄となるテキストボックス、イコールボタンとクリアボタンの3つが一列に並んで置ければよいのでそのように指定します。

続いてテキストボックスを作ります。

InputTextBox = new TextBox();
InputTextBox.Font = new Font(Constants.TextBoxFontName, Constants.TextBoxFontSize);
InputTextBox.Width = Constants.TextBoxWidth;
InputTextBox.Height = Constants.TextBoxHeight;

テキストボックスを作ることを宣言し、そのサイズと入力された文字のフォント名を指定します。

「InputTextBox.Multiline = false」で1行テキストボックスにしています。

「InputTextBox.TextAlign = HorizontalAlignment.Left」で入力される文字を左寄せにしています。

「InputTextBox.MaxLength = Constants.TextBoxMaxLength」で入力できる最大文字数を指定しています。

次の2行でテキストボックスの配置ウィンドウと配置座標を指定しています。

InputTextBox.Parent = this;
InputTextBox.Location = new Point(0, 0);

入力される数式を常に監視するため、テキストボックスの内容が変化する(テキストの内容が変化する)たび、イベントを発生させるようにします。

「InputTextBox.TextChanged += new EventHandler(InputTextChanged)」で、テキストの内容が変化するたびにInputTextChangedメソッドが呼び出されます。

最後に、Tabキーを押してこのウィンドウ内のアイテムを巡回させたとき、このテキストボックスにフォーカスを当てることを許可し、巡回する順番を指定します。

InputTextBox.TabIndex = 0;
InputTextBox.TabStop = true;

これでテキストボックス完成です。

次は、イコールボタンを作ります。

Button EqualButton = new Button();
EqualButton.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize);
EqualButton.TextAlign = ContentAlignment.MiddleCenter;
EqualButton.Width = Constants.ButtonWidth;
EqualButton.Height = Constants.ButtonHeight;
EqualButton.Text = Constants.EqualButtonLength;
EqualButton.BackColor = SystemColors.Control;

ボタンを作ることを宣言し、ボタンサイズはもちろん、表示する文字の種類や大きさ、文字の配置位置、表示文字などを指定します。

さらに次の2行でボタンの配置ウィンドウと配置位置を指定しています。

EqualButton.Parent = this;
EqualButton.Location = new Point(Constants.TextBoxWidth, 0);

このイコールボタンは、前述のテキストボックスの右に来るように配置座標を指定します。

次に、このイコールボタンが押されたときの動作を指定します。

「EqualButton.Click += new EventHandler(ButtonClick)」とすることで、このイコールボタンが押された時ButtonClickメソッドが呼び出されるようになります。

最後に、Tabキーを押してこのウィンドウ内のアイテムを巡回させたとき、このボタンにフォーカスを当てることを許可し、巡回する順番を指定します。

EqualButton.TabIndex = 1;
EqualButton.TabStop = true;

これでイコールボタン完成です。

次はクリアボタンを作ります。

ボタンの作用は違っても、作り方は変わりません。

Button ClearButton = new Button();
ClearButton.Font = new Font(Constants.ButtonFontName, Constants.ButtonFontSize);
ClearButton.TextAlign = ContentAlignment.MiddleCenter; // 中段中央
ClearButton.Width = Constants.ButtonWidth;
ClearButton.Height = Constants.ButtonHeight;
ClearButton.Text = Constants.ClearButtonLength;
ClearButton.BackColor = SystemColors.Control;
ClearButton.Parent = this;
ClearButton.Location = new Point(Constants.TextBoxWidth + Constants.ButtonWidth, 0);
ClearButton.Click += new EventHandler(ButtonClick);
ClearButton.TabIndex = 2;
ClearButton.TabStop = true;

前述のイコールボタンとの違いは、ボタンの表示文字(クリア)、配置座標(イコールボタンのさらに右)、ボタンが押された時のイベント処理(ButtonClickメソッドの呼び出し)、Tabキーでのフォーカス移動などです。

これで、テキストボックス、イコールボタン、クリアボタンが一列に並んだウィンドウが完成しました。

Resetメソッド

コンストラクタが呼び出された時と、クリアボタンが押された時に呼び出され、各種変数を初期化します。

answer_number = 0;
InputTextBox.Text = Convert.ToString(answer_number);

「answer_number」は計算結果を格納する変数ですので「0」で初期化します。

「InputTextBox.Text = Convert.ToString(answer_number)」とすることで変数「answer_number」の内容をテキストボックスに反映させます。

InputTextChangedメソッド

InputTextChangedメソッドは、テキストボックスの内容が変化するたびに呼び出されます。

呼び出されるたびに、テキストボックスに入力された文字列を1文字ずつチェックし、入力可能文字かどうかを調べます。

例えば「A」などの入力可能文字でなければ警告を出します。

まずは、必要な変数を定義し初期化します。

TextBox textbox = (TextBox)sender;
String check_string = "0123456789.+-*/";
String checked_string = String.Empty;
char get_character = '\0';
char error_character = '\0';
bool check_flag = true;

「textbox」でテキストボックスの各種情報を扱えるようにしています。

「check_string」は、入力可能文字をひたすら並べて定義しています。

残りは未定義にしています。

これで準備完了なので、入力された文字をチェックしていきます。

for (int i=0; i<textbox.Text.Length; i++)
{
get_character = textbox.Text[i];
check_flag = false;
for (int j=0; j<check_string.Length; j++) // 入力可能文字の分だけ繰り返し
{
if (get_character == check_string[j]) // 入力可能文字だったら
{
check_flag = true;
break;
}
}
if (check_flag) checked_string += get_character;
else error_character = get_character;
}

まずは、テキストボックスから1文字取り出し、入力可能文字かどうかを調べ、問題なければ変数「checked_string」に格納してから次の文字を調べます。

もし問題がある場合つまり入力可能文字でなければ、その文字を変数「error_character」に格納します。

この処理はテキストボックス内の文字の数だけ繰り返されます。

すべて問題ない場合つまり、テキストボックスの文字数と問題なかったときに格納する変数「checked_string」内の文字数が同じだったら、このメソッドを終了させます。

if (textbox.Text.Length == checked_string.Length) return;

これ以降は、入力可能文字ではない文字が混在していた場合。

InputTextBox.Text = checked_string;

まずは、問題なかった文字のみをテキストボックスに反映させます。

そして入力できない文字が入力されたことをメッセージボックスで通知します。

MessageBox.Show("「" + error_character + "」は入力できません。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);

これでメソッド終了です。

これをテキストボックス内の文字列が変化するたびに行います。

ButtonClickメソッド

ButtonClickメソッドはボタンが押された時に呼び出されます。

とはいっても、テキスト電卓にはイコールボタンとクリアボタンがあるので、まずはどのボタンが押されたかを判断する必要があります。

「Button button = (Button)sender」で押されたボタンの情報を取得します。

次に、押されたボタンの表示文字からボタンの種類を判別しそれぞれのメソッドを呼び出します。

if (button.Text == Constants.EqualButtonLength)
Calculation();
else if (button.Text == Constants.ClearButtonLength)
Reset();
else
MessageBox.Show("想定外のボタンが押されました。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);

イコールボタンが押された時はCalculationメソッドを、クリアボタンが押された時はResetメソッドを呼び出します。

それ以外の場合は、エラーメッセージを出します。

そもそも各ボタンを作る段階で、ボタンクリック時のイベントハンドラでそれぞれ別のメソッドを指定していればこの判定は必要ありません。

でも今回はわかりやすくするために、一度このメソッドに集約させてみました。

最後にテキストボックスにフォーカスを移します。

InputTextBox.Focus();

これでメソッド終了です。

Calculationメソッド

Calculationメソッドは、イコールボタンが押された時にButtonClickメソッド経由で呼び出されます。

このメソッドはテキストボックスを読み取って計算します。

まずは、各変数を定義し初期化します。

int phase = 0; // 0=スタンバイ、1=左辺値入力段階、2=演算子入力段階、3=右辺値入力段階
char input_operator = '\0'; // 演算子
double left_number = '\0'; // 左辺の値
double right_number = '\0'; // 右辺の値
String buffer_string = String.Empty; // 左辺または右辺の値が読み込みきるまでためておくバッファ

phase変数について解説します。

テキストボックスから数式を1文字ずつ読み取って計算する場合、読み取った文字が数式(左辺、演算子、右辺)のどの位置にあるべきものなのかを把握しておく必要があります。

phase変数の内容を変えることにより、現在どの段階の文字を読み取っているのかを判断させます。

それ以外の変数名とその役割については、コメントを読んでいただければだいたいわかると思います。

それでは実際にテキストボックスから文字列を読み取って計算させます。

for (int i=0; i<InputTextBox.Text.Length; i++) // 文字の数だけ繰り返し
{
char get_character = InputTextBox.Text[i];
if (Char.IsDigit(get_character) || get_character == '.') // 数値または小数点の場合
{
if (phase == 0 || phase == 2) phase += 1;
if (get_character == '.') // 重複チェック
{
for (int j=0; j<buffer_string.Length; j++) // バッファから1文字ずつ読みだす
{
if (buffer_string[j] == '.') // すでに小数点があったら
{
MessageBox.Show("小数点が重複しています。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
}
buffer_string += get_character; // 左辺または右辺の値が出そろうまで一時的にバッファにためておく
}
else if (get_character == '+' || get_character == '-' || get_character == '*' || get_character == '/')
{
if (phase == 1) // 左辺入力段階だったら
{
phase += 1;
left_number = double.Parse(buffer_string);
buffer_string = String.Empty;
input_operator = get_character;
}
else if (buffer_string.Length == 0)
{
MessageBox.Show("左辺の値がありません。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
MessageBox.Show("演算子は1つにしてください。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
else
{
MessageBox.Show("「" + get_character + "」は入力できません。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}

まず、テキストボックスから1文字読み取ります。

読み取った文字が数字または小数点だったら、左辺または右辺の値の1文字だと判断し、一時的なバッファ用の変数「buffer_string」に貯めておきます。

もし小数点だったら、一時的に貯めていたbuffer_string変数をチェックし、すでに小数点があるかどうかを確認し、すでに小数点があった場合はこのメソッドを終了させます。

左辺または右辺の文字が続くかぎりこの動作が行われます。

次に、テキストボックスから読み取った文字が演算子(+、-、×、÷)だったら、左辺の値が出そろったと判断し、一時的にため込んでた値をleft_number変数に移します。

そして一時的にためておくバッファ変数buffer_stringをクリアし、演算子文字をinput_operator変数に格納します。

これをテキストボックスの文字の分だけ繰り返します。

何か問題があればエラーメッセージを出してメソッドを終了させ、何も問題がなければテキストボックスの内容をすべて読み取った段階で以下のようになっています。

変数left_numberには左辺の値。

変数input_operatorには演算子。

変数buffer_stringには右辺の値。

if (phase != 3)
{
MessageBox.Show("式が正しくありません。", Constants.ApplicationName, MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}

テキストボックスの文字をすべて読み切ったにもかかわらず、phase変数の値が右辺入力段階まで達していなければエラーメッセージを出してメソッドを終了させます。

right_number = double.Parse(buffer_string);

変数right_numberに右辺の値を代入します。

これで、左辺、右辺と演算子がすべて出そろったので、実際に計算させます。

switch(input_operator)
{
case '+':
answer_number = left_number + right_number;
break;
case '-':
answer_number = left_number - right_number;
break;
case '*':
answer_number = left_number * right_number;
break;
case '/':
answer_number = left_number / right_number;
break;
default:
answer_number = 0;
break;
}

変数answer_numberに計算結果を格納し、最後にテキストボックスに反映させます。

InputTextBox.Text = Convert.ToString(answer_number);

これでこのメソッドと、テキスト電卓プログラム終了です。

まとめ

今回のC#プログラミング学習で、すべてのプログラムの基礎となる動きがすべて出そろいました。

C#プログラムに限らず、プログラムの動きというのは大きく分けても3つの動きしかありません。

1、直線的動き(通常は上から下に実行される)。

2、分岐的動き(if文に代表されるもので、YesかNoでその後の進む道が変わるもの)。

3、ループ的動き(条件が成立するまでまたは条件が成立しなくなるまで処理を繰り返す)。

どんなプログラム言語でも、どんなに大きなプログラムもこの3つの動きの組み合わせで成り立っています。

あなたも何か実現させたい処理があった場合、この3種類の処理まで分解できれば同じようなプログラムを作ることが可能というわけです。

もちろん理論上はですが(がんばってください)。