Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C言語よくある誤り
Search
自然言語処理研究室
April 11, 2013
Programming
380
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C言語よくある誤り
自然言語処理研究室
April 11, 2013
More Decks by 自然言語処理研究室
See All by 自然言語処理研究室
データサイエンス14_システム.pdf
jnlp
0
420
データサイエンス13_解析.pdf
jnlp
0
540
データサイエンス12_分類.pdf
jnlp
0
380
データサイエンス11_前処理.pdf
jnlp
0
510
Recurrent neural network based language model
jnlp
0
180
自然言語処理研究室 研究概要(2012年)
jnlp
0
170
自然言語処理研究室 研究概要(2013年)
jnlp
0
130
自然言語処理研究室 研究概要(2014年)
jnlp
0
150
自然言語処理研究室 研究概要(2015年)
jnlp
0
240
Other Decks in Programming
See All in Programming
ソフトウェアラスタライザ
fadis
1
500
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
510
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
360
源内ハンズオン概要編
hideg
0
210
Press start. Python's next generation.
willingc
PRO
2
100
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
400
My Marp Sample
sinoue0108
0
110
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
220
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
140
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
720
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
120
プロポーザルを書いてもらう
pvcresin
0
570
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Balancing Empowerment & Direction
lara
6
1.2k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
900
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
300
Discover your Explorer Soul
emna__ayadi
2
1.3k
For a Future-Friendly Web
brad_frost
183
10k
How to make the Groovebox
asonas
2
2.3k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
A better future with KSS
kneath
240
18k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
290
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
Transcript
Cプログラミング よくある誤り 山本 和英 長岡技術科学大学 電気系
このスライドは... • C言語プログラミング初心者を対象に作成して います。 • C言語でよく見かける誤り(計14種類)をレベル 別に例示し、解説しています。 – 解答を見る前に、何が誤りかを自分で考えてみて ください。
• このスライドに書かれている誤りを一通り覚える ことでかなりの初歩的なミスを回避できると思 います。
誤りには4段階ある • レベル1: コンパイルエラー – コンパイルできないのですぐに気付く • レベル2: 実行時エラー – 実行中にエラーが出てプログラムが停止 •
レベル3: エラー表示されない – 正しくない出力が出るだけなので気付きにくい • レベル4: アルゴリズムの誤り – 最も気付きにくい
レベル1: コンパイルエラー (6問)
問1-1 if (a < b) brake; どこかに間違いがあるので (以下同様)、次のスライドを 見る前に、何が誤りなのかを 考えてみてください。
解1-1: スペルミス if (a < b) break; break; や continue;
など、つ づりを間違う。
問1-2 int 0, p, q;
解1-2: 見間違い int o, p, q; 0(ゼロ)と O(オー)、1(いち) と l(エル)などを間違う。
表示しているフォントに よってはほとんど見分け がつかない場合もある。 なお、O(オー)やl(エル)と いう変数が宣言されて いるとコンパイルエラー は出ないので、難易度が レベル2にアップする。
問1-3 printf ("Hello!!")
解1-3: 記号忘れ printf ("Hello!!"); 閉じ括弧"}"やセミコロン ";"を忘れる。 左の例では文末のセミコ ロン ; を忘れている。
問1-4 for (i=1, i<10, i++) printf ("%d", i):
解1-4: 記号間違い for (i=1; i<10; i++) printf ("%d", I); コンマ","
コロン":" セミコ ロン";"の使い方を間違え る。左の例では、 • for文の , →; • printf の最後 :→; の2つ(3ヶ所)が間違い。
問1-5 i = i + 1;
解1-5: 全角スペース i = i + 1; コメントやprintf ("...")以外 に全角スペース(「 」)が
(うっかり)入力されてい る。これは(当然ながら)見 た目では全く分からない のでエラーメッセージで 判断するしかない。 前のスライドでも文中に 全角スペースが入ってい る。
問1-6 void main(void){ int p=0; for (i=0; i<10; i++) printf
("%d", p); }
解1-6: 変数の未宣言 void main(void){ int i, p=0; for (i=0; i<10;
i++) printf ("%d", p); } 使っている変数を宣言し ていない。 左の例では i を宣言して いない。
レベル2: 実行時エラー (2問)
問2-1 int s = 0; int t = 3 /
s;
解2-1: ゼロで割り算している。 int s = 0; int t = 3
/ s; 自分が予期しない理由で ある変数が0になってし まい、その変数で除算を してしまう時がある。 この本当の原因は割り算 している部分ではなく、他 の場所で変数が正しく代 入されないことなので、 割り算部分に問題はな い。
問2-2 int i, a[10]; for (i=0; i<=10; i++){ scanf ("%d",
&a[i]); }
解2-2: 配列の範囲外使用 int i, a[10]; for (i=0; i<=10; i++){ scanf
("%d", &a[i]); } int a[10] の 宣 言 は a[0] ~ a[9]を確保するのでa[10] は存在しない。 このエラーは一応レベル 2に入れたが、実行時に エラーが出ないこともあ る(つまりレベル3の場合 がある)ので注意。
レベル3: エラー表示されない (間違った結果になる) (6問)
問3-1 int a=3, b=5; printf ("%f\n", a / b);
解3-1: 数値型の誤り int a=3, b=5; printf ("%f\n", (double) a /
b); 特に割り算において、小数点 以下も必要なのに整数型を 整数型で割ってしまう。 左の例の場合、%fのように実 数で表示させようとしても、 表示させる以前の a / b を計 算した瞬間に 0 になる(割る 数と割られる数の両方が整 数だと答えは必ず整数で計 算しようとする)。
問3-2 double r = 0.0; while (r != 1.0) {
... r += 0.1; }
解3-2: 実数による条件分岐 実数には若干の誤差が 出るので、条件判断(if, for, while) に実数を使う時は 注意しないといけない。 左の例では、r がぴったり
1 にならない可能性が高 いので、正しく動作しない 可能性が高い。 double r = 0.0; while (r != 1.0) { ... r += 0.1; }
問3-3 int a; a = a + 3;
解3-3: 初期化を忘れる 変数を宣言すると初期 値は0だと思い込んでい ろんな処理をしてしまう。 とても大きくおかしな値 が出力される時はだい たいこれが原因である。 コンパイル時にエラーが 出ない。
int a = 0; a = a + 3;
問3-4 if (a = b) break;
解3-4: "=" と "==" を間違える 初心者にとてもよくある 誤り。左の例の場合、コン パイルでエラーは出ない ことに注意。 if
(a == b) break;
問3-5 for (i = 1; i < 10; i++); printf
("表示\n");
解3-5: ';'のつけすぎ エラーも出ないので初心 者にはかなり気付きにく い。 C言語の「文末」には ; が 必要と覚えていると、左 の例のように
for 文にま でつけてしまう。 for (i = 1; i < 10; i++) printf ("表示\n");
問3-6 // aが 0 以外なら"表示2"を表示させたい if (a == 0) if
(b == 0) printf ("表示1"); else printf ("表示2"); }
解3-6: if と else の対応 前スライドのプログラムは問題な さそうだが、「表示2」が表示され るのはaが0でbが0以外の時( ) ※
で あり、決してaが0以外の時ではな い。つまり else は一番近い if に対 する else である。また、字下げ(イ ンデント)にだまされてもいけな い。(コンパイラにとって字下げは 関係ない) ※のようにしたいのであれば左の ようにすればよい。誤解を減らす ために if文には常に {...} をつける ことを推奨する。 // aが 0 以外なら"表示2"を表示させたい if (a == 0) { if (b == 0) { printf ("表示1"); } } else { printf ("表示2"); }
レベル4: アルゴリズムの誤り (0問)
アルゴリズムの誤り • そもそもプログラム以前にアルゴリズムが間 違っている場合。 – 例えば、4行4列の行列式にサラスの方法を用い る、など。 • 自分では正しいと思っているからそのアルゴリズ ムを使用しているため、間違いに最も気付きにく
い。 – 検証可能な出力をする、などの方法で確認するし かなく、場合によっては検証できない問題もあ る。
おわりに
間違いを減らすために • エラーが出ている場合は、エラーメッセージをよ く読む – 英語の場合は読むのが大変だが、それでも読ん だほうが近道だ • エラーが出ない誤りの場合は、このスライドで紹 介したような誤りをよく記憶しておく
– 出力結果が何かおかしいと感じた時に、「気付き にくいエラー」をしていないかよく考える
本スライドに関する照会先 山本 和英 長岡技術科学大学 電気系
[email protected]
このスライドは 2012年4月23日に作成しました。