C 言語プログラミング 式の計算と変数 配列の概念 50 人の生徒の点数の平均点, 最高点 最低点を求めるプログラム ( センター入試 23 年度数学 2 情報関係基礎 第 3 問 ) (01) sowa 0, saiko 0, saitei 100 代入文 : 変数に値を代入 ( 格納 ) する (02) 配列 TNin のすべての要素を 0 にするための文 (03) bango を 1 から 50 まで 1 ずつ増やしながら, (04) s Tensu [bango] (05) sowa ア + イ (06) もし s > ウ ならば (07) エ s (08) を実行する (09) もし s < オ ならば (10) カ s (11) を実行する 条件判定文 繰返し文 (12) TNin [ キ ] を 1 増やす (13) を繰り返す (14) heikin sowa / 50 sowa 50 の値を heikin に代入する (15) heikin と saiko と saitei を表示する 1
/* 計算プログラム /* と で囲まれた文字列は注釈 ( コメント ) 注釈はプログラムの実行には関係しない puts(" 上底 4, 下底 8, 高さ6の台形の面積を求めます ") ; printf(" 面積は %d です n", (4+8)*6/2) ; プログラムの先頭に必ず書くオマジナイ プログラムの本体 (body) は中括弧 ではじめ, 中括弧 で終える プログラムを終了させる部分には と書く C プログラムは文の列からなる 文末は ; ( セミコロン ) をつける 文字列 / 数値を表示する puts (put string) 関数 表示したい文字列を " ( 二重引用符 ) で囲む 表示後, 自動的に改行される printf (print with format) 関数 表示したい文字列を " ( 二重引用符 ) で囲む 改行するには n と書く 文字列のほかに, 式の値 も表示できる printf(" 面積は %d です n", (4+8)*6/2 ) ; 面積は と表示して, 以降に指定される式の値を 10 進で表示し, 最後に 改行 する ( n) %d の部分が式の値に置き換わって画面に表示される (%d は 10 進 (decimal) で値を表示することを意味する ) cf. printf( 面積は (4+8)*6/2 です n ); と書いてしまうと, 面積は (4+8)*6/2 です と表示されます 2
例 printf("bye!") printf("%d",10) printf(" 答 %d",10) printf 関数の用例表示 Bye! 10 答 10 説明 文字列を表示を表示文字列とを表示 printf("%d と %d", 10, -20) printf("%d n%d", 1, 2) printf ("%d %d n", 4+5, 4*5) 10 と -20 1 2 9 20 と文字を表示 途中で改行して表示 式の値を表示 演算子加算 + 減算 乗算 * 除算 / 剰余 % 同士の除算結果は小数点以下切捨て又は四捨五入 同士の場合のみ演算可 演算の優先順位 加算, 減算 < 乗算, 除算, 剰余 算数で習う順序と同じ ( 同じ優先順位の場合は左から順に計算される ) 小括弧付きの式があれば, 小括弧内の演算が優先される ( 小括弧のみ使用可 中括弧, 大括弧は使用不可 ) a b u v (a+b) (c+d) (u+v) (x+y) a*b / u*v は間違い, a*b / u / v と表記するあるいは a*b / (u*v) と表記する (a + b)*(c + d) / ((u +v)*(x + y)) あるいは (a + b)*(c + d) / (u +v) / (x + y) 3
/* 計算プログラム puts(" 上底 4, 下底 8, 高さ6の台形の面積を求めます ") ; printf(" 面積は %d です n", (4+8)*6/2) ; このプログラムでは, 上底 4, 下底 8, 高さ6の台形の面積しか計算できない 上底, 下底, 高さの値をキーボードから入力できるようにするには 変数 の利用 変数 の概念 変数 : 値を保存 ( 格納 ) する場所 変数 を使うには, 変数の宣言 が必要 int a, b, h ; int : integer( ) の意味 キーボードからの数値の入力 scanf("%d", &a); キーボードから 10 進を読み込んで, その値を変数 a に格納する int a,b,h; puts(" 台形の面積を求めます "); printf(" 上底は "); scanf("%d",&a) ; printf(" 下底は "); scanf("%d",&b) ; printf(" 高さは "); scanf("%d",&h) ; 変数宣言 キーボードから数値を読み込むには scanf 関数を使う scanf 関数では変数の前に & を付けることに注意! 1 行に複数の文を書いてもよい ( 意味にまとまりがあれば,1 行で書いたほうがよい ) 4
変数 の宣言 int a, b, h ; 変数の値の保存場所がメモリ内に確保される scanf の働き scanf("%d", &a) ; scanf("%d", &b) ; scanf("%d", &h) ; 1 2 3 キーボードから, 最初に 4 と入力すると, 1 a の場所に 4 が格納される 次に 8 と入力すると, 2 b の場所に 8 が格納される 次に 6 と入力すると, a b h a b h a b h : 不定値 注意 : scanf 関数では, 変数名の前に必ず & を付ける 4 4 8 場所を確保しただけでは, どんな値になっているかわからない /* 変数を使った計算プログラム int a, b, h ; puts(" 台形の面積を求めます ") ; printf(" 上底は "); scanf("%d",&a) ; printf(" 下底は "); scanf("%d",&b) ; printf( 高さは "); scanf("%d",&h) ; printf(" 面積は %d です n", (a+b)*h/2) ; 変数宣言 キーボードから数値を読み込むには scanf 関数を使う scanf 関数では変数の前に & を付けることに注意! 5
変数の値を使った計算 printf(" 面積は %d です n", (a+b)*h/2) ; a b h 4 8 6 式 (a + b)*h/2 はそれぞれの変数 (a,b,h) の値を使って計算される /* 変数を使った計算プログラム int a, b, h ; puts(" 台形の面積を求めます ") ; printf(" 上底は "); scanf("%d", &a ) ; printf(" 下底は "); scanf("%d", &b ) ; printf( 高さは "); scanf("%d", &h ) ; printf( 面積は %d です n, ( a+b)*h/2) ; 6
配列 (array) 変数 : 配列 : 一つの変数には一つの値を保持する 一つの配列に複数の値を保持することができる 例 :A という名前の 5 個の要素をもつ型の配列 C 言語での型配列の宣言 int A[5] ; A[0] A[1] A [2] A [3] A [4] 配列名添え字 (subscript) 第 0 要素 第 1 要素 第 2 要素 第 3 要素 第 4 要素 配列の添え字は 0 から始まる /* 配列を使った計算プログラム int A[3] ; puts(" 台形の面積を求めます ") ; printf( 上底は ); scanf( %d, &A[0]) ; printf( 下底は ); scanf( %d, &A[1]) ; printf( 高さは ); scanf( %d, &A[2]) ; printf( 面積は %d です n, (A[0]+A[1])*A[2] /2); 配列の宣言 キーボードから数値を読み込むには scanf 関数を使う scanf 関数では変数の前に & を付けることに注意! 7
課題 (1-1) 平成元号年を入力して, 西暦年を表示するプログラムを作成し, 正しく動作することを確認せよ 例えば,23 と入力したら, 平成 23 年は西暦 2011 年です と表示させる ( 平成 23 年は という部分も表示させることに注意 ) ( ヒント : 平成の元号年を a とすると, 西暦年は 1988+a ) (1-2) 鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽, 亀が何匹いるかを表示するプログラムを作成し, 正しく動作することを確認せよ ( ヒント : 頭の数と足の数を変数として, 鶴の数と亀の数について連立方程式を作り, 解を与える式の値を表示させればよい ) 考察事項 頭の数の合計を 9, 足の数の合計を 28 としたとき, どのような結果が得られるか その結果は正しいか また, 頭の数の合計を 5, 足の数の合計を 28 とした場合にはどのような結果が得られるか その結果は正しいか, 正しくないとするとなぜ正しくないか, 考察せよ (1-3) キーボードから入力される 5 個のを配列に格納し, 総和と平均を表示するプログラムを作成し, 正しく動作することを確認せよ 課題 作成したプログラム ( ソースプログラム ) とその実行結果をメールで送る メール本文中には, 必ずプログラムが正しくできていることの根拠を示すこと ( 例えば, のテストデータを与えてプログラムを実行させたら, の結果が得られた したがってプログラムは正しいことが確認できた といったような形式で報告すること (1-2) については, 考察事項 の内容について報告すればよい ) 今日の授業についての自分の理解の程度, 難しかった点, 感想 / コメントなどがあれば書いてください 上記により作成したメールを,b091147c@r.hit-u.ac.jp 宛に送る メールの 件名 欄は [11/28 課題 時限 ]( は自分の授業時限) とする メールの文末に自分の 署名 を付けること (11/7 授業課題 (2)) 8
課題 (1-2) 補足 頭の数を a, 足の数を b として, 鶴の数を x, 亀の数を y とすると 次の連立方程式が成り立つ x + y = a 1 2x + 4y = b 2 1,2を x と y について解くと, x = aとbからなる式 y = 1 と 2 の式をプログラム中に書いて,x と y の値を表示させる というのはダメ ( コンピュータはそれほど賢くない ) scanf( %d, &a); scanf( %d,&b); x + y = a ; これではダメ! 2*x + 4*y =b ; printf( 鶴は %d 羽, 亀は %d 匹, x,y); と の式の値を表示すればよい プログラムが正しくできたことの確認 ( プログラムの検証 ) テストデータを入力して合理的な結果が得られるかを確認する 正しいプログラムであることを確認することも, プログラミング活動の一部 プログラムは人間が作るもの 人間は間違いを犯す 間違った考えで作られたプログラムは間違った結果をもたらす = 間違ったプログラムは何の役にもたたない! コンパイラは, 文法的なエラーは見つけてくれるが, 人間の考えの誤りによるプログラムの間違いまでは見つけてくれない ( コンピュータは人間がプログラムしたことを忠実に実行する機械なのです ) 9