back 1999/10/15

C言語 - 代入文と演算

この Web page の利用方法は,
ここ...最低限のプログラム実行例... (Windows 版 Visual C++ を利用している人)
で確認しよう!!
もくじ

1.0 変数と整数演算と代入文
1.1 整数演算を使ったちょっと実用的(風な)プログラムの例
1.2 マニアな整数演算
1.3 整数の表わす数値の限界
1.4 実数演算
1.5 実数の表わす数値の限界
1.6 整数演算と実数計算の混合

この Web Page を作るに際し,下記の文献を参考にしました。
サイエンス社 NSライブラリ(4) ザ・C [第2版] -ANSI C 準拠- 戸川隼人 1997年



1.0 変数と整数演算と代入文

V-C

#include <stdio.h> main() { int a,b,c,d,e,i,j,k; /* ATaINo SeTTeI */ printf("i = ? "); scanf("%d", &i); printf("j = ? "); scanf("%d", &j); k=1; a=i+j; b=i-j; c=i*j; d=i/j; e=i%j; printf("+-*/% = %d %d %d %d %d \n", a,b,c,d,e); i=i+k; j=j+i*(4+k); printf("i,j= %d %d \n", i,j); }
用語の確認
  1. 注釈
  2. 変数
  3. 変数名
  4. 整数 ... 範囲の問題
  5. int a,b, ,,, という宣言 (他に short, long)
  6. 定数
  7. 代入文
  8. scanf --- 変数に & を付ける必要あり(このことは後で詳しく説明)
課題:
  1. 3個所出てくる変数名 c を,全部 aa に変えてみよう ... aa は,a*a ではなく,一つの変数。
  2. 3個所出てくる変数名 d を,両方とも if に変えてみよう ... if という名前は予約語のため,変数として使えません。 変数として使えるのは,どういうときなのか調べよう。
  3. 変数 i と j に元々設定する値を,10,3 や, -10,7 や 10,-3 や -10,-3 や 1000,500 などにしてみよう
  4. 変数 i と j に元々設定する値を,20 と 10 にすると共に,
    1000
    a × b
    5
    + i × j
    10
    という式を C 言語の文法に沿って書き直し,e= という式の右辺とせよ。


1.1 整数演算を使ったちょっと実用的(風な)プログラムの例

V-C

#include <stdio.h> main() { int a,n,y; printf("RiNGo 1 Ko No NeDaNHa ? "); scanf("%d", &a); printf("NaNKo KaIMaSuKa ? "); scanf("%d", &n); y=a*n; printf("GoUKeI = %d EN DeSu \n", y); }
課題:
  1. りんごの値段と個数として,120円を5個,200円を3個など,計算させてみよう


1.2 マニアな整数演算

V-C

#include <stdio.h> main() { int a,b,c,d,i,j; i=1; j=i+(i++)+i; printf("i,j= %d %d \n", i,j); i=1; j=i+(++i)+i; printf("i,j= %d %d \n", i,j); i=3; j=i+(i--)+i; printf("i,j= %d %d \n", i,j); i=3; j=i+(--i)+i; printf("i,j= %d %d \n", i,j); i=2; a=3; a+=i; b=4; b-=i; c=5; c*=i; d=6; d/=i; printf("abcd = %d %d %d %d \n", a,b,c,d); i=6; j=4; d=c=b=a=i+j; printf("abcd = %d %d %d %d \n", a,b,c,d); i=12; a=i>>2; b=i<<2; printf("ab = %d %d \n", a,b); i=6; j=3; a=i & j; b=i | j; c=i ^ j; d=~j; printf("abcd = %d %d %d %d \n", a,b,c,d); }
用語の確認
  1. インクリメント,デクリメント,前,後
  2. 途中代入
  3. シフト(掛ける 2 の n 乗)
  4. ビット演算
課題:
  1. i=100; j=200;
    d=( c= (b=(a=i+j)) + a ) + b;
    という途中代入をすると,abcd それぞれはどうなるか
  2. コンピュータは,インターフェース回路を使う事により, 例えばスイッチ一つ一つをビットデータとして受け取る事ができる。
    このとき,& や | を使う事により, 特定のスイッチが on なのか off なのか判断できるという。
    そのためには,どのような演算をしたら良いか考えよう。
    例:
    i=01001001100101111
                  ^このデータを取り出したい
