• ベストアンサー

間違いが理解できない!!

下に投稿を行ったばかりですが 質問させてください。 #include<stdio.h> int main(void) { int a; a=3 if(a==a/2*2){ printf("%d is EVEN \n",a); }else{ printf("%d is ODD \n",a); }return(0);} 課題文 「上記のプログラムを改造して、 aが正の場合はPLUSを、 aが負の場合はMINUSを、 aがゼロの場合はZEROを 表示するプログラムを作成し、 実行しよう。」 とあったので、私は #include<stdio.h> int main(void){ int a; printf("変数aに数字を入力してください\n"); printf("a="); scanf("%d",&a); if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } return(0); } と作成しました。 しかし、評価はFAIRでした。(PASS,FAIR,RETRYがあり、 FAIRは「課題を取り違えているがOK.ただし満点じゃない」です) なぜかと言うと、習っていないscanfを使ったかららしく、 課題と違うからだそうです。 習っていないものを使ってはいけないなど聞いてもいませんし、 (私はC言語の知識がある程度あったのでscanfを使いました) 納得いきません。 もし、課題文が、 「上記のプログラムの if文以下を改造して・・・」 となっていたら、私のプログラムは間違いです。 しかし、改造してとしか書いてなかったので、 間違いではないと思います。 皆さんはどうおもいますか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

題意を厳密に捉えるならば、変更すべき「仕様」は判定ロジックであって入出力部分の仕様は変更してはならないと解釈すべきでしょう。 特にお金を頂いて、仕様通りにプログラムを作成するプロのプログラマの場合、厳密にクライアントの提示する仕様に則ってプログラムを改造するスキルも求められます。その際、いくら良かれと思って良い機能を追加したとしても、「仕様が違う」と言われる事があります。特に多人数でプロジェクトを組んで開発を進める場合、良かれと思って加えた仕様変更がとんでもないトラブルを引き起こす事も少なくありません。 もちろん、良かれと思って加えた改造が結果として歓迎される事もあるでしょう。ただし、その場合でも依頼者の意向確認は必須だと考えるべきでしょう。 お気持ちは察しますが、プロのプログラマとしてやって行く場合の厳しさも含めた判定ではないかと思います。

pop-bomb
質問者

お礼

学校の課題なので、 これぐらいのサービスは許される?と思っていました。 私が付けた機能は蛇足だったのかもしれませんね。 プログラムの知識が他の人よりあった分だけ、 損した結果になりました。 まぁ、このプログラムも先生が違えば、 理解してもらえてたのでしょうね。

その他の回答 (5)

  • yukigle
  • ベストアンサー率14% (9/63)
回答No.6

2度も続けて変ですぞ。 ・「この課題を解いてください」が、実に変ですぞ。 習っていない配列とのことですが、文字列は立派な配列ですが。他にも、入力の配列名に「&」や「[0]」がついていますし、配列要素の宣言はたったの1文字分。見た目正常なのは、即時バッファを参照したからで、問題は抱えたまま。 ・「間違いが理解できない!!」で、またも変ですぞ。 大文字か小文字かは、几帳面さに欠けるとし、大目に見るとして、知っている関数をいい加減に使って、入出力結果を自己流にするとは無頓着すぎますぞ。 課題をおろそかにしていませんか。独学には、弊害がつきものです。早いうちに克服して下さい。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

