- ベストアンサー
間違いが理解できない!!
下に投稿を行ったばかりですが 質問させてください。 #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文以下を改造して・・・」 となっていたら、私のプログラムは間違いです。 しかし、改造してとしか書いてなかったので、 間違いではないと思います。 皆さんはどうおもいますか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
題意を厳密に捉えるならば、変更すべき「仕様」は判定ロジックであって入出力部分の仕様は変更してはならないと解釈すべきでしょう。 特にお金を頂いて、仕様通りにプログラムを作成するプロのプログラマの場合、厳密にクライアントの提示する仕様に則ってプログラムを改造するスキルも求められます。その際、いくら良かれと思って良い機能を追加したとしても、「仕様が違う」と言われる事があります。特に多人数でプロジェクトを組んで開発を進める場合、良かれと思って加えた仕様変更がとんでもないトラブルを引き起こす事も少なくありません。 もちろん、良かれと思って加えた改造が結果として歓迎される事もあるでしょう。ただし、その場合でも依頼者の意向確認は必須だと考えるべきでしょう。 お気持ちは察しますが、プロのプログラマとしてやって行く場合の厳しさも含めた判定ではないかと思います。
その他の回答 (5)
- yukigle
- ベストアンサー率14% (9/63)
2度も続けて変ですぞ。 ・「この課題を解いてください」が、実に変ですぞ。 習っていない配列とのことですが、文字列は立派な配列ですが。他にも、入力の配列名に「&」や「[0]」がついていますし、配列要素の宣言はたったの1文字分。見た目正常なのは、即時バッファを参照したからで、問題は抱えたまま。 ・「間違いが理解できない!!」で、またも変ですぞ。 大文字か小文字かは、几帳面さに欠けるとし、大目に見るとして、知っている関数をいい加減に使って、入出力結果を自己流にするとは無頓着すぎますぞ。 課題をおろそかにしていませんか。独学には、弊害がつきものです。早いうちに克服して下さい。
- jacta
- ベストアンサー率26% (845/3158)
どうでもいい話ですが... 元のコードの > 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)
仮に、これが仕事であったら、 減点ではなくて明らかにバツです。 なぜならばプログラムの概念が違ってしまうからです。 もとのプログラムは、単純に標準出力に表示をするだけのものです。 しかし、scanfを使ってしまうと、 プログラムを起動するたびに、値を入力することが必要になります。 人間が起動すると仮定すれば、たいした違いではなく、改良と考えてもいいのですが、 プログラムを起動するのは人間だけではありません。 たとえば、もとのプログラムはCGIやバッチファイルの部品として 使うことができます。scanfを使ったものはそれができません。 この点で、単なる改造・改良ではなく、仕様変更となってしまっています。 上記のようなことも考えられるので、厳密に言えばバツです。 しかし、学習者にCGIのことを考えろというのも酷だし、 独自に勉強している点は感心なので、 減点に留めたのかもしれません。 なんにせよ、プログラムの動作と仕様の関係について考える、 いい機会になったといえるのではないでしょうか。
- maslkjh
- ベストアンサー率45% (10/22)
やっと合点がつきました(笑)。実は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); } ↑ここまで この様な回答がほしかったのではないかと予想します。 それと気になったのですがこれは前の質問とは別の問題でしょうか?同じ問題であれば全部こちらに書き込みたいので。
お礼
「PLUS」などを大文字で表示すべき点は明らかに私のミスです。 私のプログラムは、 厳密に言うと間違いなのかもしれませんが、 今後もこのような判断・評価をするのであれば、 私にとってはプログラムを作成するよりも 課題の意図を読み取る方が難しくなると思います。 ひとつしたのプログラムは、課題2(来週分の課題)で、 別のものです。この質問の課題は課題1です。
- isle
- ベストアンサー率51% (77/150)
改造するのが目的ではなくて > aが正の場合はPLUSを、 > aが負の場合はMINUSを、 > aがゼロの場合はZEROを > 表示する のが目的ですよね。 余計な改造をしてOKを貰えるだけラッキーだと思いますよ。 自由に改造していいのなら、 わたしは難しいパズルを100面連続クリアできたら答えが表示されるようにするかもしれません。 表示される文字列も大文字じゃないし。 もし仕事なら完璧NGですね。
お礼
私は企業には向かない人間です。 表示される文字列も大文字じゃないし。 これはリアルなミスですが、 これが原因でFAIR判定ではなかったと思います。 このようなメタレベルのプログラムに、 おせっかいな機能はいらないのですね。
お礼
学校の課題なので、 これぐらいのサービスは許される?と思っていました。 私が付けた機能は蛇足だったのかもしれませんね。 プログラムの知識が他の人よりあった分だけ、 損した結果になりました。 まぁ、このプログラムも先生が違えば、 理解してもらえてたのでしょうね。