lesson1 (update:2018/9/27) [例 題1課題1]


1.C言語の基本


[ next | index ]
 この演習ではC言語を用いてプログラムを作成する演習を行います。
 プログラミング序論でも使いましたが、ツールの使い方に慣れてください。

 C言語は関数と呼ばれる単位でプログラムを作ります。このページでは関数の存在意義を重点に説明します。

目次

 

[目次]


1.1 C言語について

 

【歴史】

 C言語は、UNIXというオペレーティングシステムを記述するために開発されたプログラミング言語です。ベル研究所のデニス・リッチーにより1971年から開発が始められました。その後、1978年に「Cプログラミング言語」という書籍がカーニハンの協力により出版されました。この本の出版により、C言語は、広く普及するようになります。しかしながら、C言語には、処理系により少しずつことなる拡張が施されたため、いわゆるC言語の方言が生じてしまいました。そこで、これを統一するために、アメリカのANSI(American National Standards Insutitute)で、C言語の仕様を統一しようとする動きが発生し、ANSI-Cという規格のC言語が使われるようになりました。

 

【特徴】
  1. 言語仕様が簡潔である
  2. プログラムは関数の集まり
  3. アセンブラ言語のようなきめ細かい制御までサポート
  4. さまざまなコンピュータ上で使用可能
  5. ライブラリが豊富である
  6. 他のプログラミング言語の基本となっている

 

[目次]


1.2 プログラミング言語

 

 計算機がその電子回路で直接処理できる命令やデータの表現形式を機械語(machine language)と言います。機械語には電子回路の制約から非常に単純な命令しか用意されていません。従って、単純な機械語を並 べて複雑な処理をするプログラムを作るのはとても面倒です。そこで、人工のプログラミング言語 (programming language)が作られました。変数や関数が使えるプログラミング言語で一度プログラムを作り、これを翻訳して機械語にするの がプログラミングの一般的手法となっています。ここで学ぶC言語はこのような人工言語の一つで、翻訳はコンパイラと呼ばれる翻訳プログラムを用い計算機で 行います。

 

[目次]


1.3 プログラミングの手順

 

 プログラミング言語で書かれたプログラムをソースプログラム(source program)と言い、コンパイラで翻訳されたものをオブジェクトプログラ ム(object program)と言います。オブジェクトプログラムは機械語にはなっていますが、このままでは実行できません。

 計算機のオ ペレーティングシステムでメモリー上に読み込んで実行可能なプログラムは実行可能プログラム (executable program)と言います。 実行可能プログラムであるためにはデータの入力や画面への書き出しなど多くの機能が必要です。普通これらは、誰もが 必要とする機能なので、あらかじめオブジェクトプログラムのライブ ラリとして用意されています。つまりソースを翻訳したオブジェクトをライブラリとつなぎ合わせて実行可能プログラムを作ると無 駄が省けてプログラミングが楽になります。(つなぎ合わせる作業をリンク、リンクを行うプログラムをリンカと言います)

 

 

 (注)動的リンク

 実行可能プログラムを作る段階で必要なオブジェクトプログラムをリンクすることを静的リンクと言います。プログラムを実行している最中に 必要になった時点でオブジェクトをリンクすることも可能で、このようなリンクを動的リンクと言います。動的リンクは実行可能プログラムが小さくなり、沢山 のプログラムで動的リンクライブラリを共用すればHDD等の記憶領域を節約できます。動的リンクの欠点は実行可能プログラムだけでは動かないため、プログ ラムを持ち運ぶ際に面倒なことです。

 色々なC言語のプログラミング環境が有ります。ここで使うツールの説明はここを見てください

[目次]


1.4 プログラムの部品化と関数

 実行させたい命令を順番に書いたものがプログラムです。しかし、これだけでは数千行の長いプログラムになると、何処で何をしているのかがわかりにくくなります。そこで解りやすく間違いの少ないプログラムとするためには、幾つかの纏まりに分ける必要が出てきました。

 そこで、C言語ではプログラムを関数と呼ばれる小さなプログラムに分けて作り、関数を繋いで一つの大きなプログラムとする手法を採用しました。 

 C言語では関数(function)をプログラムの基本部品 としています。C言語ではBASIC等とは違い個々の命令単位ではプログラムを作れません。必ず関数単位でプログラムを作ることになっています。

 関数プログラムは入力と出力が規格化されているので繋ぎ合わせることが可能です。プログラムの作成手順にあったリンクはこのような部品化されたプログラムを繋ぐ作業です。

(※)プログラムを抽象的に見れば入力データを処理して何らかの出力データを返すモノといえます。関数と呼ばれるのは数学で言う関数とは別物ですが、引数(入力)を与えると関数の値(出力)が戻される様子が似ているからです。

 Cプログラムの実行順番

 Cプログラムの単位は関数なので、どの関数から実行を始めるかが問題になります。Cでは名前がmainの関数から始まる決まりで、他の関数はmainから呼び出されて実行されます。関数の中の個々の命令は基本的には前か ら後ろへ書かれた順番に実行されます。

 

 

 Cの簡単なプログラム例

 上の図の文字列「Hello World.」を出力するプログラムを具体的に説明します。

#include<stdio.h>
        
int main(void)
{
        printf("Hello World.");
        return 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.");
    }
}

小さなプログラムを作る場合は面倒ですが、大きなプログラムを作るためにはしっかり部品化する必要があります。

 

[目次]


1.5 演習課題1

プログラミングの手順を体得して下さい。

例題1

文字で模様を作るプログラムです。文字列を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;
 }
 

(注)。ここでは拡張表記に「\」のフォントを使っていますがこれはバックスラッシュの代わりです。文字コードの関係で日本ではバックス ラッシュのコードに「\」を割り当てているためにこの様になっています。
拡張表記は文字として直接現すことが難しい文字、区切り文字などと重複する文字等を文字列の中に表記する為の手法です。 

よく使う拡張表記は

"文字列「キャラメルは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    
 
 となってしまいます。

[目次]


課題1 名前の打ち出し

注意事項
・レポートツール(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;を忘れずに


[目次]


[ next | index ]