• ベストアンサー

プログラムの作り方。アイディアの出し方。

アイディアを思いつき、実際にプログラムを作る際、悩みます。 悩むのは、分からないではなくって、もっとよりよいのがあるのでは?と思うからです。 エゴグラムのような複数の質問から、各カテゴリーの回答のポイント数を表示するものを作ろうと思います。 (例えば、 おおざっぱ? => 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かで書いて頂けると、ありがたいです。

noname#15892
noname#15892
  • CGI
  • 回答数3
  • ありがとう数10

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

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

私ならば。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);

noname#15892
質問者

お礼

実際似作成して頂きありがとうございます。 私はPHPで作っていたので、考え方、アルゴリズムだけでも良かったのですが、私の知らない書き方があったので、とても勉強になりました。

その他の回答 (2)

回答No.3

判定の対応表を別に用意すると思います。 ID 文章 判定 1  aaa  A 2  bbb  AB のようなファイルを別途用意しておけば簡単なのでは? valueの値はIDあたりをいれることになります。 こうしておけば、問題文はエクセルあたりで作成・修正できますし、 HTMLのソースコードを見られても結果がばれることがなくなりますから。 ただし、出題ページをHTMLで直接書く場合は逆に面倒になりますが。

noname#15892
質問者

お礼

はい、考えとしては同じようなものになりました。 別のファイルにIDと文章、結果のデータを造り、それをランダムに表示させています。 質問はHTMLを考えていたのですが、結局はPHPになりました。 その方が柔軟に対応できたので。 皆さんありがとうございました。

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

長文になってしまいました。 >エゴグラムのような複数の質問から、各カテゴリーの回答のポイント数を表示するもの 中略 >ちょっと考えたのは、各質問のチェックボックスの値を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はまだ、マニュアル片手に関数を漁りながらですので、もっと効率的な方法があるかもしれません。

noname#15892
質問者

お礼

返事が遅れてしまって申し訳ありません。 結局、突貫工事で配列で整えることにしました。 ランダムに質問を選ぶのは、少し悩みましたが実装しました。 大変参考になりました。

