HSP3dishで顧客管理の計算 その1

:ある商店では商品に1日当たり10円の広告料を支払っています。

:商品の価格は1500円です。

:ある顧客KとTはいつも二人で来店します。

:KとTのどちらかが商品を購入します。二人同時に購入することはありません。

:購入してくれる確率は1/300日です。つまり来店300回に1回の割合です。

:Kさんが購入した場合、次の日にまたこのうちの二人のどちらかが商品を購入します。
この間、広告料はかかりません。

:Tさんが購入した場合、インセンティブとして100日間有効のドリンクサービス券を渡します。
その効果でその後100日間は広告料がかからないものとします。

:どちらの顧客が商品を購入するのか?その割合は6:4です。
Kさんが60%、Tさんが40%です。

[ Q ] 広告料は何円まで引き上げても利益が出るでしょうか?


step1
広告料のかからない100日間で再度商品が購入される確率を求めましょう。

;商品購入確率
buy=300.0

;インセンティブ期間 100日
incent=100

;Kさんが購入する割合
Ksan=0.60
;Tさんが購入する割合
Tsan=0.40

;インセンティブ1日目で購入されない確率pro1
pro1=0.00
pro1=(buy-1)/buy
;pro1=0.99667

;指数計算を使う道具 hspmath.asをインクルード
#include “hspmath.as”

;インセンティブ期間の100日で購入されない確率pro2
;ここで実数として定義しておかないと下のpow関数でエラーが出る
pro2=0.00
pro2=pow(pro1,incent)
;pro2=0.716132

;インセンティブ期間の100日で購入される確率pro3
;単にpro3=1-pro2にしたら答えは1になってしまう。
pro3=0.00
pro3=1.00-pro2
;pro3=0.283868

∴インセンティブ期間の100日で再度購入される確率は28.3868 %


step2
一度商品が購入されると平均何回連続で商品が売れるのか?
その回数を求めましょう。
広告料がかからない100日間で再度商品が購入された場合も
連続して商品が購入されたものとみなします。

;インセンティブ期間の購入も含めて連続して購入される確率pro4
pro4=0.00
pro4=Ksan+(1.00-Ksan)*pro3
;pro4 0.663753=0.713547

;平均購入回数用 変数
cont=0.00

;0で除算しましたエラー回避用 変数pro5
pro5=0.00
pro5=1.00-pro4

;普通にcont=1/(1-pro4) とすると0で除算しましたエラー。
;100倍するとエラー出なかった
pro5=pro5*100
cont=(1.00/pro5)*100
;平均購入回数 cont=3.490974

∴平均購入回数は3.490974 回


その2に続く


——————————————



計算機アプリを作ってみる5

ーーーーーーーーーーーーーーーーーーーーーーーー
import UIKit

