共通科目/情報処理(実習)資料6202 203 社会2班 1996/05/23 プログラミング(2) 電子・情報工学系 新城 靖 *1 32ビットのコンピュータ 次のプログラムを実行してみて下さい。 ---------------------------------------------------------------------- /* * ipe-shakai-2/maxint.c -- 大きな整数を調べるプログラム。 * $Header: /home/top/yas/ipe/ipe-shakai-1996-05/RCS/maxint.c,v 1.2 1996/05/22 16:20:36 yas Exp $ * Start: 1996/05/22 22:47:51 * * このプログラムは、/home1/yshinjo/ipe-shakai-2/maxint.c にあります。 * cp /home1/yshinjo/ipe-shakai-2/maxint.c . * で、コピーできます。 */ main() { int x ; x = 10 ; printf("x == %d (十)¥n",x ); x = 100000 ; printf("x == %d (十万)¥n",x ); x = 1000000000000 ; printf("x == %d (1兆)¥n",x ); } ---------------------------------------------------------------------- このプログラムを実行するには、コマンドモード(% が表示されている)に対 して、次のように打って下さい。 % cp /home1/yshinjo/ipe-shakai-2/maxint.c . % cc maxint.c -o maxint % maxint この結果、どうなるでしょうか。十や10万は、意図した通りに画面に表示さ れたと思います。しかし、1兆の方は、ちょっと様子が変です。 ■課題1 一番大きな整数 実習で使っているコンピュータは、32ビットのコンピュータです。つまり、 そのコンピュータが最も効率良く扱えるデータは、32ビットという意味です。 ですから、整数(integer, C言語ではint)のデータも32ビットで表現され ています。32ビットのうち1ビットは、正の数か負の数かを表わすために使 われています。したがって、正の数として計算に使える範囲は、31ビットで 表わされている範囲(2進数で31桁)ということになります。数学で整数と いうと、無限大まで考えていますが、コンピュータで整数というと、普通上限 が決まっているのです。 今日の課題は、一番大きな整数を求めることです。手で計算しても、コンピュー タに計算させてもかまいません。上のプログラムを少しずつ修正して、数を増 やしたり減らしたりしてちゃんと表示できる大きな整数を探すという手もある でしょう。手作業で計算する方法もあるでしょう。実際に求めた答えと、それ を見つけだした方法を報告しなさい。手作業で計算した場合にも、実際にプロ グラムを走らせてみて、その答えが正しいことを示すようにしなさい。レポー トには、大きな整数の発見に至った経過、それを発見するためのプログラム、 あるいは、確認するためのプログラム、プログラムの実行結果と付けなさい。 ヒント:答えは、10進数で表示させると、非常に中途半端な数になります。つ まり、10, 100, 1000, ・・・のような10の冪乗の数になりません。16進数 が分かる人は、それを使うと簡単かもしれません。C言語で16進数は、頭に 0xを付けて表現します。 ■課題2 一番小さな整数 課題1と同様に、一番小さな整数を見つけてなさい。 実習で使っているコンピュータは、負の数を、「2の補数」という方法で表現 しています。2の補数で負の数を表わすときには、ちょうど足し算をした結果 が0になるような数で負の数を表わす方法です。これは、算盤で負の数を表わ す手法とよくにた手法です。 ■課題3 大きな整数以上の数 C言語では、整数(int)としては、1兆も表現することができませんでした。 これでは、国家予算は計算できません。もっと大きな数を扱うためには、どう すればいいのかを考えてみなさい。 *2 プログラムの作成から実行まで 上のプログラムは、C言語というプログラミング言語で書かれています。コン ピュータは、人間が使っている言語(自然言語)を理解することができません。 コンピュータを動かすには、コンピュータが理解できる言語(プログラミング 言語)でプログラムを書き、コンピュータに与えなければなりません。C言語 は、現在最もよく使われているプログラミング言語です。プログラミング言語 には、C言語の他にFortran、Pascal、BASICなどがあります。 C言語のプログラムをコンピュータに与えるには、エディタというプログラム を使って、文字を打ち込み、打ち込んだ結果をファイルに保存します。エディ タには、emacs, vi, ng というなどがあります。この授業では、emacs という エディタを使います。 エディタで作られたプログラムは、ソース・プログラムといいます。ソース・ プログラムのままでは、まだコンピュータは、それを実行できません。コンピュー タが実行できるのは、機械語と言われている2進数で表現されたデータだけで す。ですから、プログラムを実行するには、ソース・プログラムを機械語プロ グラムに変換する必要があります。この変換を行うためのプログラムをコンパ イラといいます。C言語のコンパイラ(Cコンパイラ)は、cc という命令で 実行することができます。 Cコンパイラは、実行されると、ファイルからソース・プログラムを読み出し て、機械語に変換し、結果をまたファイルに出力します。Cコンパイラは、普 通、a.out という名前のファイルに実行可能な機械語プログラムを保存します。 cc に -o というオプション(修飾)を付けると、a.out ではなく -o に続い て与えられた名前のファイルを作り、結果を保存します。 Cコンパイラにより機械語に変換したプログラムを実行するためには、コマン ドモード(%が表示されている)で、機械語プログラムが含まれているファイ ルの名前を打ち込みます。a.out という名前のファイルに機械語プログラムが 含まれている場合は、a.out と打ちます。上の例では、cc に -o maxint と与 えたので、maxint という名前のファイルに結果の機械語が入っています。で すから、a.out ではなく maxint と打ちます。 Cコンパイラ自信も、実はC言語で書かれていていたものです。cc と打つと、 それが機械語に変換されたプログラムが実行されます。(さて、C言語のコン パイラのプログラムは、どうやって機械語に変換されたのでしょう?) 「%」を表示しているのは、シェル(shell)という種類のプログラムです。シェ ルは、人間が打った文字から、実行すべきプログラムを探し出して、それを実 行するプログラムです。実習で使っているコンピュータでは、csh という名前 のシェルです。csh のプログラムもまたC言語で書かれています。 *3 C言語のプログラムの読み方 **3.1 関数と関数呼び出し C言語のプログラムは、たくさんの「関数」の集まりとして書かれます。関数 というのは、大きなプログラムを小さなプログラムに分割して、プログラムを 書きやすくするための仕組です。1つの関数は、それ自信として小さなプログ ラムのようなものです。つまり、数学の関数のように、データを受け取って、 何かの計算を行って、結果を返すといった仕事をします。C言語では、そのよ うな数学的な関数だけでなくて、データを受け取らない関数や、結果を返さな い関数もあります。 C言語のプログラムには、必ず main という名前の関数があります。これは、 C言語で書かれたプログラムで一番最初に実行される関数です。上のプログラ ムでは、main 関数は、main の後ろの括弧の中味が空になっていることから、 データを受け取らない関数であることがわかります。また、結果を返すための 命令 return が含まれていないことから、結果を返さない関数になっています。 それぞれの関数は、基本的には次のような形式になっています。 ---------------------------------------------------------------------- 関数名1(引数11,引数12,・・・) { 関数名2(引数21,引数22,・・・); 関数名3(引数31,引数32,・・・); 関数名4(引数41,引数42,・・・); } ---------------------------------------------------------------------- これは、「関数名1」という名前の関数を定義しています。この関数名1は、他 の関数(関数名2,関数名3,関数名4 という名前)を利用して作られています。C 言語のプログラムは、このように他の所で定義されている関数をどんどん利用 して作られていきます。他の関数を利用することを、「他の関数を呼び出す」 といいます。上のプログラムでは、printf という名前の関数が呼び出されて います。printf 関数は、先人によってC言語で書かれていて、それがある所 に登録されているので、自分で定義する必要はありません。それらは、Cコン パイラが自動的に見つけ出してつなげてくれます。セミコロン(;)は、1つの 呼び出し(正確には文)の区切りを表わすものです。 引数(ひきすう)というのは、関数の間でデータを受け渡しをするための仕掛 けです。関数定義では、一番最初の、定義している関数名の後ろに、受け取る データに名前を付けるための引数を書きます。また、別の関数を呼び出す時に は、その関数へ渡すデータを書きます。上の printf では、文字列(文字の並 び、""で囲まれたもの)と、整数値(変数xの値のコピー,変数については後述) が引数として渡されています。 他の関数を呼び出す場合、基本的には、プログラムの上から下に順序良く1つ ずつ呼び出していきます。関数は、呼び出されると、呼び出した側の実行は止 まります。そして呼び出された関数が実行されます。呼び出された関数が終了 すると、呼び出した関数の実行が再開されますが、それはちょうど以前に実行 を停止した時点から再開されるようになっています。 **3.2 変数 コンピュータは、データをメモリに保存しています。C言語では、データを保 存するためのメモリを変数(variable)というものを通じて操作します。上の 例では、次のような記述があります。 ---------------------------------------------------------------------- int x ; ---------------------------------------------------------------------- これは、変数名 x という変数が、整数(integer)であることを意味しています。 実習で使っているコンピュータは、32ビットなので、このプログラムの結果 として、32ビットのデータを保存するためのメモリが確保されます。 変数が示している部分のメモリを書き換えるには、代入(=)を使います。次の 代入の結果、変数 x の値は、十進数で 10, 2進数では、 00000000000000000000000000001010 になります。つまり、「=」の右から左へ データがコピーされます。 ---------------------------------------------------------------------- x = 10 ; ---------------------------------------------------------------------- 次の printf の呼び出しでは、変数 x のメモリから、データが取り出されて (コピーされて)、関数 printf に渡されています。 ---------------------------------------------------------------------- printf("x == %d (十)¥n",x ); ---------------------------------------------------------------------- printf という関数は、引数を書式(format)に従って画面に表示する関数です。 この例では、書式として %d が与えられていますので、10進数(decimal)で変 数 x の値を表示します。 *[付録] emacs の使い方 emacs と ng の使い方は、よく似ています。emacs の使い方は、「情報処理実 習用手引き(入門編)」の付録「エディタNgのコマンドリスト」などを参考に して下さい。 emacs の簡単な使い方をここに書いておきます。 (1) emacs の起動(file.cという名前のファイルの編集) % emacs file.c (2) emacs の終了 C-x C-c (コントロール・キーを押しながらx, コントロール・キーを押しながらc, "Save file" と聞かれて保存したければ y) (3) 保存 C-x C-s (4) 困った時 C-g を何回か押す *[付録] コマンドモードで使える便利な命令 (1) ls -- ファイルの一覧(list)の表示 % ls (2) cp -- ファイルのコピー(copy) % cp 元ファイルの名前 新しいファイルの名前 (3) cat -- ファイルの内容の画面への表示 % cat ファイル名 (4) rm -- ファイルの削除(remove) % rm 消したいファイルの名前 *[付録] ネットワーク・ニュース 時間が余った人は、ネットワーク・ニュース(インターネットの掲示板)を読 んで遊んで下さい。ネットワーク・ニュースを読むには、コマンドモードで % に対して、mnews [リターン] と打ちます。 mnews を終了するには、大文字の Q を一度打つか、小文字 q を何度か打ちま す。使い方は、画面の形式(モード)によって違いますが、多くの場合簡単な 使い方が一番下の行に表示されています。詳しい使い方は、? を打つと出てき ます。基本的には、カーソルを動かしてスペース・キーで選んで行けば、その 内容が読めるようになっています。