今後,C言語を用いての数値計算を学習する上で,C言語の重要な事項をまとめる.
- C言語では,大文字と小文字は,区別される.変数名 hogehogeと
Hogehoge,hoGehogeは異なる.
- コメント文は,プログラムの内容をわかりやすくするために記述する
ものである.これは,人間のためのもので,コンパイラーは無視する.
/*〜*/で囲まれた部分が,コメント文となる.行をま
たいでも,それは有効である.
- 識別子とは,変数,記号定数,関数などにつける名前のことである.名
前に用いることができる文字は決まっている.英大文字「A〜Z」と英
子文字「a〜z」,数字の「0〜9」とアンダースコアー「_」である.
- Cはフリーフォーマットで記述でききるので,文の区切りの記号が必要
である.その区切りの記号にセミコロン「;」を用いる.
- コンピューター内部では,\(バックスラッシュ)
と¥(円マーク)の取り扱いは全く同じです.
- {と}は対応しており,{と}で囲まれた部分は,一つの処理のまと
まり(ブロック)を表す.
- プログラムはmain()関数から実行される.
- 基本的には,プログラムは上から下へと処理の動作が行われる.
- 変数は,値を入れておく箱のようなものである.1つの変数に1個の値
を入れておく(記憶)ことができる.
- 変数を使う場合,実行文に先立って,その宣言を行う必要がある.
- 変数は定義してから用いなくてはならない.型と変数名を指定することにより,
変数の定義ができる.これは,プログラムを実行するときに必要な領域を確保す
るために必要で,コンパイラーが実行ファイルを作るときに使う.
- 使用頻度が高い型は,以下の通りである.
型名 |
型指定子 |
変数宣言例 |
文字型 |
char |
char a, b; |
整数型 |
int |
int i,j; |
倍精度実数型 |
double |
double x, y; |
- C言語では,変数の適用範囲は厳密に決められている.ローカル変数とグローバル
変数があり,適用範囲が異なる.
|
ローカル変数 |
関数の中で定義され,その関数の中だけで使用できる.関数が
コールされるとメモリー上に変数が配置される.その関数の処理が終わると
その変数は消滅する.通常,使うのはこれである. |
|
グローバル変数 |
関数の外で定義され,どの関数でも使用できる.プログラムが
起動されるとメモリー上に変数が配置される.プログラムが終了するまで,
変数は維持される. |
- C言語で使われる演算子で分かりにくいものを表1
にまとめておく.
表 1:
分かりにくい演算子
種類 |
演算子 |
機能 |
使用例 |
備考 |
算術演算子 |
% |
剰余(余り) |
c=a%b |
除算の余りを計算 |
関係演算子 |
== |
等しい |
if(a==b) |
a==bの演算結果は,0 or 1 |
|
!= |
等しくない |
if(a!=b) |
a!=bの演算結果は,0 or 1 |
論理演算子 |
! |
否定 |
if(!a) |
!aの演算結果は,0 or 1 |
|
|| |
論理和(or) |
if(a || b) |
a || bの演算結果は,0 or 1 |
|
&& |
論理積(and) |
if(a && b) |
a && bの演算結果は,0 or 1 |
代入演算子 |
= |
代入 |
b=a |
右辺の式の値を左辺の変数に代入 |
|
a+=b |
|
b=a |
a=a+bと同じ |
|
a-=b |
|
b=a |
a=a-bと同じ |
|
a*=b |
|
b=a |
a=a*bと同じ |
|
a/=b |
|
b=a |
a=a/bと同じ |
その他 |
++ |
インクリメント |
a++ |
a=a+1と同じ |
|
- |
デクリメント |
a- |
a=a-1と同じ |
- 論理演算では,0が偽(誤り)で 1が真(正しい)となる.
- 0と1以外で論理演算を行った場合,0のみが偽として取り扱われ,非0は真となる.
- キーボードから,値(文字や数値)を読み込むために,
scanf()関数を使う3.読
み込んだ値は,変数に格納される.
- scanf()関数の記述の仕方は,次の通りである.
- scanf("変換仕様の並び ", &変数名, &変数名,
, &変数名);
- 変換仕様とは,キーボードから入力されたものがどのような値か判断
するために使う.主なものは以下の通りである.
1文字 |
%c |
整数 |
%d |
小数 |
%lf |
指数形式 |
%e |
- 変数名は,先頭に&をつける必要がある4.
- ダブルクォーテーションで囲まれた部分 ("出力の並び") に,ディスプレ
イに表示したい文字列や変数の変換仕様を記述する.変換仕様は対応す
る変数の出力方法を決めるものである.
- printf("出力の並び", &変数名, &変数名,
, &変数名);
- 使用頻度の高い変換仕様は,以下の通りである.
1文字 |
%c |
整数 |
%d |
小数 |
%f |
指数形式 |
%e |
- 整数の表示桁数を調整するときは,変換仕様%dの
%とdの間に,表示したい桁数を記述する.
- 少数部の桁を調整するときは,変換仕様%fの%と
fの間に,「.桁数」と記述する.
- 改行したい場合は,改行したい場所に「\n」を記述
する.
- データの区切りにタブ(Tab)が使われることが多い.タブを入れたいときには,
「\t」を記述する.タブとは適当な空白のこと.
- 通常,プログラムは上から下へと実行される.しかし,条件に従い実行の流れを
変えたい場合がある.そのような場合,制御文をつかう.制御文には,分岐と繰り
返しがある.
- 分岐には if 文と switch 文がある.ただし,switch 文は滅多に
使われない.
- if(条件1){文1}else if(条件2){文2}else{文3}
- 条件1が真の時,文1が実行されます.条件1が偽の場合,次の条
件2の真偽を判断し,真ならば文2を実行します.else
if文はいくらでも書くことができます.
- 最初に真である条件に続く文を実行すると,if文から
抜けます.
- 全てのif又はelse ifの条件が偽ならば,
elseの文3を実行します.
- switch(式)
- 使用頻度の高い繰り返し文は,次の3個である.
- for(初期値;継続条件式;再設定式){文}
- 実行順序は,以下の通り.
- (1)
- 初期値の設定
- (2)
- 継続条件が真ならば,続く文を実行し,偽ならば
for文は終了する.
- (3)
- 再設定式を実行
- (4)
- 再び,(2)から実行する.
1 #include <stdio.h>
2 int main(void){
3 int a, b;
4
5 a = 0;
6 b = 0;
7
8 for(a=1; a<=100; a++){
9 b += a;
10 }
11
12 printf("b = %d\n",b);
13
14 return 0;
15 }
- do{文}while(継続条件式);
- 実行順序は,以下の通り.
- (1)
- 文を実行
- (2)
- 継続条件式が真ならば(1)へ戻り,偽ならば
do文は終了
1 #include <stdio.h>
2 int main(void){
3 int a, b;
4
5 a = 1;
6 b = 0;
7
8 do{
9 b += a;
10 a++;
11 }while(a<=100);
12
13 printf("b = %d\n",b);
14
15 return 0;
16 }
- while(継続条件式){文};
- 実行順序は,以下の通り.
- (1)
- 継続条件式が偽ならば,while文は終了.新な
らば,(2)へ
- (2)
- 文を実行
- (3)
- (1)へ戻る
1 #include <stdio.h>
2 int main(void){
3 int a, b;
4
5 a = 1;
6 b = 0;
7
8 while(a<=100){
9 b += a;
10 a++;
11 }
12
13 printf("b = %d\n",b);
14
15 return 0;
16 }
- 配列は,同じようなデータが多くある場合に使います.多くのデータ
に一つずつ名前をつけると大変です.1万個のデータがあった場合,1万
個の名前を付けた変数を用意しますか?.下の例で,変数を用いての大
量のデータ処理が不可能ということが分かるでしょう.
- 1万個の変数で領域を用意する場合の宣言
|
double aaa, aab, aac, aad, aae, aaf; |
|
|
|
double oun, ouo, oup, ouq; |
- 配列で1万個の領域を用意する場合の宣言
- 配列を使う場合も宣言が必要です.宣言の例は,以下の通りです.
配列の次元 |
要素数 |
宣言例 |
1次元 |
100 |
double x[100] |
2次元 |
100100 |
double x[100][100] |
3次元 |
100100100 |
double x[100][100][100] |
- 配列添字は0から始まります.したがって,「double x[1000]」
と宣言した場合,使える配列は,x[0]〜x[999]まで
です.
- 添字である数字でデータの指定ができるため,メモリからのデータの読
み書きが単純化できます.
この辺はテストにでないが,以下について理解して欲しい.
- 通常の変数には整数や実数の値を格納するが,ポインターにはアドレスを格納す
る.
- ポインターの宣言には,型名とアスタリスク(*)を付ける.
int *pi;
double *px;
- 変数のアドレスを取り出すには,変数名の前にアンパサンド(&)をつける.
&はアドレス演算子である.
pi=&i;
px=&x;
- ポインターが示しているデータの値を取り出すためには,ポインター変数の前に
アスタリスク(*)をつける.*は間接参照演算子である.
j=*pi;
y=*px;
- コンパイルに先立って,ソースプログラムを整形する機能をプリプロセッサーと
言う.プリプロセッサーは,必ず#から始まる.
- #include文では,ファイルがそこに展開される.
- #define文は,文字の置き換えに使われる.
- 通常,標準入力はキーボードを表し,標準出力はディスプレイを表す.
- 標準入力のためには,scanf()関数を使えばよい.
- 標準出力のためには,printf()関数を使えばよい.
- 型による標準入出力の方法は,表2のようにする.
表 2:
型に依存する変数定義や入出力
|
整数 |
倍精度実数 |
文字 |
文字列 |
変数 |
int hoge |
double hoge |
char hoge |
char hoge[256] |
入力 |
scanf("%d",&hoge) |
scanf("%lf",&hoge) |
scanf("%c",&hoge) |
scanf("%s",hoge) |
出力 |
printf("%d",hoge) |
printf("%f",hoge) |
printf("%c",hoge) |
printf("%s",hoge) |
|
|
printf("%e",hoge) |
|
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成18年6月6日