class ViewController: UIViewController {

var aho:Int? //数値型の使い捨て変数

@IBOutlet weak var tapnum: UITextField!

//
中略
//

@IBAction func tap1z(_ sender: Any) {

let value=tapnum.text!+”1″

if let aho=Int(value) {
tapnum.text=”\(String(describing: aho))”
}
ーーーーーーーーーーーーーーーーーーーーーーーー

上のように変更。
最初の方の
class ViewController: UIViewController { 

@IBOutlet weak var tapnum: UITextField!
の間に

var aho:Int? //数値型の使い捨て変数

使い捨ての変数ahoを作ってみる。
最後に?をつけてるのはオプショナル型変数ですよというのを宣言しているそうな。
オプショナル型変数というのはよーわからんけどこの変数はひょっとするとnilかもしれないよ、ということらしい。
nilというのは何も無いという意味らしい。

で、このオプショナル型変数を使うときは「こいつはnilではありませんよ」ということを証明してからでないと使えないそうな。
何じゃそりゃ。
この証明する行為をアンラップすると言うそうな。

アンラップのやり方やけど上の変更の中略以降の処理

if let aho=Int(value) {
tapnum.text=”\(String(describing: aho))”
}

こんな風に書くらしい。
ahoがnilでは無いことが証明されたら文字列valueがInt命令により数値型でahoに代入され、if文内の文字表示処理が実行される。

ビルドしてシミューレータで確認。


はい。先頭の0が無事取れて1の文字列が表示できるようになりました。

はー
nilがどうたらとかアンラップしないと使えないとか面倒くさいw

とにかくこれで数字の表示は出来そうなので同じ処理を数字の2~9までやっていきます。

計算機アプリを作ってみる4

さて、前回は配置されたボタンやテキストフィールドとViewControllerのソースコードと紐付けをしました。

しかしまだまだ不十分。

ここからこの

@IBAction func tap1z(_ sender: Any) {
}

の部分にいろいろ書いていかないといけないようです。

まず最初にtapnum.textに”1”という文字列を最後尾に付け足す処理です。
{}の中に以下の記述をしてみたところ

let value=tapnum.text+”1″ //文字列tapnumに”1”を付け足す


するとswift先生に怒られる。
アンラップされてないからうんたらかんたら。

どうも”?”か”!”をつけろと言っているらしい。
エラーが出たらその下にswift先生が解決策候補を提示してくれるのでダブルクリックしたら”!”が追加されてエラーが消えました。

ちなみに//と書けばそのあとは自由にコメントが書けるようです。
HSPの”;”の役目ですな。

さて”!”を付けて以下のように記述しました。

ーーーーーーーーーーーーーーーーーーーーーーーー
@IBAction func tap1z(_ sender: Any) { //1がタップされた。

let value=tapnum.text!+”1″ //文字列tapnumに1を付け足す
let aho=Int(value) //01という文字列になるので数値型にして1に
tapnum.text=”\(aho)” //数字表示エリアに文字列表示
}
ーーーーーーーーーーーーーーーーーーーーーーーー

さーてちゃんと表示できるかなー?
シミュレーターで確認してみました。


1をタップしてみると数字が表示されるところに
Optional(1)
と表示される。
えーと・・・これは何ですの?
もう一回タップしてみる。


すると今度は
nil
と表示されました。
おぎゃー
意味不明www

ーーーーーーーーーーーーーーーーーーーーーーーー
@IBAction func tap1z(_ sender: Any) {

let value=tapnum.text!+”1″
tapnum.text=”\(String(describing: value))”
}
ーーーーーーーーーーーーーーーーーーーーーーーー
上のように記述を変更。
とりあえず数値型に変換は諦めてちゃんと表示できるか確認してみよう。


1をタップしたところ。
おお、01になっているが表示は正常のようだ。


1を連打。うんうん。1が語尾に追加されていくな。

さて、改めて先頭の0を取り除かなければいけない。

さっき1をタップして表示されたOptional(1)とかnilとかいうのが怪しいな! 

次回はしっかり0を取り除いてみたい! ^0^

計算機アプリを作ってみる3

前回までで計算履歴表示エリアと入力文字表示エリアが配置できました。

今回は数字を入力するボタンを配置していきます。


Object LibraryからButtonをストーリーボードにドラッグ&ドラッグします。


Attributes Inspectorのパネルで色々設定します。
Title:Plain
デフォルトの表示はButtonと表示されているので7に変更します。
計算機のボタンの一番左上は7の数字なので。


Text View と同じようにbackgroundで背景色を入れられるようなので薄い青で着色しました。

同じように1〜9の数字と演算記号を配置していきます。
ボタンの背景色ですがRecently Used Colorsで最近使った色があるのでそれを選ぶと楽ですよ。


はーい ボタン配置完了〜^^v
ほほー 計算機らしくなってきたではありませんか^0^

しかしこれだけではボタンをタップしても何も起こりません。
ただの画像と同じです。

このボタンをタップするとこういう仕事をしなさいよ、というのをソースコードに記述しないといけないようです。このへんがHSPとかなり違うところですね。


それを記述するのがViewController.swiftです。


optionキーを押しながらViewController.swiftをクリックするとストーリーボードと並べて表示できます。

現在0と表示されているテキストフィールドとViewController.swiftとを紐つけします。


テキストフィールドをctrlキーを押しながらViewControllerのソースコードへドラッグ&ドロップします。
class ViewController: UIViewControllerの下にドラッグ&ドロップすると画像のようなダイアログが表示されるので色々記入します。

Connection:Outret
Name:tapnum
Type:UITextField
Strong:Weak

入力してConnectをクリック。


@IBOutlet weak var tapnum: UITextField!
というのがソースコードに追加されました。
よーわからんけど変数使用の宣言みたいなのをしたのでしょう。

同じように数字ボタンも紐つけしていきます。


数字の1のボタンをctrlキーを押しながらソースコードの下の方の } と } の間にドラッグ&ドロップします。
さっきのテキストフィールドとドロップする場所が違いますね。なんでこの場所なのかわからないのですがまあXcode使っていくうちに慣れていくでしょう。

ドロップするとさっきみたいなダイアログが表示されるので入力していきます。

Connection:Action
Name:tap1z
Type:Any
Event:Touch Up Inside
Arguments:Sender


紐つけされたようです^ー^

続きは次回〜

計算機アプリを作ってみる2

前回は計算機アプリの大体のレイアウトを考えました。

今回は履歴を表示するエリアや計算機ボタンなどを実際に配置していきたいと思います。


計算履歴を表示するエリアを作ります。
青い二重丸のObject & Libraryをクリックし、メニューの中からLabelを選択し、ストーリーボードのメインエリアにドラッグ&ドロップします。

はい、ここで失敗。短い文ならLabelでええんやけど長い文章を表示させるのならText Viewを使うようです。

で、配置したLabelを削除したいんやけど右クリックしても削除の項目がないではないか。
調べた結果、Labelを選択してdeleteボタンで消せた。


Labelを選択したメニューの下の方にText Viewがあるのでそれをドラッグ&ドロップ。配置したらダブルクリックすると文字が入力できるので計算履歴と入力しました。

この履歴表示エリアに背景色をつけたいと思います。


Text Viewを選択した状態で右のViewの項目のBackgroundをクリック。
開いたメニューのotherから好きな色を選びます。


背景色がつきました。

次に入力した数字を表示するエリアを配置します。


Labelを選択したメニューの下の方にText Fieldがあるのでそれを履歴表示エリアの下にドラッグ&ドロップ。

配置しただけではこの入力ボックスをタップするとios標準のキーボードが出てきて入力することになります。
この電卓アプリは独自のボタンを配置して数字を入力するためこの入力ボックスを入力不可、表示専用にします。


Attributes Inspectorをクリック。
Control-State設定のEnableのチェックを外すと入力不可になる。


次にTextの項目でPlainを選択しその下の欄にデフォルト時に表示する文字を入力します。
計算機なので0を入力しました。

計算機は通常右詰めで表示されるので
Alignment を右詰めのものを選択します。

これで入力ボックスができました。

これまでの工程で何か間違っていないか確認のためビルドしてシミュレーターで表示させてみます。
このswiftというのは厳格というか堅牢というかちょっとでも気にくわないことがあるとビルドエラーと言って突き返すのですよ。
HSP3dishで変換したコードをビルドした時、何度エラーと怒られたことか^^;


ビルドして転送先のシミュレーターにiphone SEを選択します。
▶︎マークを押すとビルドが始まってシミュレーターが起動します。
結構時間がかかりました。


おおー エラーなくビルドできて表示も正常のようです。
右端にちゃんと0が表示されています。

やる気が出てきましたよ!

計算機アプリを作ってみる1

Xcodeでの開発に慣れるために計算機アプリを作ってみます。

作れるかな? 挫折しませんように^^;


・Create a new Xcode projectを選択


・Single View Applicationを選択


Project Name:calc1
Team:any
Organization identifier:any
Bundle identifier:xyz.bouoexpress.calc1
Language:Swift
Devices:iPtone
Use Core Data:off
include Unit Tests:off
include UI Tests:off

Bundle identifierには通常ドメインを逆さにしてそのあとにプロジェクト名を置くようです。

include Unit Testsとinclude UI Testsには最初からチェックが入っていましたがこの二つが何なのか調べてもさっぱりわからんし手元の参考書もチェック外して解説してるのでoffにしました。

次に保存場所を聞かれるので好きな場所に保存します。

Main.storyboardをクリックしてここに色々ボタンやらラベルやら配置していくようです。

HSPだとメインループがあってそこに枝葉をつけていく感じですが
swiftは色んな部品を組み合わせてアプリを作る感じですね。


右上の方にあるFile Inspectorをクリック。


Use Auto Layout のチェックを外します。
この機能はアプリを使用する色々なディスプレイサイズに表示を調整してくれる便利な機能ですが後で変更できるみたいなのでここではoffにします。

offにするとipadかiphoneどっちにするか聞いてくるのでiphoneを選択。


画面中央 下部のView as:iphone7をiPhone SEに変更。

あらかじめ小さいサイズでレイアウトした方が後々問題が起きにくいそうです。


これはandroid用に作った計算系アプリなのですがこういう感じのレイアウトで作ってみたいと思います。

一番上の大きい枠に計算履歴を表示します。
1+1=2
5+10=15
3*8=24
こんな風に10回くらいの計算履歴を表示します。

次の長細い枠に入力結果を表示します。
計算ボタンの1をタップしたらそこに1が表示されるようにします。

DELは入力した数字や計算機号を1文字消去します。

CLRは入力結果に表示された文字列を全て消去します。

次回は実際に数字のボタンなどを配置していきます。

xcodeを使ってみる

いままでHSP3dishでプログラムしてandroid用アプリを作ってきましたが

iphone用アプリも作りたくなったのでxcodeを一からお勉強です^^;

HSP3dish HELPERを使えばiphoneで動くアプリは作れますが

どうしてもadmobを表示することができなかったので断念しました。

HSPでandroid用に公開しているアプリをiphoneでも動くように

xcodeで開発するのが目標です。

そのためにHSPでできていた次のことがxcodeで書けると

まあなんとかなるような気がしていますが楽観的すぎかな?

配列変数
gotoとラベル
条件分岐 if命令
サブ処理 gosub return の処理
繰り返し repeat loop の処理
カレントポジション pos命令
画像表示 picload命令
乱数発生 randomize rnd 命令
ボタン button命令
入力ボックス input命令
文字列の一部を取り出す strmid命令
文字列を検索する instr命令
指定した文字だけ除去 strtrim命令
セーブ・ロード bsave bload命令

これくらいかなー?
では本を読みながら勉強スタート ^0^

:変数について:

変数を使う時はvarのあとに変数
var bouo=777
var moji=”いい天気”

:配列変数について:

配列変数は[]で囲んでこんな風に
var hairetu=[1,3,5,7,9]
print(hairetu[3])

:条件分岐 if命令:

var A=100
if A==100 {
print(“Aは100です”)
}

var B=5
var C=8
if B!=C {
print(“BとCは等しくありません”)
}

if B>C {
print(“BはCより大きいです”)
} eles {
print (“BはCより小さいです”)
}

このへんはHSPとあんまり変わらんですな。

:繰り返し repeat loop の処理:

HSPでのrepeat処理
repeat 5
D=cnt
mes D
loop

Xcodeでのrepeat処理
Dに1~5を入れますよってことですか
for D in 1…5 {
print(D)
}

:乱数発生 randomize rnd 命令:

0~99までの乱数を発生させる

HSPでは
randomize
E=rnd(100)
mes E

Xcodeでは
import UIKit
E=Int(arc4random_uniform(100))
print(E)

HSPでよく使うスクリプトの備忘録1

私がよく使うスクリプトを備忘録として書いておきます。

——————————————————————————
HSPでCSVファイルを読み込む

sdim w,10000

;読込む行列指定
row=250
lin=250
;読込む行列指定

sdim d,64,row,lin

sdim txbf,64000

bload “CSVread.csv”,txbf

;指定ファイル読込

notesel txbf

repeat lin
noteget w,cnt
c=cnt : i=0
repeat row
getstr d.cnt.c,w,i,’,’
i+=strsize
loop
vst=c\100
if vst=0 : wait 1
loop
;指定ファイル読込

mes d.0.0
mes d.0.1
mes d.0.2
mes d.0.3
mes d.0.4

mes d.1.0
mes d.1.1
mes d.1.2
mes d.1.3
mes d.1.4

mes d.2.0
mes d.2.1
mes d.2.2
mes d.2.3
mes d.2.4

mes d.3.0
mes d.3.1
mes d.3.2
mes d.3.3
mes d.3.4

mes d.4.0
mes d.4.1
mes d.4.2
mes d.4.3
mes d.4.4
stop

——————————————————————————

——————————————————————————
HSPでデータをセーブする・ロードする

変数floor と flgend にinput命令で数値を入れてセーブ。
いったんウィンドウを閉じてロードボタンを押すとセーブした値が読み込まれます。

*main
clrobj
cls
pos 0,0
mes “floor= “+floor
mes “flgend= “+flgend

input floor
input flgend

button “セーブ”,*save
button “ロード”,*load

stop

*save
;exist “svflr”
;if strsize>-1 : delete “svflr”

alloc chrdt,8
lpoke chrdt,0,floor
lpoke chrdt,4,flgend
bsave “svflr”,chrdt,8

goto *main

*load
exist “svflr”
if strsize=-1 : goto *main

alloc chrdt,8
bload “svflr”,chrdt
floor=lpeek(chrdt,0)
flgend=lpeek(chrdt,4)

goto *main

stop


値を入力してセーブボタンを押します。


ロードするとセーブした値が読み込まれます。

————————————————————-
<広告>



HSP3dishのAPKに手動で署名する

サブで使っていたノートパソコンでなぜかAPKの署名に失敗するようになってしまいました。
コマンドプロンプトなんか一度も使ったことがなかったので苦労しましたが、なんとかなったのでその備忘録。

署名されていないAPK、 ******-release-unsigned.apk をbinから\androidにコピーします。
\androidにあるhspapp.keystoreを使用して署名をする手順です。
\androidにhspapp.keystoreが無い場合はプロジェクト作成時にHSP3dish helperでKEY作製をクリックすると作れます。

———————————————————–
検索にcmd.exeと入力してコマンドプロンプトを起動します。
コマンドプロンプトではペーストのショートカット(ctrl+v)が使えないようです。右クリック→貼り付け はできるようです。

署名ツールのある場所を指定します。
署名ツールの場所は各人の開発環境によって違いがあります。

cd C:\Program Files (x86)\Java\jdk1.6.0_45\bin

署名する命令を実行します。
??????は署名時に使っていたパスワードです。
******-release-unsigned.apkが署名するファイル名になります。

jarsigner -verbose -keystore C:\android\hspapp.keystore -storepass ?????? -keypass ?????? C:\android\******-release-unsigned.apk hspapp

ちゃんと署名できたか確認する命令です。

jarsigner -verify -verbose C:\android\******-release-unsigned.apk

署名完了後、zipalignとかいうのをやらないとgoogle play consoleにAPKをアップロードできないみたいです。

署名後にzipalignをする命令です。
ついでにファイル名も-release-unsignedの部分を削除しました。

zipalign -v 4 C:\android\******-release-unsigned.apk C:\android\******.apk

ちゃんとzipalignできたかを確認する命令を実行します。

zipalign -c -v 4 C:\android\******.apk

署名してzipalignされたAPK、 ******.apk が完成でーす。 ^^ 

android7.0からadmobの広告が上部に表示される問題について

————————————————————————-
:admob広告の表示位置を画面上部にする:
Hsp3dish HELPERでadmobを使用する場合、広告は本来画面の下に表示されるはずだけどなぜかandroid7.0から上に表示されてしまう。
androidのバージョンによって広告の位置がバラバラなのは問題なので広告を上に表示で統一する場合。

C:\android\*******\src\tv\hsp\HspActivity.java
HspActivity.javaの

popUp.showAtLocation(mainLayout, Gravity.BOTTOM, 0, 0);
この行のBOTTOMをTOPに変更すると上に表示される。

popUp.showAtLocation(mainLayout, Gravity.TOP, 0, 0);
————————————————————————-

————————————————————————-
:admob広告を強制的に下80ピクセルに表示させる:
広告を上に表示させてそのほかの表示を80ピクセル下に下げる作戦を実行したけれど、アクションゲームなどですべての表示を80ピクセル下げるとなると大変な作業量になってしまう。
そこでアクションゲームの広告は下に表示させる方向でやってみた。

C:\android\*******\src\tv\hsp\HspActivity.java
HspActivity.javaの

popUp.showAtLocation(mainLayout, Gravity.BOTTOM, 0, 0);

この部分を

popUp.showAtLocation(mainLayout, Gravity.NO_GRAVITY, 0, disp_height-80);

このように変更。グラビティでは指定せずにディスプレイの下から80ピクセルに表示させる。

実際やってみると実機で表示させた場合、画面サイズやmain.cで確保した描画領域などの関係でゲーム画面の一部が広告で隠れる機種があった。
そこでゲーム画面のscreenで確保する描画領域を960としたとき
disp_heightは  -120

popUp.showAtLocation(mainLayout, Gravity.NO_GRAVITY, 0, disp_height-120);

main.cは 1130

hgio_view( 600, 1130 ); // screen size

このようにするとなんとかうまく表示できた感じ。

ちなみに覚書きとしてテキストファイルに変更行などを保存しておいて、実際にコピペして使おうとしたらUTFのマッピング?エンコード?がなんちゃら言われてビルドエラーになった。
androidフォルダにあるプロジェクトフォルダ内のactivityjavaファイルから変更行を-120とか手作業でやったら大丈夫やったよ。
————————————————————————-

————————————————————-
<広告>