人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語を教えてくれている先生が非常に採点に厳しい方で、つくったプログラムを提出したいのですがどうにも不安です。画像がそれなのですが、こうしたほうがいいというようなアドバイスがあれば教えてくださると嬉しいです。
///プログラム課題内容///
整数xを入力すると,√xをA√B の形に変形するプログラムを作成せよ.ただし,xが負の場合 A√B i と虚数を表示すること.
また,B=1のとき(A√1のとき)はAのみ表示し,A=1のときは√B(または√B i)だけ表示すること.

1349682459
●拡大する

●質問者: c33-png
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ

重要なのはエラー処理です。
想定していない値や文字、記号などを入力された場合
どうなるのかということですね。

そのとき、おかしな結果や システム的なエラーが出てとまってしまったらまずいです。


2 ● a-kuma3

まず、普通に突っ込まれそうなところ。

問題が要求するレベルによるけれど、仕事だと必ず突っ込まれるケース。

採点者の好みとか、授業で教えた内容によると思うけど、書き方として気になるところ。

後は、適切な空白の挿入かな(好みと言ってしまえば、好みの範疇ではあったりする)。

 for(i=2;i<=x;++i){
 if(x%(i*i)==0){
 a=i;
 b=x/(i*i);
 }
 }

と、

 for (i = 2 ; i <= x ; ++i) {
 if (x % (i * i) == 0) {
 a = i;
 b = x / (i * i);
 }
 }

の、どっちが読みやすいでしょうね、という話。


きゃづみぃさんのコメント
この例を見ると 上のほうが見やすいと思う。 ま、適宜な空白と過度な空白の違いもあると思うね。

a-kuma3さんのコメント
ちょっと、極端すぎましたか :-)

Yoshiyaさんのコメント
私は下の書き方でしたよ。 ただforとifの後に空白は付けなかったのとforの中のセミコロンは後ろに空白だけだったなあ。 それと、main関数の戻り値がいらないのであれば、 void main(void){ ? return;}でもいいかもしれませんね。

a-kuma3さんのコメント
>> それと、main関数の戻り値がいらないのであれば、 void main(void){ ? return;}でもいいかもしれませんね。 << ぼくが馴染んでる規格だと、main 関数の戻り値は int なので、ちょっと違和感があります。 ANSI C99 から認められたんでしたっけ? >void main

Yoshiyaさんのコメント
>ANSI C99 から認められたんでしたっけ? >void main 正式にはC99かららしいですね。 ただC89でvoid型が使える様になってから戻り値の無い関数は明示的にvoidを使っていました。 (戻り値の要らない関数に戻り値を使うと、デバッグが面倒だという理由。)

しおりさんのコメント
>> main関数の戻り値がいらないのであれば、 void main(void){ ? return;}でもいいかもしれませんね << 先生が非常に採点に厳しいということなので、処理系定義の方法で書くと減点されると思います。

a-kuma3さんのコメント
>処理系定義の方法で書くと が、ちょっと古い常識なのかも。 きちんと読んではいませんが >C99

しおりさんのコメント
規格書は読んでいませんが、C99で「処理系定義が認められた」という規格を引用した記事はあります。(int main以外は処理系定義であることは変わらない) http://www.kijineko.co.jp/tech/superstitions/void-main.html

a-kuma3さんのコメント
プロセスの終了値があって、void main で、exit() を使わないときには、何が返るかは規格じゃ決めないよ、ってことですね(多分)。

しおりさんのコメント
いえ、違います。 main()に限りませんが、宣言と定義が一致しない関数では呼び出すことすらできない可能性があります。 http://www.kouno.jp/home/c_faq/c11.html#14

a-kuma3さんのコメント
懐かしいのを引っ張り出してきましたね。 で、それは C89 の話でしょ。

しおりさんのコメント
- int main以外はC99においても処理系定義である - 処理系定義である理由は、宣言と定義が一致しない関数では呼び出すことすらできない可能性があるため int mainしか対応していない処理系で勝手にvoid mainと定義すると、復帰値が不定ということ以前に、正常に呼び出すことすらできない可能性があります。

a-kuma3さんのコメント
質問立てた。

3 ● しおり

計算ロジックは置いておいてプログラムの書き方を見ると、

printf("整数を入力してください。:");

では改行コードを出力していないので、scanf()する前にfflush()しないと出力されないと思います。
それから、scanf()のエラー処理が必要です。
厳密に言うとprintf()やputchar()のエラー処理も必要です。
また、オーバーフローのチェックも必要です。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