「Cベース」プログラミングの習慣とコツ

2940 ワード

Tips
  • アルゴリズムを学習する最良の方法はプログラムを書くのではなく、手算
  • である.
  • 決して速くしないでください——もし十分な時間が実践に来なければ、学ぶのが速くて、忘れるのも速くて
  • 手動シミュレーションの方法は、各文の実行後の各変数の値
  • を記録することに重点を置く.
  • ブラックボックステスト:問題を解決する能力だけを考察し、どのような方法を採用したかに関心を持たない
  • 擬似コード:実際の応用では擬似コードのフォーマットにあまりこだわらず、主な目的はアルゴリズムの概要を記述し、詳細を避け、構想を啓発することである
  • 変数の定義範囲
  • をできるだけ短くする.
  • 変数は、値が付与されない前に不確定であり、特に、0
  • に等しいとは限らない.
  • Keep It Simple and Stupid保持プログラム単純
  • 0.パイプ機構
    作用:異なるプログラムを直列に接続する例えば:プログラムaplusb作用は2つの整数a,bを読み込み、a+bを返す値プログラムsqr作用は1つの整数aを読み込み、a*aを返す値はパイプメカニズムで表す
  • echo 10 20 | ./aplusb | ./sqr
  • 形式echo | ./ | ./ …
  • 1.正確な数値
    const double pi = acos(-1.0); //    π   
    //      aabb      。  :a     1 ~ 9,  b    0 
    //   : 
    for(int a=0; a<=9; a++) 
    { 
      for(int b=0; b<=9; b++) 
      { 
        int n = a*1100+b*11; 
        int m = floor(sqrt(n)+0.5); 
        if(m*m == n) printf(“%d
    ”, n);   } } //floor , //floor(x+0.5) 0.5 // if( sqrt(n) == floor(sqrt(n)) ) printf(“%d
    ”,n); // : for(int x=1; ;x++) {   int n = x*x;   if (n < 1000) continue;   if (n > 9999) break;   int hi = n/100;   int lo = n%100;   if(hi/10 == hi%10 && lo/10 == lo%10) printf(“%d”,n); }

    2.入出力フレーム
    入出力毎に標準入力「キーボード入力」出力「ディスプレイ出力」が煩雑すぎる入出力データをファイルに格納する煩雑さを避ける
    //      ,        、       (  3   ) 
    //            1000    
    //   :    
    #define LOCAL //  :                  LOCAL 
    #include
    #define INF 1000000000 
    int main() 
    { 
      #ifdefin LOCAL 
      freopen("data.in","r",stdin);//                 
      freopen("data.out","w",stdout);//                 
    #endif 
      int x,n=0,min=INF,max=-INF,s=0; 
      while(scanf("%d",&x) == 1) 
      { 
        s += x; 
        if(xmax) max = x; 
        //printf("x=%d, min=%d, max=%d
    ", x, min, max);     n++;   }   printf("%d %d %.3f
    ", min, max, (double)s/n);   return 0; } // :fopen #include #define INF 1000000000 int main() {   FILE fin, fout;   fin = fopen("data.in","rb");//fopen   fout = fopen("data.out","wb");//fin = stdin   int x, n=0, min = INF, max = -INF, s=0;   while(fscanf(fin, "%d", &x) == 1)   {     s += x;     if(x < min) min = x;     if(x > max) max = x;     n++;   }   fprintf(fout, "%d %d %.3f
    ", min, max, (double)s/n);   fclose(fin);   fclose(fout);   return 0; }

    3.詳細注意
    C言語ではデータの種類が異なるため、関係演算子==と!厳格な規定があり、データ型と数値サイズを同時に考慮しなければならない.
    4.セグメントについて
    セグメント:バイナリファイル内の領域で、すべての特定のタイプの情報が保存されます.
    4.1実行可能ファイル
  • 本文セグメント:格納命令
  • データセグメント:グローバル変数「初期化済み」
  • を格納
  • BSSセグメント:グローバル変数を格納するために必要な空間「初期化されていない」
  • 4.2運転時
  • スタックセグメント:プログラムが動的に作成され、関数呼び出し関係とローカル変数
  • が保存されます.
    したがって、
  • スタックオーバーフローは、必ずしも再帰呼び出しが多すぎるとは限らないし、局所変数が大きすぎる
  • である可能性もある.