• 締切済み

C言語のプログラムを作りました。

以下のプログラムは動くかどうか、確認して頂けませんか? おかしい部分があれば指摘して下さい。 また、自分で考えたのですが、このプログラムはどのように考えられたのか、作成方針は考えられますでしょうか? なぜ聞くかというと、皆さんが考えられるように自分も考えているのかどうか、作成方針を聞くことにより判断したいのです。 →作成方針を記述の上、プログラムについてご指摘の方、よろしくお願い致します。 #include<stdio.h> main() { int a,b,c; b=0; c=1; printf("a="); scanf("&d",&a); do{ c=c+1; b=a%c; }while(!(b==0)); if(c==a); printf("sosu-desu n); }else{ printf("sosu-denai n); } }

みんなの回答

  • V-bravo-U
  • ベストアンサー率51% (155/301)
回答No.10

製作方針の話題に便乗させて頂きます。よって、質問者の回答になっていないことをご了承下さい。 C言語は基本的に他人に見せるものでなければどのように書いてもいいので 製作方針も自由でいいはずです。しかし、「自由」があるだけに「制限」も それなりにつきまといます。 推奨する製作方針1:演算子の間には半角スペースを入れること 「b=a%c;」とありますがこれを「b = a % c;」にすることです。 なぜかと言いますと、次のような書き方をするととんでもないことになります。 int Function1(int *a,int *b) { int c=*b/*a; return(c); } これはコンパイルエラーとなります。なぜでしょう。 あえて「なぜなのか」は書きません。コンパイルすれば単純明快だからです。 推奨する製作方針2:日本人がC言語するなら「//」はやめよう はっきり言って極論です。しかし、悲劇が訪れるとも限りません。私は経験したので たとえC++であっても「//」でコメントを書くのは嫌います。次のソースを見て下さい。 int Function2(int a) { int b; //戻り値用 if(a > 0) //表か裏か? b = 1; //表 else b = 0; //裏 return(b); //結果を返す } 何の変哲もないANSI-Cに則ったような書き方ですが、実はコンパイラ依存です。賢い コンパイラなら表も裏もちゃんと判定してくれますが、S-JISを採用しているOSで 一部のコンパイラでコンパイルすると裏しか判定されないという落とし穴に陥ります。 あと、複数行マクロでコメントを振る際も「//」が使えないというのもあります。 この理由から使用制限のない古の「/* */」を使うのがよろしいと考えているわけです。 ここでも本当の「なぜなのか」は書きませんがヒントは「お金」です。 推奨する製作方針3:ifとかforとかwhileとかのループは{}で囲む 一行だけならいいじゃん♪書くのめんどくさいし・・・。 で、済まされるだけの問題ならいいのですが、完成に近くなるとなにかと修正に修正が 重なるものです。そのときに例えばifの後ろが一行しかなく、その直後にさらに1行 書き加えて違う動作して・・・デバッグに時間がかかってしまう原因にもなってしまう でしょう。あと、製作方針2を回避するための手段の一つにもなります。  ん~あとは・・・ってこの3つくらいでしょうか。理由をはしょっていますが、 わからない方はとりあえず体験してみて下さい。そして答えを導いてみて下さい。 一つの勉強になると思って頂けたら幸いです。

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.9

他の方と違う切り口で回答してみますね。 まず、main()関数には型があります。int型です。よくvoidにする人がいますがあんまり良くないです。 で、int型にするなら当然返り値が必要で、一般的には正常終了なら0、エラーで終了した場合は0以外を返してあげるのが普通です。特に何か返す必要性がない場合も最後は return 0; と書くべきです。 それから、scanf()ライブラリ関数を使用していますが、この関数はよほど特殊な場合を除き使用すべきではありません。 理由は、非常に機能が複雑であるのに対し、入力にどのような値が入ってくるのか予測できない(特に人間が手で入力する場合はミスもあるので不確定要素が多い)ため、プログラムが正しくても誤動作をひき起こす要因になる可能性を秘めているからです。 このような単に数値を入力させる場合はgets()とatoi()の組み合わせなどを使うのが一般的なやりかたです。 それと、書き方のスタイルとして、余分なスペースを極力省いているようにお見受けしますが、やはり見やすくするために、演算子と変数の間など、ある程度スペースを入れる方がいいと思います。 あと、これは個人的意見ですが、変数bはいらないと思います。while (a%c!=0) と書いた方が可読性が高いと、私は思います。

noname#5537
noname#5537
回答No.8

作成方針とはどういうことを指してるんでしょうか? こういうことですかね?  a を 2,3,4,… で順番に割ってみて,a を最初に割り切る数を探す。  a を割り切った数が a なら,素数である。 そのまんまですが。 # ところで arukamun さん, # 以前の書き込みでも気になっていたのですが, # それは「エラトステネスのふるい」とは違うのではないでしょうか?

回答No.7

方針といっても、特定のアルゴリズムを使用している プログラムは誰が書いてもほとんど同じになりますので 読み取るのは不可能ですよ。 強いて違いをあげるなら、コーディングの癖 (ループにwhileを使うかforを使うか…など) 程度だと思います。 #6の方の改良案ではdo-whileではなくwhileを 使用していますが、これは単に高速化できるから 使っていると取る人も、趣味と取る人もいるでしょう。 関数を使用していると方針も見えやすいのですが… (例えば、「複数の数の素数判定をする」という方針なら 最低でも素数の判定部分(ループ部分)を関数化する、 というような感じですね。)

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.6

こんにちは、No.3のarukamunです。 方針と言われても、なんて答えれば良いかは解りません。ソースを書く前に方針を決める物でしょう。 エラトステネスのふるいで素数判定をしているんですね。これが方針かな? ところで、無駄な処理が多いですね。 その為、大きな数を与えられると、かなり時間がかかってしまうと思われます。 その辺を直してみてはいかがでしょうか。 とりあえず、出来るだけ変更せずに高速化してみました。 #include<stdio.h> main() {   int a,c;   printf("a=");   scanf("%d",&a);   c = 2 ;   while ( a%c ){     c += c%2+1 ;   }   if ( a > 1 && c == a ){     printf("sosu-desu\n");   }else{     printf("sosu-denai\n");   } } まだまだ、高速化出来るので、考えてみてくださいな。

  • rara_sun
  • ベストアンサー率50% (271/539)
回答No.5

<作成方針(推測)> (1) 入力時のデータとしては、イレギュラーなもの(整数以外)はないという前提 (2) intの扱えるデータ範囲までOK と・・このぐらいの方針しか読みとれなかったのですが・・。 ・do-whileを使う ・ifを使う などは、方針になるのかな・・。 指摘は、みなさんコメントされているので割愛させていただきます。

  • sng
  • ベストアンサー率20% (8/40)
回答No.4

素数かどうか調べるプログラムですか? いくつか文法が間違っていそうでしたので簡単に直しました。 動くかどうかはわかりません、実行してみたほうが早いのでは? #include<stdio.h> main() { int a,b,c; b=0; c=1; printf("a="); scanf("%d",&a); do{ c=c+1; b=a%c; }while(b!=0); if(c==a) printf("sosu-desu n); else printf("sosu-denai n); }

arion_net
質問者

補足

ありがとうございます。 プログラムの作成方針を教えて頂けますか? 私が作ったプログラムに乗っ取って考えるとどのようになりますか? どうか教えててください。 よろしくお願いいたします。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.3

こんにちは まず、 scanf("&d",&a); は scanf("%d",&a); の間違いですね。 次に、 if(c==a); ですが、これでは、if文がここで終わってしまいますので、elseに続かないですよ。 if(c==a){ ですね。 更に、 printf("sosu-desu n); と printf("sosu-denai n); もおかしいですね。 printf("sosu-desu\n"); と printf("sosu-denai\n"); としたかったのでしょうか? これで、文法的な間違いは、見た感じ無くなったと思われます。 あとは、個人の好きずきなのですが、 c=c+1; は c++; でも良いですし、 }while(!(b==0)); は }while(b!=0); という事ですし、更には }while(b); でも、良い場合があります。 C言語は、0が偽、0以外が真です。 とは、言っても解りにくくしてもいけませんので }while(b!=0); が良いと思います。 がんばってください。

