• ベストアンサー

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

大学で 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という関数を使いましたが、 他の履修生にとっては難しい課題じゃないですか? それとももっとシンプルに作れますか?

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

  • ベストアンサー
noname#50176
noname#50176
回答No.3

数値入力と文字キー入力の判定を分けるのが シンプルです。 #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)
回答No.7

まず、scanfで char s[1]; で受け取っているのが大きな間違いです。 1バイトしか配列のサイズがありませんので、文字列が1文字も受け取れません。 1文字を受け取るなら最低2バイト。2文字なら3バイトが必要です。理由は分かりますか? >-1を入力したら、-1 is minusと表示されましたが・・・ 正常に動いたのは偶然です。 あなたは理解していませんが、s配列以外のメモリを書き換えてしまっています。異常動作しなかったのは偶然に助けられたからです。俗に言うバッファオーバーラン状態になっていますよ。 atoi関数を使わずに書くほうがC言語の理解力が問われますので、atoiを使わずに自力で文字から数値の変換を書いてみてください。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.6

>私は何年か前からやっていたので楽勝の授業なんですが、 と言いつつ >配列や と言っているのは、ちゃんと理解できていない証拠です。 それに、この程度の問題はジグソーパズルで例えるなら 幼稚園児向けの10ピースぐらいの問題です。 この課題ができる(できているつもり?)程度で、油断して 勉強をおろそかにしていると、いつの間にか落ちこぼれて しまいますよ。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.5

>この手の問題をキチンと解こうとすると相当困難ですね。 逆に scanf() の動作や、テストしても偶々正しく動作することがある、と知ることができる良問と言えなくもない。

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

この手の問題をキチンと解こうとすると相当困難ですね。授業の課題ということなので一定のラインまで出来ていればいいのでしょう。そういうことを考慮して↓ #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)
回答No.2

>>-1 は正しく処理されていると考えますか? >-1を入力したら、-1 is minusと表示されましたが・・・ それでは .0 と入力した時の結果を予測できますか? キーボードからの入力をプログラムで受け取る方法を知らずにコーディングするのは無理。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>他の履修生にとっては難しい課題じゃないですか? 授業で何をどの程度習っているのかわからんのでコメント不能だ。 気になる点としては ・キーボードから数値が入力されるとあるのに、入力バッファが 1バイトしかない。 -1 は正しく処理されていると考えますか? ・atoi() 関数はエラー処理をしないので、通常は strtol() を使用する が挙げられます。 特に、入力バッファが 1バイトしかないのは致命的だと思います。

pop-bomb
質問者

お礼

この課題を見たときに、あなたならどのように作って、 それは、初心者にとってはどれくらいの難易度か教えていただければ 有難かったです。(習ったところは変数とif文だけ) >-1 は正しく処理されていると考えますか? -1を入力したら、-1 is minusと表示されましたが・・・

