C言語Iまとめ資料

C言語Ⅰ
まとめ集
N科
1
C言語Ⅰ・まとめ
N科manabu
■ プログラム作成の約束事
【1】 先頭に
#include <stdio.h>
を入れる。
void main() などでもよい。
その場合は return; で終わる。
【2】 プログラムは
int main(void)
で始めて、プログラムを { } で囲う。
【3】 プログラムの終わりは
return 0;
を入れておく。
2
C言語Ⅰ・まとめ
N科manabu
■ 変数(数を入れる箱)を宣言する
整数
nx
整数
ny
変数とはつまり 箱
・ 箱の大きさを決めるので「宣言」が必要
( int か double )
・ 変数には自由に名前をつけよう
【1】入れる数が整数なら
int nx , ny ;
で宣言
【2】入れる数が実数(=小数を含む数
double nx , ny ;
で宣言
1.25や3.14等)なら
3
C言語Ⅰ・まとめ
■ C言語での計算
N科manabu
【ポイント】 ここでの「=」(イコール)は「代入のイコール」と覚えると
よい。wa ← nx+ny のように、nx と ny を足したものが wa に代入さ
れるイメージ
【1】 足し算 例: wa という変数に nx と ny を足したものを入れる
【参考】 簡易記述方式(差や積も同じ)
wa = nx + ny ;
sum = sum + i ; は sum += i ; とも書ける
【2】 引き算 例: sa という変数に nx から ny を引いたものを入れる
sa = nx - ny ;
【3】 かけ算 例: seki という変数に nx と ny をかけたものを入れる
seki = nx * ny ;
応用例: 一辺 a cm の正方形と、一辺 b cm の正方形の面積の和 wa は
wa = a*a + b*b ;
である。
4
C言語Ⅰ・まとめ
N科manabu
■ C言語での計算
【4】 割り算 例: sho という変数に nx を ny で割ったものを入れる
sho = nx / ny ;
【5】 余り 例: amariという変数に nx を ny で割ったときの余りを入れる
amari = nx % ny ;
たとえば 10%3は1になる(10割る3は商3余り1)
【整数と実数と混ざった計算】
実数 avg1~3, 整数 nx=10 , ny=7 で
avg1 = ( nx + ny ) / 2;
avg2 = ( nx + ny )/ 2.0;
整数を2(整数)で割
るから結果も整数
整数を2.0(実数)で割る
から結果は実数 (強い
ほうが勝つ)
avg3 = (double) ( nx + ny ) / 2;
(キャスト演算子) 指定して
はじめから全計算は実数で
実行結果
計算結果を確実に実数
で欲しい場合はこれで
実施すること
5
C言語Ⅰ・まとめ
N科manabu
■ 画面に表示する: printf
printf ( “表示する文字列。値は%dで書く。¥n” , x );
・ 表示する文字は “ ” でくくる。
・ 改行は ¥n
・ 整数値は %d と書いておき、カンマの後に対応する変数
・ 実数値は%f 桁数表示指定の指示が問題としてよく出る。
printf( “ %□.△f “, x );
全体で何桁表示
するか?
2.3456
※表示桁数指定自体は %5d
のように%dでも可能
小数点以下何桁表示
するか?
2.3456
6
C言語Ⅰ・まとめ
N科manabu
■ キーボードから入力する: scanf
scanf(“%d”, &x );
・
・
・
・
整数値は %d と書いておいてあとで、対応する変数
実数値は %lf と書いておいてあとで、対応する変数
変数には & をつけること。(C言語Ⅱ:ただし文字列の場合は&不要)
入力の前に出す表示はprintfで表示する。
例: 整数値を入力してください:■
printf(“整数値を入力してください:”);
scanf(“%d”,&x);
7
C言語Ⅰ・まとめ
N科manabu
■ 条件を判断する①: if 文
if (条件式)
{ 条件が合えば実行される }
実行文がひとつなら { } を
省略できるが忘れないように
いつも付けておくのがよい
例
if (a==0)
{ printf ( “ a はゼロです ¥n “); }
printf (“ プログラム終了 ¥n”);
実行結果: aが 0 のとき
a はゼロです
プログラム終了
「プログラム終
了」はif文の外
だからどっちで
も出るよ
実行結果: aが 99 のとき
プログラム終了
8
C言語Ⅰ・まとめ
N科manabu
■ 条件を判断する②: if else 文
if (条件式)
{ 条件が合えば実行される }
else
{ 条件が合わないとき実行される }
例
if (a==0)
{ printf ( “ a はゼロです ¥n “ ); }
else
{ printf (“a はゼロではありません¥n ” ); }
実行結果: aが 0 のとき
a はゼロです
else 以下が
実行されている
実行結果: aが 99 のとき
a はゼロではありません
9
C言語Ⅰ・まとめ
N科manabu
■ 条件を判断する③: if
else if 文
if (条件式①)
{ 条件①が合えば実行される }
else if (条件式②)
{ 条件①は×だが、②が合う場合実行される }
else
{ 条件①も②も合わない場合実行される }
例
if (a>b)
{ printf("Aの方が大きい¥n");
else if (a<b)
{ printf("Bの方が大きい¥n");
else
{ printf("AとBは等しい¥n");
実行結果: a > b のとき
Aの方が大きい
}
}
}
実行結果: a < b のとき
Bの方が大きい
実行結果: それ以外のとき
AとBは等しい
10
C言語Ⅰ・まとめ
N科manabu
■ 条件式の書き方
if ( a == b )
if ( a != b )
if ( a > b )
if ( a < b )
if ( a >= b )
if ( a <= b)
if ( a%2 == 0 )
if ( a%2 == 1 )
a と b が同じなら イコール2つに注意
a と b が異なるなら
a が b より大きいなら
a が b より小さい(未満)なら
a が b 以上なら
a が b 以下なら
a が偶数なら(偶数は2で割ったらあまりゼロ)
a が奇数なら(奇数は2で割ったらあまり1)
11
C言語Ⅰ・まとめ
N科manabu
■ 条件式の書き方②
AND条件 「&&」 条件が両方成り立つ場合
if ( a == 0 && b == 0 ) a が 0 かつ b が 0 なら
if ( a >= 3 && a < 9 ) a が3以上9未満なら
■ 応用:
if ( a==b && b== c) 「aとbとcがすべて等しいなら(a=b=c)」 【注意】 if (a==b==c)は誤り
OR条件 「 || 」 どちらかが成り立つ場合
if ( a == 0 || b == 0 ) a が 0 または b が 0 なら
if ( a%3==1 || a%3==2 )
aを3で割った余りが1か2なら
| はシフトを押しながら¥を押すと出る
■ 応用:
if ( a==b || b==c || a==c ) 「aとbとcがどれか二つが等しいなら(全部等しくてもOK)」
12
C言語Ⅰ・まとめ
N科manabu
■ switch文 (変数数値ごとに処理)
switch (評価式) {
case 0 : 「評価式が0の時の実行文」; break;
case 1 : 「評価式が1の時の実行文」; break;
case 2 : 「評価式が2の時の実行文」; break;
・・・・・
default : 「それ以外の時の実行文」; break;
}
break;
を忘れない
こと
例: 3で割った余りごとに処理を分ける
switch (p % 3) {
case 0 : printf(“pは3で割り切れる”); break;
case 1 : printf(“pは3で割ると余り1”); break;
case 2 : printf(“pは3で割ると余り2”); break;
}
13
C言語Ⅰ・まとめ
N科manabu
【発展】
■ 条件演算子
(条件式) ? (正しいときの値):(違うときの値)
例:
max = (n1>n2) ? n1 : n2 ;
これは、変数 max に結果的にn1とn2の大きいほうが入る。
■ 条件式のない if 文
この場合(条件式)に書かれた式の値が「0でない場合に実行」される。
例:
if (no % 3 )
{ printf(“%dは3で割り切れない¥n”); }
If ( no % 3 != 0 )
と同じこと
14
C言語Ⅰ・まとめ
N科manabu
■ 繰り返し処理①: for文
カウンタ
繰り返し
条件
カウンタ
アップ
カウンタ変数は
事前に宣言する
int i;
for ( i=1 ; i<=n ; i++ ) {
繰り返す内容
}
例
for ( i=1 ; i<=5 ; i++ ) {
printf( “%d ” , i );
}
【実行結果】
12345
5回繰り返し
printf が
実行されている
15
C言語Ⅰ・まとめ
N科manabu
■ 繰り返し処理②: while文
カウンタ
繰り返し
条件
自分で
作る
カウンタ
アップ
自分で
作る
while (条件式){
繰り返す内容
カウンタは
例
自分で作る
i=1;
while(i<=5) {
printf(“%d ” , i );
カウンタアップも
i++; }
}
【実行結果】
12345
5回繰り返し
printf が
実行されている
自分でやる
16
C言語Ⅰ・まとめ
N科manabu
■ 繰り返し処理③: do while文
カウンタ
繰り返し
条件
自分で
作る
カウンタ
アップ
自分で
作る
do{
繰り返す内容
while (条件式)
例
i=1;
do{ printf(“%d ”,i );
i++;
} while(i<=5)
【for,whileとの違い】
「実行」してから「判断」するか
ら絶対に1回は処理が実行さ
れる。
(for,whileは条件が合っていな
ければ一回も実行されない)
}
【実行結果】
12345
ちなみに
i = 6 ではじめても
「6」が出力されます
17
C言語Ⅰ・まとめ
N科manabu
■ カウンタアップについて
i を 1 足す
i++
i を 1 引く
i--
こう書いてもよい
i = i + 1;
または ++i;
こう書いてもよい
i = i - 1;
または --i;
変数 i に
今の i に 1 加えた
ものを入れる
つまり1だけ増加
変数 i に
今の i に 1 引いた
ものを入れる
つまり1だけ減少
18
C言語Ⅰ・まとめ
N科manabu
■ 繰り返し処理: よく出る問題
「1から10までの数をすべて足す」
・ 足す結果を入れる変数 sum を準備・リセット
・ 繰り返し命令を使いカウンタを1⇒10と変化
・ カウンタをそのたび毎に sum に足せばよい
【for文】
【while文】
【do while文】
int i , sum=0 ;
int i=1 , sum=0 ;
int i=1 , sum=0 ;
for ( i=1 ; i<=10 ; i++ ) {
sum = sum + i ;
}
while ( i<=10 ) {
sum = sum + i ;
i++
}
printf(“合計は%d”,sum);
printf(“合計は%d”,sum);
(0にする)
do {
sum = sum + i ;
i++
} while ( i<=10 )
printf(“合計は%d”,sum);
19
C言語Ⅰ・まとめ
N科manabu
■ 繰り返し処理: 二重ループ
i
例題: 九九の表を表示させよう
int i , j ;
j
for ( i=1 ; i<10 ; i++) {
for (j=1; j<10 ; j++){
printf(“%2d ”,i*j );
}
printf("¥n");
}
カウンタ j で9回
横の列
整数2桁で表示
カウンタ i で9回
縦の行
20
C言語Ⅰ・まとめ
N科manabu
■ 配列
数字を入れるロッカーを作ろう
n[0]
n[1]
n[2]
n[3]
n[4]
n[5]
n[6]
【宣言方法】
注意!
「整数を入れる7個の箱を作りなさい」
<整数>
箱は0番から
つまり n[0]~n[6]までの7つの箱(上図)
7個作ったら
int n[ 7 ];
(注意: n[7]の箱はない)
n[6]まで
<実数>
「実数を入れる13個の箱を作りなさい」
double nx[ 13 ];
つまり nx[0]~nx[12]までの13つの箱
(注意: nx[13]の箱はない)
21
C言語Ⅰ・まとめ
N科manabu
■ 配列の中身を入れる
数値をどう入れていくか?
① 手で入れる
② for文流れ作業
③ キーボード入力
宣言と同時に入れる。
int n[3];
for( i=0 ; i<3 ; i++)
{ n[ i ] = ( i+1)*10; }
int n[3];
for( i=0 ; i<3 ; i++) {
printf(“n[%d]=”, i );
scanf(“%d” , &n[i] );
}
int n[3]={ 10, 20, 30 };
整数
整数
整数
n[0] n[1] n[2]
10
20
30
整数
整数
整数
n[0] n[1] n[2]
10
=1*10
20
=2*10
30
=3*10
たくさんの箱を機械的
に入れる場合に便利
for文とscanf文の組み合わせだ
が、n[%d]として入力を誘う表示
をprintfでしているところも注目
22
C言語Ⅰ・まとめ
N科manabu
■ 配列テクニック:①中身のコピー
■ 中身のコピー
int nx[2] = { 10 , 20 , 30 };
int ny[2];
for( i=0 ; i<3 ; i++ )
{ ny[ i ] = nx[ i ] ; }
■ 中身をクロスコピー
int nx[2] = { 10 , 20 , 30 };
int ny[2];
for( i=0 ; i<3 ; i++ )
{ ny[ i ] = nx[ 2- i ] ; }
演習書 P.29
整数
整数
整数
nx[0]
nx[1]
nx[2]
10
20
30
整数
整数
整数
ny[0]
ny[1]
ny[2]
10
20
30
整数
整数
整数
nx[0]
nx[1]
nx[2]
10
20
30
整数
整数
整数
ny[0]
ny[1]
ny[2]
30
20
10
箱の指し示し方をうまく変えていることに注意しよう
23
C言語Ⅰ・まとめ
N科manabu
■ 配列テクニック:②中身を全部足す
■ 中身の総和
int n[2] = {10,20,30};
合計値をリセット
int sum = 0;
箱の数だけ繰り返す
for( i=0 ; i<3 ; i++)
{ sum = sum + n[i] ; }
演習書 P.29
整数
整数
整数
nx[0]
nx[1]
nx[2]
10
20
30
整数
sum
10+20+30
24
C言語Ⅰ・まとめ
N科manabu
■ 配列テクニック:③ 平均値を出す
■ 平均値
整数
整数
test[0]
test [1]
test[2]
8
12
10
人数 num 人のクラスにおいて、
test[i] に各生徒のテストの点数
このクラスの平均点avgは?
合計値をリセット
整数
演習書 P.29
クラス3人
テストの点
が各test[i]に
int sum = 0;
人数分繰り返す
double avg;
for( i=0 ; i<num-1 ; i++)
{ sum = sum + test[i] ; }
avg = (double) sum / num;
整数
sum
10+8+12
実数 avg
3で割って
30 ÷ 3
= 10.00
平均=合計÷人数
25
C言語Ⅰ・まとめ
N科manabu
演習書 P.29
■ 配列テクニック:④ 平均値以下ピックアップ
■ 平均値以下の生徒をピックアップ
人数 num 人のクラスにおいて、
test[i] に各生徒のテストの点数が入っている。
平均点を変数 avg に入れた。
そこで平均点以下の生徒の点数を表示しよう。
人数分繰り返す
for( i=0 ; i<num-1 ; i++){
平均点以下なら
if ( test[i] <= avg )
{ printf (“%d番 %d点で×”, i+1 , test[i]); }
}
なぜ「 i + 1 」なの?
配列は0番から。
でも人間は1番2番
と1から数えるから
表示のさせかたもポイント。
何番目の生徒:一つ目の%dで i+1 を表示)
何点:二つ目の%dで 点数(test[i])を表示)
を表示している。
26
C言語Ⅰ・まとめ
■ 配列テクニック:⑤ 最大値
N科manabu
演習書 P.29
最小値も同じようにできる
■ 最大値
num : クラスの人数
test[num] : 各生徒の点数が入った配列
max : 最大値
暫定一位を0番目の
d : 最大値をもつ生徒
学生に設定する
int max = test[0] ;
int d = 0;
人数分繰り返す
for( i=0 ; i<num-1 ; i++){
if ( test[i] >= max ) 現在の一位を越え
ているなら
今の一位の点数
max = test[i] ;
一位を塗り替える
今の一位の学生
番号
d=i; }
printf (“%d番 %d点で最高”, d+1 , max);
暫定一位を設定し、
ひとりひとり
順番に見ていって
現在の一位と比較してそ
れを超えていれば暫定一
位を入れ替える。
全員分繰り返すと、最高
点が残っている仕組み。
なぜ「 d + 1 」なの?
配列は0番から。
でも人間は1番2番と
1から数えるから
27
C言語Ⅰ・まとめ
N科manabu
■ 【発展】 二次元配列
配列は二次元にできる。宣言は
int n[7][7] ;
n[0][0]
n[1][0]
n[2][0]
n[3][0]
n[4][0]
n[5][0]
n[6][0]
n[0][1]
n[1][1]
n[2][1]
n[3][1]
n[4][1]
n[5][1]
n[6][1]
n[0][2]
n[1][2]
n[2][2]
n[3][2]
n[4][2]
n[5][2]
n[6][2]
n[0][3]
n[1][3]
n[2][3]
n[3][3]
n[4][3]
n[5][3]
n[6][3]
n[0][4]
n[1][4]
n[2][4]
n[3][4]
n[4][4]
n[5][4]
n[6][4]
n[0][5]
n[1][5]
n[2][5]
n[3][5]
n[4][5]
n[5][5]
n[6][5]
n[0][6]
n[1][6]
n[2][6]
n[3][6]
n[4][6]
n[5][6]
n[6][6]
int kuku[10][10];
for ( i=0 ; i<10 ; i++ ){
for ( j=0 ; j<10; j++ ) {
kuku [i] [j] = i*j ;
}
}
コインロッカーのように
「何段目何列目」と指定できる
九九を計算して
二次元配列に入れる例
28
C言語Ⅰ・まとめ
N科manabu
■ 関数
何か投げつけると結果を返す機能群
自動販売機はお金を入れると
ジュースという結果を返す
関数だ
input : 120円
output : ジュース
入れた値を2倍の値にして返
す関数
入力値設定:
返す値の形と名前
(整数を返す関数 f )
自販機でいえばお金
の投入口
input : int x
(たとえば x=10)
output :
2*x の値
(x=10なら20を返す)
int f( int x ) {
return 2*x;
}
返す値
29
C言語Ⅰ・まとめ
■ 関数の例
N科manabu
ポイント
・ void は 「何も返さない」
・ 関数は main の前に書く
int f ( int x ) {
return 2*x;
}
int main( void ) {
int a;
a = f( 3 );
return 0;
}
整数(int)の値を返す関数 f は入力値として整
数を取り(xに入れる)、その2倍を返却する
3 を入力値として関
数を呼び、結果とし
て 6 が返ってくるが、
それを a に入れる。
(後にもかけるがその場合は宣言が必要)
void kaku( int x ) {
printf(“%d”,x);
}
int main( void ) {
int a=3;
kaku( a );
return 0;
}
何も返さない(void) 関数 kaku は入力値として
整数を取り(xに入れる)、それを画面に表示
するだけの機能をもつ
変数aの中身 を入力
値として関数を呼び
(つまり 3 が入力値)、
結果は返ってこない
が関数の中で表示を
実施してくれる。
30
C言語Ⅰ・まとめ
■ 関数プログラミング
例. 累乗する関数
整数(int)な結果を返す
「power」という名前の関数で、
入力は整数x,nの二つ
int power ( int x , int n)
{
・ 関数内で利用する変数は関数内で宣言すること!
int i;
・ 結果値を ret として、初期値を 1 とする
(初期値0だとxをかけても0になるのでダメ)
int ret=1;
for ( i=0 ; i<n ; i++) { x の累乗( n 乗)は、n 回繰り
ret=ret*x;
返し x をかけること。
}
累乗してできた結果値 ret を
return (ret);
返り値として返す
}
メインプログラムは関数の後
int main(void)
{
int n,m,kekka;
printf(“整数:”); scanf(“%d”,&n);
printf(“累乗:”); scanf(“%d”,&m);
kekka = power(n,m);
入力をn と m にして power
という関数を呼んだ返り値を
kekkaという変数に入れる
printf(“%dの%d乗は%d” , n , m , kekka);
return(0);
}
N科manabu
なぜ関数を呼ぶときの変数 power(n,m)と関数
宣言にある int power(int x, int n) とで使う変数
名(nとxとか)が異なるの?
⇒宣言にある変数名は「仮の箱」。だから関数を使う際
の変数とは別でも同じでもよい。ここでは「変数nの中
身を関数の仮の箱 x の中に投げ込んで利用」という形。
関数の中でわざわざまた変数宣言が必要
なの?
⇒必要です。例ではmain関数とpower関数のそれぞれ
が「自分のプログラム世界」をもっているので、その中
で使う変数は自分の中で宣言する必要があります
いつでも関数はmain関
数の前に置かないとい
けないの?
⇒後ろにも置けるが、その
場合、「こんな関数を使う」
というプロトタイプ宣言だけ
main関数の前におく必要が
あります。
例. 累乗する関数(関数後ろ置き版)
int power ( int x , int n);
int main(void)
プロトタイプ宣言
{ int n,m,kekka;
(後ろにこんな関数を置くよ宣言)
printf(“整数:”); scanf(“%d”,&n);
printf(“累乗:”); scanf(“%d”,&m);
kekka = power(n,m);
printf(“%dの%d乗は%d” , n , m , kekka);
return(0); }
int power ( int x , int n)
{ int i;
関数後ろに置
int ret=1;
ける
for ( i=0 ; i<n ; i++) {
ret=ret*x;}
return (ret);}
31
C言語Ⅰ・まとめ
N科manabu
その他テクニック集①
sum = sum + i ; は、 sum += i ; とも書ける。
その他テクニック集②
変数に固定値を与えるには
以降のプログラムで
は NUMBER という
変数はすべて 4
が入ることになる
#include・・・
等の次に
#define NUMBER 4
int main(void){
セミコロン「;」不要
・・・・
mainの前に書くこと
とする。
に注意。
例えば
for (i=0; i<NUMBER ; i++){・・
は
for (i=0; i<4 ; i++){・・
と解釈されることになる。
32
C言語Ⅰ・まとめ
N科manabu
その他テクニック集③
変数の値の交換の仕方
a
b
c
30
40
a
b
c
30
40
30
a
b
c
40
40
30
a
b
c
40
30
30
int a=30,b=40,c;
//aとbの値を交換
c=a;
a=b;
b=c;
一度「避難用」の
変数cにaの値を
避難させて交換
するのがポイント
33