- ベストアンサー
低次元なコーディング方法について
私は一通り書籍でC言語の基礎を勉強しただけの初心者プログラマです。 もっと実力を付けるためにアルゴリズム関連の書籍をいくつか読み始めました。 これならソースを読む力も一緒に鍛えられると思ったからです。 その中で素数を表示するプログラムに興味を持ち自力で一から組んでみました。 (途中でどうしても分からず参考にする部分もあったのですが…) 私のコーディング手順は 1.UMLのアクティビティ図で大まかな処理を確認する。 2.if文だけで一通りの処理を記述。 3.while文を使って繰り返しの処理を追加する。 4.何度もうまくいかずにそのたびに修正していく。 というものです。 1.の部分は大量に書籍が出ているので勉強できるのですがUMLの性質上 それをコーディングしていく解説はどうしてもCのソースを書くこととは次元が違うようです。 かなり低次元なことだからでしょうか、解説している本にも出会えません。 前置きが長くなりました。 今回教えていただきたいのは ・アクティビティ図などで記述したものをソースコードに落とし込む というかなり低レベルな部分での方法です。 私はオブジェクト指向はまだ勉強していないので Cでその過程などを書いていただけると幸いです。 どうやったらgoto文やフラグを使わずにソースを書けるか、 コツなどあったらぜひ教えてください。 アドバイスの参考になればよいと思い、私が書いた素数表示プログラムの一部を紹介させていただきます。 /**********************************************************/ /* 素数を格納する配列を受け取り最後に-1を格納する関数 */ /* 効率的な演算のために乗除演算回数を表示もおこなう */ /**********************************************************/ #define END (-1) #define MAX 1000 void prime_assess(int a[]) { int j=0; //ループ用のカウンタ int x=3; //検証値 int element_no=1;//配列の中の素数の個数 int arithmetic_no=0;//乗除演算回数 while(x<MAX){ j=0; arithmetic_no++; while(x % a[j] !=0 && a[element_no-1] != x){ arithmetic_no++; if(a[j]-a[j] >= x){ a[element_no++] = x; }else{ j++; } } x += 2; } a[element_no] = END; printf("乗除演算回数は%dでした。\n",arithmetic_no); } 先ほどの1~4のプロセスで作りました。 できるだけ無駄な演算を避けてみたつもりですがいかかでしょうか。 フラグなどを避けるよう、かなり時間をかけて書いたプログラムです。 乗除演算回数はおそらく2636回になっています。 自分以外の方にソースを見ていただける機会がないものですから、 これはおかしいぞというところも書いていただけたらうれしいです。 皆様からのアドバイスをお待ちしております。
- みんなの回答 (8)
- 専門家の回答
お礼
aid-uさん、ありがとうございます。 HPを見ながら擬似コードの使い方が分かってきました。 サンプルがJavaでテーマも再帰を使っていたので 後半は苦労しましたが。^_^} 私自身がフローチャートやUMLばかりにこだわりすぎていたのが よくなかったのですね。 もしC言語を主に使って擬似コードを書いたり、そこからコーディングしていくような内容の書籍 (私が調べたら「珠玉のプログラミング」が一番その要望に沿っているようでした) が合ったらぜひ教えてください。