ここでまず for ループについて学ぶ.
1から10までの数値の和を計算することを考える. もちろんこれは,
sum=1+2+3+4+5+6+7+8+9+10;と計算できる. ちょっと気の利いた人なら,
sum=11*10/2;
として計算することもできるかもしれない. しかし,1から10までの数値の2乗和を求めるにはどうしたらよいのだろうか? さらに,もしこれが1から100までの2乗和ならどうすれば良いのだろうか? また,1からいくつまでの2乗和を計算するのか,入力してから計算させるにはどうすればよいのだろうか?
ここででてくるのが,繰り返し処理である.
繰り返し処理に良く用いるのが,for 文である. for を使って100回処理を行いたい場合,以下のようにする.
for(i=0; i<100; i++){ 繰り返し処理の中身 } |
for(i=1; i<=100; i++){ 繰り返し処理の中身 } |
どちらも,繰り返し処理の中身と書かれたブロックを100回処理する.
for(初期設定; 条件; 再設定)
forループは,まず初期設定を行う. その後条件を比較して正しければすぐ次のブロックを処理する. ブロックの処理が終わると再設定を行い,以降条件の比較,再設定を条件が 正しい間繰り返す.
例えば
sum=0; for(i=1; i<=3; i++){ sum=sum+i; } |
は,以下のように動作する.
sum=0 i=1 iに1を代入 if( i<=3 ) i<=3が正しいかどうか比較.iは1なので正しい. よって次のブロックを処理 sum=sum+i sum(値は0)にi(値は1)を足したものをsumに代入 (値は1となる) i++ iに1を足す.iは2となる. if( i<=3 ) i<=3が正しいかどうか比較.iは2なので正しい. よって次のブロックを処理 sum=sum+i sum(値は1)にi(値は2)を足したものをsumに代入 (値は3となる) i++ iに1を足す.iは3となる. if( i<=3 ) i<=3が正しいかどうか比較.iは3なので正しい. よって次のブロックを処理 sum=sum+i sum(値は3)にi(値は3)を足したものをsumに代入 (値は6となる) i++ iに1を足す.iは4となる. if( i<=3 ) i<=3が正しいかどうか比較.iは4なので誤り. よってfor ループから抜ける.example31.c
前回も示したが,条件式には a==b aとbは等しい a!=b aとbは等しくない a<b aはbより小さい a>b aはbより大きい a<=b aはb以下である a>=b aはb以上である
等を用いることができる(これらを論理演算子と呼び、論理演算子を用いて 表されている式を論理式という).
なお,論理式は&&(andかつ),||(orまたは)で結合できる .
a+=b a=a+b の略 a-=b a=a-b の略 a/=b a=a/b の略 a*=b a=a*b の略 a++ a=a+1 の略 a-- a=a-1 の略
%[数字]d 整数型の数字を右詰で[数字]桁表示する %[数字1].[数字2]f 実数型の数字を右詰で[数字1]桁,ただし,小数点以下 [数字2]桁表示する.
#include <stdio.h> int main(void) { int i; int sum; sum=0; for(i=1; i<=10; i++){ sum+=i; } printf("1から10までの和は%dです\n",sum); return 0; } |
実は,このプログラムのfor文の "{" "}" は必要ない.
#include <stdio.h> int main(void) { int i; int sum; sum=0; for(i=1; i<=10; i++) sum+=i; printf("1から10までの和は%dです\n",sum); return 0; } |
としても,同じ答えを返す. では,次のプログラムはどうだろうか?
#include <stdio.h> int main(void) { int i; int sum,pow; sum=0; pow=0; for(i=1; i<=10; i++) sum+=i; pow+=i*i; printf("1から10までの和は%dです.2乗和は%dです\n",sum,pow); return 0; } |
1から10までの2乗和は385だが,これを実行すると121と表示される.
for文では,その後の1文のみが繰り返し実行されます.
したがって,上記のプログラムは
#include <stdio.h> int main(void) { int i; int sum,pow; sum=0; pow=0; for(i=1; i<=10; i++){ sum+=i; } pow+=i*i; printf("1から10までの和は%dです.2乗和は%dです\n",sum,pow); return 0; } |
と解釈される. 複数の文を実行するためには"{" "}"を使って一塊にする必要がある.
#include <stdio.h> int main(void) { int i; int sum,pow; sum=0; pow=0; for(i=1; i<=10; i++){ sum+=i; pow+=i*i; } printf("1から10までの和は%dです.2乗和は%dです\n",sum,pow); return 0; } |
これらのプログラムの違いをよく理解すること
forループの例
forをいくつか入れ子に使って,多重ループを作ることができる.
この時,変数も多重ループの数だけ必要になる.
■階乗の計算: example3_2.c
■16進数⇔10進数の変換表の作成: example3_3.c
コンピュータは2進数で数値を表している. たとえば,10進数の5は2進数では101である.
位 23=8 22=4 21=2 20=1 0 1 0 1 ------------------------------------------------ 0*8 + 1*4 + 0*2 + 1*1=5
そのままでは,桁数が大きくなりすぎるので 数値を表すときは16進数で表すことが多い (4桁(4ビット)ずつに分けて考える).
10進数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16進数 0 1 2 3 4 5 6 7 8 9 A B C D E F
テキストでは16進数で表すとき数値の後にh
(hexadecumal 16進数)を付けている.
C言語では,数値の前に”0x”を付ける
0x23 == 35 (23h)