/* 計算と繰り返し命令、数値入力 1-3.c */
#include <stdio.h> /* 初めに必ずこの文を書く */
main()
{
int i,sum;
int a,b;
/* 今回は、少し計算をしてみる。その計算に使う変数を宣言。文末に ;を付けるのを忘れない事 */
printf("1から10までの総和を求める\n\n"); //一行あけるために\nを余分に書いている
sum=0; /* 総和を求めるのにsumを使うので初期化しておく。;を付けるのを忘れない事 */
/* 総和を求めるには、次の様に一つ一つ足して行く計算をすれば良い。
1+2+3+ ... +10 これを求めるには 1に2を足し、その後に3を足し…と
それまでの和に、増えていく数を順繰りに足していけば良い。繰り返しを行う命令を使えば
次の様に書ける。*/
for (i=1;i<=10;i=i+1) sum=sum+i; // ;を付ける事
/* これはfor loop である。ここでは、変数iの値が 1から始まった後 1ずつ増えて10まで行くが、
増える度にそれをsumという変数に繰り返し足しているので、1から10までの総和が求まる。
for loop は、 for () と書き、( )の中に、繰り返し条件を記述する。条件が成り立つと
( ) の後に書かれた文一つを実行して、再び条件判定に入る。再度条件が成り立つと( ) の後に
書かれた文一つを実行して、三度び条件判定…と繰り返す。( )中には;で区切られた3つの式を書く。
上の例では、先ず1から始めるので初期条件をi=1;と書いて、その次にloopを回る条件式を書く。
10になるまでだから、iが10以下の時という意味でi<=10;と書く。一番右でiを 1ずつ増やしている。
i+1の計算結果をiに代入するので、iが 1ずつ増える事が分かる(sumに付いても
今までのsumの値にiの値を加えて、その新しい値を再びsumに代入している。つまり、
そこまでの和を求めた事になる)。
for loop では( ; ; )の真ん中がloopを回る条件である。左が初期値、右が変数 iの変化の仕方。
loop 中に使う変数は何でも良いが、通常は iや jが良く使われる。また、変数iの変化の仕方も
色々あって良い。一つずつ減るとか、等比的に増減する等々。
結果を見るため、変数sumを表示する。
*/
printf("for loopで求めた総和=%d\n",sum); // ;を付けるのを忘れない事
sum=0; // もう一度sumを使うので初期化しておく
/* 同じfor loop を別の書き方で書いて、結果表示。*/
for (i=1;i<=10;i++) sum+=i; // ;を忘れない事
printf("一寸書き方を変えて求めた総和=%d\n",sum);
/* i=i+1、i=i-1の様に1ずつ増減する時は、i++ やi-- の様な書き方が良く用いられる。
また、ある変数にある値を加減した値を、再び同じ変数に代入する場合は上の様に += や -= が
使われる事が多い。*/
printf("\n"); // 改行して一行あける
/* 総和は、for loop を使わなくても求まる。ガウス法を用いれば、aからbまでの総和は
(a+b)*(b-a+1)/2 の様に書けるので、これを計算してsumに代入し、表示すると
*/
sum=(1+10)*(10-1+1)/2; // 文末には;が必要。代入式も文なので終わりに;を付ける。
printf("ガウス法で求めた総和=%d\n",sum);
/* printf();で表示させる値の所に式を直接書いても良い。そこで、sumを使わず次の様に書く事も出来る */
printf("(1+10)*(10-1+1)/2=%d\n",(1+10)*(10-1+1)/2);
/* 今度は、任意の2つの整数値 aからbまでの総和を求めて見る。 */
printf("\n任意の2つの整数値 aからbまでの総和を、1)for loop と2)ガウス法で求める。\n");
/* 任意の 2つの整数値というからには、a b 2数値の入力を求めなければならない。
それには、scanfという命令を使う。数値入力を求める文を表示した後で、数を入力させると
次の様になる。 */
printf("数を入力 a=");
scanf("%d",&a);
printf("数を入力 b=");
scanf("%d",&b);
/* scanfは、scanf();の形で使う。formatして(形を整えて)、scan(取り込む、走査する)の意。
scanf命令を使うとKey Boardからの入力待ちになるので、任意の数値を入力して Enter Keyを押す。
画面には入力した数が表示される。scanfは、この入力値を整数(%d)か実数(%f)か指定して取り込む。
つまり、scanf();は、printf(); と反対の命令である。 ただし、printfの書式の場合と異なり、
入力format" "の中に書いた%dの後ろに、空白を作ってはいけない。
また、読み込むべき変数名の前に &が必要である。←つい忘れ勝ちなので、気を付ける。
&の付いた変数名は、その変数にcomputerが割り振ったaddress(どこかは知らぬが)を示して
いる。scanfは、指定された場所addressに入力値を納める命令である。
入力された a から b までの総和を計算すると
*/
printf("\n"); // 改行して一行あける
sum=0; // sumを使うので初期化しておく
for (i=a;i<=b;i++) sum+=i; // aから bまでloopを回して、その値をsumに加えている
printf("%dから%dまでの",a,b); // この様に一つの書式で複数の値を表示できる
printf("総和=%d\n",sum);
/* ガウス法で直接計算した事を明示し、値の所に式をそのまま書くと */
printf("(a+b)*(b-a+1)/2=%d\n",(a+b)*(b-a+1)/2);
/* 上記書式の a b の所に、実際の値を入れて表示すると */
printf("(%d+%d)*(%d-%d+1)/2=%d\n",a,b,b,a,(a+b)*(b-a+1)/2);
printf("\nEnd\n"); // これで終わり
return 0;
}
/* ある計算を programとして書くには、計算のアルゴリズム(=流れ)を十分理解して置かねば
ならない(どういう事をしているか、一つ一つ順番に整理する)。その上で、加減乗除をしたり、
使える関数や命令を選んだりする。 */