*たくさんの方よりご指摘をいただけてとてもありたいです。
引き続き、よろしくお願い致します。
C言語を勉強している初心者のものです。
今課題をいただき、その作成をしております。
先日提出(全18問)したのですが、大部分が間違っているので、
再度問題を見なおした上で提出してくれと言われてしまいました。
今回は課題なので、間違っている点を教えていただけませんでした。
個人的には、どの辺りが間違っているのかわからないため、
客観的な視点が欲しく、今回ご相談させていただきました。
回答の例を提示されているのですが、
nが大きくなるとで画面の見栄えが悪くなると思い、
同じような表示にはしませんでした。
また懸念点として、nが大きくなるにつれて
intでは処理しきれなくなってしまうのでと思ったのですが、
この場合、いかがでしょうか。
回答が趣旨と外れているように感じましたら
ご指摘いただけますと幸いです。
【問題】
正の整数nを入力し、1+2+3+....nの結果を表示するプログラムを作成せよ。
例)「4」を入力した際には1+2+3+4の結果、「10」となる。
【回答】
#include <stdio.h> int main(void) { int score; printf("整数を入力してください。"); scanf("%d",&score); if (score >= 0) { printf("入力した整数までの合計は%dとなります。\n",(1 + score) * score / 2); } else { printf("再度整数を入力してください"); } return 0; }
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
投稿されている質問を幾つか拝見しましたが、
多くで共通して問題になるのはscanf周りくらいですかね。
恐怖?のscanf
scanfでエラー対応 OKweb
後あるとすれば、課題冊子の冒頭等で「明示されていない限り処理は関数を作成してそこで行いなさい」のような記述は無かったでしょうか?
「大部分が間違っている」と評する程の箇所が他に見当たらないんですよね...
投稿2016/02/25 01:29
編集2016/02/25 01:41総合スコア2068
0
Chironian様、majiponi様とのディスカッションに参加しようと思ったのですが、コード量がインデントなしではどうにも見づらくなりますので、解答欄にて首を突っ込ませていただきます。
tomo3さんのコードの問題点については以下のコード上で指摘しますが、わたしのコードについても、なにぶん境界条件の話なので、うっかりポカ等ありそうです。
C
1#include <stdio.h> 2#include <limits.h> 3 4int IsOverflow(int); 5 6int main(void) 7{ 8 int score, answer; 9 unsigned int i; // unsigned は、+オンリーの数字だよ、という意味です 10 printf("正の整数を入力してください。\n"); 11 scanf("%d",&score); 12 13// over(score); // over関数内で return を呼んでもその関数を抜けるだけです。 14 15 if (!IsOverflow(score)) // if it is not overflowed と、自然な英語で記述できます*下解説 16 { 17 answer = 0; 18 for (i = 1; i <= score; i++) // 記述ミス:for内で int i を宣言できるのはC++です 19 { // C ではその記法を用いるとエラーになります 20 answer = answer + i; 21 } 22 printf("1から%dまでの合計数値は%dです。\n",score,answer); 23 } else { 24 printf("エラー:オーバーフロー!\n"); 25 } 26 return 0; 27} 28 29//******************************************************************************************** 30/** 31 * @brief Overflow しているか否か. 32 * @note 何かが「○○」である事を確認する関数は Is○○ という名前で定義されることが 33 * 多いです。こうすることで 34 * if (IsOverflow) { ~ 35 * の形、つまり英語で if it is overflow, then ~ の形で読むことができるように 36 * なるからです。ある程度基本が身についてきたならば、プログラミング作法などの本 37 * やウェブページを勉強なさると読みやすいコードが書けるようになりますよ 38 * 39 * @param[in] score 対象スコア. 40 * 41 * @retval 1 オーバーフローするよ 42 * @retval 0 オーバーフローしないよ 43 */ 44//******************************************************************************************** 45int IsOverflow (int score) 46{ 47#if 0 48 if (score > INT_MAX/score - 1) 49 { 50 printf("error"); 51// break ; // 記述ミス:ループ、switch文の中にない break; 52 } else if (score < 0) { // 記述ミス修正(else の後に;) 53 printf("error\n正の整数を入力してください。"); 54 } 55 return 0; 56#elif 0 57 // 上の記述を直してみた 58 int ret = 0; // ret = false; 59 if (score > INT_MAX/score - 1 ) 60 { 61 ret = 1; // ret = true; 62 } 63 return ret; // score がオーバーフローする場合のみ1:trueが返される 64#else 65 // ちゅうか実装されているアルゴリズム的にオーバーフローの条件変わってるやんけ! 66 /* 67 計算処理途中で計算結果より大きくなることがないので、最終結果が限界を超えないこと 68 を確認しなきゃいけない。つまり 69 (1+score)*score/2 < limit 70 1+score < (limit/score) *2 71 score < (limit/score)*2 -1 72 ここで score > 2 は自明であるから(limit/score)*2 < limit 73 */ 74 int ret = 0; // ret = false; 75 if (score > (INT_MAX/score)*2 - 1 ) 76 { 77 ret = 1; // ret = true; 78 } 79 80 return ret; // score がオーバーフローする場合のみ1:trueが返される 81#endif 82} 83 84/* 85#if ~ #else ~ #endif について 86#if はプリプロセス命令といって、#include や #define の仲間です。 87今は詳しく知らなくてもいいですが、とりあえず 88#if 1 89 (1) 90#else 91 (2) 92#endif 93について、コンパイラが(2)を無視して(1)のみコンパイルするんだな~と覚えていただければ十分です。 94今回はこれの if 0, つまり逆の場合ですね 95*/ 96
tomo3さんの実装的にそれまでのディスカッションで出てきたリミットと変わっていましたので、全面的に書き直しました。
それまでのリミットでは
46340の時1073720970
が限界ですが、計算しなおしたリミットだと
65535の時2147450880
が限界となります。
投稿2016/02/26 16:04
編集2016/02/27 06:03総合スコア306
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/28 10:26
2016/02/28 11:24
2016/02/28 15:30
2016/02/28 16:03
0
この課題が何を狙っているのかによるのでは。
変数を使った計算の演習を目的としているのなら、
変数aに1を代入
変数aに2を足す
変数aに3を足す
・・・
というのをプログラムでうまく書くにはどうしたらいいのか?という観点で作るべきですね。
(つまりループの演習につながる)
そうでなくて計算で一発!というなら今のままで、scanf周りの整理で良いと思います。
恐らく初歩の課題と思われるので、入力処理のエラー処理云々よりかは前者かと思います。
投稿2016/02/25 07:50
総合スコア16998
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/02/25 08:00
0
こんにちは。
「正の整数n」ということなので、入力先はunsigned int
ではないかと思います。
書式指定子に注意下さい。
なお、0が入力された時の振る舞いにも注意下さい。
【閑話休題】
他に、整数のオーバーフローもあると言えばあります。googleさえ見落とした不具合ですし、初心者に求めるのは明らかに過剰です。とは言え、知っておくに越したことはないので、簡単に。
(1 + score) * score
の部分がint型で表現できる値を超えると結果は未定義となります。
対策としては、limits.hに、各整数型で表現できる値の範囲が定義されてます。そのルート付近以上の値が入力されるとオーバーフローするので、そのような値が入力されたら範囲外エラーにすることです。
投稿2016/02/25 01:44
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/02/25 02:20
2016/02/25 02:52
退会済みユーザー
2016/02/25 07:55
2016/02/25 08:49
退会済みユーザー
2016/02/25 09:52
退会済みユーザー
2016/02/25 14:02
2016/02/25 14:53
2016/02/26 01:58
退会済みユーザー
2016/02/26 04:15
退会済みユーザー
2016/02/26 04:44
2016/02/28 03:55 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/25 01:47
2016/02/25 01:56
退会済みユーザー
2016/02/25 02:23
退会済みユーザー
2016/02/25 07:57