[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.013 変数を配列にして簡潔に書いてみた

変数を配列にして簡潔に書いてみた



本文(発行内容)


<変数を配列にして簡潔に書いてみた>

こんにちは、Ken3です。

前回は、
No.12 Left関数を使ってみた、ファイル設計?
で、
ファイルフォーマットを変更して、
少しはわかりやすくプログラムを組んだつもりです。
が、
今回も、もう一人の心の中のKen3が納得してないので、
配列変数を使った集計プログラムに変更してみます。
(実はVBA系のメルマガ( http://www.ken3.org/vba/ )、で2次元配列書いてて、
 ASP側もやらないとマズイとフト思っただけなんだけなんだけど)

あまり期待しないでね。

/*
 * 1.前回の復習 
*/

いつものように前置きが長くなるけどご勘弁を。

目的は、
5段階の評価を収集・集計するアンケートを作成する。
5、満足
4、まぁまぁ
3、どちらとも言えない
2、少し不満
1、不満

アンケートの書き込み方法は(データの入り口は)、
2種類あって、

http://www.ken3.org/cgi-bin/test/test012.html
でフォームからの入力、
メールからの直接入力は(URLリンク)
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=5  5、満足
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=4  4、まぁまぁ
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=3  3、どちらとも言えない
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=2  2、少し不満
http://www.ken3.org/cgi-bin/test/test012-1.asp?a=1  1、不満
で
test012-1.aspにデータを渡し、test012.txt に書き込みます。

データは、
test012.txt ( http://www.ken3.org/cgi-bin/test/test012.txt )
に評価と時刻を下記のように書込みました。
2,少し不満,2002/12/09 20:15:52
5,満足,2002/12/09 20:16:09
4,まぁまぁ,2002/12/09 20:16:12
 ・
 ・
 ・
1,不満,2002/12/10 10:42:45
2,少し不満,2002/12/10 12:32:17
3,どちらとも言えない,2002/12/10 14:15:42

このデータを読み込んで、
http://www.ken3.org/cgi-bin/test/test012-2.asp
で、集計(結果表示)します。

/*
 * 2.修正が入りました。
*/

まぁ、それなりに動作していて、テストで押してくれる人も居て、
メルマガ読んでくれてるんだなぁ
と
ほっと一安心です。
下記の結果には少し残念だったけど
-- http://www.ken3.org/cgi-bin/test/test012-2.asp  12月10日時の集計値は
5、満足は、4人
4、まぁまぁは、1人
3、どちらとも言えないは、3人
2、少し不満は、6人
1、不満は、4人
-- でした。
不満が多いなぁ
って、そんなくだらない話を三流君がしてるからでしょ。
そんな5段階の評価ぐらいで落ち込むなって。

ヨシ、元気出すためにオレが考えた下記の2項目追加してよ。
6、大変満足、知人に教える
0、かなり不満、解除します
上記2点を追加して、5段階から7段階に変更してよ。
ねっ、6の大変満足が集計されると元気出るでしょ。

おいおい、じゃなんで、0のかなり不満解除が入ってんだよ。

3が中心だから、バランス取らなきゃ(笑)

なんて流れで、7段階評価への修正が入ってしまった。

/*
 * 3.アナタならどうする? 力技の単純修正
*/
さて、test012を修正するか。
今日は流れの変更無くて簡単だから、
Ken3お気に入りの一番弟子の
カッぺ君にやってもらうか、
カッペ君の特技は、カットandペーストで、大量の修正も苦にしないしね。

基本的にはアンケート項目増やすから、
変数追加すればOKだよ。
じゃ、カッペ君ヨロシクね。危なくなったら手伝うよ。

新キャラとして生き残れるか(笑)
のカットandペースト大好きのカッペ君の修正が始まった。

ア.HTMLフォームの修正

まずは、
test012.htmlをtest013.htmlにコピーする。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
オレ様の方法は、
エクスプローラーでtest012.htmlクリック後、
Ctrl+C(コピー)、すぐにCtrl+V(貼り付け)ってやると、
コピー 〜 test012.htmlってファイル名が下のほうに作成されるので、
その名前をF2を押してtest013.htmlに変更するね。
おっと、慣れない素人さんは、右クリック使うか、
新規ファイル作成後コピーでもいいよ。

Ken3)そんなのどうでもいいからハヤクやれ。

-- test012をコピーした初期状態 --
<html>
<head>
<title>tset012.html 満足度を入力</title>
</head>
<body>
<h2>tset012.html 満足度を入力</h2>
<br>

<FORM ACTION="test012-1.asp" METHOD="GET">
このメルマガの満足度は?選択後、送信ボタンを押してください。<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="5">5.満足<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="4">4.まぁまぁ<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="3">3.どちらとも言えない<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="2">2.少し不満<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="1">1.不満<br>
<br>
<INPUT TYPE="submit" VALUE="送 信">
<INPUT TYPE="reset"  VALUE="入力クリア">
</FORM>
<br>
</body>
</html>
---

012の場所を013に変更、簡単だよね。
と
6大変満足、知人に教える
0かなり不満、解除します
を追加だよね。楽勝楽勝。

問題無いよね。
-- http://www.ken3.org/cgi-bin/test/test013.html --
<html>
<head>
<title>tset013.html 満足度を入力</title>
</head>
<body>
<h2>tset013.html 満足度を入力</h2>
<br>

<FORM ACTION="test013-1.asp" METHOD="GET">
このメルマガの満足度は?選択後、送信ボタンを押してください。<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="6">6.大変満足、知人に教えます<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="5">5.満足<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="4">4.まぁまぁ<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="3">3.どちらとも言えない<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="2">2.少し不満<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="1">1.不満<br>
<INPUT TYPE="RADIO" NAME="a" VALUE="0">0.かなり不満、解除します<br>
<br>
<INPUT TYPE="submit" VALUE="送 信">
<INPUT TYPE="reset"  VALUE="入力クリア">
</FORM>
<br>
</body>
</html>
-- 
オレって、キー操作速いしね。

Ken3)あまりプログラムにキー打ちの速さは関係無いけどね

イ.書き込み部、test012-1.aspを修正してtest013-1.aspを作成

同様にまず、コピーして、test013-1.aspを作成するよ。
同じように、012を013へ、
6大変満足、知人に教える
0かなり不満、解除します
を追加だよね。楽勝楽勝。

-- 修正した test013-1.asp --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>テキストファイルに6〜0のアンケート結果を書き込む</title>
</head>
<body>
<h2>テキストファイルに6〜0のアンケート結果を書き込む</h2>
test013-1.asp<br>
<hr>
<%
    'アンケートの結果をまず判断する
strMSG = "不正なパラメーターです"  'エラーメッセージを初期値として代入
if Request.QueryString("a") = "6" then strMSG = "大変満足"    'asp013追加
if Request.QueryString("a") = "5" then strMSG = "満足" 
if Request.QueryString("a") = "4" then strMSG = "まぁまぁ" 
if Request.QueryString("a") = "3" then strMSG = "どちらとも言えない" 
if Request.QueryString("a") = "2" then strMSG = "少し不満" 
if Request.QueryString("a") = "1" then strMSG = "不満" 
if Request.QueryString("a") = "0" then strMSG = "かなり不満"  'asp013追加

If strMSG = "不正なパラメーターです" Then 'エラーパラメータのままか?チェック
    Response.Write "データを正しく受け取れませんでした<br>"
Else
    'FileSystemObjectを生成します。
    Set objFS = Server.CreateObject("Scripting.FileSystemObject")

    'test013.txt を追加モードで開く  012 --> 013へ
    Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 8, True)

    'ファイルにアンケート結果のデータを書き込む
    ts.write Request.QueryString("a") & ","   '結果0〜6を書く
    ts.write strMSG & ","    'ファイルに結果を書き込む
    ts.write Now             '時刻を書く

    ts.write chr(13) & chr(10)  '改行する

    '*4使ったファイルは閉じようよ
    ts.close
