x y 復習 変数とその種類 変数名 数学の場合 未知数 「変数xに‥を代入し‥」 x = 5 x = 1.3

Slides:



Advertisements
Similar presentations
プログラミング論 第八回数字の計算,整数の入出力. 本日の内容 前回の課題(続き) 前回の課題(続き) 数字の計算をする 数字の計算をする – 加減乗除を行う – インクリメント演算子とデクリメン ト演算子.
Advertisements

変数とその種類 変数とは何か? → データ ( 数値 ) を入れておく 箱 1000 変数名とは何か? → 箱に付ける名前 xy 変数名 変数の種類 ( 変数の型 ) → 入れるデータによって箱の種類が異なる int char float double その他たくさん integer (
第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
演算、整数型と浮動小数点型 第3回目 [4月27日、H.16(‘04)] 本日のメニュー 1)前回の課題・宿題 2)ファイルサーバの利用
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
初年次セミナー 第4回 整数と実数の取り扱い.
プログラミング基礎I(再) 山元進.
第2章 数値の入力と変数 scanfと変数をやります.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第7回 データの基本型 情報・知能工学系 山本一公
演算、整数型と浮動小数点型 第3回[平成16年4月27日(火)]:PN04ー03.ppt 今日の内容 1 復習 2 加減・乗除演算子
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
C言語 第2講 生物機能制御学講座 濱田 農学部7号館209室.
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
第二回 VB講座 電卓を作ろう.
プログラミング応用 printfと変数.
プログラムはどこに保存され,どこで実行されるのか?
プログラミング演習I 2003年5月7日(第4回) 木村巌.
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラムはどこに保存され,どこで実行されるのか?
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
2013年度 プログラミングⅡ ~ 計算してみよう ~.
2015年度 プログラミングⅡ ~ 計算してみよう ~.
整数データと浮動小数データ.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
C言語 はじめに 2016年 吉田研究室.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
地域情報学 C言語プログラミング 第2回 変数・配列、型変換、入力 2017年10月20日
x y 復習 変数とその種類 変数とは何か? →データ(数値)を入れておく箱 変数名 変数名とは何か?
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
情報処理Ⅱ 第2回 2005年10月14日(金).
情報処理Ⅱ 第2回 2006年10月13日(金).
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
情報処理Ⅱ 2005年10月28日(金).
標準入出力、変数、演算子、エスケープシーケンス
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング演習I 数値計算における計算精度と誤差
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 第2回 2004年10月12日(火).
第3回簡単なデータの入出力.
プログラミング入門2 第5回 配列 変数宣言、初期化について
printf・scanf・変数・四則演算
第2章 数値の入力と変数 scanfと変数をやります.
知能情報工学演習I 第9回(後半第3回) 課題の回答
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

x y 1000 200 300 復習 変数とその種類 変数名 数学の場合 未知数 「変数xに‥を代入し‥」 x = 5 x = 1.3 変数とは何か? →データ(数値)を入れておく箱 200 300 x y 変数名 変数名とは何か? →箱に付ける名前 変数の種類(変数の型) →入れるデータによって箱の種類が異なる  int  char  float  double その他たくさん integer (整数) floating point (浮動小数点→実数)

変数の宣言と printf()による値の表示 復習 変数の宣言と 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)行内では左から右へ 命令文が実行される OK! 基本的にどこで改行してもよいし,ブランク(スペース)はあっても無くてもよい #include<stdio.h> int main(void){ int x;x=15;printf(‟変数の値は%dである\n‟, x);} #include <stdio.h> int main(void) { int x ; x = 15; printf(‟変数の値は%dである\n‟, x); } 単語の途中で改行してはダメ! #include<stdio.h> int mai n(void) {   intx;   x=15;   pri ntf(‟変数の値は%dで ある\n‟, x); } intとxの間にスペースがないのでダメ! 単語の途中にスペースがあるのもダメ! ダブルクォーテーション内で改行するのもダメ!

復習 計算式の書き方 ○e△ ⇔ ○x10△ 指数表示 float x1, x2, y; x1 = 2e5; x2 = 20.0; y = x1 * x2 / 4.0; printf(‟答えは%fだ\n‟, y); 2e5は2x105を意味する *は乗算,/ は割り算の意味 答えは1000000.000000だ 問題 実数3.5105のプログラム中の表現で正しいのはどれか? 3.5*10e5 3.5e5 350000.0 解答 (B)と(C) 解説 e5 → 105であるので, 3.5*10e5 と書くと,3.510105の意味になる.

表示するべき変数(値)と%dの数が不一致 復習 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); メッセージ部分と変数(式)の並び部分の区切りや,変数(式)同士の区切りとしてコンマを入れる メッセージ部分 変数や式の並び

warning C4244: '=' : 'double' から 'int' に変換しました。データが失われているかもしれません。 浮動小数点数の代入と表示 int型で表すことができない数値はおかしな結果になる int bb = 1300.5; printf("bb = %d\n", bb); int型に実数(浮動小数点数)を代入すると,少数以下は切り捨て bb = 1300 コンパイラからの メッセージ warning = 警告 int cc = 10.56e20; printf("cc = %d\n", cc); 1344274432 warning C4244: '=' : 'double' から 'int' に変換しました。データが失われているかもしれません。 float xx = 100.56e-20, yy = 10000; printf("xx = %f, yy = %f\n", xx, yy); 変換文字%fは小数点形式で表示 xx = 0.000000, yy = 10000.000000 変換文字%eは指数形式で表示 printf("xx = %e, yy = %e\n", xx, yy); xx = 1.005600e-018, yy = 1.000000e+004 printf("xx = %g, yy = %g\n", xx, yy); 変換文字%gは適切と思われる形式を自動的に選んで表示 xx = 1.0056e-018, yy = 10000

