
C言語の歴史と特徴について簡単に紹介します。C言語は1972年に作られた言語で、現在でも広い範囲で使われています。そして、その重要性もいまだ変わっていません。現在使用されているプログラミング言語の中にはC言語から派生したものが少なくありません。
C言語は半世紀近い歴史のある言語なので、プログラム開発にはコマンドラインツールが用いられてきました。ここでは、コマンドラインツールを使ったC言語の開発プロセスを解説します。現在では、統合開発環境を使ってプログラム開発をしますが、各コマンドがどのような働きをしているかを知っておくことは有用です。
Windows環境におけるC言語の開発環境の構築について説明します。OSのバージョンはWindows 7以降で、統合開発環境にはCodeLiteを使用し、コマンドラインツールにはMinGWを使用します。
Windows環境におけるC言語の開発環境の構築について説明します。OSのバージョンはWindows 7以降で、統合開発環境にはCodeLiteを使用し、コマンドラインツールにはMinGWを使用します。
CodeLiteにおけるWorkspaceとProjectの概念について説明します。その後、具体的にどのようにしてCodeLiteでプログラム開発を進めるかを説明します。
CodeLiteが自動生成するサンプルプログラムをもとに、C言語プログラムの基本的な構造について説明します。C言語プログラムはmain関数という特別な関数から処理が実行されること、文という処理単位や文の集合体であるブロックという概念について説明します。
C言語のコメントの書き方について説明します。適切なコメントはソースコードを理解するうえで大変役に立つものです。
端末に文字列を出力するprintf関数の使い方について説明します。特に引数の書式化文字列の詳細について説明します。printf関数は書式化文字列によって、いろいろな変数の値を端末に表示することができます。
端末から文字入力する関数について説明します。1つは端末から1文字を入力するgetchar関数で、もう1つはリターンキーを打ち込むまでの一連の文字列を入力するgets関数です。これらの関数を使うことにより、端末からキーボードで文字列を入力することができます。
main関数にある2つの引数、int型のargcとchar型の2重ポインタのargvについて説明します。これらの引数はプログラムを実行するときに、端末から入力される単語の数とそれぞれの単語の文字列を表します。
C言語における8進数や16進数の数値の表記方法について説明します。8進数は数値の頭に0を付加します。16進数の数値の頭には0xを付加し、さらに10から15までの値にはAからFまでのアルファベット(大文字でも小文字でもよい)を使います。
#defineというプリプロセッサを使ってシンボル名に定数を割り当てることができます。このようなシンボル名を使うことで以下のようなメリットが得られます。
プログラム上同じ意味を持つ数値を何度も使っている場合、その数値を変更するときは#defineの行1か所の修正で済む。
シンボル名に意味のある適切な名称を付けることで、ソースコードの可読性が向上する。
C言語のデータ型について説明します。C言語の基本データ型はchar, int, float, doubleの4つです。これらのデータ型に符号や長さ(バイト長)の修飾子を付けることによって、様々なデータ型が生成されます。
加減乗除の演算子と除算における余りを算出するモジュロ演算について説明します。また、一時的にデータ型を変更するキャスト演算についても説明します。
変数に1加算する、あるいは1減算するといったインクリメントとデクリメントの演算子について説明します。これらの演算子はループのカウンタを更新するときに頻繁に使います。
AND, OR, EXOR, NOTといった論理演算と変数のビット全体を左右にシフトするシフト演算について説明します。
算術演算子やビット演算子と代入演算子のイコールを組み合わせて新たな代入演算子を作ることができます。例えば、乗算記号とイコールを組わせると、*=という演算子ができます。x *= 2と記述すると、x = x * 2という意味になります。
プログラムの中でデータ型や変数のメモリサイズを計算することができます。sizeof(データ型 or 変数)と記述することで、カッコ内のデータ型や変数のバイトサイズを算出します。
enumという修飾子を使って、列挙型変数を作ることができます。enumの後にタグ名称を続けると、列挙型のデータ型を定義することができます。その後に続く波カッコの中にシンボル化された定数リスト列挙すると、定数を定義することができます。
C99以降に導入されたデータ型で、bool型と複素数型の使い方について説明します。bool型はtrueかfalseを表すデータ型で、複素数型はintやdoubleなどの頭にcomplexという修飾子を付けて整数の複素数型や浮動小数点の複素数型を作ります。
const修飾子の使い方について説明します。データ型の頭にconstという修飾子を付けると定数の変数を宣言することができます。記号定数を定義する#defineとは違い、const宣言されたものは変数なので、メモリ上に領域を確保します。
比較演算子と論理演算子について説明します。比較演算子は演算子の左右にある式の値を比較するものです。論理演算子は論理和、論理積、および否定を表す演算子です。比較演算子と論理演算子を組み合わせて、条件分岐やループの条件文を作成します。
ifやelseを使った条件文について説明します。サンプルプログラムでは、全く同じ機能を実現する場合でも条件文の作り方がいろいろあることを示します。
if文を使わずに演算子を使って条件分岐を表現することができます。それが3項演算子というもので、クエスチョンマークとコロンを使って以下のように表現します。
条件式 ? 実行文1 : 実行文2;
条件式が真であれば実行文1が処理され、条件式が偽であれば実行文2が処理されます。
switch文による条件分岐について説明します。switchの後に続くカッコ内に式を記述し、この式が取り得る値ごとにcase文といいうものを使って処理を分岐させます。
C言語のループにはwhile文、do while文、およびfor文の3種類あります。それぞれのループの使い方について説明します。
break、continue、およびgotoの使い方について説明します。ループの中の実行文にbreakと記述すると、ループから抜けることができます。ループの中の実行文の途中でcontinueと記述すると、残りの実行文は処理せずにループの条件判定に移行します。また、gotoを使うと、無条件で関数内のラベルの付いた場所に処理がジャンプします。
C言語の関数の基本的な構造について説明します。
値を返さない関数について説明します。値を返さない関数は戻り値の型をvoidと宣言します。
関数の再帰呼び出しについて説明します。関数の再帰呼び出しとは、自分自身を定義している関数ブロック内で呼び出すことです。無条件で再帰呼び出しをすると、メモリが枯渇するまで無限に呼び出しが続いてしまうので、必ず条件文で再帰呼び出しせずに抜け出す個所を作る必要があります。
変数を関数の外部で宣言する外部変数について説明します。関数内部で宣言する変数は自動変数と呼ばれ、関数が呼ばれるときにメモリ領域が割り当てられ、関数の終了とともに解放されます。一方、外部変数はプログラム起動とともにメモリ領域が割り当てられ、プログラム終了とともに開放されます。
プログラムの規模が大きくなってくると、複数のソースファイルによってプログラムを作成します。この時の注意事項について説明します。
静的外部変数について説明します。外部変数の宣言時にデータ型の前にstaticという修飾子を付けると、静的外部変数を宣言することができます。静的外部変数とは、そのファイル内だけで呼び出すことのできる外部変数で、他のファイルからは呼び出すことができません。
静的関数について説明します。関数も変数と同様にデータ型の前にstaticという修飾子を付けると、静的関数を定義することができます。静的関数も静的外部変数と同様に、定義されたファイル内でのみ呼び出すことができる関数で、他のファイルから呼び出すことはできません。
静的内部変数について説明します。関数内部の変数もstaticで宣言することができます。この場合、自動変数とは異なり、関数終了後にメモリ領域が解放されることはありません。外部変数と同様に、プログラム終了まで値が保持されます。
C言語を学習するうえで、最大の壁とされるポインタについて説明します。ポインタとは、アドレスを格納する変数のことで、データ型の後に*を付加して変数を宣言します。例えば、int* val;と宣言すると、変数valにはint型データのアドレスを格納することができます。valの頭に*を付加して*valと記述すると、アドレスvalに格納されたint型データを参照することができます。
サンプルプログラムによって、ポインタの具体的な使い方について説明します。2つの変数の値を交換する関数swapを通じて、ポインタがどのように作用するかを見ていきます。
端末からキーボードでデータを入力する関数scanfについて説明します。端末に文字列を出力する関数printfと同様に、書式化文字列を使って入力するデータの型を指定します。初期化文字列の後に続く変数はすべてポインタを渡します。
この講義以前にも文字列を格納する文字配列について先行して扱ってきました。ここでは、配列についての詳細を説明します。また、配列はポインタときわめて親和性があることを説明します。
多次元配列について説明します。変数名の後に配列のカッコを複数個付加することによって多次元配列を宣言することができます。
ポインタのポインタについて説明します。ポインタのポインタとは*を2つ付加して宣言された変数ことです。main関数の引数でも軽く触れましたが、ポインタのポインタはポインタ配列の先頭アドレスを意味します。
関数ポインタについて説明します。プログラムの中では変数と同様に関数にもアドレスが割り振られています。この関数のアドレスを扱うのが関数ポインタです。関数には引数があるので、関数ポインタを宣言するときは、引数も含めて宣言します。
動的にメモリを確保したり、解放したりする方法について説明します。これまで扱ってきた変数は、ソースコードの中で明示的に宣言することによってメモリ領域を確保しましたが、malloc関数を使うとプログラム実行中にメモリ領域を確保することができます。ただし、確保したメモリ領域のアドレスを格納するためのポインタはあらかじめ宣言しておく必要があります。確保したメモリ領域が必要なくなればfree関数を呼び出して解放します。
構造体について説明します。構造体とはいくつかのデータ型の変数をまとめて1つのデータ型として定義したものです。構造体の中の変数はメンバ変数と呼ばれます。また、構造体として宣言されたデータはインスタンスと呼ばれたりします。
共用体について説明します。unionという修飾子を使って型名を定義します。型名の定義の方法はほとんど構造体と同じです。ただし、構造体のメンバ変数はすべて個別にメモリ領域が割り振られるのに対して、共用体のメンバ変数の先頭アドレスは同じになります。すなわち、メンバ変数は同じメモリ領域を共有しています。
既存のデータ型に対して別名を定義することができるtypedefという予約語の使い方について説明します。構造体や共用体はstructやunionという修飾子にタグ名称がついて1つのデータ型になっています。また、符号なし整数型はunsignedという修飾子をintやcharの前に付加します。このような長いデータ型の名称をtypedefを使うことによって、コンパクトな別名を定義することができます。
ビットフィールドについて説明します。構造体では、ビットごとにメンバ変数を定義することができます。例えば、unsigned intは32ビットのデータ型になりますが、この32ビットをいくつかのビットに分けて個別に変数名を割り当てることができます。このようなビットフィールドの具体的な定義の方法と使い方について説明します。
自己参照型構造体について説明します。自己参照型構造体とは、構造体の定義においてメンバ変数の宣言に自分自身の型名のポインタを使っているものを言います。自己参照型構造体はリンクリストの構築に使われます。
この講義では最初に、ファイル操作の基本的な手順について説明します。ファイルを操作するときは最初に必ずfopen関数を呼び出してFILE構造体のポインタを取得します。サンプルプログラムでは、三角関数のsinの計算値をfprintf関数でテキストファイルへの出力する方法について学習します。
fputs関数とfputc関数を使ったテキストファイルへの書き込みについて説明します。
fscanf関数を使って、テキストファイルからデータを読み出す方法について説明します。サンプルプログラムでは、前々回の講義で作成した三角関数のsinの計算値を保存したテキストファイルからデータを読み出して端末の画面に表示します。
ファイルアクセス時の失敗において、エラー番号とエラー番号に応じたエラーメッセージの取得方法について説明します。ファイルアクセス時には、存在しないファイルを読み出そうとするなど、システム側の都合でエラーを引き起こすことがあります。このとき、システム側でエラーの種類によって番号が割り当てられます。そして、この番号に応じたエラーメッセージが決められています。stdio.hで定義されたerrnoによって、エラー番号を取得することができ、strerror(errno)と記述すると、エラー番号に応じたエラーメッセージが得られます。
バイナリファイルを読み書きする方法について説明します。バイナリファイルをオープンするときは、fopen関数のモード指定の文字列の先頭にbを付加します。また、バイナリデータを書き込むときは、fwrite関数を使い、バイナリデータを読み出すときはfread関数を使います。
ファイルをランダムにアクセスする方法について説明します。具体的には、fseek関数を使って読み出し位置を指定してファイルを読み出す方法を学習します。
テキストファイルから2つの行列のデータを読み出して、行列の積を計算してください。読み出した2つの行列と演算結果の行列に関して、端末に情報を表示してください。詳細はPDFファイルに記述していますので、こちらを参照してください。入力となるデータファイルとして、sample.datを用意しています。こちらを使用してください。
C言語のソースファイルを読み込んで、//や/* */のコメントを削除してください。ダブルクォーテーションやシングルクォーテーションで囲まれた//や/* */はコメントにならないことに注意してください。また、バックスラッシュの後のダブルクォーテーションやシングルクォーテーションについても注意してください。詳細はPDFファイルを参照してください。
英文を格納したテキストファイルを読み込んで、すべての単語の出現回数をカウントしてください。配列を使って単語を検出した順に格納する方式ですと、単語を検出するごとに全数比較をしなければならず、処理時間がかかりすぎます。そこで、自己参照型構造体を使って、二分探索木を構築してください。詳細についてはPDFファイルを参照してください。入力となる英文のテキストファイルとして、sample.txtを用意していますので、こちらを使用してください。
C言語を習得するための初心者向け講座です。
プログラミング未経験者でも学習できるようになっています。そのため、プログラミングをある程度経験した人にとっては、ビデオの中の説明は少し回りくどく感じるかもしれません。その場合は、ビデオを途中でスキップしてどんどん先へ進めてください。C言語習得で一番大事なのは、説明を聞いて理解することではなく、プログラムをたくさん作ることです。各レクチャーではなるべくサンプルプログラムを用意しています。サンプルプログラムを利用して自分なりのプログラムを作るようにしてください。
講座で使用するサンプルプログラムは、Windows環境で作成していますが、MacOSやLinuxでも動作するようになっています。