プログラミング入門 情報科学演習
2021.10.11
これまでMinGW64の環境設定が上手く行かないという相談を結構受けました.ほとんどは環境変数のPATHの設定が間違っているというものです.ディレクトリの概念,そして,PATHというものが分かっていないことによるものです.特に,参考にしたサイトのPATHの例が悪いために起こっているようです.
環境変数のPATHはあくまで自分のPCの環境について値を設定してください.サイトにもカッコ内ではありますが,ご自身がMinGW-w64をインストールしたディレクトリに合わせて入力して下さい,と書いてあります.
の図のpgの部分が自分でインストールしたディレクトリ(おそらくProgram Files (x86)かProgram Files)と異なっているために動作しない例が大半でした.注意しましょう.
C言語を用いたプログラムを作成し,コンパイルして実行することを前回行いました.もう一度確認してみましょう.
VS Codeなどのエディタで作成したプログラムを保存する際には,拡張子を .c とすることを忘れないでください.また,ファイル名には基本的にはアルファベット小文字を使用し,スペースを入れないようにしましょう.
Cのソースプログラム hoge.c をターミナルにおいて gcc コマンドでコンパイルします.
> gcc hoge.c
実行はコンパイルしてできた a.exe という実行ファイルをコンパイルと同様にターミナルでコマンドラインから呼ぶことで行います.
> .\a.exe
ここで,現在作業しているディレクトリにある a.exe を実行するので,コマンドパスとしての .\ が必要でした.また,コマンドライン操作を行うときには TAB 補完を使うことが大切でしたので,よく覚えておきましょう.
先ほども書きましたが,コマンドライン操作では次の2つを活用しましょう.
コマンド操作の途中でTAB補完を使う癖をつけましょう.確実に操作ミスが減って効率良くなります.
コマンドライン操作時に上矢印キー(↑)を押すとひとつ前に実行したコマンドが,下矢印(↓)ではその時点での一つ後のコマンドが表示されます.活用しましょう.
Unix環境では,しばらく前(1000回分程度)に入力したコマンドは
$ history
というコマンドで表示できますがWindowsではコマンドプロンプトには履歴表示機能がちょっと面倒ではあるものの,VS Codeではそのようなコマンドや機能は無いようです.矢印の↑や↓を活用して下さい.
もうひとつ重要なことは画面出力に関するものでした.以下にまとめておきますので,よく覚えておいてください.
画面に文字列を表示するためのコマンド
二重引用符である " と " で囲まれた範囲の文字列が画面に表示される
バックスラッシュ \ は次に続く文字の意味(もしくは機能)を打ち消す
なので,画面に二重引用符そのものを表示させたい場合には \" のようにする.バックスラッシュ自身を表示させる場合には \\ のようにバックスラッシュを2つ続ける
\n は2つの記号で1つの「改行文字」を表す
コマンドで何かの操作を行うということ自体に混乱している人も対面指導の際には見かけられました.MacintoshやWindowsが登場する前にはコンピュータにコマンド(命令)を使用して処理を行わせることは当たり前だったのですが,最近では機会がないせいか,理解が難しいようです.
Windowsを使用している人は,前身のMS-DOS時代の遺産であるコマンドプロンプトを使用して体験できますので,ちょっと試してみてください.まずは,スタートメニューから「Windowsシステムツール」→「コマンドプロンプト」で起動してみてください.下図のような黒い背景のウインドウが立ち上がるはずです.
画面に表示されているC:\Users\hogehoge>ですが,C:というのはハードディスクやSSDなどの内蔵されている記憶装置の「ドライブ」名でかつてフロッピーディスクなどにA:ドライブを割り当てていた名残りでCになっています.
さて,ここで,コマンドプロンプトの > に続けて次のようにコマンドを入力したらどうなるでしょうか?
> start notepad
メモ帳が起動したはずですが,どうでしたか?
スタートメニューからアプリ(ソフト)のアイコンをクリック(選択)してアプリを起動する操作も実はコンピュータに対する命令なのですが,このようなアイコン画像をマウスで操作することでコンピュータに指示を出す操作をGUI (Graphical User Interface)と言い,コマンドプロンプトのようなコマンドラインからコマンドで操作する方式をCUI (Character User Interface)といいます.同じことを行っているのですが,コマンドを覚えておいて作業する「想起」よりも,目で見て確認しながら選択する「再認」の作業の方が人の認知負荷が小さいので,現在はGUIによる操作が当たり前になっています.
ただ,Unixで始まったこのCUI操作は熟練者にとっては便利ですし,開発者にとっては必須の作業なので,今でも残してあります.では,次に以下のようにコマンド操作をするとどうでしょうか?
> start excel
無事にエクセルが起動しましたか?全てのアプリケーションソフトには実は起動するために内部で処理するコマンド名があって,コマンドプロンプトから起動することが可能です.
すでに作っているエクセルファイルを起動するのは次のようにしてできます.
> start test.xlsx
あらかじめ作って置いたtestという名前のエクセルデータが開きます.普段エクスプローラでアイコンをダブルクリックして起動していますが,その場面ではダブルクリックには上記のコマンド操作が割り当てられています.1970年代にこのようなGUI操作の開発が進んで今のような便利なインタフェースとなりましたが,プログラミングを習得するためには今回学習したような古典的なコマンド操作に慣れることは必須です.
コメントアウトとは教科書のp.10のリスト1_1の途中にあるような注釈文のことで,プログラムだけを記述すると後から見てわかりづらいことが多いので,説明を加えておくものです.スラッシュ二つ // があるとその行のそれ以降がコメントとなり,実行に関係なくなります.例えば,
のような処理があるとすると,2行目の方は出力されません.他の多くの言語では # がよく使われています.
一方,C言語では
のように /* */ とスラッシュとアスタリスクの組合せでできた一組の記号の中もコメントとなります.この場合は途中に改行があっても範囲内全部がコメントとしてコンパイル時に無視されるようになっています.
次週以降の宿題では下に示すような解答用紙を使用します.これは授業資料として保管しますので,誰のプログラムソースかわかるように解答用紙の最初には学生番号と名前を記入してもらいます.そのため,プログラムの実行に関係ない部分ができてしまうためコメント行を置いていますので,注意してください.
反復処理が登場すると,途中経過を確認したくなることがよくあります.そのようなときに,試しに printf 文を入れておいて,確認しながらプログラミングを進め,邪魔になれば // をつけて表示をしないようにする,というような使い方とか,コンパイル時にエラーが出るので,新しく追加した行や怪しい行などに // をつけてみてコンパイル可能かどうかを確認する,という使い方がよくなされます.
教科書p.10のリスト1_1参照.
現時点では数値と文字の扱いが違うことに注意してください.
「変数」とは値の入れ物で,プログラミング言語には必須の概念です.また,「値」というのは「数値」だけでなく,「文字」や「真偽」なども含みます.さらに,C言語では変数を使用する際には最初に「宣言」が必要となります.変数の種類としては代表的なものに以下のようなものがあります.
型について,詳しくは教科書のp.15を参照してください.この授業では主として int 型と char 型を使用します.まれに float や double が出てくる程度です.そこで, int と char について少しだけ補足しておきます.
例えば,100と画面に表示されるプログラムがあるとします.このとき,この100には二つの型の可能性があります.一つは「数値」としての100であり,これは足し算などの演算や大小比較ができる「値」です.これが int 型となります.一方,「文字列」としての1と0と0が並んでいる場合も考えられます.これはただの「文字」です.演算に使用することはできません.これが char 型となります.もちろんアルファベットや記号が画面に表示されている場合も char 型です.
また,同じような文字に見えても,文字と文字列は異なります.先ほどの例でいえば,100という3文字が一つにまとまったものが文字列で,その要素の1と0と0が文字となります.char 型で文字を扱う場合,プログラム中で文字か文字列かで扱いが異なりますので注意してください.以下のような違いを理解しておくことは重要です.
前回の作業課題で%dを表示させるものだけがちょっと特殊なルールでした.試行錯誤で実現できたでしょうか?
printf("%%d\n");
バックスラッシュと円マークは同じものなので,見た目が違っていても気にしないでください.ディレクトリを表す記号です.
Usersというのは今使用しているPCを利用可能なアカウントを持つ人達をまとめている領域(ディレクトリ)でその中にあなたがログインするアカウントがあるので,次にあなたのログイン名が出ているはずです.
ファイルのコピーや削除,名前の変更なども全てコマンドでできます.そのため,ファイル名をある規則に従って一斉に変更する,とか,特定の文字列を含むファイルを全部一斉にコピーしたり削除したりすることが,コマンドからなら簡単にできます.
printf("Print\n");
// printf("Do not print\n");
/* この部分は何を書いていてもプログラム内では無視されます
この部分は何を書いていてもプログラム内では無視されます
この部分は何を書いていてもプログラム内では無視されます */
// ///////////////////////////////////////////
//
// プログラミング入門I 宿題 2021.10.18
//
// 学生番号: S216099
// 氏名: 島根 太郎
//
//
//////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand((unsigned) time(NULL));
printf("Student number: s196099\n\n");
この部分に自分で必要なプログラムを入力します.
printf("\n-------------------------\n\n");
return 0;
}
記号(宣言名) データ型
int 整数
long 倍長整数
float 浮動小数点数(実数)
double 倍精度浮動小数点数
char 文字
型 表現 説明
int 1 ただ普通にプログラム中に数値を書くと int
char "1" 二重引用符 " (ダブルクオート)で括られると文字列となる.これは1という文字と \0 というヌル文字とで構成されている.詳しくは,教科書p.116参照.
'1' 引用符 ' (シングルクオート)で括られると一文字となる.このときは本当に文字の1だけ.
整数と倍長整数については計算機の環境(実装)に依存します.整数 int 型で扱える範囲がどうなるかについては,例えば,以下のようなプログラ ムで確認することができます.
#include <stdio.h> int main(void) { int n = 1234567890123; printf("%d\n", n); return(0); } |
仕様上扱えない桁数の数値を無理矢理使うと,内部で問題が発生し,変な数値になるとともに警告が出ます.後ろから順次数字を削除していって,何桁まで扱えるか,確認してみましょう.
printf や scanf のような画面やキーボードとのやりとりに 関する関数において,「書式指定文字列」を使うことで便利で簡単な入力が可能となります.覚えておく必要がありますので,以下のようなよく使用するものをしっかり練習してください.特に,桁数の指定と右揃え,左揃えの指定は課題でもよく使用しますので確認を忘れずに.詳しくは,教科書の例題を参考にしてください.
記号 | 書式 | 補足 |
---|---|---|
%d | 整数(10進数) | |
%f | 浮動小数点数(実数) | |
%e | 指数形式の浮動小数点数 | |
%o | 8進数 | |
%x | 16進数 | |
%c | 文字 | '1'のような文字一つずつを表示させるときに使用 |
%s | 文字列 | "100"のような文字列を表示させるときに使用 |
ところで,教科書のプログラムのソースでは改行文字が¥nになっています.¥マークは日本独自の文字コードで英語圏ではキーボードにはありません.日本語キーボードで¥記号のところの文字コードは本来バックスラッシュ( " \ " )です.画面にバックスラッシュが表示されていてもまったく問題ありませんので,気にしないでください.
プログラミングを始めると,作ったプログラムに間違いがあってコンパイル時にエラーが表示されることがよくあります.メッセージを良く読むとどこが間違っているのかわかるのですが,ただ単に英語で書いてあるというだけで見ない人が多くいるようです.基本的なパターンは決まっているので,これも慣れさえすればわかるようになるので,必ず見るようにしてください.
例えば,以下に示すメッセージは,行末のセミコロン( ; )を忘れた場合に出てくるものです.閉じ括弧の忘れなども同じような形式で出てきます.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: |
/* error.c */ #include <stdio.h> int main(void) { printf("test\n") ← ここのセミコロンが無い return 0; } |
error.c: 関数 ‘main’ 内: error.c:9:2: エラー: expected ‘;’ before ‘return’ return 0: ^ |
1行目は main の中でエラーが発生したことを警告していて,2行目で不具合が生じた行が何行目かを示しています.また,内容が簡潔な英語で書いてありますが,意味は「return の前に期待される ; 」ということで,セミコロンが無いことを教えてくれています.なお,セミコロンが無いのは7行目ですが,それが無いために問題が生じるのは9行目の return になるので,エラーの生じた行が9行目とメッセージに出てきます.
C言語は「関数型」の言語なので,最初に記述する main() というのも関数です.
プログラムの実行結果を画面に出力することは基本ですし,非常に重要です.そのときに,どのように画面に表示させるかに関して,C言語では printf() という便利な関数があります.これは書式を指定して文字列を出力できる大切な命令になっています.ここでは,教科書p.26のリスト2_3に従って, printf の使い方を見てみましょう.
printf("a - b = %d\n", c); |
というのがその部分ですが,二重引用符に囲まれている部分が画面に出力されることを確認してください.そして,二重引用符の中に %d という記号が含まれていて,そこはカンマの後に書いてある変数 c の「値」を入れて出力してくれます.表2_1から2_3に printf で使用する各種記号が説明されていますので,よく見ておいてください.本日はこの部分を実習で扱います.
C言語には教科書p.34の表2_8に示す算術演算子が用意されています.これに加えて,前回説明した単項演算子(負号)があります.特に注意が必要なのが剰余算です.これから乱数も含めて剰余の計算をたくさん行いますので,まずは剰余の基本を理解しましょう.
ある数を3で割ったあまりは,0,1,2の3つです.当たり前ですね.でも,この基本がわからない人が毎年います.舐めてかからないでしっかり理解しましょう.ある整数 m を別の整数 n で割ったあまりは全部で n 種類であり,あまりの中の最大値は n - 1 です.これが剰余の基本中の基本です.
ほとんど全てのプログラミング言語においては等号の記号 = は「代入」を表します.「等しい」ことを説明しているのではなく,右辺の値を左辺の変数(もしくは定数)に「代入」しています.
教科書の表2_9にある代入以外の演算子記号は全て等号と算術演算子の組み合わせになっています.このような演算子を複合演算子とも言います.非常に重要な演算子で,今後たくさんの機会で使用します.以下のような動作をしますので,働きを理解しましょう.
演算例 | 意味 | a 初期値 | 演算後の a の値 |
---|---|---|---|
a += 1 | a の値を1増やす | 1 | 2 |
a -= 1 | a の値を1減らす | 2 | 1 |
a *= 2 | a を2倍する | 3 | 6 |
a /= 2 | a を半分にする | 4 | 2 |
5 | 2 | ||
a %= 3 | a を3で割ったあまりにする | 5 | 2 |
いずれの場合でも行われた操作により変数 a の値が変わっています.
数学における四則演算と同様に掛け算と割り算は足し算引き算よりも優先されます.剰余算は割り算と同じです.また,計算は左から代入は右側から行われます.
複合演算子を用いた代入の
i = i + 1; i += 1; |
のような演算は非常に頻繁に使用されるので,専用の演算子が用意されています.値を1増やす演算子をインクリメント演算子,値を1減らす演算子をデクリメント演算子と言います.
i++; ++i; i--; --i; |
のように使用します.演算子が変数の前にあるか,後にあるかで動作が異なります.教科書p.35のリスト2_9を参照してください.
前回の授業では見様見まねでプログラムを編集してコンパイルしましたが,今回からは自分で入力することが多くなります.そこで,インデント(字下げ)について確認しておきましょう.
教科書のp.10にあるリスト1_1などを見ると,ブロックと呼ぶ中括弧({ })で囲まれた部分は左側が空いていて,段落のようになっているのがわかります.これらはインデントと言って,プログラムを見やすくするものです.これが無いとブロックの範囲がわかりづらいものになります.TABを使用してインデントを入れてください.決してスペースキーを使用して入れることの無いように!必ずTABで入れてください.約束事としてブロック単位で4文字程度字下げすることが良く行われます.インデントは無くてもプログラムは動作します.しかし,非常にわかりづらいものになってしまいます.
最近機械学習で話題の言語Pythonや昔からあるGUI開発環境のTcl/Tkなどではインデントを間違えるとプログラムが正しく動作しません.インデントの理解は重要です.
Web版のテキストに載せているプログラムではインデントされている文字数が8文字になっている場合もあります.これはWebブラウザがTABを8文字と解釈して表示しているからです.ですので,みなさんはエディタ(例えばVS Code)上でプログラムを書く際には,教科書と同じ4文字文のインデント(字下げ)を行ってください.また,すき間(空行)がたくさんあります.意味や構造の切れ目で空行を入れると理解しやすくなります.
予習用の実習問題です.当日の問題は当日案内します.
printf の中で文字を表示させる %c ,整数値を表示させる %d ,そして,実数値を表示させる %f がある.
引き続き教科書p.38までを扱いますので,予習をお願いします.
来週から基本的に毎週課題を出しますので,自分でプログラミングを行って提出してください.レポート提出システムを使用します.ログインできるか確認しておいてください.
他学科の学生さんはレポート提出システムへの登録が必要ですので,必ず縄手までご連絡下さい.
nawate@の後にecs.shimane-u.ac.jpがアドレスです.