何もしないプログラム~printf関数の使用
まずは、以下に書かれている物を、プログラムを書くところにそのまま書いてください。
#include <stdio.h> int main(void){ return 0; } |
こんな感じ
そうしたら、メニューバーのビルド→ソリューションのリビルドをクリック
すると出力の所に
1>------ すべてのリビルド開始: プロジェクト: sample, 構成: Debug Win32 ------ 1>プロジェクト'sample'、構成'Debug|Win32' の中間出力ファイルを削除しています。 1>コンパイルしています... 1>sample.c 1>マニフェストをリソースにコンパイルしています... 1>リンクしています... 1>LINK : 前回のインクリメンタルリンクでC:\Documents and Settings\PC User\My Documents\Visual Studio 2005\Projects\sample\Debug\sample.exe が見つからなかったか、ビルドされませんでした。フルリンクを行います。 1>マニフェストを埋め込んでいます... 1>ビルドログは"file://c:\Documents and Settings\PC User\My Documents\Visual Studio 2005\Projects\sample\sample\Debug\BuildLog.htm" に保存されました。 1>sample - エラー0、警告0 ========== すべてリビルド: 1 正常終了、失敗、スキップ========== |
このようなのが表示されると思います。
このリビルドはプログラムにエラー、警告が存在するかを見つけてくれる機能です。
エラーとは、プログラム内に間違いが存在するために実行できないという意味で、
警告とは、エラーとは異なり、ただ単に実行するのは可能ではあるが、
警告部分を直さないと、実行中にプログラムが止まる、
強制終了される等のことが起きてしまう可能性があるという意味です。
つまり、エラーは実行ができず、警告は、実行は可能だが、どちらも間違った部分が存在するということです。
ただし、場合によっては警告を無視しても正しく実行される場合もあります。
※エラー、警告は、出力のところに表示されます。
そして、メニューバーのデバッグ→デバッグなしで開始をクリックすると、
続行するには何かキーを押してください . . . |
と表示されると思います(環境によっては英語表記であったりと他の物が表示されるまたは何も表示されないこともあります)。
※Visual Studioではプログラムを実行すると、プログラム終了時に上の文が表示されます。
表示された後に何かキーを押すことでプログラムが終了(コマンドプロンプト画面が閉じる)します。
先ほど書いたものがプログラムです。
このプログラムは何もしないプログラムです。
何もしないプログラムは厳密なものとは少々異なりますが、
このプログラムでも(実際は何もしていないわけではないが、実行結果では)何も動作はしないので、
ここでは上記のようなプログラムを何もしないプログラムとします。
ここで、その何もしないプログラムを解説していきます。
まず
#include <stdio.h> |
これは、#includeは<>で囲まれた部分にあるヘッダーファイル(ここではstdio.h)で定義されているものを
プログラムで使用する(プログラムに読み込む)ということを表しています。
一般に、#includeは#include擬似命令(命令、指令等呼び方多数存在)と呼ばれています。
ヘッダーファイルとは、プログラムで使用するライブラリ関数(後で説明します)が定義されているものです。
また、ヘッダーファイルは自分で作成することも可能です(後で説明します)。
ヘッダーファイルがないとライブラリ関数が使用できず、
プログラムを書くのにライブラリ関数がないとまず処理を行うことは不可能です。
ここでヘッダーファイルを読み込ませているため、何もしないというわけではないことがわかります。
次に
int main(void) |
これはmain関数と呼ばれる関数の一種です。
関数とは、
関数の型名 関数名(引数){処理} |
という形で構成されています。
関数の型名とはその関数で行われた計算結果のタイプ(型)を示します。
intとは整数型のことで、整数値のみを計算結果とします。
他にはdouble、float、long、void等沢山存在します。
関数名は関数の名前です。
ここでmain関数は最初に動作する関数であると定まっています。
よって、プログラムを書く際はmain関数は必ず書かなければなりません。
つまり、main関数がないプログラムは全くプログラムを動作させることが出来ません。
引数とは、その関数で用いる数値(変数)のことです。一般に、(数値の型名 変数名)と書きます。
(変数については後で説明します)
引数は1つだけでなく複数あってもOKです。
ここでvoidと書いているのは、引数を一切用いないことを表しています。
voidとは、数字で言うところの0に相当し、関数の型名にvoidを用いた場合は、
その関数の計算結果を他関数で用いない場合に使います。
また、引数等に何も書いてない場合はvoidであると解釈されます。
つまり、voidの記述を省略することも出来ます。
ただし、関数の型名を省略したときはint型となります。
※ 関数についての詳細は後で詳しく説明します。
処理はその関数で行う処理を{ }で囲まれた部分に書きます。
この{ }をブロックといいます。
最後に
return 0; |
returnとは関数の計算結果が何であるかを決めるものです。ここでは0が計算結果とされています。
return文はその関数の処理が終わることを示すので(例外あり)、return文以降に何かしらの処理を書いたとしても
その処理は一切動作しません。処理を書く場合は例外を除いて(例外は後で説明します)return文より前に書いてください。
※ 一般に、関数の計算結果を決めるというのを「関数の計算結果を返す」と表現します(returnは日本語で返すだから)。
また、計算結果の値のことを戻り値と言います。よって、今後は返す、戻り値という表現を用いて説明します。
また、関数の型名がvoid型の場合は戻り値を省略することができ、さらに、return文も省略することが可能です。
計算結果が0なのは、一般にmain関数での戻り値は0であるので0としています。
return文の最後にある;(セミコロン)はプログラムにおける句点(。のこと)を意味しています。
つまり、;がない限りは行の初めの部分から;があるところまでを
プログラムの1つの行の動作として解釈されます。
よって;がないと1つの行の動作がまだ終了していないことになってしまいますので、
必ず;を付けてください。そうでないとエラーが出てしまいます。
この何もしないプログラムは以下のように記述できますが、一般に、プログラムが見にくいということで
見やすいように適宜改行をするのがルールとなっています。
また、戻り値の部分(return文のところ)が右にずれていますが、
これはインテンドといい、プログラムの階層をわかりやすくするために行います。
一般にインテンドはTABキーを用いて行います。
また、通常は、インテンドはブロックごとに行います。
#include <stdio.h> int main(void){return 0;} |
また、人によっては
#include <stdio.h> int main(void) { return 0; } |
と記述する場合もあります。
記述のしかたは人それぞれなので、自分が見やすいと思う書き方をしてください。
学校や会社などでは記述する際のルールが決められているということもありますので、
その際はそのルールに従ってください。
インテンドの例
{ /*処理*/ { /*処理*/ { /*処理*/ } /*処理*/ } /*処理*/ } |
この例のように、ブロックの間に処理を書きます(場合によっては書かない場合有り)。
このようにすることでプログラムの階層が一目でわかり、プログラムが非常にわかりやすくなります。
これまで何もしないプログラムを書いていきましたが、厳密に書くと以下のようになります。
void main(){ } |
ヘッダーファイルも読み込まず、型名をvoidにして戻り値を省略したmain関数を記述しました。
厳密にはヘッダーファイルが読み込まれると事実上は読み込むという動作が行われますので、
最初に書いた何もしないプログラムは実際は何もしないと言うわけではありません。
次に以下のプログラムを書いてみてください。""で囲まれた部分には自由な文字を書いてください。
英語、日本語どちらでもかまいません。
#include <stdio.h> int main(void){ printf(""); return 0; } |
実行すると囲まれた部分に書かれた文字が表示されると思います。
printfとはライブラリ関数と呼ばれるものの内の一つで、stdio.hの中で宣言されています。
ライブラリ関数とは、C言語であらかじめ用意された関数です。
printfは文字を表示させるための関数です。
C言語にはライブラリ関数が多く用意されており、
ライブラリ関数によりC言語のプログラムを簡潔に書くことが可能となります。
つまり、ライブラリ関数はC言語では非常に重要な役割を持っています。
printf関数は
printf("文字列"); |
というように構成されており、""で囲まれたところに書かれた文字列をディスプレイに表示します。
C言語では""で囲まれた部分は文字列となります。
文字列とは文字の列と言うことです。文字だけであれば1文字のみを指します。
次に以下のプログラムを書いてみてください。/*計算式*/のところは適当な計算式(5-5-6+53等)または値(2等)
を書いてください。
#include <stdio.h> int main(void){ printf("%d\n",/*計算式*/); return 0; } |
実行するとその計算結果が表示されると思います(値を書いた場合はその値)。
計算に使う演算子には以下の物があります。
+ |
足し算 |
- |
引き算 |
* |
掛け算 |
/ |
割り算 |
% |
余り |
加減剰余の4つの演算は良く使われますが、余りはあまり見かけないと思います。
余りは9%2と記述したとき9%2の計算結果は1となります。
ただ単に9を2で割ったときの余りを求めているだけです。
逆に2%9と記述した場合、計算結果は2となります。この計算は商0で余り2と解釈します。
%dは整数値を表示する出力変換指定子と呼ばれるものです。文字を表示させるときに文字列中に%dがあると、
そこには何らかの整数値を表示するということを表しています。
そして、%dの後にある\nとは改行を意味します。使用している環境によっては\nと表示される場合がありますが、
\と\は全く同一なので問題ありません。改行がないと数値のすぐ後に「続行するには何かキーを押してください . . .」
が表示されてしまい見にくくなってしまいますので、改行を行います。
また、改行がないとたとえprintfを複数書いたとしてもprintf1つごとに改行されるわけではないので、
そのような場合も改行を行います。
※ 一般的にprintf1つに対してディスプレイに表示される文字列1行文だけを書きます。
あくまで一般的な話であり、複数行に渡る文字列を1つのprintfに記述してもかまいません。
ここでは、プログラム行数を少なくするためにprintfの中で\nを複数使用する場合があります。
printf関数で数値の表示を行うには、
printf("出力変換指定子",数値); |
と記述します。
※ 先ほども書きましたが、""で囲まれた部分は文字列なので、
出力変換指定子を使用していなければ"123456"は文字列とみなされてしまいます。
よって、""でかこまれていない13456は数値となります。
今度は以下のプログラムを書いてみてください。/*計算式*/のところは先ほどと同様に適当な計算式等を書いてください。
#include <stdio.h> int main(void){ int a; a=/*計算式*/; printf("%d\n",a); return 0; } |
すると、実行結果が先ほどと同様になったと思います。先ほどのプログラムとの違いは
int a; a=/*計算式*/; |
というものが追加されています。aは変数と呼ばれるものです。中学や高校の数学で、xやyを変数と呼びましたが、
あれとほぼ同じと考えていいです。簡単に言うと変数を宣言するとその宣言した変数には自由に値を代入し、
その値を用いて計算をすることが可能になると言うことです。また、途中で変数に代入された値を変更することも出来ます。
※ 変数名についての制約
変数名は、名前を自由につけられるというわけではありません。以下のような制約があります。
1. 使用できるのは英数字のみ(例外として_(アンダーバー)は使用可)
2. 変数名の最初は必ず英字から
3. 予約語は使用不可
予約語とはVisual Studioでは青い文字で表示される言葉です。
このwebページでもプログラム中の予約語は青で表示しています。
基本的に予約語には以下の28個存在します。
auto,break,case,shar,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,
register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,while
上に示したのはC言語のみの予約語で、処理系によって、C++もコンパイル可能な場合はC++の予約語も含まれます。
また、場合によってはC or C++の予約語以外の言葉も予約語として扱われる場合もあります。
※ 変数の記憶場所
C言語では変数の値などを記憶するのにその記憶場所としてメモリを使用します(例外有り)。
メモリとは記憶装置の一つなのですがハードディスクとは異なり、
一時的にしか記憶をしません。
ハードディスクは電源を切っても記憶されたものは残りますが、
メモリは記憶されたものはすべて削除されてしまいます。
また、メモリにも使用できる容量に限りがありますので、
大きなプログラムとなるとうまくメモリを使用しないと容量オーバーになってしまいます。
よって、よいプログラムを作成するにはなるべくメモリの使用容量をなるべく少なくする必要があります。
intは関数の型名と同様で整数型であることを示します。
そしてa=/*計算式*/でaに値を代入させていると言うわけです。
次ぎのプログラムは変数の型名をdoubleに変えたプログラムです。doubleは、実数のみ扱うことが出来ます。
実数とは小数で表される数です。たとえ整数値でも1.000000のように表示されてしまいます。
intのとき、3/2の計算結果は1と表示されていました。これは、intは整数しか扱わないため、
小数点以下は切り捨てられてしまうということが挙げられます。しかし、doubleは実数を扱うことが出来るため
計算結果は1.500000となると思いきや、3/2は整数を整数で割っています。よって、実際はintで計算された値をdoubleで
表示しているので、1.000000と表示されてしまいます(3/2=1)。実数を実数で割ればその答えは実数になるので、
3/2は3.0/2.0と表記しなければいけません。面倒ですが、仕様なので仕方ありません。
※ 実数と整数とでの計算(例63+1.265等)では実数が優先されます。つまり、整数は実数に自動的に変換されて
計算が行われます。
#include <stdio.h> int main(void){ double a; a=/*計算式*/; printf("%f\n",a); return 0; } |
次ぎのプログラムは、変数に変数同士を足した値を代入してその値を表示しています。
変数には、単なる計算式だけ出なく、変数を用いた計算も出来てしまうのです。
※ もしも変数がdoubleであったときはa=2と書いた場合に2は実数に変換され、
2.0の実数が代入されているので、b=3(bはdouble)と代入されていたとしたら、a/bは1.000000ではなく
1.500000と表示されます。
#include <stdio.h> int main(void){ int a,b,c; a=/*計算式*/; b=/*計算式*/; c=a+b; printf("%f\n",c); return 0; } |
次のプログラムはC言語において重要な項目の1つである変数の初期化を行っているプログラムです。
初期化とは、変数の宣言時に変数に初期値を与えてしまうというものです。
また、その初期値のことを初期化子といいます。
上のプログラムと同じ動作を行っているのですが、こっちの方のプログラムの方がすっきりしています。
変数を初期化してしまえば、プログラムの途中で変数に値を代入する手間が省けるのでプログラムを書くのが楽になります。
また、初期化していないと変数にはゴミの値(適当な値)が入ってしまっているために、
場合によっては必ず初期化をしなければなりません。
#include <stdio.h> int main(void){ int a=/*計算式*/,b=/*計算式*/,c; c=a+b; printf("%f\n",c); return 0; } |
C言語では、型の変換を行うことが出来ます。つまり、整数を実数に、実数を整数に変換させることが出来るのです。
やり方は
(変換したい型)(計算式や値) |
と記述するだけで変換が出来ます。
例としては(int)(5.2365)は5に変換されます。また、(int)(101*1.05)は106に変換されます。
ただし、パソコンやコンパイラによっては実数から整数への変換で多少異なる場合があります(四捨五入、切捨て等)ので、
必ずしも同じ値になるとは限りません。逆に整数から実数への変換は、小数点以降はすべて0となるので
どのような場合でも同一の値となります。
さらに、C言語では表示する数値の桁数の指定も出来ます。これは整数部分と小数部分とで分けて指定することができます。
やり方は
整数の場合 %桁数d 実数の場合 %全体の桁数.小数部分の桁数f |
と記述することで行えます。
例えば
printf("%d円\n%d円\n%d円\n"1,10,100); |
と記述されていた場合には
1円 10円 100円 |
と表示されますが、
printf("%3d円\n%3d円\n%3d円\n"1,10,100); |
と記述されていた場合は
1円 10円 100円 |
と桁数がそろえられて表示されます。
また、
printf("%8.6f\n,%f\n",6.23598,6.23598); |
と記述されていた場合には
6.23598 6.23598 |
と表示されます。小数点も小数部分の1桁と数えられるため、全体では7桁と解釈され、1桁分しかずれません。
printf関数はprintf("文字列");と記述すると書きましたが、以下のように記述してもかまいません。
printf("123456789\n" "123456789\n" "%d\n" ,123456789); |
前に;がない限りは行の初めの部分から;があるところまでをプログラムの1つの行の動作として解釈する
と書いたので、何行に渡ろうが;がない限りは一つの行の動作されるのです。
ここでは;まではすべてprintf関数であるとしているのです。
これはプログラムを見やすくするために使われるテクニックです。
1行で書くとあまりにも長くなってしまう場合などに使用します。
ここで、;が改行を意味するのだから、文字列の最初と最後だけに付ければいいのでは?
と思った人もいると思います。しかし、文字列の途中で改行してしまうと改行された後の文字列は
文字列とみなしてくれないのです。つまり、改行前の文字列は文字列の終わりを示す"がないために
どこで文字列が終わったのかがわからなくなります。
よって、複数行に渡り文字列を書く際には必ず各行に""を付ける必要があります。
また、1つの行に複数のライブラリ関数を記述してもかまいません。
例
printf("a"); printf("b"); |
;と次ぎのライブラリ関数との間に空白を入れなくてもいいのですが、
一般には空白を入れた方が、プログラムが見やすくなると言うことで空白を入れます。