End if

Response.Write "パラメーターは<b>" & strMSG & "</b>"  '表示もついでに行う

%>
<hr>
回答、<b>ありがとうございます</b><br>
<A HREF="test013.txt" target="_new">結果の生データ、test013.txtを見る</A><br>
<br>
</body>
</html>
-- ここまで --

余裕だね、次は、結果の集計だよね。

ウ.読み込み・集計部、test012-2.aspを修正してtest013-2.aspを作成

これも同様にまず、コピーして、test013-2.aspを作成するよ。
同じように、012を013へ、
6大変満足、知人に教える
0かなり不満、解除します
を追加だよね。楽勝楽勝。

Ken3)メルマガ書くのも時間かかったけどここまでコピーだった(笑)

-- 修正後のtest013-2.asp  --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>7段階評価に増やしてみた</title>
</head>
<body>
<h2>7段階評価に増やしてみた</h2>
test013-2.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT06     '大変満足 カウンター asp013で修正
dim nCNT05     '満足 カウンター
dim nCNT04     'まぁまぁ カウンター
dim nCNT03     'どちらとも言えない カウンター
dim nCNT02     '少し不満 カウンター
dim nCNT01     '不満 カウンター
dim nCNT00     'かなり不満 カウンター asp013で修正

nCNT00 = 0 'asp013
nCNT01 = 0 '*1 カウンターを初期化しておく
nCNT02 = 0
nCNT03 = 0
nCNT04 = 0
nCNT05 = 0
nCNT06 = 0 'asp013

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    '*2 Left関数を使って左から1文字目を判断、見つかったらカウントアップ
    Select Case Left(strRECORD, 1)  '読みこんだレコードの1文字目
        Case "6": nCNT06 = nCNT06 + 1  'asp013
        Case "5": nCNT05 = nCNT05 + 1
        Case "4": nCNT04 = nCNT04 + 1
        Case "3": nCNT03 = nCNT03 + 1
        Case "2": nCNT02 = nCNT02 + 1
        Case "1": nCNT01 = nCNT01 + 1
        Case "0": nCNT00 = nCNT00 + 1  'asp013
    End Select