復習 【付録】 変換文字(変換指定)の例 printf中で%で始まる文字には変数の値が表示される 【付録】 変換文字(変換指定)の例 printf中で%で始まる文字には変数の値が表示される 変換文字の例(詳細は教科書p.356(旧p.318)または参考書を見よ) %d 整数型(int型)の変数を10進数で表示 %o 整数型(int型)の変数を8進数で表示 %x 整数型(int型)の変数を16進数で表示 %f 実数型(浮動小数点型,float型)の変数を 小数点形式(mmm.ddddddd)で表示 %lf 実数型(浮動小数点型,double型 )の変数を %e 実数型(浮動小数点型,float型,double型 )の変数を 指数形式(m.ddddddd e ±xx)で表示 %g %fと%eの形式の内,適切なほうを自動的に選択して表示 %c char型の変数を文字で表示 %s char型の配列(ポインタ)を文字列で表示

いろいろな変数型(1) 1バイト = 8ビット 0000 0000 0 0000 0001 1  ~ ~ 1111 1111 255 4バイト = 32ビット 0000 0000 0000 0000 0000 0000 0000 0000 0 0000 0000 0000 0000 0000 0000 0000 0001 1  ~ ~ 1111 1111 1111 1111 1111 1111 1111 1111 4,294,967,295

いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 文字と文字列で学習 int 4バイト もっとも標準的な整数型 2進法で10進実数を表わすので誤差がある (有効数字8桁程度) float 4バイト 単精度実数型(単精度浮動小数点型) double 8バイト 倍精度実数型(倍精度浮動小数点型) floatより高精度(有効数字15桁程度)

計算機における計算精度の問題点 有効数字 1 3 数学 3 × = 1 計算機 3 × 0.33333333 = 0.99999999 数学 3 ×   = 1 計算機 3 × 0.33333333  = 0.99999999 2進法による小数点以下の数値の表現 2進数 1111.1111 = 15.9375 123 + 122 + 121 + 120 = 8 + 4 + 2 + 1 = 15 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 = 1×22 = 4 (10)2 = 1×21 = 2 (100)2 = 1×22 = 4 (10)2 = 1×21 = 2 (1)2 = 1×20 = 1 (0.1)2 = 1×2-1 = 0.5 (0.01)2 = 1×2-2 = 0.25 (0.001)2 = 1×2-3 = 0.125 (0.0001)2 = 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 15.100000と100000.000000をかけると,その答えは1510000.038147だ 考察 次に述べるプログラムを作成し,ソースプログラムと実行結果を提出せよ. 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; 1 / 3 * 30 printf("aa = %d bb = %d\n", aa, bb); 1 / 3 * 30 = 0 * 30 = 0 どんな結果になる? 整数同士の演算なので中間結果も整数値 1÷3 = 0.333… = 0 aa = 0 bb = 0 プログラムの世界では… 1.0 浮動小数点数(double型) 1  整数 int aa; aa = 1.0/3*30; printf("aa = %d", aa); 1.0 / 3 * 30 = 0.333... * 30 = 10 aa = 10 浮動小数点数と整数の演算結果はdouble型

x 10 11 10+1 いろいろな演算子(1) 代入演算子 '='は等号ではなく代入の意味 x の解は不定??? = は ← の意味

aa++ は aa = aa+1 と同じ → aaの値を1増やす -- デクリメント演算子 いろいろな演算子(2) 算術演算子 + 足し算 - 引き算 * 掛け算 / 割り算 % 剰余算 (例) x = 5 % 3 ⇒ x = 2 割り算の余り 5÷3 = 1 … 2 ++ インクリメント演算子 aa++ は aa = aa+1 と同じ → aaの値を1増やす -- デクリメント演算子 aa-- は aa = aa-1 と同じ → aaの値を1減らす aa = 10; aa++; /* この文を実行後のaaの値は11になる */ aa = aa++; と書くのは誤り!

いろいろな演算子(3) これらは授業では使わない その他の演算子 += -= *= /= %= << >> ^ , etc.... 関係演算子と論理演算子 > >= < <= == != && || ! 選択制御文(条件分岐) で学習

scanf()関数による数値の入力 整数値の入力では%dとする. 変数名の前には&をつける int x; printf("値を入力してください."); scanf("%d", &x); printf("入力された値は,%dです.\n", x); 値を入力してください. 15 入力された値は,15です. キーボードから入力 整数値の入力では%dとする. int aa; scanf(" %d ", & aa ); 変数名の前には&をつける float bb; scanf("%f", &bb );

scanf()関数の注意 ダブルクォーテーション内に%dや%f以外の文字を入れてはダメ 値はいくらですか?15 int x; scanf("値はいくらですか?%d\n", &x); \nで改行して、次の行で入力されるのでダメ int x; printf("値はいくらですか?\n"); scanf("%d\n", &x); 15 ダブルクォーテーション内に%dや%f以外の文字を入れてはダメ 値はいくらですか? 15 一つの値の入力には, 一つのscanf()を使う. (複数の変数に一気に入力することはできない) int x; printf("値はいくらですか?"); scanf("%d", &x); 値はいくらですか?15

Visual Studio 2010では無視できるが,Visual Studio 2013ではエラーになるため,無視できない! 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行目に次の行を書いておく #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> ・・・・ scanf(・・・); Visual Studio 以外のコンパイラではこの行は無視される scanf()関数がエラーにならない!