lesson1 (update:2018/9/27) [例 題1|課題1]
C言語は関数と呼ばれる単位でプログラムを作ります。このページでは関数の存在意義を重点に説明します。
目次
[目次]
【歴史】
C言語は、UNIXというオペレーティングシステムを記述するために開発されたプログラミング言語です。ベル研究所のデニス・リッチーにより1971年から開発が始められました。その後、1978年に「Cプログラミング言語」という書籍がカーニハンの協力により出版されました。この本の出版により、C言語は、広く普及するようになります。しかしながら、C言語には、処理系により少しずつことなる拡張が施されたため、いわゆるC言語の方言が生じてしまいました。そこで、これを統一するために、アメリカのANSI(American National Standards Insutitute)で、C言語の仕様を統一しようとする動きが発生し、ANSI-Cという規格のC言語が使われるようになりました。
【特徴】
- 言語仕様が簡潔である
- プログラムは関数の集まり
- アセンブラ言語のようなきめ細かい制御までサポート
- さまざまなコンピュータ上で使用可能
- ライブラリが豊富である
- 他のプログラミング言語の基本となっている
[目次]
計算機がその電子回路で直接処理できる命令やデータの表現形式を機械語(machine language)と言います。機械語には電子回路の制約から非常に単純な命令しか用意されていません。従って、単純な機械語を並 べて複雑な処理をするプログラムを作るのはとても面倒です。そこで、人工のプログラミング言語 (programming language)が作られました。変数や関数が使えるプログラミング言語で一度プログラムを作り、これを翻訳して機械語にするの がプログラミングの一般的手法となっています。ここで学ぶC言語はこのような人工言語の一つで、翻訳はコンパイラと呼ばれる翻訳プログラムを用い計算機で 行います。
[目次]
プログラミング言語で書かれたプログラムをソースプログラム(source program)と言い、コンパイラで翻訳されたものをオブジェクトプログラ ム(object program)と言います。オブジェクトプログラムは機械語にはなっていますが、このままでは実行できません。
計算機のオ ペレーティングシステムでメモリー上に読み込んで実行可能なプログラムは実行可能プログラム (executable program)と言います。 実行可能プログラムであるためにはデータの入力や画面への書き出しなど多くの機能が必要です。普通これらは、誰もが 必要とする機能なので、あらかじめオブジェクトプログラムのライブ ラリとして用意されています。つまりソースを翻訳したオブジェクトをライブラリとつなぎ合わせて実行可能プログラムを作ると無 駄が省けてプログラミングが楽になります。(つなぎ合わせる作業をリンク、リンクを行うプログラムをリンカと言います)
(注)動的リンク
実行可能プログラムを作る段階で必要なオブジェクトプログラムをリンクすることを静的リンクと言います。プログラムを実行している最中に 必要になった時点でオブジェクトをリンクすることも可能で、このようなリンクを動的リンクと言います。動的リンクは実行可能プログラムが小さくなり、沢山 のプログラムで動的リンクライブラリを共用すればHDD等の記憶領域を節約できます。動的リンクの欠点は実行可能プログラムだけでは動かないため、プログ ラムを持ち運ぶ際に面倒なことです。
色々なC言語のプログラミング環境が有ります。ここで使うツールの説明はここを見てください
[目次]
実行させたい命令を順番に書いたものがプログラムです。しかし、これだけでは数千行の長いプログラムになると、何処で何をしているのかがわかりにくくなります。そこで解りやすく間違いの少ないプログラムとするためには、幾つかの纏まりに分ける必要が出てきました。
そこで、C言語ではプログラムを関数と呼ばれる小さなプログラムに分けて作り、関数を繋いで一つの大きなプログラムとする手法を採用しました。
C言語では関数(function)をプログラムの基本部品 としています。C言語ではBASIC等とは違い個々の命令単位ではプログラムを作れません。必ず関数単位でプログラムを作ることになっています。
関数プログラムは入力と出力が規格化されているので繋ぎ合わせることが可能です。プログラムの作成手順にあったリンクはこのような部品化されたプログラムを繋ぐ作業です。
(※)プログラムを抽象的に見れば入力データを処理して何らかの出力データを返すモノといえます。関数と呼ばれるのは数学で言う関数とは別物ですが、引数(入力)を与えると関数の値(出力)が戻される様子が似ているからです。
Cプログラムの実行順番
Cプログラムの単位は関数なので、どの関数から実行を始めるかが問題になります。Cでは名前がmainの関数から始まる決まりで、他の関数はmainから呼び出されて実行されます。関数の中の個々の命令は基本的には前か ら後ろへ書かれた順番に実行されます。
Cの簡単なプログラム例
上の図の文字列「Hello World.」を出力するプログラムを具体的に説明します。
#include<stdio.h> int main(void) { printf("Hello World."); return 0; }
- #include<stdio.h>はライブラリ関数の名前や入出力情報の渡し方が書かれたファイルstdio.hを読み込む指示です。stdio.hには文字を書き出す関数printfの戻り値や引数の情報が書かれています。
(※)printf関数の本体はライブラリとして別に用意されています。
- int main(void){ .......... }は関数の記述です。
先ず関数が戻すデータの種類、次に関数名、( )内に関数へ渡すデータの種類が書かれています。
ここまでを関数の頭部と言います。その後の{ } の中身が関数の本体です。本体の部分に実行する命令を順番に書きます。プログラムを実行すると、初めにmain関数が呼ばれるので、本体の中身が順番に実行されます。
出力が整数データ(int型)、関数名がmain、入力は無し(void型)の関数となっています。
- ----main関数の中の命令----
各命令文の区切り記号は「;」で、文の最後に必ず付けます。- printf("Hello World.");はprintf関数に文字列「Hello World.」を渡し、printf関数を実行します。
このような動作をprintf関数の呼び出しといいます。ここでmain関数とprintf関数がリンクしています。- return 0; 関数mainの出力を0にする命令文
やりたい事は「Hello World.」を書き出すためにprintf関数に文字列を入力として渡し実行するだけですから命令文1個
printf("Hello World.")でよさそうですが、C言語ではプログラムの最少単位は関数なので。関数mainを作って中に入れる必要があるのです。
(蛇足)プログラムの部品化はもっと大きなレベルで行うことも可能です。プログラムが大規模になるほど部品もそれだけまとまったモノが必要に なります。最近のプログラム言語ではjava言語のように関数と変数をまとめたクラスが最小単位となるものもあります。javaで上と同じプログラムを書 くと、関数を入れたクラスを書く必要があるために次の様になります。
public class Test { public static void main(String arg[]){ System.out.println("Hello World."); } }小さなプログラムを作る場合は面倒ですが、大きなプログラムを作るためにはしっかり部品化する必要があります。
[目次]
プログラミングの手順を体得して下さい。
文字で模様を作るプログラムです。文字列をprintf関数でいくつも書き出すプログラムですが、文字列の最後に「\n」が入れてあります。この「\n」は改行の文字です。改行が無いと出力される文字は一列に 並んで模様になりません。
#include<stdio.h> int main(void) { printf(" CCCC CCCC CCCC \n"); printf(" CC CC CC CC CC \n"); printf(" CC CC CC \n"); printf(" CC CC CC \n"); printf(" CC CC CC \n"); printf(" CC CC CC \n"); printf(" CC CC CC CC CC \n"); printf(" CCCC CCCC CCCC \n"); return 0; }
(注)。ここでは拡張表記に「\」のフォントを使っていますがこれはバックスラッシュの代わりです。文字コードの関係で日本ではバックス ラッシュのコードに「\」を割り当てているためにこの様になっています。
拡張表記は文字として直接現すことが難しい文字、区切り文字などと重複する文字等を文字列の中に表記する為の手法です。よく使う拡張表記は
- \n 改行
- \t タブ文字
- \" ”の文字:文字列の区切文字と同じ文字なので
- \’ ’の文字:文字の区切文字と同じ文字なので
- \\ \の文字:拡張表記の初めの文字と同じ文字なので
"文字列「キャラメルは100\です」は\が拡張表記の文字なのでCの文字列では
"キャラメルは100\\です"
と書く必要が在ります。
{実行結果} CCCC CCCC CCCC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CCCC CCCC CCCC プログラムで\nを除くと実行結果は改行されずに CCCC CCCC CCCC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CCCC CCCC CCCC となってしまいます。
[目次]
注意事項
・レポートツール(Report.jar)は、Zドライブなどにおいて作業してください。
デスクトップで作業すると、うまく動きません。
・このファイル(p01.c)を使ってプログラムを作成してください。
・このファイルのヘッダ部(最初の7行)は、変更しないでください。
・ヘッダから1行空けてプログラムを書き始めてください。
・プログラムのmain関数の終わりは、return 0; で終わるようにしてください。
学籍番号と自分の名前を改行で区切って2行に書き出し、1行あけて、さらに続けて例題のような沢山の文字を使った模様として大きく書き 出すプログラムを作る。ソースプログラムを書くために使うエディタの練習にもなりますから、頑張って凝った模 様を作りましょう。イニシャルのみではだめです。
0123456789 福元 伸也 ****************************************************************** * * * @@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@ @@ * * @@ @@ @@ @@ @@ * * @@ @@ @@ @@ @@@ * * @@ @@ @@@@@@@@@@@@ @@@@ * * @@ @@ @@ @@ @@ * * @@ @@ @@ @@ @@ * * @@ @@ @@@@@@@@ @@ * * * ******************************************************************
上の模様は横書きですが、縦書きにしてもOKです
注意:
1) 改行の文字は拡張表記で\nです
2) 文字フォントの多くは文字ごとに横幅が異なります。これはアルファベットの i と w などは文字幅を変えた方が読みやすい為です。しかも、フォントの種類でも幅の取り方が異なります。 模様を作る場合は1文字の幅が異なると困るので、ツールのエディターはデフォルトで 全て の文字の幅が等しい「等幅フォント」になっています。
3) 模様を作る文字の中で「%」を使うと、コンパイルエラーにはなりませんが、printf関数が書式指定と解釈して正常に表示されないことがあります。
4) return 0;を忘れずに
[目次]