240 likes | 378 Views
プログラミング入門 第2回講義. 変数 (3) 1+2=3 のプログラム (7) printf 復習 (9) scanf(11) 演算とその順序 (17). マークのあるサンプルプログラムは /home/course/prog0/public_html/2013/lec/source/ 下に置いてありますから、各自自分のディレクトリに コピーして、コンパイル・実行してみてください. 1+2 を計算するプログラム(復習) . 1+2と言う式の値 (つまり3)が計算され、%dの部分に表示される. #include <stdio.h> main( ){
E N D
プログラミング入門第2回講義 • 変数(3) • 1+2=3のプログラム(7) • printf復習(9) • scanf(11) • 演算とその順序(17) マークのあるサンプルプログラムは /home/course/prog0/public_html/2013/lec/source/ 下に置いてありますから、各自自分のディレクトリに コピーして、コンパイル・実行してみてください
1+2を計算するプログラム(復習) 1+2と言う式の値(つまり3)が計算され、%dの部分に表示される #include <stdio.h> main( ){ printf("1+2=%d\n",1+2); } しかし、これでは定数の計算しか出来ず、あまり実用的ではない std1dc1{s1000000}1: gcclec01-3.c std1dc1{s1000000}2: ./a.out 1+2=3 std1dc1{s1000000}3: 実行結果 実行 変数の使用 /home/course/prog0/public_html/2013/lec/source/lec01-3.c
変数とは(p.40) • 変数とは、メモリーに値を蓄えておく、名前つきの箱 • 変数の内容は、何回でも書き換え可能 • 変数に書き込む事を 「代入」 と呼ぶ • 変数を使用して計算する事で、(定数ではなく)様々な数に対して計算をする事が出来る。 1 2
変数名の規則(1)(p.62) • 変数の最初の文字は、半角英字( A~Z, a~z )、アンダースコア(下線:_ )でなければいけない • a123, _abc, _200⇒ OK • 7abc⇒ NG • 2番目以降の文字は, 半角英字、アンダースコア、半角数字( 0~9 ) でなければいけない • 下線以外の記号と空白は使用出来ない • in-data, a.123, outdata ⇒ NG
変数名の規則(2) • 大文字と小文字 は区別される • 変数名は31文字まで(32文字以降は無視される) • 予約語 (特別な意味を持つ単語)は使えない • int, while, for などが予約語 • printf, scanf などは予約語ではないが、実質的には使用できない。 • 意味の分かりやすい名前を付ける • result,sum,total,averageなど • これは「規則」ではないが、習慣にしよう! 3 4
変数宣言(p.40) • 変数は 宣言 しなければ使えない 「int i,j,result;」 は、iとjとresultの3つのint型変数をまとめて用意する宣言(一つづつ宣言する事も可) • 宣言はまとめてプログラムの 最初 に行う • プログラムの途中で宣言するとエラーになる! • 宣言直後の変数の値は不定(何が入っているかわからない) • ⇒代入文を用いた 初期化 が必要 5 6 7
1+2=3を表示するプログラム言葉によるプログラム1+2=3を表示するプログラム言葉によるプログラム 「言葉によるプログラム」を作ってみよう • 変数「i」,「j」,「result」 を用意する • 計算する2つの数をそれぞれ変数「i」,「j」 に代入する • 変数「i」と変数「j」の和を計算し、結果を変数 「result」 に代入する • 変数「result」 の値を表示する
1 + 2 = 3 を出力するプログラム プログラムは全て半角英数字、記号で書く。 表示などに一部日本語も使用出来る。 #include <stdio.h> main() { int i,j,result = 0; i = 1; j = 2; result = i + j; printf("%d\n",result); } 宣言時に変数を初期化する事も出来る 1:変数用意 代入文: 右辺の値を左辺の変数に代入 数学の等号(=)とは意味が異なる 2:変数に値代入 いったん値を代入してから使用する 3:計算 4:結果の表示 /home/course/prog0/public_html/2013/lec/source/lec02-1.c
printf(p.43) (第1回の復習) printf( "%d\n",result ); 値を出力する変数名。 18のような定数や、a+bのような式でも良い 書式並び %d:整数型変数の値を10進数で出力する \n:改行 このハンドアウトの逆スラッシュ(\)記号は良く見ると他の記号と異なり、全角になっている。これは日本語のシステムでは半角のバックスラッシュ記号が通貨記号(\)になってしまうためである。見やすく表示するためにこのハンドアウトではこのようにしている。実際にプログラムを作成する時には半角の逆スラッシュを使用する。
もう少し複雑な書式付出力(p.44) printf("%d+%d=%d\n",i,j,result); ⇒ %dの部分が整数型変数の値に置き換わり、「1+2=3」と出力される (「+」や「=」など%d以外の部分はそのまま出力される) 前から順に値を表示
scanf(p.48) • scanfを使うとキーボードから入力することができる • 大雑把に言うと、scanfは丁度printfの反対のような動作をする。 printf scanf
scanfの使用方法 • scanfの基本形は以下の通りである。 • このscanf文は「10進整数を一つ読み込んで、int型変数iに代入する 」事を示している。 scanf("%d",&i); 変数iにデータが入力される 「&」は今はおまじない 10進数の入力 8
scanfの使用例 • 例えば、年齢を入力するプログラム(の一部)は以下のようになる • これによって変数ageにはキーボードから入力された数値(この場合年齢)が代入される。 int age; printf("How old are you ?\n"); scanf("%d",&age); /home/course/prog0/public_html/2013/lec/source/lec02-2.c
複数データの入力(p.105) • 一度に複数データを入力する場合は以下のようにする。 • printfと同様に、3つ並んだ「%d」は順に変数i,j,kに対応 • 「%d %d %d」のように空白をあけても構わない。 • データは10 12 32のように1つ以上の空白をあけて入力する。あるいは以下のように改行で区切っても良い。10 12 32 scanf("%d%d%d",&i,&j,&k);
scanfの間違いやすい点 • 「""」内には%d等の書式指定および空白以外は書かない。特に改行(\n)を書くと、 トラブル(バグ) の元になる。 • 入力する変数には必ず「&」をつける。この意味は後期Programming C で習う。それまでは「おまじない」だと思っていて差し支えない。(興味のある人は自習してみると良い) 9 scanf("%d\n",&i); scanf("%d",i);
コラム:ムーアの法則 • コンピュータのトランジスタ数は18~24ヶ月で倍になると言う経験則をムーアの法則と言う。 • CPUの性能やメモリ容量はだいたいトランジスタ数に比例していると言って良い。 • ムーア氏はインテルの設立者の一人で、現在は同社の名誉会長である。 • トランジスタサイズには物理的限界があり、早晩この法則は成り立たなくなると見られているが、頻繁な技術革新(パラダイムシフト)により当分は成り立つのではないかと考える人も多い。 • 同時にコンピュータ自体のデザインも、より少ないコスト(トランジスタ数)で高い性能が出るよう工夫され始めた。CPU自体ではインテルのハイパースレッディング、システムとしてはPCクラスタなどが挙げられる。 (Wikipediaより転載)
数や変数を演算子で結びつける 演算とは: 被演算子に対して演算子で定められた 操作を行い、式の値とすることである。 左は、1+2を計算した3が式の値となる。 演算と演算子 1+2 演算子 被演算子 代入演算子 • 「=」も演算子(代入演算子)である • 右辺の値を左辺の変数に代入し、式の値自体を代入する値にする(a = 5の式の値は5) • a = b = 1 • ①変数bに1を代入し、式「b=1」の値を1とする • ②変数aに①で決まった式の値1を代入する ① ②
(整数型の)四則演算(p.43,89) • + :加算 • - :減算 • * :乗算(「x」ではないので注意!) • / :除算(小数点以下切り捨て) • % :剰余算a%b ⇒ aをbで割った余り 10
剰余算の注意(p.90) • 整数型同士 の演算でなければならない3.5 % 2⇒ エラーになる • 剰余演算子を用いなくても余りは計算できる(整数型の場合)a % b ⇒ a - ((a / b) * b) 上の式の意味を考えてみよう 11
a=a+1という演算を考えてみよう • 数学の表現ではa = a + 1はおかしい→移項すると0と1が等しくなる?? • Cでは「=」の記号は「代入」を表す。つまり、a = a + 1の演算の意味は、「変数aの値に1を加え、それをaに代入する」 12 代入の時に注意する点 • 代入とは 左辺 の値を 右辺 の値に書き換えること • つまり以下の二つの式は意味が異なる • a = 10 (変数aに数10を代入する:OK!) • 10 = a (数10に変数aの値を代入する:エラー) • a+b=20もエラー! (代入すべき変数が分らない) 13 14
演算の順序(p.94) • 括弧つきの場合、演算子の優先度よりも優先される • 2*(3+4) ⇒ 3+4が先に実行される • 優先度の高い演算から実行される(巻末に一覧) • 優先度(上から優先度の高い順) • (、)括弧 • 乗算*、除算/、剰余算% • 加算+、減算- • 代入= • 例 1*2+3*4 ⇒ (1*2)+(3*4) • 同じ優先度なら、 • 計算は 左 から順に実行される 1+2+3 ⇒ (1+2)+3 • 代入は 右 から順に実行される a = b = 1 ⇒ a = (b = 1) 15 16
演算の順序の例(p.94) a=b= 2*3+4*5/2-1 演算の順序 7 6 1 4 2 3 5
プログラム例(平均を求める) #include <stdio.h> main() { int i,j,k,average; printf("3人分の体重(整数kg)を空白で分けて入力してください : "); scanf( "%d%d%d" ,&i,&j,&k); average = (i + j + k)/3; printf("3人の体重はそれぞれ %dkg %dkg %dkgで、\n",i,j,k); printf("その平均は %dkg となりました\n",average); } 17 演算順序 std1dc1{s1000000}1: ./a.out 3人分の体重(整数kg)を空白で分けて入力してください :57 72 49 3人の体重はそれぞれ 57kg 72kg 49kgで、 その平均は 59kg となりました std1dc1{s1000000}2: 整数演算のため切捨て /home/course/prog0/public_html/2013/lec/source/lec02-3.c
コラム:自宅でCプログラミング • 大部分の人は家にもPCを持っているのではないかと思う。そのPCを使用してプログラミングしたい(休日とか深夜など)場合が出てくるかもしれない。 • そこで自宅からのプログラミングに関してまとめておく • 大学環境をそのまま使う場合 • SSHを使用し、大学のコンピュータに接続し自分のアカウントにログインして利用する。 • SSHの利用方法は以下のISTCのページに説明されている。 http://web-int.u-aizu.ac.jp/labs/istc/ipc/topic/sshgate/sshgate.html • この場合は自分のアカウントにあるプログラムを直接編集・実行出来る。 • 自分のPCでコンパイル・実行する場合 • Windowsの場合は検索すると色々出てくる。例えば http://www.ooyashima.net/db/prog.htm などにリストアップされているので試してみるとよいだろう。 • http://cvwww.ee.ous.ac.jp/vc10prog.html ではVisual C++ 2010 Expressを利用してCプログラムを作成する方法を説明している。インストール、設定ともに非常に簡単である。 • この場合は何らかの方法(ftpなど)で自分の大学アカウントとファイルのやりとりをする必要がある。またこの際、漢字コードの違いなどで文字化けする事もあるので、コメントを日本語で書く事はやめたほうが無難である。