SlideShare a Scribd company logo
1 of 39
Download to read offline
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;            左の例では i を宣言して
                         いない。
  for (i=0; i<10; i++)
    printf ("%d", p);
}
レベル2:

実行時エラー
  (2問)
問2-1
int s = 0;
int t = 3 / s;
解2-1: ゼロで割り算している。
int s = 0;       自分が予期しない理由で
                 ある変数が0になってし
int t = 3 / s;   まい、その変数で除算を
                 してしまう時がある。
                 この本当の原因は割り算
                 している部分ではなく、他
                 の場所で変数が正しく代
                 入されないことなので、
                 割り算部分に問題はな
                 い。
問2-2
int i, a[10];
for (i=0; i<=10; i++){
   scanf ("%d", &a[i]);
}
解2-2: 配列の範囲外使用
int i, a[10];             int a[10] の 宣 言 は a[0] ~
                          a[9]を確保するのでa[10]
for (i=0; i<=10; i++){    は存在しない。
   scanf ("%d", &a[i]);   このエラーは一応レベル
                          2に入れたが、実行時に
}                         エラーが出ないこともあ
                          る(つまりレベル3の場合
                          がある)ので注意。
レベル3:

 エラー表示されない
(間違った結果になる)
    (6問)
問3-1
int a=3, b=5;
printf ("%fn", a / b);
解3-1: 数値型の誤り
int a=3, b=5;        特に割り算において、小数点
                     以下も必要なのに整数型を
                     整数型で割ってしまう。
printf ("%fn",      左の例の場合、%fのように実
  (double) a / b);   数で表示させようとしても、
                     表示させる以前の a / b を計
                     算した瞬間に 0 になる(割る
                     数と割られる数の両方が整
                     数だと答えは必ず整数で計
                     算しようとする)。
問3-2
double r = 0.0;
while (r != 1.0) {
  ...
  r += 0.1;
}
解3-2: 実数による条件分岐
double r = 0.0;      実数には若干の誤差が
                     出るので、条件判断(if, for,
while (r != 1.0) {   while) に実数を使う時は
                     注意しないといけない。
  ...                左の例では、r がぴったり
                     1 にならない可能性が高
  r += 0.1;          いので、正しく動作しない
}                    可能性が高い。
問3-3
int a;
a = a + 3;
解3-3: 初期化を忘れる
int a = 0;   変数を宣言すると初期
             値は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: ';'のつけすぎ
for (i = 1; i < 10; i++)   エラーも出ないので初心
                           者にはかなり気付きにく
   printf ("表示n");        い。
                           C言語の「文末」には ; が
                           必要と覚えていると、左
                           の例のように for 文にま
                           でつけてしまう。
問3-6
// aが 0 以外なら"表示2"を表示させたい

if (a == 0)
    if (b == 0)
       printf ("表示1");
else
    printf ("表示2");
}
解3-6: if と else の対応
// aが 0 以外なら"表示2"を表示させたい   前スライドのプログラムは問題な
                           さそうだが、「表示2」が表示され
if (a == 0) {              るのはaが0でbが0以外の時(※)で
                           あり、決してaが0以外の時ではな
    if (b == 0) {          い。つまり else は一番近い if に対
                           する else である。また、字下げ(イ
        printf ("表示1");    ンデント)にだまされてもいけな
    }                      い。(コンパイラにとって字下げは
                           関係ない)
} else {                   ※のようにしたいのであれば左の
                           ようにすればよい。誤解を減らす
    printf ("表示2");        ために if文には常に {...} をつける
                           ことを推奨する。
}
レベル4:

アルゴリズムの誤り
   (0問)
アルゴリズムの誤り
●
    そもそもプログラム以前にアルゴリズムが間
    違っている場合。
     –   例えば、4行4列の行列式にサラスの方法を用い
          る、など。
●
    自分では正しいと思っているからそのアルゴリズ
    ムを使用しているため、間違いに最も気付きにく
    い。
     –   検証可能な出力をする、などの方法で確認するし
          かなく、場合によっては検証できない問題もあ
          る。
おわりに
間違いを減らすために
●
    エラーが出ている場合は、エラーメッセージをよ
    く読む
     –   英語の場合は読むのが大変だが、それでも読ん
          だほうが近道だ