参考 :
& とは,ビットアンド ... 答えはどんな値も考えられる ... 4 & 6 → 4
&& とは,論理アンド ... 答えは 0 か 1 のいずれか ... 4 && 6 → 1


1.3 整数の表わす数値の限界

V-C

#include <stdio.h> main() { short int i,n; i=1; n=0; while(i>0){ i=i+i; n=n+1; printf("(+-2^n) n=%d ", n); printf("%d %d %d ... ", -1-i,-i,1-i); printf("%d %d %d\n", i-1,i,i+1); } }
注意
  1. while の意味については,後述します。 ここでは,「処理を繰り返すためのキーワード」だと思って下さい。
課題:
  1. short int を,long int や,int に変更して実行させてみよう。


1.4 実数演算

V-C

#include <stdio.h> main() { double a,b,c,d,s,x,y; printf("x="); scanf("%lf",&x); printf("y="); scanf("%lf",&y); s=x*y; printf("Height * Width -> Area\n"); printf("%lf * %lf -> %lf\n", x,y,s); a=x+y; b=x-y; c=x*y; d=x/y; printf("abcd = %lf %lf %lf %lf\n", a,b,c,d); }
用語の確認
  1. 実数型
  2. 浮動小数点型 (double, short)
  3. printfでは,%lf (整数は %d だった)
  4. 定数 (必ず 小数点が付く)
  5. 1.602e-19 という形式 ... printf では,%le
課題:
  1. 入力として,x=10, y=3 とし,割り算が切り捨てられない事を確認せよ。
    また,20, 7 や -30, 5 など他のデータ対も試してみよ。


1.5 実数の表わす数値の限界-1 (範囲)

V-C

#include <stdio.h> main() { float a,b; double c,d; int m,n; printf("loop ="); scanf("%d", &m); a=1.0; b=1.0; c=1.0; d=1.0; for(n=1; n<m; n=n+1){ a=a * 2.0; b=b / 2.0; c=c * 2.0; d=d / 2.0; printf("(2^n) n=%d ", n); printf("%g %g %g %g\n", a, b, c, d); } }
注意
  1. for の意味については,後述します。 ここでは,「処理を繰り返すためのキーワード(その2)」だと思って下さい。
課題:
  1. loop として,20, 130, 155, 1030, 1080 のそれぞれを設定してみよう。 これにより,実数 型の最大, 最少値が分かる(はず)。
  2. ヒント-1

    2^128 = inf
    2^127 = 1.70e+038
    2^-149 = 1.40e-045
    2^-150 = 0

  3. ヒント-2

    2^1024 = inf
    2^1023 = 8.99e+307
    2^-1074= 4.94e-324
    2^-1075 = 0



1.5b 実数の表わす数値の限界-2 (精度)

V-C

#include <stdio.h> main() { float a,b; int n; a=0.0; b=0.25; for(n=1; n<=10000; n=n+1){ a=a + b; } printf("a = %f \n", a); a=1.00001; b=1.0; printf("sa = %g \n", a-b); }
注意
  1. for の意味については,後述します。
課題:
  1. b=0.25 を, b=0.125 や b=0.2 や,b=0.3 に変更しよう。
  2. a=1.00001 という式を,a=1.1 に変えてみよう。


1.6 整数演算と実数演算の混合

V-C

#include <stdio.h> main() { int i,j; double a,b; int m,n; double u,v,w,x,y; printf("a="); scanf("%lf",&a); i=(int)a; printf("b="); scanf("%lf",&b); j=(int)b; printf("i, j, a, b = %d %d %lf %lf\n", i,j,a,b); u=i/j - a/b; v=i/j - (int)(a/b); w=(float)(i/j) - a/b; x=( (float)i / j) - a/b; y=(i / (float)j) - a/b; printf("u, v, w = %lf %lf %lf\n", u,v,w); printf("x, y = %lf %lf\n", x,y); u=(i+a)/(j+b); v=i/j*b/a; w=a/b*j/i; printf("u, v, w = %lf %lf %lf\n", u,v,w); }
用語の確認
  1. 整数型の変数名と実数型の変数名...歴史的背景
課題:
  1. a,b = 10, 2 として,計算しよう。また,各計算結果を検討しよう。
  2. a,b = 10, 3 として,計算しよう。また,各計算結果を検討しよう。
  3. a,b として,他の値も代入し,結果について検討しよう。
  4. 思い通りの計算結果を得るために必要な事は何か。
//