Loop

ts.close  '使ったファイルは閉じようよ

'*3結果の表示
Response.Write "6、大変満足は、" & nCNT06 & "人<BR>"   'asp013
Response.Write "5、満足は、" & nCNT05 & "人<BR>"
Response.Write "4、まぁまぁは、" & nCNT04 & "人<BR>"
Response.Write "3、どちらとも言えないは、" & nCNT03 & "人<BR>"
Response.Write "2、少し不満は、" & nCNT02 & "人<BR>"
Response.Write "1、不満は、" & nCNT01 & "人<BR>"
Response.Write "0、かなり不満は、" & nCNT00 & "人<BR>" 'asp013
%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
<hr>
</body>
</html>
--

修正完了、できたよ三流師匠。

テストはしたの?
あっ、やってないや、でもこんなの動くでしょ。

やってよ、修正ミスあるかもしれないんだから。

http://www.ken3.org/cgi-bin/test/test013.html
でフォームからの入力

http://www.ken3.org/cgi-bin/test/test013-1.asp?a=6  6、大変満足
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=5  5、満足
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=4  4、まぁまぁ
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=3  3、どちらとも言えない
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=2  2、少し不満
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=1  1、不満
http://www.ken3.org/cgi-bin/test/test013-1.asp?a=0  0、かなり不満、解除する
直接クリックもOK

集計結果
http://www.ken3.org/cgi-bin/test/test013-2.asp
を
テキストファイル
http://www.ken3.org/cgi-bin/test/test013.txt
と比べて、テストしておいてね。

まぁ、これぐらいの修正は、カッペ君でも余裕かなぁ。
テスト結果を寝て待つかな。

/*
 * 4.配列変数の使用
*/

ここまで、お付き合いどうも。
新キャラ、カッペ君は、、書いててイマイチでしたね。
(今後登場するかは微妙かなぁ)

ふざけてるとまた、マジメな人からお叱りメール届くので、
ここらから少しだけマジメに。

なんか、修正してて(聞いてて)、バカっぽかったですよね。
そんなキャラもありだけど、配列変数とループを使用すると、
少しはキレイに書けるんですよ。

配列変数って?なに?

通常の変数って、
A = 10 や CNT1 = 5, CNT2 = 20 と変数名を付けて値を代入したりしてました。
配列変数ってのは、
Dim A(10)
A(1) = 2 : A(5) = 6
みたいに、
変数名(インデックス)
で、複数の値を管理できるんですよ。
ExcelのセルでA1,A2,A3
が、
A(1) A(2) A(3)
みたいな感じで(チョット違うか)

ポイントを書くと、
変数の宣言方法が、
Dim 変数名(要素の数)
使う時は、
変数名(インデックス)
です。