●
    エラーが出ない誤りの場合は、このスライドで紹
    介したような誤りをよく記憶しておく
     –   出力結果が何かおかしいと感じた時に、「気付き
          にくいエラー」をしていないかよく考える
本スライドに関する照会先

山本 和英
長岡技術科学大学 電気系
yamamoto@jnlp.org


このスライドは 2012年4月23日に作成しました。

More Related Content

What's hot

【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~Unity Technologies Japan K.K.
 
Code Formula 予選B 解説
Code Formula 予選B 解説Code Formula 予選B 解説
Code Formula 予選B 解説AtCoder Inc.
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]DeNA
 
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
Msを16倍出し抜くwpf開発1回目
Msを16倍出し抜くwpf開発1回目Msを16倍出し抜くwpf開発1回目
Msを16倍出し抜くwpf開発1回目cct-inc
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
チケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdfチケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdfYokoba
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話ichirin2501
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説AtCoder Inc.
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理torisoup
 
Indeedなう 予選B 解説
Indeedなう 予選B 解説Indeedなう 予選B 解説
Indeedなう 予選B 解説AtCoder Inc.
 
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)ozlael ozlael
 

What's hot (20)

【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
 
Code Formula 予選B 解説
Code Formula 予選B 解説Code Formula 予選B 解説
Code Formula 予選B 解説
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
 
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
 
Msを16倍出し抜くwpf開発1回目
Msを16倍出し抜くwpf開発1回目Msを16倍出し抜くwpf開発1回目
Msを16倍出し抜くwpf開発1回目
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
チケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdfチケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdf
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
ABC001 解説
ABC001 解説ABC001 解説
ABC001 解説
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
UE4とUnrealC++について
UE4とUnrealC++についてUE4とUnrealC++について
UE4とUnrealC++について
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめUnreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
 
Indeedなう 予選B 解説
Indeedなう 予選B 解説Indeedなう 予選B 解説
Indeedなう 予選B 解説
 
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
뭣이 중헌디? 성능 프로파일링도 모름서 - 유니티 성능 프로파일링 가이드 (IGC16)
 

Viewers also liked

DevLOVE関西2012 B-2「メンバーの行動が激変!「ペアふりかえり」ワークショップ
DevLOVE関西2012 B-2「メンバーの行動が激変!「ペアふりかえり」ワークショップ DevLOVE関西2012 B-2「メンバーの行動が激変!「ペアふりかえり」ワークショップ
DevLOVE関西2012 B-2「メンバーの行動が激変!「ペアふりかえり」ワークショップ takepu
 
上級救命技能認定
上級救命技能認定上級救命技能認定
上級救命技能認定Tetsuya Yoshida
 
デザインパターン勉強会
デザインパターン勉強会デザインパターン勉強会
デザインパターン勉強会Tetsuya Yoshida
 
XP寺子屋第9回「シンプル・プログラミング」
XP寺子屋第9回「シンプル・プログラミング」XP寺子屋第9回「シンプル・プログラミング」
XP寺子屋第9回「シンプル・プログラミング」takepu
 
命名規則のススメ
命名規則のススメ命名規則のススメ
命名規則のススメnatrium11321
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 

Viewers also liked (7)

DevLOVE関西2012 B-2「メンバーの行動が激変!「ペアふりかえり」ワークショップ
DevLOVE関西2012 B-2「メンバーの行動が激変!「ペアふりかえり」ワークショップ DevLOVE関西2012 B-2「メンバーの行動が激変!「ペアふりかえり」ワークショップ
DevLOVE関西2012 B-2「メンバーの行動が激変!「ペアふりかえり」ワークショップ
 
上級救命技能認定
上級救命技能認定上級救命技能認定
上級救命技能認定
 
デザインパターン勉強会
デザインパターン勉強会デザインパターン勉強会
デザインパターン勉強会
 
XP寺子屋第9回「シンプル・プログラミング」
XP寺子屋第9回「シンプル・プログラミング」XP寺子屋第9回「シンプル・プログラミング」
XP寺子屋第9回「シンプル・プログラミング」
 
C言語講習会1
C言語講習会1C言語講習会1
C言語講習会1
 
命名規則のススメ
命名規則のススメ命名規則のススメ
命名規則のススメ
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 

Similar to C言語よくある誤り (15)

#6:実数と繰り返し
#6:実数と繰り返し#6:実数と繰り返し
#6:実数と繰り返し
 
