最初は、コンパイル環境を設定して各自が1人でC言語のプログラム作成・コンパイル・実行を行えるようにすることが課題です。
3D207のパソコンのWindows環境で実習を行う方は、「VS Code C言語開発環境の設定」に従って、各自それぞれのパソコンでC言語プログラムを作成して動かせる環境を構築してください。他の環境で実習を行う方は各自で設定を行って頂きますが、分からなくなった場合にはご相談下さい。
C言語のソースコードの拡張子は .c です。この拡張子が付いているとコンパイラはC言語のソースコードと解釈します。プログラミングの学習の際には拡張子が表示された方がわかりやすいのですが、Windows 10でのデフォルトの環境では登録されているファイルの拡張子は表示されないようになっています。設定を変更して拡張子を表示するようにするには以下のようにします。まずエクスプローラーを開いて、ファイルメニューから「フォルダーの検索とオプションの変更」を選択して、フォルダーオプションダイアログを開きます。その表示タブを開き、「登録されている拡張子は表示しない」のチェックを外します。
「1」まず、この授業のWebページからソースプログラムをコピーしてC言語プログラム開発環境に貼り付けてそれを実行する演習を行います。プログラミングの学習では自分でプログラムを動かしてみることが不可欠ですが、プログラミングの説明の段階で全て手で入力するのは効率的でないため、説明の段階ではこのような方法を多用します。
(a) Windows上でほぼ全てのプログラムで共通して利用できるキーボードショートカットとして、以下の3つを覚えて下さい。
コピー Ctrl+C (マウスの左ボタンを押しながらコピーしたい領域をドラッグして選択した後、CtrlキーとCキーを同時に押す)
カット Ctrl+X (マウスの左ボタンを押しながらコピーしたい領域をドラッグして選択した後、CtrlキーとCキーを同時に押す.)
ペースト Ctrl+V (マウスカーソルを挿入したい位置に置いて CtrlキーとVキーを同時に押す。直前にコピーまたはカットした部分が挿入される。)
(b) まず、CPadを起動して新規作成を選択してください。次のC言語ソースコードを選択して、Ctrl+Cでコピーした後、開発環境のエディタ領域にマウスカーソルを移動して一度クリックしてそのウインドウをアクティブにし、Ctrl+Vを押してソースコードを挿入してください。このソースコードを適当なファイル名(拡張子は.c)で保存したのち、ツールバーの"C/C++ファイルの実行"ボタンをクリックします。プログラムにエラーが無ければコンパイル後自動的に実行されます。
/* 整数値15と37の和を表示する */ #include <stdio.h> int main(void) { printf("%d\n", 15 + 37); /* 整数値15と37の和を10進数で表示 */ return (0); }
このプログラムがうまく実行できれば、C言語開発環境が構築できたということです。うまくできない人はもう一度設定を見直して、それでもよく分からない場合は質問してください。
プログラムの解説
ここで、実際に処理を行う命令をしているのは printf("%d\n", 15 + 37);の部分だけです。他の部分が何を行っているかというと、
(1)C言語では、標準で用意された関数でもその関数を使用する前にその関数が定義されたファイル(ヘッダーファイル)をプログラムに読み込んでおく必要があります。 #include <stdio.h> は printf関数の他、C言語プログラムで必ず用いるといっても良い関数が定義されたファイルです。 そのため、ほとんどのプログラムには最初にこの行があります。
(2)C言語では、main関数はプログラムの開始点であり、main関数が終了するとプログラムも終了します。int main(void)の最初のintはこのmain関数が整数値(integer)を返すことを意味し、return (0); が対応しています。つまり整数値(0)を返すわけです。これから先、様々なユーザー定義関数を作成していくわけですが、その場合呼び出し元はユーザープログラムであり、関数は呼び出し元のプログラムに 値を返すわけです。しかしmain関数は特別で、これはオペレーティングシステム(Windowsなど)からユーザーの操作を通して呼ばれ、オペレーティングシステムに値を返します。(0)という値は正常終了を意味します。
「printf("%d\n", 15 + 37); /* 整数値15と37の和を10進数で表示 */ 」の行を 見てみましょう。15 + 37という式は評価されると52という値になります。 "%d"は書式文字列で、%dは整数を表示するための変換指定です。printf関数は、1つの書式文字列と任意個の値を引数として取り、書式文字列の中の変換指定を順番に指定した値で置き換えた文字列を出力します。
(3)C言語プログラムの1つの命令はセミコロン(;)で終わります。これを文と呼びます。
(4)/* から */ で囲まれた部分はプログラムを理解しやすくするためのコメントであり、コンパイラはこの部分を読み飛ばします。プログラムに1行のみのコメントを入れる場合には、//も使うことが出来ます。例えば
printf("%d\n", 15 + 37); // 整数値15と37の和を10進数で表示
と書くことが出来ます。これは正確にはC++言語のコメントの書き方ですが、現在ではC言語プログラムでもほぼ間違いなく使うことができます。
(5) 上のプログラムのprintf("%d\n", 15 + 37); の中の\nは改行文字です。教科書では、バックスラッシュにnとなっていますが、日本語キーボード及び日本語表示環境ではほとんどの場合バックスラッシュは\マークで表されます。従って、\nが改行文字であると覚えてください
以下に示す文字の表示を行うプログラムを作成せよ。ただし****の部分は各自の名前を入れるものとする。
======================================= こんにちは。 私の名前は****です。 ======================================= ===============================
「1」下記のテキストp.11のList 1-8のプログラムをコピーして実行してみて下さい。
/* 二つの変数に整数値を格納して表示 */ #include <stdio.h> int main(void) { int vx, vy; /* vxとvyはint型の変数 */ vx = 57; /* vxに57を代入 */ vy = vx + 10; /* vyにvx+10を代入 */ printf("vxの値は%dです。\n", vx); /* vxの値を表示 */ printf("vyの値は%dです。\n", vy); /* vyの値を表示 */ return (0); }
ここでは、変数を扱っています。変数は、数値などを格納するための箱、というかコンピュータメモリ-上の領域です。どんな値でも入るような箱を用いるのはメモリの無駄であるので、 変数には使用する前に必要十分な大きさの箱を指定します。これが変数の型宣言であり、 int vx, vy;という文が対応しています。これは、ここで使っているパソコンならば4バイトという大きさの2つの箱を用意してそれぞれvx, vyという名前を付け、そこに入っているビットパターンを整数として解釈するという意味です。
変数を使用するには、使用する前に宣言しておく必要があります。
C言語では、文字列をダブルクォーテーション"で囲んで"文字列"のように表します。
printf("vxの値は%dです。\n", vx); の%dの部分は、続く実引数(ここではvx)
を10進数で表示せよ、という書式を指示するための変換指定です。\nは改行を意味します。
「2」キーボードから読み込みを行う以下のプログラムをコピーして動かしてみて下さい。(テキストp.14 List 1-11)
/* 読み込んだ整数の値を表示して確認 */ #include <stdio.h> int main(void) { int no; printf("整数を入力してください:"); scanf("%d", &no); /* 整数値を読み込む */ printf("あなたは%dと入力しましたね。\n", no); return (0); }ここでは新しい関数 scanf("%d", &no)に注意してください。この関数は、キーボードから整数を読み込んでその値を変数noに格納します。%dはprintfの書式文字列の変換指定と同じです。noの前の&に注意してください。詳しくは10章ポインタで習いますが、&はアドレス演算子といって変数noのアドレスを示します。つまりscanf関数では変数の名前ではなく変数の格納されている場所(アドレス)を引数に取るということです。
「3」2つの整数を読み込んで、その和・差・積・商・剰余を表示する次のプログラム(テキストp.22, List2-1)を動かしてみましょう。
/* 読み込んだ二つの整数値の和・差・積・商・剰余を表示 */ #include <stdio.h> int main(void) { int vx, vy; puts("二つの整数を入力してください。"); printf("整数vx:"); scanf("%d", &vx); printf("整数vy:"); scanf("%d", &vy); printf("vx + vy = %d\n", vx + vy); printf("vx - vy = %d\n", vx - vy); printf("vx * vy = %d\n", vx * vy); printf("vx / vy = %d\n", vx / vy); printf("vx %% vy = %d\n", vx % vy); return (0); }
このプログラムで注意することは、
(1)整数同士の割り算では小数点以下は切り捨てられる。
(2)剰余演算子% 例えば3 % 2の値は1となる。
「4」int型とdouble型に関するテキストp.29 List2-6を動かしてみましょう。
/* 整数と浮動小数点数 */ #include <stdio.h> int main(void) { int nx; /* 整数 */ double dx; /* 浮動小数点数 */ nx = 9.99; dx = 9.99; printf(" int 型変数nxの値:%d\n", nx); /* 9 */ printf(" nx / 2:%d\n", nx / 2); /* 9 / 2 */ printf("double型変数dxの値:%f\n", dx); /* 9.99 */ printf(" dx/2.0:%f\n", dx / 2.0); /* 9.99 / 2.0 */ return (0); }これまではint型(整数型)だけでしたが、ここで実数を扱うためのdouble型(倍精度浮動小数点型)が出てきました。違う部分を見てみましょう。
「5」実数を読み込むプログラムを、テキストp.31 List2-7のプログラムで考えてみましょう。
/* 二つの実数値を読み込んで和・差・積・商を実数で表示 */ #include <stdio.h> int main(void) { double vx, vy; /* 浮動小数点数 */ puts("二つの数を入力してください。"); printf("実数vx:"); scanf("%lf", &vx); printf("実数vy:"); scanf("%lf", &vy); printf("vx + vy = %f\n", vx + vy); printf("vx - vy = %f\n", vx - vy); printf("vx * vy = %f\n", vx * vy); printf("vx / vy = %f\n", vx / vy); return (0); }このプログラムで注意する点は、scanf関数の変換指定"%lf"です。詳しく言うと、実数型にはfloat(単精度浮動小数点)とdouble(倍精度浮動小数点)があります。"%f"はfloat型用であり、double型はそれよりもlongな実数を扱うので"%lf"です。
「6」演算を行うと、オペランド(演算の対象となる値や変数のこと)の型によって暗黙の型変換が行われることがあります。これをみるために、テキストp.33 List2-8のプログラムを動かして見ましょう。
/* 型と演算について確認する */ #include <stdio.h> int main(void) { int n1, n2, n3, n4; /* 整数 */ double d1, d2, d3, d4; /* 浮動小数点数 */ n1 = 5 / 2; /* n1 ← 2 */ n2 = 5.0 / 2.0; /* n2 ← 2.5 (代入時に小数点以下切り捨て) */ n3 = 5.0 / 2; /* n3 ← 2.5 (代入時に小数点以下切り捨て) */ n4 = 5 / 2.0; /* n4 ← 2.5 (代入時に小数点以下切り捨て) */ d1 = 5 / 2; /* d1 ← 2 */ d2 = 5.0 / 2.0; /* d2 ← 2.5 */ d3 = 5.0 / 2; /* d3 ← 2.5 */ d4 = 5 / 2.0; /* d4 ← 2.5 */ printf("n1 = %d\n", n1); printf("n2 = %d\n", n2); printf("n3 = %d\n", n3); printf("n4 = %d\n\n", n4); printf("d1 = %f\n", d1); printf("d2 = %f\n", d2); printf("d3 = %f\n", d3); printf("d4 = %f\n", d4); return (0); }ここで注意する点は、int / intでは結果も intであり小数点以下が切り捨てられるのに対して、int / doubleや double / int では暗黙の型変換が行われint型がdouble型に変換されてから演算が行われるため、結果はdouble型となる点です。ただしその値をint型の変数へ代入すると、代入された値は小数点以下が切り捨てられたint型となります。
「7」型変換は、キャスト演算子を用いて明示的に行うことも出来ます。テキストp.35のList2-10を見てみましょう。
/* 二つの整数値を読み込んで平均値を実数で表示(キャスト) */ #include <stdio.h> int main(void) { int na, nb; puts("二つの整数を入力してください。"); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("それらの平均は%fです。\n", (double)(na + nb) / 2); /* キャスト */ return (0); }(na + nb) / 2の式は、na, nbがint型なのでこのままでは小数点以下が切り捨てられますが、 計算する前にキャスト演算子(double)でdouble型に変換してやると小数点以下も計算されます。
「8」数値出力の変換指定では、出力幅を指定するものや小数点以下の桁数指定などがあります。テキストp.37のList2-12を見てみましょう。
/* 整数と浮動小数点数を書式化して表示 */ #include <stdio.h> int main(void) { printf("[%d]\n", 123); printf("[%.4d]\n", 123); printf("[%4d]\n", 123); printf("[%04d]\n", 123); printf("[%-4d]\n\n", 123); printf("[%d]\n", 12345); printf("[%.3d]\n", 12345); printf("[%3d]\n", 12345); printf("[%03d]\n", 12345); printf("[%-3d]\n\n", 12345); printf("[%f]\n", 123.13); printf("[%.1f]\n", 123.13); printf("[%6.1f]\n\n", 123.13); printf("[%f]\n", 123.13); printf("[%.1f]\n", 123.13); printf("[%4.1f]\n\n", 123.13); return (0); }%4dは最小4桁の幅での整数出力、 %4.1fは小数点以下1桁かつ最小4桁の幅での実数出力です。
コロナの感染者数をa, コロナによる死亡者数をbとする。int a, b; で定義された整数 a, b にキーボードから整数値を読み込んで、死亡率を表示するプログラムを作成せよ。(キャスト演算子を用いること。また、%を表示するにはprintf("%%");のように%を2つ入力する。)表示は以下のようにすること。ただし最初の2行の数字の部分はプログラム実行中に入力する任意の整数値である。
感染者数:1800
死亡者数:10
死亡率:0.56 %
===============================
身長 (cm)と体重(kg)をdouble型の値として読み込んで、体重(kg)/[身長(m)]2で計算されるBMI(Body Mass Index)と[身長(m)]2 × 22で計算される適正体重 (kg)を小数点以下1桁まで表示するプログラムを作成せよ。 (変換指定は %.1f である。) 出力は以下に示す例のとおりにすること。
-----------
身長は何cmですか:170.5
体重は何kgですか:63.0
あなたのBMIは21.7です。
適正体重は64.0 kgです。
====================================