関連するQ&A

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

    下に投稿を行ったばかりですが 質問させてください。 #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文以下を改造して・・・」 となっていたら、私のプログラムは間違いです。 しかし、改造してとしか書いてなかったので、 間違いではないと思います。 皆さんはどうおもいますか?

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

    数字を入力して,正なら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); } で作ったのですが、数字以外を入力すると無限ループします。

  • 素数判定の繰返し

    繰返し素数判定を行ない、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); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • 何処が間違っていますか?

    ---------------------------------------------------------------------------------------- #include<stdio.h> #include<stdlib.h> #define MAX_LINE 128 int main(void); int main(void) { char buf[MAX_LINE]; int n; printf("降水確率を入力してください。\n"); gets(buf); n = atoi(buf); printf("降水確率は %d %% です。\n",n); if (n >= 50) { printf("傘を忘れずにね。\n"); } else { printf(傘はいりません。\n"); } printf("いってらっしゃい。\n"); return(0); }

  • 中置記法の問題なのですが…

    中置記法でかかれたもの後置記法に直してから計算するプログラムをつくったのですが、atoi関数のところで、うまく数字が渡されず、0となってします。これらの原因と解決方法、また解決したプログラムを教えてください。 #include<stdio.h> #include<string.h> #include<stdlib.h> #include"Item1.h" #include"Stack1.h" #include"Item2.h" #include"Stack2.h" int main(int argc, char *argv[]) { char *a = argv[1]; int i; int N = strlen(a); char r; int s; STACKinit1(N);STACKinit2(N); for(i=0;i<N;i++) { if(a[i] == ')') { r = STACKpop1(); if(r == '+') { STACKpush2(STACKpop2() + STACKpop2()); } else if(r == '*') { STACKpush2(STACKpop2() * STACKpop2()); } } if(a[i] == '+' || a[i] == '*') { STACKpush1(a[i]); } if ((a[i] >= '0') && (a[i] <= '9')) { s = atoi("a[i]"); STACKpush2(s); } } printf("%d \n",s); printf("%d \n",STACKpop2()); return 0; }

  • 課題がうまくいかない

    課題で &lt; と入力されたら < と表示し、 &gt; と入力されたら > と表示し、…といった感じで5種類の入力に対応して表示させるプログラムを書いたのですが、うまく思った通りの結果がでません。我ながら汚いプログラムだと思いますが、自分が考えたプログラムは以下のようです。 #include <stdio.h> int main(void){ char c[50]; int i=0; while(c[i]!=-1){ scanf("%c",&c[i]); i=i+1; } if((c[0]=='&')&&(c[1]=='l')&&(c[2]=='t')&&(c[3]==';')){ printf("<"); } else if((c[0]=='&')&&(c[1]=='g')&&(c[2]=='t')&&(c[3]==';')){ printf(">"); } else if((c[0]=='&')&&(c[1]=='a')&&(c[2]=='m')&&(c[3]=='p')&&(c[4]==';')){ printf("&"); } else if((c[0]=='&')&&(c[1]=='q')&&(c[2]=='u')&&(c[3]=='o')&&(c[4]=='t')&&(c[5]==';')){ printf("\""); } else if((c[0]=='&')&&(c[1]=='a')&&(c[2]=='p')&&(c[3]=='o')&&(c[4]=='s')&&(c[5]==';')){ printf("'"); } 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; }

  • C言語初心者です。 ジャンケンゲーム

    今、授業の課題でジャンケンゲームを作成していますが、なかなかできません。もし、良かったら何処が違うのか教えてください。 // main.c #include <stdio.h> #include <time.h> //#include <time.h> #include "my.h" main(int argc, char* argv[]){ int i; char s[7]; printf("これはジャンケンゲームです。\n"); printf("手を入力します(グー:1 チョキ:2 パー:3)\n"); scanf("%s",&s[7]); srand((unsigned)time(NULL)); printf("%s\n",jyan(dice(3))); if(s == jyan){ printf("あいこです。\n"); }else if(s == 1 && jyan ==2){ printf("あなたの勝ちです。\n"); }else if(s == 2 && jyan == 3){ printf("あなたの勝ちです。\n"); }else if(s == 3 && jyan ==1){ printf("あなたの勝ちです。\n"); }else{ printf("コンピュターの勝ちです。\n"); } } // dice.c #include <time.h> int dice(int n){ srand((unsigned)time(NULL)); return(rand()%n+1); } // jyan.c char *jyan(int n){ static char s[][7]={"グー","チョキ","パー"}; return s[--n]; } // my.h #include <stdio.h> char *jyan(int hand); //int dice(int n); 見づらくて申し訳ありません。4つのファイルに分けて作成しています。上記のプログラムだと自分の手、コンピューターの手がランダムに出てくるのですが判定が出来ませんでした。アドバイス、よろしくお願いします。 長文になってしまい申し訳ありません。

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

  • 課題で悩んでます

    #include <stdio.h> void main(){ int okane; float kion; printf("今日のお金は?\n"); scanf("%d",&okane); printf("今日の気温は?\n"); scanf("%f",&kion); if( okane >=700&&kion>=30.0 ){ printf("冷やし中華を食べよう\n"); } if( okane >=700&&kion<30.0 ){ printf("ラーメンを食べよう\n"); } if( okane <=700){ printf("バイトしろ"); } } この文で論理演算子を抜いてifelse文に書き換えろという課題が出たのですが分からないので全文教えて下さい

専門家に質問してみよう