復習
変数とその種類
数学の場合
1000
変数とは何か?
→データ(数値)を入れておく箱
変数名とは何か?
→箱に付ける名前
200
x
300
y
未知数
「変数xに‥
を代入し‥」
変数名
変数の種類(変数の型)
→入れるデータによって箱の種類が異なる
int
char
float
double
その他たくさん
integer (整数)
floating point (浮動小数点→実数)
x=5
x = 1.3
x = 5/10
変数の宣言と printf()による値の表示
#include
<stdio.h>
int main(void)
{
① int x ;
② x = 15;
}
復習
大原則
変数は,それを使用する前に
まず宣言しなければならない.
→ 変数宣言
変数宣言
値の代入 (変数の使用)
③ printf(‟変数の値は%dである¥n‟, x); 変数値の表示
(変数の使用)
変数の値は15である
変数名(識別子)のルール
→ 変数名は1文字とは限らない.x, y, aa, xx, xy, aa1
→ 本スライド末尾
復習
ソースプログラムの書式
大原則
プログラム本体内では
(i)上の行から順に,
(ii)行内では左から右へ
#include<stdio.h>
命令文が実行される
int main(void){
int x;x=15;printf(‟変数の値は%dである¥n‟,
x);}
#include <stdio.h>
OK!
基本的にどこで改行
してもよいし,ブラン
ク(スペース)はあって
も無くてもよい
int main(void)
単語の途中で改行してはダメ!
{
#include<stdio.h>
int x ;
int mai
intとxの間にスペースがないのでダメ!
x = 15;
n(void)
{
printf(‟変数の値は%dである¥n‟, x);
intx;
単語の途中にスペースがあるのもダメ!
}
x=15;
pri ntf(‟変数の値は%dで
ある¥n‟, x);
}
ダブルクォーテーション内で
改行するのもダメ!
復習
計算式の書き方
指数表示
float x1, x2, y;
x1 = 2e5;
x2 = 20.0;
2e5は2x105を意味する
○e△ ⇔ ○x10△
*は乗算,/ は割り算の意味
y = x1 * x2 / 4.0;
printf(‟答えは%fだ¥n‟, y);
答えは1000000.000000だ
問題
実数3.5105のプログラム中の表現で正しいのはどれか?
(A) 3.5*10e5
(B) 3.5e5
(C) 350000.0
解答
(B)と(C)
解説
e5 → 105であるので,
3.5*10e5 と書くと,3.510105の意味になる.
復習
printf()関数による変数値の表示
int x = 15;
printf(‟変数の値は%dで,その2倍は%dである¥n‟, x, 2*x);
変数の値は15で,その2倍は30である
%d は int型変数の値を表示する
float型変数の値を表示するには?
→ %f %e %g などを用いる
→ 詳しくは,本スライド末尾
表示する
べき変数
(値)が不明
表示するべ
き変数(値)
と%dの数が
不一致
printf(‟変数の値は%dで,その2倍は%dである¥n‟);
printf(‟変数の値は%dで,その2倍は%dである¥n‟, x, 2*x, 3*x);
これらはコンパイルエラーにはならないが,表示がおかしくなる
printf()関数で変数値を表示する際の文法
メッセージはダブルクォートで囲む
printf(‟変数の値は%dで,その2倍は%dである¥n‟, x, 2*x);
メッセージ部分
変数や式の並び
メッセージ部分と変数(式)の並び部分の区切
りや,変数(式)同士の区切りとしてコンマを
入れる
浮動小数点数の代入と表示
int型で表す
ことができ
ない数値は
おかしな結
果になる
int bb = 1300.5;
printf("bb = %d\n", bb);
int型に実数(浮動小数点数)を代
入すると,少数以下は切り捨て
bb = 1300
int cc = 10.56e20;
printf("cc = %d\n", cc);
コンパイラからの
メッセージ
warning = 警告
1344274432
warning C4244: '=' : 'double' から 'int' に変換しました。データが失われているかもしれません。
float xx = 100.56e-20, yy = 10000;
printf("xx = %f, yy = %f\n", xx, yy);
xx = 0.000000,
yy = 10000.000000
printf("xx = %e,
yy = %e\n", xx, yy);
xx = 1.005600e-018,
printf("xx = %g,
xx = 1.0056e-018,
変換文字%fは小数点形
式で表示
変換文字%eは指数形式
で表示
yy = 1.000000e+004
yy = %g\n", xx, yy);
yy = 10000
変換文字%gは適切と思
われる形式を自動的に
選んで表示
【付録】 変換文字(変換指定)の例
• printf中で%で始まる文字には変数の値が表示される
• 変換文字の例(詳細は教科書p.356(旧p.318)または参考書を見よ)
%d 整数型(int型)の変数を10進数で表示
%o 整数型(int型)の変数を8進数で表示
%x 整数型(int型)の変数を16進数で表示
%f 実数型(浮動小数点型,float型)の変数を
小数点形式(mmm.ddddddd)で表示
%lf 実数型(浮動小数点型,double型 )の変数を
小数点形式(mmm.ddddddd)で表示
%e 実数型(浮動小数点型,float型,double型 )の変数を
指数形式(m.ddddddd e ±xx)で表示
%g %fと%eの形式の内,適切なほうを自動的に選択して表示
%c char型の変数を文字で表示
%s char型の配列(ポインタ)を文字列で表示
復習
いろいろな変数型(1)
1バイト = 8ビット
0000 0000
0000 0001
~
1111 1111
0
1
~
255
4バイト = 32ビット
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0001
~
1111 1111 1111 1111 1111 1111 1111 1111
0
1
~
4,294,967,295
いろいろな変数型(2)
char
1バイト → 英数字1文字を入れるのにぴったり
アスキーコード → 文字と文字列で学習
int
4バイト もっとも標準的な整数型
float
2進法で10進実数を表わすので誤差がある
(有効数字8桁程度)
4バイト 単精度実数型(単精度浮動小数点型)
double
floatより高精度(有効数字15桁程度)
8バイト 倍精度実数型(倍精度浮動小数点型)
計算機における計算精度の問題点
有効数字
数学
3
計算機 3
×
1
3
= 1
× 0.33333333
=
0.99999999
2進法による小数点以下の数値の表現
2進数
1111.1111
123 + 122 + 121 + 120
= 8 + 4 + 2 + 1
= 15
= 15.9375
12-1 + 12-2 + 12-3 + 12-4
= 0.5 + 0.25 + 0.125 + 0.0625
= 0.9375
少数以下の2進数による10進数値の表現
(100)2
(10)2
(1)2
(0.1)2
(0.01)2
(0.001)2
(0.0001)2
=
=
=
=
=
=
=
1×22 = 4
1×21 = 2
1×20 = 1
1×2-1 = 0.5
1×2-2 = 0.25
1×2-3 = 0.125
1×2-3 = 0.0625
少数以下の10進数値
には,有限桁数の2
進法では表せない数
値がある.
丸め誤差
問題: 10進数の 0.1 は2進数で正確に表せるか?
(0.001)2 = 1×2-3 = 0.125
大きすぎ!
(0.0001)2 = 1×2-4 = 0.0625 小さすぎ!
(0.00011)2 = 1×2-4 + 1×2-5 = 0.0625 + 0.03125 = 0.09375 まだ小さい!
(0.000111)2 = 1×2-4 + 1×2-5 + 1×2-6
= 0.0625 + 0.03125 + 0.015625 = 0.109075
大きすぎ!
(0.0001101)2 = 1×2-4 + 1×2-5 + 1×2-7
= 0.0625 + 0.03125 + 0.0078125 = 0.1015625 まだ大きい!
(0.00011001)2 = 1×2-4 + 1×2-5 + 1×2-8
= 0.0625 + 0.03125 + 0.00390625 = 0.09765625 惜しい!
課題の考察
課題1-3
次に述べるプログラムを作成し,ソースプログラムと実行結果を提出せよ.
float型変数 aa と bb を宣言し,それぞれに15.1と1.0105の数値を代入す
る.代入したこれらの数値を次のように表示する
15.100000と100000.000000をかけると,その答えは
1510000.038147だ
考察: 計算結果が1510000.000000とならずに端数が出るが,これは間違
いではない. でも,これはなぜだろうか? どうすれば,もっと正確な答え
がでるだろうか? 理由を考えてみよ.わかった人はレポートに考察を書
くこと.
考察
10進実数は2進法で完全に表わせないため誤差がある.float型変数の
有効数字は8桁程度のため,より精度の高いdouble型を使用すれば改
善される.
定数値でよくある間違い
int aa, bb, cc = 1;
aa = 1/3*30;
bb = cc/3*30;
printf("aa = %d bb = %d\n", aa, bb);
どんな結果になる?
aa = 0
bb = 0
int aa;
aa = 1.0/3*30;
printf("aa = %d", aa);
aa = 10
1 / 3 * 30
= 0 * 30
= 0
整数同士の演算なので中
間結果も整数値
1÷3 = 0.333… = 0
プログラムの世界では…
1.0 浮動小数点数(double型)
1
整数
1.0 / 3 * 30
= 0.333... * 30
= 10
浮動小数点数と整数の演
算結果はdouble型
いろいろな演算子(1)
代入演算子
x = 10;
x = x + 1;
'='は等号ではな
く代入の意味
x の解は不定???
= は ← の意味
x = x + 1;
x ← x + 1
変数(箱) xから値を取り出して,1を足して変数xに代入する
10
11
x
10+1
いろいろな演算子(2)
算術演算子
+
*
/
%
足し算
割り算の余り
引き算
5÷3 = 1 … 2
掛け算
割り算
剰余算 (例) x = 5 % 3 ⇒ x = 2
++
インクリメント演算子
aa++ は aa = aa+1 と同じ → aaの値を1増やす
デクリメント演算子
aa-- は aa = aa-1 と同じ → aaの値を1減らす
-aa = 10;
aa++;
/* この文を実行後のaaの値は11になる */
aa = aa++; と書くのは誤り!
いろいろな演算子(3)
その他の演算子
+= -= *= /= %=
<< >> ^ , etc....
これらは授
業では使わ
ない
関係演算子と論理演算子
> >= <
&&
||
<=
!
==
!=
選択制御文(条件分岐)
で学習
scanf()関数による数値の入力
int x;
printf("値を入力してください.");
scanf("%d", &x);
printf("入力された値は,%dです.\n", x);
値を入力してください. 15
入力された値は,15です.
int aa;
scanf(" %d ", & aa );
キーボードから入力
整数値の入力では%dとする.
変数名の前には&をつける
float bb;
scanf("%f", &bb );
scanf()関数の注意
ダブルクォーテーション内に%d
や%f以外の文字を入れてはダメ
値はいくらですか?15
int x;
scanf("値はいくらですか?%d\n", &x);
int x;
printf("値はいくらですか?\n");
15
scanf("%d\n", &x);
値はいくらですか?
15
int x;
printf("値はいくらですか?");
scanf("%d", &x);
値はいくらですか?15
\nで改行して、次の行で
入力されるのでダメ
ダブルクォーテーション内に%d
や%f以外の文字を入れてはダメ
一つの値の入力には,
一つのscanf()を使う.
(複数の変数に一気に入
力することはできない)
Warning!!
warning C4996: 'scanf': This function or variable may be
unsafe. Consider using scanf_s instead. To disable
deprecation, use _CRT_SECURE_NO_WARNINGS. See online help
for details.
警告 C4996: 'scanf' : この関数または変数は安全ではないかもしれませ
ん.代わりに scanf_s を用いることを検討してください.この異議を無
効にするためには_CRT_SECURE_NO_WARNINGS を用いてください.詳細はオ
ンラインヘルプを参照してください.
⇒ この関数は安全でない!
これは主にシステムプログラムを書くプ
ログラマへの警告
要するに言いたいことは・・・
「この関数を用いたプログラムは,プロ
グラマがしっかりしてないとウィルスの
餌食になるかもしれません」
⇒ 学習には無関係なので無視する.
Visual Studio 2010では無
視できるが,Visual Studio
2013ではエラーになるため,
無視できない!
scanf()関数がエラーになる場合の対処方法
対処方法1
scanf()関数の代わりにscanf_s()関数を用いる
推奨できません!
資格試験(情報処理技術者試
験等)でもバツになるかも!
理由:
scanf_s()関数はマイクロソフト独自仕様なので、他のシス
テムやコンパイラでは使えない!
対処方法2
ソースプログラムの1行目に次の行を書いておく
Visual Studio 以外のコン
#define _CRT_SECURE_NO_WARNINGS
パイラではこの行は無視
#include <stdio.h>
される
・・・・
scanf(・・・);
scanf()関数がエラーにならない!
ダウンロード

PPT