Last-Modified: 2015.04.16
以下は殆どのC言語の教科書の最初の練習問題に出てくるプログラムです。このプログラムを実行すると、"Hello world!!"
の文字列が画面に表示されます。何をやっているのか内容を理解しながら、実際にプログラムを打ち込んで動かしてみてください。
例1-1
/* Hello World!! Program */
#include <stdio.h>
int main(void)
{
printf("Hello World!!\n");
return(0);
}
|
■プログラムの説明:
Cのプログラムは、幾つかの関数(サブルーチン)の集合体の形で記述します。コンピュータはソースプログラムの中から、main() という関数を捜して、最初に実行します(逆に言うと、main() 関数がないプログラムは、実行できません。)
main() 関数の{ }で囲んだ中(上の例では5行目)に、プログラムを書きます。mainの中の実行文は、基本的に先頭から順番(上から下)に実行されていきますが、途中で関数呼び出しがあれば、その関数に飛んでいって処理を実行した後、再び呼び出した所に戻ります。また、条件分岐文があれば、条件に応じて処理の順番が変わります。これらを繰り返して、main
の最後の行またはexit()関数に到達するとプログラムが終了します(プログラムがどういう順番で実行されるかを理解するようにしてください)。
関数呼びだし(printf()関数の呼び出し)、この後で習う、代入文や条件分岐文などは実行文です。実行文は、計算処理、条件判断や分岐、メモリの読み書き、などに関連してコンピュータの実行内容を記述したステートメントです。
これに対して、宣言文、関数定義、コメント文など、実行前の約束や定義を記述したステートメントであり、これらは非実行文になります。
①プログラム構造の理解(実行文か否か)、②どういう順番でプログラムが実行されるか、③各々の実行文は何を行っているか、という観点から例1のプログラムを理解してください。
例1のプログラムの各々の行の意味は以下のようになります。
1行目 /* と*/で囲んだ部分はコメント文である(プログラムの実行には関係しない)。
2行目 stdio.h という名前のヘッダファイルをインクルードすることをコンパイラに指示している(システムで用意している、入出力関数(printf、scanf
関数など)を使用する際に必ず必要。この後で、stdio.h以外のヘッダファイルをインクルードする例も出てきます)。
3行目 main関数であることを指定している。int はこのmain関数の型がint型であることを指示している。()はこの中に関数の受け渡しのための引数を書く。このプログラムでは引数を使わないので、何も無いという意味のvoid
を使って、(void) と書いている。
4行目 main関数の始まりの括弧。
5行目 システムが用意している文字の画面表示関数printf()関数を呼び出している。この行は実行文であり、一つの文の終わりには必ず;を付けることに注意する。printf()関数の使い方は、””で囲んだ中に表示したい文字列を書く。最後の\n は画面制御のための改行指示コードである(\nという文字が画面に表示されるわけでない)。
6行目 ゼロの戻り値で、main関数を終了することを意味する(省略可)。
7行目 main関数の終わりの括弧。
演習問題1-1
上記の例題1-1ができたところで、次のような派生問題をやってみてください。
(1) 以下のように、printf()文を追加して、複数行に渡って文字列を表示する。
printf("Hello World!!\n");
printf("こんにちは!!\n");
(2)以下のようにしても結果は同じです。
printf("Hello World!!\nこんにちは!!\n");
(3)printf()文の中の改行コード\nを取り除いたらどうなりますか?
printf("Hello World!!こんにちは!!");
|
[ここまでのまとめ]
○プログラムの書き方:
#include <stdio.h>;
を最初に書いて、
int main(void)
{
(ここにプログラムを書く)
return(0);
}
の{ }の中に、プログラムの本文を書く。(しばらくは、おまじないと思って書く)
○プログラムの最後は
return(0);
で終わる。ただし、return文を省略してもwarning が出るだけでプログラムの実行に差し障りはない。
○文の最後に セミコロン ; をつけるのを忘れない。
printf();
○プログラム中では、語の切れ目その他の許される所で、好きな数の空白、TAB、改行をいれて構わない。
空白、TAB、改行は、プログラムが見やすくなるように入れる。教科書やWEBの例題の段下げ(インデント)の仕方を真似るようにする。
○プログラムは、半角の
アルファベット: A-Z a-z
数字: 0-9
空白
記号: . _ < > ? + - * /; : { } ( ) [ ] ! " ' # % & \ = |
制御コード: TAB 改行
を用いて書く。全角文字(日本語文字)は文字列以外に使ってはいけない。
特に、全角の空白を入れるとビルドエラーになるので注意する。
○printf()関数の使い方の規則を理解する。
printf()のなかで、表示したい文字列を、" "の中に書く。
こんどは、文字列の表示だけでなく、自分で計算したい計算式を書いて、その計算結果を画面に表示するプログラムを作ります(電卓の代わりをするプログラム)。以下のプログラムを動かしてください。
例1-2
#include <stdio.h>
int main(void)
{
printf("Answer= %e\n",3.0*4.0/(5.0+6.0));
return(0);
}
|
プログラムの説明:
例題1-1では、printf()関数の第1引数に文字列を書きましたが、この例題では、2番目の引数に数式を書いています。このように、printf()関数は
printf("書式",1個めの計算式または変数,2個めの計算式または変数,‥‥)
の形で書くことにより、第2引数以下に書かれた複数の数式の計算結果を、第1引数の書式に従って画面に表示します。
すなわち、上記のプログラムを実行すると、
Answer=
の文字列の後に、 3.0*4.0/(5.0+6.0) の数式の計算結果が表示されます。
第1引数の"書式"のところに、%e という記号が初めて出てきていますが、これは第2引数に書いた数式の計算結果(実数型定数)を指数つきで表示するという約束を表しています。
説明
数式を書く場合、それ程難しい約束はありません。それでも、C言語特有の約束が幾つかあります。それらを以下に列挙します。
○数式の中で使える主な演算子には、+,-,*,/ の4つがあります。
この他に、% の演算子があります。%は整数の割り算をしたときの余りを計算します。例えば、4%3 の計算結果は4割る3の計算の余り1になります。
○べき乗演算子^は使えない。
そのため、2^3 のような計算をしたい場合、 2*2*2 と書く。
この書き方は、べきの数が大きくなると不便なので、一般的には算術関数pow()を使って、pow(2,3) と書く。算術関数の使い方は、後で詳しく説明します。
○演算の優先順序に注意する。
基本的に左から右に順番に計算する。
()で囲んだところが最も優先順位が高い(()で囲んだところを最初に実行する)。*、/は+、-より優先順位が高い。
○整数型データと実数型データの書式
実数型定数
f形式(指数なし表示) : 12.34 2.0 2.
(小数点以下がない場合でも小数点を付けることに注意)
e形式(指数つき表示) : 1.234e1 2.0e0 2e0
(1.234e1 は 1.234×101 を表す)
以上の2つの表し方がある。
整数型定数
d形式 : 1234 2 3
のように小数点のない定数は整数と判断する。
整数型と実数型はコンピュータの中のデータの記録形式が異なる。例えば、整数型同士のデータの割り算結果は、小数点以下は切り捨てになることに注意する。整数型と実数型が混じっている場合、実数演算に置き換えて計算が行われる。
演習問題 1-2 (Revised : 2015/04/16)
以上の数式の記述方法が理解できたら、次の問題をやってみてください。
例題1-2を以下の計算式に変更した場合、結果がどうなりますか?
初めに、紙の上で計算をして予想をたててください。次に、実際にプログラムで求めた結果と比較してください。予想通りでない場合は、どこが違うのか? コンピュータの計算規則を理解した上で、手計算との違いと、それが生じる理由について述べて考察をしてください。
(1)演算の順序
5.0*3.0+8.0 5.0*(3.0+8.0)
(2)割り算を含んだ演算の順序
8.0/3.0*5.0 8.0/(3.0*5.0)
(3)整数型データと実数型データの混合演算
4*5/(8+3) 4.0*5/(8+3)
注意:4*5/(8+3)を表示するには、整数型データに対する書式指定、%d を使ってください。
一方、4.0*5/(8+3)を表示するには、実数型データに対する書式指定、%e を使ってください。
これらを誤って使うとどのような表示になるか確かめてください。
(4)長い複雑な計算式(幾らでも長い複雑な計算をすることができます。自分の好きな計算をしてみてください。)
9.704*3.2+6.3*(4.6+7.2)+(3.0*4.0+8.6)/7.0
|