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
© Copyright 2024 Paperzz