- ベストアンサー
プログラムの作り方。アイディアの出し方。
アイディアを思いつき、実際にプログラムを作る際、悩みます。 悩むのは、分からないではなくって、もっとよりよいのがあるのでは?と思うからです。 エゴグラムのような複数の質問から、各カテゴリーの回答のポイント数を表示するものを作ろうと思います。 (例えば、 おおざっぱ? => O型 神経質ですか? => A型 計画的ではない。 => O型 2面性有り => AB型 ・・・・ A型が1、O型が2、AB型が1等) 最終的に各カテゴリーの質問の集計が求められるスクリプトになればいいのですが、みなさんはどういった方法で集計しますか? 補足の条件としては、質問は気軽に順番を変えられるようにしたいので、スクリプト内で a_group = qes1+qes5+qes7+qes12;(それぞれが、同じカテゴリーの質問、この場合はチェックボックスの値が1とする。) と、単純にはしたくないのですが。 これが一番簡単だとは思いますが、後々の応用がしにくくなるし。 ちょっと考えたのは、各質問のチェックボックスの値をvalue="a_gata",value="b_gata"にして配列に入れれば、サブルーチンの中におさまるかなー、と。 質問を作る際にも、分かりやすいし。 それを戻り値にすれば、後の処理でカウントも合計もできるかと。 グローバス変数を使わなくても済むし。(←これは条件ではないけど。) みなさんは、「エゴグラムを作って」と頼まれた時に、どんな方法で実現させますか? あ、CGIとなってますが、PHPかPerlかで書いて頂けると、ありがたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
私ならば。Perlです。 動作テストをしたソース全文。 #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<html>\n"; print "<head><title>testpage</title></head>\n"; print "<body>\n"; # データデコード処理 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\n//g; #フォーム変数へ $FORM{$name} = $value; } # グループ設定 $qes1 = 'a'; $qes2 = 'b'; $qes3 = 'c'; $qes4 = 'c'; $qes5 = 'a'; $qes5 = 'b'; $qes6 = 'c'; $qes7 = 'b'; $qes8 = 'b'; $qes9 = 'a'; $qes10 = 'c'; $qes11 = 'a'; $qes12 = 'b'; for(1..12){ $q = 'qes' .$_; if ($FORM{$q}) { $$$q++; } } # $a / $b / $c に結果(チェックされた数)が入るprint qq|<hr>|; print qq|結果:<br>\n|; print qq|A:$a <br>\n|; print qq|B:$b <br>\n|; print qq|C:$c <br>\n|; print qq|<hr>|; print qq|<form>\n|; for(1..12) { $q = 'qes' .$_; print qq|<input type="radio" name="$q" value="">$_ なし|; print qq|<input type="radio" name="$q" value="1" checked>$_ あり|; print qq|<br>\n|; } print qq|<input type="submit">\n|; print qq|</form>\n|; print "</body>\n"; print "</html>\n"; exit(0);
その他の回答 (2)
- natsuki_tk
- ベストアンサー率35% (99/279)
判定の対応表を別に用意すると思います。 ID 文章 判定 1 aaa A 2 bbb AB のようなファイルを別途用意しておけば簡単なのでは? valueの値はIDあたりをいれることになります。 こうしておけば、問題文はエクセルあたりで作成・修正できますし、 HTMLのソースコードを見られても結果がばれることがなくなりますから。 ただし、出題ページをHTMLで直接書く場合は逆に面倒になりますが。
お礼
はい、考えとしては同じようなものになりました。 別のファイルにIDと文章、結果のデータを造り、それをランダムに表示させています。 質問はHTMLを考えていたのですが、結局はPHPになりました。 その方が柔軟に対応できたので。 皆さんありがとうございました。
- hrm_mmm
- ベストアンサー率63% (292/459)
長文になってしまいました。 >エゴグラムのような複数の質問から、各カテゴリーの回答のポイント数を表示するもの 中略 >ちょっと考えたのは、各質問のチェックボックスの値をvalue="a_gata",value="b_gata"にして配列に入れれば、サブルーチンの中におさまるかなー、と。 php で作るなら nameに配列( box[] といった表現)が使えますし、配列操作関数もいろいろ用意されているので、楽にプログラミングできそうに思います。 こういう心理診断系のは、質問文の表示順序によっても左右されるのでプログラム側でランダム表示させたりしたいですね。 そのためには2次元ハッシュ配列に質問文を入れておいて表示させるとかを考えます。 データはこんな感じ $data = array( "A"=> array( 1=> "文1", "文2", "文3" ), "B"=> array( 1=> "文1", "文2", "文3" ) ); この変数の中身を入れ替えれば、血型占いにもエゴグラムやエニアグラムにもなります。 ランダム順表示は自分で考えてみて下さい。「配列のランダムな並べかえ」あたりで検索するといろいろ方法論がヒットするかと思います。 phpなら array_rand ($ar, 3); といった関数もありますが、今回の場合、どの階層をランダム表示するのかをよく考える必要があります。 それから質問文表示、こんな感じでどうでしょう。 // $en:各タイプ質問個数 // $data[$i][$j] $iカテゴリー別 $j各質問文No // $boxname:checkbox名 こういう頻出するデータは、プログラム先頭で変数に入れておくと、名前だけ変えたい時に一カ所変更で済む。 print '<ul>'; for($j=1; $j<=$en; $j++ ){ print '<li>質問 ' . $j . "\n<ul>"; foreach( array_keys($data) as $i){ print '<li><input name="' .$boxname. '[]" type="checkbox" value="' .$i. '">' .$data[$i][$j]. '</li>'; } print "</ul></li>\n"; } print "</ul>\n"; 各カテゴリーの質問文がひとつずつ入ったブロックを、カテゴリー内の質問個数分並べるというかたちになってます。 エニアグラムのホームページでこのようにして、前半で疲れて、後半をチェックしなくてもそれなりに診断がでるというものを見たのでまねてみました。 こういったものは、何を扱っているのかによって、微妙な工夫の余地があります。 >それを戻り値にすれば、後の処理でカウントも合計もできるかと。 まさにそのとおり、phpだとこんな風 // $kaitoは先に初期化しておく foreach( array_keys($data) as $i){ $kaito[ $i ] =0; } if( $_SERVER['REQUEST_METHOD'] == 'POST'){ $chknum = count ( $_POST[ $boxname ] ); for($i=0; $i<$chknum; $i++ ){ $kaito[ $_POST[ $boxname ][$i] ] ++; } // ここで結果出力 } こんなところで参考になりますか? 私もphpはまだ、マニュアル片手に関数を漁りながらですので、もっと効率的な方法があるかもしれません。
お礼
返事が遅れてしまって申し訳ありません。 結局、突貫工事で配列で整えることにしました。 ランダムに質問を選ぶのは、少し悩みましたが実装しました。 大変参考になりました。
お礼
実際似作成して頂きありがとうございます。 私はPHPで作っていたので、考え方、アルゴリズムだけでも良かったのですが、私の知らない書き方があったので、とても勉強になりました。