arion_net
質問者

補足

ありがとうございます。 プログラムの作成方針を教えて頂けますか? 私が作ったプログラムに乗っ取って考えるとどのようになりますか? どうか教えててください。 よろしくお願いいたします。

  • darksky
  • ベストアンサー率66% (38/57)
回答No.2

正常に動作するかは別にして、 #include<stdio.h> main() { int a,b,c; b=0; c=1; printf("a="); scanf("&d",&a); do{ c=c+1; b=a%c; }while(!(b==0)); if(c==a);         ← ; ではなくて { printf("sosu-desu n); ← 文字列が"で正しく囲われていません。 }else{ printf("sosu-denai n); ← 文字列が"で正しく囲われていません。 } }

arion_net
質問者

補足

質問書き込み時に入力されなかった 文字があるので、修正しました。 バックスラッシュは\としています。 #include<stdio.h> main() { int a,b,c; b=0; c=1; printf("a="); scanf("&d",&a); do{ c=c+1; b=a%c; }while(!(b==0)); if(c==a); printf("sosu-desu\n"); }else{ printf("sosu-denai\n"); } } よろしくお願いいたします。 よろしければ、「作成方針」もよろしくお願いいたします。

  • kazu2021
  • ベストアンサー率11% (32/276)
回答No.1

とりあえずエラーになります。文字列が正しくありません。

arion_net
質問者

補足

質問書き込み時に入力されなかった 文字があるので、修正しました。 バックスラッシュは\としています。 #include<stdio.h> main() { int a,b,c; b=0; c=1; printf("a="); scanf("&d",&a); do{ c=c+1; b=a%c; }while(!(b==0)); if(c==a); printf("sosu-desu\n"); }else{ printf("sosu-denai\n"); } } よろしくお願いいたします。 よろしければ、「作成方針」もよろしくお願いいたします。

関連するQ&A

専門家に質問してみよう