パソコン活用研究シリコンバレー(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  ヌル文字
などがあります。 

 
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