パソコン活用研究シリコンバレー(C、C++、の活用研究)
画面に出力(printf)・キーボードから入力(scanf)・変数
まずは、てはじめに画面への表示とキーボードからの入力をやってみましょう。
1 画面に表示してみる(printf)
とりあえず、Cで画面に出力するプログラムを書いてみましょう。世界的に有名な "HELLO
WORLD"
と表示するプログラムです。さっそくコンパイルして実行してみてください。
C |
BASIC(QBASIC) |
/* HELLO.C -- Hello, world */
#include
<stdio.h>
main()
{
printf("Hello, world\n");
}
|
' HELLO WORLD By Basic
print"Hello, world"
|
うまくHello Worldが表示されましたか。どんな言語でも、とりあえず画面に表示できた瞬間が一番
うれしものです。
a) Cのコメントは /* */の間に書きます。(BASICではrem 又は
' ですね)
b) Cのメインプログラムは
main() {
}
という型をとり、プログラム本体は{ }の間に書きます。
これはCの決まりごとです。mainの後ろの ( )にはコマンドラインで書くパラメータがシステムから
引数として渡されます。これについては改めて説明します。
c) printfはBASICでいうところの
print と同じ働きをしますが、Cのprintfは実は関数です。
従って( )の中の引数を画面に出力します。文字列を出力する時は " で文字列を
囲みます(BASICと同じ)。
また、BASICに慣れていると忘れやすいのが、文の終わりの
; セミコロンです。Cではひとつの
文の終わりをセミコロンで表しますので、お忘れなく。これひとつ忘れても、コンパイルエラーが
でて、コンパイラから叱られます。
文字列の最後の \n は改行を表す制御文字の文字コードです。他に制御文字として
\t タブ \b バックスペース \" "を表示
\\ \を表示 \r キャリlリジリターン \0 ヌル文字
などがあります。
Printfの詳しい説明はPrintfと変数の型を参照下さい。
2 キーボードからの入力(scanf)と変数
画面への表示ができれば、次はキーボードからの入力です。BASICでいうところのinput にあたる
のが、Cの scanf という関数です。しかし、このscanf はBasicのinput に比べると、いささか
面倒くさいです。BASICに慣れていると、最初にCがかったるくなる部分ではないでしょうか。
それでは、名前と年齢を入力し、画面に出力するプログラムを書いてみます。
C
|
BASIC(QBASIC) |
/*整数、文字列の入力と画面出力*/
#include
<stdio.h>
main()
{
char name[20];
int age;
printf("Your Name ? ");
scanf("%s",name);
printf("\nYour Age? ");
scanf("%d",&age);
printf("\nYour Name: %s Your age: %d",name,age);
}
|
print "Youa Name";
input name$
print "your Age";
input age
print "Your Name: ";name$;"Your Age:
";age
|
a) Cで絶対忘れてならないのが変数の型の宣言です。プログラムで使用する変数はすべて宣言
しなくてはなりません。LSI-Cはしんせつなので、変数の宣言を忘れると、勝手に整数型とみなし
てコンパイルしてくれますが、他のCコンパイラでは確実に叱られます。そして、宣言文のおしまいにも
必ず ; セミコロンをつけましょう。これを忘れるとコンパイラが怒ります。(ああ、面倒!)
Cにおける変数は以下の通りです。
char 文字型 int 整数型
short 短整数型 long 長整数型
float 実数型 double 倍精度実数型
char(文字型)を除いてそれぞれの型のデータサイズが何バイトかは、コンパイラの仕様により異なり
ますので、お使いのコンパイラの仕様を調べて下さい。
文字型と文字列
さて、BASICと大きく違うのは、文字型です。Cでは文字列を格納するのに配列を使います。
char name[20] ; と宣言することにより、文字変数nameに19文字までの文字列の代入が可能と
なります。配列の各要素には1文字づつ入ることになります。
例えば、nameにBASICという文字列を代入すると
nmae[0] = 'B'
name[1] = 'A'
name[2] = 'S'
name[3] = 'I'
name[4] = 'C'
name[5] = '\0'
となります。
\0はヌル文字でCにおいては、文字列の終わりを表します。\0が必ず文字列の最後につくので、
先に述べたようにname[20]で、19文字代入可能となるわけです。
ちなみに、Cでは1文字の場合は文字を ' シングルコーテーションで囲みます。
さて、配列の各要素には1文字づつ入るといいましたが、正確に言うと配列の各要素のサイズは1Byte
です。従いまして、漢字(2byteで1文字)を格納するには、配列の各要素2個が使われます。
どうですか、のっけから嫌になりましたか。おじさんはBASICに慣れすぎたので、どうもこのCの文字列
の扱いがちとばっかし、面倒です。まあ、これはまたメリットにもなるのですが・・
更に、もうひとつ大事なことがあります。Cにおいては「配列名は配列の最初のデータへのポインタ」
を表します。ポインタとは言い換えればアドレスです。なんかわかりにくいですね。
上の例で言えば name はname[0]のアドレスを表すということです。
BASIC流にいうと varptr(name(0)) ということです。これはCでは、ビシバシ使われる点なので、是非
理解して下さい。
以上、結構盛りだくさんの内容になってしまいましたが、後程別の角度から、これらの点について再度
説明していきますので、そこでまた見直して下さい。
b) scanf はBasicで言えば、inputに当たる命令(ほんとは関数)です。
最初のscanf は文字型変数name にキーボードから文字列を入力していますが、%s とかいう
見慣れない記号がついています。これはCの変換指示子というもので、変数name にキーボードからの
入力を文字列として代入せよという指示子です。
さて、次のscanf には %d がついています。%d
はキーボードからの入力を整数値として 変数(&age)に
代入せよという指示子です。Cでは scanf(&age) のように変換指示子をつけずに、いきなり変数に入力
することはできません。Basicにくらべてちと面倒ですね。Fortranのformat文による入出力の書式指定
を思い出します。
他に変換指示子としては
%o 8進整数値として入出力
%x 16進整数値として入出力
%f 実数として入出力
%c 1文字入出力
などがあります。
ここで、入出力と書きましたが、この変換指示子はscanf だけでなく、printf
で変数を出力する時も同じ指示子
を使います。一番最後の printf
を見てください。文字型変数name の出力に %s、
整数変数age の出力に%d
を使っています。
c) さて、scanf
でもうひとつ注意すべき点があります。2番めの
scanf で変数が &age となっていました。
実は scanf
の引数はポインタでなければなりません。 Cでは変数の前に
& をつけると、その変数の
ポインタを表すことになります。すなわち
&age はageのポインタを示しています。
Basic風に言い換えると、&ageはageの値の格納されているアドレスを表します。&age はBasicの varptr(age)
とほぼ同義です。この方がピンとくるでしょうか。
また、文字型変数name は、上述のようにこれはポインタ (Basic流では
name = varptr(name(0)) )ですから、
&
は不要です。引数としてそのまま書きます。
d)
最後に、もうひとつ。上のプログラムをコンパイルして実行して見てください。
Your Nameをインプットする時、 SOSEKI NATUME のように文字の間に空白を入れると、Ageが0
になってしまいます。これは、空白をくぎりとして認識するため name にSOSEKIが代入され、
age にNATUMEが
代入されたからです。
と、いうことで、Cの基本部分で他の言語(とはいっても主にBASIC)と違う部分を中心に説明してみました。
Cでプログラムを作りはじめのころは、変数の宣言忘れや、;
セミコロンの付け忘れなんか結構やってしまい
ます。とは言っても、おじさんはまだC入門者の域をでませんが。
TopPage
|