Microsoft PowerPoint pptx

Similar documents
Microsoft PowerPoint pptx

プログラミング実習I

Microsoft PowerPoint - 09.pptx

gengo1-8

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - CproNt02.ppt [互換モード]

講習No.9

Microsoft PowerPoint pptx

Taro-ファイル処理(公開版).jtd

PowerPoint プレゼンテーション

program7app.ppt

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft Word - 3new.doc

Prog1_10th

gengo1-2

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

第1回 プログラミング演習3 センサーアプリケーション

gengo1-11

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

02: 変数と標準入出力

PowerPoint Presentation

PowerPoint プレゼンテーション

プログラミング基礎

Microsoft PowerPoint pptx

ポインタ変数

PowerPoint Presentation

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

cp-7. 配列

プログラミング実習I

Microsoft PowerPoint - 5Chap15.ppt

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

第2回講義:まとめ

Microsoft Word - no103.docx

02: 変数と標準入出力

Microsoft Word - Cプログラミング演習(12)

< F2D837C E95CF CF68A4A94C5816A2E6A>

第9回 配列(array)型の変数

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

Microsoft PowerPoint - lec10.ppt

02: 変数と標準入出力

Taro-リストⅠ(公開版).jtd

PowerPoint プレゼンテーション

プログラミングA

2006年10月5日(木)実施

Microsoft Word - Cプログラミング演習(11)

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

ファイル入出力

02: 変数と標準入出力

ファイル入出力

Microsoft Word - Cプログラミング演習(10)

memo

memo

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - kougi7.ppt

02: 変数と標準入出力

Microsoft PowerPoint - 計算機言語 第7回.ppt

gengo1-12

02: 変数と標準入出力

数値計算

kiso2-09.key

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

講習No.8

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

プログラミングA

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Microsoft PowerPoint pptx[読み取り専用]

Microsoft Word - no202.docx

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

ポインタ変数

02: 変数と標準入出力

Microsoft Word - Training10_プリプロセッサ.docx

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

Microsoft Word - no02.doc

02: 変数と標準入出力

PowerPoint プレゼンテーション - 物理学情報処理演習

Prog1_12th

02: 変数と標準入出力

PowerPoint プレゼンテーション

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Microsoft Word - no11.docx

Prog1_6th

Cプログラミング1(再) 第2回

gengo1-12

メソッドのまとめ

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

PowerPoint プレゼンテーション

スライド 1

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

演算増幅器

Microsoft Word - Cプログラミング演習(3)

PowerPoint プレゼンテーション

Microsoft PowerPoint ppt