どうでもいい話ですが... 元のコードの > if(a==a/2*2){ は、int型であるはずのaが、0以上であることに完全に依存しています。(あるいは処理系に依存しています。) aの値に依存してもよいのであれば、 #include <stdio.h> int main() {  int a;  a = 3;  puts("a is PLUS");  return 0; } でも構わない気がします。 いずれにしても、問題がよくないのは確かですね。 それともC99なのかな?

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.4

仮に、これが仕事であったら、 減点ではなくて明らかにバツです。 なぜならばプログラムの概念が違ってしまうからです。 もとのプログラムは、単純に標準出力に表示をするだけのものです。 しかし、scanfを使ってしまうと、 プログラムを起動するたびに、値を入力することが必要になります。 人間が起動すると仮定すれば、たいした違いではなく、改良と考えてもいいのですが、 プログラムを起動するのは人間だけではありません。 たとえば、もとのプログラムはCGIやバッチファイルの部品として 使うことができます。scanfを使ったものはそれができません。 この点で、単なる改造・改良ではなく、仕様変更となってしまっています。 上記のようなことも考えられるので、厳密に言えばバツです。 しかし、学習者にCGIのことを考えろというのも酷だし、 独自に勉強している点は感心なので、 減点に留めたのかもしれません。 なんにせよ、プログラムの動作と仕様の関係について考える、 いい機会になったといえるのではないでしょうか。

  • maslkjh
  • ベストアンサー率45% (10/22)
回答No.3

やっと合点がつきました(笑)。実はpop-bombさんの前の質問に答えようとして投稿前にもう一度チェックしたのですが。新しい質問が出ていたのでなんだろうと思って開きました。 私も間違いではないと思いますね。ただやはり問題には出題者の意図というのがあるものなので例えばこの場合↓ #include<stdio.h> int main(void) { int a; a=3; if(a==0){ printf("%d is ZERO \n",a); }else if(a > 0){ printf("%d is PLUS \n",a); }else{ printf("%d is MINUS \n",a); } return(0); } ↑ここまで この様な回答がほしかったのではないかと予想します。 それと気になったのですがこれは前の質問とは別の問題でしょうか?同じ問題であれば全部こちらに書き込みたいので。

pop-bomb
質問者

お礼

「PLUS」などを大文字で表示すべき点は明らかに私のミスです。 私のプログラムは、 厳密に言うと間違いなのかもしれませんが、 今後もこのような判断・評価をするのであれば、 私にとってはプログラムを作成するよりも 課題の意図を読み取る方が難しくなると思います。 ひとつしたのプログラムは、課題2(来週分の課題)で、 別のものです。この質問の課題は課題1です。

  • isle
  • ベストアンサー率51% (77/150)
回答No.1

改造するのが目的ではなくて > aが正の場合はPLUSを、 > aが負の場合はMINUSを、 > aがゼロの場合はZEROを > 表示する のが目的ですよね。 余計な改造をしてOKを貰えるだけラッキーだと思いますよ。 自由に改造していいのなら、 わたしは難しいパズルを100面連続クリアできたら答えが表示されるようにするかもしれません。 表示される文字列も大文字じゃないし。 もし仕事なら完璧NGですね。

pop-bomb
質問者

お礼

私は企業には向かない人間です。 表示される文字列も大文字じゃないし。 これはリアルなミスですが、 これが原因でFAIR判定ではなかったと思います。 このようなメタレベルのプログラムに、 おせっかいな機能はいらないのですね。

関連するQ&A

  • 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はダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • 素数判定の繰返し

    繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。 まず繰返しなしの素数判定プログラムを作り #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } return(0); } これはちゃんとできたのですがそれを繰り返すことができません。 #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); while((a=getchar())!=EOF){ if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } printf("自然数を入力:"); scanf("%d",&a); } printf("プログラムを終了します。\n"); return(0); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • 整数と文字を同時に扱う

    数字を入力して,正ならplusを負ならminusを、 0ならzeroを表示し、ピリオド「.」が入力されたとき プログラムを終了するプログラムを作らなければならないのですが、 整数と文字を同時に扱うのって可能ですか?? 一応、 #include<stdio.h> int main(void){ int a; while (a!='.'){ printf("変数aに数字を入力してください\n"); printf("a="); scanf("%d",&a); if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } } return(0); } で作ったのですが、数字以外を入力すると無限ループします。

  • if~else文の中にまたif~else文をいれるには。

     このプログラムを思うように実行したいのですが、できません。 コンパイルはできるのですが、警告が4つほど出て、結果も自分が思ってるのとは違います。 プログラムのどこを改善すべきか教えてください。 OSはWindows XPで、コンパイラはボーランドのフリーコンパイラを使用しています。 #include<stdio.h> int main(){ int a,b,c,d; printf("1か0を入力してください。\n"); scanf("%d",&a); if(a=0) { printf("2か3を入力してください。\n"); scanf("%d",&b); if(b=2){ printf("今まで合計は%dです。\n",a+b); } if(b=3){ printf("今まで合計は%dです。\n",a+b); } else { printf("指定した数字を入力して下さい。\n"); } } else if(a=1) { printf("あなたは%dを入力しました。\n",a); } else { printf("指定した数字を入力してください。\n"); } return 0; }

  • このプログラムの間違いがわかりません

    独学でプログラムを勉強し始めましたのですが、どうもうまくいきません。自分ではうまく作れたと思ったのですが。。。プログラムの目的は、お互いに数値を入力していって、15を越えたら、越えた方の負けというプログラムを作ったつもりですが、どこかに間違いがあるようなので、よろしければ、皆様、どこが間違いか教えて頂けないでしょうか?(自分が始めて作ったプログラムなので、真に申し訳ないのですがループ文や自作関数を使ったプログラムであれば嬉しいです。) #include<stdio.h> int main() { int i[8],j[7],sum,a,b ; printf("1、2、3のどれかを入力しなさい。15を超えた人が負けになります。\n"); while(sum<15){ /*ループ*/ ///////////////////player Aの範囲////////////////////// printf("player A入力しなさい"); scanf("%d",&i[a]); /*数値入力*/ sum= sum+i[a]; /*現在の合計*/ printf("現在%dです。",sum); /*結果表示*/ if(sum>=15){ /*判定1*/ printf("player Aの負け!!!"); } else{ ///////////////////player Bの範囲//////////////////////// printf("player B入力しなさい。"); scanf("%d",&j[b]); /*数値入力*/ sum=sum+j[b]; /*現在の合計*/ printf("現在%dです。",sum); /*結果表示*/ if(sum>=15){ /*判定2*/ printf("player Bの負け!!!"); }else{ } } return 0; } }

  • この課題を解いてください

    大学で C言語の入門の授業を取っています。 受講生はC言語をやるのは初めてのようです。 私は何年か前からやっていたので楽勝の授業なんですが、 3週目にして、以下の課題を与えられました。 キーボードから数値を入力して、それが正なら「plus」を、負なら「minus」 を、ゼロなら「zero」を表示するプログラムを作成せよ。ただしピリオド「.」が入力されたら終了とする。 で、私は、 #include<stdio.h> #include <stdlib.h> int main(void){ char s[1]; int a; while (1){ printf("変数aに数字を入力してください\n"); printf("a="); scanf("%s",&s[0]); a=atoi(s); if(s[0]=='.')break; if(a>0){ printf("%d is plus\n",a); }else if(a==0){ printf("%d is zero\n",a); }else{ printf("%d is minus\n",a); } } return(0); } のように作りました。 私は授業ではまだ習っていない配列や、atoiという関数を使いましたが、 他の履修生にとっては難しい課題じゃないですか? それとももっとシンプルに作れますか?

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

    キーボードから出力した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言語を習ったばっかりなのでわからないとこだらけです。よろしくお願いします。

  • どこが悪いのか・・・

    初めまして、こんばんわ。 学校の課題で、二次方程式のXの解を求めるC言語のプログラムを作ったのですが 何故か巧く起動しません。 よくわかりません・・・。 是非、何処が悪いのか指摘していただくと嬉しいです。 /*2-10(su210.c)*/ #include <stdio.h> #include <math.h> main() { int a,b,c; float D,x,y; printf("a*x^2+b*x+c=0のときa.b.cを入力して下さい。\n"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); printf("c="); scanf("%d",&c); if(a=0){ if(b=c=0) printf("xはすべての実数をとる。"); else{ if(c=0&&b!=0) printf("x=0"); else{ if(b=0&&c!=0) printf("解なし。"); else{ if(b!=0&&c!=0) {x=-c/b; printf("x=%f",x);} } } } } else{ if(a!=0){ D=b^2-4*a*c; if(D>0){ x=(-b+sqrt(D))/2/a; y=(-b-sqrt(D))/2/a; printf("判別式はD>0です。\n"); printf("x1=%f\n",x); printf("x2=%f\n",y);} else{ if(D=0){x=-b/2*a;printf("判別式はD=0です。\n");printf("x=%f",x);} else{ if(D<0){printf("判別式はD<0です。\n");printf("解なし。");} } } } } }

  • Cプログラムの条件文  if,else if ,elseについて教えてください。

     こんにちは。課題でどうしても解らないところがあるので教えてください。  次のプログラムは一桁の数(0~9)が偶数(EVEN)か奇数(ODD)かを表示するものです。  #include <stdio.h> main() { int num; printf("please enter a number[0~9]:"); scanf("%d",&num); if (num % 2 ==0) printf("%d is an EVEN. \n", num); else printf("%d is an ODD. \n", num); } というプログラムをコンパイルして実行すると、ちゃんと実行されるのですが、10以上の数や負数を入力しても動作してしまうんです。  そこで0~9の範囲以外の数が入力されていないかを確認して、その場合を偶数、奇数の判断や表示をせず、エラーメッセージだけを表示して終了するプログラムに書き換えなくてはならないのですが、まず  (1)判断する条件式(変数numの内容が0~9の範囲にあるか)で、num >= 0 && num <= 9 をどこに入れればいいか。  (2)please enter a number[0~9]: 8 8 is an EVEN.  (←例えば8を入れると普通こうなるのですが)   please enter a number[0~9]:12   ERROR:12 is in out of range!!  (←0~9以外ののものだったら、この様にエラー表示にしたいのです。  私が考えたプログラムは  #include <stdio.h> main() { int num; printf("please enter a number[0~9]:"); scanf("%d",&num); if (num % 2 ==0) printf("%d is an EVEN. \n", num); if else printf("%d is an ODD. \n", num); else(num >= 0 && num <= 9) printf("ERROR:%d is in out of range!! \n",num); } という風に考えたのですがコンパイルできません。プログラミング初心者なので、書いている内容も解りにくいんですが、どうかよろしくお願いします。

  • 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"); } } というプログラムを作っているのですが、うまく実行できません。間違いがあると思うのですが、それもよくわかりません。ビルドは成功するのですが、どの数字を入力しても「げんき」しか出てきません。 わかる人がいたら教えてください。 お願いします。

専門家に質問してみよう