関連するQ&A

  • 特定の文字列が入っているcheckboxのみオン

    初めて投稿いたします。 javascriptのcheckbox機能について質問させていただきます。 下記の機能を持ったjavascriptのブックマークレットを探しています。 1.の機能を持ったスクリプトを最優先とし、可能であれば、2.の機能も複合した形での スクリプトであると大変ありがたいです。 1.特定の文字列が記載されているチェックボックスだけをオンにする (□をチェックボックスとします) □a □b □c □d □aa □ab □ac □ad □aa □ab □ac □ad というようなチェックボックス郡があったときに、"a"と"ac"と"ad"の文字列が記載されているチェックボックスのみ チェックを入れるスクリプトです。なお、チェックボックスの数や記載内容は毎回異なります。 たとえば"ac"が記載されているチェックボックスが存在しないこともあり、その場合は"a"と"ad"が 記載されているチェックボックスのみチェックが入るようにしたいです。 チェックされる文字列の記載内容や種類(上記例の場合は"a","ac","ad"の3種類)が簡単に書き換え可能な スクリプトであれば尚良いです。 2.チェック可能な数量を限定する 1.で記載したチェック対象の文字列("a","ac","ad")が記載されているチェックボックスにチェックが入る際、 "a"が記載されたチェックボックスは最大で3個まで、 "ac"が記載されたチェックボックスは最大で5個まで、 "ad"が記載されたチェックボックスは最大で10個までしかチェックされないようにしたいです。 その際、チェックされるチェックボックスの選択方法に指定はありません。 たとえば"a"が記載されているチェックボックスにチェックが入る際、前から3個、後ろから3個、ランダムで3個 いずれのパターンであっても構いません。 こちらについても、最大数量を簡単に書き換え可能なスクリプトであると尚良いです。 拙い文章かと思いますが、ご回答いただける方をお待ちしております。

  • 【mysql : HTML】チェックボックスの処理

    チェックボックスで、複数の項目をフラグとして扱うにあたって ビット演算を使いたいと思っています。 この時、チェックボックスを作成するフォームの値は <input type="checkbox" name="category[]" value="1" />ライフ <input type="checkbox" name="category[]" value="2" />デジタルライフ <input type="checkbox" name="category[]" value="4" />趣味 <input type="checkbox" name="category[]" value="8" />エンターテイメント . . . と、valueの値をべき乗づつ増やしてくもしくは、あるいは value の値を1234としてやってあとでx2するかして それらの合計(例えばチェック状態が00101 なら 5)を DBに保存してやるというロジックでいいのでしょうか? 他のポータルサイトのソースをみても、そんなやり方してるサイトをみかけないので はたしてこれで合ってるのか不安になってきて質問させて頂きました。

    • ベストアンサー
    • MySQL
  • CGIプログラムに詳しい方よろしくお願いします。

    [選択してください]の項目を追加させたいのですが例えば下のような感じに この場合下記のタグをhtmlに添付するだけでいいのでしょうか? それともプログラムにも何かを追加する必要があるのでしょうか? 選択項目を付ける方法を教えてくれませんか [選択してください] あなたの血液型は? <SELECT name="blood"> <OPTION value="a" selected>A</OPTION> <OPTION value="b">B</OPTION> <OPTION value="o">O</OPTION> <OPTION value="ab">AB</OPTION> </SELECT>

    • ベストアンサー
    • CGI
  • チェックボックスの値の取得

    初歩的なことがわかりません。 チェックボックスをクリックしたときに、そのチェックボックスの値(Value)を取得する方法をアドバイス下さい。 <SCRIPT language=JavaScript> function test() alert(★)←この辺をうまく書きたい。 </SCRIPT> <INPUT TYPE="CHECKBOX" NAME="mycheck" VALUE="玄関" onclick="test()">玄関<BR> <INPUT TYPE="CHECKBOX" NAME="mycheck" VALUE="トイレ" onclick="test()">トイレ<BR> 「玄関」をクリックすると「玄関です」とalert 「トイレ」をクリックすると「トイレです」とalert 他のチェックボックスにチェックが入っているかは無視。クリックしたチェックボックスのvalueをalert。 下記質問の作業の初めの段階でつまづいています。 (^^; http://www.okweb.ne.jp/kotaeru.php3?q=387758

  • EXCELのSUMPRODUCTでエラーになります

    複数の条件を用いて集計をするのにSUMPRODUCTを使おうとしたら #VALUEエラーになります。 SUMPRODUCT((条件1)*(条件2)*(条件3)*(集計列))にすると #VALUEが出て、大かっこをはずすと0が返ります。 Oも答えではないので式が違っていると思われますが、 大かっこをつけると#VALUEが返るのが納得いきません。 宜しくお願いします。

  • HTML内外におけるチェックボックスの扱い

    ASPにおけるチェックボックスに関するご質問させていただきます。 現在、ASPファイルにおいて、チェックボックスを使用したプログラムを組んでいます。 作成しようとしているプログラムは、 「該当チェックボックスをチェックしたか否かで、確定ボタンを押したあとの移動先URLを変更する」ものです。 プログラムは以下のようになっています。 [abc.asp] <%@script language = vbscript %> Function SelectURL()  チェックされたチェックボックスの値を知りたい・・・☆ End Function <HTML> <HEAD> </HEAD> <BODY> <FORM NAME=frmCheck>    <INPUT TYPE=checkbox NAME=c1 VALUE="001">チェックボックス1    <INPUT TYPE=checkbox NAME=c2 VALUE="002">チェックボックス2    <INPUT TYPE=checkbox NAME=c3 VALUE="003">チェックボックス3 </FORM> </BODY> </HTML> このような状態です。 チェックボックスのうち、チェックされているもののVALUE値を知りたいのです。 値を知りたい場所は、☆印のある場所でです。 HTML内においては、document.frmCheck.c1.checked、.value等でチェックの有無は確認できるのですが、☆印はHTMLの外にあります。 何かアドバイスをいただければと思います。よろしくお願いします。

  • htmlのformの表示について【Jquery】

    <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.1.min.js"></script> <script type="text/javascript"> function formChanged(ev){ var sel = $('.chk:checked').map(function () { return this.checked ? this.value : null; }).get().join(); $("#output").text(sel); } formChanged(null); $(document).on("change",'.chk:checked',formChanged); </script> <form method="post" action="mail.php"> <table> <tr> <th>カテゴリー</th> <td> ・ABC: <input type="checkbox" name="カテゴリー[]" value="[abc]" class="chk" /> ・DEF: <input type="checkbox" name="カテゴリー[]" value="[def]" class="chk" /> ・GHI: <input type="checkbox" name="カテゴリー[]" value="[ghi]" class="chk" /> </tr> <tr> <th>選択した製品シリーズ</th> <td><span id="output"></span></td> </tr> <tr> </table> </form> これは、チェックボックスにチェックをいれたチェックボックスの値がリアルタイムに表示される仕組みなのですが、逆にチェックを外した場合は、値が消えません。消えるようにするにはどうしたらいいでしょうか。アドバイスをいただけると幸いです。

  • クロス集計のSQL

    accessのクエリにクロス集計があります 例えば person sex 血液型 ------ --- ------ 111 1 A 222 2 B 333 1 O 100 2 AB ・ ・ 集計↓ sex A B AB O 他 ---- - - - - - 1 15 45 20 10 5 2 20 30 21 12 2 数字は適当です こんな集計をするSQLを知りたいと思っています どこか、これに近いテーマでSQLを解説している サイトでもいいので、ご教授お願いします

    • ベストアンサー
    • MySQL
  • チェックボックスの値を、ページまたぎさせる

    質問内容が伝わりにくかったら申し訳ありません。 現在、aspを使い、以下のようなプログラムを組もうとしています。 [ファイル] 1.asp 1-1.asp 2.asp [仕様] ○1.aspにある「A」ボタンを押すと、1-1.aspが別窓で開く。 ○1-1.aspにはチェックボックスが30個、「確定」ボタン、「戻る」ボタンがある。「確定」ボタンを押すと、チェックボックスの値を保持し、1-1.aspを閉じる。「戻る」ボタンを押すと、チェックボックスの値を保持せず、1-1.aspを閉じる。 ○1.aspにある「B」ボタンを押すと、2.aspが開く。 ○2.aspにおいて、1-1.aspでチェックされた値を利用する。 つまり、1-1.aspでチェックした値を、2.aspで利用したいのです。 私が考えたプログラムは、以下のとおりです。 しかし、このプログラムだと、(1)の行でエラーが起きてしまうようです。 [1-1.asp] <form method=post action="2.asp"> <input type=checkbox name="chk" value="1"> <input type=checkbox name="chk" value="2"> <input type=checkbox name="chk" value="3"> ・ ・ <input type=checkbox name="chk" value="30"> </form> [2.asp] <% SCRIPT LANGUAGE = JAVASCRIPT %> <% Dim a,a_split,b a=Request.Form("chk") ・・・(1) a_split=split(a,",") for each b in a_split Response.Write(b) next %> <input type=hidden>で送る方法等も検索してみましたが、やはり「次のページへチェックボックスの値を送る」方法はあるのですが、「ページをまたぐ」ような処理が分かりません。 どなたか、[仕様]を達成できるようなプログラムのご教授をお願いいたします。

  • 複数のチェックボックス項目があり、そのチェック状態によって

    複数のチェックボックス項目があり、そのチェック状態によって 処理を分岐したいのですが、スマートなjavascriptの書き方が あれば教えてください! 【例】 <input type="checkbox" name="koumokuA" value="A1" /> <input type="checkbox" name="koumokuA" value="A2" /> <input type="checkbox" name="koumokuA" value="A3" /> <input type="checkbox" name="koumokuA" value="A4" /> <input type="checkbox" name="koumokuA" value="A5" /> <input type="checkbox" name="koumokuB" value="B1" /> <input type="checkbox" name="koumokuB" value="B2" /> <input type="checkbox" name="koumokuB" value="B3" /> <input type="checkbox" name="koumokuB" value="B4" /> <input type="checkbox" name="koumokuC" value="C1" /> <input type="checkbox" name="koumokuC" value="C2" /> <input type="checkbox" name="koumokuC" value="C3" /> <input type="checkbox" name="koumokuC" value="C4" /> もし【koumokuA】のA2とA3、【koumokuB】のB1とB4が選択された場合 同項目ではor条件、他項目ではand条件で処理したいので 考え方としては、 if(koumokuA=="A2" || koumokuA=="A3"){ if(koumokuB=="B1" || koumokuB=="B4"){ 実行内容 } } こんな感じなのですが、 実際にはチェックボックスの値は配列になるのでこのスクリプトでは動かない点と 効率よく複数のチェックボックスの選択結果を判定して、スクリプトを実行する 組み方があればご教授ください。 実行結果は、データが格納された配列の中から、選択項目に対応したデータを 表示するようにしたいのです。 よろしくお願いします。

専門家に質問してみよう