C言語の課題を(エクストリームに)解こう #1
C言語の課題を(エクストリームに)解こう #1C言語の課題を(エクストリームに)解こう #1
C言語の課題を(エクストリームに)解こう #1
 
#7:演算子と分岐
#7:演算子と分岐#7:演算子と分岐
#7:演算子と分岐
 
講座C入門
講座C入門講座C入門
講座C入門
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第3回 ‟条件とループ„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第3回 ‟条件とループ„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第3回 ‟条件とループ„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第3回 ‟条件とループ„
 
プログラマ講習第2回
プログラマ講習第2回プログラマ講習第2回
プログラマ講習第2回
 
C言語講習会2
C言語講習会2C言語講習会2
C言語講習会2
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
会津合宿2015Day3:D問題
会津合宿2015Day3:D問題会津合宿2015Day3:D問題
会津合宿2015Day3:D問題
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
Okinawapm #1
Okinawapm #1Okinawapm #1
Okinawapm #1
 
20081120 lt11th ace
20081120 lt11th ace20081120 lt11th ace
20081120 lt11th ace
 
プログラミング
プログラミングプログラミング
プログラミング
 
Lt会01_uetch
Lt会01_uetchLt会01_uetch
Lt会01_uetch
 

More from 長岡技術科学大学 自然言語処理研究室

More from 長岡技術科学大学 自然言語処理研究室 (20)

小学生の読解支援に向けた複数の換言知識を併用した語彙平易化と評価
小学生の読解支援に向けた複数の換言知識を併用した語彙平易化と評価小学生の読解支援に向けた複数の換言知識を併用した語彙平易化と評価
小学生の読解支援に向けた複数の換言知識を併用した語彙平易化と評価
 
小学生の読解支援に向けた語釈文から語彙的換言を選択する手法
小学生の読解支援に向けた語釈文から語彙的換言を選択する手法小学生の読解支援に向けた語釈文から語彙的換言を選択する手法
小学生の読解支援に向けた語釈文から語彙的換言を選択する手法
 
Selecting Proper Lexical Paraphrase for Children
Selecting Proper Lexical Paraphrase for ChildrenSelecting Proper Lexical Paraphrase for Children
Selecting Proper Lexical Paraphrase for Children
 
Automatic Selection of Predicates for Common Sense Knowledge Expression
Automatic Selection of Predicates for Common Sense Knowledge ExpressionAutomatic Selection of Predicates for Common Sense Knowledge Expression
Automatic Selection of Predicates for Common Sense Knowledge Expression
 
用言等換言辞書を用いた換言結果の考察
用言等換言辞書を用いた換言結果の考察用言等換言辞書を用いた換言結果の考察
用言等換言辞書を用いた換言結果の考察
 
用言等換言辞書の構築
用言等換言辞書の構築用言等換言辞書の構築
用言等換言辞書の構築
 
質問意図によるQAサイト質問文の自動分類
質問意図によるQAサイト質問文の自動分類質問意図によるQAサイト質問文の自動分類
質問意図によるQAサイト質問文の自動分類
 
役所からの公的文書に対する「やさしい日本語」への変換システムの構築
役所からの公的文書に対する「やさしい日本語」への変換システムの構築役所からの公的文書に対する「やさしい日本語」への変換システムの構築
役所からの公的文書に対する「やさしい日本語」への変換システムの構築
 
対訳コーパスから生成したワードグラフによる部分的機械翻訳
対訳コーパスから生成したワードグラフによる部分的機械翻訳対訳コーパスから生成したワードグラフによる部分的機械翻訳
対訳コーパスから生成したワードグラフによる部分的機械翻訳
 
用言等換言辞書を人手で作りました
用言等換言辞書を人手で作りました用言等換言辞書を人手で作りました
用言等換言辞書を人手で作りました
 
文字列の出現頻度情報を用いた分かち書き単位の自動取得
文字列の出現頻度情報を用いた分かち書き単位の自動取得文字列の出現頻度情報を用いた分かち書き単位の自動取得
文字列の出現頻度情報を用いた分かち書き単位の自動取得
 
「やさしい日本語」変換システムの試作
「やさしい日本語」変換システムの試作「やさしい日本語」変換システムの試作
「やさしい日本語」変換システムの試作
 
常識表現となり得る用言の自動選定の検討
常識表現となり得る用言の自動選定の検討常識表現となり得る用言の自動選定の検討
常識表現となり得る用言の自動選定の検討
 
