- ベストアンサー
この課題を解いてください
大学で 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という関数を使いましたが、 他の履修生にとっては難しい課題じゃないですか? それとももっとシンプルに作れますか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
数値入力と文字キー入力の判定を分けるのが シンプルです。 #include <stdio.h> #include <conio.h> int main(void) { short a; while (1) { printf("何かキーを押して数値を入力してください(ピリオドで終了)\n"); if (getch()=='.') break; else printf("数字?"); flushall(); scanf("%h4d",&a); printf(a<0?"is minus\n":a?"is plus\n":"is zero\n"); } return 0; } 「文字入力の際、数値でない事を喚起処理させなさい」 と条件付であれば、別ですが。 尚、質問者さんのプログラムは以下にすると正常に実行可能です。 (数値以外文字入力も判定しています) #include <stdio.h> #include <stdlib.h> int main(void) { char s[6]; int a,i; while (1){ printf("変数aに数字を入力してください\n"); printf("a="); flushall(); scanf("%5s",s); a=atoi(s); if(s[0]=='.' && !s[1])break; else for (i=0;s[i];i++) if (s[i]>='0' && s[i]<='9') continue;else break; if (s[i]) continue; 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); }
その他の回答 (6)
- zwi
- ベストアンサー率56% (730/1282)
まず、scanfで char s[1]; で受け取っているのが大きな間違いです。 1バイトしか配列のサイズがありませんので、文字列が1文字も受け取れません。 1文字を受け取るなら最低2バイト。2文字なら3バイトが必要です。理由は分かりますか? >-1を入力したら、-1 is minusと表示されましたが・・・ 正常に動いたのは偶然です。 あなたは理解していませんが、s配列以外のメモリを書き換えてしまっています。異常動作しなかったのは偶然に助けられたからです。俗に言うバッファオーバーラン状態になっていますよ。 atoi関数を使わずに書くほうがC言語の理解力が問われますので、atoiを使わずに自力で文字から数値の変換を書いてみてください。
- don_go
- ベストアンサー率31% (336/1059)
>私は何年か前からやっていたので楽勝の授業なんですが、 と言いつつ >配列や と言っているのは、ちゃんと理解できていない証拠です。 それに、この程度の問題はジグソーパズルで例えるなら 幼稚園児向けの10ピースぐらいの問題です。 この課題ができる(できているつもり?)程度で、油断して 勉強をおろそかにしていると、いつの間にか落ちこぼれて しまいますよ。
- koko_u_
- ベストアンサー率18% (459/2509)
>この手の問題をキチンと解こうとすると相当困難ですね。 逆に scanf() の動作や、テストしても偶々正しく動作することがある、と知ることができる良問と言えなくもない。
- maslkjh
- ベストアンサー率45% (10/22)
この手の問題をキチンと解こうとすると相当困難ですね。授業の課題ということなので一定のラインまで出来ていればいいのでしょう。そういうことを考慮して↓ #include<stdio.h> int main(void){ int num; while(1){ printf("数値を入力>>>"); if(scanf("%d", &num) == 0){ break; } if(num == 0) printf("zero\n"); if(num < 0) printf("minus\n"); if(num > 0) printf("plus\n"); } return 0; } ↑ここまで できるだけシンプルにしてみました。ただこれだと別にピリオドじゃなくても数値以外打てば終わるのですが(笑)あとこのコードだと、scanfの動作についての知識をある程度知っていなければならなくなります。 >他の履修生にとっては難しい課題じゃないですか? 実際に受けてないので想像するしかないですが、ややこしい問題ではありますね。こういう問題はきちんとエラー処理しようとする人ほどどつぼにはまったりするので。とりあえず自分なりに解いてみて、先生の模範解答を素直に待ってみるしかないのでは?そこでどの辺までやればいいのか段々分ってくるでしょう。先生によって結構違ったりしますからね(笑)
- koko_u_
- ベストアンサー率18% (459/2509)
>>-1 は正しく処理されていると考えますか? >-1を入力したら、-1 is minusと表示されましたが・・・ それでは .0 と入力した時の結果を予測できますか? キーボードからの入力をプログラムで受け取る方法を知らずにコーディングするのは無理。
- koko_u_
- ベストアンサー率18% (459/2509)
>他の履修生にとっては難しい課題じゃないですか? 授業で何をどの程度習っているのかわからんのでコメント不能だ。 気になる点としては ・キーボードから数値が入力されるとあるのに、入力バッファが 1バイトしかない。 -1 は正しく処理されていると考えますか? ・atoi() 関数はエラー処理をしないので、通常は strtol() を使用する が挙げられます。 特に、入力バッファが 1バイトしかないのは致命的だと思います。
お礼
この課題を見たときに、あなたならどのように作って、 それは、初心者にとってはどれくらいの難易度か教えていただければ 有難かったです。(習ったところは変数とif文だけ) >-1 は正しく処理されていると考えますか? -1を入力したら、-1 is minusと表示されましたが・・・