くだらねぇ解説はいいからさ、なんで便利なんだよ。
(詳細はヘルプ見るから、とっとと、プログラム書けよ)

-- test013-3.asp --
<%@LANGUAGE=VBScript%>
<html>
<head>
<title>配列変数を使用してみた</title>
</head>
<body>
<h2>配列変数を使用してみた</h2>
test013-3.asp<br>
<hr>

<%
dim strRECORD  'レコード内容を一時保存
dim nCNT(10)   '*1 カウンター 変数 10個もいらないけど

'*2 カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

'FileSystemObjectを生成します、、って英文、そのままジャン。
Set objFS = Server.CreateObject("Scripting.FileSystemObject")

'test013.txt 結果ファイルを読取専用モードで開く
Set ts = objFS.OpenTextFile(Server.MapPath("test013.txt"), 1, True)

Do While ts.AtEndOfStream = False  'ファイルの終端になってない間ループする
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
    '*3 Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換
    '*4 nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1
Loop

ts.close  '使ったファイルは閉じようよ

'*5結果の表示
Response.Write "6、大変満足は、" & nCNT(6) & "人<BR>" 
Response.Write "5、満足は、" & nCNT(5) & "人<BR>"
Response.Write "4、まぁまぁは、" & nCNT(4) & "人<BR>"
Response.Write "3、どちらとも言えないは、" & nCNT(3) & "人<BR>"
Response.Write "2、少し不満は、" & nCNT(2) & "人<BR>"
Response.Write "1、不満は、" & nCNT(1) & "人<BR>"
Response.Write "0、かなり不満は、" & nCNT(0) & "人<BR>"
%>
<hr>
アンケート結果はこんな感じです。<br>
<A HREF="test013.txt" target="_new">元データtest013.txtを見る</A><br>
<br>
<br>
</body>
</html>
---

まず、1つ目のポイントは、
dim nCNT(10)   '*1 カウンター 変数 10個もいらないけど
で、10個もいらないんだけど、
nCNT変数を配列で0から10使いますよと宣言

'*2 カウンター変数をループで初期化しておく
For i = 0 to 10
    nCNT(i) = 0 
Next 

ここは、
nCNT(0) = 0
nCNT(1) = 0
とやると、疲れるし、カッコつけたかったので
ループでまわして、
カウンターのi番目に0を代入、初期化してたんですね。

次が、集計部で、
    strRECORD = ts.ReadLine   'ファイルからデータを一行を読む
とstrRECORDに1レコードデータが入ります。
4,まぁまぁ,2002/12/10 16:28:16
と変数に入っているので、

    '*3 Left関数を使って左から1文字目をCintで数値変換
    i = Cint(Left(strRECORD, 1))  '読みこんだレコードの1文字目を数値変換

Left(strRECORD, 1)
は左から1文字取出す、ここでは4
その4を数値に変換するために、
Cint関数で変換し、変数iに入れてます。

    '*4 nCNT(i番目)をカウントアップ
    nCNT(i) = nCNT(i) + 1

ここでは、
nCNT(i番目) = nCNT(i番目) + 1
と評価の4番目がカウントアップされます。

最後の表示では、芸無く、
'*5結果の表示
Response.Write "6、大変満足は、" & nCNT(6) & "人<BR>" 
Response.Write "5、満足は、" & nCNT(5) & "人<BR>"
Response.Write "4、まぁまぁは、" & nCNT(4) & "人<BR>"
と、
nCNT(X番目)の値を表示します。
*ここも、次回の改造項目かなぁ。

どうでしょうか?
配列を使うと、スッキリするし、
10段階評価に増えた時も修正が楽ですよね。

配列の使い方、マスターすると、一味違ったプログラムが書けます。
ぜひマスターしてくださいね。

/*
 * 5.終わりの挨拶
*/

今回は、
・5段階から7段階評価へプログラム修正(カッペ君登場)
・配列の使い方、マスターすると、一味違ったプログラムが書けます
でした。

プログラムはいろいろな書き方あるので、
人をうならせるプログラムをみなさんは書いてくださいね。

でも、まだまだ、イマイチなんだよね。
いろいろとある改善点は次回に。
道のりは遠いなぁ〜。

またね(笑)

何か質問・感想があったら、気軽に、
メール、掲示板に書き込んでくださいね。

三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: