• ベストアンサー

受け答えプログラムを作るには

最近C言語を始めた者です。今、受け答えが出来るプログラムを作りたいなぁと思っています。 例えば、人は何類か?という質問をプログラムが出して、哺乳類と打ち込むと、正解!とプログラムが答えてくれるようなものです。ifや、fgetsというものも、一応やってはみたのですが、やりかたがヘタみたいでうまくいきませんでした。 人は何類か?という質問を出して、哺乳類と打ち込むと正解!と答えてくれて、違った答えを打ち込むと正しい答えを教えてくれるプログラムはどうすれば作れるでしょうか?分かる方、お願いします。

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

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.9

> 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=="哺乳類" なんて書き方が出来れば…と思うかもしれませんが、そういうものです。 おまけに、どれとも一致しなかった時に「正解!」を表示するのは誤りのハズ。

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/fgets.html
earthmantatete
質問者

お礼

詳しく説明していただき、ありがとうございます! strcmp関数で比較をするときは、 if (strcmp==哺乳類) という感じでやっていけばいいのでしょうか? それと、どれとも一致しなかったときに「正解!」と表示するのは間違いでした。すみません。

その他の回答 (9)

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.10

> 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関数を使わずに処理する場合の例)しか無いですが、丁寧なヘルプや書籍なら使用例もあるハズです。

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/strcmp.html
earthmantatete
質問者

お礼

いろいろと分かりやすい説明、ありがとうございます!僕の持っている書籍にはstrcmpなどは載っていないので、今度、詳しい書籍を見つけようと思います!

noname#16765
noname#16765
回答No.8

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は「標準入力」で一般的にはキーボードからの入力です。

earthmantatete
質問者

お礼

確かにNo.4さんのものよりも分かりやすくなりました!ありがとうございます!でも、まだ分からないところがあるので、これから理解できていけばいいなと思います!

noname#16765
noname#16765
回答No.7

とりあえず、日本語入力は「ALT+全角/半角」でいけると思います

earthmantatete
質問者

お礼

ありがとうございます!これで日本語が入力できました!

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.6

行番号を入れて、インデント。 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の構文を良く見比べると?

earthmantatete
質問者

お礼

キーボードからの入力をstdinに格納する。 09行目のifでは、もしキーボードで打ち込んだ文字が哺乳類ならば正解!と表示するということをしたいです。 if else のあとにセミコロンが参考書のほうはついていません! ありがとうございます!

noname#16765
noname#16765
回答No.5

とくにNo.4さんの回答で問題ないと思います。 多分、 #if 0 #endif とかを消したら動くと思います。 でもCを始めたばかりの人にはわかりずらいかも・・・

earthmantatete
質問者

お礼

sosdan様の言われたとおりに#endifという部分を消したらうまく動きました!しかし、新たな問題が発生したんです。Cygwinというソフトを使って、プログラムを動かしたんですが、アルファベットや数字は入力できるのに、ひらがなやカタカナは入力できないんです。どうすれば入力出来るでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#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; }

earthmantatete
質問者

お礼

解答、ありがとうございます!コンパイルしてみましたが、エラーになってしまいました。なので、プログラムの参考とさせてもらいます! 

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

> ifや、fgetsというものも、一応やってはみたのですが、 どのようにやったのか、提示してもらわないと、どこが違うのか、どこまでは合っているのか、回答できませんよ。 プログラムの大きな流れはどうなるのか? 何がどういう風にうまくいかないのか? 何がうまくいけば、問題解決するのか? 補足してください。 -- そんなに難しいプログラムではないと思いますから、回答を書くのは簡単ですが、こちらに質問するって事は回答が欲しいんじゃないですよね?

earthmantatete
質問者

お礼

解答、ありがとうございます! 一番下のところにプログラムを書いたものを提示しました。 プログラムの流れは、問題の出題→答える→正解ならば正解!間違いなら正しい答えを表示する という流れです。 うまくいかないと思う部分は、fgetsの書き方と、ifの条件文の書き方だと思います。 なので、fgetsの部分と、ifの部分の書き方を正しく出来れば問題解決につながると思います。 プログラム修正、お願いします。

回答No.2

で・・どんなコードを打って、どこまでは出来たんでしょう? まずはそれを晒す所からです。 その動作をするコードを作る事は難しくありませんが、丸投げにされてしまっては答えられません。 >ちなみに、プログラムでする事は >1)入力を受け取る >2)入力内容と正解を比較する >3)結果を出力する >だけです。

earthmantatete
質問者

お礼

解答、ありがとうございます! 一番下のほうに、コードを補足しています。間違いだらけとは思いますが、修正を、お願いいたします。

earthmantatete
質問者

補足

一番最後のelseの後の部分を間違えていました。 正しくは、 else { printf("バツ 正解…哺乳類") } でした。 すみません。

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

どのようなプログラムを作成したらうまくいかなかったのでしょう? ソースを提示して修正して貰いましょう。 また、「哺乳類」だけでいいのですか? 「哺乳類」だけでも ・哺乳類 ・ほ乳類 ・ほにゅう類 ・ほにゅうるい ・ホニュウルイ ・ホニュウルイ(半角カナ) ・etc とたくさんあるのですが・・・ ま、とりあえずソースプログラムを補足して下さい。

earthmantatete
質問者

お礼

解答ありがとうございます! 確かに「哺乳類」という言葉にもたくさんの書き方がありますね。そこまでは考えていませんでした。下の方にソースプログラムを補足しておきましたので、修正をお願いします。

earthmantatete
質問者

補足

#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("正解!"); }

関連するQ&A

  • 市販されているソフトを作っているプログラム

    はじめまして。さっそく質問させていただきます。 大学でプロミングを学んでいるのですが、まだ知識も皆無なレベルの者の質問として聞いてくださるとうれしいです。 最近、市販されているソフトにどのようなプログラムが使われているのか気になりはじめ、自分でも調べてみたのですがなかなかイイ答えが見つからずこまっています。 言語はC言語やC++をつかっているというのはわかったのですが、プログラミングソフトはどのようなものを使っているのでしょうか? 質問がわかりにくいかもしれませんが回答お待ちしております。

  • このプログラムは

    どこかおかしいですか? int main(void){ FILE *str; char buf[1000]; if((fp=fopen("ファイル名","r"))=NULL){ printf("ファイルが開けません"); return EXIT_SUCCESS; } while(fgets(buf,1000,fp) !=NULL){ str=buf; printf("%s",buf); } return EXIT_SUCCESS; } で実行すると前半4割程度が表示されません。 何故だかわかる人いませんか? 使用言語:C言語 環境:visualC++6.0 のコンソールアプリケーション。

  • facebookのプログラム言語について

    プログラムの勉強をして、コミニュケーションを目的としたwebサイトを作りたいと思っています。 ただ、プログラム言語がたくさんあり、どの言語をこれから学ぶべきかの判断がつきません。 ネットで調べるとC,PHP,perl,javascript辺りが私の目的に近そうな気がします。 質問ですが、基礎知識が乏しいため質問が漠然としていたらすみません。 一応、私の目的に近いfacebookを作る言語を教えてください。 facebookは何のプログラム言語で作られているのか? あるいは、どの言語を知っていればfacebookのようなサイトを作れるのか?

  • 簡単な電卓プログラムについて

    今C言語をやっているのですがまだ始めたばかりで全然わかっていない者です。 なるべく簡単な構文で電卓のプログラムを作りたいのですがそのソースを教えてくださいませんか? 東方C++2008を使っております よろしくおねがいします。

  • プログラムを始めるなら

    C言語をある程度知っている人なら、プログラミングは大丈夫だと言われる理由って何でしょう? 別にC言語を元に全てのプログラムができたわけでもないし、 オブジェクト指向のプログラムとは毛色が違うし。 私自身C言語,javaなどのソースが読める程度しかできませんが、 プログラミングが出来るとはお世辞にも言えません。 何故このような事が言われているのでしょう? また、最初に学ぶべき言語としてはやはりC等の言語がいいのでしょうか? それともアセンブリ言語のような物の方がいいのでしょうか?

  • プログラム開発者は?

    今C言語やC++など勉強しようとしているところなんですが、プログラム開発者はC言語とC#とC++ではどれの方が多く使っているのでしょうか?それと、一般にプログラム開発者で使われているのはどのC言語ですか? 初歩的な質問ですが、どなたか教えてください、お願いします。

  • このプログラムの解説を

    C言語の勉強を始めたのですが、質問があります。 下のプログラムをコンパイルしたら   入力ファイル名= と出ますが、これは何を入力すればよいのでしょうか? 何か入力しても「~がオープンできません」と表示されて、これは、自分が持っているファイルを打てばよいのですか?(このプログラム自体も何を意味しているか、まだ理解できていません。) 解説よろしくお願いします。 #include<stdio.h> #include<stdlib.h> main() { FILE *fin; char buf[256]; char filename1[20]; printf("入力ファイル名="); gets(filename1); fin=fopen(filename1,"r"); if(fin==NULL){ printf("%sがオープンできません.\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); }

  • javaプログラムで他言語のプログラムを動作できるのでしょうか?

    java言語を勉強しているものです。 答えが見つからないので質問させていただきます。 現在以下の2つのプログラムを作成し動作確認をしました。 1:カメラの画像を保存する   プログラムの言語はBasicとC++が推奨されていたので、今回はBasicでプログラムを作成しました。 2:保存した画像をAppletでスライドショーにして見せる   プログラム言語はjavaです。 理想的な動作はリアルタイムな画像を次々に見せることです。 そこで、2で作成したプログラムの中に1を動作させる機能を持たせたいのですが、実現可能でしょうか? 知っている方がいましたら、御指導をお願いいたします。

    • ベストアンサー
    • Java
  • プログラム/条件分岐について2

    プログラム初心者です. (言語: C shell (csh)) 『ファイルAは上から5行分を使用する』 『もしファイルBに, Cの答えが2つ以上ある場合は, 最初の答えを選択する』 『もし, Dの答えが2つ以上ある場合は, ファイルEから5行目までを使用する』 というプログラムをそれぞれ組みたいと思っております. 私の日本語説明が稚拙でわかりにくいかもしれませんがどなたか教えてくださると嬉しいです>< プログラム質問第二段です...(涙) 書いて実行するたびにエラーが出てくるので質問させてもらいます>< どうぞよろしくお願いいたします.

  • プログラム・・・・

    プログラムには素人ですが、気になるので教えてください。 c言語 java visual Basic とかありますが、これはまったく違うものなんでしょうか? 例えば、c言語を極めた人が、javaとかはまったくの素人とかがあるのかが気になりました。 windows上のソフトを作る場合、何でも作れる言語とはなんなんでしょう? 例えば、それを完全に極めて、ゲームとかもすごく作れるようになったとして、その人に簡単なOSを作る課題を与えたとします、たった一人で、簡単なOSを作るのにどれだけの日数が掛かるのでしょう?