本サンプル問題の著作権は日本商工会議所に帰属します また 本サンプル問題の無断転載 無断営利利用を厳禁します 本サンプル問題の内容や解答等に関するお問 い合わせは 受け付けておりませんので ご了承ください 日商プログラミング検定 STANDARD(C 言語 ) サンプル問題 知識科目 第 1 問 (

Transcription:

情報処理 Ⅱ 2011 年 11 月

授業の進め方 プリプロセッサ指令 構造体 ファイル入出力 その他の型 記憶域管理関数 2 年以降でさらに学習 習熟 配列 と ポインタ は違うの? 値はメモリの中でどのように格納されるの? 配列 文字列 ポインタ 識別子 算術型 関数 変数の有効範囲 制御文 演算子 再帰呼び出し ライブラリ関数 式評価 プログラムの作成 コンパイル 実行 2

配列の宣言 (1) int a[3]; と宣言すると,3 個の int 型オブジェクトを確保する. a[0], a[1], a[2] が左辺値として使用できる. 宣言の形にも関わらず,a[3] は使用できない. 代入したときの動作は不定. 配列は0から始まる と覚える. a 配列変数名 : 参照可能だが代入は不可. a[0] a[1] a[2] オブジェクト : 代入と参照が可能. 3

オブジェクトとは 実体,object C では, メモリに格納されている実体 のこと オブジェクト という言葉が出てきたら, 値がメモリの中にどのような形で格納されるかをイメージすること! オブジェクト指向 とは完全に無関係 a 配列変数はオブジェクトではない メモリに割り付けられない a[0] a[1] a[2] 配列領域はオブジェクト メモリに割り付けられる 4

配列のサイズの求め方 a が配列変数のとき,sizeof(a) / sizeof(a[0]) でそのサイズ ( 要素数, 配列長 ) が求められる. 算術型に限らず, どんな配列変数でも成立する. aがポインタ変数の場合や,mallocなどにより動的に確保した領域には, 利用できない. a[0] a[1] a[2] a[9] sizeof(a) sizeof(a[0]) 5

合計 平均 最大 最小 問題 キーボードから 5 個の整数を読み取り, その合計 平均 最大値 最小値を表示するプログラムを作りなさい. 整数を読み取るには, ライブラリ関数の scanf を使いなさい. int5.c 6

scanf の留意点 変換指定子は, 値を格納したい変数の型に合わせる %d int, %f double, %ld long など 格納したい変数の直前に & をつける 単項演算子の一つ. 第 6 回の授業で説明する. 関数の戻り値 ( 関数を呼び出すことによって得られる値 ) で成否を判断する 読み込めた個数を返す. 失敗すれば,0 または負 読み込みに失敗したら, 入力が進まない. 入力が進む ストリーム while (scanf("%d", &a)!= EOF) と書いていて, 数字 空白以外の入力があると, 無限ループに陥る 7

合計 平均 最大 最小求め方 (1) 問題 ( 再掲 ) 概略 キーボードから 5 個の整数を読み取り, その合計 平均 最大値 最小値を表示するプログラムを作りなさい. 整数を読み取るには, ライブラリ関数の scanf を使いなさい. キーボードから整数を読み取り scanf 表示する printf 配列を使用する ( 使わなくても書けるが ) 個々の整数と, 合計 最大値 最小値はint 型, 平均はdouble 型とする 8

合計 平均 最大 最小求め方 (2) 詳細 for を用いて,5 個の整数を配列に格納する. 途中で読み込みに失敗したら, input error と出力して終了する. for を用いて合計を求め, 変数 sum に格納する. (double)sum / 5 により平均を求め, 変数 avg に格納する. 最小値, 最大値を格納する変数をそれぞれ min,max とし, 初期値 ( 暫定的な最小値, 最大値 ) をいずれも a[0] とする. a[1]~a[4] のそれぞれについて, 現時点での min と比較し, 配列中の値のほうが小さければ, それを最小値とする. 最大値についても同様に処理する. 人間の目なら 5 個の中から最大 最小を一瞬で見つけられるが, コンピュータは 2 つの値の比較を繰り返して, 求めなければならない. 9

文字列 C の文字列は, 末尾に ' 0' のつく char 配列である. ' 0' は 0 と同一. 文字を意識するときに使用する. 'a' の書式を文字定数という. ただし,int 型の値である. "a" の書式を文字列リテラルという. ナル文字 という ヌル文字 ともいう 文字列リテラルを直接書き換えることはできないが, 配列変数の初期化に指定すれば, 書き換え可能. 'a' 文字 : 文字列 : "a" 'a' ' 0' 10

文字列をずらす 入力 : "sleep" 出力 : 0: sleep 1: tmffq 2: unggr 25: rkddo 26: sleep 文字単位で, 次の文字 にしている ( ただし z の次は a) 出力は, シーザー暗号で, 入力を平文とし, ずらす数 を鍵として与えたときにできるすべての暗号文になっている. caesar.c 11

次の文字にするには ( 旧 ) text 's' 'l' 'e' 'e' 'p' ' 0' char c = text[j]; if ('a' <= c && c <= 'z') { text[j] = (c 'a' + 1) % 26 + 'a'; } ( 新 ) text 't' 'm' 'f' 'f' 'q' ' 0' 文字コードは,'a'~'z' が順に配置されているものとする ( 例 :ASCII) 12

多次元配列の宣言 多次元配列 : 配列の配列 int a[2][2]; と宣言すると, sizeof(int) が 4 のとき, sizeof(a) は 16 sizeof(a[0]) は 8 sizeof(a[0][0]) は 4 a 参照可能だが代入は不可. a[0] a[1] a[0][0]a[0][1]a[1][0]a[1][1] オブジェクト : 代入と参照が可能. 13

多次元配列の使い道 行列 n 行 m 列の実行列なら, double a[n][m]; ただしnとmは定数. a[j][i] はj 行 i 列 (0 j n 1, 0 i m 1) の値. ゲームなどで用いられる, 2 次元の盤やフィールド a[0][0] a[1][0] a[n 1][0] a[0][1] a[0][m 1] a[n 1][m 1] 14

行列の積 n 行 m 列と m 行 p 列の行列の積を求めることができ, 結果は n 行 p 列の行列になる. c[i][j] = 0 k m 1 (a[i][k] * b[k][j]) これを 0 i n 1,0 j p 1 に対して計算すればよい. m p b n n matrixnmp.c a p c 15

ポインタ ポインタとは? 指し示すもの ポインタ = アドレス + 型 なぜ必要? y *y メモリ ( 特に, 配列, 文字列, ヒープ ) に効率よくアクセスできるから. 関数の仮引数によく使用されるから. 16

図の見方 オブジェクト ( 代入可 ) 値 ( 代入不可 ) ポインタ変数 ( 代入可 ) ポインタ値 ( 代入不可 ) 配列変数 ( 代入不可 ) 17

オブジェクトとポインタの関係 (1) int x; int *y; とするとき, x は int 型の変数, またはその値 y は int * 型のポインタ変数, またはその値 ( ポインタ値 ) *y は y が指し示す先 を表す int 型の値 &x は x を指し示すもの を表す int * 型のポインタ値 宣言文での * はポインタ宣言子 ( 演算子ではない ) * は間接演算子 & はアドレス演算子ともに単項演算子 ( 積や論理積ではない ) x &x y *y 18

オブジェクトとポインタの関係 (2) α が, 適切なポインタ値 ( 指し示す先がある ) ならば, *α は 指し示す先のオブジェクト であり, 参照も代入もできる ( 左辺値になり得る ). int x = 0; int *y = &x; *y = 2; printf("%d n", x); とすると, 2 が出力される. y y x=0 *y= x=0 *y= x=2 時間19

配列がポインタになるとき 配列変数は, 参照時にはポインタ値になる. int x[5]; とするとき, x[k] はint 型の値 ( 左辺値になり得る ) &x[k] および x+k は, x[k] を指し示すもの を表す int * 型のポインタ値 ( 左辺値ではない ) ポインタ値としては, x と x+0 と &x[0] は同じ値となる. x 演算子の優先順位に注意すると,&x[k] は, (&x)[k] ではなく &(x[k]) と同じ x+0 x+1 x+4 x[0] x[1] &x[0]&x[1] x[4] &x[4] address.c 20

配列の演算子と間接演算子の関係 int x[5]; int *y = x; とするとき, x[3] と y[3] と *(x + 3) と *(y + 3) は同じオブジェクトを表す. 左辺値になり得る ( 代入可能 ). 変数 αが配列変数であってもポインタ変数であっても, α[i] と *(α + i) は同じオブジェクトを表す. i は負でもよい. *(α + 0) は *α と書ける. x x[0] y[0] x[1] y[1] x[2] y[2] x[3] y[3] x[4] y[4] y 21

一つの配列を指し示す複数のポインタ int x[5]; int *y = x + 1; とするとき, x[3] と y[2] は同じオブジェクトを表す. x x[0] y[ 1] x[1] y[0] x[2] y[1] x[3] y[2] x[4] y[3] y z ( 同一型の ) ポインタ値どうしの減算が可能. 上図で,y x は 1. y z は -3. 同一配列の中を指し示している 2 つのポインタが何要素分だけ離れているかを知ることができる. 22

ポインタ変数にできて配列変数にできないこと ( 前提 : int x[5]; int *y;) 代入 y = x; x = y; 整数との加減算 y++; や y = 3; x++; や x = 3; x x[0] x[1] x[2] x[3] x[4] y y+1 y+2 y+3 y+4 23

配列変数にできてポインタ変数にできないこと (1) 初期化していない状態での参照や代入 int x[10]; int *y; とするとき, x[5] = 1; y[5] = 1; 適切に指し示す先を設定しておけば, 問題ない. x x[0] x[1] x[9] y??? 初期化していないとき, それぞれの値は不明. しかし代入はできる. 24

配列変数にできて ポインタ変数にできないこと (2) 文字列の書換え char x[] = "programming"; char *y = "programming"; とするとき, x[7] = ' 0'; y[7] = ' 0'; 配列変数 x の初期化は, 文字列が配列値として格納されるのに対して, ポインタ変数 y の初期化および代入は, ( 書換えられない ) 文字列リテラルを参照するだけだから. y = x; y[7] = ' 0'; 25

ポインタ変数 ++ x x[0] x[1] x[2] x[3] x[4] y++; y y+1 y+2 y+3 y+4 y 1 y y+1 y+2 y+3 指し示す先を, 配列の 1 要素分, 次に移動する. 配列変数は安定的 ポインタ変数は身軽 とも言える. 26

ポインタのポインタ 指し示すものを指し示す 例 : char **p; p は char ** 型 p[0] および *p は char * 型 p[0][0] および **p はchar 型 適切に指し示していれば,p, p[0], p[0][0] はいずれも左辺値 ( 参考 ) 多次元配列の模式図 p p[0] p[0][0] 27

コマンドライン引数 コマンドライン引数とは 例 : cc program.c でコンパイルするとき, cc はコマンド名, program.c はコマンドライン引数と呼ばれる. C 言語でコマンドライン引数を獲得するには argv は char ** 型のポインタ変数 main 関数を int main(int argc, char *argv[]) と宣言する. argv argv[0] argv[1] argv[2] = NULL./abc 123 を実行したとき argc = 2 "./abc" "123" 書き換え可能な文字列 28

文字列を 1 文字ずつ参照するには 仕様 考え方 コマンドライン引数の文字列に対して, 0 と 1 の個数が等しければ equal を, そうでなければ not equal を出力する. "101010": equal "111100": not equal p ではなく *p *p++ ではなく p++ for (p = "101010"; *p!= ' 0'; p++) で, 文字列を先頭から1 文字ずつ参照する. pは着目する 位置 を,*pはその 文字 を表す. for 文を終えると,pはナル文字を指し示している. p 1 0 1 0 1 0 ' 0' 0eq1.c 29

11 月 28 日のスケジュール 10:50~11:30 おさらい問題を各自解く ( 小テスト1) 大問 1の各小問の解答を用紙に記入すること書籍 ノートの参照, 友人との相談を行ってよい 11:30~12:10 おさらい問題の解説 12:10~12:20 小テスト2 30

おさらい問題 とは 試験を想定した問題集. 参考のため点数を書いているが, 成績には関係しない. 第 15 回授業では, 全範囲を対象として再度実施 成績は, レポート (20 点 )+ 期末試験 (80 点 ) 期末試験までに身につけてほしいこと C の文法を正しく理解する for 文を記述して適切な値で反復処理ができる 与えられたプログラムコードを日本語で的確に説明する for 文の記述では, 演算子の活用および従属型 ( 内側のループの範囲が, 外側の値 ( の変化 ) に依存する )2 重ループが含まれる. 31

正答率 (%) 83.0 92.5 94.3 81.1 84.9 大問 1((1)~(5)) (1)1.<001><096>.#include 文は ( 狭義の ) コンパイルの前になくなる. (2)2. 昨年度の試験問題. 辞書で いりこ いれこ を引くこと. (3)2.<066>. if~else は構文, else if はイディオム. (4)2.<132><133>.%pはアドレスの出力となる. (5)1.<096>. 実行するプログラムから見れば, コマンドライン引数は (main 関数の ) 実行の前に与えられるものであり, scanfによる入力は, 実行中に受け取ることになる. <3 桁 > は教科書の項目番号 ( ページではない ) 32

大問 1((6)~(10)) 66.0 50.9 96.2 69.8 32.1 (6)2.<001>.sizeofは予約語. ^ は識別子で使用できる文字ではない. 大文字と小文字が区別されるので, Return は問題ない. (7)1.<015>.signedもunsignedもないintは符号あり. 0 をとることができる点にも注意. (8)2.<059>. 増文 は誤変換. (9)4.<067><066>.ifの中にbreak; があったら, どこを抜けるかよく確認すること. (10)4.<048><058>.! はビットを対象とした演算子ではなく, ^ は単項演算子ではない. $ は演算子ですらない. 33

大問 1((11)~(15)) 96.2 28.3 83.0 45.3 64.2 (11)3.<045><049>. = と == の取り違いは, コンパイラが教えてくれないので, よく注意すること. (12)1.<046><043>. と && では, ショートカット判定 評価結果は1か0 に注意. 2 1 なら,3となる. (13)2.<022><040>. 配列のサイズは, コンパイル時に評価できる式でもよいので, a[7 2*2] は a[3] と等価. (14)2.<040>. a は, 長さが2バイトの, 書き換えられない char 配列となる.34は論外. (15)1.<070><072>. 配列変数 aに対して,2はa[0], 3はsizeof(a),4はsizeof(a)/sizeof(a[0]). 34

大問 2((1)~(4)) (1) 1,0,1 (2) i *= 3 ( 別解 :i = i * 3) (3) (1,1),(1,2),(1,3),(2,1),(2,2),(3,1) (4) i; j < 3; j++ ( 別解 :j < 3のところをj <= 2) 昨年度の試験問題と同一. 初期化 条件 増分に配慮し, 変数が期待どおりの範囲をとれるよう, 適切な for 文を書けることを目指してほしい. 35

2 重ループを, 表で考える ( 大問 2(4)) (i,j)=(0,0),(0,1),(0,2),(1,1),(1,2),(2,2) j=0 j=1 j=2 i=0 (0,0) (0,1) (0,2) i=1 (1,0) (1,1) (1,2) i=2 (2,0) (2,1) (2,2) i が 0 のとき,j は 0 から 2 まで i が 1 のとき,j は 1 から 2 まで i が 2 のとき,j は 2 から 2 まで 36

2 重ループを, 表で考える ( 大問 2(3)) for(i=1;i<=3;i++) for(j=1;j<=4 i;j++) i が 1 のとき,j は 1 から 3 まで i が 2 のとき,j は 1 から 2 まで i が 3 のとき,j は 1 から 1 まで j=1 j=2 j=3 i=1 (1,1) (1,2) (1,3) i=2 (2,1) (2,2) (2,3) i=3 (3,1) (3,2) (3,3) 37

大問 2((5)~(11)) (5) ナル文字 ( 別解 : ヌル文字 ; 0 ) (6) char * ( 別解 :charのポインタ) (7) 指し示す先に,bの指し示す先の値を (8) 配列の1 要素分増える (9) *b ( 別解 :bの値を変更する前の,bの指し示す先の値) (10) ナル文字をコピーした (11) 次の文を, このwhileループの中の処理としてしまう <072> にコードがある. ただし現在では推奨されない. strcpy 関数を使うのが最善であり, ループカウンタを入れて for 文で記述するほうがまだよい ( 読みやすい ). 38

大問 3( メモ ) 何をするものか? unsigned char 型の取り得る全ての値について, その 2 進表現を求める どんなコマンド? cc o charall charall.c でコンパイルし,./charall で実行する どんな出力? 256 行. 最初は 0: 00000000, 次は 1: 00000001, 最後は 255: 11111111 変数の変化? 独立型の 2 重ループで,x は 0,1,,255,0 ( オーバーフローによって 0 が代入され,do~while のループを抜ける ).b は for ループのたびに,128,64,,1,0( 右シフトで半減していき, 最下位ビットの 1 がなくなれば終了 ) 39

大問 3( メモ ) 技法? #include は printf 関数を使用するため bはunsignedにしないと,128の右シフトで符号ビットが残る可能性がある printfで %3d とすることで,0~256の表示を右揃えにできる x & b は,b の 1 のあるビットの位置に,x も 1 があるかを判定している. あれば 1, なければ 0 を出力し,b を変化させてていくことで,x の 2 進表現となる. ++x は x = x + 1 と等価であり,x の値を 1 増やし, その値を評価値とする.x が 0 のとき,++x は 1 で,255 のときは,(256 ではなく,unsigned char 型のオーバーフローにより )0. 40