今回は少々分量が多いが,コンピュータによる情報処理プログラムの骨格をなす事項(入出力,変数,代入,四則演算)を,説明する.
まずはしっかり全体像をつかんでほしい.
個々の単元についての細かな内容については,ここで暗記する必要はない.
プログラムにおいてどのような機能が利用できるかの概要を理解しよう.
まずは,Hello World のC言語プログラムのソースコードを眺めてみよう.
参考までに,他のプログラミング言語では,このような記述となる.
C言語固有のキーワードがいくつも登場するので,徐々に覚えましょう.
#include <stdio.h>
は,コンパイラにあらかじめ用意されている標準入出力ライブラリ関数(具体的には,画面出力を行うためのprintf()
関数)を使用するための宣言である.main
は,ここから処理が開始される一番重要な関数である.main
関数から始まり,行の上から下に順に処理が進む.main
関数の範囲は,波かっこ {
から }
まで.この範囲を「ブロック」と呼ぶ.printf()
関数内の二重引用符(ダブルクォーテーション)"...."で囲まれた部分は,文字列と呼ばれる.今日の予習として,以下の円の面積の計算プログラムを入力・保存・コンパイルして,実行してみよう.
各行の意味についてはまだわからなくてもよい.
大文字と小文字,各種記号に注意して1字1句間違いなく入力すること.
#include <stdio.h>
int main(void)
{
float pi = 3.1415;
int r = 10;
float A = r * r * pi;
printf("r= %d, Area = %.3f \n", r, A);
return 0;
}
実行結果:
????? 何が出力された?
計算の途中経過や結果の数値や文字を記憶しておく箱(=メモリ)を,プログラム中では 変数 と呼ぶ.
(これに対して, -100, 0.98
のような表記を「定数」と呼ぶ.)
C言語では
というルールがある.
C言語では,「宣言」していない変数は使うことができず,コンパイル時にエラーとなる.
変数が扱える数の種類を 型(かた) と呼ぶ.
C言語では,大きく分けて,整数型,
浮動小数点(実数)型 と,
文字型がある.
計算処理において,どのような数値を扱うかをあらかじめ計画し,適した型を宣言してから使う必要がある.
以下にC言語の主な組込型を示す.
当面は,整数型 int
,浮動小数点型 float
(またはdouble
),文字型 char
を使う,と覚えておけば良い.
読み方
int
- integer,イント型,インテジャー型,整数型
float
- floating point,フロート型,実数型,単精度型
double
- double precision (floating point),ダブル型,倍精度型
char
- character,キャラクター型,チャー型,文字型など
型名一覧 | |||
---|---|---|---|
種類 | 名前 | サイズ (byte) |
値の範囲 |
整数型 | |||
char |
1 | -128 ∼ 127 文字に割り当てられる. |
|
unsigned char |
0 ∼ 255 | int |
2 or 4 or 8 システムにより異なる. |
unsigned int |
|||
short |
2 | -32,768 ∼ 32,767 | |
unsigned short |
0 ∼ 65,535 | ||
long |
4 (8の場合もある) |
-2,147,483,648 ∼ 2,147,483,647 | |
unsigned long |
0 ∼ 4,294,967,295 | ||
long long |
8 | -9,223,372,036,854,775,808 ∼ 9,223,372,036,854,775,807 | |
unsigned long long |
0 ∼ 18,446,744,073,709,551,615 | ||
浮動小数点型(実数) | float |
4 | -3.4E38 ∼ 3.4E38 (Eは10の累乗) |
double |
8 | -1.7E308 ∼ 1.7E308 |
signed
は「符号あり」,unsigned
は「符号なし」という意味であり,整数型につけられる.
int
は,signed int
の略である.
いずれも符号の接頭辞を省略するとsigned
(符号あり)とみなされる.
short, long, long long
は相対的に変数の記憶容量が小さい/大きいことをあらわす接頭辞であり,それぞれshort int, long int, long long int
型の省略表記である.
int
型は昔は16bit,最近は32bitなど.)
そこで,最近のC言語規格(C99)では,整数型の名前が拡張されており,以下のようにビット数が固定されたわかりやすい名前になっている.#include <stdint.h>
が必要.
int8_t
8 bit 符号あり整数int16_t
16 bit 符号あり整数int32_t
32 bit 符号あり整数int64_t
64 bit 符号あり整数uint8_t
8 bit 符号なし整数uint16_t
16 bit 符号なし整数uint32_t
32 bit 符号なし整数uint64_t
64 bit 符号なし整数
変数の名前は下記の文法ルールにさえ従えば,自由につけて良い.
ただし,実際にはプログラムを書いている人,あるいは読む人に,その意味するところがわかる名前を付けるべきである.
変数名の付け方ルール.
C言語のおもな予約語一覧
auto, break, case, char, 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
正しい変数名 | 誤った変数名 |
int a12; int break_1 |
int 12a; (変数名が数字から始まっている)int break (breakは予約語) |
float Return; |
float return; (予約語は変数名には使えない) |
double ab_c; |
double ab-c; ( - が減算とみなされる) |
変数に定数や別の変数の値をコピーすることを 代入 とよび,
記号 =
で表す(代入演算子という).
(数学の「等しい」とは異なる用法なので注意!!!)
例1
int a; /* 整数型変数 a の宣言 */
a = 10; /* 代入 */
これは,変数 a
に値 10 を代入する という意味となる.
数学の「等しい」とは異なり,
右辺から左辺への一方通行であるため,次のような書き方は,コンパイルエラーとなる.
10 = a ; /* これはエラー */
例2:変数に別の変数の値を代入
float b, c; /* 実数型変数 b,c の宣言 */
b = -9.81; /* 変数への定数の代入 */
c = b; /* これもOK */
以下はどれも正しい変数の宣言方法である.
二つの同じ型の変数を宣言する | int a; |
int a, b; /* まとめて宣言 */ |
一つの変数の宣言と初期化 | int a; /* 変数宣言 */ |
int a = 2; /* 変数宣言+初期化 */ |
二つの同じ型の変数の宣言と初期化 | int a; int b; |
int a=2, b=3; |
/*
からはじまり,*/
で終わる区間(改行を含む)//
から行末までprintf()
関数の使い方・・・画面への表示,出力
計算機の内部でどんなに興味深い,意味のある計算を行っていても,人間が理解できる形で出力しなければ意味が無い.
そこで,まずは画面に文字や数値を表示するprintf()
関数について学ぶ.
書式:printf(書式指定文字列, ...)
「書式指定文字列」には,表示したい文字そのものと,後述する特別な記号を組み合わせて使う.
printf()
関数の重要な機能は,単に文字を画面に出力するだけでなく,変数に格納された値を表示することができる点にある.
例:以下のプログラムを入力・保存・コンパイルして,実行してみよう
#include <stdio.h>
int main(void)
{
int a; /* 整数型の変数 a を使用します!と,宣言 */
a = 10; /* a に10を「代入」する.「等しい」という意味ではない. */
printf("変数 a の値は, %d です\n", a); /* 変数 a の値を画面に表示.実行時に %d の部分が数値に置き換わる. */
return 0;
}
実行結果:
変数 a の値は, 10 です
書式指定文字列中の%から始まる記号をいろいろ工夫することによって,表示スタイルをいろいろと変化させることが出来る.
書式指定文字 (m,nは整数) |
意味 |
例 |
%d |
整数を十進数で表示.%5d や %05d とすると桁数指定可 |
1, 2, -35 |
%x |
整数を十六進数で表示. | ffff, 01ab |
%f |
実数(float型)を小数で表示 | 0.100000 |
%n.mf |
実数(float型)を n 桁の小数で表示,小数部を m 桁で表示.空白はスペースを表示 | 0.10 |
%lf |
実数(double型)を小数で表示 | 0.100000 |
プログラム例1:以下のソースをコピーして実行してみよう.
#include <stdio.h>
int main(void)
{
int a = 30; /* 変数の宣言と同時に代入も出来る.「初期化」という */
float r = 3.14;
printf("変数 a の値は, %d です\n", a);
printf("変数 a の値は, %x です\n", a);
printf("\n");
printf("変数 r の値は, %f です\n", r);
printf("変数 r の値は, %12.3f です\n", r);
return 0;
}
printf
では,書式指定文字列中に複数の %
記号を並べれば,複数の変数を順番に表示できる.
プログラム例2:
#include <stdio.h>
int main(void)
{
int a = 50;
float r = 3.14;
printf("a,r の値は,それぞれ %d , %f です\n" , a, r); /* カンマ区切りで変数を並べる */
return 0;
}
printf()
において,「abc」や「123」などの普通の文字・数値は,そのまま表示できるが,それ以外にも改行やタブなどの特殊な文字を表示したい場合がある.
例えば,上の例で確認した通り,printf
の書式の中では, %, \
などの記号には特別な役割があるため,これらの文字を表示したい場合には工夫が必要である.
そこで,特殊な文字を出力するために「エスケープシーケンス」という機能が用意されており,\
(バックスラッシュ) または ¥
(円マーク)に文字を加えてあらわす.
たとえば,改行を画面に出力したい場合,ソースコード中に \n
または ¥n
と書く.
#include <stdio.h>
int main()
{
printf("Hello! \n World \n ");
return 0;
}
表示したい文字 |
エスケープシーケンス \ と ¥ は同じ意味. |
\ |
\\ |
% |
%% |
’ |
\’ |
” |
\” |
タブ |
\t |
バックスペース |
\b |
ベル(音が鳴る) |
\a |
改行 |
\n |
さらなる詳細については,Microsoft社,関数リファレンス,printf(外部サイト)や,
Embarcadero社,ライブラリ関数リファレンス, printf(外部サイト)も参考にすると良い.
このようなコンパイラメーカーが提供するリファレンスマニュアルには,豊富なサンプルプログラムが掲載されており,これを自分のコンピュータで写して実行,結果を確認してみよう.
そして,サンプルのソースコードを読むことは,大変良い勉強となる.
以下のような文字を画面に表示するプログラムを書け.
エスケープシーケンスをうまく使用する.
全角文字を使用しないこと.
実行結果: You have $100. I got ¥500. 15 % discount! That is "great!"
C言語で標準的に使用できる算術演算について学ぶ.
(いろいろな演算を行う記号のことを,演算子と呼ぶ.)
数の計算に用いる演算子を下の表にまとめる.
演算子 | 作用 | 使い方の例 | 意味 |
+ |
和 | a = b + c; |
b と c をたした値を a に代入 |
- |
差 | a = b - c; |
b から c をひいた値を a に代入 |
* |
積 | a = b * c; |
b と c をかけた値を a に代入.アスタリスク,コメと読む. |
/ |
商 | a = b / c; |
b を c でわった値を a に代入(c が 0 の時はエラー,注:整数/整数は切り捨て) |
% |
剰余 | a = b % c; |
b を c でわったあまりを a に代入.整数のみOK |
和差積商は数学でもおなじみだが,積と商において,数学とは異なる記号を用いる.
積商は,和差よりも優先順位が高く,先に計算される.
また,( )
を用いて計算順序を変更できる点は,数学と同様である.
%
演算子は数学では百分率を表す記号であるが,C言語では割り算のあまりを表す.
(1)式の値を表示する例:
以下のコードを実行してみよう.
#include <stdio.h>
int main(void)
{
printf(" 1 + 2 は %d です\n", 1+2);
printf(" 1 - 2 は %d です\n", 1-2);
printf(" 5 x 2 は %d です\n", 5*2);
printf(" 5 / 2 は %d です\n", 5/2);
printf(" 10 %% 3 は %d です\n", 10%3); /* %% は,エスケープシーケンス! */
return 0;
}
(2)変数で計算し,値を表示する例:
(1)を改造して,以下のコードを実行してみよう.
#include <stdio.h>
int main(void)
{
int a; /* 変数の宣言 */
int b;
a = 1 + 2; /* 四則演算と代入 */
b = 3 * 4;
/* 以下,表示 */
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("a+b = %d\n", a + b); /* ここで計算してもOK */
}
次に,変数 a
の値を 1 だけ増やしたい場合はどうしたら良いか?
実は,このように書ける.
a = a + 1;
まず,右辺の計算で a に 1 が加算され,その結果が左辺の a にふたたび代入されるため,これでうまく動作するのである.
注意:Cでは数学とは異なり 「a の値と a+1 とが等しい」という意味にはならない!
さらに,数学の 定義 とも異なり,変数と値の「関係」を定義するものではない.
つまり,処理が=
が出現した行に差し掛かったときに,右辺から左辺へと「代入」が行われるのみである.
和差積商を組み合わせた式の計算を行ってみよう.
計算結果を適切な型の変数に代入してから表示せよ.
プログラムを書いていると,「ある変数に演算をして,またもとの変数に代入する」という処理が頻繁に登場する.
これを効率よく行うため,以下のような代入演算子(演算+代入を一度に行うもの)がある.
演算子 | 使い方 | 意味 |
= |
a = b; |
b の値を a に代入 |
+= |
a += b; |
a = a + b; |
-= |
a -= b; |
a = a - b; |
*= |
a *= b; |
a = a * b; |
/= |
a /= b; |
a = a / b; |
%= |
a %= b; |
a = a % b; |
++ |
a++; |
a = a + 1; または a += 1; |
-- |
a--; |
a = a - 1; または a -= 1; |
代入で説明した,
a = a + 1;
を,代入演算子を使って
a += 1;
あるいは
a++;
と書くこともできる.
いずれも全く同じ意味になる.
どれを使用してもよいが,この表記の意味を理解できるようにしておこう.
プログラムでは,処理の途中にユーザーからの指示を仰ぎたい場合や,データを入力させたい場合がある.
そのような場合,キーボードからデータを入力する scanf()
関数を用いる.
scanf()
関数は,printf()
関数によく似ているが,
値を格納する変数の前に & をつける必要がある.
この記号は,変数が置かれている場所である「アドレス」を取り出す演算子で,scanf()
関数に値を格納する場所を教えている.
詳しくは「ポインタ変数」の単元で解説する.
例:キーボードから変数に値を入力し,画面にその二乗を表示するプログラム
#include <stdio.h>
int main(void)
{
int a = 0;
float b = 0;
printf("a = ");
scanf("%d", &a); // ここは整数型
printf("b = ");
scanf("%f", &b); // ここは実数型
printf("a*a = %d \n", a*a);
printf("b*b = %.3f \n", b*b); // 実数を小数第3位まで表示
return 0;
}
以下のように,1つのscanf
内に複数の書式指定文字と変数を書いて,複数の値をキーボードから入力させることができる.
(この例では,OnlineJudge提出用の例として,scanf()
の前の printf()
をコメントアウトしている.
デバッグ時はprintf
を有効にして,提出時はこのように余分な文字出力をコメントアウトすること)
#include <stdio.h>
int main(void)
{
int a, b; // 整数型変数 a, b
// printf("a b=?"); // 入力させるためのメッセージ.OnlineJudgeに提出時はコメントアウトすること!.
scanf("%d %d", &a, &b); // 標準入力から整数を2つ入力.区切りは半角スペースを使用
int c = a+b; // 加算の答えを整数 c へ代入(等式ではない!)
printf("%d\n", c); // cの値を10進数表記で標準出力へ書き出す.これは提出時に消さないこと.
return 0;
}
実行例:
10 20 <--- 入力
30 <--- 出力
以上で,基本的な入出力,変数の宣言と値の代入,四則演算について最低限の知識を学んだ.
あとは実習問題に取り組みながら,内容の理解を徐々に深めてゆこう.
OnlineJudgeでは,計算結果などの出力値を用いて正解・不正解の判定を行うので,判定に不要な余分な文字を出力しないこと! タブ・スペース・改行などの表示されない文字も×
printf
をコメントアウトし,数値のみを出力させること.また,全角文字はなるべく使用しない,数値の表示桁数などにも注意すること.
printf
の書式指定で "%.1f"
とする.
実行例:(数値は正しいとは限らない) (1)デバッグ時の動作 r =? 10.5 (キーボード入力) length = 100.2 area = 200.1 (2)OnlineJudgeで提出する際の出力は,以下のように余分な文字を表示しないようにする. 10.5 (キーボード入力) 100.2 200.1
printf
の書式指定で "%.2f"
とする.
実行例:(数値は正しいとは限らない) (1)デバッグ時の動作 width = 0.35 1.5 (キーボードから2つ数値を入力) area = 29.20 (2)OnlineJudge提出時の動作 0.35 1.5 (スペース区切りで入力) 29.20