• 締切済み

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

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • C言語で 小文字を大文字に変えるプログラム

    C言語で小文字を大文字に変えるプログラムを造ったのですが、エラーが出てしまいます。 どこが間違っているのか教えてください。 #include<stdio.h> main() { char a[100]; scanf(%c,&a[i]); int i=0; while(i<100){ i++; if(a[i]>60){ printf("%x-20",a[i]); }else{ printf("%x",a[i]) } } }

  • C言語プログラム

    したのプログラムでgetch()の代わりにscanf()を使って、入力した数が負なら終了、正なら"次の数を入力してください"と表示してループを続けるプログラムを作りたいのですが、どこを変えればよいのですか? #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c='m'; while(c!='e')//eでない限りwhileループを実行する { sum=sum+i; printf("\n1 kara %d madewo tasuto %d desu.\n",i,sum); i++; printf("nanikakeywo oshitekudasai.owaru tokiha 'e'\n"); c=getch(); } printf("loopwo nukemashita\n"); getch(); }

  • c言語のプログラムで

    c言語で 2つの整数を読み込んで小さいほうの数以上で大きいほうの数以下の整数をすべて加えた値を表示するプログラム で最後の表示の仕方がわかりません。 実行結果は 整数1:37 整数2:28 28以上37以下の全整数は325です。と表示されるはずです。 この表示の3行目の28と37の表示がどうやればよいのかわかりません。 #include <stdio.h> int main(void) { int a, b; int sum=0; printf("整数1:"); scanf("%d",&a); printf("整数2:"); scanf("%d",&b); if(a>b) do{ sum=sum+b; b=b+1; }while(b<=a); else do{ sum=sum+a; a=a+1; }while(a<=b); printf("%d以上%d以下の全整数の和は%dです。",a,b,sum); return(0); } 全整数の表示はできます。 do文の中でa=cとかにしてやってみましたが、うまくいきませんでした。 お願いします。

  • またプログラムの修正おねがいします。

    キーボードから出力した3つの整数について、以下の判定を行い 判定結果を出力するプログラムを作成する。 全部同じ 2つ同じ バラバラ * 論理演算子を使わないこと。 * インデントを正しくつけること。 #include<stdio.h> void main(void) { int a,b,c; printf("a --->"); scanf("%d",$a); printf("b --->"); scanf("%d",$b); printf("c --->"); scanf("%d",$c); if(a==b){ if(b==c){ printf("全部同じ\n"); } } else if(a!=b){ if(b==c){ printf("2つ同じ"); } else if(a==c){ printf("2つ同じ"); } else{ printf("バラバラ"); } } } 最近c言語を習ったばっかりなのでわからないとこだらけです。よろしくお願いします。

  • C言語プログラム

    2つの整数を入力させ、それらが等しい場合hitoshii、異なる場合にはhitoshikunaiと出力するプログラムを作りたいのですが、うまくいきません。間違っているところを教えてください。 #include<stdio.h> #include<conio.h> void main() { printf("整数を入力してください:"); int number1; scanf("%d",number1); printf("整数を入力してください:"); int number2; scanf("%d",number2); if(number1==number2) { printf("hitoshii"); } else { printf("hitoshikunai"); } getch(); }

  • このC言語プログラムでどこをいじればいいのか教えて下さい。

    このC言語プログラムでどこをいじればいいのか教えて下さい。 //2 つの整数を入力し、和、差、積、商を計算し表示する。 #include<stdio.h> int main(void) { int a,b,wa,sa,seki,syou; scanf("%d %d",&a,&b); wa=a+b; sa=a-b; seki=a*b; syou=a/b; printf("%d+%d=%d\n",a,b,wa); printf("%d-%d=%d\n",a,b,sa); printf("%d*%d=%d\n",a,b,seki); printf("%d/%d=%d\n",a,b,syou); return (0); } これを繰り返し実行する形にしたいです。できれば今勉強中のwhileでお願いします。 また間違っている部分、指摘などありましたら宜しくお願いします。 大きな値をいれると足し算がダメになったり、割り算がおかしくなります。 また実数の時はどうなのかなど教えて下さい。

  • c言語について

    C言語で、二つの整数値を読み込んで、前者の値が後者の何%であるかを実数で表示するプログラムを作成しようとして以下のコードを書きました。 #include <stdio.h> int main(void) { int n1, n2 ; puts("二つの整数を入力してください。") ; printf("整数A : \n") ; scanf("%d" , &n1) ; printf("整数B : \n") ; scanf("%d" , &n2) ; printf("Aの値はBの%f%%です。\n" , (double)(n1 / n2) * 100) ; return 0 ; } 上記コードを実行すると、0.000000%のような結果になります。 そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 なぜ、上記コードだと上手くいかないんでしょうか?

  • Cのプログラム(初心者)

    #include<stdio.h> void main(void) { int a,b,c; printf("西暦で生まれた年を入力してください。\n"); scanf("%d",&a); printf("今の年を西暦で入力してください。\n"); scanf("%d",&b); c=b-a; if('0'<=c&&c<='23'){ printf("あなたは%d歳です。げんき。\n",c); } else if('24'<=c&&c<='40'){ printf("あなたは%d歳です。仕事盛り。\n",c); } else if('41'<=c&&c<='60'){ printf("あなたは%d歳です。まだいける。\n",c); } else if('61'<=c&&c<='99'){ printf("あなたは%d歳です。がんばれ。\n",c); } else{ printf("100歳以上なの?\n"); } } というプログラムを作っているのですが、うまく実行できません。間違いがあると思うのですが、それもよくわかりません。ビルドは成功するのですが、どの数字を入力しても「げんき」しか出てきません。 わかる人がいたら教えてください。 お願いします。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

専門家に質問してみよう