
アイディアを思いつき、実際にプログラムを作る際、悩みます。
悩むのは、分からないではなくって、もっとよりよいのがあるのでは?と思うからです。
エゴグラムのような複数の質問から、各カテゴリーの回答のポイント数を表示するものを作ろうと思います。
(例えば、
おおざっぱ? => 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かで書いて頂けると、ありがたいです。
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);
実際似作成して頂きありがとうございます。
私はPHPで作っていたので、考え方、アルゴリズムだけでも良かったのですが、私の知らない書き方があったので、とても勉強になりました。
No.3
- 回答日時:
判定の対応表を別に用意すると思います。
ID 文章 判定
1 aaa A
2 bbb AB
のようなファイルを別途用意しておけば簡単なのでは?
valueの値はIDあたりをいれることになります。
こうしておけば、問題文はエクセルあたりで作成・修正できますし、
HTMLのソースコードを見られても結果がばれることがなくなりますから。
ただし、出題ページをHTMLで直接書く場合は逆に面倒になりますが。
はい、考えとしては同じようなものになりました。
別のファイルにIDと文章、結果のデータを造り、それをランダムに表示させています。
質問はHTMLを考えていたのですが、結局はPHPになりました。
その方が柔軟に対応できたので。
皆さんありがとうございました。

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はまだ、マニュアル片手に関数を漁りながらですので、もっと効率的な方法があるかもしれません。
返事が遅れてしまって申し訳ありません。
結局、突貫工事で配列で整えることにしました。
ランダムに質問を選ぶのは、少し悩みましたが実装しました。
大変参考になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 50台の織機から回転数を取得・集計しモニターに表示したい 2 2022/11/05 15:48
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- 医学 【血液型の不思議な現象に気付きました】B型とAB型は男より女の方が多いです。A型は女よ 3 2023/04/25 23:57
- その他(教育・科学・学問) ABO血液型について(A型の亜型) 1 2023/04/22 12:06
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- 数学 時々、回答者の見識に疑念を抱いてしまうんです。私だって本当は皆様のことを疑いたくはありません。しかし 2 2022/11/27 12:23
- その他(悩み相談・人生相談) お酒が飲める人と飲めない人はどちらが人生で得をしていると思いますか? 4 2022/08/20 20:41
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
Excel VBAで行追加後の...
-
CGIやPHPで外部ファイルの内容...
-
フォームからの値
-
linq で 楽天ウェブサービスのX...
-
プログラムの作り方。アイディ...
-
ブルダウンで1項目を選択したの...
-
途中まで出来ているのですが‥(D...
-
CGIでのページ指定~その(2)
-
VB2010 のユーザコントロールの...
-
このCGIサブルーチンを解説して...
-
【VB2005】メソッドに渡したデ...
-
フォーム入力(CGIでデータ取得)...
-
LISPで連想配列の操作?
-
FLASHとCGIでのデータの受け渡...
-
perlでtelnetクライアント
-
C言語:単語カウント
-
【プルダウンで選んでGOボタン...
-
Pythonのプログラミングの質問...
-
Perlの書き方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
リロード後にプルダウンの選択...
-
map(STL)でinsertを行いたいで...
-
CGIでのページ指定~その(2)
-
CGI(Perl)で、Net::FTPを使いたい
-
linq で 楽天ウェブサービスのX...
-
ラズパイで感圧センサーを動か...
-
gpioを使ってSPIをシミュレーシ...
-
アンケートフォームのvalueの値...
-
iteratorの再利用について
-
Perlでアルファベットを数...
-
途中まで出来ているのですが‥(D...
-
VB2010 のユーザコントロールの...
-
半角スペースが有効にならない。
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
セレクトメニューで2つの項目...
-
<SELECT>タグの折り返し
-
16進の10進変換について
おすすめ情報