次のように、3つの入力の合計を計算して表示するプログラムで、C言語とJavaを比較します。 なお、赤がキー入力です。
a=3 b=5 c=4 a+b+c=12
C言語 | Java |
---|---|
#include <stdio.h> int v1, v2, v3; main(int argc, char *argv[]) { printf("a="); fscanf( stdin , "%d" , & v1); printf("b="); fscanf( stdin , "%d" , & v2); printf("c="); fscanf( stdin , "%d" , & v2); printf("a+b+c=%d" , v1 + v2 + v3 ); } |
import java.util.Scanner; public class JTest01 { public static int v1, v2, v3; public static void main(String[] arg) { Scanner stdin = new Scanner(System.in); System.out.print("a="); v1 = stdin.nextInt(); System.out.print("b="); v2 = stdin.nextInt(); System.out.print("c="); v3 = stdin.nextInt(); System.out.print("a+b+c=" + (v1 + v2 + v3)); } } |
Javaでは、関数mainをクラスの中に書きます。
クラスの範囲は、class クラス名 { と、} で、この中にmainを書きます。
クラス名の部分 は、JTest01 になっています。
public が付くクラスは、ソースファイルの中に一つしか書けません。そして、publicクラスの名前と同じ名前で、
ソースファイルを作らなくてはならない規則があります。
よって、このJavaのソースファイル名は、JTest01.javaで作成しなければなりません。
C言語では、グローバル変数としてv1,v2,v3を宣言し、グローバル関数としてmainを定義しています。
対してJavaは、情報や関数の入れ物となる『クラス』と呼ばれるものを使わないと、変数や関数が作れません。
ここでは、JTest01のクラスの中に作っています。
Javaでは、C言語のようなグローバル変数や関数は存在しません。必ずクラスに属する作り方となります。
ここでは、JTest01の中でmain関数を作る形態で、mainの先頭書式は必ず次のようにします。
public static void main(String[] arg)
(argだけは仮引数の名前なのでネーミングは自由)
C言語のprintf("a=");
と同じ機能を、
Javaでは、System.out.print("a=");で実現しています。
print( と )の中では、基本的な種類のデータすべてを
書けます。しかし、C言語のように複数のデータをコンマで並べる仕様になっていません。
一つのデータ(式)を表現します。
C言語のfscanf( stdin , "%d" , & v1);
と同じ機能を、
Javaでは、v1 = stdin.nextInt();で実現しています。
ここでC言語のstdinは、標準入力(キー入力)のストリームで、fscanfはグローバル関数です。
対してJavaでは、この機能を持つオブジェクトを変数stdinに管理させて、処理させています。
オブジェクトとは、情報や機能を持つ記憶域と考えるとよいでしょう。
このstdinは、その記憶域を管理しているオブジェクト参照変数です。
そして、この変数stdinは、このmainの先頭で、
Scannerクラスの型の種類で宣言され、初期化しています。
Scannerのクラスという用語がでてきましたが、
Javaでは、たくさんの機能が使えるクラスがすでに用意されていて、
Scannerはそのクラスの一つということになります。
利用する形態はいくつかありますが、ここではnew演算子で作ったオブジェクトを
stdin変数に管理させ、その機能の一つであるnextInt()を、
v1 = stdin. nextInt(); のように、ドット . の演算子で
選択して、実行させています。
nextIntはメソッドと呼ばれるもので、Scannerには他にもたくさんのメソッドが存在します。
そのいくつかを以下で紹介します。(各種類の変数vがあるとした場合です。)
対応するC言語命令 | Scannerのメソッド |
---|---|
fscanf( stdin , "%d" , & v); | v=stdin.nextInt() |
fscanf( stdin , "%lf" , & v); | v=stdin.nextDouble() |
gets(charの配列 ); | 文字列変数=stdin.nextLine() |
fscanf( stdin , "%c" , & v); | v=stdin.nextByte() |
fscanf( stdin , "%hd" , & v); | v=stdin.nextShort() |
fscanf( stdin , "%f" , & v); | v=stdin.nextFloat() |
fscanf( stdin , "%s" , & v); | v=stdin.next() |
なお、Scannerクラスのように、既存のクラスを利用する場合、先頭行でimport指定が必要です。
これは、java.utilに属するScannerを使う宣言のようなものです。