動詞意味類型の曖昧性解消に向けた格フレーム情報との関連調査
動詞意味類型の曖昧性解消に向けた格フレーム情報との関連調査動詞意味類型の曖昧性解消に向けた格フレーム情報との関連調査
動詞意味類型の曖昧性解消に向けた格フレーム情報との関連調査
 
二格深層格の定量的分析
二格深層格の定量的分析二格深層格の定量的分析
二格深層格の定量的分析
 
大規模常識知識ベース構築のための常識表現の自動獲得
大規模常識知識ベース構築のための常識表現の自動獲得大規模常識知識ベース構築のための常識表現の自動獲得
大規模常識知識ベース構築のための常識表現の自動獲得
 
文脈の多様性に基づく名詞換言の提案
文脈の多様性に基づく名詞換言の提案文脈の多様性に基づく名詞換言の提案
文脈の多様性に基づく名詞換言の提案
 
保険関連文書を対象とした文章校正支援のための変換誤り検出
保険関連文書を対象とした文章校正支援のための変換誤り検出保険関連文書を対象とした文章校正支援のための変換誤り検出
保険関連文書を対象とした文章校正支援のための変換誤り検出
 
Developing User-friendly and Customizable Text Analyzer
Developing User-friendly and Customizable Text AnalyzerDeveloping User-friendly and Customizable Text Analyzer
Developing User-friendly and Customizable Text Analyzer
 
普通名詞換言辞書の構築
普通名詞換言辞書の構築普通名詞換言辞書の構築
普通名詞換言辞書の構築
 

