- ベストアンサー
受け答えプログラムを作るには
最近C言語を始めた者です。今、受け答えが出来るプログラムを作りたいなぁと思っています。 例えば、人は何類か?という質問をプログラムが出して、哺乳類と打ち込むと、正解!とプログラムが答えてくれるようなものです。ifや、fgetsというものも、一応やってはみたのですが、やりかたがヘタみたいでうまくいきませんでした。 人は何類か?という質問を出して、哺乳類と打ち込むと正解!と答えてくれて、違った答えを打ち込むと正しい答えを教えてくれるプログラムはどうすれば作れるでしょうか?分かる方、お願いします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
> 08 fgets(string,21,stdin); > キーボードからの入力をstdinに格納する。 こちらの理解が今ひとつだと思います。 BohYoh.com【C言語講座】標準ライブラリ関数 fgets http://www.bohyoh.com/CandCPP/C/Library/fgets.html の「機能」の説明に当てはめると、 「fgets関数は、stdinが指すストリーム(キーボードからの入力あるいは標準入力)から文字列を読み取りstringが指す配列に格納する。」 となります。 06,07,08行目を、以下にすると、fgetsで値が格納される事が理解しやすいかと思います。 06 char string[21]; 06A string[0]=NULL; 07 printf("変数の中身は(%s)です。\n",string); 08 fgets(string,21,stdin); 08A printf("変数の中身は(%s)です。\n",string); -- 09行目では、 > 09行目のifでは、もしキーボードで打ち込んだ文字が哺乳類ならば正解!と表示するということをしたいです。 との事ですが、今の構文ですと、 09 もし「キーボードで打ち込んだ文字が“哺乳類”かどうか?」 11 上の条件を満たせば「正解!」 13 そうでなければ「キーボードで打ち込んだ文字が“ホニュウ類”かどうか?」 15 上の条件を満たせば「正解!」 となっています。 09と13で別々にfgetsを行うと、 09 “ホニュウ類”と入力、“ホニュウ類”≠“哺乳類”なので、不正解。 13 “ホニュウ類”と入力、“ホニュウ類”=“ホニュウ類”なので、正解! と、何度も入力をしなければなりませんし、毎回入力した文字が違うと正解にならない事もあります。 そういう何度も入力するような事を避けるために、一度入力した文字をstringという変数に記憶(08行)しておき、記憶しておいた文字との比較(09,13,17行)を行います。 -- また、C言語で文字列の比較を行うには、strcmp関数を利用するのが一般的です。 string=="哺乳類" なんて書き方が出来れば…と思うかもしれませんが、そういうものです。 おまけに、どれとも一致しなかった時に「正解!」を表示するのは誤りのハズ。
その他の回答 (9)
- neKo_deux
- ベストアンサー率44% (5541/12319)
> strcmp関数で比較をするときは、 > if (strcmp==哺乳類) > という感じでやっていけばいいのでしょうか? 使い方は、strcmp関数の説明を調べてみてください。 BohYoh.com【C言語講座】標準ライブラリ関数 strcmp http://www.bohyoh.com/CandCPP/C/Library/strcmp.html C++の記述なので、constがありますが、 int strcmp(char *s1, char *s2); にs1とs2で文字列を指定して比較してもらい、比較結果によって返り値が変わります。 こちらは実装例(自分でstrcmp関数を作る場合の例、strcmp関数を使わずに処理する場合の例)しか無いですが、丁寧なヘルプや書籍なら使用例もあるハズです。
お礼
いろいろと分かりやすい説明、ありがとうございます!僕の持っている書籍にはstrcmpなどは載っていないので、今度、詳しい書籍を見つけようと思います!
No.4さんの回答はポインタを理解していなかったらきついと思うのでこれぐらいにしたらわかりやすいのでは? #include<stdio.h> #include<string.h> int main(){ int i; int end; char inputAns[BUFSIZ]; char ans[][256] = { "ほ乳類\n", "哺乳類\n", "ホニュウ類\n", "人類\n" }; end = sizeof(ans) / sizeof(ans[0]); printf("%d\n",end); puts("ヒトは何類か?"); fgets(inputAns, BUFSIZ, stdin); for(i = 0;i < end && strcmp(inputAns,ans[i]);i++); if(i != end) { printf("正解\n"); } else { printf("間違い"); } return 0; } あとstdinは「標準入力」で一般的にはキーボードからの入力です。
お礼
確かにNo.4さんのものよりも分かりやすくなりました!ありがとうございます!でも、まだ分からないところがあるので、これから理解できていけばいいなと思います!
とりあえず、日本語入力は「ALT+全角/半角」でいけると思います
お礼
ありがとうございます!これで日本語が入力できました!
- neKo_deux
- ベストアンサー率44% (5541/12319)
行番号を入れて、インデント。 01 #include <stdio.h> 02 main() 03 { 04 printf("ヒトは何類か?"); 05 06 char string[21]; 07 08 fgets(string,21,stdin); 09 if (fgets 哺乳類) 10 { 11 printf("正解!"); 12 } 13 else if(fgets ホニュウ類); 14 { 15 printf("正解!"); 16 } 17 else if(fgets ほ乳類); 18 { 19 printf("正解!"); 20 } 21 else 22 { 23 printf("正解!"); 24 } Q. 08行目のfgetsは何をどうする処理か、分かりますか?埋めてみてください。 「[ ]からの入力を[ ]に格納する。」 ・fgets ・キーボード ・string ・stdin ・printf ・main Q. 09行のifでは何を判断したい? Q. 09~16のif~elseの構文と、参考書にあるif~elseの構文を良く見比べると?
お礼
キーボードからの入力をstdinに格納する。 09行目のifでは、もしキーボードで打ち込んだ文字が哺乳類ならば正解!と表示するということをしたいです。 if else のあとにセミコロンが参考書のほうはついていません! ありがとうございます!
とくにNo.4さんの回答で問題ないと思います。 多分、 #if 0 #endif とかを消したら動くと思います。 でもCを始めたばかりの人にはわかりずらいかも・・・
お礼
sosdan様の言われたとおりに#endifという部分を消したらうまく動きました!しかし、新たな問題が発生したんです。Cygwinというソフトを使って、プログラムを動かしたんですが、アルファベットや数字は入力できるのに、ひらがなやカタカナは入力できないんです。どうすれば入力出来るでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#if 0 あんまり、参考にならないかもしれません。 その上、(bcc32では、動作確認しましたが・) 他のコンパイラだと動かないかもしれません^^; その上で、ご参考に… #endif #include <stdio.h> #include <string.h> char *QList[]={ "ヒトは何類か?", "1+1は?", NULL, }; char *AnsList[]={ "ほ乳類\n哺乳類\nホニュウ類\n人類\n", "2\n2\n(^_^)\n", NULL, }; char *bingo(char **q, char *ans){ return(strstr(AnsList[q-QList], ans)); } int main(){ char inputAns[BUFSIZ]; char **qp, *ap; for(qp=QList;*qp!=NULL;qp++){ printf("%s\n", *qp); fgets(inputAns, BUFSIZ, stdin); if(bingo(qp, inputAns)){ printf("正解!\n"); } else { printf("不正解!\n"); } } return 0; }
お礼
解答、ありがとうございます!コンパイルしてみましたが、エラーになってしまいました。なので、プログラムの参考とさせてもらいます!
- neKo_deux
- ベストアンサー率44% (5541/12319)
> ifや、fgetsというものも、一応やってはみたのですが、 どのようにやったのか、提示してもらわないと、どこが違うのか、どこまでは合っているのか、回答できませんよ。 プログラムの大きな流れはどうなるのか? 何がどういう風にうまくいかないのか? 何がうまくいけば、問題解決するのか? 補足してください。 -- そんなに難しいプログラムではないと思いますから、回答を書くのは簡単ですが、こちらに質問するって事は回答が欲しいんじゃないですよね?
お礼
解答、ありがとうございます! 一番下のところにプログラムを書いたものを提示しました。 プログラムの流れは、問題の出題→答える→正解ならば正解!間違いなら正しい答えを表示する という流れです。 うまくいかないと思う部分は、fgetsの書き方と、ifの条件文の書き方だと思います。 なので、fgetsの部分と、ifの部分の書き方を正しく出来れば問題解決につながると思います。 プログラム修正、お願いします。
- Chronos198
- ベストアンサー率30% (105/349)
で・・どんなコードを打って、どこまでは出来たんでしょう? まずはそれを晒す所からです。 その動作をするコードを作る事は難しくありませんが、丸投げにされてしまっては答えられません。 >ちなみに、プログラムでする事は >1)入力を受け取る >2)入力内容と正解を比較する >3)結果を出力する >だけです。
お礼
解答、ありがとうございます! 一番下のほうに、コードを補足しています。間違いだらけとは思いますが、修正を、お願いいたします。
補足
一番最後のelseの後の部分を間違えていました。 正しくは、 else { printf("バツ 正解…哺乳類") } でした。 すみません。
- edomin
- ベストアンサー率32% (327/1003)
どのようなプログラムを作成したらうまくいかなかったのでしょう? ソースを提示して修正して貰いましょう。 また、「哺乳類」だけでいいのですか? 「哺乳類」だけでも ・哺乳類 ・ほ乳類 ・ほにゅう類 ・ほにゅうるい ・ホニュウルイ ・ホニュウルイ(半角カナ) ・etc とたくさんあるのですが・・・ ま、とりあえずソースプログラムを補足して下さい。
お礼
解答ありがとうございます! 確かに「哺乳類」という言葉にもたくさんの書き方がありますね。そこまでは考えていませんでした。下の方にソースプログラムを補足しておきましたので、修正をお願いします。
補足
#include <stdio.h> main() { printf("ヒトは何類か?"); char string[21]; fgets(string,21,stdin); if (fgets 哺乳類) { printf("正解!"); } else if(fgets ホニュウ類); { printf("正解!"); } else if(fgets ほ乳類); { printf("正解!"); } else { printf("正解!"); }
お礼
詳しく説明していただき、ありがとうございます! strcmp関数で比較をするときは、 if (strcmp==哺乳類) という感じでやっていけばいいのでしょうか? それと、どれとも一致しなかったときに「正解!」と表示するのは間違いでした。すみません。