C言語よくある誤り

  • 1. Cプログラミング よくある誤り 山本 和英 長岡技術科学大学 電気系
  • 2. このスライドは... ● C言語プログラミング初心者を対象に作成して います。 ● C言語でよく見かける誤り(計14種類)をレベル 別に例示し、解説しています。 – 解答を見る前に、何が誤りかを自分で考えてみて ください。 ● このスライドに書かれている誤りを一通り覚える ことでかなりの初歩的なミスを回避できると思 います。
  • 3. 誤りには4段階ある ● レベル1: コンパイルエラー – コンパイルできないのですぐに気付く ● レベル2: 実行時エラー – 実行中にエラーが出てプログラムが停止 ● レベル3: エラー表示されない – 正しくない出力が出るだけなので気付きにくい ● レベル4: アルゴリズムの誤り – 最も気付きにくい
  • 5. 問1-1 if (a < b) brake; どこかに間違いがあるので (以下同様)、次のスライドを 見る前に、何が誤りなのかを 考えてみてください。
  • 6. 解1-1: スペルミス if (a < b) break; break; や continue; など、つ づりを間違う。
  • 8. 解1-2: 見間違い int o, p, q; 0(ゼロ)と O(オー)、1(いち) と l(エル)などを間違う。 表示しているフォントに よってはほとんど見分け がつかない場合もある。 なお、O(オー)やl(エル)と いう変数が宣言されて いるとコンパイルエラー は出ないので、難易度が レベル2にアップする。
  • 10. 解1-3: 記号忘れ printf ("Hello!!"); 閉じ括弧"}"やセミコロン ";"を忘れる。 左の例では文末のセミコ ロン ; を忘れている。
  • 11. 問1-4 for (i=1, i<10, i++) printf ("%d", i):
  • 12. 解1-4: 記号間違い for (i=1; i<10; i++) コンマ"," コロン":" セミコ ロン";"の使い方を間違え printf ("%d", I); る。左の例では、 ● for文の , →; ● printf の最後 :→; の2つ(3ヶ所)が間違い。
  • 14. 解1-5: 全角スペース i = i + 1; コメントやprintf ("...")以外 に全角スペース(「 」)が (うっかり)入力されてい る。これは(当然ながら)見 た目では全く分からない のでエラーメッセージで 判断するしかない。 前のスライドでも文中に 全角スペースが入ってい る。
  • 15. 問1-6 void main(void){ int p=0; for (i=0; i<10; i++) printf ("%d", p); }
  • 16. 解1-6: 変数の未宣言 void main(void){ 使っている変数を宣言し ていない。 int i, p=0; 左の例では i を宣言して いない。 for (i=0; i<10; i++) printf ("%d", p); }
  • 18. 問2-1 int s = 0; int t = 3 / s;
  • 19. 解2-1: ゼロで割り算している。 int s = 0; 自分が予期しない理由で ある変数が0になってし int t = 3 / s; まい、その変数で除算を してしまう時がある。 この本当の原因は割り算 している部分ではなく、他 の場所で変数が正しく代 入されないことなので、 割り算部分に問題はな い。
  • 20. 問2-2 int i, a[10]; for (i=0; i<=10; i++){ scanf ("%d", &a[i]); }
  • 21. 解2-2: 配列の範囲外使用 int i, a[10]; int a[10] の 宣 言 は a[0] ~ a[9]を確保するのでa[10] for (i=0; i<=10; i++){ は存在しない。 scanf ("%d", &a[i]); このエラーは一応レベル 2に入れたが、実行時に } エラーが出ないこともあ る(つまりレベル3の場合 がある)ので注意。
  • 23. 問3-1 int a=3, b=5; printf ("%fn", a / b);
  • 24. 解3-1: 数値型の誤り int a=3, b=5; 特に割り算において、小数点 以下も必要なのに整数型を 整数型で割ってしまう。 printf ("%fn", 左の例の場合、%fのように実 (double) a / b); 数で表示させようとしても、 表示させる以前の a / b を計 算した瞬間に 0 になる(割る 数と割られる数の両方が整 数だと答えは必ず整数で計 算しようとする)。
  • 25. 問3-2 double r = 0.0; while (r != 1.0) { ... r += 0.1; }
  • 26. 解3-2: 実数による条件分岐 double r = 0.0; 実数には若干の誤差が 出るので、条件判断(if, for, while (r != 1.0) { while) に実数を使う時は 注意しないといけない。 ... 左の例では、r がぴったり 1 にならない可能性が高 r += 0.1; いので、正しく動作しない } 可能性が高い。
  • 28. 解3-3: 初期化を忘れる int a = 0; 変数を宣言すると初期 値は0だと思い込んでい a = a + 3; ろんな処理をしてしまう。 とても大きくおかしな値 が出 力さ れる 時は だ い たいこれが原因である。 コンパイル時にエラーが 出ない。
  • 29. 問3-4 if (a = b) break;
  • 30. 解3-4: "=" と "==" を間違える if (a == b) break; 初心者にとてもよくある 誤り。左の例の場合、コン パイルでエラーは出ない ことに注意。
  • 31. 問3-5 for (i = 1; i < 10; i++); printf ("表示n");
  • 32. 解3-5: ';'のつけすぎ for (i = 1; i < 10; i++) エラーも出ないので初心 者にはかなり気付きにく printf ("表示n"); い。 C言語の「文末」には ; が 必要と覚えていると、左 の例のように for 文にま でつけてしまう。
  • 33. 問3-6 // aが 0 以外なら"表示2"を表示させたい if (a == 0) if (b == 0) printf ("表示1"); else printf ("表示2"); }
  • 34. 解3-6: if と else の対応 // aが 0 以外なら"表示2"を表示させたい 前スライドのプログラムは問題な さそうだが、「表示2」が表示され if (a == 0) { るのはaが0でbが0以外の時(※)で あり、決してaが0以外の時ではな if (b == 0) { い。つまり else は一番近い if に対 する else である。また、字下げ(イ printf ("表示1"); ンデント)にだまされてもいけな } い。(コンパイラにとって字下げは 関係ない) } else { ※のようにしたいのであれば左の ようにすればよい。誤解を減らす printf ("表示2"); ために if文には常に {...} をつける ことを推奨する。 }
  • 36. アルゴリズムの誤り ● そもそもプログラム以前にアルゴリズムが間 違っている場合。 – 例えば、4行4列の行列式にサラスの方法を用い る、など。 ● 自分では正しいと思っているからそのアルゴリズ ムを使用しているため、間違いに最も気付きにく い。 – 検証可能な出力をする、などの方法で確認するし かなく、場合によっては検証できない問題もあ る。
  • 38. 間違いを減らすために ● エラーが出ている場合は、エラーメッセージをよ く読む – 英語の場合は読むのが大変だが、それでも読ん だほうが近道だ ● エラーが出ない誤りの場合は、このスライドで紹 介したような誤りをよく記憶しておく – 出力結果が何かおかしいと感じた時に、「気付き にくいエラー」をしていないかよく考える